[pulseaudio-commits] [SCM] PulseAudio Sound Server branch, master-tx, updated. v0.9.19-474-gebf2116

Lennart Poettering gitmailer-noreply at 0pointer.de
Sun Feb 21 12:30:48 PST 2010


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
  discards  7dbb2ad9b0ac8a551ebaa00dbc38753705b63ec2 (commit)
  discards  f36690fc3fc7d91bd8c80c9d4dcef77b9fbac324 (commit)
  discards  dde46025935f9efca518fe3adb6b821e7f677a3b (commit)
  discards  32751063dc099b62bb6017843527ece2cf94290b (commit)
  discards  49d4d21125ca5efa04a5262741f38537387fec2b (commit)
  discards  8f5c6609406a86ef3c0806cabc9380c628908916 (commit)
  discards  44c15206b450635d1643f74afb6755b7479da3ea (commit)
  discards  5c128243b33ad27f0416e3e4567c01809daa45e3 (commit)
  discards  3fe38e82ac84e5dbd58bcce2342a9d1fabb71bfb (commit)
  discards  6fbc4d9f22becdbd86b63cfd592670908cca4d19 (commit)
  discards  f4787871da2d1452b217e900caa34a3718f4aa1f (commit)
  discards  18a3b23c50066ce12137e62a476e698d81a6eae2 (commit)
  discards  e09a5ed2eb023446e323e136ee9ffe1cba422573 (commit)
  discards  7277359e869bea5b4d574c204005764c225af779 (commit)
  discards  0f964cd232512dbb099e94615733bc10552936fe (commit)
  discards  cdf91f7988c62b7ae157e6d29b28d6d4ab5f2676 (commit)
  discards  f3a24fdb8e5989f1446877cf8cd08a3a92b24881 (commit)
  discards  d512bb2e49582fa5a3eb9a953bd9f33b30e6c8c4 (commit)
  discards  499ecb906cc2bf73f72ccf7ac31e195b7b055b30 (commit)
  discards  0913c1379d7619137dbd53c271f7f3b90a9c5c54 (commit)
  discards  b62dd5bd3a393ba6278dc9c7c79b73f78380ee7a (commit)
  discards  75aac3221e2c5da3a6b999e599a1d82f30ac9447 (commit)
  discards  523af82edf9c43d45e85dbc0eb573432736bd1e1 (commit)
  discards  2e8eaa9ee93a4cfb0362b6acaeab697e5d876b40 (commit)
  discards  234ebc9e45554d0954d691d3cabfa33e52ab2345 (commit)
  discards  65e4453b1e057cf9e2b4be17300ae4a670491a21 (commit)
  discards  daba81e9de8db1684fb0d1e443c85e43a9fd9fb5 (commit)
  discards  800d9a570bcc4b6e41ea14a7f715ed700cb0dc33 (commit)
  discards  d2bf701a2086bbe44084512cd505c9341061dccd (commit)
  discards  71ec6a82030f42ca1818a4347e134941c1dbd0e0 (commit)
  discards  19d805ce23f6b592ee17a1112466330db332ea3f (commit)
  discards  ce986440984c74e5804b972655fd649d287b4eec (commit)
  discards  04bb7cb8f794e25f69ccddfd3140dd242972aaec (commit)
  discards  231108643c6a7d33639a9ade4f7fe2d577950784 (commit)
  discards  20eaa91f34b9495614dfb79cb89b6b317ad18611 (commit)
  discards  c2147160cbf84956a6a6c78d66f995d7a00051c0 (commit)
  discards  2fb60debc4c5942926adb318746d1acc6d2120c9 (commit)
  discards  e0535e5fcec6e48081ce3a603e6fa8bd5234bdff (commit)
  discards  f24b78e3dbbc9deb1a9f98b139deb73b0313a850 (commit)
  discards  3d355cd60cd79bbf860be0397d07abf0a7072650 (commit)
  discards  c1342ce8d2e6cfe5a38be999ab4e4955dd166034 (commit)
  discards  93c241503d0e9209f34b49dcab37428df3f904f4 (commit)
  discards  ecaf9718c450a0e0e71ecf3cab42cb3bbc447f6f (commit)
  discards  05ccf10d967853c944268c7e5fa408edd3958124 (commit)
  discards  7d5d76eaed050cb03d99869b51b5a3a709f28f06 (commit)
  discards  151c746286ba8c1bfa20cf472b58b949d729be75 (commit)
  discards  4392888939197ae7008ebcefdf34b713e190de4d (commit)
  discards  e4259e77a140695819a9ec7fa8d6b7ee49ac2309 (commit)
  discards  99dcbc7766ea655eb8c9ce4397eb8deccdd6032e (commit)
  discards  6d8d0ff878f948452a720b1050bf49774a8d0eaa (commit)
  discards  037df850775ac1eb2930aa4c48d59576a50b3927 (commit)
  discards  80e43f69fa71170fbdd54d0bba53cafb1fb952fd (commit)
  discards  45409d557d85fe5458b1409b2f475a07a47e4901 (commit)
  discards  662986febfdd53d00341b636d1826db20c73dc29 (commit)
  discards  6e8c64f9528475f477d1c696030b67be46cfe0e2 (commit)
  discards  6614be93b4b618562dcd6eb754a7fca7fd7fc424 (commit)
  discards  497b98110266ed2c5d28851f6624c293916b91c3 (commit)
  discards  55ccda658f11f239f6cdec860e6c52ac056a90d2 (commit)
  discards  a620a39eeb2d5da43c76ab01136bdfc6bb02ee35 (commit)
  discards  72ac187e12bd0f0b4891f043098825cd58b355a1 (commit)
  discards  5331e60b059310caade9b98bad3d79c64952085c (commit)
  discards  3aec58049e04b582e435170b7589a9f06991bb43 (commit)
  discards  e8bab13c819c34692bd4e3288866ba54f2256dfc (commit)
  discards  8cfd01e41ec6309c848fb71a9b85d9a87842aaab (commit)
  discards  7e0bccfe6fc99a129678a846dcbb2d69016488df (commit)
  discards  fc74fc1cd89e35d1307575f29ef4803ef7f2fe9c (commit)
  discards  f2f37b50f6af4bb89b0e740c8403bc7f8dd0ab0a (commit)

This update added new revisions after undoing existing revisions.  That is
to say, the old revision is not a strict subset of the new revision.  This
situation occurs when you --force push a change and generate a repository
containing something like this:

 * -- * -- B -- O -- O -- O (7dbb2ad9b0ac8a551ebaa00dbc38753705b63ec2)
            \
             N -- N -- N (ebf2116810fa8f18baf1fa693eaf35a8a83109ee)

When this happens we assume that you've already had alert emails for all
of the O revisions, and so we here report only the revisions in the N
branch from the common base, B.

- Log -----------------------------------------------------------------
ebf2116 i18n: run make update-po
cde8044 i18n: update LINGUAS
f7415e3 l10n: Updates to Chinese (Taiwan) (zh_TW) translation
4df917c l10n: Updates to Chinese (Taiwan) (zh_TW) translation
3e463e0 l10n: Updates to Chinese (Taiwan) (zh_TW) translation
c7b284b l10n: Updates to Chinese (Taiwan) (zh_TW) translation
f9af65b l10n: Updates to Chinese (Taiwan) (zh_TW) translation
8b27e2c l10n: Updates to Russian (ru) translation
acb1773 l10n: Updates to Russian (ru) translation
a8a5c39 l10n: Updates to Russian (ru) translation
c72c90b l10n: Updates to Russian (ru) translation
fd5b87e l10n: Updates to Russian (ru) translation
4abfa17 l10n: Updates to Russian (ru) translation
dd8f33d l10n: Updates to Russian (ru) translation
dc1872a l10n: Updates to Russian (ru) translation
d2ec7e8 l10n: Updates to Russian (ru) translation
43167fa l10n: Updates to Russian (ru) translation
85194fc l10n: Updates to Russian (ru) translation
e626857 l10n: Updates to Russian (ru) translation
f8d1e26 l10n: Updates to Russian (ru) translation
4e2e32b l10n: Updates to French (fr) translation
c47773a l10n: Updates to French (fr) translation
a3a9c17 l10n: Updates to Greek (el) translation
8ace563 Sending translation for po/he.po
c3a14cb Sending translation for Finnish
2a322d4 Sending translation for French
2d5f61b Sending translation for Assamese
aae0ede Sending translation for Russian
9fe8850 Sending translation for Kannada
b33c571 Sending translation for po/zh_TW.po
2499566 Sending translation for Japanese
c118a3d Sending translation for Marathi
ef05cf7 Sending translation for Japanese
da2da7a Sending translation for Malayalam
257eabf Sending translation for Chinese (Simplified)
e6ffac7 Sending translation for Punjabi
8c2c80a Sending translation for Bengali (India)
381be64 Sending translation for Japanese
4f77643 Sending translation for German
f4e18f7 Sending translation for Gujarati
7275959 Sending translation for Oriya
46c5919 Sending translation for Tamil
5c9c4e1 Sending translation for Hindi
3cc8d51 Sending translation for Telugu
3bfaa87 Sending translation for Finnish
68841d0 Sending translation for Finnish
5778b16 Sending translation for Finnish
b18e123 Sending translation for Serbian (Latin)
b54ea17 Sending translation for Serbian
f0382d1 Sending translation for Greek
667126b Sending translation for Brazilian Portuguese
ba19d9b Sending translation for Brazilian Portuguese
f771b8a Sending translation for Hungarian
eccff7b Sending translation for Hungarian
abdd7b4 Sending translation for Italian
df85322 Sending translation for Czech
f1436b8 Sending translation for Hungarian
02a69d8 Sending translation for Hungarian
3f1feff Sending translation for Hungarian
1151e15 Sending translation for Hungarian
63c52c7 Sending translation for Dutch
e7ec9d5 Sending translation for Hungarian
16e9ff2 Sending translation for Ukrainian
e53a24d Sending translation for Spanish
0f68e0f Sending translation for Dutch
9bda558 Sending translation for po/hu.po
4c2adfc Sending translation for Czech
0a7086d Sending translation for Polish
5c13d86 Sending translation for Dutch
0a7fccd pacat: pass buffer_attr to recording streams too
342e064 bluetooth: add HFP Gateway support
edf5f5b bluetooth: improve dbus logging
323f0ad build-sys: fix check for pthread_setaffinity_np()
2b2149d build-sys: Add missing profile and alsa-mixer/paths to src/Makefile.am
609a005 pacmd: don't enter busy loop when reading from stdin very early
83eb8af daemon: first take name on the bus, then return in starter process
ea29b11 scache: when playing a sample from the cache make sure not queue them up when the sink is suspended
3f1c90b sample-cache: use the sample name as unmodified fallback in the properties when playing a sample from the cache
857ff2c stream-restore: be a little bit more verbose why we don't reastore a sink
7098d60 proplist: explicitly mention a role 'test'
534def2 vala: fix wrapping of port setting calls
27427c1 channelmap: Use "Subwoofer" as pretty name for LFE
c25665e vala: fix definition of the GLib mainloop adapter
57e0e2c vala: fix definition of INVALID_INDEX
c2079d7 shm: don't complain about missing SHM segments
f9f2d6f pacmd: store away fd type
d57ba82 pacat: always fully fulfill write requests
b9bcc7c fdsem: be more verbose when reading from eventfd fails.
ac76dbd dbus: first restart timer, then dispatch it
69ddfaf padsp: emulate /dev/audio, too
80093c9 build-sys: add gobject to build dependencies
abfd2aa alsa: use default output port names
dfa00bf alsa: cover "Internal Mic" elements
67e3925 alsa: cover 'Shared Mic/Line in', 'Analog Source'
14e4369 alsa: cover "Desktop Speaker" mixer elements
f6f957b Revert "pacat: Don't use any buffer attr if we don't set any latency/process time params"
2c631df pactl: implement pactl subscribe
3e6293f virtual-sink,source: enable virtual-source and virtual-sink
bffd21f virtual-source: boilerplate virtual source for PCM processing on inputs
9ffb4f3 virutal-sink: boilerplate virtual sink to add PCM processing
ff2091b pacat: Don't use any buffer attr if we don't set any latency/process time params
66cfa72 native: rework handling of seeks that depend on variables the client does not know anything about
d090995 client: implement $PULSE_LATENCY_MSEC
fb55798 pacat: allow configuration of latency in msec
544fa0b udev: use ID_MODEL_ENC instead of ID_MODEL if it is set
4315f27 alsa: cover bass boost mixer element
63ebd05 udev: rework modem detection a bit
c2ab61c udev: handle sound cards with both modem and audio properly
7b89c85 alsa: Cover the 'Int Mic Boost' element.
7f6531d alsa: cover Input Source:Int Mic
54025c9 cpu: check for CMOV flag before using this intsruction in assembly
c88e468 alsa: ignore volume changes from the hw if we are not on the active console
ce7bd05 udev: make sure we get events only for sound devices
f732c23 log: add an easy way to disable log rate limiting
41ce7cb bluetooth: fix invalid memory access
7f7455b once: make once related variables volatile
66ddeed udev: don't forget to unref devices we are not interested in
9ac12b7 client: verify connection state in pa_stream_connect_upload()
7ab9bea client: detect forking in sample cache API, too
e8a2d12 bluetooth: don't hit an assert if latency is queried for a stooped recording stream
21250ff bluetooth: destruct stream only if it is not already destructed
3455478 core: make sure we always return a valid memblock in sink_input_pop() callbacks
699233f native: fix request counter miscalculations
66dbca1 dbus: remove filter functions only if they were actually set before
5e2a80c bump soname
63abcc8 build-sys: bump soname
cd55955 core: Fix macro typo - PA_SINK_IS_LINKED -> PA_SINK_INPUT_IS_LINKED
6fd2d08 stream-restore: Clear the save_sink/save_source flags on apply_entry.
2f86ba4 osx: don't build the once-test binary on OS X
57b0397 client.conf.in: Typo. s/a/are/
0ac13f1 man pages: correct formatting/markup of options
f250179 shm: explicitly mark shm seg for MAP_NORESERVE to request overcommiting no matter what
ea8927f Typo. s/a/are/
62bfb51 client: include dolby channel names in comments
1bfa1c3 start: we don't need to check for $PULSE_SERVER anymore
2465cfa native: when run in system mode, do not look for fallback port
76089b1 native: fallback to another port if the default port is taken
21cbcc1 client: introduce auto-connect-display= following the scheme of auto-connect-localhost=
3d6cc02 client: introduce auto-connect-localhost= option in client.conf
4b1679e Merge remote branch 'tanuk/fixes'
ba255bf tests: add pa_once_xxx() test
f1d1447 daemon: Don't autospawn if a server address is explicitly configured.
25435bf sink-input: Replace a tab indentation with spaces.
cc82553 idxset: Fix _get_by_data() comment.
aa93484 core: volume ramping fix
6dfb1ee Merge remote branch 'zonque/topic/osx'
937c587 fix a number of warnings
6faf383 headers: Some trivial fixes for some documentation typos
0e47065 Subject: rtpoll: better support for DEBUG_TIMING logs
a282ead Fix typo in log message: s/may no be/may not be/
cb38d4e alsa: add profile set for M-Audio FastTrack Pro USB
d3c71c9 udev: Use SOUND_CLASS instead of SOUND_FORM_FACTOR when checking for modem
c5fdbea threaded-mainloop: Properly initialise m->n_waiting_for_accept to prevent deadlock
a63cf05 More src/pulsecore/cpu-arm.c FTBFS fixes
e5e432f Fix the following warnings (which now cause buildd failures in Ubuntu 10.04):
f452c6c fix a number of warnings
0ccc7af osx: add native zeroconf implementation via Bonjour
7732421 CoreAudio: add audio device module
a23f5cf CoreAudio: add device detection module
28a73ad hack around another OS X bug: recv() with MSG_PEEK does not work
17d3446 poll() is totally broken on Mac OS X
962164a src/Makefile.am: add specific OS_IS_DARWIN files
a46ddfe core-rtclock.c: tweak OS_IS_DARWIN constraints
76acaa9 configure.ac: add DARWIN_OS variable
f9b03d3 Merge branch 'master' of git://0pointer.de/pulseaudio
e8a5746 Add a configure option to change 'udevrulesdir'
978d33b Mark shared variables as volatile
f42022a stream-restore: At startup, create dbus entries only for valid database entries.
00debf4 stream-restore: Add a missing pa_xnew0() call in handle_add_entry().
a6b7ac6 stream-restore: Fix a few assertion misuses with the D-Bus code.
e785f72 dbus: Add a missing break statement in handle_message_cb().
7b1b68c dbus: Handle the cases when a non-existing interface is detected in an incoming message.
4c793cf libpulse: Store pa_stream pointers to hashmaps instead of dynarrays.
1b2cbe9 Merge branch 'master' of git://0pointer.de/pulseaudio
1184666 Merge remote branch 'tanuk/master'
d5d488e Merge branch 'master' of git://0pointer.de/pulseaudio
0fcdc3d Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio
c815441 Merge remote branch 'phish3/master'
675957b Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio
5aa5c6c freebsd: implement pa_get_binary_name
4eb65a0 src/utils/qpaeq: added more friendly error messages to common errors
f69e81f Makefile.am: added qpaeq to installed scripts
fe0b393 Simplify Makefile.am handling of ALSA-related files.
62278b4 Avoid using devname as a variable name.
d963998 Rename all the signal parameters and variables to something more explicit.
2caf59d Since now we have FreeBSD atomic operations, don't require libatomic_ops.
ca637e5 Simplify handling of NetBSD atomic ops discovery.
40aee60 Merge branch 'master' of git://git.0pointer.de/pulseaudio
77c6b69 remove .py extension from qpaeq
fc4cf27 Merge remote branch 'phish3/master'
f5d8aef freebsd: fix atomic ops implementations
41853cc added qpaeq script for GUI equalizer control to src/util
5150a10 Check for stow using AC_CHECK_PROG rather than type -p.
4923f3c Include sys/filio.h if present; this makes use of FIONREAD on Solaris.
09a58b6 Don't declare the variable l if FIONREAD is not defined.
71ebbfb Fix build on Solaris: pass the third parameter to pa_cloexec_open.
70ba21e Move the platform-specific defines after the compiler has been found.
6daf112 alsa: fix minor sampling rate deviations before adjusting the buffer size
bd3467f alsa: fix log output when the audio device refuses to give us again the same period settings we had before
ba95b19 pulse: ask for timing updates both *before* and *after* triggering a stream state change so that in the STARTED/UNDERFLOW callbacks we accurate transport latency information
f05ae35 pulse: delay smoother update only when unpausing, not when pausing, since we don't want the timer to advance when we are supposedly already paused
a3b5a94 pulse: try to fix inaccuracy with uncork timing for streams that are created in corked state
b8acf55 daemon: complain if user passes too many arguments
493d8b2 module-equalizer-sink: add latency of output_q and input_q to get latency calculation
1178f61 module-equalizer-sink: switch back to reference dsp implementation - cpu usage doesn't really change and there may be a bug in the vectorized version
c6c933b module-equalizer-sink: (re)added output memblockq commented out timing debug statements
9708ecd Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio
9033140 rygel: fix itemCount property for sources
eb55626 build-sys: Fix missing trailing slash in 14eaf2
14eaf24 build-sys: Make sure all alsa path config files are installed
dad36ac device-manager: Update docs version -> 0.9.20
ed7642e Merge branch 'master' of git://0pointer.de/pulseaudio
2294642 core: make cpuid code compile cleanly with 32bit PIC
d9b5bbc core: adjust volume only when there is actually a memory block
f3866f2 protocol: use the right sample rate for sources
9e45f19 device-manager: Update docs version -> 0.9.20
f202af1 ramping: minor cleanups
4d62f15 Merge remote branch 'origin/merge-queue'
721e32b jack: never try to autoconnect to MIDI ports
38a03c1 man: fix build with --disable-manpages
7793da3 lirc,mmkvd: added module parameters volume_limit, volume_step
d2c5935 volume: add pa_cvolume_inc_clamp function
53b046d alsa: disable timer-based scheduling inside a VM
c079cee daemon: during startup say whether we run in a VM
642c69b core-util: add call to detect if we are called from within a VM
19516d4 alsa: introduce more standard path names
83b181f alsa: cover 'Analog Output' control
21ffcd5 Merge branch 'master' of git://0pointer.de/pulseaudio
7938442 Merge remote branch 'phish3/master'
6839ef6 alsa: create a seperate mixer path for Speaker elements
73a4f4f alsa: leave other headphone control enabled if possible
591ade1 alsa: lower priority for Headphone2 path
73d9d31 alsa: cover Input Source:AUX IN
220ac0a alsa: cover Headphone2 mixer element
430e8e2 alsa: cover 'Digital Input Source' element
3e115a9 alsa: cover Mic Jack Mode element
8e94f65 daemon: make sure pa has its own session and process group, but is not its leader so that we cannot acquire a tty ever
c4e276e Merge branch 'master' of git://0pointer.de/pulseaudio
2dc37e1 bluetooth: do not hand out access to devices that are not fully configured yet
b83d7a2 configure.ac: enable check for CoreAudio
5c57650 daemon: realpath segfault fix
542fa46 Mac OS X: add semaphore implementation
b04fe9b Wrap clock_gettime and friends
65e8078 X11: attach X11 properties to Screen, not Display
366ab96 git: ignore kde related files
056930c svolume: fix MMX error
8a49514 sink: simplify silence checks
aa8ce5b daemon: don't crash if pa_realpath() fails
a82c6b0 socket-util: drop redundant casts
75f7a97 socket-util: allocate at least sizeof(sockaddr_storage) space
168be38 use pa_fopen_cloexec() where applicable
88b7295 tdb: use O_CLOEXEC if available
752727a core-util: introduce pa_fopen_cloexec()
a698ee3 core-util: make sure to enable FD_CLOEXEC unconditionally to cope with kernels that silently accept but ignore O_CLOEXEC
65e7bc1 use cloexec wrappers wherever applicable
9c1a989 core-util: introduce FD_CLOEXEC wrappers for open/socket/pipe/accept
d83dd5b module-equalizer-sink:     add premultipliar to sse2 dsp_logic implementation
ebaca56 module-equalizer-sink: try to limit buffering to mempool's max_block_size and disable debug output
5c82dd6 drop redundant alloc call
754644f Merge remote branch 'origin/master'
e7e4e44 simd: update test cases
2edb4df smoother: add comments about optimization recommendations from Jason Newton
f27a506 libpulse: introduce PA_STREAM_RELATIVE_VOLUME
546bcf3 protocol-native: if a client set volume/mute/device store it since it is user input
2501687 libpulse: explain semantics of pa_stream_connect_playback() in more detail
27c6a80 protocol-native: declare that user configured volumes are always absolute
78984e4 pactl: format cookie a little bit nicer
8678f56 pactl: include information about client context in pactl stat output
7c55d6e clients: drop definition of BUFSIZE which is unused
4538523 libpulse: introduce pa_context_get_tile_size() call
744490a memblock: decrease tile size to 64k again
9c61465 Merge branch 'master' of git://0pointer.de/pulseaudio
e9ccc61 module-equalizer-sink: drop source executable permissions configure.ac: add enable/disable + summary line for fftw
16e77f3 module-equalizer-sink:     *fixed SSE2 optimized dsp logic (default if available)     *cleaned up whitespace formatting (again)
ff903ef module-equalizer-sink: fixed equalizer state save/restore
d25b9ea module-equalizer-sink: drop source executable permissions configure.ac: add enable/disable + summary line for fftw
bec67cd device-manager: Fix compiler warning.
8f2289c module-equalizer-sink:     *fixed SSE2 optimized dsp logic (default if available)     *cleaned up whitespace formatting (again)
781eb59 module-equalizer-sink: fixed equalizer state save/restore
e064d27 Merge branch 'master' of git://0pointer.de/pulseaudio
e11cd13 Merge branch 'master' of git://0pointer.de/pulseaudio
c9375aa libpulse: add missing includes
e5ac4b5 buil-sys: fix build w/o DBus
0ff2a6b device-manager: Rather than flagging the device as available, just include the sink/source index with PA_INVALID_INDEX meaning unavailable
ce033e7 dbusiface-client: Fix the destructor (stop leaking stuff).
0b388bf Merge branch 'master' of git://0pointer.de/pulseaudio
8ec304d Fix build when using -fweb, accept both register and memory constraints.
f55357c Add check for FFTW, and add option to disable it at build-time.
b64b6bb Fix out-of-tree builds when dbus module is enabled.
d0b478e Merge remote branch 'coling/history'
9f226d2 Merge remote branch 'phish3/master'
692ce73 Merge remote branch 'tanuk/dbus-work'
b3592a1 position-event-sounds: never position test sounds in space
c96d2d1 alsa: disable period event only with tsched=1
7b682c9 loopback: Setting latency of module-loopback
40c1ca7 bluetooth: don't set auto_connect flag when discovering bt devices
9d7a27e device-manager: Play nice with module-stream-restore.
cc31d7c device-manager: Make use of PA_IDXSET_FOREACH when applying entries.
fdbb550 device-manager: Keep track as to whether or not the user specifically renamed the device.
6468dcf device-manager: No need to check the version after calling read_entry()
019331d Merge branch 'master' into dbus-work
e895200 module-equalizer-sink: disable active profile name restoration as something in pack/unpack is funky and I don't have time for a proper fix
97056d2 module-equalizer-sink: *added client initiated sync support for filter state *added note of possible unstable behavior with next-power-of-2 sample rate calculation
a434f4c module-equalizer-sink: resyncing with head and fix invalid writes     * pa_log->debug for default equalizer notification     * partially fixed infinite rewind bug     * set max_request to window_size first iteration     * swap order inside ROUND_UP calls     * resync pa_sink_input_new changes     * change pa_sample_clamp parameters to be correct to fix invalid writes     * reenable proper reset logic + proper request size
50db81c device-manager: Fix typo in module loading script.
42e28ce device-manager: Add some scripts that are only run under KDE to load/initialise module-device-manager with routing turned on.
20eedb2 device-manager: Misc fixes to co-exist with other stream management/routing modules.
3a20cf0 device-manager: Misc fixes.
b8a6436 device-manager: Fix the writing of the database when priority doesn't change.
7633bb8 device-manager: Add extra debug messages
f9b2d65 device-manager: Change the prefer/defer options to a single 'reorder' command.
8977abd device-manager: Don't notify clients on every subscription (it happens all the time).
bbf6701 device-manager: Save icon and report current availability over protocol.
8b2cc4d device-manager: Expose the priority lists in the protocol extension.
4dedba7 device-manager: Add a function to dump the database which we do whenever we save it (and on startup)
1d43230 device-manager: Reroute streams when they change allowing the media.role to be updated mid-stream.
d3460e3 device-manager: Refactor the routing method to allow the routing of a single stream
8d0787c device-manager: More sensible names for internal functions
25f7534 device-manager: Reroute the streams on startup and update our cache on enable.
0016b5e device-manager: Keep a cache of the highest priority devices for each role.
ce0b2bd device-manager: Fix the database write mode
1e2d236 device-manager: Update exports
9e44797 device-manager: Some efficiency and safety tweaks
e47f385 device-manager: Allow the routing component to be turned on via a module argument as well as via protocol extn.
4fb9daf device-manager: Remove unused variables
1d04c35 device-manager: Set the most appropriate sink/source when new streams are created
74c1c27 device-manager: Add routing functions that are triggered when sinks/soruces are added/removed.
678d8e9 device-manager: Add a function to get a list of the highest priority device indexes for each role.
ca68105 device-manager: Remove unneeded logic for checking for and (un)loading module-stream-restore. We can co-exist
ed8af7c device-manager: Rough framework (slots etc.) for handling routing.
faae33d device-manager: debug and comments
e589f38 device-manager: Fix the freeing of the datum on prefer/defer.
1802500 device-manager: When a new device is encountered, initialise the priority list to an appropriate value
a64f0f7 device-manager: Let subscribed clients know when something changes.
f8ec8f3 device-manager: Change the write function to a rename function.
aebe478 device-manager: Provide a method for prefering/defering a device.
95f2839 device-manager: Fix copy+paste code that looped over the tagstruct when not necessary
103897a device-manager: Provide a way for clients to enable/disable role-based device-priority routing.
9357bdf device-manager: Update docs version -> 0.9.19 (predicted)
464e1a8 device-manager: Fix copy+paste leftover
aa5d56b device-manager: Only store and save details for non-monitor sources
42b30e1 stream-restore: Preventative initialistion to NULL
6497938 device-restore: Fix the application of an entry to allow changing the name of devices.
40e97eb device-manager: Fix tagstruct description extraction (copy+paste blunder)
70accbb device-manager: Link native protocol library.
0b3b037 device-manager: Export device-manager extension functions
93c3c65 device-manager: Fix indentation
37e82ce device-manager: Add an untested protocol extension.
bc869b5 device-manager: Add a new module to keep track of the names and descriptions of various sinks.
3053bad module-equalizer-sink: resync with ladspa parent sink
263b683 module-equalizer-sink: fix improper usage of pa_modargs_get_value_boolean for u->set_default
f5ceed8 module-equalizer-sink: added server side persistance of profile names
b028e4e module-equalizer-sink: per-channel filtering support + profiles, easier default configuration
2f6fd32 module-equalizer-sink: fixed a bug w/ new zero-latency input scheme (that was an interesting/cool bug!)
735c8ab module-equalizer-sink: added support for preamp
cd54ecd module-equalizer-sink: drop old macros for new library based ones
ab0e20a module-equalizer-sink: fixed timeval initialization
7bd7ce6 module-equalizer-sink.c: swapped order of attach_within_thread and set_max_request within sink_input_attach_cb
07cd6a4 module-equalizer-sink.c     i->sink -> i in pa_get_sink_max_request*
1c1a812 module-equalizer-sink     exchanged improper usage of memblockq_peek'd memchunk for silence block     dropped unneeded function prototypes     changed mround to be slightly more elegant     __restrict__ -> restrict for c99     removed unneeded pa_aupdate_swap calls     first_iteration -> pa_bool_t     cleaned up some usage of pa_malloc0 where pa_new0 was more appropriate     cruft removal, whitespace fixes and reordering of variables
0e6711d module-equalizer-sink:     merging in upstream changes     whitespace fix and fix for first iteration un-windowing
38d608a module-equalizer-sink:     reworked processing so we don't have input->output delay of R samples
8c2f976 module-equalizer-sink:     fix for peek returning a null memblock     pa_log -> pa_log_debug for fft size     updated module description     fixed a comment in dbus error for incorrect x positions
684ad6d module-equalizer-sink:     proper fix for pa_xmalloc(0) given that 0 is illegal     fix coefficients in case there's no resume state     loadprofile now signals filterchanged
1e3c7d3 module-equalizer-sink:     dbus:         eliminated some redundant code in dbus handlers/getall         switched filter back to being a property         signals for changed profiles, added/removed sinks, filter updates and sink reconfigurations     fixed timing routines
4231ac4 module-equalizer-sink: reverted buffering logic back to how the ladspa sink did it
857eea0 module-equalizer-sink:     add lennard's fix for piggy-back sinks in pop_cb     fixed some tsched issues
144f1c4 module-equalizer-sink:     dbus properties and manager so that multiple sinks can be loaded and mixers can be equalizer-sink aware     functionality to seed new filters quickly (rteq guis)     profile support     extra checking in client->server dbus messages
66a6cc6 module-equalizer-sink:     added support for suspend/resume of filter coefficients     unregister the correct dbus interface.     made equalizer state file sink index dependent     expanded dbus properties     whitespace
8934c31 module-equalizer-sink:     added dbus support     removed cruft from inherited from ladspa module and improved clarity     switched dsp processing to reference implementation until project is more mature     tsched=0 seems to help with the micro-dropouts/crackling! oh my!     reformatting/spaces
c7fcc9c module-equalizer-sink:     removed liboil     added sse2 optimized dsp logic implementation     cleaned up a bit
702480a module-equalizer-sink:     first commit of a working state (cpu speed dependant)     added noop processing for filter debugability
09d9096 module-equalizer-sink: simplified sink_input pop callback and introduced new variables that simplify different strategies.
cf8331a module-equalizer-sink: trying new buffering strategies
d4fe5bf module-equalizer-sink: attempt different buffering strategy
182c9c7 module-equalizer-sink: added more assertions to aid in debugging
2e11906 module-equalizer-sink:     added temporary debugging output to track filter output     removed dead code     only a small amount of crackling remains
4315550 module-equalizer-sink added src/Makefile.am: added module-equalizer-sink
94aa909 Merge branch 'master' of git://0pointer.de/pulseaudio
c1e59f7 Merge branch 'master' of git://0pointer.de/pulseaudio
bebaa49 Merge branch 'master' of git://0pointer.de/pulseaudio
5871319 dbus-protocol: Implement argument type checking for normal methods.
8a28e5d dbus: Change IsMuted property names to Mute.
411feae dbusiface-core: Add signals FallbackSinkUnset and FallbackSourceUnset.
0ad2d55 Merge branch 'master' of git://0pointer.de/pulseaudio into dbus-work
0e09663 dbus: Do message argument type checking early, centrally.
7bc8a79 Merge branch 'master' of git://0pointer.de/pulseaudio into dbus-work
219f750 dbus: Finish the Client D-Bus interface.
11fcc8c dbusiface-stream: Only send stream event signals from the right D-Bus objects.
edf8010 dbus: Make sure that subscription callbacks don't try to access removed objects.
3e0e685 dbus: Save one level of identation by returning early.
2f3fc2f Merge branch 'master' of git://0pointer.de/pulseaudio into dbus-work
3025645 dbusiface-module: Implement the Module D-Bus interface.
57886ff dbus-protocol: Print a debug line whenever interfaces are unregistered.
7049b3c modargs: New function: pa_modargs_iterate().
187c4f3 proplist: A couple of documentation fixes.
1e4e26c proplist: Return early from pa_proplist_equal() if the pointers are equal.
179f849 dbusifaca-device: Adapt to the changed pa_sink_get/set_volume() interface.
292d6dc Merge branch 'master' of git://0pointer.de/pulseaudio into dbus-work
b4e0d5d dbusiface-sample: Implement the Sample D-Bus interface.
3de210b dbusiface-core: Assert that _add/remove_interface calls succeed.
636dbc3 dbusiface-core: Use the PA_IDXSET_FOREACH macro.
8e6664f dbusiface-core: Split some overly long lines.
36dc61a dbusiface-stream: Finish the Stream D-Bus interface.
70ff96b dbusiface-device: Save one level of identation by returning early.
b528715 dbusiface-device: Fix argument reading in handle_suspend().
bce6af1 dbusiface-device: Use a single if-else section instead of ternary operator overuse.
150cd16 dbusiface-device: Split some overly long lines.
efec274 dbusiface-core: Two new functions: pa_dbusiface_core_get_sink/source().
a10e836 dbusiface-core: New function: pa_dbusiface_core_get_client_path().
f48684e namereg: Revert default device handling back to the upstream version.
bcaba0b Merge branch 'master' of git://0pointer.de/pulseaudio into dbus-work
2bb3eef dbusiface-stream: Implement about a half of the Stream D-Bus interface.
f0db081 dbusiface-device: Free the copied proplist.
a72bba1 dbusiface-client: Fix indentation.
c7f4ed3 dbusiface-client: Fix the interface name.
9ed25d7 dbusiface-client: Implement the properties of the Client D-Bus interface.
f663d13 dbusiface-core: Two new functions: pa_dbusiface_core_get_playback/record_stream_path().
91f626f dbusiface-device: Implement the Device and DevicePort D-Bus interfaces.
22ab141 dbus-protocol: Use pa_hashmap_remove() instead of _get().
1e65d8d dbusiface-core: New function: pa_dbusiface_core_get_card_path().
90c73db dbusiface-card: Fix the OwnerModule property type in handle_get_all().
31c544d dbusiface-card: Assert that the profiles list is empty if there's no active profile.
18f9f1b dbusiface-card: Use the ++ operator like it's meant to be used.
afb79ee dbusiface-card-profile: Assert the core argument isn't NULL.
8b5550d dbusiface-card: Split some overly long lines.
31117fe dbus-protocol: Fix signal sending for the case when the client doesn't listen for all signals.
7cfda56 dbus-protocol: Add a note for _send_signal that by default the signal isn't actually sent.
8c8df77 dbusiface-card-profile: Implement the CardProfile D-Bus interface.
acad506 dbusiface-card: Implement the Card D-Bus interface.
16dce8d dbus-protocol: Take advantage of the helpers in dbus-util.
7699cfd dbus-protocol: Split some overly long lines.
76bd03b dbus-util: Trivial comment punctuation fix.
3e9de1a dbus-util: Add helpers for proplist handling.
5ece8e8 dbusiface-core: Add functions for getting various object paths.
0b66620 dbusiface-core: Generate more informative error messages.
06232e2 dbus: Take advantage of the PA_HASHMAP_FOREACH macro.
fcf6875 dbus: Three entangled changes:
1457df4 proplist: New function: pa_proplist_equal()
897ef86 Add volume ramping feature - sink modification
5318eb3 Add volume ramping feature - sink-input modification
8eaa40b Add volume ramping feature - envelop fix
44770c5 dbusiface-memstats: Implement the Memstats D-Bus interface.
0fc0552 dbus-protocol: Remove erroneous protocol object unref.
9eeb8eb dbus-protocol: Make debug logging saner.
b1578e2 dbus-protocol, dbusiface-core: Take a reference when storing the core pointer.
8966c61 dbusiface-core: Make the interface string a public constant.
d9d166a stream-restore: Expose module to D-Bus.
805af5e dbus-util: Fix broken proplist reading logic.
8c84057 dbus-protocol: Add debugging output (temporary change).
a1ba80b dbusiface-core: Don't die if we get a default sink/source change event before the new default device is actually created.
68cb63c dbusiface-core: Send signals whenever extensions are registered and unregistered.
c354a08 dbus-protocol: Implement extension registration.
b061957 dbus/iface-core.c: Make sure D-Bus objects are created only once.
018810e Bug fixing and minor cleanups.
9a77d2f Add the forgotten src/modules/dbus directory to git.
9347e90 Finish the Core dbus interface.
c6d330e Merge branch 'osx' of git://gitorious.org/~flameeyes/pulseaudio/flameeyes-pulseaudio
63f2ed6 Merge branch 'osx' of git://gitorious.org/~flameeyes/pulseaudio/flameeyes-pulseaudio
30fcda6 Revert "make bootstrap.sh aware of Darwin environment"
3fc7b87 Merge branch 'osx' of git://gitorious.org/~flameeyes/pulseaudio/flameeyes-pulseaudio
909dc09 Merge branch 'master' of git://gitorious.org/~flameeyes/pulseaudio/flameeyes-pulseaudio
5f5867e make bootstrap.sh aware of Darwin environment
5c7952e dbus: Implement the Name property of the core object.
6e2fec0 server-lookup: Update the D-Bus identifiers to be versioned.
3bff2ee module-cli: Fix compilation by adding libpulsecommon to module_cli_la_LIBADD.
c266595 Merge branch 'master' into dbus-work
0bc538b Merge branch 'master' into dbus-work
b152f3a module-dbus-protocol: Allow anyone to connect the daemon in system mode.
3c6a0ac dbus-protocol: Implement TCP server startup.
123c6a3 dbus-common: Implement infrastructure for registering D-Bus objects on all client connections and for receiving method calls from clients.
c8d819a dbus-protocol: Connection handling for local connections.
5babbaa daemon: Implement the DBus server lookup service.
c94e742 Create module-dbus-protocol with "Hello, world!" functionality.
-----------------------------------------------------------------------

Summary of changes:
 PROTOCOL                                           |    6 +
 configure.ac                                       |  153 +-
 man/Makefile.am                                    |   46 +-
 man/pacat.1.xml.in                                 |   96 +-
 man/pulse-client.conf.5.xml.in                     |   19 +-
 man/pulse-daemon.conf.5.xml.in                     |   10 +-
 po/LINGUAS                                         |   10 +-
 po/as.po                                           |  706 ++++---
 po/bn_IN.po                                        |  721 ++++---
 po/ca.po                                           |  706 ++++---
 po/cs.po                                           |  701 ++++---
 po/de.po                                           |  812 +++++---
 po/de_CH.po                                        |  704 ++++---
 po/el.po                                           |  882 +++++---
 po/es.po                                           |  708 ++++---
 po/fi.po                                           |  708 ++++---
 po/fr.po                                           | 1375 ++++++++-----
 po/gu.po                                           |  718 ++++---
 po/he.po                                           |  928 +++++----
 po/hi.po                                           |  718 ++++---
 po/hu.po                                           | 1165 +++++++----
 po/it.po                                           |  701 ++++---
 po/ja.po                                           |  941 +++++----
 po/kn.po                                           |  714 ++++---
 po/ml.po                                           |  721 ++++---
 po/mr.po                                           |  715 ++++---
 po/nl.po                                           |  743 ++++---
 po/or.po                                           |  715 ++++---
 po/pa.po                                           |  708 ++++---
 po/pl.po                                           |  701 ++++---
 po/pt.po                                           |  699 ++++---
 po/pt_BR.po                                        | 1260 +++++++-----
 po/ru.po                                           |  701 ++++---
 po/sr.po                                           |  701 ++++---
 po/sr at latin.po                                     |  701 ++++---
 po/sv.po                                           |  695 ++++---
 po/ta.po                                           |  724 ++++---
 po/te.po                                           |  715 ++++---
 po/uk.po                                           |  739 ++++---
 po/zh_CN.po                                        |  720 ++++---
 po/zh_TW.po                                        |  936 +++++----
 src/.gitignore                                     |    2 +
 src/Makefile.am                                    |  199 ++-
 src/daemon/.gitignore                              |    1 +
 src/daemon/cpulimit.c                              |    4 +-
 src/daemon/daemon-conf.c                           |   57 +-
 src/daemon/daemon-conf.h                           |    3 +
 src/daemon/daemon.conf.in                          |    3 +-
 src/daemon/default.pa.in                           |    3 +
 src/daemon/main.c                                  |  255 ++-
 src/daemon/pulseaudio-kde.desktop.in               |   11 +
 src/daemon/server-lookup.c                         |  522 +++++
 .../auth-cookie.h => daemon/server-lookup.h}       |   23 +-
 .../daemon/start-pulseaudio-kde.in                 |   16 +-
 src/daemon/start-pulseaudio-x11.in                 |    2 -
 src/daemon/system.pa.in                            |    4 +
 src/map-file                                       |   11 +
 src/modules/alsa/alsa-mixer.c                      |   25 +-
 src/modules/alsa/alsa-sink.c                       |   12 +-
 src/modules/alsa/alsa-source.c                     |   12 +-
 src/modules/alsa/alsa-util.c                       |   44 +-
 src/modules/alsa/alsa-util.h                       |    5 +-
 src/modules/alsa/mixer/paths/analog-input-aux.conf |    4 +
 src/modules/alsa/mixer/paths/analog-input-fm.conf  |    4 +
 ...put-mic.conf => analog-input-internal-mic.conf} |    8 +-
 .../alsa/mixer/paths/analog-input-linein.conf      |    4 +
 .../alsa/mixer/paths/analog-input-mic-line.conf    |    4 +
 src/modules/alsa/mixer/paths/analog-input-mic.conf |    4 +
 .../alsa/mixer/paths/analog-input-mic.conf.common  |    9 +
 .../alsa/mixer/paths/analog-input-tvtuner.conf     |    4 +
 .../alsa/mixer/paths/analog-input-video.conf       |    4 +
 src/modules/alsa/mixer/paths/analog-input.conf     |    3 +
 .../alsa/mixer/paths/analog-input.conf.common      |   60 +-
 ...put.conf => analog-output-desktop-speaker.conf} |   20 +-
 ...t-mono.conf => analog-output-headphones-2.conf} |   31 +-
 .../alsa/mixer/paths/analog-output-headphones.conf |   12 +
 .../mixer/paths/analog-output-lfe-on-mono.conf     |    8 +
 .../alsa/mixer/paths/analog-output-mono.conf       |    8 +
 ...alog-output.conf => analog-output-speaker.conf} |   12 +-
 src/modules/alsa/mixer/paths/analog-output.conf    |   19 +-
 .../alsa/mixer/paths/analog-output.conf.common     |   28 +
 .../alsa/mixer/profile-sets/90-pulseaudio.rules    |    1 +
 src/modules/alsa/mixer/profile-sets/default.conf   |   14 +-
 ...nts-audio4dj.conf => maudio-fasttrack-pro.conf} |   52 +-
 src/modules/bluetooth/bluetooth-util.c             |   58 +-
 src/modules/bluetooth/bluetooth-util.h             |    3 +
 src/modules/bluetooth/module-bluetooth-device.c    |  108 +-
 src/modules/bluetooth/module-bluetooth-discover.c  |   11 +-
 src/modules/bluetooth/module-bluetooth-proximity.c |   11 +-
 src/modules/coreaudio/module-coreaudio-detect.c    |  229 ++
 src/modules/coreaudio/module-coreaudio-device.c    |  820 ++++++++
 src/modules/dbus/iface-card-profile.c              |  228 ++
 src/modules/dbus/iface-card-profile.h              |   50 +
 src/modules/dbus/iface-card.c                      |  561 +++++
 .../dllmain.c => modules/dbus/iface-card.h}        |   46 +-
 src/modules/dbus/iface-client.c                    |  461 ++++
 .../dbus-shared.h => modules/dbus/iface-client.h}  |   31 +-
 src/modules/dbus/iface-core.c                      | 2197 +++++++++++++++++++
 src/modules/dbus/iface-core.h                      |   52 +
 src/modules/dbus/iface-device-port.c               |  190 ++
 src/modules/dbus/iface-device-port.h               |   50 +
 src/modules/dbus/iface-device.c                    | 1316 ++++++++++++
 src/modules/dbus/iface-device.h                    |   53 +
 src/modules/dbus/iface-memstats.c                  |  231 ++
 .../dbus/iface-memstats.h}                         |   29 +-
 src/modules/dbus/iface-module.c                    |  336 +++
 .../cli.h => modules/dbus/iface-module.h}          |   29 +-
 src/modules/dbus/iface-sample.c                    |  519 +++++
 .../dbus-shared.h => modules/dbus/iface-sample.h}  |   31 +-
 src/modules/dbus/iface-stream.c                    |  894 ++++++++
 src/modules/dbus/iface-stream.h                    |   47 +
 src/modules/dbus/module-dbus-protocol.c            |  607 ++++++
 src/modules/jack/module-jack-sink.c                |    2 +-
 src/modules/jack/module-jack-source.c              |    2 +-
 src/modules/module-bonjour-publish.c               |  516 +++++
 src/modules/module-cli.c                           |    2 +-
 src/modules/module-combine.c                       |    6 +-
 src/modules/module-console-kit.c                   |    9 +-
 src/modules/module-default-device-restore.c        |    8 +-
 src/modules/module-detect.c                        |    8 +-
 src/modules/module-device-manager.c                | 1540 ++++++++++++++
 src/modules/module-equalizer-sink.c                | 2204 ++++++++++++++++++++
 src/modules/module-hal-detect.c                    |   10 +-
 src/modules/module-ladspa-sink.c                   |    6 +-
 src/modules/module-lirc.c                          |   26 +-
 src/modules/module-loopback.c                      |    6 +-
 src/modules/module-match.c                         |    2 +-
 src/modules/module-mmkbd-evdev.c                   |   28 +-
 src/modules/module-pipe-sink.c                     |   10 +-
 src/modules/module-pipe-source.c                   |   10 +-
 src/modules/module-position-event-sounds.c         |   18 +-
 src/modules/module-protocol-stub.c                 |   13 +-
 src/modules/module-rygel-media-server.c            |   45 +-
 src/modules/module-sine-source.c                   |    2 +-
 src/modules/module-solaris.c                       |    2 +-
 src/modules/module-stream-restore.c                | 1066 ++++++++++-
 src/modules/module-udev-detect.c                   |   73 +-
 .../{module-remap-sink.c => module-virtual-sink.c} |  291 ++-
 src/modules/module-virtual-source.c                |  771 +++++++
 src/modules/oss/oss-util.c                         |   18 +-
 src/modules/raop/module-raop-sink.c                |    2 +-
 src/modules/raop/raop_client.c                     |    5 -
 src/modules/rtp/module-rtp-recv.c                  |    2 +-
 src/modules/rtp/module-rtp-send.c                  |    6 +-
 src/modules/rtp/rtsp_client.c                      |    5 -
 src/modules/udev-util.c                            |  110 +
 src/modules/x11/module-x11-xsmp.c                  |    2 +-
 src/pulse/channelmap.c                             |    2 +-
 src/pulse/channelmap.h                             |   20 +-
 src/pulse/client-conf.c                            |   11 +-
 src/pulse/client-conf.h                            |    5 +-
 src/pulse/client.conf.in                           |    6 +-
 src/pulse/context.c                                |   77 +-
 src/pulse/context.h                                |   22 +-
 src/pulse/def.h                                    |   13 +-
 .../{ext-stream-restore.c => ext-device-manager.c} |  216 ++-
 src/pulse/ext-device-manager.h                     |  128 ++
 src/pulse/ext-stream-restore.h                     |    2 +
 src/pulse/internal.h                               |   10 +-
 src/pulse/introspect.h                             |    2 +-
 src/pulse/mainloop-signal.c                        |    4 +-
 src/pulse/mainloop.c                               |   13 +-
 src/pulse/proplist.c                               |   29 +
 src/pulse/proplist.h                               |   10 +-
 src/pulse/scache.c                                 |   10 +-
 src/pulse/simple.h                                 |    4 +-
 src/pulse/stream.c                                 |  136 +-
 src/pulse/stream.h                                 |   23 +-
 src/pulse/thread-mainloop.c                        |    6 +-
 src/pulse/util.c                                   |   11 +
 src/pulse/volume.c                                 |   10 +-
 src/pulse/volume.h                                 |   10 +-
 src/pulsecore/asyncq.h                             |    5 +-
 src/pulsecore/atomic.h                             |  104 +
 src/pulsecore/aupdate.h                            |    2 +-
 src/pulsecore/authkey.c                            |   10 +-
 src/pulsecore/cli-command.c                        |    2 +-
 src/pulsecore/conf-parser.c                        |    2 +-
 src/pulsecore/core-rtclock.c                       |   51 +-
 src/pulsecore/core-scache.c                        |   10 +-
 src/pulsecore/core-util.c                          |  261 +++-
 src/pulsecore/core-util.h                          |   19 +
 src/pulsecore/core.h                               |    9 +
 src/pulsecore/cpu-arm.c                            |    8 +-
 src/pulsecore/cpu-arm.h                            |    2 +-
 src/pulsecore/cpu-x86.c                            |    6 +-
 src/pulsecore/cpu-x86.h                            |    6 +-
 src/pulsecore/database-simple.c                    |    4 +-
 src/pulsecore/database-tdb.c                       |   43 +-
 src/pulsecore/dbus-util.c                          |  381 ++++-
 src/pulsecore/dbus-util.h                          |   43 +
 src/pulsecore/envelope.c                           |  333 +++-
 src/pulsecore/envelope.h                           |    3 +
 src/pulsecore/fdsem.c                              |   54 +-
 src/pulsecore/flist.h                              |    2 +-
 src/pulsecore/idxset.h                             |    2 +-
 src/pulsecore/lock-autospawn.c                     |    8 +-
 src/pulsecore/log.c                                |   88 +-
 src/pulsecore/memblockq.c                          |  105 +-
 src/pulsecore/memblockq.h                          |    4 +-
 src/pulsecore/modargs.c                            |   10 +
 src/pulsecore/modargs.h                            |    9 +
 src/pulsecore/once.c                               |    3 +-
 src/pulsecore/pid.c                                |    7 +-
 src/pulsecore/play-memblockq.c                     |    7 +-
 src/pulsecore/play-memblockq.h                     |   18 +-
 src/pulsecore/play-memchunk.c                      |    9 +-
 src/pulsecore/play-memchunk.h                      |   15 +-
 src/pulsecore/poll.c                               |   33 +-
 src/pulsecore/poll.h                               |   18 +-
 src/pulsecore/protocol-dbus.c                      | 1143 ++++++++++
 src/pulsecore/protocol-dbus.h                      |  218 ++
 src/pulsecore/protocol-esound.c                    |    5 +-
 src/pulsecore/protocol-native.c                    |   44 +-
 src/pulsecore/protocol-simple.c                    |    6 +-
 src/pulsecore/random.c                             |    6 +-
 src/pulsecore/rtpoll.c                             |   32 +-
 src/pulsecore/sample-util.c                        |    2 +-
 .../{semaphore-win32.c => semaphore-osx.c}         |   20 +-
 src/pulsecore/shm.c                                |    8 +-
 src/pulsecore/sink-input.c                         |  400 +++-
 src/pulsecore/sink-input.h                         |   21 +
 src/pulsecore/sink.c                               |   32 +-
 src/pulsecore/socket-client.c                      |    4 +-
 src/pulsecore/socket-server.c                      |   81 +-
 src/pulsecore/socket-server.h                      |   16 +-
 src/pulsecore/socket-util.c                        |   30 +-
 src/pulsecore/sound-file-stream.c                  |   11 +-
 src/pulsecore/sound-file.c                         |    6 +-
 src/pulsecore/svolume_mmx.c                        |   17 +-
 src/pulsecore/svolume_sse.c                        |   14 +-
 src/pulsecore/thread-posix.c                       |    8 +-
 src/pulsecore/thread.h                             |    2 +-
 src/pulsecore/time-smoother.c                      |    7 +
 src/pulsecore/x11prop.c                            |   20 +-
 src/tests/lock-autospawn-test.c                    |    4 +-
 src/tests/once-test.c                              |  103 +
 src/tests/rtpoll-test.c                            |    2 +-
 src/utils/pacat.c                                  |   97 +-
 src/utils/pacmd.c                                  |  191 +-
 src/utils/pactl.c                                  |  115 +-
 src/utils/padsp.c                                  |   55 +-
 src/utils/pasuspender.c                            |    2 -
 src/utils/qpaeq                                    |  560 +++++
 vala/libpulse.vapi                                 |   10 +-
 245 files changed, 38100 insertions(+), 12361 deletions(-)
 create mode 100644 src/daemon/pulseaudio-kde.desktop.in
 create mode 100644 src/daemon/server-lookup.c
 copy src/{pulsecore/auth-cookie.h => daemon/server-lookup.h} (58%)
 copy doxygen/Makefile.am => src/daemon/start-pulseaudio-kde.in (80%)
 mode change 100644 => 100755
 copy src/modules/alsa/mixer/paths/{analog-input-mic.conf => analog-input-internal-mic.conf} (92%)
 copy src/modules/alsa/mixer/paths/{analog-output.conf => analog-output-desktop-speaker.conf} (83%)
 copy src/modules/alsa/mixer/paths/{analog-output-mono.conf => analog-output-headphones-2.conf} (80%)
 copy src/modules/alsa/mixer/paths/{analog-output.conf => analog-output-speaker.conf} (91%)
 copy src/modules/alsa/mixer/profile-sets/{native-instruments-audio4dj.conf => maudio-fasttrack-pro.conf} (64%)
 create mode 100644 src/modules/coreaudio/module-coreaudio-detect.c
 create mode 100644 src/modules/coreaudio/module-coreaudio-device.c
 create mode 100644 src/modules/dbus/iface-card-profile.c
 create mode 100644 src/modules/dbus/iface-card-profile.h
 create mode 100644 src/modules/dbus/iface-card.c
 copy src/{pulsecore/dllmain.c => modules/dbus/iface-card.h} (53%)
 create mode 100644 src/modules/dbus/iface-client.c
 copy src/{pulsecore/dbus-shared.h => modules/dbus/iface-client.h} (52%)
 create mode 100644 src/modules/dbus/iface-core.c
 create mode 100644 src/modules/dbus/iface-core.h
 create mode 100644 src/modules/dbus/iface-device-port.c
 create mode 100644 src/modules/dbus/iface-device-port.h
 create mode 100644 src/modules/dbus/iface-device.c
 create mode 100644 src/modules/dbus/iface-device.h
 create mode 100644 src/modules/dbus/iface-memstats.c
 copy src/{pulsecore/dbus-shared.h => modules/dbus/iface-memstats.h} (53%)
 create mode 100644 src/modules/dbus/iface-module.c
 copy src/{pulsecore/cli.h => modules/dbus/iface-module.h} (55%)
 create mode 100644 src/modules/dbus/iface-sample.c
 copy src/{pulsecore/dbus-shared.h => modules/dbus/iface-sample.h} (52%)
 create mode 100644 src/modules/dbus/iface-stream.c
 create mode 100644 src/modules/dbus/iface-stream.h
 create mode 100644 src/modules/dbus/module-dbus-protocol.c
 create mode 100644 src/modules/module-bonjour-publish.c
 create mode 100644 src/modules/module-device-manager.c
 create mode 100644 src/modules/module-equalizer-sink.c
 copy src/modules/{module-remap-sink.c => module-virtual-sink.c} (60%)
 create mode 100644 src/modules/module-virtual-source.c
 copy src/pulse/{ext-stream-restore.c => ext-device-manager.c} (58%)
 create mode 100644 src/pulse/ext-device-manager.h
 create mode 100644 src/pulsecore/protocol-dbus.c
 create mode 100644 src/pulsecore/protocol-dbus.h
 copy src/pulsecore/{semaphore-win32.c => semaphore-osx.c} (67%)
 create mode 100644 src/tests/once-test.c
 create mode 100755 src/utils/qpaeq

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

commit c94e7421aad58c7714f6e26f20642c51af17cc4d
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Wed Jun 3 15:21:50 2009 +0300

    Create module-dbus-protocol with "Hello, world!" functionality.

diff --git a/src/Makefile.am b/src/Makefile.am
index a7ec691..70b16be 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1072,7 +1072,8 @@ endif
 
 if HAVE_DBUS
 modlibexec_LTLIBRARIES += \
-		module-rygel-media-server.la
+		module-rygel-media-server.la \
+		module-dbus-protocol.la
 endif
 
 if HAVE_BLUEZ
@@ -1164,7 +1165,8 @@ SYMDEF_FILES = \
 		modules/module-position-event-sounds-symdef.h \
 		modules/module-augment-properties-symdef.h \
 		modules/module-cork-music-on-phone-symdef.h \
-		modules/module-console-kit-symdef.h
+		modules/module-console-kit-symdef.h \
+		modules/module-dbus-protocol-symdef.h
 
 EXTRA_DIST += $(SYMDEF_FILES)
 BUILT_SOURCES += $(SYMDEF_FILES)
@@ -1213,6 +1215,13 @@ module_http_protocol_unix_la_CFLAGS = -DUSE_UNIX_SOCKETS -DUSE_PROTOCOL_HTTP $(A
 module_http_protocol_unix_la_LDFLAGS = $(MODULE_LDFLAGS)
 module_http_protocol_unix_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINORMICRO@.la libprotocol-http.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
 
+# D-Bus protocol
+
+module_dbus_protocol_la_SOURCES = modules/module-dbus-protocol.c
+module_dbus_protocol_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS)
+module_dbus_protocol_la_LDFLAGS = $(MODULE_LDFLAGS)
+module_dbus_protocol_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
+
 # Native protocol
 
 module_native_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c
diff --git a/src/daemon/default.pa.in b/src/daemon/default.pa.in
index fa0683e..ba8e3c8 100755
--- a/src/daemon/default.pa.in
+++ b/src/daemon/default.pa.in
@@ -66,6 +66,9 @@ load-module module-bluetooth-discover
 .ifexists module-esound-protocol-unix at PA_SOEXT@
 load-module module-esound-protocol-unix
 .endif
+.ifexists module-dbus-protocol at PA_SOEXT@
+load-module module-dbus-protocol
+.endif
 load-module module-native-protocol-unix
 
 ### Network access (may be configured with paprefs, so leave this commented
diff --git a/src/daemon/system.pa.in b/src/daemon/system.pa.in
index 27e4281..5541bbe 100755
--- a/src/daemon/system.pa.in
+++ b/src/daemon/system.pa.in
@@ -32,6 +32,9 @@ load-module module-detect
 .ifexists module-esound-protocol-unix at PA_SOEXT@
 load-module module-esound-protocol-unix
 .endif
+.ifexists module-dbus-protocol at PA_SOEXT@
+load-module module-dbus-protocol
+.endif
 load-module module-native-protocol-unix
 
 ### Automatically restore the volume of streams and devices
diff --git a/src/modules/module-dbus-protocol.c b/src/modules/module-dbus-protocol.c
new file mode 100644
index 0000000..077f417
--- /dev/null
+++ b/src/modules/module-dbus-protocol.c
@@ -0,0 +1,66 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <pulse/xmalloc.h>
+
+#include <pulsecore/macro.h>
+#include <pulsecore/module.h>
+
+#include "module-dbus-protocol-symdef.h"
+
+PA_MODULE_DESCRIPTION("D-Bus interface");
+PA_MODULE_USAGE("<no module arguments>");
+PA_MODULE_LOAD_ONCE(TRUE);
+PA_MODULE_AUTHOR("Tanu Kaskinen");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+
+struct userdata {
+    pa_module *module;
+};
+
+int pa__init(pa_module *m) {
+    struct userdata *u = NULL;
+
+    pa_assert(m);
+
+    m->userdata = u = pa_xnew0(struct userdata, 1);
+    u->module = m;
+
+    pa_log_notice("Hello, world!");
+
+    return 0;
+}
+
+void pa__done(pa_module*m) {
+    struct userdata *u;
+
+    pa_assert(m);
+
+    if (!(u = m->userdata))
+        return;
+
+    pa_xfree(u);
+    m->userdata = NULL;
+}

commit 5babbaafb26ac4f83db0d8bca53006a843472b8f
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Fri Jun 12 07:16:05 2009 +0300

    daemon: Implement the DBus server lookup service.

diff --git a/src/Makefile.am b/src/Makefile.am
index 70b16be..c56f760 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -135,13 +135,14 @@ BUILT_SOURCES = \
 bin_PROGRAMS = pulseaudio
 
 pulseaudio_SOURCES = \
-		daemon/caps.h daemon/caps.c \
+		daemon/caps.c daemon/caps.h \
 		daemon/cmdline.c daemon/cmdline.h \
 		daemon/cpulimit.c daemon/cpulimit.h \
 		daemon/daemon-conf.c daemon/daemon-conf.h \
 		daemon/dumpmodules.c daemon/dumpmodules.h \
 		daemon/ltdl-bind-now.c daemon/ltdl-bind-now.h \
-		daemon/main.c
+		daemon/main.c \
+		daemon/server-lookup.c daemon/server-lookup.h
 
 pulseaudio_CFLAGS = $(AM_CFLAGS) $(LIBOIL_CFLAGS) $(LIBSAMPLERATE_CFLAGS) $(LIBSPEEX_CFLAGS) $(LIBSNDFILE_CFLAGS) $(CAP_CFLAGS) $(LIBOIL_CFLAGS) $(DBUS_CFLAGS)
 pulseaudio_LDADD = $(AM_LDADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la $(LIBLTDL) $(LIBSAMPLERATE_LIBS) $(LIBSPEEX_LIBS) $(LIBSNDFILE_LIBS) $(CAP_LIBS) $(LIBOIL_LIBS) $(DBUS_LIBS)
diff --git a/src/daemon/daemon-conf.c b/src/daemon/daemon-conf.c
index ac6cc8a..e6fa8c6 100644
--- a/src/daemon/daemon-conf.c
+++ b/src/daemon/daemon-conf.c
@@ -83,6 +83,9 @@ static const pa_daemon_conf default_conf = {
     .config_file = NULL,
     .use_pid_file = TRUE,
     .system_instance = FALSE,
+#ifdef HAVE_DBUS
+    .local_server_type = PA_SERVER_TYPE_UNSET, /* The actual default is _USER, but we have to detect when the user doesn't specify this option. */
+#endif
     .no_cpu_limit = FALSE,
     .disable_shm = FALSE,
     .default_n_fragments = 4,
@@ -203,6 +206,22 @@ int pa_daemon_conf_set_resample_method(pa_daemon_conf *c, const char *string) {
     return 0;
 }
 
+int pa_daemon_conf_set_local_server_type(pa_daemon_conf *c, const char *string) {
+    pa_assert(c);
+    pa_assert(string);
+
+    if (!strcmp(string, "user"))
+        c->local_server_type = PA_SERVER_TYPE_USER;
+    else if (!strcmp(string, "system")) {
+        c->local_server_type = PA_SERVER_TYPE_SYSTEM;
+    } else if (!strcmp(string, "none")) {
+        c->local_server_type = PA_SERVER_TYPE_NONE;
+    } else
+        return -1;
+
+    return 0;
+}
+
 static int parse_log_target(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata) {
     pa_daemon_conf *c = data;
 
@@ -430,6 +449,22 @@ static int parse_rtprio(const char *filename, unsigned line, const char *section
     return 0;
 }
 
+static int parse_server_type(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata) {
+    pa_daemon_conf *c = data;
+
+    pa_assert(filename);
+    pa_assert(lvalue);
+    pa_assert(rvalue);
+    pa_assert(data);
+
+    if (pa_daemon_conf_set_local_server_type(c, rvalue) < 0) {
+        pa_log(_("[%s:%u] Invalid server type '%s'."), filename, line, rvalue);
+        return -1;
+    }
+
+    return 0;
+}
+
 int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) {
     int r = -1;
     FILE *f = NULL;
@@ -443,6 +478,9 @@ int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) {
         { "disallow-exit",              pa_config_parse_bool,     &c->disallow_exit, NULL },
         { "use-pid-file",               pa_config_parse_bool,     &c->use_pid_file, NULL },
         { "system-instance",            pa_config_parse_bool,     &c->system_instance, NULL },
+#ifdef HAVE_DBUS
+        { "local-server-type",          parse_server_type,        c, NULL },
+#endif
         { "no-cpu-limit",               pa_config_parse_bool,     &c->no_cpu_limit, NULL },
         { "disable-shm",                pa_config_parse_bool,     &c->disable_shm, NULL },
         { "flat-volumes",               pa_config_parse_bool,     &c->flat_volumes, NULL },
@@ -604,6 +642,13 @@ static const char* const log_level_to_string[] = {
     [PA_LOG_ERROR] = "error"
 };
 
+static const char* const server_type_to_string[] = {
+    [PA_SERVER_TYPE_UNSET] = "!!UNSET!!",
+    [PA_SERVER_TYPE_USER] = "user",
+    [PA_SERVER_TYPE_SYSTEM] = "system",
+    [PA_SERVER_TYPE_NONE] = "none"
+};
+
 char *pa_daemon_conf_dump(pa_daemon_conf *c) {
     pa_strbuf *s;
     char cm[PA_CHANNEL_MAP_SNPRINT_MAX];
@@ -627,6 +672,9 @@ char *pa_daemon_conf_dump(pa_daemon_conf *c) {
     pa_strbuf_printf(s, "disallow-exit = %s\n", pa_yes_no(c->disallow_exit));
     pa_strbuf_printf(s, "use-pid-file = %s\n", pa_yes_no(c->use_pid_file));
     pa_strbuf_printf(s, "system-instance = %s\n", pa_yes_no(c->system_instance));
+#ifdef HAVE_DBUS
+    pa_strbuf_printf(s, "local-server-type = %s\n", server_type_to_string[c->local_server_type]);
+#endif
     pa_strbuf_printf(s, "no-cpu-limit = %s\n", pa_yes_no(c->no_cpu_limit));
     pa_strbuf_printf(s, "disable-shm = %s\n", pa_yes_no(c->disable_shm));
     pa_strbuf_printf(s, "flat-volumes = %s\n", pa_yes_no(c->flat_volumes));
diff --git a/src/daemon/daemon-conf.h b/src/daemon/daemon-conf.h
index 9cec189..98db864 100644
--- a/src/daemon/daemon-conf.h
+++ b/src/daemon/daemon-conf.h
@@ -48,6 +48,13 @@ typedef enum pa_daemon_conf_cmd {
     PA_CMD_CLEANUP_SHM
 } pa_daemon_conf_cmd_t;
 
+typedef enum pa_daemon_conf_server_type {
+    PA_SERVER_TYPE_UNSET,
+    PA_SERVER_TYPE_USER,
+    PA_SERVER_TYPE_SYSTEM,
+    PA_SERVER_TYPE_NONE
+} pa_daemon_conf_server_type_t;
+
 #ifdef HAVE_SYS_RESOURCE_H
 typedef struct pa_rlimit {
     rlim_t value;
@@ -74,6 +81,7 @@ typedef struct pa_daemon_conf {
         log_meta,
         log_time,
         flat_volumes;
+    pa_daemon_conf_server_type_t local_server_type;
     int exit_idle_time,
         scache_idle_time,
         auto_log_target,
@@ -151,6 +159,7 @@ int pa_daemon_conf_env(pa_daemon_conf *c);
 int pa_daemon_conf_set_log_target(pa_daemon_conf *c, const char *string);
 int pa_daemon_conf_set_log_level(pa_daemon_conf *c, const char *string);
 int pa_daemon_conf_set_resample_method(pa_daemon_conf *c, const char *string);
+int pa_daemon_conf_set_local_server_type(pa_daemon_conf *c, const char *string);
 
 const char *pa_daemon_conf_get_default_script_file(pa_daemon_conf *c);
 FILE *pa_daemon_conf_open_default_script_file(pa_daemon_conf *c);
diff --git a/src/daemon/daemon.conf.in b/src/daemon/daemon.conf.in
index fcd2513..ecdb3a6 100644
--- a/src/daemon/daemon.conf.in
+++ b/src/daemon/daemon.conf.in
@@ -25,6 +25,7 @@
 ; disallow-exit = no
 ; use-pid-file = yes
 ; system-instance = no
+; local-server-type = user
 ; disable-shm = no
 ; shm-size-bytes = 0 # setting this 0 will use the system-default, usually 64 MiB
 
diff --git a/src/daemon/main.c b/src/daemon/main.c
index 3e50baa..1b6ed79 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -99,6 +99,7 @@
 #include "caps.h"
 #include "ltdl-bind-now.h"
 #include "polkit.h"
+#include "server-lookup.h"
 
 #ifdef HAVE_LIBWRAP
 /* Only one instance of these variables */
@@ -335,33 +336,31 @@ static void set_all_rlimits(const pa_daemon_conf *conf) {
 #endif
 
 #ifdef HAVE_DBUS
-static pa_dbus_connection *register_dbus(pa_core *c) {
+static pa_dbus_connection *register_dbus_name(pa_core *c, DBusBusType bus, const char* name) {
     DBusError error;
     pa_dbus_connection *conn;
 
     dbus_error_init(&error);
 
-    if (!(conn = pa_dbus_bus_get(c, pa_in_system_mode() ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, &error)) || dbus_error_is_set(&error)) {
+    if (!(conn = pa_dbus_bus_get(c, bus, &error)) || dbus_error_is_set(&error)) {
         pa_log_warn("Unable to contact D-Bus: %s: %s", error.name, error.message);
         goto fail;
     }
 
-    if (dbus_bus_request_name(pa_dbus_connection_get(conn), "org.pulseaudio.Server", DBUS_NAME_FLAG_DO_NOT_QUEUE, &error) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
-        pa_log_debug("Got org.pulseaudio.Server!");
+    if (dbus_bus_request_name(pa_dbus_connection_get(conn), name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
+        pa_log_debug("Got %s!", name);
         return conn;
     }
 
     if (dbus_error_is_set(&error))
-        pa_log_warn("Failed to acquire org.pulseaudio.Server: %s: %s", error.name, error.message);
+        pa_log_error("Failed to acquire %s: %s: %s", name, error.name, error.message);
     else
-        pa_log_warn("D-Bus name org.pulseaudio.Server already taken. Weird shit!");
+        pa_log_error("D-Bus name %s already taken. Weird shit!", name);
 
     /* PA cannot be started twice by the same user and hence we can
-     * ignore mostly the case that org.pulseaudio.Server is already
-     * taken. */
+     * ignore mostly the case that a name is already taken. */
 
 fail:
-
     if (conn)
         pa_dbus_connection_unref(conn);
 
@@ -393,7 +392,10 @@ int main(int argc, char *argv[]) {
     int autospawn_fd = -1;
     pa_bool_t autospawn_locked = FALSE;
 #ifdef HAVE_DBUS
-    pa_dbus_connection *dbus = NULL;
+    pa_dbusobj_server_lookup *server_lookup = NULL; /* /org/pulseaudio/server_lookup */
+    pa_dbus_connection *lookup_service_bus = NULL; /* Always the user bus. */
+    pa_dbus_connection *server_bus = NULL; /* The bus where we reserve org.pulseaudio.Server, either the user or the system bus. */
+    pa_bool_t start_server;
 #endif
 
     pa_log_set_ident("pulseaudio");
@@ -486,8 +488,45 @@ int main(int argc, char *argv[]) {
         pa_log_set_flags(PA_LOG_PRINT_TIME, PA_LOG_SET);
     pa_log_set_show_backtrace(conf->log_backtrace);
 
+#ifdef HAVE_DBUS
+    /* conf->system_instance and conf->local_server_type control almost the
+     * same thing; make them agree about what is requested. */
+    switch (conf->local_server_type) {
+        case PA_SERVER_TYPE_UNSET:
+            conf->local_server_type = conf->system_instance ? PA_SERVER_TYPE_SYSTEM : PA_SERVER_TYPE_USER;
+            break;
+        case PA_SERVER_TYPE_USER:
+        case PA_SERVER_TYPE_NONE:
+            conf->system_instance = FALSE;
+            break;
+        case PA_SERVER_TYPE_SYSTEM:
+            conf->system_instance = TRUE;
+            break;
+        default:
+            pa_assert_not_reached();
+    }
+
+    start_server = conf->local_server_type == PA_SERVER_TYPE_USER || (real_root && conf->local_server_type == PA_SERVER_TYPE_SYSTEM);
+
+    if (!start_server && conf->local_server_type == PA_SERVER_TYPE_SYSTEM) {
+        pa_log_notice(_("System mode refused for non-root user. Only starting the D-Bus server lookup service."));
+        conf->system_instance = FALSE;
+    }
+#endif
+
     pa_log_debug("Started as real root: %s, suid root: %s", pa_yes_no(real_root), pa_yes_no(suid_root));
 
+#ifdef HAVE_DBUS
+    /* XXX: Uhh, goto programming... as if this wasn't hard enough to follow
+     * already. But if we won't start the full server, we want to just skip all
+     * the capability stuff. */
+    if (!start_server) {
+        if (!real_root && pa_have_caps())
+            pa_drop_caps();
+        goto after_caps_setup;
+    }
+#endif
+
     if (!real_root && pa_have_caps()) {
 #ifdef HAVE_SYS_RESOURCE_H
         struct rlimit rl;
@@ -628,6 +667,10 @@ int main(int argc, char *argv[]) {
         conf->realtime_scheduling = FALSE;
     }
 
+#ifdef HAVE_DBUS
+after_caps_setup:
+#endif
+
     pa_log_debug("Can realtime: %s, can high-priority: %s", pa_yes_no(pa_can_realtime()), pa_yes_no(pa_can_high_priority()));
 
     LTDL_SET_PRELOADED_SYMBOLS();
@@ -716,10 +759,12 @@ int main(int argc, char *argv[]) {
 
     if (real_root && !conf->system_instance)
         pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
+#ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */
     else if (!real_root && conf->system_instance) {
         pa_log(_("Root privileges required."));
         goto finish;
     }
+#endif
 
     if (conf->cmd == PA_CMD_START && conf->system_instance) {
         pa_log(_("--start not supported for system instances."));
@@ -1007,34 +1052,47 @@ int main(int argc, char *argv[]) {
         pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop)) == 0);
 
     buf = pa_strbuf_new();
-    if (conf->load_default_script_file) {
-        FILE *f;
 
-        if ((f = pa_daemon_conf_open_default_script_file(conf))) {
-            r = pa_cli_command_execute_file_stream(c, f, buf, &conf->fail);
-            fclose(f);
+#ifdef HAVE_DBUS
+    if (start_server) {
+#endif
+        if (conf->load_default_script_file) {
+            FILE *f;
+
+            if ((f = pa_daemon_conf_open_default_script_file(conf))) {
+                r = pa_cli_command_execute_file_stream(c, f, buf, &conf->fail);
+                fclose(f);
+            }
         }
-    }
 
-    if (r >= 0)
-        r = pa_cli_command_execute(c, conf->script_commands, buf, &conf->fail);
+        if (r >= 0)
+            r = pa_cli_command_execute(c, conf->script_commands, buf, &conf->fail);
 
-    pa_log_error("%s", s = pa_strbuf_tostring_free(buf));
-    pa_xfree(s);
+        pa_log_error("%s", s = pa_strbuf_tostring_free(buf));
+        pa_xfree(s);
 
-    /* We completed the initial module loading, so let's disable it
-     * from now on, if requested */
-    c->disallow_module_loading = !!conf->disallow_module_loading;
+        if (r < 0 && conf->fail) {
+            pa_log(_("Failed to initialize daemon."));
+            goto finish;
+        }
 
-    if (r < 0 && conf->fail) {
-        pa_log(_("Failed to initialize daemon."));
-        goto finish;
+        if (!c->modules || pa_idxset_size(c->modules) == 0) {
+            pa_log(_("Daemon startup without any loaded modules, refusing to work."));
+            goto finish;
+        }
+#ifdef HAVE_DBUS
+    } else {
+        /* When we just provide the D-Bus server lookup service, we don't want
+         * any modules to be loaded. We haven't loaded any so far, so one might
+         * think there's no way to contact the server, but receiving certain
+         * signals could still cause modules to load. */
+        conf->disallow_module_loading = TRUE;
     }
+#endif
 
-    if (!c->modules || pa_idxset_size(c->modules) == 0) {
-        pa_log(_("Daemon startup without any loaded modules, refusing to work."));
-        goto finish;
-    }
+    /* We completed the initial module loading, so let's disable it
+     * from now on, if requested */
+    c->disallow_module_loading = !!conf->disallow_module_loading;
 
 #ifdef HAVE_FORK
     if (daemon_pipe[1] >= 0) {
@@ -1046,7 +1104,15 @@ int main(int argc, char *argv[]) {
 #endif
 
 #ifdef HAVE_DBUS
-    dbus = register_dbus(c);
+    if (!conf->system_instance) {
+        if (!(server_lookup = pa_dbusobj_server_lookup_new(c, conf->local_server_type)))
+            goto finish;
+        if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.pulseaudio.PulseAudio")))
+            goto finish;
+    }
+
+    if (start_server && !(server_bus = register_dbus_name(c, conf->system_instance ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, "org.pulseaudio.Server")))
+        goto finish;
 #endif
 
     pa_log_info(_("Daemon startup complete."));
@@ -1059,8 +1125,12 @@ int main(int argc, char *argv[]) {
 
 finish:
 #ifdef HAVE_DBUS
-    if (dbus)
-        pa_dbus_connection_unref(dbus);
+    if (server_bus)
+        pa_dbus_connection_unref(server_bus);
+    if (lookup_service_bus)
+        pa_dbus_connection_unref(lookup_service_bus);
+    if (server_lookup)
+        pa_dbusobj_server_lookup_free(server_lookup);
 #endif
 
     if (autospawn_fd >= 0) {
diff --git a/src/daemon/server-lookup.c b/src/daemon/server-lookup.c
new file mode 100644
index 0000000..867c3a1
--- /dev/null
+++ b/src/daemon/server-lookup.c
@@ -0,0 +1,277 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <dbus/dbus.h>
+
+#include <pulse/client-conf.h>
+#include <pulse/xmalloc.h>
+
+#include <pulsecore/core-util.h>
+#include <pulsecore/dbus-shared.h>
+#include <pulsecore/macro.h>
+
+#include "server-lookup.h"
+
+struct pa_dbusobj_server_lookup {
+    pa_dbus_connection *conn;
+    pa_bool_t path_registered;
+    pa_daemon_conf_server_type_t server_type;
+};
+
+static const char introspection[] =
+    DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE
+    "<node>"
+    " <!-- If you are looking for documentation make sure to check out\n"
+    "      http://pulseaudio.org/wiki/DBusInterface -->\n"
+    " <interface name=\"org.pulseaudio.ServerLookup\">"
+    "  <method name=\"GetDBusServers\">"
+    "   <arg name=\"result\" type=\"s\" direction=\"out\"/>"
+    "  </method>"
+    " </interface>"
+    " <interface name=\"org.freedesktop.DBus.Introspectable\">"
+    "  <method name=\"Introspect\">"
+    "   <arg name=\"data\" type=\"s\" direction=\"out\"/>"
+    "  </method>"
+    " </interface>"
+    "</node>";
+
+static void unregister_cb(DBusConnection *conn, void *user_data) {
+    pa_dbusobj_server_lookup *sl = user_data;
+
+    pa_assert(sl);
+    pa_assert(sl->path_registered);
+
+    sl->path_registered = FALSE;
+}
+
+static DBusHandlerResult handle_introspect(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) {
+    const char *i = introspection;
+    DBusMessage *reply = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+
+    if (!(reply = dbus_message_new_method_return(msg)))
+        goto fail;
+
+    if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &i, DBUS_TYPE_INVALID))
+        goto fail;
+
+    if (!dbus_connection_send(conn, reply, NULL))
+        goto oom;
+
+    dbus_message_unref(reply);
+
+    return DBUS_HANDLER_RESULT_HANDLED;
+
+fail:
+    if (reply)
+        dbus_message_unref(reply);
+
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+oom:
+    if (reply)
+        dbus_message_unref(reply);
+
+    return DBUS_HANDLER_RESULT_NEED_MEMORY;
+}
+
+/* Caller frees the string. */
+static char *get_dbus_server_from_type(pa_daemon_conf_server_type_t server_type) {
+    char *server_string = NULL;
+    char *runtime_dir = NULL;
+
+    switch (server_type) {
+        case PA_SERVER_TYPE_USER:
+            runtime_dir = pa_get_runtime_dir();
+
+            if (!runtime_dir)
+                return NULL;
+
+            server_string = pa_sprintf_malloc("unix:path=%s/dbus_socket", runtime_dir);
+            break;
+
+        case PA_SERVER_TYPE_SYSTEM:
+            server_string = pa_xstrdup("unix:path=/var/run/pulse/dbus_socket");
+            break;
+
+        case PA_SERVER_TYPE_NONE:
+            server_string = pa_xnew0(char, 1);
+            break;
+
+        default:
+            pa_assert_not_reached();
+    }
+
+    return server_string;
+}
+
+static DBusHandlerResult handle_get_dbus_servers(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) {
+    DBusMessage *reply = NULL;
+    pa_client_conf *conf = NULL;
+    char *server_string = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(sl);
+
+    conf = pa_client_conf_new();
+
+    if (pa_client_conf_load(conf, NULL) < 0) {
+        if (!(reply = dbus_message_new_error(msg, "org.pulseaudio.ClientConfLoadError", "Failed to load client.conf.")))
+            goto fail;
+        if (!dbus_connection_send(conn, reply, NULL))
+            goto oom;
+        return DBUS_HANDLER_RESULT_HANDLED;
+    }
+
+    server_string = pa_xstrdup(conf->default_dbus_server);
+
+    pa_client_conf_free(conf);
+
+    if (!server_string) {
+        if (!(server_string = get_dbus_server_from_type(sl->server_type))) {
+            if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_FAILED, "get_dbus_server_from_type() failed.")))
+                goto fail;
+            if (!dbus_connection_send(conn, reply, NULL))
+                goto oom;
+            return DBUS_HANDLER_RESULT_HANDLED;
+        }
+    }
+
+    if (!(reply = dbus_message_new_method_return(msg)))
+        goto oom;
+
+    if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &server_string, DBUS_TYPE_INVALID))
+        goto fail;
+
+    if (!dbus_connection_send(conn, reply, NULL))
+        goto oom;
+
+    pa_log("Sent reply with server_string '%s'.", server_string);
+
+    pa_xfree(server_string);
+
+    dbus_message_unref(reply);
+
+    return DBUS_HANDLER_RESULT_HANDLED;
+
+fail:
+    if (conf)
+        pa_client_conf_free(conf);
+
+    pa_xfree(server_string);
+
+    if (reply)
+        dbus_message_unref(reply);
+
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+oom:
+    if (conf)
+        pa_client_conf_free(conf);
+
+    pa_xfree(server_string);
+
+    if (reply)
+        dbus_message_unref(reply);
+
+    return DBUS_HANDLER_RESULT_NEED_MEMORY;
+}
+
+static DBusHandlerResult message_cb(DBusConnection *conn, DBusMessage *msg, void *user_data) {
+    pa_dbusobj_server_lookup *sl = user_data;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(sl);
+
+    /* pa_log("Got message! type = %s   path = %s   iface = %s   member = %s   dest = %s", dbus_message_type_to_string(dbus_message_get_type(msg)), dbus_message_get_path(msg), dbus_message_get_interface(msg), dbus_message_get_member(msg), dbus_message_get_destination(msg)); */
+
+    if (dbus_message_is_method_call(msg, "org.freedesktop.DBus.Introspectable", "Introspect"))
+        return handle_introspect(conn, msg, sl);
+
+    if (dbus_message_is_method_call(msg, "org.pulseaudio.ServerLookup", "GetDBusServers"))
+        return handle_get_dbus_servers(conn, msg, sl);
+
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
+static DBusObjectPathVTable vtable = {
+    .unregister_function = unregister_cb,
+    .message_function = message_cb,
+    .dbus_internal_pad1 = NULL,
+    .dbus_internal_pad2 = NULL,
+    .dbus_internal_pad3 = NULL,
+    .dbus_internal_pad4 = NULL
+};
+
+pa_dbusobj_server_lookup *pa_dbusobj_server_lookup_new(pa_core *c, pa_daemon_conf_server_type_t server_type) {
+    pa_dbusobj_server_lookup *sl;
+    DBusError error;
+
+    dbus_error_init(&error);
+
+    sl = pa_xnew(pa_dbusobj_server_lookup, 1);
+    sl->path_registered = FALSE;
+    sl->server_type = server_type;
+
+    if (!(sl->conn = pa_dbus_bus_get(c, DBUS_BUS_SESSION, &error)) || dbus_error_is_set(&error)) {
+        pa_log("Unable to contact D-Bus: %s: %s", error.name, error.message);
+        goto fail;
+    }
+
+    if (!dbus_connection_register_object_path(pa_dbus_connection_get(sl->conn), "/org/pulseaudio/server_lookup", &vtable, sl)) {
+        pa_log("dbus_connection_register_object_path() failed for /org/pulseaudio/server_lookup.");
+        goto fail;
+    }
+
+    sl->path_registered = TRUE;
+
+    return sl;
+
+fail:
+    dbus_error_free(&error);
+
+    pa_dbusobj_server_lookup_free(sl);
+
+    return NULL;
+}
+
+void pa_dbusobj_server_lookup_free(pa_dbusobj_server_lookup *sl) {
+    pa_assert(sl);
+
+    if (sl->path_registered) {
+        pa_assert(sl->conn);
+        if (!dbus_connection_unregister_object_path(pa_dbus_connection_get(sl->conn), "/org/pulseaudio/server_lookup"))
+            pa_log_debug("dbus_connection_unregister_object_path() failed for /org/pulseaudio/server_lookup.");
+    }
+
+    if (sl->conn)
+        pa_dbus_connection_unref(sl->conn);
+
+    pa_xfree(sl);
+}
\ No newline at end of file
diff --git a/src/daemon/server-lookup.h b/src/daemon/server-lookup.h
new file mode 100644
index 0000000..69fdacd
--- /dev/null
+++ b/src/daemon/server-lookup.h
@@ -0,0 +1,42 @@
+#ifndef fooserverlookuphfoo
+#define fooserverlookuphfoo
+
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+/* This object implements the D-Bus object at path
+ * /org/pulseaudio/server_lookup. Implemented interfaces
+ * are org.pulseaudio.ServerLookup and org.freedesktop.DBus.Introspectable.
+ *
+ * See http://pulseaudio.org/wiki/DBusInterface for the ServerLookup interface
+ * documentation.
+ */
+
+#include <pulsecore/core.h>
+
+#include "daemon-conf.h"
+
+typedef struct pa_dbusobj_server_lookup pa_dbusobj_server_lookup;
+
+pa_dbusobj_server_lookup *pa_dbusobj_server_lookup_new(pa_core *c, pa_daemon_conf_server_type_t server_type);
+void pa_dbusobj_server_lookup_free(pa_dbusobj_server_lookup *sl);
+
+#endif
\ No newline at end of file
diff --git a/src/pulse/client-conf.c b/src/pulse/client-conf.c
index 940d0b6..8eab109 100644
--- a/src/pulse/client-conf.c
+++ b/src/pulse/client-conf.c
@@ -57,6 +57,7 @@ static const pa_client_conf default_conf = {
     .default_sink = NULL,
     .default_source = NULL,
     .default_server = NULL,
+    .default_dbus_server = NULL,
     .autospawn = TRUE,
     .disable_shm = FALSE,
     .cookie_file = NULL,
@@ -81,6 +82,7 @@ void pa_client_conf_free(pa_client_conf *c) {
     pa_xfree(c->default_sink);
     pa_xfree(c->default_source);
     pa_xfree(c->default_server);
+    pa_xfree(c->default_dbus_server);
     pa_xfree(c->cookie_file);
     pa_xfree(c);
 }
@@ -97,6 +99,7 @@ int pa_client_conf_load(pa_client_conf *c, const char *filename) {
         { "default-sink",           pa_config_parse_string,  &c->default_sink, NULL },
         { "default-source",         pa_config_parse_string,  &c->default_source, NULL },
         { "default-server",         pa_config_parse_string,  &c->default_server, NULL },
+        { "default-dbus-server",    pa_config_parse_string,  &c->default_dbus_server, NULL },
         { "autospawn",              pa_config_parse_bool,    &c->autospawn, NULL },
         { "cookie-file",            pa_config_parse_string,  &c->cookie_file, NULL },
         { "disable-shm",            pa_config_parse_bool,    &c->disable_shm, NULL },
diff --git a/src/pulse/client-conf.h b/src/pulse/client-conf.h
index ab97dc6..618216f 100644
--- a/src/pulse/client-conf.h
+++ b/src/pulse/client-conf.h
@@ -22,12 +22,13 @@
   USA.
 ***/
 
+#include <pulsecore/macro.h>
 #include <pulsecore/native-common.h>
 
 /* A structure containing configuration data for PulseAudio clients. */
 
 typedef struct pa_client_conf {
-    char *daemon_binary, *extra_arguments, *default_sink, *default_source, *default_server, *cookie_file;
+    char *daemon_binary, *extra_arguments, *default_sink, *default_source, *default_server, *default_dbus_server, *cookie_file;
     pa_bool_t autospawn, disable_shm;
     uint8_t cookie[PA_NATIVE_COOKIE_LENGTH];
     pa_bool_t cookie_valid; /* non-zero, when cookie is valid */
diff --git a/src/pulse/client.conf.in b/src/pulse/client.conf.in
index 579bcc2..3340b0b 100644
--- a/src/pulse/client.conf.in
+++ b/src/pulse/client.conf.in
@@ -22,6 +22,7 @@
 ; default-sink =
 ; default-source =
 ; default-server =
+; default-dbus-server =
 
 ; autospawn = yes
 ; daemon-binary = @PA_BINARY@

commit c8d819a5adbe32e14d7f03a252bca6f7df01d795
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Tue Jun 16 19:03:22 2009 +0300

    dbus-protocol: Connection handling for local connections.

diff --git a/src/Makefile.am b/src/Makefile.am
index c56f760..5302bc2 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -783,6 +783,7 @@ libpulsecore_ at PA_MAJORMINORMICRO@_la_SOURCES = \
 		pulsecore/core-scache.c pulsecore/core-scache.h \
 		pulsecore/core-subscribe.c pulsecore/core-subscribe.h \
 		pulsecore/core.c pulsecore/core.h \
+        pulsecore/dbus-common.c pulsecore/dbus-common.h \
 		pulsecore/envelope.c pulsecore/envelope.h \
 		pulsecore/fdsem.c pulsecore/fdsem.h \
 		pulsecore/g711.c pulsecore/g711.h \
@@ -796,6 +797,7 @@ libpulsecore_ at PA_MAJORMINORMICRO@_la_SOURCES = \
 		pulsecore/object.c pulsecore/object.h \
 		pulsecore/play-memblockq.c pulsecore/play-memblockq.h \
 		pulsecore/play-memchunk.c pulsecore/play-memchunk.h \
+		pulsecore/protocol-dbus.h \
 		pulsecore/resampler.c pulsecore/resampler.h \
 		pulsecore/rtpoll.c pulsecore/rtpoll.h \
 		pulsecore/rtsig.c pulsecore/rtsig.h \
diff --git a/src/daemon/daemon-conf.h b/src/daemon/daemon-conf.h
index 98db864..c4f78cb 100644
--- a/src/daemon/daemon-conf.h
+++ b/src/daemon/daemon-conf.h
@@ -28,6 +28,7 @@
 
 #include <pulsecore/log.h>
 #include <pulsecore/macro.h>
+#include <pulsecore/core.h>
 #include <pulsecore/core-util.h>
 
 #ifdef HAVE_SYS_RESOURCE_H
@@ -48,13 +49,6 @@ typedef enum pa_daemon_conf_cmd {
     PA_CMD_CLEANUP_SHM
 } pa_daemon_conf_cmd_t;
 
-typedef enum pa_daemon_conf_server_type {
-    PA_SERVER_TYPE_UNSET,
-    PA_SERVER_TYPE_USER,
-    PA_SERVER_TYPE_SYSTEM,
-    PA_SERVER_TYPE_NONE
-} pa_daemon_conf_server_type_t;
-
 #ifdef HAVE_SYS_RESOURCE_H
 typedef struct pa_rlimit {
     rlim_t value;
@@ -81,7 +75,7 @@ typedef struct pa_daemon_conf {
         log_meta,
         log_time,
         flat_volumes;
-    pa_daemon_conf_server_type_t local_server_type;
+    pa_server_type_t local_server_type;
     int exit_idle_time,
         scache_idle_time,
         auto_log_target,
diff --git a/src/daemon/main.c b/src/daemon/main.c
index 1b6ed79..62214a5 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -1028,6 +1028,7 @@ after_caps_setup:
     c->running_as_daemon = !!conf->daemonize;
     c->disallow_exit = conf->disallow_exit;
     c->flat_volumes = conf->flat_volumes;
+    c->server_type = conf->local_server_type;
 
     pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
     pa_signal_new(SIGINT, signal_callback, c);
@@ -1105,7 +1106,7 @@ after_caps_setup:
 
 #ifdef HAVE_DBUS
     if (!conf->system_instance) {
-        if (!(server_lookup = pa_dbusobj_server_lookup_new(c, conf->local_server_type)))
+        if (!(server_lookup = pa_dbusobj_server_lookup_new(c)))
             goto finish;
         if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.pulseaudio.PulseAudio")))
             goto finish;
diff --git a/src/daemon/server-lookup.c b/src/daemon/server-lookup.c
index 867c3a1..b53fda7 100644
--- a/src/daemon/server-lookup.c
+++ b/src/daemon/server-lookup.c
@@ -28,16 +28,18 @@
 #include <pulse/client-conf.h>
 #include <pulse/xmalloc.h>
 
+#include <pulsecore/core.h>
 #include <pulsecore/core-util.h>
+#include <pulsecore/dbus-common.h>
 #include <pulsecore/dbus-shared.h>
 #include <pulsecore/macro.h>
 
 #include "server-lookup.h"
 
 struct pa_dbusobj_server_lookup {
+    pa_core *core;
     pa_dbus_connection *conn;
     pa_bool_t path_registered;
-    pa_daemon_conf_server_type_t server_type;
 };
 
 static const char introspection[] =
@@ -46,7 +48,7 @@ static const char introspection[] =
     " <!-- If you are looking for documentation make sure to check out\n"
     "      http://pulseaudio.org/wiki/DBusInterface -->\n"
     " <interface name=\"org.pulseaudio.ServerLookup\">"
-    "  <method name=\"GetDBusServers\">"
+    "  <method name=\"GetDBusAddress\">"
     "   <arg name=\"result\" type=\"s\" direction=\"out\"/>"
     "  </method>"
     " </interface>"
@@ -99,40 +101,10 @@ oom:
     return DBUS_HANDLER_RESULT_NEED_MEMORY;
 }
 
-/* Caller frees the string. */
-static char *get_dbus_server_from_type(pa_daemon_conf_server_type_t server_type) {
-    char *server_string = NULL;
-    char *runtime_dir = NULL;
-
-    switch (server_type) {
-        case PA_SERVER_TYPE_USER:
-            runtime_dir = pa_get_runtime_dir();
-
-            if (!runtime_dir)
-                return NULL;
-
-            server_string = pa_sprintf_malloc("unix:path=%s/dbus_socket", runtime_dir);
-            break;
-
-        case PA_SERVER_TYPE_SYSTEM:
-            server_string = pa_xstrdup("unix:path=/var/run/pulse/dbus_socket");
-            break;
-
-        case PA_SERVER_TYPE_NONE:
-            server_string = pa_xnew0(char, 1);
-            break;
-
-        default:
-            pa_assert_not_reached();
-    }
-
-    return server_string;
-}
-
-static DBusHandlerResult handle_get_dbus_servers(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) {
+static DBusHandlerResult handle_get_dbus_address(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) {
     DBusMessage *reply = NULL;
     pa_client_conf *conf = NULL;
-    char *server_string = NULL;
+    char *address = NULL;
 
     pa_assert(conn);
     pa_assert(msg);
@@ -148,12 +120,13 @@ static DBusHandlerResult handle_get_dbus_servers(DBusConnection *conn, DBusMessa
         return DBUS_HANDLER_RESULT_HANDLED;
     }
 
-    server_string = pa_xstrdup(conf->default_dbus_server);
-
     pa_client_conf_free(conf);
 
-    if (!server_string) {
-        if (!(server_string = get_dbus_server_from_type(sl->server_type))) {
+    if (conf->default_dbus_server) {
+        if (!(address = dbus_address_escape_value(conf->default_dbus_server)))
+            goto oom;
+    } else {
+        if (!(address = pa_get_dbus_address_from_server_type(sl->core->server_type))) {
             if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_FAILED, "get_dbus_server_from_type() failed.")))
                 goto fail;
             if (!dbus_connection_send(conn, reply, NULL))
@@ -165,15 +138,15 @@ static DBusHandlerResult handle_get_dbus_servers(DBusConnection *conn, DBusMessa
     if (!(reply = dbus_message_new_method_return(msg)))
         goto oom;
 
-    if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &server_string, DBUS_TYPE_INVALID))
+    if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &address, DBUS_TYPE_INVALID))
         goto fail;
 
     if (!dbus_connection_send(conn, reply, NULL))
         goto oom;
 
-    pa_log("Sent reply with server_string '%s'.", server_string);
+    pa_log_debug("handle_get_dbus_address(): Sent reply with address '%s'.", address);
 
-    pa_xfree(server_string);
+    pa_xfree(address);
 
     dbus_message_unref(reply);
 
@@ -183,7 +156,7 @@ fail:
     if (conf)
         pa_client_conf_free(conf);
 
-    pa_xfree(server_string);
+    pa_xfree(address);
 
     if (reply)
         dbus_message_unref(reply);
@@ -194,7 +167,7 @@ oom:
     if (conf)
         pa_client_conf_free(conf);
 
-    pa_xfree(server_string);
+    pa_xfree(address);
 
     if (reply)
         dbus_message_unref(reply);
@@ -214,8 +187,8 @@ static DBusHandlerResult message_cb(DBusConnection *conn, DBusMessage *msg, void
     if (dbus_message_is_method_call(msg, "org.freedesktop.DBus.Introspectable", "Introspect"))
         return handle_introspect(conn, msg, sl);
 
-    if (dbus_message_is_method_call(msg, "org.pulseaudio.ServerLookup", "GetDBusServers"))
-        return handle_get_dbus_servers(conn, msg, sl);
+    if (dbus_message_is_method_call(msg, "org.pulseaudio.ServerLookup", "GetDBusAddress"))
+        return handle_get_dbus_address(conn, msg, sl);
 
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
@@ -229,15 +202,15 @@ static DBusObjectPathVTable vtable = {
     .dbus_internal_pad4 = NULL
 };
 
-pa_dbusobj_server_lookup *pa_dbusobj_server_lookup_new(pa_core *c, pa_daemon_conf_server_type_t server_type) {
+pa_dbusobj_server_lookup *pa_dbusobj_server_lookup_new(pa_core *c) {
     pa_dbusobj_server_lookup *sl;
     DBusError error;
 
     dbus_error_init(&error);
 
     sl = pa_xnew(pa_dbusobj_server_lookup, 1);
+    sl->core = c;
     sl->path_registered = FALSE;
-    sl->server_type = server_type;
 
     if (!(sl->conn = pa_dbus_bus_get(c, DBUS_BUS_SESSION, &error)) || dbus_error_is_set(&error)) {
         pa_log("Unable to contact D-Bus: %s: %s", error.name, error.message);
@@ -274,4 +247,4 @@ void pa_dbusobj_server_lookup_free(pa_dbusobj_server_lookup *sl) {
         pa_dbus_connection_unref(sl->conn);
 
     pa_xfree(sl);
-}
\ No newline at end of file
+}
diff --git a/src/daemon/server-lookup.h b/src/daemon/server-lookup.h
index 69fdacd..c930d5b 100644
--- a/src/daemon/server-lookup.h
+++ b/src/daemon/server-lookup.h
@@ -32,11 +32,9 @@
 
 #include <pulsecore/core.h>
 
-#include "daemon-conf.h"
-
 typedef struct pa_dbusobj_server_lookup pa_dbusobj_server_lookup;
 
-pa_dbusobj_server_lookup *pa_dbusobj_server_lookup_new(pa_core *c, pa_daemon_conf_server_type_t server_type);
+pa_dbusobj_server_lookup *pa_dbusobj_server_lookup_new(pa_core *c);
 void pa_dbusobj_server_lookup_free(pa_dbusobj_server_lookup *sl);
 
-#endif
\ No newline at end of file
+#endif
diff --git a/src/modules/module-dbus-protocol.c b/src/modules/module-dbus-protocol.c
index 077f417..1455148 100644
--- a/src/modules/module-dbus-protocol.c
+++ b/src/modules/module-dbus-protocol.c
@@ -2,6 +2,8 @@
   This file is part of PulseAudio.
 
   Copyright 2009 Tanu Kaskinen
+  Copyright 2006 Lennart Poettering
+  Copyright 2006 Shams E. King
 
   PulseAudio is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as published
@@ -23,37 +25,487 @@
 #include <config.h>
 #endif
 
+#include <dbus/dbus.h>
+
+#include <pulse/mainloop-api.h>
+#include <pulse/timeval.h>
 #include <pulse/xmalloc.h>
 
+#include <pulsecore/client.h>
+#include <pulsecore/core-util.h>
+#include <pulsecore/dbus-common.h>
+#include <pulsecore/dbus-util.h>
+#include <pulsecore/idxset.h>
 #include <pulsecore/macro.h>
+#include <pulsecore/modargs.h>
 #include <pulsecore/module.h>
 
 #include "module-dbus-protocol-symdef.h"
 
 PA_MODULE_DESCRIPTION("D-Bus interface");
-PA_MODULE_USAGE("<no module arguments>");
+PA_MODULE_USAGE(
+        "access=local|remote|local,remote "
+        "tcp_port=<port number>");
 PA_MODULE_LOAD_ONCE(TRUE);
 PA_MODULE_AUTHOR("Tanu Kaskinen");
 PA_MODULE_VERSION(PACKAGE_VERSION);
 
+#define CLEANUP_INTERVAL 10 /* seconds */
+
+struct server;
+struct connection;
+
 struct userdata {
     pa_module *module;
+    pa_bool_t local_access;
+    pa_bool_t remote_access;
+    uint32_t tcp_port;
+
+    struct server *local_server;
+    struct server *tcp_server;
+
+    pa_idxset *connections;
+
+    pa_time_event *cleanup_event;
+};
+
+struct server {
+    struct userdata *userdata;
+    DBusServer *dbus_server;
+};
+
+struct connection {
+    struct server *server;
+    pa_dbus_wrap_connection *wrap_conn;
+    pa_client *client;
+};
+
+static const char* const valid_modargs[] = {
+    "access",
+    "tcp_port",
+    NULL
 };
 
+static void connection_free(struct connection *c) {
+    pa_assert(c);
+
+    pa_client_free(c->client);
+    pa_assert_se(pa_idxset_remove_by_data(c->server->userdata->connections, c, NULL));
+    pa_dbus_wrap_connection_free(c->wrap_conn);
+    pa_xfree(c);
+}
+
+static void client_kill_cb(pa_client *c) {
+    struct connection *conn;
+
+    pa_assert(c);
+    pa_assert(c->userdata);
+
+    conn = c->userdata;
+    connection_free(conn);
+
+    pa_log_info("Connection killed.");
+}
+
+/* Called by D-Bus when a new client connection is received. */
+static void connection_new_cb(DBusServer *dbus_server, DBusConnection *new_connection, void *data) {
+    struct server *s = data;
+    struct connection *c;
+    pa_client_new_data new_data;
+    pa_client *client;
+
+    pa_assert(new_connection);
+    pa_assert(s);
+
+    pa_client_new_data_init(&new_data);
+    new_data.module = s->userdata->module;
+    new_data.driver = __FILE__;
+    pa_proplist_sets(new_data.proplist, PA_PROP_APPLICATION_NAME, "D-Bus client"); /* TODO: Fancier name. */
+    client = pa_client_new(s->userdata->module->core, &new_data);
+    pa_client_new_data_done(&new_data);
+
+    if (!client)
+        return;
+
+    c = pa_xnew(struct connection, 1);
+    c->server = s;
+    c->wrap_conn = pa_dbus_wrap_connection_new_from_existing(s->userdata->module->core->mainloop, new_connection);
+    c->client = client;
+
+    c->client->kill = client_kill_cb;
+    c->client->send_event = NULL;
+    c->client->userdata = c;
+
+    pa_idxset_put(s->userdata->connections, c, NULL);
+}
+
+/* Called by PA mainloop when a D-Bus fd watch event needs handling. */
+static void io_event_cb(pa_mainloop_api *mainloop, pa_io_event *e, int fd, pa_io_event_flags_t events, void *userdata) {
+    unsigned int flags = 0;
+    DBusWatch *watch = userdata;
+
+#if HAVE_DBUS_WATCH_GET_UNIX_FD
+    pa_assert(fd == dbus_watch_get_unix_fd(watch));
+#else
+    pa_assert(fd == dbus_watch_get_fd(watch));
+#endif
+
+    if (!dbus_watch_get_enabled(watch)) {
+        pa_log_warn("Asked to handle disabled watch: %p %i", (void*) watch, fd);
+        return;
+    }
+
+    if (events & PA_IO_EVENT_INPUT)
+        flags |= DBUS_WATCH_READABLE;
+    if (events & PA_IO_EVENT_OUTPUT)
+        flags |= DBUS_WATCH_WRITABLE;
+    if (events & PA_IO_EVENT_HANGUP)
+        flags |= DBUS_WATCH_HANGUP;
+    if (events & PA_IO_EVENT_ERROR)
+        flags |= DBUS_WATCH_ERROR;
+
+    dbus_watch_handle(watch, flags);
+}
+
+/* Called by PA mainloop when a D-Bus timer event needs handling. */
+static void time_event_cb(pa_mainloop_api *mainloop, pa_time_event* e, const struct timeval *tv, void *userdata) {
+    DBusTimeout *timeout = userdata;
+
+    if (dbus_timeout_get_enabled(timeout)) {
+        struct timeval next = *tv;
+        dbus_timeout_handle(timeout);
+
+        /* restart it for the next scheduled time */
+        pa_timeval_add(&next, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000);
+        mainloop->time_restart(e, &next);
+    }
+}
+
+/* Translates D-Bus fd watch event flags to PA IO event flags. */
+static pa_io_event_flags_t get_watch_flags(DBusWatch *watch) {
+    unsigned int flags;
+    pa_io_event_flags_t events = 0;
+
+    pa_assert(watch);
+
+    flags = dbus_watch_get_flags(watch);
+
+    /* no watch flags for disabled watches */
+    if (!dbus_watch_get_enabled(watch))
+        return PA_IO_EVENT_NULL;
+
+    if (flags & DBUS_WATCH_READABLE)
+        events |= PA_IO_EVENT_INPUT;
+    if (flags & DBUS_WATCH_WRITABLE)
+        events |= PA_IO_EVENT_OUTPUT;
+
+    return events | PA_IO_EVENT_HANGUP | PA_IO_EVENT_ERROR;
+}
+
+/* Called by D-Bus when a D-Bus fd watch event is added. */
+static dbus_bool_t watch_add_cb(DBusWatch *watch, void *data) {
+    struct server *s = data;
+    pa_mainloop_api *mainloop;
+    pa_io_event *ev;
+
+    pa_assert(watch);
+    pa_assert(s);
+
+    mainloop = s->userdata->module->core->mainloop;
+
+    ev = mainloop->io_new(
+            mainloop,
+#if HAVE_DBUS_WATCH_GET_UNIX_FD
+            dbus_watch_get_unix_fd(watch),
+#else
+            dbus_watch_get_fd(watch),
+#endif
+            get_watch_flags(watch), io_event_cb, watch);
+
+    dbus_watch_set_data(watch, ev, NULL);
+
+    return TRUE;
+}
+
+/* Called by D-Bus when a D-Bus fd watch event is removed. */
+static void watch_remove_cb(DBusWatch *watch, void *data) {
+    struct server *s = data;
+    pa_io_event *ev;
+
+    pa_assert(watch);
+    pa_assert(s);
+
+    if ((ev = dbus_watch_get_data(watch)))
+        s->userdata->module->core->mainloop->io_free(ev);
+}
+
+/* Called by D-Bus when a D-Bus fd watch event is toggled. */
+static void watch_toggled_cb(DBusWatch *watch, void *data) {
+    struct server *s = data;
+    pa_io_event *ev;
+
+    pa_assert(watch);
+    pa_assert(s);
+
+    pa_assert_se(ev = dbus_watch_get_data(watch));
+
+    /* get_watch_flags() checks if the watch is enabled */
+    s->userdata->module->core->mainloop->io_enable(ev, get_watch_flags(watch));
+}
+
+/* Called by D-Bus when a D-Bus timer event is added. */
+static dbus_bool_t timeout_add_cb(DBusTimeout *timeout, void *data) {
+    struct server *s = data;
+    pa_mainloop_api *mainloop;
+    pa_time_event *ev;
+    struct timeval tv;
+
+    pa_assert(timeout);
+    pa_assert(s);
+
+    if (!dbus_timeout_get_enabled(timeout))
+        return FALSE;
+
+    mainloop = s->userdata->module->core->mainloop;
+
+    pa_gettimeofday(&tv);
+    pa_timeval_add(&tv, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000);
+
+    ev = mainloop->time_new(mainloop, &tv, time_event_cb, timeout);
+
+    dbus_timeout_set_data(timeout, ev, NULL);
+
+    return TRUE;
+}
+
+/* Called by D-Bus when a D-Bus timer event is removed. */
+static void timeout_remove_cb(DBusTimeout *timeout, void *data) {
+    struct server *s = data;
+    pa_time_event *ev;
+
+    pa_assert(timeout);
+    pa_assert(s);
+
+    if ((ev = dbus_timeout_get_data(timeout)))
+        s->userdata->module->core->mainloop->time_free(ev);
+}
+
+/* Called by D-Bus when a D-Bus timer event is toggled. */
+static void timeout_toggled_cb(DBusTimeout *timeout, void *data) {
+    struct server *s = data;
+    pa_mainloop_api *mainloop;
+    pa_time_event *ev;
+
+    pa_assert(timeout);
+    pa_assert(s);
+
+    mainloop = s->userdata->module->core->mainloop;
+
+    pa_assert_se(ev = dbus_timeout_get_data(timeout));
+
+    if (dbus_timeout_get_enabled(timeout)) {
+        struct timeval tv;
+
+        pa_gettimeofday(&tv);
+        pa_timeval_add(&tv, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000);
+
+        mainloop->time_restart(ev, &tv);
+    } else
+        mainloop->time_restart(ev, NULL);
+}
+
+static void server_free(struct server *s) {
+    pa_assert(s);
+
+    if (s->dbus_server) {
+        dbus_server_disconnect(s->dbus_server);
+        dbus_server_unref(s->dbus_server);
+    }
+
+    pa_xfree(s);
+}
+
+static struct server *start_server(struct userdata *u, const char *address) {
+    /* XXX: We assume that when we unref the DBusServer instance at module
+     * shutdown, nobody else holds any references to it. If we stop assuming
+     * that someday, dbus_server_set_new_connection_function,
+     * dbus_server_set_watch_functions and dbus_server_set_timeout_functions
+     * calls should probably register free callbacks, instead of providing NULL
+     * as they do now. */
+
+    struct server *s = NULL;
+    DBusError error;
+
+    pa_assert(u);
+    pa_assert(address);
+
+    dbus_error_init(&error);
+
+    s = pa_xnew0(struct server, 1);
+    s->userdata = u;
+    s->dbus_server = dbus_server_listen(address, &error);
+
+    if (dbus_error_is_set(&error)) {
+        pa_log("dbus_server_listen() failed: %s: %s", error.name, error.message);
+        goto fail;
+    }
+
+    dbus_server_set_new_connection_function(s->dbus_server, connection_new_cb, s, NULL);
+
+    if (!dbus_server_set_watch_functions(s->dbus_server, watch_add_cb, watch_remove_cb, watch_toggled_cb, s, NULL)) {
+        pa_log("dbus_server_set_watch_functions() ran out of memory.");
+        goto fail;
+    }
+
+    if (!dbus_server_set_timeout_functions(s->dbus_server, timeout_add_cb, timeout_remove_cb, timeout_toggled_cb, s, NULL)) {
+        pa_log("dbus_server_set_timeout_functions() ran out of memory.");
+        goto fail;
+    }
+
+    return s;
+
+fail:
+    if (s)
+        server_free(s);
+
+    dbus_error_free(&error);
+
+    return NULL;
+}
+
+static struct server *start_local_server(struct userdata *u) {
+    struct server *s = NULL;
+    char *address = NULL;
+
+    pa_assert(u);
+
+    address = pa_get_dbus_address_from_server_type(u->module->core->server_type);
+
+    s = start_server(u, address); /* May return NULL */
+
+    pa_xfree(address);
+
+    return s;
+}
+
+static struct server *start_tcp_server(struct userdata *u) {
+    pa_log("start_tcp_server(): Not implemented!");
+    return NULL;
+}
+
+static int get_access_arg(pa_modargs *ma, pa_bool_t *local_access, pa_bool_t *remote_access) {
+    const char *value = NULL;
+
+    pa_assert(ma);
+    pa_assert(local_access);
+    pa_assert(remote_access);
+
+    if (!(value = pa_modargs_get_value(ma, "access", NULL)))
+        return 0;
+
+    if (!strcmp(value, "local")) {
+        *local_access = TRUE;
+        *remote_access = FALSE;
+    } else if (!strcmp(value, "remote")) {
+        *local_access = FALSE;
+        *remote_access = TRUE;
+    } else if (!strcmp(value, "local,remote")) {
+        *local_access = TRUE;
+        *local_access = TRUE;
+    } else
+        return -1;
+
+    return 0;
+}
+
+/* Frees dead client connections. Called every CLEANUP_INTERVAL seconds. */
+static void cleanup_cb(pa_mainloop_api *a, pa_time_event *e, const struct timeval *tv, void *userdata) {
+    struct userdata *u = userdata;
+    struct connection *conn = NULL;
+    uint32_t idx;
+    struct timeval cleanup_timeval;
+    unsigned free_count = 0;
+
+    for (conn = pa_idxset_first(u->connections, &idx); conn; conn = pa_idxset_next(u->connections, &idx)) {
+        if (!dbus_connection_get_is_connected(pa_dbus_wrap_connection_get(conn->wrap_conn))) {
+            connection_free(conn);
+            ++free_count;
+        }
+    }
+
+    if (free_count > 0)
+        pa_log_debug("Freed %u dead D-Bus client connections.", free_count);
+
+    pa_gettimeofday(&cleanup_timeval);
+    cleanup_timeval.tv_sec += CLEANUP_INTERVAL;
+    u->module->core->mainloop->time_restart(e, &cleanup_timeval);
+}
+
 int pa__init(pa_module *m) {
     struct userdata *u = NULL;
+    pa_modargs *ma = NULL;
+    struct timeval cleanup_timeval;
 
     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;
+    u->local_access = TRUE;
+    u->remote_access = FALSE;
+    u->tcp_port = PA_DBUS_DEFAULT_PORT;
+
+    if (get_access_arg(ma, &u->local_access, &u->remote_access) < 0) {
+        pa_log("Invalid access argument: '%s'", pa_modargs_get_value(ma, "access", NULL));
+        goto fail;
+    }
+
+    if (pa_modargs_get_value_u32(ma, "tcp_port", &u->tcp_port) < 0 || u->tcp_port < 1 || u->tcp_port > 49150) {
+        pa_log("Invalid tcp_port argument: '%s'", pa_modargs_get_value(ma, "tcp_port", NULL));
+        goto fail;
+    }
+
+    if (u->local_access && !(u->local_server = start_local_server(u))) {
+        pa_log("Starting the local D-Bus server failed.");
+        goto fail;
+    }
+
+    if (u->remote_access && !(u->tcp_server = start_tcp_server(u))) {
+        pa_log("Starting the D-Bus server for remote connections failed.");
+        goto fail;
+    }
 
-    pa_log_notice("Hello, world!");
+    u->connections = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+
+    pa_gettimeofday(&cleanup_timeval);
+    cleanup_timeval.tv_sec += CLEANUP_INTERVAL;
+    u->cleanup_event = m->core->mainloop->time_new(m->core->mainloop, &cleanup_timeval, cleanup_cb, u);
 
     return 0;
+
+fail:
+    if (ma)
+        pa_modargs_free(ma);
+
+    pa__done(m);
+
+    return -1;
 }
 
-void pa__done(pa_module*m) {
+/* Called by idxset when the connection set is freed. */
+static void connection_free_cb(void *p, void *userdata) {
+    struct connection *conn = p;
+
+    pa_assert(conn);
+
+    connection_free(conn);
+}
+
+void pa__done(pa_module *m) {
     struct userdata *u;
 
     pa_assert(m);
@@ -61,6 +513,18 @@ void pa__done(pa_module*m) {
     if (!(u = m->userdata))
         return;
 
+    if (u->cleanup_event)
+        m->core->mainloop->time_free(u->cleanup_event);
+
+    if (u->connections)
+        pa_idxset_free(u->connections, connection_free_cb, NULL);
+
+    if (u->tcp_server)
+        server_free(u->tcp_server);
+
+    if (u->local_server)
+        server_free(u->local_server);
+
     pa_xfree(u);
     m->userdata = NULL;
 }
diff --git a/src/pulsecore/core.h b/src/pulsecore/core.h
index c679444..f93652e 100644
--- a/src/pulsecore/core.h
+++ b/src/pulsecore/core.h
@@ -42,6 +42,13 @@ typedef struct pa_core pa_core;
 #include <pulsecore/sink-input.h>
 #include <pulsecore/msgobject.h>
 
+typedef enum pa_server_type {
+    PA_SERVER_TYPE_UNSET,
+    PA_SERVER_TYPE_USER,
+    PA_SERVER_TYPE_SYSTEM,
+    PA_SERVER_TYPE_NONE
+} pa_server_type_t;
+
 typedef enum pa_core_state {
     PA_CORE_STARTUP,
     PA_CORE_RUNNING,
@@ -152,6 +159,8 @@ struct pa_core {
     pa_resample_method_t resample_method;
     int realtime_priority;
 
+    pa_server_type_t server_type;
+
     /* hooks */
     pa_hook hooks[PA_CORE_HOOK_MAX];
 };
diff --git a/src/pulsecore/dbus-common.c b/src/pulsecore/dbus-common.c
new file mode 100644
index 0000000..05931e0
--- /dev/null
+++ b/src/pulsecore/dbus-common.c
@@ -0,0 +1,73 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <dbus/dbus.h>
+
+#include <pulsecore/core-util.h>
+
+#include "dbus-common.h"
+
+char *pa_get_dbus_address_from_server_type(pa_server_type_t server_type) {
+    char *address = NULL;
+    char *runtime_path = NULL;
+    char *escaped_path = NULL;
+
+    switch (server_type) {
+        case PA_SERVER_TYPE_USER:
+            if (!(runtime_path = pa_runtime_path(PA_DBUS_SOCKET_NAME))) {
+                pa_log("pa_runtime_path() failed.");
+                break;
+            }
+
+            if (!(escaped_path = dbus_address_escape_value(runtime_path))) {
+                pa_log("dbus_address_escape_value() failed.");
+                break;
+            }
+
+            address = pa_sprintf_malloc("unix:path=%s", escaped_path);
+            break;
+
+        case PA_SERVER_TYPE_SYSTEM:
+            if (!(escaped_path = dbus_address_escape_value(PA_DBUS_SYSTEM_SOCKET_PATH))) {
+                pa_log("dbus_address_escape_value() failed.");
+                break;
+            }
+
+            address = pa_sprintf_malloc("unix:path=%s", escaped_path);
+            break;
+
+        case PA_SERVER_TYPE_NONE:
+            address = pa_xnew0(char, 1);
+            break;
+
+        default:
+            pa_assert_not_reached();
+    }
+
+    pa_xfree(runtime_path);
+    pa_xfree(escaped_path);
+
+    return address;
+}
diff --git a/src/daemon/server-lookup.h b/src/pulsecore/dbus-common.h
similarity index 57%
copy from src/daemon/server-lookup.h
copy to src/pulsecore/dbus-common.h
index 69fdacd..26bd05d 100644
--- a/src/daemon/server-lookup.h
+++ b/src/pulsecore/dbus-common.h
@@ -1,5 +1,5 @@
-#ifndef fooserverlookuphfoo
-#define fooserverlookuphfoo
+#ifndef foodbuscommonhfoo
+#define foodbuscommonhfoo
 
 /***
   This file is part of PulseAudio.
@@ -22,21 +22,18 @@
   USA.
 ***/
 
-/* This object implements the D-Bus object at path
- * /org/pulseaudio/server_lookup. Implemented interfaces
- * are org.pulseaudio.ServerLookup and org.freedesktop.DBus.Introspectable.
- *
- * See http://pulseaudio.org/wiki/DBusInterface for the ServerLookup interface
- * documentation.
- */
-
 #include <pulsecore/core.h>
+#include <pulsecore/macro.h>
 
-#include "daemon-conf.h"
+#define PA_DBUS_DEFAULT_PORT 24883
+#define PA_DBUS_SOCKET_NAME "dbus_socket"
 
-typedef struct pa_dbusobj_server_lookup pa_dbusobj_server_lookup;
+#define PA_DBUS_SYSTEM_SOCKET_PATH PA_SYSTEM_RUNTIME_PATH PA_PATH_SEP PA_DBUS_SOCKET_NAME
 
-pa_dbusobj_server_lookup *pa_dbusobj_server_lookup_new(pa_core *c, pa_daemon_conf_server_type_t server_type);
-void pa_dbusobj_server_lookup_free(pa_dbusobj_server_lookup *sl);
+/* Returns the default address of the server type in the escaped form. For
+ * PA_SERVER_TYPE_NONE an empty string is returned. The caller frees the
+ * string. This function may fail in some rare cases, in which case NULL is
+ * returned. */
+char *pa_get_dbus_address_from_server_type(pa_server_type_t server_type);
 
-#endif
\ No newline at end of file
+#endif
diff --git a/src/pulsecore/dbus-util.c b/src/pulsecore/dbus-util.c
index ece36de..d8bd0e0 100644
--- a/src/pulsecore/dbus-util.c
+++ b/src/pulsecore/dbus-util.c
@@ -276,6 +276,27 @@ pa_dbus_wrap_connection* pa_dbus_wrap_connection_new(pa_mainloop_api *m, DBusBus
     return pconn;
 }
 
+pa_dbus_wrap_connection* pa_dbus_wrap_connection_new_from_existing(pa_mainloop_api *m, DBusConnection *conn) {
+    pa_dbus_wrap_connection *pconn;
+
+    pa_assert(m);
+    pa_assert(conn);
+
+    pconn = pa_xnew(pa_dbus_wrap_connection, 1);
+    pconn->mainloop = m;
+    pconn->connection = dbus_connection_ref(conn);
+
+    dbus_connection_set_exit_on_disconnect(conn, FALSE);
+    dbus_connection_set_dispatch_status_function(conn, dispatch_status, pconn, NULL);
+    dbus_connection_set_watch_functions(conn, add_watch, remove_watch, toggle_watch, pconn, NULL);
+    dbus_connection_set_timeout_functions(conn, add_timeout, remove_timeout, toggle_timeout, pconn, NULL);
+    dbus_connection_set_wakeup_main_function(conn, wakeup_main, pconn, NULL);
+
+    pconn->dispatch_event = pconn->mainloop->defer_new(pconn->mainloop, dispatch_cb, conn);
+
+    return pconn;
+}
+
 void pa_dbus_wrap_connection_free(pa_dbus_wrap_connection* c) {
     pa_assert(c);
 
diff --git a/src/pulsecore/dbus-util.h b/src/pulsecore/dbus-util.h
index 55cda7a..cd08485 100644
--- a/src/pulsecore/dbus-util.h
+++ b/src/pulsecore/dbus-util.h
@@ -31,6 +31,7 @@
 typedef struct pa_dbus_wrap_connection pa_dbus_wrap_connection;
 
 pa_dbus_wrap_connection* pa_dbus_wrap_connection_new(pa_mainloop_api *mainloop, DBusBusType type, DBusError *error);
+pa_dbus_wrap_connection* pa_dbus_wrap_connection_new_from_existing(pa_mainloop_api *mainloop, DBusConnection *conn);
 void pa_dbus_wrap_connection_free(pa_dbus_wrap_connection* conn);
 
 DBusConnection* pa_dbus_wrap_connection_get(pa_dbus_wrap_connection *conn);

commit 123c6a3c6ffc9903c0855e38445fc3b6588311ce
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Fri Jun 19 10:28:08 2009 +0300

    dbus-common: Implement infrastructure for registering D-Bus objects on all
    client connections and for receiving method calls from clients.

diff --git a/src/Makefile.am b/src/Makefile.am
index 5302bc2..d28ffa1 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -783,7 +783,6 @@ libpulsecore_ at PA_MAJORMINORMICRO@_la_SOURCES = \
 		pulsecore/core-scache.c pulsecore/core-scache.h \
 		pulsecore/core-subscribe.c pulsecore/core-subscribe.h \
 		pulsecore/core.c pulsecore/core.h \
-        pulsecore/dbus-common.c pulsecore/dbus-common.h \
 		pulsecore/envelope.c pulsecore/envelope.h \
 		pulsecore/fdsem.c pulsecore/fdsem.h \
 		pulsecore/g711.c pulsecore/g711.h \
@@ -830,7 +829,9 @@ libpulsecore_ at PA_MAJORMINORMICRO@_la_LDFLAGS += $(X11_LIBS)
 endif
 
 if HAVE_DBUS
-libpulsecore_ at PA_MAJORMINORMICRO@_la_SOURCES += pulsecore/dbus-shared.c pulsecore/dbus-shared.h
+libpulsecore_ at PA_MAJORMINORMICRO@_la_SOURCES += \
+		pulsecore/dbus-shared.c pulsecore/dbus-shared.h \
+		pulsecore/dbus-common.c pulsecore/dbus-common.h
 libpulsecore_ at PA_MAJORMINORMICRO@_la_CFLAGS += $(DBUS_CFLAGS)
 libpulsecore_ at PA_MAJORMINORMICRO@_la_LIBADD += $(DBUS_LIBS)
 endif
@@ -1220,7 +1221,9 @@ module_http_protocol_unix_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINORMI
 
 # D-Bus protocol
 
-module_dbus_protocol_la_SOURCES = modules/module-dbus-protocol.c
+module_dbus_protocol_la_SOURCES = \
+		pulsecore/dbus-objs/core.c pulsecore/dbus-objs/core.h \
+		modules/module-dbus-protocol.c
 module_dbus_protocol_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS)
 module_dbus_protocol_la_LDFLAGS = $(MODULE_LDFLAGS)
 module_dbus_protocol_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
diff --git a/src/daemon/server-lookup.c b/src/daemon/server-lookup.c
index b53fda7..2d2d8ce 100644
--- a/src/daemon/server-lookup.c
+++ b/src/daemon/server-lookup.c
@@ -48,7 +48,7 @@ static const char introspection[] =
     " <!-- If you are looking for documentation make sure to check out\n"
     "      http://pulseaudio.org/wiki/DBusInterface -->\n"
     " <interface name=\"org.pulseaudio.ServerLookup\">"
-    "  <method name=\"GetDBusAddress\">"
+    "  <method name=\"GetAddress\">"
     "   <arg name=\"result\" type=\"s\" direction=\"out\"/>"
     "  </method>"
     " </interface>"
@@ -101,7 +101,7 @@ oom:
     return DBUS_HANDLER_RESULT_NEED_MEMORY;
 }
 
-static DBusHandlerResult handle_get_dbus_address(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) {
+static DBusHandlerResult handle_get_address(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) {
     DBusMessage *reply = NULL;
     pa_client_conf *conf = NULL;
     char *address = NULL;
@@ -187,8 +187,8 @@ static DBusHandlerResult message_cb(DBusConnection *conn, DBusMessage *msg, void
     if (dbus_message_is_method_call(msg, "org.freedesktop.DBus.Introspectable", "Introspect"))
         return handle_introspect(conn, msg, sl);
 
-    if (dbus_message_is_method_call(msg, "org.pulseaudio.ServerLookup", "GetDBusAddress"))
-        return handle_get_dbus_address(conn, msg, sl);
+    if (dbus_message_is_method_call(msg, "org.pulseaudio.ServerLookup", "GetAddress"))
+        return handle_get_address(conn, msg, sl);
 
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
diff --git a/src/modules/module-dbus-protocol.c b/src/modules/module-dbus-protocol.c
index 1455148..74dfeef 100644
--- a/src/modules/module-dbus-protocol.c
+++ b/src/modules/module-dbus-protocol.c
@@ -40,6 +40,8 @@
 #include <pulsecore/modargs.h>
 #include <pulsecore/module.h>
 
+#include <pulsecore/dbus-objs/core.h>
+
 #include "module-dbus-protocol-symdef.h"
 
 PA_MODULE_DESCRIPTION("D-Bus interface");
@@ -67,6 +69,8 @@ struct userdata {
     pa_idxset *connections;
 
     pa_time_event *cleanup_event;
+
+    pa_dbusobj_core *core_object;
 };
 
 struct server {
@@ -89,12 +93,15 @@ static const char* const valid_modargs[] = {
 static void connection_free(struct connection *c) {
     pa_assert(c);
 
+    pa_assert_se(pa_dbus_unregister_connection(c->server->userdata->module->core, pa_dbus_wrap_connection_get(c->wrap_conn)) >= 0);
+
     pa_client_free(c->client);
     pa_assert_se(pa_idxset_remove_by_data(c->server->userdata->connections, c, NULL));
     pa_dbus_wrap_connection_free(c->wrap_conn);
     pa_xfree(c);
 }
 
+/* Called from pa_client_kill(). */
 static void client_kill_cb(pa_client *c) {
     struct connection *conn;
 
@@ -120,7 +127,7 @@ static void connection_new_cb(DBusServer *dbus_server, DBusConnection *new_conne
     pa_client_new_data_init(&new_data);
     new_data.module = s->userdata->module;
     new_data.driver = __FILE__;
-    pa_proplist_sets(new_data.proplist, PA_PROP_APPLICATION_NAME, "D-Bus client"); /* TODO: Fancier name. */
+    pa_proplist_sets(new_data.proplist, PA_PROP_APPLICATION_NAME, "D-Bus client"); /* TODO: It's probably possible to generate a fancier name. Other props? */
     client = pa_client_new(s->userdata->module->core, &new_data);
     pa_client_new_data_done(&new_data);
 
@@ -133,10 +140,12 @@ static void connection_new_cb(DBusServer *dbus_server, DBusConnection *new_conne
     c->client = client;
 
     c->client->kill = client_kill_cb;
-    c->client->send_event = NULL;
+    c->client->send_event = NULL; /* TODO: Implement this. */
     c->client->userdata = c;
 
     pa_idxset_put(s->userdata->connections, c, NULL);
+
+    pa_assert_se(pa_dbus_register_connection(s->userdata->module->core, new_connection) >= 0);
 }
 
 /* Called by PA mainloop when a D-Bus fd watch event needs handling. */
@@ -485,6 +494,8 @@ int pa__init(pa_module *m) {
     cleanup_timeval.tv_sec += CLEANUP_INTERVAL;
     u->cleanup_event = m->core->mainloop->time_new(m->core->mainloop, &cleanup_timeval, cleanup_cb, u);
 
+    u->core_object = pa_dbusobj_core_new(m->core);
+
     return 0;
 
 fail:
@@ -513,6 +524,9 @@ void pa__done(pa_module *m) {
     if (!(u = m->userdata))
         return;
 
+    if (u->core_object)
+        pa_dbusobj_core_free(u->core_object);
+
     if (u->cleanup_event)
         m->core->mainloop->time_free(u->cleanup_event);
 
diff --git a/src/pulsecore/dbus-common.c b/src/pulsecore/dbus-common.c
index 05931e0..350add8 100644
--- a/src/pulsecore/dbus-common.c
+++ b/src/pulsecore/dbus-common.c
@@ -25,10 +25,35 @@
 
 #include <dbus/dbus.h>
 
+#include <pulse/xmalloc.h>
+
 #include <pulsecore/core-util.h>
+#include <pulsecore/hashmap.h>
+#include <pulsecore/idxset.h>
+#include <pulsecore/strbuf.h>
 
 #include "dbus-common.h"
 
+struct dbus_state {
+    pa_core *core;
+    pa_hashmap *objects; /* Object path -> struct object_entry */
+    pa_idxset *connections; /* DBusConnections */
+};
+
+struct object_entry {
+    char *path;
+    pa_hashmap *interfaces; /* Interface name -> struct interface_entry */
+    char *introspection;
+};
+
+struct interface_entry {
+    char *name;
+    char **methods;
+    char *introspection_snippet;
+    DBusObjectPathMessageFunction receive;
+    void *userdata;
+};
+
 char *pa_get_dbus_address_from_server_type(pa_server_type_t server_type) {
     char *address = NULL;
     char *runtime_path = NULL;
@@ -71,3 +96,408 @@ char *pa_get_dbus_address_from_server_type(pa_server_type_t server_type) {
 
     return address;
 }
+
+static void update_introspection(struct object_entry *oe) {
+    pa_strbuf *buf;
+    void *state = NULL;
+    struct interface_entry *iface_entry = NULL;
+
+    pa_assert(oe);
+
+    buf = pa_strbuf_new();
+    pa_strbuf_puts(buf, DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE);
+    pa_strbuf_puts(buf, "<node>");
+
+    while ((iface_entry = pa_hashmap_iterate(oe->interfaces, &state, NULL)))
+        pa_strbuf_puts(buf, iface_entry->introspection_snippet);
+
+    pa_strbuf_puts(buf, " <interface name=\"org.freedesktop.DBus.Introspectable\">"
+                        "  <method name=\"Introspect\">"
+                        "   <arg name=\"data\" type=\"s\" direction=\"out\"/>"
+                        "  </method>"
+                        " </interface>");
+
+    pa_strbuf_puts(buf, "</node>");
+
+    pa_xfree(oe->introspection);
+    oe->introspection = pa_strbuf_tostring_free(buf);
+}
+
+static struct interface_entry *find_interface(struct object_entry *obj_entry, DBusMessage *msg) {
+    const char *interface;
+    struct interface_entry *iface_entry;
+    void *state = NULL;
+
+    pa_assert(obj_entry);
+    pa_assert(msg);
+
+    if ((interface = dbus_message_get_interface(msg)))
+        return pa_hashmap_get(obj_entry->interfaces, interface);
+
+    /* NULL interface, we'll have to search for an interface that contains the
+     * method. */
+
+    while ((iface_entry = pa_hashmap_iterate(obj_entry->interfaces, &state, NULL))) {
+        char *method;
+        char **pos = iface_entry->methods;
+
+        while ((method = *pos++)) {
+            if (!strcmp(dbus_message_get_member(msg), method))
+                return iface_entry;
+        }
+    }
+
+    return NULL;
+}
+
+static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessage *message, void *user_data) {
+    struct dbus_state *dbus_state = user_data;
+    struct object_entry *obj_entry;
+    struct interface_entry *iface_entry;
+    DBusMessage *reply = NULL;
+
+    pa_assert(connection);
+    pa_assert(message);
+    pa_assert(dbus_state);
+    pa_assert(dbus_state->objects);
+
+    if (dbus_message_get_type(message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
+        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+    pa_assert_se((obj_entry = pa_hashmap_get(dbus_state->objects, dbus_message_get_path(message))));
+
+    if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Introspectable", "Introspect")) {
+        if (!(reply = dbus_message_new_method_return(message)))
+            goto oom;
+
+        if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &obj_entry->introspection, DBUS_TYPE_INVALID))
+            goto fail;
+
+        if (!dbus_connection_send(connection, reply, NULL))
+            goto oom;
+
+        pa_log_debug("%s.%s handled.", obj_entry->path, "Introspect");
+
+        dbus_message_unref(reply);
+
+        return DBUS_HANDLER_RESULT_HANDLED;
+    }
+
+    if (!(iface_entry = find_interface(obj_entry, message)))
+        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+    return iface_entry->receive(connection, message, iface_entry->userdata);
+
+fail:
+    if (reply)
+        dbus_message_unref(reply);
+
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+oom:
+    if (reply)
+        dbus_message_unref(reply);
+
+    return DBUS_HANDLER_RESULT_NEED_MEMORY;
+}
+
+static DBusObjectPathVTable vtable = {
+    .unregister_function = NULL,
+    .message_function = handle_message_cb,
+    .dbus_internal_pad1 = NULL,
+    .dbus_internal_pad2 = NULL,
+    .dbus_internal_pad3 = NULL,
+    .dbus_internal_pad4 = NULL
+};
+
+static void register_object(struct dbus_state *dbus_state, struct object_entry *obj_entry) {
+    DBusConnection *conn;
+    void *state = NULL;
+
+    pa_assert(dbus_state);
+    pa_assert(obj_entry);
+
+    if (!dbus_state->connections)
+        return;
+
+    while ((conn = pa_idxset_iterate(dbus_state->connections, &state, NULL))) {
+        if (!dbus_connection_register_object_path(conn, obj_entry->path, &vtable, dbus_state))
+            pa_log_debug("dbus_connection_register_object_path() failed.");
+    }
+}
+
+static char **copy_methods(const char * const *methods) {
+    unsigned n = 0;
+    char **copy;
+    unsigned i;
+
+    while (methods[n++])
+        ;
+
+    copy = pa_xnew0(char *, n);
+
+    for (i = 0; i < n - 1; ++i)
+        copy[i] = pa_xstrdup(methods[i]);
+
+    return copy;
+}
+
+int pa_dbus_add_interface(pa_core *c, const char* path, const char* interface, const char * const *methods, const char* introspection_snippet, DBusObjectPathMessageFunction receive_cb, void *userdata) {
+    struct dbus_state *dbus_state;
+    pa_hashmap *objects;
+    struct object_entry *obj_entry;
+    struct interface_entry *iface_entry;
+    pa_bool_t state_created = FALSE;
+    pa_bool_t object_map_created = FALSE;
+    pa_bool_t obj_entry_created = FALSE;
+
+    pa_assert(c);
+    pa_assert(path);
+    pa_assert(introspection_snippet);
+    pa_assert(receive_cb);
+
+    if (!(dbus_state = pa_hashmap_get(c->shared, "dbus-state"))) {
+        dbus_state = pa_xnew0(struct dbus_state, 1);
+        dbus_state->core = c;
+        pa_hashmap_put(c->shared, "dbus-state", dbus_state);
+        state_created = TRUE;
+    }
+
+    if (!(objects = dbus_state->objects)) {
+        objects = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+        dbus_state->objects = objects;
+        object_map_created = TRUE;
+    }
+
+    if (!(obj_entry = pa_hashmap_get(objects, path))) {
+        obj_entry = pa_xnew(struct object_entry, 1);
+        obj_entry->path = pa_xstrdup(path);
+        obj_entry->interfaces = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+        obj_entry->introspection = NULL;
+        pa_hashmap_put(objects, path, obj_entry);
+        obj_entry_created = TRUE;
+    }
+
+    if (pa_hashmap_get(obj_entry->interfaces, interface) != NULL)
+        goto fail; /* The interface was already registered. */
+
+    iface_entry = pa_xnew(struct interface_entry, 1);
+    iface_entry->name = pa_xstrdup(interface);
+    iface_entry->methods = copy_methods(methods);
+    iface_entry->introspection_snippet = pa_xstrdup(introspection_snippet);
+    iface_entry->receive = receive_cb;
+    iface_entry->userdata = userdata;
+    pa_hashmap_put(obj_entry->interfaces, iface_entry->name, iface_entry);
+
+    update_introspection(obj_entry);
+
+    if (obj_entry_created)
+        register_object(dbus_state, obj_entry);
+
+    return 0;
+
+fail:
+    if (obj_entry_created) {
+        pa_hashmap_remove(objects, path);
+        pa_xfree(obj_entry);
+    }
+
+    if (object_map_created) {
+        dbus_state->objects = NULL;
+        pa_hashmap_free(objects, NULL, NULL);
+    }
+
+    if (state_created) {
+        pa_hashmap_remove(c->shared, "dbus-state");
+        pa_xfree(dbus_state);
+    }
+
+    return -1;
+}
+
+static void unregister_object(struct dbus_state *dbus_state, struct object_entry *obj_entry) {
+    DBusConnection *conn;
+    void *state = NULL;
+
+    pa_assert(dbus_state);
+    pa_assert(obj_entry);
+
+    if (!dbus_state->connections)
+        return;
+
+    while ((conn = pa_idxset_iterate(dbus_state->connections, &state, NULL))) {
+        if (!dbus_connection_unregister_object_path(conn, obj_entry->path))
+            pa_log_debug("dbus_connection_unregister_object_path() failed.");
+    }
+}
+
+static void free_methods(char **methods) {
+    char **pos = methods;
+
+    while (*pos++)
+        pa_xfree(*pos);
+
+    pa_xfree(methods);
+}
+
+int pa_dbus_remove_interface(pa_core *c, const char* path, const char* interface) {
+    struct dbus_state *dbus_state;
+    pa_hashmap *objects;
+    struct object_entry *obj_entry;
+    struct interface_entry *iface_entry;
+
+    pa_assert(c);
+    pa_assert(path);
+    pa_assert(interface);
+
+    if (!(dbus_state = pa_hashmap_get(c->shared, "dbus-state")))
+        return -1;
+
+    if (!(objects = dbus_state->objects))
+        return -1;
+
+    if (!(obj_entry = pa_hashmap_get(objects, path)))
+        return -1;
+
+    if (!(iface_entry = pa_hashmap_remove(obj_entry->interfaces, interface)))
+        return -1;
+
+    update_introspection(obj_entry);
+
+    pa_xfree(iface_entry->name);
+    free_methods(iface_entry->methods);
+    pa_xfree(iface_entry->introspection_snippet);
+    pa_xfree(iface_entry);
+
+    if (pa_hashmap_isempty(obj_entry->interfaces)) {
+        unregister_object(dbus_state, obj_entry);
+
+        pa_hashmap_remove(objects, path);
+        pa_xfree(obj_entry->path);
+        pa_hashmap_free(obj_entry->interfaces, NULL, NULL);
+        pa_xfree(obj_entry->introspection);
+        pa_xfree(obj_entry);
+    }
+
+    if (pa_hashmap_isempty(objects)) {
+        dbus_state->objects = NULL;
+        pa_hashmap_free(objects, NULL, NULL);
+    }
+
+    if (!dbus_state->objects && !dbus_state->connections) {
+        pa_hashmap_remove(c->shared, "dbus-state");
+        pa_xfree(dbus_state);
+    }
+
+    return 0;
+}
+
+static void register_all_objects(struct dbus_state *dbus_state, DBusConnection *conn) {
+    struct object_entry *obj_entry;
+    void *state = NULL;
+
+    pa_assert(dbus_state);
+    pa_assert(conn);
+
+    if (!dbus_state->objects)
+        return;
+
+    while ((obj_entry = pa_hashmap_iterate(dbus_state->objects, &state, NULL))) {
+        if (!dbus_connection_register_object_path(conn, obj_entry->path, &vtable, dbus_state))
+            pa_log_debug("dbus_connection_register_object_path() failed.");
+    }
+}
+
+int pa_dbus_register_connection(pa_core *c, DBusConnection *conn) {
+    struct dbus_state *dbus_state;
+    pa_idxset *connections;
+    pa_bool_t state_created = FALSE;
+    pa_bool_t connection_set_created = FALSE;
+
+    pa_assert(c);
+    pa_assert(conn);
+
+    if (!(dbus_state = pa_hashmap_get(c->shared, "dbus-state"))) {
+        dbus_state = pa_xnew0(struct dbus_state, 1);
+        dbus_state->core = c;
+        pa_hashmap_put(c->shared, "dbus-state", dbus_state);
+        state_created = TRUE;
+    }
+
+    if (!(connections = dbus_state->connections)) {
+        connections = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+        dbus_state->connections = connections;
+        connection_set_created = TRUE;
+    }
+
+    if (pa_idxset_get_by_data(connections, conn, NULL))
+        goto fail; /* The connection was already registered. */
+
+    register_all_objects(dbus_state, conn);
+
+    pa_idxset_put(connections, dbus_connection_ref(conn), NULL);
+
+    return 0;
+
+fail:
+    if (connection_set_created) {
+        dbus_state->connections = NULL;
+        pa_idxset_free(connections, NULL, NULL);
+    }
+
+    if (state_created) {
+        pa_hashmap_remove(c->shared, "dbus-state");
+        pa_xfree(dbus_state);
+    }
+
+    return -1;
+}
+
+static void unregister_all_objects(struct dbus_state *dbus_state, DBusConnection *conn) {
+    struct object_entry *obj_entry;
+    void *state = NULL;
+
+    pa_assert(dbus_state);
+    pa_assert(conn);
+
+    if (!dbus_state->objects)
+        return;
+
+    while ((obj_entry = pa_hashmap_iterate(dbus_state->objects, &state, NULL))) {
+        if (!dbus_connection_unregister_object_path(conn, obj_entry->path))
+            pa_log_debug("dus_connection_unregister_object_path() failed.");
+    }
+}
+
+int pa_dbus_unregister_connection(pa_core *c, DBusConnection *conn) {
+    struct dbus_state *dbus_state;
+    pa_idxset *connections;
+
+    pa_assert(c);
+    pa_assert(conn);
+
+    if (!(dbus_state = pa_hashmap_get(c->shared, "dbus-state")))
+        return -1;
+
+    if (!(connections = dbus_state->connections))
+        return -1;
+
+    if (!pa_idxset_remove_by_data(connections, conn, NULL))
+        return -1;
+
+    unregister_all_objects(dbus_state, conn);
+
+    dbus_connection_unref(conn);
+
+    if (pa_idxset_isempty(connections)) {
+        dbus_state->connections = NULL;
+        pa_idxset_free(connections, NULL, NULL);
+    }
+
+    if (!dbus_state->objects && !dbus_state->connections) {
+        pa_hashmap_remove(c->shared, "dbus-state");
+        pa_xfree(dbus_state);
+    }
+
+    return 0;
+}
diff --git a/src/pulsecore/dbus-common.h b/src/pulsecore/dbus-common.h
index 26bd05d..23c7c22 100644
--- a/src/pulsecore/dbus-common.h
+++ b/src/pulsecore/dbus-common.h
@@ -22,6 +22,8 @@
   USA.
 ***/
 
+#include <dbus/dbus.h>
+
 #include <pulsecore/core.h>
 #include <pulsecore/macro.h>
 
@@ -30,10 +32,42 @@
 
 #define PA_DBUS_SYSTEM_SOCKET_PATH PA_SYSTEM_RUNTIME_PATH PA_PATH_SEP PA_DBUS_SOCKET_NAME
 
+/* NOTE: These functions may only be called from the main thread. */
+
 /* Returns the default address of the server type in the escaped form. For
  * PA_SERVER_TYPE_NONE an empty string is returned. The caller frees the
  * string. This function may fail in some rare cases, in which case NULL is
  * returned. */
 char *pa_get_dbus_address_from_server_type(pa_server_type_t server_type);
 
+/* Registers the given interface to the given object path. This is additive: it
+ * doesn't matter whether or not the object has already been registered; if it
+ * is, then its interface set is just extended.
+ *
+ * Introspection requests are handled automatically. For that to work, the
+ * caller gives an XML snippet containing the interface introspection element.
+ * All interface snippets are automatically combined to provide the final
+ * introspection string.
+ *
+ * The introspection snippet contains the interface name and the methods, but
+ * since this function doesn't do XML parsing, the interface name and the set
+ * of method names have to be supplied separately. If the interface doesn't
+ * contain any methods, NULL may be given as the methods parameter, otherwise
+ * the methods parameter must be a NULL-terminated array of strings.
+ *
+ * Fails and returns a negative number if the object already has the interface
+ * registered. */
+int pa_dbus_add_interface(pa_core *c, const char* path, const char* interface, const char * const *methods, const char* introspection_snippet, DBusObjectPathMessageFunction receive_cb, void *userdata);
+
+/* Returns a negative number if the given object doesn't have the given
+ * interface registered. */
+int pa_dbus_remove_interface(pa_core *c, const char* path, const char* interface);
+
+/* Fails and returns a negative number if the connection is already
+ * registered. */
+int pa_dbus_register_connection(pa_core *c, DBusConnection *conn);
+
+/* Returns a negative number if the connection wasn't registered. */
+int pa_dbus_unregister_connection(pa_core *c, DBusConnection *conn);
+
 #endif
diff --git a/src/pulsecore/dbus-objs/core.c b/src/pulsecore/dbus-objs/core.c
new file mode 100644
index 0000000..f59c478
--- /dev/null
+++ b/src/pulsecore/dbus-objs/core.c
@@ -0,0 +1,120 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <dbus/dbus.h>
+
+#include <pulse/xmalloc.h>
+
+#include <pulsecore/dbus-common.h>
+#include <pulsecore/macro.h>
+
+#include "core.h"
+
+#define OBJECT_NAME "/org/pulseaudio/core"
+#define INTERFACE_NAME "org.pulseaudio.Core"
+
+struct pa_dbusobj_core {
+    pa_core *core;
+};
+
+static const char *introspection_snippet =
+    " <interface name=\""INTERFACE_NAME"\">"
+    "  <method name=\"Test\">"
+    "   <arg name=\"result\" type=\"s\" direction=\"out\"/>"
+    "  </method>"
+    " </interface>";
+
+static const char *methods[] = {
+    "Test",
+    NULL
+};
+
+static DBusHandlerResult handle_test(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_core *c) {
+    DBusMessage *reply = NULL;
+    const char *reply_message = "Hello!";
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    if (!(reply = dbus_message_new_method_return(msg)))
+        goto oom;
+
+    if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &reply_message, DBUS_TYPE_INVALID))
+        goto fail;
+
+    if (!dbus_connection_send(conn, reply, NULL))
+        goto oom;
+
+    dbus_message_unref(reply);
+
+    return DBUS_HANDLER_RESULT_HANDLED;
+
+fail:
+    if (reply)
+        dbus_message_unref(reply);
+
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+oom:
+    if (reply)
+        dbus_message_unref(reply);
+
+    return DBUS_HANDLER_RESULT_NEED_MEMORY;
+}
+
+static DBusHandlerResult receive_cb(DBusConnection *connection, DBusMessage *message, void *user_data) {
+    pa_dbusobj_core *c = user_data;
+
+    pa_assert(connection);
+    pa_assert(message);
+    pa_assert(c);
+
+    if (dbus_message_is_method_call(message, INTERFACE_NAME, "Test"))
+        return handle_test(connection, message, c);
+
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
+pa_dbusobj_core *pa_dbusobj_core_new(pa_core *core) {
+    pa_dbusobj_core *c;
+
+    pa_assert(core);
+
+    c = pa_xnew(pa_dbusobj_core, 1);
+    c->core = core;
+
+    pa_dbus_add_interface(core, OBJECT_NAME, INTERFACE_NAME, methods, introspection_snippet, receive_cb, c);
+
+    return c;
+}
+
+void pa_dbusobj_core_free(pa_dbusobj_core *c) {
+    pa_assert(c);
+
+    pa_dbus_remove_interface(c->core, OBJECT_NAME, INTERFACE_NAME);
+
+    pa_xfree(c);
+}
diff --git a/src/pulsecore/dbus-common.h b/src/pulsecore/dbus-objs/core.h
similarity index 59%
copy from src/pulsecore/dbus-common.h
copy to src/pulsecore/dbus-objs/core.h
index 26bd05d..8e59cc3 100644
--- a/src/pulsecore/dbus-common.h
+++ b/src/pulsecore/dbus-objs/core.h
@@ -1,5 +1,5 @@
-#ifndef foodbuscommonhfoo
-#define foodbuscommonhfoo
+#ifndef foodbusobjscorehfoo
+#define foodbusobjscorehfoo
 
 /***
   This file is part of PulseAudio.
@@ -22,18 +22,18 @@
   USA.
 ***/
 
-#include <pulsecore/core.h>
-#include <pulsecore/macro.h>
+/* This object implements the D-Bus object at path /org/pulseaudio/core.
+ * The implemented interface is org.pulseaudio.Core.
+ *
+ * See http://pulseaudio.org/wiki/DBusInterface for the Core interface
+ * documentation.
+ */
 
-#define PA_DBUS_DEFAULT_PORT 24883
-#define PA_DBUS_SOCKET_NAME "dbus_socket"
+#include <pulsecore/core.h>
 
-#define PA_DBUS_SYSTEM_SOCKET_PATH PA_SYSTEM_RUNTIME_PATH PA_PATH_SEP PA_DBUS_SOCKET_NAME
+typedef struct pa_dbusobj_core pa_dbusobj_core;
 
-/* Returns the default address of the server type in the escaped form. For
- * PA_SERVER_TYPE_NONE an empty string is returned. The caller frees the
- * string. This function may fail in some rare cases, in which case NULL is
- * returned. */
-char *pa_get_dbus_address_from_server_type(pa_server_type_t server_type);
+pa_dbusobj_core *pa_dbusobj_core_new(pa_core *core);
+void pa_dbusobj_core_free(pa_dbusobj_core *c);
 
 #endif

commit 3c6a0acc98a8326ad7a19c29005bba353396a88b
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Fri Jun 19 15:17:57 2009 +0300

    dbus-protocol: Implement TCP server startup.

diff --git a/src/daemon/server-lookup.c b/src/daemon/server-lookup.c
index 2d2d8ce..33d6b24 100644
--- a/src/daemon/server-lookup.c
+++ b/src/daemon/server-lookup.c
@@ -120,14 +120,11 @@ static DBusHandlerResult handle_get_address(DBusConnection *conn, DBusMessage *m
         return DBUS_HANDLER_RESULT_HANDLED;
     }
 
-    pa_client_conf_free(conf);
-
     if (conf->default_dbus_server) {
-        if (!(address = dbus_address_escape_value(conf->default_dbus_server)))
-            goto oom;
+        address = pa_xstrdup(conf->default_dbus_server);
     } else {
         if (!(address = pa_get_dbus_address_from_server_type(sl->core->server_type))) {
-            if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_FAILED, "get_dbus_server_from_type() failed.")))
+            if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_FAILED, "PulseAudio internal error: get_dbus_server_from_type() failed.")))
                 goto fail;
             if (!dbus_connection_send(conn, reply, NULL))
                 goto oom;
@@ -144,10 +141,8 @@ static DBusHandlerResult handle_get_address(DBusConnection *conn, DBusMessage *m
     if (!dbus_connection_send(conn, reply, NULL))
         goto oom;
 
-    pa_log_debug("handle_get_dbus_address(): Sent reply with address '%s'.", address);
-
+    pa_client_conf_free(conf);
     pa_xfree(address);
-
     dbus_message_unref(reply);
 
     return DBUS_HANDLER_RESULT_HANDLED;
diff --git a/src/daemon/system.pa.in b/src/daemon/system.pa.in
index 5541bbe..0ca32bd 100755
--- a/src/daemon/system.pa.in
+++ b/src/daemon/system.pa.in
@@ -33,7 +33,8 @@ load-module module-detect
 load-module module-esound-protocol-unix
 .endif
 .ifexists module-dbus-protocol at PA_SOEXT@
-load-module module-dbus-protocol
+### If you want to allow TCP connections, set access to "remote" or "local,remote".
+load-module module-dbus-protocol access=local
 .endif
 load-module module-native-protocol-unix
 
diff --git a/src/modules/module-dbus-protocol.c b/src/modules/module-dbus-protocol.c
index 74dfeef..8be9d1a 100644
--- a/src/modules/module-dbus-protocol.c
+++ b/src/modules/module-dbus-protocol.c
@@ -54,6 +54,11 @@ PA_MODULE_VERSION(PACKAGE_VERSION);
 
 #define CLEANUP_INTERVAL 10 /* seconds */
 
+enum server_type {
+    SERVER_TYPE_LOCAL,
+    SERVER_TYPE_TCP
+};
+
 struct server;
 struct connection;
 
@@ -75,6 +80,7 @@ struct userdata {
 
 struct server {
     struct userdata *userdata;
+    enum server_type type;
     DBusServer *dbus_server;
 };
 
@@ -114,6 +120,12 @@ static void client_kill_cb(pa_client *c) {
     pa_log_info("Connection killed.");
 }
 
+static dbus_bool_t user_check_cb(DBusConnection *connection, unsigned long uid, void *data) {
+    pa_log_debug("Allowing connection by user %lu.", uid);
+
+    return TRUE;
+}
+
 /* Called by D-Bus when a new client connection is received. */
 static void connection_new_cb(DBusServer *dbus_server, DBusConnection *new_connection, void *data) {
     struct server *s = data;
@@ -131,8 +143,17 @@ static void connection_new_cb(DBusServer *dbus_server, DBusConnection *new_conne
     client = pa_client_new(s->userdata->module->core, &new_data);
     pa_client_new_data_done(&new_data);
 
-    if (!client)
+    if (!client) {
+        dbus_connection_close(new_connection);
         return;
+    }
+
+    if (s->type == SERVER_TYPE_TCP) {
+        /* FIXME: Here we allow anyone from anywhere to access the server,
+         * anonymously. Access control should be configurable. */
+        dbus_connection_set_unix_user_function(new_connection, user_check_cb, NULL, NULL);
+        dbus_connection_set_allow_anonymous(new_connection, TRUE);
+    }
 
     c = pa_xnew(struct connection, 1);
     c->server = s;
@@ -334,7 +355,7 @@ static void server_free(struct server *s) {
     pa_xfree(s);
 }
 
-static struct server *start_server(struct userdata *u, const char *address) {
+static struct server *start_server(struct userdata *u, const char *address, enum server_type type) {
     /* XXX: We assume that when we unref the DBusServer instance at module
      * shutdown, nobody else holds any references to it. If we stop assuming
      * that someday, dbus_server_set_new_connection_function,
@@ -390,7 +411,7 @@ static struct server *start_local_server(struct userdata *u) {
 
     address = pa_get_dbus_address_from_server_type(u->module->core->server_type);
 
-    s = start_server(u, address); /* May return NULL */
+    s = start_server(u, address, SERVER_TYPE_LOCAL); /* May return NULL */
 
     pa_xfree(address);
 
@@ -398,8 +419,18 @@ static struct server *start_local_server(struct userdata *u) {
 }
 
 static struct server *start_tcp_server(struct userdata *u) {
-    pa_log("start_tcp_server(): Not implemented!");
-    return NULL;
+    struct server *s = NULL;
+    char *address = NULL;
+
+    pa_assert(u);
+
+    address = pa_sprintf_malloc("tcp:host=127.0.0.1,port=%u", u->tcp_port);
+
+    s = start_server(u, address, SERVER_TYPE_TCP); /* May return NULL */
+
+    pa_xfree(address);
+
+    return s;
 }
 
 static int get_access_arg(pa_modargs *ma, pa_bool_t *local_access, pa_bool_t *remote_access) {
@@ -420,7 +451,7 @@ static int get_access_arg(pa_modargs *ma, pa_bool_t *local_access, pa_bool_t *re
         *remote_access = TRUE;
     } else if (!strcmp(value, "local,remote")) {
         *local_access = TRUE;
-        *local_access = TRUE;
+        *remote_access = TRUE;
     } else
         return -1;
 

commit b152f3a052eca7225870a7dc4d8a719bee107f0f
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sat Jun 20 10:17:46 2009 +0300

    module-dbus-protocol: Allow anyone to connect the daemon in system mode.

diff --git a/src/modules/module-dbus-protocol.c b/src/modules/module-dbus-protocol.c
index 8be9d1a..46f6492 100644
--- a/src/modules/module-dbus-protocol.c
+++ b/src/modules/module-dbus-protocol.c
@@ -148,7 +148,7 @@ static void connection_new_cb(DBusServer *dbus_server, DBusConnection *new_conne
         return;
     }
 
-    if (s->type == SERVER_TYPE_TCP) {
+    if (s->type == SERVER_TYPE_TCP || s->userdata->module->core->server_type == PA_SERVER_TYPE_SYSTEM) {
         /* FIXME: Here we allow anyone from anywhere to access the server,
          * anonymously. Access control should be configurable. */
         dbus_connection_set_unix_user_function(new_connection, user_check_cb, NULL, NULL);

commit 0bc538b08ca5c4efea86700cb6c4685da3f34345
Merge: b152f3a 2654eb7
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Jun 29 18:35:06 2009 +0300

    Merge branch 'master' into dbus-work
    
    Conflicts:
    	src/daemon/daemon-conf.c
    	src/daemon/daemon-conf.h
    	src/daemon/main.c
    	src/pulsecore/dbus-util.h

diff --cc configure.ac
index a3f9f0e,d2d8015..185f13b
--- a/configure.ac
+++ b/configure.ac
@@@ -22,8 -22,8 +22,7 @@@
  
  AC_PREREQ(2.63)
  
--AC_INIT([pulseaudio], m4_esyscmd([./git-version-gen .tarball-version]),
--	[mzchyfrnhqvb (at) 0pointer (dot) net])
++AC_INIT([pulseaudio],[m4_esyscmd(./git-version-gen .tarball-version)],[mzchyfrnhqvb (at) 0pointer (dot) net])
  AC_CONFIG_SRCDIR([src/daemon/main.c])
  AC_CONFIG_MACRO_DIR([m4])
  AC_CONFIG_HEADERS([config.h])
diff --cc src/Makefile.am
index d28ffa1,ae90ae8..b1bc497
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@@ -796,10 -816,8 +817,9 @@@ libpulsecore_ at PA_MAJORMINORMICRO@_la_SO
  		pulsecore/object.c pulsecore/object.h \
  		pulsecore/play-memblockq.c pulsecore/play-memblockq.h \
  		pulsecore/play-memchunk.c pulsecore/play-memchunk.h \
 +		pulsecore/protocol-dbus.h \
  		pulsecore/resampler.c pulsecore/resampler.h \
  		pulsecore/rtpoll.c pulsecore/rtpoll.h \
- 		pulsecore/rtsig.c pulsecore/rtsig.h \
  		pulsecore/sample-util.c pulsecore/sample-util.h \
  		pulsecore/sconv-s16be.c pulsecore/sconv-s16be.h \
  		pulsecore/sconv-s16le.c pulsecore/sconv-s16le.h \
@@@ -1074,10 -1117,14 +1121,15 @@@ modlibexec_LTLIBRARIES += 
  		module-hal-detect.la
  endif
  
+ if HAVE_UDEV
+ modlibexec_LTLIBRARIES += \
+ 		module-udev-detect.la
+ endif
+ 
  if HAVE_DBUS
  modlibexec_LTLIBRARIES += \
 -		module-rygel-media-server.la
 +		module-rygel-media-server.la \
 +		module-dbus-protocol.la
  endif
  
  if HAVE_BLUEZ
diff --cc src/daemon/daemon-conf.c
index e6fa8c6,9010f2f..ace460e
--- a/src/daemon/daemon-conf.c
+++ b/src/daemon/daemon-conf.c
@@@ -83,11 -83,9 +83,12 @@@ static const pa_daemon_conf default_con
      .config_file = NULL,
      .use_pid_file = TRUE,
      .system_instance = FALSE,
 +#ifdef HAVE_DBUS
 +    .local_server_type = PA_SERVER_TYPE_UNSET, /* The actual default is _USER, but we have to detect when the user doesn't specify this option. */
 +#endif
      .no_cpu_limit = FALSE,
      .disable_shm = FALSE,
+     .lock_memory = FALSE,
      .default_n_fragments = 4,
      .default_fragment_size_msec = 25,
      .default_sample_spec = { .format = PA_SAMPLE_S16NE, .rate = 44100, .channels = 2 },
@@@ -633,23 -597,14 +635,22 @@@ FILE *pa_daemon_conf_open_default_scrip
      return f;
  }
  
+ char *pa_daemon_conf_dump(pa_daemon_conf *c) {
+     static const char* const log_level_to_string[] = {
+         [PA_LOG_DEBUG] = "debug",
+         [PA_LOG_INFO] = "info",
+         [PA_LOG_NOTICE] = "notice",
+         [PA_LOG_WARN] = "warning",
+         [PA_LOG_ERROR] = "error"
+     };
 +
- static const char* const log_level_to_string[] = {
-     [PA_LOG_DEBUG] = "debug",
-     [PA_LOG_INFO] = "info",
-     [PA_LOG_NOTICE] = "notice",
-     [PA_LOG_WARN] = "warning",
-     [PA_LOG_ERROR] = "error"
- };
- 
- static const char* const server_type_to_string[] = {
-     [PA_SERVER_TYPE_UNSET] = "!!UNSET!!",
-     [PA_SERVER_TYPE_USER] = "user",
-     [PA_SERVER_TYPE_SYSTEM] = "system",
-     [PA_SERVER_TYPE_NONE] = "none"
- };
++    static const char* const server_type_to_string[] = {
++        [PA_SERVER_TYPE_UNSET] = "!!UNSET!!",
++        [PA_SERVER_TYPE_USER] = "user",
++        [PA_SERVER_TYPE_SYSTEM] = "system",
++        [PA_SERVER_TYPE_NONE] = "none"
++    };
 +
- char *pa_daemon_conf_dump(pa_daemon_conf *c) {
      pa_strbuf *s;
      char cm[PA_CHANNEL_MAP_SNPRINT_MAX];
  
diff --cc src/daemon/daemon-conf.h
index c4f78cb,dd69e04..41c3c4b
--- a/src/daemon/daemon-conf.h
+++ b/src/daemon/daemon-conf.h
@@@ -74,8 -73,8 +74,9 @@@ typedef struct pa_daemon_conf 
          disallow_exit,
          log_meta,
          log_time,
-         flat_volumes;
+         flat_volumes,
+         lock_memory;
 +    pa_server_type_t local_server_type;
      int exit_idle_time,
          scache_idle_time,
          auto_log_target,
diff --cc src/daemon/daemon.conf.in
index ecdb3a6,6931359..9bea614
--- a/src/daemon/daemon.conf.in
+++ b/src/daemon/daemon.conf.in
@@@ -25,9 -25,10 +25,11 @@@
  ; disallow-exit = no
  ; use-pid-file = yes
  ; system-instance = no
 +; local-server-type = user
  ; disable-shm = no
  ; shm-size-bytes = 0 # setting this 0 will use the system-default, usually 64 MiB
+ ; lock-memory = no
+ ; no-cpu-limit = no
  
  ; high-priority = yes
  ; nice-level = -11
diff --cc src/daemon/main.c
index 62214a5,b58bb37..c1730b7
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@@ -98,8 -101,6 +101,7 @@@
  #include "dumpmodules.h"
  #include "caps.h"
  #include "ltdl-bind-now.h"
- #include "polkit.h"
 +#include "server-lookup.h"
  
  #ifdef HAVE_LIBWRAP
  /* Only one instance of these variables */
@@@ -488,191 -461,6 +463,32 @@@ int main(int argc, char *argv[]) 
          pa_log_set_flags(PA_LOG_PRINT_TIME, PA_LOG_SET);
      pa_log_set_show_backtrace(conf->log_backtrace);
  
 +#ifdef HAVE_DBUS
 +    /* conf->system_instance and conf->local_server_type control almost the
 +     * same thing; make them agree about what is requested. */
 +    switch (conf->local_server_type) {
 +        case PA_SERVER_TYPE_UNSET:
 +            conf->local_server_type = conf->system_instance ? PA_SERVER_TYPE_SYSTEM : PA_SERVER_TYPE_USER;
 +            break;
 +        case PA_SERVER_TYPE_USER:
 +        case PA_SERVER_TYPE_NONE:
 +            conf->system_instance = FALSE;
 +            break;
 +        case PA_SERVER_TYPE_SYSTEM:
 +            conf->system_instance = TRUE;
 +            break;
 +        default:
 +            pa_assert_not_reached();
 +    }
 +
-     start_server = conf->local_server_type == PA_SERVER_TYPE_USER || (real_root && conf->local_server_type == PA_SERVER_TYPE_SYSTEM);
++    start_server = conf->local_server_type == PA_SERVER_TYPE_USER || (getuid() == 0 && conf->local_server_type == PA_SERVER_TYPE_SYSTEM);
 +
 +    if (!start_server && conf->local_server_type == PA_SERVER_TYPE_SYSTEM) {
 +        pa_log_notice(_("System mode refused for non-root user. Only starting the D-Bus server lookup service."));
 +        conf->system_instance = FALSE;
 +    }
 +#endif
 +
-     pa_log_debug("Started as real root: %s, suid root: %s", pa_yes_no(real_root), pa_yes_no(suid_root));
- 
- #ifdef HAVE_DBUS
-     /* XXX: Uhh, goto programming... as if this wasn't hard enough to follow
-      * already. But if we won't start the full server, we want to just skip all
-      * the capability stuff. */
-     if (!start_server) {
-         if (!real_root && pa_have_caps())
-             pa_drop_caps();
-         goto after_caps_setup;
-     }
- #endif
- 
-     if (!real_root && pa_have_caps()) {
- #ifdef HAVE_SYS_RESOURCE_H
-         struct rlimit rl;
- #endif
-         pa_bool_t allow_high_priority = FALSE, allow_realtime = FALSE;
- 
-         /* Let's better not enable high prio or RT by default */
- 
-         if (conf->high_priority && !allow_high_priority) {
-             if (pa_own_uid_in_group(PA_REALTIME_GROUP, &gid) > 0) {
-                 pa_log_info(_("We're in the group '%s', allowing high-priority scheduling."), PA_REALTIME_GROUP);
-                 allow_high_priority = TRUE;
-             }
-         }
- 
-         if (conf->realtime_scheduling && !allow_realtime) {
-             if (pa_own_uid_in_group(PA_REALTIME_GROUP, &gid) > 0) {
-                 pa_log_info(_("We're in the group '%s', allowing real-time scheduling."), PA_REALTIME_GROUP);
-                 allow_realtime = TRUE;
-             }
-         }
- 
- #ifdef HAVE_POLKIT
-         if (conf->high_priority && !allow_high_priority) {
-             if (pa_polkit_check("org.pulseaudio.acquire-high-priority") > 0) {
-                 pa_log_info(_("PolicyKit grants us acquire-high-priority privilege."));
-                 allow_high_priority = TRUE;
-             } else
-                 pa_log_info(_("PolicyKit refuses acquire-high-priority privilege."));
-         }
- 
-         if (conf->realtime_scheduling && !allow_realtime) {
-             if (pa_polkit_check("org.pulseaudio.acquire-real-time") > 0) {
-                 pa_log_info(_("PolicyKit grants us acquire-real-time privilege."));
-                 allow_realtime = TRUE;
-             } else
-                 pa_log_info(_("PolicyKit refuses acquire-real-time privilege."));
-         }
- #endif
- 
-         if (!allow_high_priority && !allow_realtime) {
- 
-             /* OK, there's no further need to keep CAP_NICE. Hence
-              * let's give it up early */
- 
-             pa_drop_caps();
-         }
- 
- #ifdef RLIMIT_RTPRIO
-         if (getrlimit(RLIMIT_RTPRIO, &rl) >= 0)
-             if (rl.rlim_cur > 0) {
-                 pa_log_info("RLIMIT_RTPRIO is set to %u, allowing real-time scheduling.", (unsigned) rl.rlim_cur);
-                 allow_realtime = TRUE;
-             }
- #endif
- #ifdef RLIMIT_NICE
-         if (getrlimit(RLIMIT_NICE, &rl) >= 0)
-             if (rl.rlim_cur > 20 ) {
-                 pa_log_info("RLIMIT_NICE is set to %u, allowing high-priority scheduling.", (unsigned) rl.rlim_cur);
-                 allow_high_priority = TRUE;
-             }
- #endif
- 
-         if ((conf->high_priority && !allow_high_priority) ||
-             (conf->realtime_scheduling && !allow_realtime))
-             pa_log_info(_("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 '%s', 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 '%s', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user."),
-                           PA_REALTIME_GROUP, PA_REALTIME_GROUP);
- 
- 
-         if (!allow_realtime)
-             conf->realtime_scheduling = FALSE;
- 
-         if (!allow_high_priority)
-             conf->high_priority = FALSE;
-     }
- 
- #ifdef HAVE_SYS_RESOURCE_H
-     /* Reset resource limits. If we are run as root (for system mode)
-      * this might end up increasing the limits, which is intended
-      * behaviour. For all other cases, i.e. started as normal user, or
-      * SUID root at this point we should have no CAP_SYS_RESOURCE and
-      * increasing the limits thus should fail. Which is, too, intended
-      * behaviour */
- 
-     set_all_rlimits(conf);
- #endif
- 
-     if (conf->high_priority && !pa_can_high_priority()) {
-         pa_log_info(_("High-priority scheduling enabled in configuration but not allowed by policy."));
-         conf->high_priority = FALSE;
-     }
- 
-     if (conf->high_priority && (conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START))
-         pa_raise_priority(conf->nice_level);
- 
-     pa_log_debug("Can realtime: %s, can high-priority: %s", pa_yes_no(pa_can_realtime()), pa_yes_no(pa_can_high_priority()));
- 
-     if (!real_root && pa_have_caps()) {
-         pa_bool_t drop;
- 
-         drop = (conf->cmd != PA_CMD_DAEMON && conf->cmd != PA_CMD_START) || !conf->realtime_scheduling;
- 
- #ifdef RLIMIT_RTPRIO
-         if (!drop) {
-             struct rlimit rl;
-             /* At this point we still have CAP_NICE if we were loaded
-              * SUID root. If possible let's acquire RLIMIT_RTPRIO
-              * instead and give CAP_NICE up. */
- 
-             if (getrlimit(RLIMIT_RTPRIO, &rl) >= 0) {
- 
-                 if (rl.rlim_cur >= 9)
-                     drop = TRUE;
-                 else {
-                     rl.rlim_max = rl.rlim_cur = 9;
- 
-                     if (setrlimit(RLIMIT_RTPRIO, &rl) >= 0) {
-                         pa_log_info(_("Successfully increased RLIMIT_RTPRIO"));
-                         drop = TRUE;
-                     } else
-                         pa_log_warn(_("RLIMIT_RTPRIO failed: %s"), pa_cstrerror(errno));
-                 }
-             }
-         }
- #endif
- 
-         if (drop)  {
-             pa_log_info(_("Giving up CAP_NICE"));
-             pa_drop_caps();
-             suid_root = FALSE;
-         }
-     }
- 
-     if (conf->realtime_scheduling && !pa_can_realtime()) {
-         pa_log_info(_("Real-time scheduling enabled in configuration but not allowed by policy."));
-         conf->realtime_scheduling = FALSE;
-     }
- 
- #ifdef HAVE_DBUS
- after_caps_setup:
- #endif
- 
-     pa_log_debug("Can realtime: %s, can high-priority: %s", pa_yes_no(pa_can_realtime()), pa_yes_no(pa_can_high_priority()));
- 
      LTDL_SET_PRELOADED_SYMBOLS();
      pa_ltdl_init();
      ltdl_init = TRUE;
@@@ -757,10 -545,9 +573,10 @@@
              pa_assert(conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START);
      }
  
-     if (real_root && !conf->system_instance)
+     if (getuid() == 0 && !conf->system_instance)
          pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
 +#ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */
-     else if (!real_root && conf->system_instance) {
+     else if (getuid() != 0 && conf->system_instance) {
          pa_log(_("Root privileges required."));
          goto finish;
      }
@@@ -1028,7 -830,6 +860,9 @@@
      c->running_as_daemon = !!conf->daemonize;
      c->disallow_exit = conf->disallow_exit;
      c->flat_volumes = conf->flat_volumes;
++#ifdef HAVE_DBUS
 +    c->server_type = conf->local_server_type;
++#endif
  
      pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
      pa_signal_new(SIGINT, signal_callback, c);
diff --cc src/modules/module-dbus-protocol.c
index 46f6492,0000000..f7c1f0a
mode 100644,000000..100644
--- a/src/modules/module-dbus-protocol.c
+++ b/src/modules/module-dbus-protocol.c
@@@ -1,575 -1,0 +1,575 @@@
 +/***
 +  This file is part of PulseAudio.
 +
 +  Copyright 2009 Tanu Kaskinen
 +  Copyright 2006 Lennart Poettering
 +  Copyright 2006 Shams E. King
 +
 +  PulseAudio is free software; you can redistribute it and/or modify
 +  it under the terms of the GNU Lesser General Public License as published
 +  by the Free Software Foundation; either version 2.1 of the License,
 +  or (at your option) any later version.
 +
 +  PulseAudio is distributed in the hope that it will be useful, but
 +  WITHOUT ANY WARRANTY; without even the implied warranty of
 +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 +  General Public License for more details.
 +
 +  You should have received a copy of the GNU Lesser General Public License
 +  along with PulseAudio; if not, 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 <dbus/dbus.h>
 +
 +#include <pulse/mainloop-api.h>
 +#include <pulse/timeval.h>
 +#include <pulse/xmalloc.h>
 +
 +#include <pulsecore/client.h>
 +#include <pulsecore/core-util.h>
 +#include <pulsecore/dbus-common.h>
 +#include <pulsecore/dbus-util.h>
 +#include <pulsecore/idxset.h>
 +#include <pulsecore/macro.h>
 +#include <pulsecore/modargs.h>
 +#include <pulsecore/module.h>
 +
 +#include <pulsecore/dbus-objs/core.h>
 +
 +#include "module-dbus-protocol-symdef.h"
 +
 +PA_MODULE_DESCRIPTION("D-Bus interface");
 +PA_MODULE_USAGE(
 +        "access=local|remote|local,remote "
 +        "tcp_port=<port number>");
 +PA_MODULE_LOAD_ONCE(TRUE);
 +PA_MODULE_AUTHOR("Tanu Kaskinen");
 +PA_MODULE_VERSION(PACKAGE_VERSION);
 +
 +#define CLEANUP_INTERVAL 10 /* seconds */
 +
 +enum server_type {
 +    SERVER_TYPE_LOCAL,
 +    SERVER_TYPE_TCP
 +};
 +
 +struct server;
 +struct connection;
 +
 +struct userdata {
 +    pa_module *module;
 +    pa_bool_t local_access;
 +    pa_bool_t remote_access;
 +    uint32_t tcp_port;
 +
 +    struct server *local_server;
 +    struct server *tcp_server;
 +
 +    pa_idxset *connections;
 +
 +    pa_time_event *cleanup_event;
 +
 +    pa_dbusobj_core *core_object;
 +};
 +
 +struct server {
 +    struct userdata *userdata;
 +    enum server_type type;
 +    DBusServer *dbus_server;
 +};
 +
 +struct connection {
 +    struct server *server;
 +    pa_dbus_wrap_connection *wrap_conn;
 +    pa_client *client;
 +};
 +
 +static const char* const valid_modargs[] = {
 +    "access",
 +    "tcp_port",
 +    NULL
 +};
 +
 +static void connection_free(struct connection *c) {
 +    pa_assert(c);
 +
 +    pa_assert_se(pa_dbus_unregister_connection(c->server->userdata->module->core, pa_dbus_wrap_connection_get(c->wrap_conn)) >= 0);
 +
 +    pa_client_free(c->client);
 +    pa_assert_se(pa_idxset_remove_by_data(c->server->userdata->connections, c, NULL));
 +    pa_dbus_wrap_connection_free(c->wrap_conn);
 +    pa_xfree(c);
 +}
 +
 +/* Called from pa_client_kill(). */
 +static void client_kill_cb(pa_client *c) {
 +    struct connection *conn;
 +
 +    pa_assert(c);
 +    pa_assert(c->userdata);
 +
 +    conn = c->userdata;
 +    connection_free(conn);
 +
 +    pa_log_info("Connection killed.");
 +}
 +
 +static dbus_bool_t user_check_cb(DBusConnection *connection, unsigned long uid, void *data) {
 +    pa_log_debug("Allowing connection by user %lu.", uid);
 +
 +    return TRUE;
 +}
 +
 +/* Called by D-Bus when a new client connection is received. */
 +static void connection_new_cb(DBusServer *dbus_server, DBusConnection *new_connection, void *data) {
 +    struct server *s = data;
 +    struct connection *c;
 +    pa_client_new_data new_data;
 +    pa_client *client;
 +
 +    pa_assert(new_connection);
 +    pa_assert(s);
 +
 +    pa_client_new_data_init(&new_data);
 +    new_data.module = s->userdata->module;
 +    new_data.driver = __FILE__;
 +    pa_proplist_sets(new_data.proplist, PA_PROP_APPLICATION_NAME, "D-Bus client"); /* TODO: It's probably possible to generate a fancier name. Other props? */
 +    client = pa_client_new(s->userdata->module->core, &new_data);
 +    pa_client_new_data_done(&new_data);
 +
 +    if (!client) {
 +        dbus_connection_close(new_connection);
 +        return;
 +    }
 +
 +    if (s->type == SERVER_TYPE_TCP || s->userdata->module->core->server_type == PA_SERVER_TYPE_SYSTEM) {
 +        /* FIXME: Here we allow anyone from anywhere to access the server,
 +         * anonymously. Access control should be configurable. */
 +        dbus_connection_set_unix_user_function(new_connection, user_check_cb, NULL, NULL);
 +        dbus_connection_set_allow_anonymous(new_connection, TRUE);
 +    }
 +
 +    c = pa_xnew(struct connection, 1);
 +    c->server = s;
-     c->wrap_conn = pa_dbus_wrap_connection_new_from_existing(s->userdata->module->core->mainloop, new_connection);
++    c->wrap_conn = pa_dbus_wrap_connection_new_from_existing(s->userdata->module->core->mainloop, TRUE, new_connection);
 +    c->client = client;
 +
 +    c->client->kill = client_kill_cb;
 +    c->client->send_event = NULL; /* TODO: Implement this. */
 +    c->client->userdata = c;
 +
 +    pa_idxset_put(s->userdata->connections, c, NULL);
 +
 +    pa_assert_se(pa_dbus_register_connection(s->userdata->module->core, new_connection) >= 0);
 +}
 +
 +/* Called by PA mainloop when a D-Bus fd watch event needs handling. */
 +static void io_event_cb(pa_mainloop_api *mainloop, pa_io_event *e, int fd, pa_io_event_flags_t events, void *userdata) {
 +    unsigned int flags = 0;
 +    DBusWatch *watch = userdata;
 +
 +#if HAVE_DBUS_WATCH_GET_UNIX_FD
 +    pa_assert(fd == dbus_watch_get_unix_fd(watch));
 +#else
 +    pa_assert(fd == dbus_watch_get_fd(watch));
 +#endif
 +
 +    if (!dbus_watch_get_enabled(watch)) {
 +        pa_log_warn("Asked to handle disabled watch: %p %i", (void*) watch, fd);
 +        return;
 +    }
 +
 +    if (events & PA_IO_EVENT_INPUT)
 +        flags |= DBUS_WATCH_READABLE;
 +    if (events & PA_IO_EVENT_OUTPUT)
 +        flags |= DBUS_WATCH_WRITABLE;
 +    if (events & PA_IO_EVENT_HANGUP)
 +        flags |= DBUS_WATCH_HANGUP;
 +    if (events & PA_IO_EVENT_ERROR)
 +        flags |= DBUS_WATCH_ERROR;
 +
 +    dbus_watch_handle(watch, flags);
 +}
 +
 +/* Called by PA mainloop when a D-Bus timer event needs handling. */
 +static void time_event_cb(pa_mainloop_api *mainloop, pa_time_event* e, const struct timeval *tv, void *userdata) {
 +    DBusTimeout *timeout = userdata;
 +
 +    if (dbus_timeout_get_enabled(timeout)) {
 +        struct timeval next = *tv;
 +        dbus_timeout_handle(timeout);
 +
 +        /* restart it for the next scheduled time */
 +        pa_timeval_add(&next, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000);
 +        mainloop->time_restart(e, &next);
 +    }
 +}
 +
 +/* Translates D-Bus fd watch event flags to PA IO event flags. */
 +static pa_io_event_flags_t get_watch_flags(DBusWatch *watch) {
 +    unsigned int flags;
 +    pa_io_event_flags_t events = 0;
 +
 +    pa_assert(watch);
 +
 +    flags = dbus_watch_get_flags(watch);
 +
 +    /* no watch flags for disabled watches */
 +    if (!dbus_watch_get_enabled(watch))
 +        return PA_IO_EVENT_NULL;
 +
 +    if (flags & DBUS_WATCH_READABLE)
 +        events |= PA_IO_EVENT_INPUT;
 +    if (flags & DBUS_WATCH_WRITABLE)
 +        events |= PA_IO_EVENT_OUTPUT;
 +
 +    return events | PA_IO_EVENT_HANGUP | PA_IO_EVENT_ERROR;
 +}
 +
 +/* Called by D-Bus when a D-Bus fd watch event is added. */
 +static dbus_bool_t watch_add_cb(DBusWatch *watch, void *data) {
 +    struct server *s = data;
 +    pa_mainloop_api *mainloop;
 +    pa_io_event *ev;
 +
 +    pa_assert(watch);
 +    pa_assert(s);
 +
 +    mainloop = s->userdata->module->core->mainloop;
 +
 +    ev = mainloop->io_new(
 +            mainloop,
 +#if HAVE_DBUS_WATCH_GET_UNIX_FD
 +            dbus_watch_get_unix_fd(watch),
 +#else
 +            dbus_watch_get_fd(watch),
 +#endif
 +            get_watch_flags(watch), io_event_cb, watch);
 +
 +    dbus_watch_set_data(watch, ev, NULL);
 +
 +    return TRUE;
 +}
 +
 +/* Called by D-Bus when a D-Bus fd watch event is removed. */
 +static void watch_remove_cb(DBusWatch *watch, void *data) {
 +    struct server *s = data;
 +    pa_io_event *ev;
 +
 +    pa_assert(watch);
 +    pa_assert(s);
 +
 +    if ((ev = dbus_watch_get_data(watch)))
 +        s->userdata->module->core->mainloop->io_free(ev);
 +}
 +
 +/* Called by D-Bus when a D-Bus fd watch event is toggled. */
 +static void watch_toggled_cb(DBusWatch *watch, void *data) {
 +    struct server *s = data;
 +    pa_io_event *ev;
 +
 +    pa_assert(watch);
 +    pa_assert(s);
 +
 +    pa_assert_se(ev = dbus_watch_get_data(watch));
 +
 +    /* get_watch_flags() checks if the watch is enabled */
 +    s->userdata->module->core->mainloop->io_enable(ev, get_watch_flags(watch));
 +}
 +
 +/* Called by D-Bus when a D-Bus timer event is added. */
 +static dbus_bool_t timeout_add_cb(DBusTimeout *timeout, void *data) {
 +    struct server *s = data;
 +    pa_mainloop_api *mainloop;
 +    pa_time_event *ev;
 +    struct timeval tv;
 +
 +    pa_assert(timeout);
 +    pa_assert(s);
 +
 +    if (!dbus_timeout_get_enabled(timeout))
 +        return FALSE;
 +
 +    mainloop = s->userdata->module->core->mainloop;
 +
 +    pa_gettimeofday(&tv);
 +    pa_timeval_add(&tv, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000);
 +
 +    ev = mainloop->time_new(mainloop, &tv, time_event_cb, timeout);
 +
 +    dbus_timeout_set_data(timeout, ev, NULL);
 +
 +    return TRUE;
 +}
 +
 +/* Called by D-Bus when a D-Bus timer event is removed. */
 +static void timeout_remove_cb(DBusTimeout *timeout, void *data) {
 +    struct server *s = data;
 +    pa_time_event *ev;
 +
 +    pa_assert(timeout);
 +    pa_assert(s);
 +
 +    if ((ev = dbus_timeout_get_data(timeout)))
 +        s->userdata->module->core->mainloop->time_free(ev);
 +}
 +
 +/* Called by D-Bus when a D-Bus timer event is toggled. */
 +static void timeout_toggled_cb(DBusTimeout *timeout, void *data) {
 +    struct server *s = data;
 +    pa_mainloop_api *mainloop;
 +    pa_time_event *ev;
 +
 +    pa_assert(timeout);
 +    pa_assert(s);
 +
 +    mainloop = s->userdata->module->core->mainloop;
 +
 +    pa_assert_se(ev = dbus_timeout_get_data(timeout));
 +
 +    if (dbus_timeout_get_enabled(timeout)) {
 +        struct timeval tv;
 +
 +        pa_gettimeofday(&tv);
 +        pa_timeval_add(&tv, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000);
 +
 +        mainloop->time_restart(ev, &tv);
 +    } else
 +        mainloop->time_restart(ev, NULL);
 +}
 +
 +static void server_free(struct server *s) {
 +    pa_assert(s);
 +
 +    if (s->dbus_server) {
 +        dbus_server_disconnect(s->dbus_server);
 +        dbus_server_unref(s->dbus_server);
 +    }
 +
 +    pa_xfree(s);
 +}
 +
 +static struct server *start_server(struct userdata *u, const char *address, enum server_type type) {
 +    /* XXX: We assume that when we unref the DBusServer instance at module
 +     * shutdown, nobody else holds any references to it. If we stop assuming
 +     * that someday, dbus_server_set_new_connection_function,
 +     * dbus_server_set_watch_functions and dbus_server_set_timeout_functions
 +     * calls should probably register free callbacks, instead of providing NULL
 +     * as they do now. */
 +
 +    struct server *s = NULL;
 +    DBusError error;
 +
 +    pa_assert(u);
 +    pa_assert(address);
 +
 +    dbus_error_init(&error);
 +
 +    s = pa_xnew0(struct server, 1);
 +    s->userdata = u;
 +    s->dbus_server = dbus_server_listen(address, &error);
 +
 +    if (dbus_error_is_set(&error)) {
 +        pa_log("dbus_server_listen() failed: %s: %s", error.name, error.message);
 +        goto fail;
 +    }
 +
 +    dbus_server_set_new_connection_function(s->dbus_server, connection_new_cb, s, NULL);
 +
 +    if (!dbus_server_set_watch_functions(s->dbus_server, watch_add_cb, watch_remove_cb, watch_toggled_cb, s, NULL)) {
 +        pa_log("dbus_server_set_watch_functions() ran out of memory.");
 +        goto fail;
 +    }
 +
 +    if (!dbus_server_set_timeout_functions(s->dbus_server, timeout_add_cb, timeout_remove_cb, timeout_toggled_cb, s, NULL)) {
 +        pa_log("dbus_server_set_timeout_functions() ran out of memory.");
 +        goto fail;
 +    }
 +
 +    return s;
 +
 +fail:
 +    if (s)
 +        server_free(s);
 +
 +    dbus_error_free(&error);
 +
 +    return NULL;
 +}
 +
 +static struct server *start_local_server(struct userdata *u) {
 +    struct server *s = NULL;
 +    char *address = NULL;
 +
 +    pa_assert(u);
 +
 +    address = pa_get_dbus_address_from_server_type(u->module->core->server_type);
 +
 +    s = start_server(u, address, SERVER_TYPE_LOCAL); /* May return NULL */
 +
 +    pa_xfree(address);
 +
 +    return s;
 +}
 +
 +static struct server *start_tcp_server(struct userdata *u) {
 +    struct server *s = NULL;
 +    char *address = NULL;
 +
 +    pa_assert(u);
 +
 +    address = pa_sprintf_malloc("tcp:host=127.0.0.1,port=%u", u->tcp_port);
 +
 +    s = start_server(u, address, SERVER_TYPE_TCP); /* May return NULL */
 +
 +    pa_xfree(address);
 +
 +    return s;
 +}
 +
 +static int get_access_arg(pa_modargs *ma, pa_bool_t *local_access, pa_bool_t *remote_access) {
 +    const char *value = NULL;
 +
 +    pa_assert(ma);
 +    pa_assert(local_access);
 +    pa_assert(remote_access);
 +
 +    if (!(value = pa_modargs_get_value(ma, "access", NULL)))
 +        return 0;
 +
 +    if (!strcmp(value, "local")) {
 +        *local_access = TRUE;
 +        *remote_access = FALSE;
 +    } else if (!strcmp(value, "remote")) {
 +        *local_access = FALSE;
 +        *remote_access = TRUE;
 +    } else if (!strcmp(value, "local,remote")) {
 +        *local_access = TRUE;
 +        *remote_access = TRUE;
 +    } else
 +        return -1;
 +
 +    return 0;
 +}
 +
 +/* Frees dead client connections. Called every CLEANUP_INTERVAL seconds. */
 +static void cleanup_cb(pa_mainloop_api *a, pa_time_event *e, const struct timeval *tv, void *userdata) {
 +    struct userdata *u = userdata;
 +    struct connection *conn = NULL;
 +    uint32_t idx;
 +    struct timeval cleanup_timeval;
 +    unsigned free_count = 0;
 +
 +    for (conn = pa_idxset_first(u->connections, &idx); conn; conn = pa_idxset_next(u->connections, &idx)) {
 +        if (!dbus_connection_get_is_connected(pa_dbus_wrap_connection_get(conn->wrap_conn))) {
 +            connection_free(conn);
 +            ++free_count;
 +        }
 +    }
 +
 +    if (free_count > 0)
 +        pa_log_debug("Freed %u dead D-Bus client connections.", free_count);
 +
 +    pa_gettimeofday(&cleanup_timeval);
 +    cleanup_timeval.tv_sec += CLEANUP_INTERVAL;
 +    u->module->core->mainloop->time_restart(e, &cleanup_timeval);
 +}
 +
 +int pa__init(pa_module *m) {
 +    struct userdata *u = NULL;
 +    pa_modargs *ma = NULL;
 +    struct timeval cleanup_timeval;
 +
 +    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;
 +    u->local_access = TRUE;
 +    u->remote_access = FALSE;
 +    u->tcp_port = PA_DBUS_DEFAULT_PORT;
 +
 +    if (get_access_arg(ma, &u->local_access, &u->remote_access) < 0) {
 +        pa_log("Invalid access argument: '%s'", pa_modargs_get_value(ma, "access", NULL));
 +        goto fail;
 +    }
 +
 +    if (pa_modargs_get_value_u32(ma, "tcp_port", &u->tcp_port) < 0 || u->tcp_port < 1 || u->tcp_port > 49150) {
 +        pa_log("Invalid tcp_port argument: '%s'", pa_modargs_get_value(ma, "tcp_port", NULL));
 +        goto fail;
 +    }
 +
 +    if (u->local_access && !(u->local_server = start_local_server(u))) {
 +        pa_log("Starting the local D-Bus server failed.");
 +        goto fail;
 +    }
 +
 +    if (u->remote_access && !(u->tcp_server = start_tcp_server(u))) {
 +        pa_log("Starting the D-Bus server for remote connections failed.");
 +        goto fail;
 +    }
 +
 +    u->connections = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
 +
 +    pa_gettimeofday(&cleanup_timeval);
 +    cleanup_timeval.tv_sec += CLEANUP_INTERVAL;
 +    u->cleanup_event = m->core->mainloop->time_new(m->core->mainloop, &cleanup_timeval, cleanup_cb, u);
 +
 +    u->core_object = pa_dbusobj_core_new(m->core);
 +
 +    return 0;
 +
 +fail:
 +    if (ma)
 +        pa_modargs_free(ma);
 +
 +    pa__done(m);
 +
 +    return -1;
 +}
 +
 +/* Called by idxset when the connection set is freed. */
 +static void connection_free_cb(void *p, void *userdata) {
 +    struct connection *conn = p;
 +
 +    pa_assert(conn);
 +
 +    connection_free(conn);
 +}
 +
 +void pa__done(pa_module *m) {
 +    struct userdata *u;
 +
 +    pa_assert(m);
 +
 +    if (!(u = m->userdata))
 +        return;
 +
 +    if (u->core_object)
 +        pa_dbusobj_core_free(u->core_object);
 +
 +    if (u->cleanup_event)
 +        m->core->mainloop->time_free(u->cleanup_event);
 +
 +    if (u->connections)
 +        pa_idxset_free(u->connections, connection_free_cb, NULL);
 +
 +    if (u->tcp_server)
 +        server_free(u->tcp_server);
 +
 +    if (u->local_server)
 +        server_free(u->local_server);
 +
 +    pa_xfree(u);
 +    m->userdata = NULL;
 +}
diff --cc src/pulsecore/dbus-util.c
index d8bd0e0,4e6148f..e047dc3
--- a/src/pulsecore/dbus-util.c
+++ b/src/pulsecore/dbus-util.c
@@@ -276,27 -290,6 +290,28 @@@ pa_dbus_wrap_connection* pa_dbus_wrap_c
      return pconn;
  }
  
- pa_dbus_wrap_connection* pa_dbus_wrap_connection_new_from_existing(pa_mainloop_api *m, DBusConnection *conn) {
++pa_dbus_wrap_connection* pa_dbus_wrap_connection_new_from_existing(pa_mainloop_api *m, pa_bool_t use_rtclock, DBusConnection *conn) {
 +    pa_dbus_wrap_connection *pconn;
 +
 +    pa_assert(m);
 +    pa_assert(conn);
 +
 +    pconn = pa_xnew(pa_dbus_wrap_connection, 1);
 +    pconn->mainloop = m;
 +    pconn->connection = dbus_connection_ref(conn);
++    pconn->use_rtclock = use_rtclock;
 +
 +    dbus_connection_set_exit_on_disconnect(conn, FALSE);
 +    dbus_connection_set_dispatch_status_function(conn, dispatch_status, pconn, NULL);
 +    dbus_connection_set_watch_functions(conn, add_watch, remove_watch, toggle_watch, pconn, NULL);
 +    dbus_connection_set_timeout_functions(conn, add_timeout, remove_timeout, toggle_timeout, pconn, NULL);
 +    dbus_connection_set_wakeup_main_function(conn, wakeup_main, pconn, NULL);
 +
 +    pconn->dispatch_event = pconn->mainloop->defer_new(pconn->mainloop, dispatch_cb, conn);
 +
 +    return pconn;
 +}
 +
  void pa_dbus_wrap_connection_free(pa_dbus_wrap_connection* c) {
      pa_assert(c);
  
diff --cc src/pulsecore/dbus-util.h
index cd08485,9ff298d..9732873
--- a/src/pulsecore/dbus-util.h
+++ b/src/pulsecore/dbus-util.h
@@@ -30,8 -30,7 +30,8 @@@
  /* A wrap connection is not shared or refcounted, it is available in client side */
  typedef struct pa_dbus_wrap_connection pa_dbus_wrap_connection;
  
- pa_dbus_wrap_connection* pa_dbus_wrap_connection_new(pa_mainloop_api *mainloop, DBusBusType type, DBusError *error);
- pa_dbus_wrap_connection* pa_dbus_wrap_connection_new_from_existing(pa_mainloop_api *mainloop, DBusConnection *conn);
+ pa_dbus_wrap_connection* pa_dbus_wrap_connection_new(pa_mainloop_api *mainloop, pa_bool_t use_rtclock, DBusBusType type, DBusError *error);
++pa_dbus_wrap_connection* pa_dbus_wrap_connection_new_from_existing(pa_mainloop_api *mainloop, pa_bool_t use_rtclock, DBusConnection *conn);
  void pa_dbus_wrap_connection_free(pa_dbus_wrap_connection* conn);
  
  DBusConnection* pa_dbus_wrap_connection_get(pa_dbus_wrap_connection *conn);

commit c266595058416b4b776890dadf3ad827787f4e7e
Merge: 0bc538b 1ca7603
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Jun 29 18:55:12 2009 +0300

    Merge branch 'master' into dbus-work


commit 3bff2eee4bf02ff3bc2619079c3c5fe8a07040a9
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Tue Jun 30 15:18:11 2009 +0300

    module-cli: Fix compilation by adding libpulsecommon to module_cli_la_LIBADD.

diff --git a/src/Makefile.am b/src/Makefile.am
index 6cddb83..5866889 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1250,7 +1250,7 @@ module_simple_protocol_unix_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINOR
 
 module_cli_la_SOURCES = modules/module-cli.c
 module_cli_la_LDFLAGS = $(MODULE_LDFLAGS)
-module_cli_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINORMICRO@.la libcli.la
+module_cli_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINORMICRO@.la libcli.la libpulsecommon- at PA_MAJORMINORMICRO@.la
 
 module_cli_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c
 module_cli_protocol_tcp_la_CFLAGS = -DUSE_TCP_SOCKETS -DUSE_PROTOCOL_CLI $(AM_CFLAGS)

commit 6e2fec05ddd38fa460276202ca2f4ecf68761ed0
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Tue Jun 30 15:21:20 2009 +0300

    server-lookup: Update the D-Bus identifiers to be versioned.

diff --git a/src/daemon/main.c b/src/daemon/main.c
index 61b0c84..d320c9e 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -943,7 +943,7 @@ int main(int argc, char *argv[]) {
     if (!conf->system_instance) {
         if (!(server_lookup = pa_dbusobj_server_lookup_new(c)))
             goto finish;
-        if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.pulseaudio.PulseAudio")))
+        if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.pulseaudio.PulseAudio1")))
             goto finish;
     }
 
diff --git a/src/daemon/server-lookup.c b/src/daemon/server-lookup.c
index 33d6b24..7c80d67 100644
--- a/src/daemon/server-lookup.c
+++ b/src/daemon/server-lookup.c
@@ -36,6 +36,9 @@
 
 #include "server-lookup.h"
 
+#define OBJECT_PATH "/org/pulseaudio1/server_lookup"
+#define INTERFACE "org.pulseaudio.ServerLookup1"
+
 struct pa_dbusobj_server_lookup {
     pa_core *core;
     pa_dbus_connection *conn;
@@ -47,7 +50,7 @@ static const char introspection[] =
     "<node>"
     " <!-- If you are looking for documentation make sure to check out\n"
     "      http://pulseaudio.org/wiki/DBusInterface -->\n"
-    " <interface name=\"org.pulseaudio.ServerLookup\">"
+    " <interface name=\"" INTERFACE "\">"
     "  <method name=\"GetAddress\">"
     "   <arg name=\"result\" type=\"s\" direction=\"out\"/>"
     "  </method>"
@@ -182,7 +185,7 @@ static DBusHandlerResult message_cb(DBusConnection *conn, DBusMessage *msg, void
     if (dbus_message_is_method_call(msg, "org.freedesktop.DBus.Introspectable", "Introspect"))
         return handle_introspect(conn, msg, sl);
 
-    if (dbus_message_is_method_call(msg, "org.pulseaudio.ServerLookup", "GetAddress"))
+    if (dbus_message_is_method_call(msg, INTERFACE, "GetAddress"))
         return handle_get_address(conn, msg, sl);
 
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
@@ -212,8 +215,8 @@ pa_dbusobj_server_lookup *pa_dbusobj_server_lookup_new(pa_core *c) {
         goto fail;
     }
 
-    if (!dbus_connection_register_object_path(pa_dbus_connection_get(sl->conn), "/org/pulseaudio/server_lookup", &vtable, sl)) {
-        pa_log("dbus_connection_register_object_path() failed for /org/pulseaudio/server_lookup.");
+    if (!dbus_connection_register_object_path(pa_dbus_connection_get(sl->conn), OBJECT_PATH, &vtable, sl)) {
+        pa_log("dbus_connection_register_object_path() failed for " OBJECT_PATH ".");
         goto fail;
     }
 
@@ -234,8 +237,8 @@ void pa_dbusobj_server_lookup_free(pa_dbusobj_server_lookup *sl) {
 
     if (sl->path_registered) {
         pa_assert(sl->conn);
-        if (!dbus_connection_unregister_object_path(pa_dbus_connection_get(sl->conn), "/org/pulseaudio/server_lookup"))
-            pa_log_debug("dbus_connection_unregister_object_path() failed for /org/pulseaudio/server_lookup.");
+        if (!dbus_connection_unregister_object_path(pa_dbus_connection_get(sl->conn), OBJECT_PATH))
+            pa_log_debug("dbus_connection_unregister_object_path() failed for " OBJECT_PATH ".");
     }
 
     if (sl->conn)

commit 5c7952e4fa5e560f64255ef173c3e6570bee433a
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Fri Jul 3 02:49:07 2009 +0300

    dbus: Implement the Name property of the core object.

diff --git a/src/daemon/main.c b/src/daemon/main.c
index d320c9e..f420985 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -943,7 +943,7 @@ int main(int argc, char *argv[]) {
     if (!conf->system_instance) {
         if (!(server_lookup = pa_dbusobj_server_lookup_new(c)))
             goto finish;
-        if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.pulseaudio.PulseAudio1")))
+        if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.PulseAudio1")))
             goto finish;
     }
 
diff --git a/src/daemon/server-lookup.c b/src/daemon/server-lookup.c
index 7c80d67..ebacc09 100644
--- a/src/daemon/server-lookup.c
+++ b/src/daemon/server-lookup.c
@@ -37,7 +37,7 @@
 #include "server-lookup.h"
 
 #define OBJECT_PATH "/org/pulseaudio1/server_lookup"
-#define INTERFACE "org.pulseaudio.ServerLookup1"
+#define INTERFACE "org.PulseAudio.ServerLookup1"
 
 struct pa_dbusobj_server_lookup {
     pa_core *core;
@@ -50,17 +50,31 @@ static const char introspection[] =
     "<node>"
     " <!-- If you are looking for documentation make sure to check out\n"
     "      http://pulseaudio.org/wiki/DBusInterface -->\n"
-    " <interface name=\"" INTERFACE "\">"
-    "  <method name=\"GetAddress\">"
-    "   <arg name=\"result\" type=\"s\" direction=\"out\"/>"
-    "  </method>"
-    " </interface>"
-    " <interface name=\"org.freedesktop.DBus.Introspectable\">"
-    "  <method name=\"Introspect\">"
-    "   <arg name=\"data\" type=\"s\" direction=\"out\"/>"
-    "  </method>"
-    " </interface>"
-    "</node>";
+    " <interface name=\"" INTERFACE "\">\n"
+    "  <property name=\"Address\" type=\"s\" access=\"read\"/>\n"
+    " </interface>\n"
+    " <interface name=\"" DBUS_INTERFACE_INTROSPECTABLE "\">\n"
+    "  <method name=\"Introspect\">\n"
+    "   <arg name=\"data\" type=\"s\" direction=\"out\"/>\n"
+    "  </method>\n"
+    " </interface>\n"
+    " <interface name=\"" DBUS_INTERFACE_PROPERTIES "\">\n"
+    "  <method name=\"Get\">\n"
+    "   <arg name=\"interface_name\" type=\"s\" direction=\"in\"/>\n"
+    "   <arg name=\"property_name\" type=\"s\" direction=\"in\"/>\n"
+    "   <arg name=\"value\" type=\"v\" direction=\"out\"/>\n"
+    "  </method>\n"
+    "  <method name=\"Set\">\n"
+    "   <arg name=\"interface_name\" type=\"s\" direction=\"in\"/>\n"
+    "   <arg name=\"property_name\" type=\"s\" direction=\"in\"/>\n"
+    "   <arg name=\"value\" type=\"v\" direction=\"in\"/>\n"
+    "  </method>\n"
+    "  <method name=\"GetAll\">\n"
+    "   <arg name=\"interface_name\" type=\"s\" direction=\"in\"/>\n"
+    "   <arg name=\"props\" type=\"a{sv}\" direction=\"out\"/>\n"
+    "  </method>\n"
+    " </interface>\n"
+    "</node>\n";
 
 static void unregister_cb(DBusConnection *conn, void *user_data) {
     pa_dbusobj_server_lookup *sl = user_data;
@@ -72,105 +86,352 @@ static void unregister_cb(DBusConnection *conn, void *user_data) {
 }
 
 static DBusHandlerResult handle_introspect(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) {
+    DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED;
     const char *i = introspection;
     DBusMessage *reply = NULL;
 
     pa_assert(conn);
     pa_assert(msg);
 
-    if (!(reply = dbus_message_new_method_return(msg)))
-        goto fail;
+    if (!(reply = dbus_message_new_method_return(msg))) {
+        r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        goto finish;
+    }
+    if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &i, DBUS_TYPE_INVALID)) {
+        r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        goto finish;
+    }
+    if (!dbus_connection_send(conn, reply, NULL)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
 
-    if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &i, DBUS_TYPE_INVALID))
-        goto fail;
+finish:
+    if (reply)
+        dbus_message_unref(reply);
 
-    if (!dbus_connection_send(conn, reply, NULL))
-        goto oom;
+    return r;
+}
 
-    dbus_message_unref(reply);
+enum get_address_result_t {
+    SUCCESS,
+    FAILED_TO_LOAD_CLIENT_CONF,
+    SERVER_FROM_TYPE_FAILED
+};
 
-    return DBUS_HANDLER_RESULT_HANDLED;
+/* Caller frees the returned address. */
+static enum get_address_result_t get_address(pa_server_type_t server_type, char **address) {
+    enum get_address_result_t r = SUCCESS;
+    pa_client_conf *conf = pa_client_conf_new();
 
-fail:
-    if (reply)
-        dbus_message_unref(reply);
+    *address = NULL;
 
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    if (pa_client_conf_load(conf, NULL) < 0) {
+        r = FAILED_TO_LOAD_CLIENT_CONF;
+        goto finish;
+    }
 
-oom:
-    if (reply)
-        dbus_message_unref(reply);
+    if (conf->default_dbus_server)
+        *address = pa_xstrdup(conf->default_dbus_server);
+    else if (!(*address = pa_get_dbus_address_from_server_type(server_type))) {
+        r = SERVER_FROM_TYPE_FAILED;
+        goto finish;
+    }
 
-    return DBUS_HANDLER_RESULT_NEED_MEMORY;
+finish:
+    pa_client_conf_free(conf);
+    return r;
 }
 
 static DBusHandlerResult handle_get_address(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) {
+    DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED;
     DBusMessage *reply = NULL;
-    pa_client_conf *conf = NULL;
     char *address = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter variant_iter;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(sl);
 
-    conf = pa_client_conf_new();
+    switch (get_address(sl->core->server_type, &address)) {
+        case SUCCESS:
+            if (!(reply = dbus_message_new_method_return(msg))) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            dbus_message_iter_init_append(reply, &msg_iter);
+            if (!dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_VARIANT, "s", &variant_iter)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            if (!dbus_message_iter_append_basic(&variant_iter, DBUS_TYPE_STRING, &address)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            if (!dbus_message_iter_close_container(&msg_iter, &variant_iter)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            if (!dbus_connection_send(conn, reply, NULL)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            r = DBUS_HANDLER_RESULT_HANDLED;
+            goto finish;
+
+        case FAILED_TO_LOAD_CLIENT_CONF:
+            if (!(reply = dbus_message_new_error(msg, "org.pulseaudio.ClientConfLoadError", "Failed to load client.conf."))) {
+                r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+                goto finish;
+            }
+            if (!dbus_connection_send(conn, reply, NULL)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            r = DBUS_HANDLER_RESULT_HANDLED;
+            goto finish;
+
+        case SERVER_FROM_TYPE_FAILED:
+            if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_FAILED, "PulseAudio internal error: get_dbus_server_from_type() failed."))) {
+                r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+                goto finish;
+            }
+            if (!dbus_connection_send(conn, reply, NULL)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            r = DBUS_HANDLER_RESULT_HANDLED;
+            goto finish;
+
+        default:
+            pa_assert_not_reached();
+    }
 
-    if (pa_client_conf_load(conf, NULL) < 0) {
-        if (!(reply = dbus_message_new_error(msg, "org.pulseaudio.ClientConfLoadError", "Failed to load client.conf.")))
-            goto fail;
-        if (!dbus_connection_send(conn, reply, NULL))
-            goto oom;
-        return DBUS_HANDLER_RESULT_HANDLED;
-    }
-
-    if (conf->default_dbus_server) {
-        address = pa_xstrdup(conf->default_dbus_server);
-    } else {
-        if (!(address = pa_get_dbus_address_from_server_type(sl->core->server_type))) {
-            if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_FAILED, "PulseAudio internal error: get_dbus_server_from_type() failed.")))
-                goto fail;
-            if (!dbus_connection_send(conn, reply, NULL))
-                goto oom;
-            return DBUS_HANDLER_RESULT_HANDLED;
+finish:
+    pa_xfree(address);
+    if (reply)
+        dbus_message_unref(reply);
+
+    return r;
+}
+
+static DBusHandlerResult handle_get(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) {
+    DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED;
+    const char* interface;
+    const char* property;
+    DBusMessage *reply = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(sl);
+
+    if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID)) {
+        if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, "Invalid arguments"))) {
+            r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+            goto finish;
+        }
+        if (!dbus_connection_send(conn, reply, NULL)) {
+            r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+            goto finish;
         }
+        r = DBUS_HANDLER_RESULT_HANDLED;
+        goto finish;
     }
 
-    if (!(reply = dbus_message_new_method_return(msg)))
-        goto oom;
+    if (*interface && !pa_streq(interface, INTERFACE)) {
+        r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        goto finish;
+    }
 
-    if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &address, DBUS_TYPE_INVALID))
-        goto fail;
+    if (!pa_streq(property, "Address")) {
+        if (!(reply = dbus_message_new_error_printf(msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s: No such property", property))) {
+            r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+            goto finish;
+        }
+        if (!dbus_connection_send(conn, reply, NULL)) {
+            r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+            goto finish;
+        }
+        r = DBUS_HANDLER_RESULT_HANDLED;
+        goto finish;
+    }
 
-    if (!dbus_connection_send(conn, reply, NULL))
-        goto oom;
+    r = handle_get_address(conn, msg, sl);
 
-    pa_client_conf_free(conf);
-    pa_xfree(address);
-    dbus_message_unref(reply);
+finish:
+    if (reply)
+        dbus_message_unref(reply);
 
-    return DBUS_HANDLER_RESULT_HANDLED;
+    return r;
+}
 
-fail:
-    if (conf)
-        pa_client_conf_free(conf);
+static DBusHandlerResult handle_set(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) {
+    DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED;
+    const char* interface;
+    const char* property;
+    DBusMessage *reply = NULL;
 
-    pa_xfree(address);
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(sl);
+
+    if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID)) {
+        if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, "Invalid arguments"))) {
+            r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+            goto finish;
+        }
+        if (!dbus_connection_send(conn, reply, NULL)) {
+            r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+            goto finish;
+        }
+        r = DBUS_HANDLER_RESULT_HANDLED;
+        goto finish;
+    }
+
+    if (*interface && !pa_streq(interface, INTERFACE)) {
+        r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        goto finish;
+    }
+
+    if (!pa_streq(property, "Address")) {
+        if (!(reply = dbus_message_new_error_printf(msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s: No such property", property))) {
+            r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+            goto finish;
+        }
+        if (!dbus_connection_send(conn, reply, NULL)) {
+            r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+            goto finish;
+        }
+        r = DBUS_HANDLER_RESULT_HANDLED;
+        goto finish;
+    }
+
+    if (!(reply = dbus_message_new_error_printf(msg, DBUS_ERROR_ACCESS_DENIED, "%s: Property not settable", property))) {
+        r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        goto finish;
+    }
+    if (!dbus_connection_send(conn, reply, NULL)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    r = DBUS_HANDLER_RESULT_HANDLED;
 
+finish:
     if (reply)
         dbus_message_unref(reply);
 
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    return r;
+}
 
-oom:
-    if (conf)
-        pa_client_conf_free(conf);
+static DBusHandlerResult handle_get_all(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_server_lookup *sl) {
+    DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED;
+    DBusMessage *reply = NULL;
+    const char *property = "Address";
+    char *interface = NULL;
+    char *address = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+    DBusMessageIter dict_entry_iter;
+    DBusMessageIter variant_iter;
 
-    pa_xfree(address);
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(sl);
 
+    if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID)) {
+        if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, "Invalid arguments"))) {
+            r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+            goto finish;
+        }
+        if (!dbus_connection_send(conn, reply, NULL)) {
+            r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+            goto finish;
+        }
+        r = DBUS_HANDLER_RESULT_HANDLED;
+        goto finish;
+    }
+
+    switch (get_address(sl->core->server_type, &address)) {
+        case SUCCESS:
+            if (!(reply = dbus_message_new_method_return(msg))) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            dbus_message_iter_init_append(reply, &msg_iter);
+            if (!dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            if (!dbus_message_iter_open_container(&dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            if (!dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &property)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            if (!dbus_message_iter_open_container(&dict_entry_iter, DBUS_TYPE_VARIANT, "s", &variant_iter)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            if (!dbus_message_iter_append_basic(&variant_iter, DBUS_TYPE_STRING, &address)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            if (!dbus_message_iter_close_container(&dict_entry_iter, &variant_iter)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            if (!dbus_message_iter_close_container(&dict_iter, &dict_entry_iter)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            if (!dbus_message_iter_close_container(&msg_iter, &dict_iter)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            if (!dbus_connection_send(conn, reply, NULL)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            r = DBUS_HANDLER_RESULT_HANDLED;
+            goto finish;
+
+        case FAILED_TO_LOAD_CLIENT_CONF:
+            if (!(reply = dbus_message_new_error(msg, "org.pulseaudio.ClientConfLoadError", "Failed to load client.conf."))) {
+                r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+                goto finish;
+            }
+            if (!dbus_connection_send(conn, reply, NULL)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            r = DBUS_HANDLER_RESULT_HANDLED;
+            goto finish;
+
+        case SERVER_FROM_TYPE_FAILED:
+            if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_FAILED, "PulseAudio internal error: get_dbus_server_from_type() failed."))) {
+                r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+                goto finish;
+            }
+            if (!dbus_connection_send(conn, reply, NULL)) {
+                r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+                goto finish;
+            }
+            r = DBUS_HANDLER_RESULT_HANDLED;
+            goto finish;
+
+        default:
+            pa_assert_not_reached();
+    }
+
+finish:
+    pa_xfree(address);
     if (reply)
         dbus_message_unref(reply);
 
-    return DBUS_HANDLER_RESULT_NEED_MEMORY;
+    return r;
 }
 
 static DBusHandlerResult message_cb(DBusConnection *conn, DBusMessage *msg, void *user_data) {
@@ -182,11 +443,24 @@ static DBusHandlerResult message_cb(DBusConnection *conn, DBusMessage *msg, void
 
     /* pa_log("Got message! type = %s   path = %s   iface = %s   member = %s   dest = %s", dbus_message_type_to_string(dbus_message_get_type(msg)), dbus_message_get_path(msg), dbus_message_get_interface(msg), dbus_message_get_member(msg), dbus_message_get_destination(msg)); */
 
-    if (dbus_message_is_method_call(msg, "org.freedesktop.DBus.Introspectable", "Introspect"))
+    if (dbus_message_get_type(msg) != DBUS_MESSAGE_TYPE_METHOD_CALL)
+        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+    if (dbus_message_is_method_call(msg, DBUS_INTERFACE_INTROSPECTABLE, "Introspect") ||
+        (!dbus_message_get_interface(msg) && dbus_message_has_member(msg, "Introspect")))
         return handle_introspect(conn, msg, sl);
 
-    if (dbus_message_is_method_call(msg, INTERFACE, "GetAddress"))
-        return handle_get_address(conn, msg, sl);
+    if (dbus_message_is_method_call(msg, DBUS_INTERFACE_PROPERTIES, "Get") ||
+        (!dbus_message_get_interface(msg) && dbus_message_has_member(msg, "Get")))
+        return handle_get(conn, msg, sl);
+
+    if (dbus_message_is_method_call(msg, DBUS_INTERFACE_PROPERTIES, "Set") ||
+        (!dbus_message_get_interface(msg) && dbus_message_has_member(msg, "Set")))
+        return handle_set(conn, msg, sl);
+
+    if (dbus_message_is_method_call(msg, DBUS_INTERFACE_PROPERTIES, "GetAll") ||
+        (!dbus_message_get_interface(msg) && dbus_message_has_member(msg, "GetAll")))
+        return handle_get_all(conn, msg, sl);
 
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
diff --git a/src/pulsecore/dbus-common.c b/src/pulsecore/dbus-common.c
index 350add8..6562cda 100644
--- a/src/pulsecore/dbus-common.c
+++ b/src/pulsecore/dbus-common.c
@@ -48,6 +48,7 @@ struct object_entry {
 
 struct interface_entry {
     char *name;
+    char **properties;
     char **methods;
     char *introspection_snippet;
     DBusObjectPathMessageFunction receive;
@@ -106,48 +107,152 @@ static void update_introspection(struct object_entry *oe) {
 
     buf = pa_strbuf_new();
     pa_strbuf_puts(buf, DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE);
-    pa_strbuf_puts(buf, "<node>");
+    pa_strbuf_puts(buf, "<node>\n");
 
     while ((iface_entry = pa_hashmap_iterate(oe->interfaces, &state, NULL)))
         pa_strbuf_puts(buf, iface_entry->introspection_snippet);
 
-    pa_strbuf_puts(buf, " <interface name=\"org.freedesktop.DBus.Introspectable\">"
-                        "  <method name=\"Introspect\">"
-                        "   <arg name=\"data\" type=\"s\" direction=\"out\"/>"
-                        "  </method>"
-                        " </interface>");
-
-    pa_strbuf_puts(buf, "</node>");
+    pa_strbuf_puts(buf, " <interface name=\"" DBUS_INTERFACE_INTROSPECTABLE "\">\n"
+                        "  <method name=\"Introspect\">\n"
+                        "   <arg name=\"data\" type=\"s\" direction=\"out\"/>\n"
+                        "  </method>\n"
+                        " </interface>\n"
+                        " <interface name=\"" DBUS_INTERFACE_PROPERTIES "\">\n"
+                        "  <method name=\"Get\">\n"
+                        "   <arg name=\"interface_name\" type=\"s\" direction=\"in\"/>\n"
+                        "   <arg name=\"property_name\" type=\"s\" direction=\"in\"/>\n"
+                        "   <arg name=\"value\" type=\"v\" direction=\"out\"/>\n"
+                        "  </method>\n"
+                        "  <method name=\"Set\">\n"
+                        "   <arg name=\"interface_name\" type=\"s\" direction=\"in\"/>\n"
+                        "   <arg name=\"property_name\" type=\"s\" direction=\"in\"/>\n"
+                        "   <arg name=\"value\" type=\"v\" direction=\"in\"/>\n"
+                        "  </method>\n"
+                        "  <method name=\"GetAll\">\n"
+                        "   <arg name=\"interface_name\" type=\"s\" direction=\"in\"/>\n"
+                        "   <arg name=\"props\" type=\"a{sv}\" direction=\"out\"/>\n"
+                        "  </method>\n"
+                        " </interface>\n");
+
+    pa_strbuf_puts(buf, "</node>\n");
 
     pa_xfree(oe->introspection);
     oe->introspection = pa_strbuf_tostring_free(buf);
 }
 
-static struct interface_entry *find_interface(struct object_entry *obj_entry, DBusMessage *msg) {
-    const char *interface;
-    struct interface_entry *iface_entry;
+enum find_result_t {
+    SUCCESS,
+    NO_SUCH_PROPERTY,
+    NO_SUCH_METHOD,
+    INVALID_MESSAGE_ARGUMENTS
+};
+
+static enum find_result_t find_interface_by_property(struct object_entry *obj_entry, const char *property, struct interface_entry **entry) {
     void *state = NULL;
 
     pa_assert(obj_entry);
-    pa_assert(msg);
+    pa_assert(property);
+    pa_assert(entry);
+
+    while ((*entry = pa_hashmap_iterate(obj_entry->interfaces, &state, NULL))) {
+        char *iface_property;
+        char **pos = (*entry)->properties;
+
+        while ((iface_property = *pos++)) {
+            if (pa_streq(iface_property, property))
+                return SUCCESS;
+        }
+    }
+
+    return NO_SUCH_PROPERTY;
+}
 
-    if ((interface = dbus_message_get_interface(msg)))
-        return pa_hashmap_get(obj_entry->interfaces, interface);
+static enum find_result_t find_interface_by_method(struct object_entry *obj_entry, const char *method, struct interface_entry **entry) {
+    void *state = NULL;
 
-    /* NULL interface, we'll have to search for an interface that contains the
-     * method. */
+    pa_assert(obj_entry);
+    pa_assert(method);
+    pa_assert(entry);
 
-    while ((iface_entry = pa_hashmap_iterate(obj_entry->interfaces, &state, NULL))) {
-        char *method;
-        char **pos = iface_entry->methods;
+    while ((*entry = pa_hashmap_iterate(obj_entry->interfaces, &state, NULL))) {
+        char *iface_method;
+        char **pos = (*entry)->methods;
 
-        while ((method = *pos++)) {
-            if (!strcmp(dbus_message_get_member(msg), method))
-                return iface_entry;
+        while ((iface_method = *pos++)) {
+            if (pa_streq(iface_method, method))
+                return SUCCESS;
         }
     }
 
-    return NULL;
+    return NO_SUCH_METHOD;
+}
+
+static enum find_result_t find_interface_from_properties_call(struct object_entry *obj_entry, DBusMessage *msg, struct interface_entry **entry) {
+    const char *interface;
+    const char *property;
+
+    pa_assert(obj_entry);
+    pa_assert(msg);
+    pa_assert(entry);
+
+    if (dbus_message_has_member(msg, "GetAll")) {
+        if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID))
+            return INVALID_MESSAGE_ARGUMENTS;
+
+        if (*interface) {
+            if ((*entry = pa_hashmap_get(obj_entry->interfaces, interface)))
+                return SUCCESS;
+            else
+                return NO_SUCH_METHOD;
+        } else {
+            pa_assert_se((*entry = pa_hashmap_first(obj_entry->interfaces)));
+            return SUCCESS;
+        }
+    } else {
+        pa_assert(dbus_message_has_member(msg, "Get") || dbus_message_has_member(msg, "Set"));
+
+        if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID))
+            return INVALID_MESSAGE_ARGUMENTS;
+
+        if (*interface) {
+            if ((*entry = pa_hashmap_get(obj_entry->interfaces, interface)))
+                return SUCCESS;
+            else
+                return NO_SUCH_METHOD;
+        } else
+            return find_interface_by_property(obj_entry, property, entry);
+    }
+}
+
+static enum find_result_t find_interface(struct object_entry *obj_entry, DBusMessage *msg, struct interface_entry **entry) {
+    const char *interface;
+
+    pa_assert(obj_entry);
+    pa_assert(msg);
+    pa_assert(entry);
+
+    *entry = NULL;
+
+    if (dbus_message_has_interface(msg, DBUS_INTERFACE_PROPERTIES))
+        return find_interface_from_properties_call(obj_entry, msg, entry);
+
+    else if ((interface = dbus_message_get_interface(msg))) {
+        if ((*entry = pa_hashmap_get(obj_entry->interfaces, interface)))
+            return SUCCESS;
+        else
+            return NO_SUCH_METHOD;
+
+    } else { /* The method call doesn't contain an interface. */
+        if (dbus_message_has_member(msg, "Get") || dbus_message_has_member(msg, "Set") || dbus_message_has_member(msg, "GetAll")) {
+            if (find_interface_by_method(obj_entry, dbus_message_get_member(msg), entry) == SUCCESS)
+                return SUCCESS; /* The object has a method named Get, Set or GetAll in some other interface than .Properties. */
+            else
+                /* Assume this is a .Properties call. */
+                return find_interface_from_properties_call(obj_entry, msg, entry);
+
+        } else /* This is not a .Properties call. */
+            return find_interface_by_method(obj_entry, dbus_message_get_member(msg), entry);
+    }
 }
 
 static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessage *message, void *user_data) {
@@ -166,7 +271,8 @@ static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessa
 
     pa_assert_se((obj_entry = pa_hashmap_get(dbus_state->objects, dbus_message_get_path(message))));
 
-    if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Introspectable", "Introspect")) {
+    if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Introspectable", "Introspect") ||
+        (!dbus_message_get_interface(message) && dbus_message_has_member(message, "Introspect"))) {
         if (!(reply = dbus_message_new_method_return(message)))
             goto oom;
 
@@ -183,10 +289,38 @@ static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessa
         return DBUS_HANDLER_RESULT_HANDLED;
     }
 
-    if (!(iface_entry = find_interface(obj_entry, message)))
-        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    switch (find_interface(obj_entry, message, &iface_entry)) {
+        case SUCCESS:
+            return iface_entry->receive(connection, message, iface_entry->userdata);
+
+        case NO_SUCH_PROPERTY:
+            if (!(reply = dbus_message_new_error(message, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "No such property")))
+                goto fail;
 
-    return iface_entry->receive(connection, message, iface_entry->userdata);
+            if (!dbus_connection_send(connection, reply, NULL))
+                goto oom;
+
+            dbus_message_unref(reply);
+
+            return DBUS_HANDLER_RESULT_HANDLED;
+
+        case NO_SUCH_METHOD:
+            return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+        case INVALID_MESSAGE_ARGUMENTS:
+            if (!(reply = dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS, "Invalid arguments")))
+                goto fail;
+
+            if (!dbus_connection_send(connection, reply, NULL))
+                goto oom;
+
+            dbus_message_unref(reply);
+
+            return DBUS_HANDLER_RESULT_HANDLED;
+
+        default:
+            pa_assert_not_reached();
+    }
 
 fail:
     if (reply)
@@ -226,23 +360,30 @@ static void register_object(struct dbus_state *dbus_state, struct object_entry *
     }
 }
 
-static char **copy_methods(const char * const *methods) {
+static char **copy_strarray(const char * const *array) {
     unsigned n = 0;
     char **copy;
     unsigned i;
 
-    while (methods[n++])
+    while (array[n++])
         ;
 
     copy = pa_xnew0(char *, n);
 
     for (i = 0; i < n - 1; ++i)
-        copy[i] = pa_xstrdup(methods[i]);
+        copy[i] = pa_xstrdup(array[i]);
 
     return copy;
 }
 
-int pa_dbus_add_interface(pa_core *c, const char* path, const char* interface, const char * const *methods, const char* introspection_snippet, DBusObjectPathMessageFunction receive_cb, void *userdata) {
+int pa_dbus_add_interface(pa_core *c,
+                          const char* path,
+                          const char* interface,
+                          const char * const *properties,
+                          const char * const *methods,
+                          const char* introspection_snippet,
+                          DBusObjectPathMessageFunction receive_cb,
+                          void *userdata) {
     struct dbus_state *dbus_state;
     pa_hashmap *objects;
     struct object_entry *obj_entry;
@@ -283,7 +424,8 @@ int pa_dbus_add_interface(pa_core *c, const char* path, const char* interface, c
 
     iface_entry = pa_xnew(struct interface_entry, 1);
     iface_entry->name = pa_xstrdup(interface);
-    iface_entry->methods = copy_methods(methods);
+    iface_entry->properties = copy_strarray(properties);
+    iface_entry->methods = copy_strarray(methods);
     iface_entry->introspection_snippet = pa_xstrdup(introspection_snippet);
     iface_entry->receive = receive_cb;
     iface_entry->userdata = userdata;
@@ -331,13 +473,13 @@ static void unregister_object(struct dbus_state *dbus_state, struct object_entry
     }
 }
 
-static void free_methods(char **methods) {
-    char **pos = methods;
+static void free_strarray(char **array) {
+    char **pos = array;
 
     while (*pos++)
         pa_xfree(*pos);
 
-    pa_xfree(methods);
+    pa_xfree(array);
 }
 
 int pa_dbus_remove_interface(pa_core *c, const char* path, const char* interface) {
@@ -365,7 +507,8 @@ int pa_dbus_remove_interface(pa_core *c, const char* path, const char* interface
     update_introspection(obj_entry);
 
     pa_xfree(iface_entry->name);
-    free_methods(iface_entry->methods);
+    free_strarray(iface_entry->properties);
+    free_strarray(iface_entry->methods);
     pa_xfree(iface_entry->introspection_snippet);
     pa_xfree(iface_entry);
 
diff --git a/src/pulsecore/dbus-common.h b/src/pulsecore/dbus-common.h
index 23c7c22..4354c4e 100644
--- a/src/pulsecore/dbus-common.h
+++ b/src/pulsecore/dbus-common.h
@@ -28,10 +28,12 @@
 #include <pulsecore/macro.h>
 
 #define PA_DBUS_DEFAULT_PORT 24883
-#define PA_DBUS_SOCKET_NAME "dbus_socket"
+#define PA_DBUS_SOCKET_NAME "dbus-socket"
 
 #define PA_DBUS_SYSTEM_SOCKET_PATH PA_SYSTEM_RUNTIME_PATH PA_PATH_SEP PA_DBUS_SOCKET_NAME
 
+#define PA_DBUS_ERROR_NO_SUCH_PROPERTY "org.PulseAudio.Core1.NoSuchPropertyError"
+
 /* NOTE: These functions may only be called from the main thread. */
 
 /* Returns the default address of the server type in the escaped form. For
@@ -47,17 +49,27 @@ char *pa_get_dbus_address_from_server_type(pa_server_type_t server_type);
  * Introspection requests are handled automatically. For that to work, the
  * caller gives an XML snippet containing the interface introspection element.
  * All interface snippets are automatically combined to provide the final
- * introspection string.
+ * introspection string for the object.
  *
- * The introspection snippet contains the interface name and the methods, but
- * since this function doesn't do XML parsing, the interface name and the set
- * of method names have to be supplied separately. If the interface doesn't
- * contain any methods, NULL may be given as the methods parameter, otherwise
- * the methods parameter must be a NULL-terminated array of strings.
+ * The introspection snippet contains the interface name, the property names
+ * and the method namess, but since this function doesn't do XML parsing, the
+ * information needs to be given separately. Property and method names are
+ * given as a NULL-terminated array of strings. The interface name is used for
+ * message routing, and so are the property and method names too in case the
+ * client doesn't tell which interface he's trying to access; in absence of
+ * interface information from the client, the correct interface is searched
+ * based on the property or method name.
  *
  * Fails and returns a negative number if the object already has the interface
  * registered. */
-int pa_dbus_add_interface(pa_core *c, const char* path, const char* interface, const char * const *methods, const char* introspection_snippet, DBusObjectPathMessageFunction receive_cb, void *userdata);
+int pa_dbus_add_interface(pa_core *c,
+                          const char* path,
+                          const char* interface,
+                          const char * const *properties,
+                          const char * const *methods,
+                          const char* introspection_snippet,
+                          DBusObjectPathMessageFunction receive_cb,
+                          void *userdata);
 
 /* Returns a negative number if the given object doesn't have the given
  * interface registered. */
diff --git a/src/pulsecore/dbus-objs/core.c b/src/pulsecore/dbus-objs/core.c
index f59c478..18bbf78 100644
--- a/src/pulsecore/dbus-objs/core.c
+++ b/src/pulsecore/dbus-objs/core.c
@@ -27,62 +27,414 @@
 
 #include <pulse/xmalloc.h>
 
+#include <pulsecore/core-util.h>
 #include <pulsecore/dbus-common.h>
 #include <pulsecore/macro.h>
 
 #include "core.h"
 
-#define OBJECT_NAME "/org/pulseaudio/core"
-#define INTERFACE_NAME "org.pulseaudio.Core"
+#define OBJECT_PATH "/org/pulseaudio1"
+#define INTERFACE_CORE "org.PulseAudio.Core1"
 
 struct pa_dbusobj_core {
     pa_core *core;
 };
 
 static const char *introspection_snippet =
-    " <interface name=\""INTERFACE_NAME"\">"
-    "  <method name=\"Test\">"
-    "   <arg name=\"result\" type=\"s\" direction=\"out\"/>"
-    "  </method>"
-    " </interface>";
+    " <interface name=\"" INTERFACE_CORE "\">\n"
+    "  <method name=\"GetCardByName\">\n"
+    "   <arg name=\"Name\" type=\"s\" direction=\"in\"/>\n"
+    "   <arg name=\"Card\" type=\"o\" direction=\"out\"/>\n"
+    "  </method>\n"
+    "  <method name=\"GetSinkByName\">\n"
+    "   <arg name=\"Name\" type=\"s\" direction=\"in\"/>\n"
+    "   <arg name=\"Sink\" type=\"o\" direction=\"out\"/>\n"
+    "  </method>\n"
+    "  <method name=\"GetSourceByName\">\n"
+    "   <arg name=\"Name\" type=\"s\" direction=\"in\"/>\n"
+    "   <arg name=\"Source\" type=\"o\" direction=\"out\"/>\n"
+    "  </method>\n"
+    "  <method name=\"GetSampleByName\">\n"
+    "   <arg name=\"Name\" type=\"s\" direction=\"in\"/>\n"
+    "   <arg name=\"Sample\" type=\"o\" direction=\"out\"/>\n"
+    "  </method>\n"
+    "  <method name=\"UploadSample\">\n"
+    "   <arg name=\"Name\" type=\"s\" direction=\"in\"/>\n"
+    "   <arg name=\"SampleFormat\" type=\"y\" direction=\"in\"/>\n"
+    "   <arg name=\"SampleRate\" type=\"u\" direction=\"in\"/>\n"
+    "   <arg name=\"Channels\" type=\"ay\" direction=\"in\"/>\n"
+    "   <arg name=\"DefaultVolume\" type=\"au\" direction=\"in\"/>\n"
+    "   <arg name=\"Proplist\" type=\"a{say}\" direction=\"in\"/>\n"
+    "   <arg name=\"Data\" type=\"ay\" direction=\"in\"/>\n"
+    "   <arg name=\"Sample\" type=\"o\" direction=\"out\"/>\n"
+    "  </method>\n"
+    "  <method name=\"LoadSampleFromFile\">\n"
+    "   <arg name=\"Name\" type=\"s\" direction=\"in\"/>\n"
+    "   <arg name=\"Filepath\" type=\"s\" direction=\"in\"/>\n"
+    "   <arg name=\"Sample\" type=\"o\" direction=\"out\"/>\n"
+    "  </method>\n"
+    "  <method name=\"AddLazySample\">\n"
+    "   <arg name=\"Name\" type=\"s\" direction=\"in\"/>\n"
+    "   <arg name=\"Filepath\" type=\"s\" direction=\"in\"/>\n"
+    "   <arg name=\"Sample\" type=\"o\" direction=\"out\"/>\n"
+    "  </method>\n"
+    "  <method name=\"AddLazySamplesFromDirectory\">\n"
+    "   <arg name=\"Dirpath\" type=\"s\" direction=\"in\"/>\n"
+    "  </method>\n"
+    "  <method name=\"LoadModule\">\n"
+    "   <arg name=\"Name\" type=\"s\" direction=\"in\"/>\n"
+    "   <arg name=\"Arguments\" type=\"a{ss}\" direction=\"in\"/>\n"
+    "   <arg name=\"Module\" type=\"o\" direction=\"out\"/>\n"
+    "  </method>\n"
+    "  <method name=\"Exit\"/>\n"
+    "  <signal name=\"NewCard\">\n"
+    "   <arg name=\"Card\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"CardRemoved\">\n"
+    "   <arg name=\"Card\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"NewSink\">\n"
+    "   <arg name=\"Sink\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"SinkRemoved\">\n"
+    "   <arg name=\"Sink\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"FallbackSinkUpdated\">\n"
+    "   <arg name=\"Sink\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"NewSource\">\n"
+    "   <arg name=\"Source\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"SourceRemoved\">\n"
+    "   <arg name=\"Source\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"FallbackSourceUpdated\">\n"
+    "   <arg name=\"Source\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"NewPlaybackStream\">\n"
+    "   <arg name=\"PlaybackStream\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"PlaybackStreamRemoved\">\n"
+    "   <arg name=\"PlaybackStream\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"NewRecordStream\">\n"
+    "   <arg name=\"RecordStream\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"RecordStreamRemoved\">\n"
+    "   <arg name=\"RecordStream\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"NewSample\">\n"
+    "   <arg name=\"Sample\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"SampleRemoved\">\n"
+    "   <arg name=\"Sample\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"NewModule\">\n"
+    "   <arg name=\"Module\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"ModuleRemoved\">\n"
+    "   <arg name=\"Module\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"NewClient\">\n"
+    "   <arg name=\"Client\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <signal name=\"ClientRemoved\">\n"
+    "   <arg name=\"Client\" type=\"o\"/>\n"
+    "  </signal>\n"
+    "  <property name=\"InterfaceRevision\" type=\"u\" access=\"read\"/>\n"
+    "  <property name=\"Name\" type=\"s\" access=\"read\"/>\n"
+    "  <property name=\"Version\" type=\"s\" access=\"read\"/>\n"
+    "  <property name=\"Username\" type=\"s\" access=\"read\"/>\n"
+    "  <property name=\"Hostname\" type=\"s\" access=\"read\"/>\n"
+    "  <property name=\"DefaultChannels\" type=\"ay\" access=\"readwrite\"/>\n"
+    "  <property name=\"DefaultSampleFormat\" type=\"y\" access=\"readwrite\"/>\n"
+    "  <property name=\"DefaultSampleRate\" type=\"u\" access=\"readwrite\"/>\n"
+    "  <property name=\"Sinks\" type=\"ao\" access=\"read\"/>\n"
+    "  <property name=\"FallbackSink\" type=\"s\" access=\"readwrite\"/>\n"
+    "  <property name=\"Sources\" type=\"ao\" access=\"read\"/>\n"
+    "  <property name=\"FallbackSource\" type=\"o\" access=\"readwrite\"/>\n"
+    "  <property name=\"PlaybackStreams\" type=\"ao\" access=\"read\"/>\n"
+    "  <property name=\"RecordStreams\" type=\"ao\" access=\"read\"/>\n"
+    "  <property name=\"Samples\" type=\"ao\" access=\"read\"/>\n"
+    "  <property name=\"Modules\" type=\"ao\" access=\"read\"/>\n"
+    "  <property name=\"Clients\" type=\"ao\" access=\"read\"/>\n"
+    "  <property name=\"Extensions\" type=\"as\" access=\"read\"/>\n"
+    " </interface>\n";
+
+/* If you need to modify this list, note that handle_get_all() uses hard-coded
+ * indexes to point to these strings, so make sure the indexes don't go wrong
+ * there. */
+static const char *properties[] = {
+    "InterfaceRevision",
+    "Name",
+    "Version",
+    "Username",
+    "Hostname",
+    "DefaultChannels",
+    "DefaultSampleFormat",
+    "DefaultSampleRate",
+    "Sinks",
+    "FallbackSink",
+    "Sources",
+    "FallbackSource",
+    "PlaybackStreams",
+    "RecordStreams",
+    "Samples",
+    "Modules",
+    "Clients",
+    "Extensions",
+    NULL
+};
 
 static const char *methods[] = {
-    "Test",
+    "GetCardByName",
+    "GetSinkByName",
+    "GetSourceByName",
+    "GetSampleByName",
+    "UploadSample",
+    "LoadSampleFromFile",
+    "AddLazySample",
+    "AddLazySamplesFromDirectory",
+    "LoadModule",
+    "Exit",
     NULL
 };
 
-static DBusHandlerResult handle_test(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_core *c) {
+static DBusHandlerResult handle_get_name(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_core *c) {
+    DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED;
     DBusMessage *reply = NULL;
-    const char *reply_message = "Hello!";
+    const char *server_name = PACKAGE_NAME;
+    DBusMessageIter msg_iter;
+    DBusMessageIter variant_iter;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(c);
 
-    if (!(reply = dbus_message_new_method_return(msg)))
-        goto oom;
+    if (!(reply = dbus_message_new_method_return(msg))) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    dbus_message_iter_init_append(reply, &msg_iter);
+    if (!dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_VARIANT, "s", &variant_iter)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    if (!dbus_message_iter_append_basic(&variant_iter, DBUS_TYPE_STRING, &server_name)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    if (!dbus_message_iter_close_container(&msg_iter, &variant_iter)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    if (!dbus_connection_send(conn, reply, NULL)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    r = DBUS_HANDLER_RESULT_HANDLED;
+
+finish:
+    if (reply)
+        dbus_message_unref(reply);
+
+    return r;
+}
 
-    if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &reply_message, DBUS_TYPE_INVALID))
-        goto fail;
+static DBusHandlerResult handle_get(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_core *c) {
+    DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED;
+    const char* interface;
+    const char* property;
+    DBusMessage *reply = NULL;
 
-    if (!dbus_connection_send(conn, reply, NULL))
-        goto oom;
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID)) {
+        if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, "Invalid arguments"))) {
+            r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+            goto finish;
+        }
+        if (!dbus_connection_send(conn, reply, NULL)) {
+            r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+            goto finish;
+        }
+        r = DBUS_HANDLER_RESULT_HANDLED;
+        goto finish;
+    }
+
+    if (*interface && !pa_streq(interface, INTERFACE_CORE)) {
+        r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        goto finish;
+    }
+
+    if (pa_streq(property, "Name")) {
+        r = handle_get_name(conn, msg, c);
+        goto finish;
+    }
+
+    if (!(reply = dbus_message_new_error_printf(msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s: No such property", property))) {
+        r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        goto finish;
+    }
+    if (!dbus_connection_send(conn, reply, NULL)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    r = DBUS_HANDLER_RESULT_HANDLED;
+
+finish:
+    if (reply)
+        dbus_message_unref(reply);
+
+    return r;
+}
 
-    dbus_message_unref(reply);
+static DBusHandlerResult handle_set(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_core *c) {
+    DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED;
+    const char* interface;
+    const char* property;
+    DBusMessage *reply = NULL;
 
-    return DBUS_HANDLER_RESULT_HANDLED;
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
 
-fail:
+    if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID)) {
+        if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, "Invalid arguments"))) {
+            r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+            goto finish;
+        }
+        if (!dbus_connection_send(conn, reply, NULL)) {
+            r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+            goto finish;
+        }
+        r = DBUS_HANDLER_RESULT_HANDLED;
+        goto finish;
+    }
+
+    if (*interface && !pa_streq(interface, INTERFACE_CORE)) {
+        r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        goto finish;
+    }
+
+    if (pa_streq(property, "Name")) {
+        if (!(reply = dbus_message_new_error_printf(msg, DBUS_ERROR_ACCESS_DENIED, "%s: Property not settable", property))) {
+            r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+            goto finish;
+        }
+        if (!dbus_connection_send(conn, reply, NULL)) {
+            r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+            goto finish;
+        }
+        r = DBUS_HANDLER_RESULT_HANDLED;
+        goto finish;
+    }
+
+    if (!(reply = dbus_message_new_error_printf(msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s: No such property", property))) {
+        r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        goto finish;
+    }
+    if (!dbus_connection_send(conn, reply, NULL)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    r = DBUS_HANDLER_RESULT_HANDLED;
+    goto finish;
+
+    if (!(reply = dbus_message_new_error_printf(msg, DBUS_ERROR_ACCESS_DENIED, "%s: Property not settable", property))) {
+        r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+        goto finish;
+    }
+    if (!dbus_connection_send(conn, reply, NULL)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    r = DBUS_HANDLER_RESULT_HANDLED;
+
+finish:
     if (reply)
         dbus_message_unref(reply);
 
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    return r;
+}
+
+static DBusHandlerResult handle_get_all(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_core *c) {
+    DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED;
+    DBusMessage *reply = NULL;
+    char *interface = NULL;
+    char const *server_name = PACKAGE_NAME;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+    DBusMessageIter dict_entry_iter;
+    DBusMessageIter variant_iter;
 
-oom:
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID)) {
+        if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, "Invalid arguments"))) {
+            r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+            goto finish;
+        }
+        if (!dbus_connection_send(conn, reply, NULL)) {
+            r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+            goto finish;
+        }
+        r = DBUS_HANDLER_RESULT_HANDLED;
+        goto finish;
+    }
+
+    if (!(reply = dbus_message_new_method_return(msg))) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    dbus_message_iter_init_append(reply, &msg_iter);
+    if (!dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    if (!dbus_message_iter_open_container(&dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    if (!dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &properties[1])) { /* Name */
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    if (!dbus_message_iter_open_container(&dict_entry_iter, DBUS_TYPE_VARIANT, "s", &variant_iter)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    if (!dbus_message_iter_append_basic(&variant_iter, DBUS_TYPE_STRING, &server_name)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    if (!dbus_message_iter_close_container(&dict_entry_iter, &variant_iter)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    if (!dbus_message_iter_close_container(&dict_iter, &dict_entry_iter)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    if (!dbus_message_iter_close_container(&msg_iter, &dict_iter)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    if (!dbus_connection_send(conn, reply, NULL)) {
+        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
+        goto finish;
+    }
+    r = DBUS_HANDLER_RESULT_HANDLED;
+
+finish:
     if (reply)
         dbus_message_unref(reply);
 
-    return DBUS_HANDLER_RESULT_NEED_MEMORY;
+    return r;
 }
 
 static DBusHandlerResult receive_cb(DBusConnection *connection, DBusMessage *message, void *user_data) {
@@ -92,8 +444,17 @@ static DBusHandlerResult receive_cb(DBusConnection *connection, DBusMessage *mes
     pa_assert(message);
     pa_assert(c);
 
-    if (dbus_message_is_method_call(message, INTERFACE_NAME, "Test"))
-        return handle_test(connection, message, c);
+    if (dbus_message_is_method_call(message, DBUS_INTERFACE_PROPERTIES, "Get") ||
+        (!dbus_message_get_interface(message) && dbus_message_has_member(message, "Get")))
+        return handle_get(connection, message, c);
+
+    if (dbus_message_is_method_call(message, DBUS_INTERFACE_PROPERTIES, "Set") ||
+        (!dbus_message_get_interface(message) && dbus_message_has_member(message, "Set")))
+        return handle_set(connection, message, c);
+
+    if (dbus_message_is_method_call(message, DBUS_INTERFACE_PROPERTIES, "GetAll") ||
+        (!dbus_message_get_interface(message) && dbus_message_has_member(message, "GetAll")))
+        return handle_get_all(connection, message, c);
 
     return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 }
@@ -106,7 +467,8 @@ pa_dbusobj_core *pa_dbusobj_core_new(pa_core *core) {
     c = pa_xnew(pa_dbusobj_core, 1);
     c->core = core;
 
-    pa_dbus_add_interface(core, OBJECT_NAME, INTERFACE_NAME, methods, introspection_snippet, receive_cb, c);
+    pa_dbus_add_interface(core, OBJECT_PATH, INTERFACE_CORE, properties, methods, introspection_snippet, receive_cb, c);
+
 
     return c;
 }
@@ -114,7 +476,7 @@ pa_dbusobj_core *pa_dbusobj_core_new(pa_core *core) {
 void pa_dbusobj_core_free(pa_dbusobj_core *c) {
     pa_assert(c);
 
-    pa_dbus_remove_interface(c->core, OBJECT_NAME, INTERFACE_NAME);
+    pa_dbus_remove_interface(c->core, OBJECT_PATH, INTERFACE_CORE);
 
     pa_xfree(c);
 }

commit 5f5867e08ab8821447faacece92dab1e0b993fe4
Author: Daniel Mack <daniel at caiaq.de>
Date:   Fri Jul 17 13:45:37 2009 +0200

    make bootstrap.sh aware of Darwin environment
    
    Signed-off-by: Daniel Mack <daniel at caiaq.de>

diff --git a/bootstrap.sh b/bootstrap.sh
index aa9755f..a5bd9a7 100755
--- a/bootstrap.sh
+++ b/bootstrap.sh
@@ -40,10 +40,22 @@ run_versioned() {
 
 set -ex
 
+case $(uname) in
+	*Darwin*)
+		CP_OPTS="-R"
+		CHMOD_OPTS=""
+		LIBTOOLIZE="glibtoolize"
+		;;
+	*)
+		CP_OPTS="-av"
+		CHMOD_OPTS="-c"
+		;;
+esac
+
 if [ -f .git/hooks/pre-commit.sample -a ! -f .git/hooks/pre-commit ] ; then
     echo "Activating pre-commit hook."
-    cp -av .git/hooks/pre-commit.sample .git/hooks/pre-commit
-    chmod -c +x  .git/hooks/pre-commit
+    cp ${CP_OPTS}  .git/hooks/pre-commit.sample .git/hooks/pre-commit
+    chmod ${CHMOD_OPTS} +x  .git/hooks/pre-commit
 fi
 
 if [ -f .tarball-version ]; then

commit 909dc093a5d33b5eed2c718187c7acce1c6d9bd0
Merge: 5f5867e 673112b
Author: Daniel Mack <daniel at caiaq.de>
Date:   Fri Jul 17 14:20:57 2009 +0200

    Merge branch 'master' of git://gitorious.org/~flameeyes/pulseaudio/flameeyes-pulseaudio


commit 3fc7b870fcd8b3cc7a6b73fd3d4449994860f4fc
Merge: 909dc09 a6d6718
Author: Daniel Mack <daniel at caiaq.de>
Date:   Fri Jul 17 14:34:52 2009 +0200

    Merge branch 'osx' of git://gitorious.org/~flameeyes/pulseaudio/flameeyes-pulseaudio


commit 30fcda6cb5959af2a1911bb40bf769be6b554450
Author: Daniel Mack <daniel at caiaq.de>
Date:   Fri Jul 17 20:52:23 2009 +0200

    Revert "make bootstrap.sh aware of Darwin environment"
    
    This reverts commit 5f5867e08ab8821447faacece92dab1e0b993fe4.

diff --git a/bootstrap.sh b/bootstrap.sh
index a5bd9a7..aa9755f 100755
--- a/bootstrap.sh
+++ b/bootstrap.sh
@@ -40,22 +40,10 @@ run_versioned() {
 
 set -ex
 
-case $(uname) in
-	*Darwin*)
-		CP_OPTS="-R"
-		CHMOD_OPTS=""
-		LIBTOOLIZE="glibtoolize"
-		;;
-	*)
-		CP_OPTS="-av"
-		CHMOD_OPTS="-c"
-		;;
-esac
-
 if [ -f .git/hooks/pre-commit.sample -a ! -f .git/hooks/pre-commit ] ; then
     echo "Activating pre-commit hook."
-    cp ${CP_OPTS}  .git/hooks/pre-commit.sample .git/hooks/pre-commit
-    chmod ${CHMOD_OPTS} +x  .git/hooks/pre-commit
+    cp -av .git/hooks/pre-commit.sample .git/hooks/pre-commit
+    chmod -c +x  .git/hooks/pre-commit
 fi
 
 if [ -f .tarball-version ]; then

commit 63f2ed6dd7b4b87dbe175f8dda35204dee8737e0
Merge: 30fcda6 8c85c99
Author: Daniel Mack <daniel at caiaq.de>
Date:   Fri Jul 17 20:52:34 2009 +0200

    Merge branch 'osx' of git://gitorious.org/~flameeyes/pulseaudio/flameeyes-pulseaudio


commit c6d330ef91ce401660f907536b1bfd0591c14c2a
Merge: 63f2ed6 d18eb61
Author: Daniel Mack <daniel at caiaq.de>
Date:   Fri Jul 17 21:06:58 2009 +0200

    Merge branch 'osx' of git://gitorious.org/~flameeyes/pulseaudio/flameeyes-pulseaudio


commit 9347e90fed732dac619bb88f6518c344e7436447
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Tue Jul 21 00:02:27 2009 +0300

    Finish the Core dbus interface.

diff --git a/src/Makefile.am b/src/Makefile.am
index 5866889..47eb647 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -852,7 +852,7 @@ endif
 if HAVE_DBUS
 libpulsecore_ at PA_MAJORMINORMICRO@_la_SOURCES += \
 		pulsecore/dbus-shared.c pulsecore/dbus-shared.h \
-		pulsecore/dbus-common.c pulsecore/dbus-common.h
+		pulsecore/protocol-dbus.c pulsecore/protocol-dbus.h
 libpulsecore_ at PA_MAJORMINORMICRO@_la_CFLAGS += $(DBUS_CFLAGS)
 libpulsecore_ at PA_MAJORMINORMICRO@_la_LIBADD += $(DBUS_LIBS)
 endif
@@ -1225,7 +1225,7 @@ SYMDEF_FILES = \
 		modules/module-augment-properties-symdef.h \
 		modules/module-cork-music-on-phone-symdef.h \
 		modules/module-console-kit-symdef.h \
-		modules/module-dbus-protocol-symdef.h
+		modules/dbus/module-dbus-protocol-symdef.h
 
 EXTRA_DIST += $(SYMDEF_FILES)
 BUILT_SOURCES += $(SYMDEF_FILES)
@@ -1277,8 +1277,14 @@ module_http_protocol_unix_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINORMI
 # D-Bus protocol
 
 module_dbus_protocol_la_SOURCES = \
-		pulsecore/dbus-objs/core.c pulsecore/dbus-objs/core.h \
-		modules/module-dbus-protocol.c
+		modules/dbus/iface-card.c modules/dbus/iface-card.h \
+		modules/dbus/iface-client.c modules/dbus/iface-client.h \
+		modules/dbus/iface-core.c modules/dbus/iface-core.h \
+		modules/dbus/iface-device.c modules/dbus/iface-device.h \
+		modules/dbus/iface-module.c modules/dbus/iface-module.h \
+		modules/dbus/iface-sample.c modules/dbus/iface-sample.h \
+		modules/dbus/iface-stream.c modules/dbus/iface-stream.h \
+		modules/dbus/module-dbus-protocol.c
 module_dbus_protocol_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS)
 module_dbus_protocol_la_LDFLAGS = $(MODULE_LDFLAGS)
 module_dbus_protocol_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
diff --git a/src/daemon/server-lookup.c b/src/daemon/server-lookup.c
index ebacc09..45796e7 100644
--- a/src/daemon/server-lookup.c
+++ b/src/daemon/server-lookup.c
@@ -30,13 +30,13 @@
 
 #include <pulsecore/core.h>
 #include <pulsecore/core-util.h>
-#include <pulsecore/dbus-common.h>
 #include <pulsecore/dbus-shared.h>
 #include <pulsecore/macro.h>
+#include <pulsecore/protocol-dbus.h>
 
 #include "server-lookup.h"
 
-#define OBJECT_PATH "/org/pulseaudio1/server_lookup"
+#define OBJECT_PATH "/org/pulseaudio/server_lookup1"
 #define INTERFACE "org.PulseAudio.ServerLookup1"
 
 struct pa_dbusobj_server_lookup {
diff --git a/src/modules/module-dbus-protocol.c b/src/modules/module-dbus-protocol.c
deleted file mode 100644
index f7c1f0a..0000000
--- a/src/modules/module-dbus-protocol.c
+++ /dev/null
@@ -1,575 +0,0 @@
-/***
-  This file is part of PulseAudio.
-
-  Copyright 2009 Tanu Kaskinen
-  Copyright 2006 Lennart Poettering
-  Copyright 2006 Shams E. King
-
-  PulseAudio is free software; you can redistribute it and/or modify
-  it under the terms of the GNU Lesser General Public License as published
-  by the Free Software Foundation; either version 2.1 of the License,
-  or (at your option) any later version.
-
-  PulseAudio is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public License
-  along with PulseAudio; if not, 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 <dbus/dbus.h>
-
-#include <pulse/mainloop-api.h>
-#include <pulse/timeval.h>
-#include <pulse/xmalloc.h>
-
-#include <pulsecore/client.h>
-#include <pulsecore/core-util.h>
-#include <pulsecore/dbus-common.h>
-#include <pulsecore/dbus-util.h>
-#include <pulsecore/idxset.h>
-#include <pulsecore/macro.h>
-#include <pulsecore/modargs.h>
-#include <pulsecore/module.h>
-
-#include <pulsecore/dbus-objs/core.h>
-
-#include "module-dbus-protocol-symdef.h"
-
-PA_MODULE_DESCRIPTION("D-Bus interface");
-PA_MODULE_USAGE(
-        "access=local|remote|local,remote "
-        "tcp_port=<port number>");
-PA_MODULE_LOAD_ONCE(TRUE);
-PA_MODULE_AUTHOR("Tanu Kaskinen");
-PA_MODULE_VERSION(PACKAGE_VERSION);
-
-#define CLEANUP_INTERVAL 10 /* seconds */
-
-enum server_type {
-    SERVER_TYPE_LOCAL,
-    SERVER_TYPE_TCP
-};
-
-struct server;
-struct connection;
-
-struct userdata {
-    pa_module *module;
-    pa_bool_t local_access;
-    pa_bool_t remote_access;
-    uint32_t tcp_port;
-
-    struct server *local_server;
-    struct server *tcp_server;
-
-    pa_idxset *connections;
-
-    pa_time_event *cleanup_event;
-
-    pa_dbusobj_core *core_object;
-};
-
-struct server {
-    struct userdata *userdata;
-    enum server_type type;
-    DBusServer *dbus_server;
-};
-
-struct connection {
-    struct server *server;
-    pa_dbus_wrap_connection *wrap_conn;
-    pa_client *client;
-};
-
-static const char* const valid_modargs[] = {
-    "access",
-    "tcp_port",
-    NULL
-};
-
-static void connection_free(struct connection *c) {
-    pa_assert(c);
-
-    pa_assert_se(pa_dbus_unregister_connection(c->server->userdata->module->core, pa_dbus_wrap_connection_get(c->wrap_conn)) >= 0);
-
-    pa_client_free(c->client);
-    pa_assert_se(pa_idxset_remove_by_data(c->server->userdata->connections, c, NULL));
-    pa_dbus_wrap_connection_free(c->wrap_conn);
-    pa_xfree(c);
-}
-
-/* Called from pa_client_kill(). */
-static void client_kill_cb(pa_client *c) {
-    struct connection *conn;
-
-    pa_assert(c);
-    pa_assert(c->userdata);
-
-    conn = c->userdata;
-    connection_free(conn);
-
-    pa_log_info("Connection killed.");
-}
-
-static dbus_bool_t user_check_cb(DBusConnection *connection, unsigned long uid, void *data) {
-    pa_log_debug("Allowing connection by user %lu.", uid);
-
-    return TRUE;
-}
-
-/* Called by D-Bus when a new client connection is received. */
-static void connection_new_cb(DBusServer *dbus_server, DBusConnection *new_connection, void *data) {
-    struct server *s = data;
-    struct connection *c;
-    pa_client_new_data new_data;
-    pa_client *client;
-
-    pa_assert(new_connection);
-    pa_assert(s);
-
-    pa_client_new_data_init(&new_data);
-    new_data.module = s->userdata->module;
-    new_data.driver = __FILE__;
-    pa_proplist_sets(new_data.proplist, PA_PROP_APPLICATION_NAME, "D-Bus client"); /* TODO: It's probably possible to generate a fancier name. Other props? */
-    client = pa_client_new(s->userdata->module->core, &new_data);
-    pa_client_new_data_done(&new_data);
-
-    if (!client) {
-        dbus_connection_close(new_connection);
-        return;
-    }
-
-    if (s->type == SERVER_TYPE_TCP || s->userdata->module->core->server_type == PA_SERVER_TYPE_SYSTEM) {
-        /* FIXME: Here we allow anyone from anywhere to access the server,
-         * anonymously. Access control should be configurable. */
-        dbus_connection_set_unix_user_function(new_connection, user_check_cb, NULL, NULL);
-        dbus_connection_set_allow_anonymous(new_connection, TRUE);
-    }
-
-    c = pa_xnew(struct connection, 1);
-    c->server = s;
-    c->wrap_conn = pa_dbus_wrap_connection_new_from_existing(s->userdata->module->core->mainloop, TRUE, new_connection);
-    c->client = client;
-
-    c->client->kill = client_kill_cb;
-    c->client->send_event = NULL; /* TODO: Implement this. */
-    c->client->userdata = c;
-
-    pa_idxset_put(s->userdata->connections, c, NULL);
-
-    pa_assert_se(pa_dbus_register_connection(s->userdata->module->core, new_connection) >= 0);
-}
-
-/* Called by PA mainloop when a D-Bus fd watch event needs handling. */
-static void io_event_cb(pa_mainloop_api *mainloop, pa_io_event *e, int fd, pa_io_event_flags_t events, void *userdata) {
-    unsigned int flags = 0;
-    DBusWatch *watch = userdata;
-
-#if HAVE_DBUS_WATCH_GET_UNIX_FD
-    pa_assert(fd == dbus_watch_get_unix_fd(watch));
-#else
-    pa_assert(fd == dbus_watch_get_fd(watch));
-#endif
-
-    if (!dbus_watch_get_enabled(watch)) {
-        pa_log_warn("Asked to handle disabled watch: %p %i", (void*) watch, fd);
-        return;
-    }
-
-    if (events & PA_IO_EVENT_INPUT)
-        flags |= DBUS_WATCH_READABLE;
-    if (events & PA_IO_EVENT_OUTPUT)
-        flags |= DBUS_WATCH_WRITABLE;
-    if (events & PA_IO_EVENT_HANGUP)
-        flags |= DBUS_WATCH_HANGUP;
-    if (events & PA_IO_EVENT_ERROR)
-        flags |= DBUS_WATCH_ERROR;
-
-    dbus_watch_handle(watch, flags);
-}
-
-/* Called by PA mainloop when a D-Bus timer event needs handling. */
-static void time_event_cb(pa_mainloop_api *mainloop, pa_time_event* e, const struct timeval *tv, void *userdata) {
-    DBusTimeout *timeout = userdata;
-
-    if (dbus_timeout_get_enabled(timeout)) {
-        struct timeval next = *tv;
-        dbus_timeout_handle(timeout);
-
-        /* restart it for the next scheduled time */
-        pa_timeval_add(&next, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000);
-        mainloop->time_restart(e, &next);
-    }
-}
-
-/* Translates D-Bus fd watch event flags to PA IO event flags. */
-static pa_io_event_flags_t get_watch_flags(DBusWatch *watch) {
-    unsigned int flags;
-    pa_io_event_flags_t events = 0;
-
-    pa_assert(watch);
-
-    flags = dbus_watch_get_flags(watch);
-
-    /* no watch flags for disabled watches */
-    if (!dbus_watch_get_enabled(watch))
-        return PA_IO_EVENT_NULL;
-
-    if (flags & DBUS_WATCH_READABLE)
-        events |= PA_IO_EVENT_INPUT;
-    if (flags & DBUS_WATCH_WRITABLE)
-        events |= PA_IO_EVENT_OUTPUT;
-
-    return events | PA_IO_EVENT_HANGUP | PA_IO_EVENT_ERROR;
-}
-
-/* Called by D-Bus when a D-Bus fd watch event is added. */
-static dbus_bool_t watch_add_cb(DBusWatch *watch, void *data) {
-    struct server *s = data;
-    pa_mainloop_api *mainloop;
-    pa_io_event *ev;
-
-    pa_assert(watch);
-    pa_assert(s);
-
-    mainloop = s->userdata->module->core->mainloop;
-
-    ev = mainloop->io_new(
-            mainloop,
-#if HAVE_DBUS_WATCH_GET_UNIX_FD
-            dbus_watch_get_unix_fd(watch),
-#else
-            dbus_watch_get_fd(watch),
-#endif
-            get_watch_flags(watch), io_event_cb, watch);
-
-    dbus_watch_set_data(watch, ev, NULL);
-
-    return TRUE;
-}
-
-/* Called by D-Bus when a D-Bus fd watch event is removed. */
-static void watch_remove_cb(DBusWatch *watch, void *data) {
-    struct server *s = data;
-    pa_io_event *ev;
-
-    pa_assert(watch);
-    pa_assert(s);
-
-    if ((ev = dbus_watch_get_data(watch)))
-        s->userdata->module->core->mainloop->io_free(ev);
-}
-
-/* Called by D-Bus when a D-Bus fd watch event is toggled. */
-static void watch_toggled_cb(DBusWatch *watch, void *data) {
-    struct server *s = data;
-    pa_io_event *ev;
-
-    pa_assert(watch);
-    pa_assert(s);
-
-    pa_assert_se(ev = dbus_watch_get_data(watch));
-
-    /* get_watch_flags() checks if the watch is enabled */
-    s->userdata->module->core->mainloop->io_enable(ev, get_watch_flags(watch));
-}
-
-/* Called by D-Bus when a D-Bus timer event is added. */
-static dbus_bool_t timeout_add_cb(DBusTimeout *timeout, void *data) {
-    struct server *s = data;
-    pa_mainloop_api *mainloop;
-    pa_time_event *ev;
-    struct timeval tv;
-
-    pa_assert(timeout);
-    pa_assert(s);
-
-    if (!dbus_timeout_get_enabled(timeout))
-        return FALSE;
-
-    mainloop = s->userdata->module->core->mainloop;
-
-    pa_gettimeofday(&tv);
-    pa_timeval_add(&tv, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000);
-
-    ev = mainloop->time_new(mainloop, &tv, time_event_cb, timeout);
-
-    dbus_timeout_set_data(timeout, ev, NULL);
-
-    return TRUE;
-}
-
-/* Called by D-Bus when a D-Bus timer event is removed. */
-static void timeout_remove_cb(DBusTimeout *timeout, void *data) {
-    struct server *s = data;
-    pa_time_event *ev;
-
-    pa_assert(timeout);
-    pa_assert(s);
-
-    if ((ev = dbus_timeout_get_data(timeout)))
-        s->userdata->module->core->mainloop->time_free(ev);
-}
-
-/* Called by D-Bus when a D-Bus timer event is toggled. */
-static void timeout_toggled_cb(DBusTimeout *timeout, void *data) {
-    struct server *s = data;
-    pa_mainloop_api *mainloop;
-    pa_time_event *ev;
-
-    pa_assert(timeout);
-    pa_assert(s);
-
-    mainloop = s->userdata->module->core->mainloop;
-
-    pa_assert_se(ev = dbus_timeout_get_data(timeout));
-
-    if (dbus_timeout_get_enabled(timeout)) {
-        struct timeval tv;
-
-        pa_gettimeofday(&tv);
-        pa_timeval_add(&tv, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000);
-
-        mainloop->time_restart(ev, &tv);
-    } else
-        mainloop->time_restart(ev, NULL);
-}
-
-static void server_free(struct server *s) {
-    pa_assert(s);
-
-    if (s->dbus_server) {
-        dbus_server_disconnect(s->dbus_server);
-        dbus_server_unref(s->dbus_server);
-    }
-
-    pa_xfree(s);
-}
-
-static struct server *start_server(struct userdata *u, const char *address, enum server_type type) {
-    /* XXX: We assume that when we unref the DBusServer instance at module
-     * shutdown, nobody else holds any references to it. If we stop assuming
-     * that someday, dbus_server_set_new_connection_function,
-     * dbus_server_set_watch_functions and dbus_server_set_timeout_functions
-     * calls should probably register free callbacks, instead of providing NULL
-     * as they do now. */
-
-    struct server *s = NULL;
-    DBusError error;
-
-    pa_assert(u);
-    pa_assert(address);
-
-    dbus_error_init(&error);
-
-    s = pa_xnew0(struct server, 1);
-    s->userdata = u;
-    s->dbus_server = dbus_server_listen(address, &error);
-
-    if (dbus_error_is_set(&error)) {
-        pa_log("dbus_server_listen() failed: %s: %s", error.name, error.message);
-        goto fail;
-    }
-
-    dbus_server_set_new_connection_function(s->dbus_server, connection_new_cb, s, NULL);
-
-    if (!dbus_server_set_watch_functions(s->dbus_server, watch_add_cb, watch_remove_cb, watch_toggled_cb, s, NULL)) {
-        pa_log("dbus_server_set_watch_functions() ran out of memory.");
-        goto fail;
-    }
-
-    if (!dbus_server_set_timeout_functions(s->dbus_server, timeout_add_cb, timeout_remove_cb, timeout_toggled_cb, s, NULL)) {
-        pa_log("dbus_server_set_timeout_functions() ran out of memory.");
-        goto fail;
-    }
-
-    return s;
-
-fail:
-    if (s)
-        server_free(s);
-
-    dbus_error_free(&error);
-
-    return NULL;
-}
-
-static struct server *start_local_server(struct userdata *u) {
-    struct server *s = NULL;
-    char *address = NULL;
-
-    pa_assert(u);
-
-    address = pa_get_dbus_address_from_server_type(u->module->core->server_type);
-
-    s = start_server(u, address, SERVER_TYPE_LOCAL); /* May return NULL */
-
-    pa_xfree(address);
-
-    return s;
-}
-
-static struct server *start_tcp_server(struct userdata *u) {
-    struct server *s = NULL;
-    char *address = NULL;
-
-    pa_assert(u);
-
-    address = pa_sprintf_malloc("tcp:host=127.0.0.1,port=%u", u->tcp_port);
-
-    s = start_server(u, address, SERVER_TYPE_TCP); /* May return NULL */
-
-    pa_xfree(address);
-
-    return s;
-}
-
-static int get_access_arg(pa_modargs *ma, pa_bool_t *local_access, pa_bool_t *remote_access) {
-    const char *value = NULL;
-
-    pa_assert(ma);
-    pa_assert(local_access);
-    pa_assert(remote_access);
-
-    if (!(value = pa_modargs_get_value(ma, "access", NULL)))
-        return 0;
-
-    if (!strcmp(value, "local")) {
-        *local_access = TRUE;
-        *remote_access = FALSE;
-    } else if (!strcmp(value, "remote")) {
-        *local_access = FALSE;
-        *remote_access = TRUE;
-    } else if (!strcmp(value, "local,remote")) {
-        *local_access = TRUE;
-        *remote_access = TRUE;
-    } else
-        return -1;
-
-    return 0;
-}
-
-/* Frees dead client connections. Called every CLEANUP_INTERVAL seconds. */
-static void cleanup_cb(pa_mainloop_api *a, pa_time_event *e, const struct timeval *tv, void *userdata) {
-    struct userdata *u = userdata;
-    struct connection *conn = NULL;
-    uint32_t idx;
-    struct timeval cleanup_timeval;
-    unsigned free_count = 0;
-
-    for (conn = pa_idxset_first(u->connections, &idx); conn; conn = pa_idxset_next(u->connections, &idx)) {
-        if (!dbus_connection_get_is_connected(pa_dbus_wrap_connection_get(conn->wrap_conn))) {
-            connection_free(conn);
-            ++free_count;
-        }
-    }
-
-    if (free_count > 0)
-        pa_log_debug("Freed %u dead D-Bus client connections.", free_count);
-
-    pa_gettimeofday(&cleanup_timeval);
-    cleanup_timeval.tv_sec += CLEANUP_INTERVAL;
-    u->module->core->mainloop->time_restart(e, &cleanup_timeval);
-}
-
-int pa__init(pa_module *m) {
-    struct userdata *u = NULL;
-    pa_modargs *ma = NULL;
-    struct timeval cleanup_timeval;
-
-    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;
-    u->local_access = TRUE;
-    u->remote_access = FALSE;
-    u->tcp_port = PA_DBUS_DEFAULT_PORT;
-
-    if (get_access_arg(ma, &u->local_access, &u->remote_access) < 0) {
-        pa_log("Invalid access argument: '%s'", pa_modargs_get_value(ma, "access", NULL));
-        goto fail;
-    }
-
-    if (pa_modargs_get_value_u32(ma, "tcp_port", &u->tcp_port) < 0 || u->tcp_port < 1 || u->tcp_port > 49150) {
-        pa_log("Invalid tcp_port argument: '%s'", pa_modargs_get_value(ma, "tcp_port", NULL));
-        goto fail;
-    }
-
-    if (u->local_access && !(u->local_server = start_local_server(u))) {
-        pa_log("Starting the local D-Bus server failed.");
-        goto fail;
-    }
-
-    if (u->remote_access && !(u->tcp_server = start_tcp_server(u))) {
-        pa_log("Starting the D-Bus server for remote connections failed.");
-        goto fail;
-    }
-
-    u->connections = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
-
-    pa_gettimeofday(&cleanup_timeval);
-    cleanup_timeval.tv_sec += CLEANUP_INTERVAL;
-    u->cleanup_event = m->core->mainloop->time_new(m->core->mainloop, &cleanup_timeval, cleanup_cb, u);
-
-    u->core_object = pa_dbusobj_core_new(m->core);
-
-    return 0;
-
-fail:
-    if (ma)
-        pa_modargs_free(ma);
-
-    pa__done(m);
-
-    return -1;
-}
-
-/* Called by idxset when the connection set is freed. */
-static void connection_free_cb(void *p, void *userdata) {
-    struct connection *conn = p;
-
-    pa_assert(conn);
-
-    connection_free(conn);
-}
-
-void pa__done(pa_module *m) {
-    struct userdata *u;
-
-    pa_assert(m);
-
-    if (!(u = m->userdata))
-        return;
-
-    if (u->core_object)
-        pa_dbusobj_core_free(u->core_object);
-
-    if (u->cleanup_event)
-        m->core->mainloop->time_free(u->cleanup_event);
-
-    if (u->connections)
-        pa_idxset_free(u->connections, connection_free_cb, NULL);
-
-    if (u->tcp_server)
-        server_free(u->tcp_server);
-
-    if (u->local_server)
-        server_free(u->local_server);
-
-    pa_xfree(u);
-    m->userdata = NULL;
-}
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 04e7eb2..ebddf36 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -2656,6 +2656,28 @@ char *pa_replace(const char*s, const char*a, const char *b) {
     return pa_strbuf_tostring_free(sb);
 }
 
+char *pa_escape(const char *p, const char *chars) {
+    const char *s;
+    const char *c;
+    pa_strbuf *buf = pa_strbuf_new();
+
+    for (s = p; *s; ++s) {
+        if (*s == '\\')
+            pa_strbuf_putc(buf, '\\');
+        else if (chars) {
+            for (c = chars; *c; ++c) {
+                if (*s == *c) {
+                    pa_strbuf_putc(buf, '\\');
+                    break;
+                }
+            }
+        }
+        pa_strbuf_putc(buf, *s);
+    }
+
+    return pa_strbuf_tostring_free(buf);
+}
+
 char *pa_unescape(char *p) {
     char *s, *d;
     pa_bool_t escaped = FALSE;
diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h
index 96a0480..aaa51bd 100644
--- a/src/pulsecore/core-util.h
+++ b/src/pulsecore/core-util.h
@@ -220,6 +220,13 @@ unsigned pa_ncpus(void);
 
 char *pa_replace(const char*s, const char*a, const char *b);
 
+/* Escapes p by inserting backslashes in front of backslashes. chars is a
+ * regular (ie. NULL-terminated) string containing additional characters that
+ * should be escaped. chars can be NULL. The caller has to free the returned
+ * string. */
+char *pa_escape(const char *p, const char *chars);
+
+/* Does regular backslash unescaping. Returns the argument p. */
 char *pa_unescape(char *p);
 
 char *pa_realpath(const char *path);
diff --git a/src/pulsecore/dbus-common.c b/src/pulsecore/dbus-common.c
deleted file mode 100644
index 6562cda..0000000
--- a/src/pulsecore/dbus-common.c
+++ /dev/null
@@ -1,646 +0,0 @@
-/***
-  This file is part of PulseAudio.
-
-  Copyright 2009 Tanu Kaskinen
-
-  PulseAudio is free software; you can redistribute it and/or modify
-  it under the terms of the GNU Lesser General Public License as published
-  by the Free Software Foundation; either version 2.1 of the License,
-  or (at your option) any later version.
-
-  PulseAudio is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public License
-  along with PulseAudio; if not, 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 <dbus/dbus.h>
-
-#include <pulse/xmalloc.h>
-
-#include <pulsecore/core-util.h>
-#include <pulsecore/hashmap.h>
-#include <pulsecore/idxset.h>
-#include <pulsecore/strbuf.h>
-
-#include "dbus-common.h"
-
-struct dbus_state {
-    pa_core *core;
-    pa_hashmap *objects; /* Object path -> struct object_entry */
-    pa_idxset *connections; /* DBusConnections */
-};
-
-struct object_entry {
-    char *path;
-    pa_hashmap *interfaces; /* Interface name -> struct interface_entry */
-    char *introspection;
-};
-
-struct interface_entry {
-    char *name;
-    char **properties;
-    char **methods;
-    char *introspection_snippet;
-    DBusObjectPathMessageFunction receive;
-    void *userdata;
-};
-
-char *pa_get_dbus_address_from_server_type(pa_server_type_t server_type) {
-    char *address = NULL;
-    char *runtime_path = NULL;
-    char *escaped_path = NULL;
-
-    switch (server_type) {
-        case PA_SERVER_TYPE_USER:
-            if (!(runtime_path = pa_runtime_path(PA_DBUS_SOCKET_NAME))) {
-                pa_log("pa_runtime_path() failed.");
-                break;
-            }
-
-            if (!(escaped_path = dbus_address_escape_value(runtime_path))) {
-                pa_log("dbus_address_escape_value() failed.");
-                break;
-            }
-
-            address = pa_sprintf_malloc("unix:path=%s", escaped_path);
-            break;
-
-        case PA_SERVER_TYPE_SYSTEM:
-            if (!(escaped_path = dbus_address_escape_value(PA_DBUS_SYSTEM_SOCKET_PATH))) {
-                pa_log("dbus_address_escape_value() failed.");
-                break;
-            }
-
-            address = pa_sprintf_malloc("unix:path=%s", escaped_path);
-            break;
-
-        case PA_SERVER_TYPE_NONE:
-            address = pa_xnew0(char, 1);
-            break;
-
-        default:
-            pa_assert_not_reached();
-    }
-
-    pa_xfree(runtime_path);
-    pa_xfree(escaped_path);
-
-    return address;
-}
-
-static void update_introspection(struct object_entry *oe) {
-    pa_strbuf *buf;
-    void *state = NULL;
-    struct interface_entry *iface_entry = NULL;
-
-    pa_assert(oe);
-
-    buf = pa_strbuf_new();
-    pa_strbuf_puts(buf, DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE);
-    pa_strbuf_puts(buf, "<node>\n");
-
-    while ((iface_entry = pa_hashmap_iterate(oe->interfaces, &state, NULL)))
-        pa_strbuf_puts(buf, iface_entry->introspection_snippet);
-
-    pa_strbuf_puts(buf, " <interface name=\"" DBUS_INTERFACE_INTROSPECTABLE "\">\n"
-                        "  <method name=\"Introspect\">\n"
-                        "   <arg name=\"data\" type=\"s\" direction=\"out\"/>\n"
-                        "  </method>\n"
-                        " </interface>\n"
-                        " <interface name=\"" DBUS_INTERFACE_PROPERTIES "\">\n"
-                        "  <method name=\"Get\">\n"
-                        "   <arg name=\"interface_name\" type=\"s\" direction=\"in\"/>\n"
-                        "   <arg name=\"property_name\" type=\"s\" direction=\"in\"/>\n"
-                        "   <arg name=\"value\" type=\"v\" direction=\"out\"/>\n"
-                        "  </method>\n"
-                        "  <method name=\"Set\">\n"
-                        "   <arg name=\"interface_name\" type=\"s\" direction=\"in\"/>\n"
-                        "   <arg name=\"property_name\" type=\"s\" direction=\"in\"/>\n"
-                        "   <arg name=\"value\" type=\"v\" direction=\"in\"/>\n"
-                        "  </method>\n"
-                        "  <method name=\"GetAll\">\n"
-                        "   <arg name=\"interface_name\" type=\"s\" direction=\"in\"/>\n"
-                        "   <arg name=\"props\" type=\"a{sv}\" direction=\"out\"/>\n"
-                        "  </method>\n"
-                        " </interface>\n");
-
-    pa_strbuf_puts(buf, "</node>\n");
-
-    pa_xfree(oe->introspection);
-    oe->introspection = pa_strbuf_tostring_free(buf);
-}
-
-enum find_result_t {
-    SUCCESS,
-    NO_SUCH_PROPERTY,
-    NO_SUCH_METHOD,
-    INVALID_MESSAGE_ARGUMENTS
-};
-
-static enum find_result_t find_interface_by_property(struct object_entry *obj_entry, const char *property, struct interface_entry **entry) {
-    void *state = NULL;
-
-    pa_assert(obj_entry);
-    pa_assert(property);
-    pa_assert(entry);
-
-    while ((*entry = pa_hashmap_iterate(obj_entry->interfaces, &state, NULL))) {
-        char *iface_property;
-        char **pos = (*entry)->properties;
-
-        while ((iface_property = *pos++)) {
-            if (pa_streq(iface_property, property))
-                return SUCCESS;
-        }
-    }
-
-    return NO_SUCH_PROPERTY;
-}
-
-static enum find_result_t find_interface_by_method(struct object_entry *obj_entry, const char *method, struct interface_entry **entry) {
-    void *state = NULL;
-
-    pa_assert(obj_entry);
-    pa_assert(method);
-    pa_assert(entry);
-
-    while ((*entry = pa_hashmap_iterate(obj_entry->interfaces, &state, NULL))) {
-        char *iface_method;
-        char **pos = (*entry)->methods;
-
-        while ((iface_method = *pos++)) {
-            if (pa_streq(iface_method, method))
-                return SUCCESS;
-        }
-    }
-
-    return NO_SUCH_METHOD;
-}
-
-static enum find_result_t find_interface_from_properties_call(struct object_entry *obj_entry, DBusMessage *msg, struct interface_entry **entry) {
-    const char *interface;
-    const char *property;
-
-    pa_assert(obj_entry);
-    pa_assert(msg);
-    pa_assert(entry);
-
-    if (dbus_message_has_member(msg, "GetAll")) {
-        if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID))
-            return INVALID_MESSAGE_ARGUMENTS;
-
-        if (*interface) {
-            if ((*entry = pa_hashmap_get(obj_entry->interfaces, interface)))
-                return SUCCESS;
-            else
-                return NO_SUCH_METHOD;
-        } else {
-            pa_assert_se((*entry = pa_hashmap_first(obj_entry->interfaces)));
-            return SUCCESS;
-        }
-    } else {
-        pa_assert(dbus_message_has_member(msg, "Get") || dbus_message_has_member(msg, "Set"));
-
-        if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID))
-            return INVALID_MESSAGE_ARGUMENTS;
-
-        if (*interface) {
-            if ((*entry = pa_hashmap_get(obj_entry->interfaces, interface)))
-                return SUCCESS;
-            else
-                return NO_SUCH_METHOD;
-        } else
-            return find_interface_by_property(obj_entry, property, entry);
-    }
-}
-
-static enum find_result_t find_interface(struct object_entry *obj_entry, DBusMessage *msg, struct interface_entry **entry) {
-    const char *interface;
-
-    pa_assert(obj_entry);
-    pa_assert(msg);
-    pa_assert(entry);
-
-    *entry = NULL;
-
-    if (dbus_message_has_interface(msg, DBUS_INTERFACE_PROPERTIES))
-        return find_interface_from_properties_call(obj_entry, msg, entry);
-
-    else if ((interface = dbus_message_get_interface(msg))) {
-        if ((*entry = pa_hashmap_get(obj_entry->interfaces, interface)))
-            return SUCCESS;
-        else
-            return NO_SUCH_METHOD;
-
-    } else { /* The method call doesn't contain an interface. */
-        if (dbus_message_has_member(msg, "Get") || dbus_message_has_member(msg, "Set") || dbus_message_has_member(msg, "GetAll")) {
-            if (find_interface_by_method(obj_entry, dbus_message_get_member(msg), entry) == SUCCESS)
-                return SUCCESS; /* The object has a method named Get, Set or GetAll in some other interface than .Properties. */
-            else
-                /* Assume this is a .Properties call. */
-                return find_interface_from_properties_call(obj_entry, msg, entry);
-
-        } else /* This is not a .Properties call. */
-            return find_interface_by_method(obj_entry, dbus_message_get_member(msg), entry);
-    }
-}
-
-static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessage *message, void *user_data) {
-    struct dbus_state *dbus_state = user_data;
-    struct object_entry *obj_entry;
-    struct interface_entry *iface_entry;
-    DBusMessage *reply = NULL;
-
-    pa_assert(connection);
-    pa_assert(message);
-    pa_assert(dbus_state);
-    pa_assert(dbus_state->objects);
-
-    if (dbus_message_get_type(message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
-        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-    pa_assert_se((obj_entry = pa_hashmap_get(dbus_state->objects, dbus_message_get_path(message))));
-
-    if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Introspectable", "Introspect") ||
-        (!dbus_message_get_interface(message) && dbus_message_has_member(message, "Introspect"))) {
-        if (!(reply = dbus_message_new_method_return(message)))
-            goto oom;
-
-        if (!dbus_message_append_args(reply, DBUS_TYPE_STRING, &obj_entry->introspection, DBUS_TYPE_INVALID))
-            goto fail;
-
-        if (!dbus_connection_send(connection, reply, NULL))
-            goto oom;
-
-        pa_log_debug("%s.%s handled.", obj_entry->path, "Introspect");
-
-        dbus_message_unref(reply);
-
-        return DBUS_HANDLER_RESULT_HANDLED;
-    }
-
-    switch (find_interface(obj_entry, message, &iface_entry)) {
-        case SUCCESS:
-            return iface_entry->receive(connection, message, iface_entry->userdata);
-
-        case NO_SUCH_PROPERTY:
-            if (!(reply = dbus_message_new_error(message, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "No such property")))
-                goto fail;
-
-            if (!dbus_connection_send(connection, reply, NULL))
-                goto oom;
-
-            dbus_message_unref(reply);
-
-            return DBUS_HANDLER_RESULT_HANDLED;
-
-        case NO_SUCH_METHOD:
-            return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-        case INVALID_MESSAGE_ARGUMENTS:
-            if (!(reply = dbus_message_new_error(message, DBUS_ERROR_INVALID_ARGS, "Invalid arguments")))
-                goto fail;
-
-            if (!dbus_connection_send(connection, reply, NULL))
-                goto oom;
-
-            dbus_message_unref(reply);
-
-            return DBUS_HANDLER_RESULT_HANDLED;
-
-        default:
-            pa_assert_not_reached();
-    }
-
-fail:
-    if (reply)
-        dbus_message_unref(reply);
-
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-
-oom:
-    if (reply)
-        dbus_message_unref(reply);
-
-    return DBUS_HANDLER_RESULT_NEED_MEMORY;
-}
-
-static DBusObjectPathVTable vtable = {
-    .unregister_function = NULL,
-    .message_function = handle_message_cb,
-    .dbus_internal_pad1 = NULL,
-    .dbus_internal_pad2 = NULL,
-    .dbus_internal_pad3 = NULL,
-    .dbus_internal_pad4 = NULL
-};
-
-static void register_object(struct dbus_state *dbus_state, struct object_entry *obj_entry) {
-    DBusConnection *conn;
-    void *state = NULL;
-
-    pa_assert(dbus_state);
-    pa_assert(obj_entry);
-
-    if (!dbus_state->connections)
-        return;
-
-    while ((conn = pa_idxset_iterate(dbus_state->connections, &state, NULL))) {
-        if (!dbus_connection_register_object_path(conn, obj_entry->path, &vtable, dbus_state))
-            pa_log_debug("dbus_connection_register_object_path() failed.");
-    }
-}
-
-static char **copy_strarray(const char * const *array) {
-    unsigned n = 0;
-    char **copy;
-    unsigned i;
-
-    while (array[n++])
-        ;
-
-    copy = pa_xnew0(char *, n);
-
-    for (i = 0; i < n - 1; ++i)
-        copy[i] = pa_xstrdup(array[i]);
-
-    return copy;
-}
-
-int pa_dbus_add_interface(pa_core *c,
-                          const char* path,
-                          const char* interface,
-                          const char * const *properties,
-                          const char * const *methods,
-                          const char* introspection_snippet,
-                          DBusObjectPathMessageFunction receive_cb,
-                          void *userdata) {
-    struct dbus_state *dbus_state;
-    pa_hashmap *objects;
-    struct object_entry *obj_entry;
-    struct interface_entry *iface_entry;
-    pa_bool_t state_created = FALSE;
-    pa_bool_t object_map_created = FALSE;
-    pa_bool_t obj_entry_created = FALSE;
-
-    pa_assert(c);
-    pa_assert(path);
-    pa_assert(introspection_snippet);
-    pa_assert(receive_cb);
-
-    if (!(dbus_state = pa_hashmap_get(c->shared, "dbus-state"))) {
-        dbus_state = pa_xnew0(struct dbus_state, 1);
-        dbus_state->core = c;
-        pa_hashmap_put(c->shared, "dbus-state", dbus_state);
-        state_created = TRUE;
-    }
-
-    if (!(objects = dbus_state->objects)) {
-        objects = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
-        dbus_state->objects = objects;
-        object_map_created = TRUE;
-    }
-
-    if (!(obj_entry = pa_hashmap_get(objects, path))) {
-        obj_entry = pa_xnew(struct object_entry, 1);
-        obj_entry->path = pa_xstrdup(path);
-        obj_entry->interfaces = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
-        obj_entry->introspection = NULL;
-        pa_hashmap_put(objects, path, obj_entry);
-        obj_entry_created = TRUE;
-    }
-
-    if (pa_hashmap_get(obj_entry->interfaces, interface) != NULL)
-        goto fail; /* The interface was already registered. */
-
-    iface_entry = pa_xnew(struct interface_entry, 1);
-    iface_entry->name = pa_xstrdup(interface);
-    iface_entry->properties = copy_strarray(properties);
-    iface_entry->methods = copy_strarray(methods);
-    iface_entry->introspection_snippet = pa_xstrdup(introspection_snippet);
-    iface_entry->receive = receive_cb;
-    iface_entry->userdata = userdata;
-    pa_hashmap_put(obj_entry->interfaces, iface_entry->name, iface_entry);
-
-    update_introspection(obj_entry);
-
-    if (obj_entry_created)
-        register_object(dbus_state, obj_entry);
-
-    return 0;
-
-fail:
-    if (obj_entry_created) {
-        pa_hashmap_remove(objects, path);
-        pa_xfree(obj_entry);
-    }
-
-    if (object_map_created) {
-        dbus_state->objects = NULL;
-        pa_hashmap_free(objects, NULL, NULL);
-    }
-
-    if (state_created) {
-        pa_hashmap_remove(c->shared, "dbus-state");
-        pa_xfree(dbus_state);
-    }
-
-    return -1;
-}
-
-static void unregister_object(struct dbus_state *dbus_state, struct object_entry *obj_entry) {
-    DBusConnection *conn;
-    void *state = NULL;
-
-    pa_assert(dbus_state);
-    pa_assert(obj_entry);
-
-    if (!dbus_state->connections)
-        return;
-
-    while ((conn = pa_idxset_iterate(dbus_state->connections, &state, NULL))) {
-        if (!dbus_connection_unregister_object_path(conn, obj_entry->path))
-            pa_log_debug("dbus_connection_unregister_object_path() failed.");
-    }
-}
-
-static void free_strarray(char **array) {
-    char **pos = array;
-
-    while (*pos++)
-        pa_xfree(*pos);
-
-    pa_xfree(array);
-}
-
-int pa_dbus_remove_interface(pa_core *c, const char* path, const char* interface) {
-    struct dbus_state *dbus_state;
-    pa_hashmap *objects;
-    struct object_entry *obj_entry;
-    struct interface_entry *iface_entry;
-
-    pa_assert(c);
-    pa_assert(path);
-    pa_assert(interface);
-
-    if (!(dbus_state = pa_hashmap_get(c->shared, "dbus-state")))
-        return -1;
-
-    if (!(objects = dbus_state->objects))
-        return -1;
-
-    if (!(obj_entry = pa_hashmap_get(objects, path)))
-        return -1;
-
-    if (!(iface_entry = pa_hashmap_remove(obj_entry->interfaces, interface)))
-        return -1;
-
-    update_introspection(obj_entry);
-
-    pa_xfree(iface_entry->name);
-    free_strarray(iface_entry->properties);
-    free_strarray(iface_entry->methods);
-    pa_xfree(iface_entry->introspection_snippet);
-    pa_xfree(iface_entry);
-
-    if (pa_hashmap_isempty(obj_entry->interfaces)) {
-        unregister_object(dbus_state, obj_entry);
-
-        pa_hashmap_remove(objects, path);
-        pa_xfree(obj_entry->path);
-        pa_hashmap_free(obj_entry->interfaces, NULL, NULL);
-        pa_xfree(obj_entry->introspection);
-        pa_xfree(obj_entry);
-    }
-
-    if (pa_hashmap_isempty(objects)) {
-        dbus_state->objects = NULL;
-        pa_hashmap_free(objects, NULL, NULL);
-    }
-
-    if (!dbus_state->objects && !dbus_state->connections) {
-        pa_hashmap_remove(c->shared, "dbus-state");
-        pa_xfree(dbus_state);
-    }
-
-    return 0;
-}
-
-static void register_all_objects(struct dbus_state *dbus_state, DBusConnection *conn) {
-    struct object_entry *obj_entry;
-    void *state = NULL;
-
-    pa_assert(dbus_state);
-    pa_assert(conn);
-
-    if (!dbus_state->objects)
-        return;
-
-    while ((obj_entry = pa_hashmap_iterate(dbus_state->objects, &state, NULL))) {
-        if (!dbus_connection_register_object_path(conn, obj_entry->path, &vtable, dbus_state))
-            pa_log_debug("dbus_connection_register_object_path() failed.");
-    }
-}
-
-int pa_dbus_register_connection(pa_core *c, DBusConnection *conn) {
-    struct dbus_state *dbus_state;
-    pa_idxset *connections;
-    pa_bool_t state_created = FALSE;
-    pa_bool_t connection_set_created = FALSE;
-
-    pa_assert(c);
-    pa_assert(conn);
-
-    if (!(dbus_state = pa_hashmap_get(c->shared, "dbus-state"))) {
-        dbus_state = pa_xnew0(struct dbus_state, 1);
-        dbus_state->core = c;
-        pa_hashmap_put(c->shared, "dbus-state", dbus_state);
-        state_created = TRUE;
-    }
-
-    if (!(connections = dbus_state->connections)) {
-        connections = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
-        dbus_state->connections = connections;
-        connection_set_created = TRUE;
-    }
-
-    if (pa_idxset_get_by_data(connections, conn, NULL))
-        goto fail; /* The connection was already registered. */
-
-    register_all_objects(dbus_state, conn);
-
-    pa_idxset_put(connections, dbus_connection_ref(conn), NULL);
-
-    return 0;
-
-fail:
-    if (connection_set_created) {
-        dbus_state->connections = NULL;
-        pa_idxset_free(connections, NULL, NULL);
-    }
-
-    if (state_created) {
-        pa_hashmap_remove(c->shared, "dbus-state");
-        pa_xfree(dbus_state);
-    }
-
-    return -1;
-}
-
-static void unregister_all_objects(struct dbus_state *dbus_state, DBusConnection *conn) {
-    struct object_entry *obj_entry;
-    void *state = NULL;
-
-    pa_assert(dbus_state);
-    pa_assert(conn);
-
-    if (!dbus_state->objects)
-        return;
-
-    while ((obj_entry = pa_hashmap_iterate(dbus_state->objects, &state, NULL))) {
-        if (!dbus_connection_unregister_object_path(conn, obj_entry->path))
-            pa_log_debug("dus_connection_unregister_object_path() failed.");
-    }
-}
-
-int pa_dbus_unregister_connection(pa_core *c, DBusConnection *conn) {
-    struct dbus_state *dbus_state;
-    pa_idxset *connections;
-
-    pa_assert(c);
-    pa_assert(conn);
-
-    if (!(dbus_state = pa_hashmap_get(c->shared, "dbus-state")))
-        return -1;
-
-    if (!(connections = dbus_state->connections))
-        return -1;
-
-    if (!pa_idxset_remove_by_data(connections, conn, NULL))
-        return -1;
-
-    unregister_all_objects(dbus_state, conn);
-
-    dbus_connection_unref(conn);
-
-    if (pa_idxset_isempty(connections)) {
-        dbus_state->connections = NULL;
-        pa_idxset_free(connections, NULL, NULL);
-    }
-
-    if (!dbus_state->objects && !dbus_state->connections) {
-        pa_hashmap_remove(c->shared, "dbus-state");
-        pa_xfree(dbus_state);
-    }
-
-    return 0;
-}
diff --git a/src/pulsecore/dbus-common.h b/src/pulsecore/dbus-common.h
deleted file mode 100644
index 4354c4e..0000000
--- a/src/pulsecore/dbus-common.h
+++ /dev/null
@@ -1,85 +0,0 @@
-#ifndef foodbuscommonhfoo
-#define foodbuscommonhfoo
-
-/***
-  This file is part of PulseAudio.
-
-  Copyright 2009 Tanu Kaskinen
-
-  PulseAudio is free software; you can redistribute it and/or modify
-  it under the terms of the GNU Lesser General Public License as published
-  by the Free Software Foundation; either version 2.1 of the License,
-  or (at your option) any later version.
-
-  PulseAudio is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public License
-  along with PulseAudio; if not, write to the Free Software
-  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-  USA.
-***/
-
-#include <dbus/dbus.h>
-
-#include <pulsecore/core.h>
-#include <pulsecore/macro.h>
-
-#define PA_DBUS_DEFAULT_PORT 24883
-#define PA_DBUS_SOCKET_NAME "dbus-socket"
-
-#define PA_DBUS_SYSTEM_SOCKET_PATH PA_SYSTEM_RUNTIME_PATH PA_PATH_SEP PA_DBUS_SOCKET_NAME
-
-#define PA_DBUS_ERROR_NO_SUCH_PROPERTY "org.PulseAudio.Core1.NoSuchPropertyError"
-
-/* NOTE: These functions may only be called from the main thread. */
-
-/* Returns the default address of the server type in the escaped form. For
- * PA_SERVER_TYPE_NONE an empty string is returned. The caller frees the
- * string. This function may fail in some rare cases, in which case NULL is
- * returned. */
-char *pa_get_dbus_address_from_server_type(pa_server_type_t server_type);
-
-/* Registers the given interface to the given object path. This is additive: it
- * doesn't matter whether or not the object has already been registered; if it
- * is, then its interface set is just extended.
- *
- * Introspection requests are handled automatically. For that to work, the
- * caller gives an XML snippet containing the interface introspection element.
- * All interface snippets are automatically combined to provide the final
- * introspection string for the object.
- *
- * The introspection snippet contains the interface name, the property names
- * and the method namess, but since this function doesn't do XML parsing, the
- * information needs to be given separately. Property and method names are
- * given as a NULL-terminated array of strings. The interface name is used for
- * message routing, and so are the property and method names too in case the
- * client doesn't tell which interface he's trying to access; in absence of
- * interface information from the client, the correct interface is searched
- * based on the property or method name.
- *
- * Fails and returns a negative number if the object already has the interface
- * registered. */
-int pa_dbus_add_interface(pa_core *c,
-                          const char* path,
-                          const char* interface,
-                          const char * const *properties,
-                          const char * const *methods,
-                          const char* introspection_snippet,
-                          DBusObjectPathMessageFunction receive_cb,
-                          void *userdata);
-
-/* Returns a negative number if the given object doesn't have the given
- * interface registered. */
-int pa_dbus_remove_interface(pa_core *c, const char* path, const char* interface);
-
-/* Fails and returns a negative number if the connection is already
- * registered. */
-int pa_dbus_register_connection(pa_core *c, DBusConnection *conn);
-
-/* Returns a negative number if the connection wasn't registered. */
-int pa_dbus_unregister_connection(pa_core *c, DBusConnection *conn);
-
-#endif
diff --git a/src/pulsecore/dbus-objs/core.c b/src/pulsecore/dbus-objs/core.c
deleted file mode 100644
index 18bbf78..0000000
--- a/src/pulsecore/dbus-objs/core.c
+++ /dev/null
@@ -1,482 +0,0 @@
-/***
-  This file is part of PulseAudio.
-
-  Copyright 2009 Tanu Kaskinen
-
-  PulseAudio is free software; you can redistribute it and/or modify
-  it under the terms of the GNU Lesser General Public License as published
-  by the Free Software Foundation; either version 2.1 of the License,
-  or (at your option) any later version.
-
-  PulseAudio is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public License
-  along with PulseAudio; if not, 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 <dbus/dbus.h>
-
-#include <pulse/xmalloc.h>
-
-#include <pulsecore/core-util.h>
-#include <pulsecore/dbus-common.h>
-#include <pulsecore/macro.h>
-
-#include "core.h"
-
-#define OBJECT_PATH "/org/pulseaudio1"
-#define INTERFACE_CORE "org.PulseAudio.Core1"
-
-struct pa_dbusobj_core {
-    pa_core *core;
-};
-
-static const char *introspection_snippet =
-    " <interface name=\"" INTERFACE_CORE "\">\n"
-    "  <method name=\"GetCardByName\">\n"
-    "   <arg name=\"Name\" type=\"s\" direction=\"in\"/>\n"
-    "   <arg name=\"Card\" type=\"o\" direction=\"out\"/>\n"
-    "  </method>\n"
-    "  <method name=\"GetSinkByName\">\n"
-    "   <arg name=\"Name\" type=\"s\" direction=\"in\"/>\n"
-    "   <arg name=\"Sink\" type=\"o\" direction=\"out\"/>\n"
-    "  </method>\n"
-    "  <method name=\"GetSourceByName\">\n"
-    "   <arg name=\"Name\" type=\"s\" direction=\"in\"/>\n"
-    "   <arg name=\"Source\" type=\"o\" direction=\"out\"/>\n"
-    "  </method>\n"
-    "  <method name=\"GetSampleByName\">\n"
-    "   <arg name=\"Name\" type=\"s\" direction=\"in\"/>\n"
-    "   <arg name=\"Sample\" type=\"o\" direction=\"out\"/>\n"
-    "  </method>\n"
-    "  <method name=\"UploadSample\">\n"
-    "   <arg name=\"Name\" type=\"s\" direction=\"in\"/>\n"
-    "   <arg name=\"SampleFormat\" type=\"y\" direction=\"in\"/>\n"
-    "   <arg name=\"SampleRate\" type=\"u\" direction=\"in\"/>\n"
-    "   <arg name=\"Channels\" type=\"ay\" direction=\"in\"/>\n"
-    "   <arg name=\"DefaultVolume\" type=\"au\" direction=\"in\"/>\n"
-    "   <arg name=\"Proplist\" type=\"a{say}\" direction=\"in\"/>\n"
-    "   <arg name=\"Data\" type=\"ay\" direction=\"in\"/>\n"
-    "   <arg name=\"Sample\" type=\"o\" direction=\"out\"/>\n"
-    "  </method>\n"
-    "  <method name=\"LoadSampleFromFile\">\n"
-    "   <arg name=\"Name\" type=\"s\" direction=\"in\"/>\n"
-    "   <arg name=\"Filepath\" type=\"s\" direction=\"in\"/>\n"
-    "   <arg name=\"Sample\" type=\"o\" direction=\"out\"/>\n"
-    "  </method>\n"
-    "  <method name=\"AddLazySample\">\n"
-    "   <arg name=\"Name\" type=\"s\" direction=\"in\"/>\n"
-    "   <arg name=\"Filepath\" type=\"s\" direction=\"in\"/>\n"
-    "   <arg name=\"Sample\" type=\"o\" direction=\"out\"/>\n"
-    "  </method>\n"
-    "  <method name=\"AddLazySamplesFromDirectory\">\n"
-    "   <arg name=\"Dirpath\" type=\"s\" direction=\"in\"/>\n"
-    "  </method>\n"
-    "  <method name=\"LoadModule\">\n"
-    "   <arg name=\"Name\" type=\"s\" direction=\"in\"/>\n"
-    "   <arg name=\"Arguments\" type=\"a{ss}\" direction=\"in\"/>\n"
-    "   <arg name=\"Module\" type=\"o\" direction=\"out\"/>\n"
-    "  </method>\n"
-    "  <method name=\"Exit\"/>\n"
-    "  <signal name=\"NewCard\">\n"
-    "   <arg name=\"Card\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"CardRemoved\">\n"
-    "   <arg name=\"Card\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"NewSink\">\n"
-    "   <arg name=\"Sink\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"SinkRemoved\">\n"
-    "   <arg name=\"Sink\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"FallbackSinkUpdated\">\n"
-    "   <arg name=\"Sink\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"NewSource\">\n"
-    "   <arg name=\"Source\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"SourceRemoved\">\n"
-    "   <arg name=\"Source\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"FallbackSourceUpdated\">\n"
-    "   <arg name=\"Source\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"NewPlaybackStream\">\n"
-    "   <arg name=\"PlaybackStream\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"PlaybackStreamRemoved\">\n"
-    "   <arg name=\"PlaybackStream\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"NewRecordStream\">\n"
-    "   <arg name=\"RecordStream\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"RecordStreamRemoved\">\n"
-    "   <arg name=\"RecordStream\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"NewSample\">\n"
-    "   <arg name=\"Sample\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"SampleRemoved\">\n"
-    "   <arg name=\"Sample\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"NewModule\">\n"
-    "   <arg name=\"Module\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"ModuleRemoved\">\n"
-    "   <arg name=\"Module\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"NewClient\">\n"
-    "   <arg name=\"Client\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <signal name=\"ClientRemoved\">\n"
-    "   <arg name=\"Client\" type=\"o\"/>\n"
-    "  </signal>\n"
-    "  <property name=\"InterfaceRevision\" type=\"u\" access=\"read\"/>\n"
-    "  <property name=\"Name\" type=\"s\" access=\"read\"/>\n"
-    "  <property name=\"Version\" type=\"s\" access=\"read\"/>\n"
-    "  <property name=\"Username\" type=\"s\" access=\"read\"/>\n"
-    "  <property name=\"Hostname\" type=\"s\" access=\"read\"/>\n"
-    "  <property name=\"DefaultChannels\" type=\"ay\" access=\"readwrite\"/>\n"
-    "  <property name=\"DefaultSampleFormat\" type=\"y\" access=\"readwrite\"/>\n"
-    "  <property name=\"DefaultSampleRate\" type=\"u\" access=\"readwrite\"/>\n"
-    "  <property name=\"Sinks\" type=\"ao\" access=\"read\"/>\n"
-    "  <property name=\"FallbackSink\" type=\"s\" access=\"readwrite\"/>\n"
-    "  <property name=\"Sources\" type=\"ao\" access=\"read\"/>\n"
-    "  <property name=\"FallbackSource\" type=\"o\" access=\"readwrite\"/>\n"
-    "  <property name=\"PlaybackStreams\" type=\"ao\" access=\"read\"/>\n"
-    "  <property name=\"RecordStreams\" type=\"ao\" access=\"read\"/>\n"
-    "  <property name=\"Samples\" type=\"ao\" access=\"read\"/>\n"
-    "  <property name=\"Modules\" type=\"ao\" access=\"read\"/>\n"
-    "  <property name=\"Clients\" type=\"ao\" access=\"read\"/>\n"
-    "  <property name=\"Extensions\" type=\"as\" access=\"read\"/>\n"
-    " </interface>\n";
-
-/* If you need to modify this list, note that handle_get_all() uses hard-coded
- * indexes to point to these strings, so make sure the indexes don't go wrong
- * there. */
-static const char *properties[] = {
-    "InterfaceRevision",
-    "Name",
-    "Version",
-    "Username",
-    "Hostname",
-    "DefaultChannels",
-    "DefaultSampleFormat",
-    "DefaultSampleRate",
-    "Sinks",
-    "FallbackSink",
-    "Sources",
-    "FallbackSource",
-    "PlaybackStreams",
-    "RecordStreams",
-    "Samples",
-    "Modules",
-    "Clients",
-    "Extensions",
-    NULL
-};
-
-static const char *methods[] = {
-    "GetCardByName",
-    "GetSinkByName",
-    "GetSourceByName",
-    "GetSampleByName",
-    "UploadSample",
-    "LoadSampleFromFile",
-    "AddLazySample",
-    "AddLazySamplesFromDirectory",
-    "LoadModule",
-    "Exit",
-    NULL
-};
-
-static DBusHandlerResult handle_get_name(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_core *c) {
-    DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED;
-    DBusMessage *reply = NULL;
-    const char *server_name = PACKAGE_NAME;
-    DBusMessageIter msg_iter;
-    DBusMessageIter variant_iter;
-
-    pa_assert(conn);
-    pa_assert(msg);
-    pa_assert(c);
-
-    if (!(reply = dbus_message_new_method_return(msg))) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    dbus_message_iter_init_append(reply, &msg_iter);
-    if (!dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_VARIANT, "s", &variant_iter)) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    if (!dbus_message_iter_append_basic(&variant_iter, DBUS_TYPE_STRING, &server_name)) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    if (!dbus_message_iter_close_container(&msg_iter, &variant_iter)) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    if (!dbus_connection_send(conn, reply, NULL)) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    r = DBUS_HANDLER_RESULT_HANDLED;
-
-finish:
-    if (reply)
-        dbus_message_unref(reply);
-
-    return r;
-}
-
-static DBusHandlerResult handle_get(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_core *c) {
-    DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED;
-    const char* interface;
-    const char* property;
-    DBusMessage *reply = NULL;
-
-    pa_assert(conn);
-    pa_assert(msg);
-    pa_assert(c);
-
-    if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID)) {
-        if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, "Invalid arguments"))) {
-            r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-            goto finish;
-        }
-        if (!dbus_connection_send(conn, reply, NULL)) {
-            r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-            goto finish;
-        }
-        r = DBUS_HANDLER_RESULT_HANDLED;
-        goto finish;
-    }
-
-    if (*interface && !pa_streq(interface, INTERFACE_CORE)) {
-        r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-        goto finish;
-    }
-
-    if (pa_streq(property, "Name")) {
-        r = handle_get_name(conn, msg, c);
-        goto finish;
-    }
-
-    if (!(reply = dbus_message_new_error_printf(msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s: No such property", property))) {
-        r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-        goto finish;
-    }
-    if (!dbus_connection_send(conn, reply, NULL)) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    r = DBUS_HANDLER_RESULT_HANDLED;
-
-finish:
-    if (reply)
-        dbus_message_unref(reply);
-
-    return r;
-}
-
-static DBusHandlerResult handle_set(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_core *c) {
-    DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED;
-    const char* interface;
-    const char* property;
-    DBusMessage *reply = NULL;
-
-    pa_assert(conn);
-    pa_assert(msg);
-    pa_assert(c);
-
-    if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID)) {
-        if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, "Invalid arguments"))) {
-            r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-            goto finish;
-        }
-        if (!dbus_connection_send(conn, reply, NULL)) {
-            r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-            goto finish;
-        }
-        r = DBUS_HANDLER_RESULT_HANDLED;
-        goto finish;
-    }
-
-    if (*interface && !pa_streq(interface, INTERFACE_CORE)) {
-        r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-        goto finish;
-    }
-
-    if (pa_streq(property, "Name")) {
-        if (!(reply = dbus_message_new_error_printf(msg, DBUS_ERROR_ACCESS_DENIED, "%s: Property not settable", property))) {
-            r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-            goto finish;
-        }
-        if (!dbus_connection_send(conn, reply, NULL)) {
-            r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-            goto finish;
-        }
-        r = DBUS_HANDLER_RESULT_HANDLED;
-        goto finish;
-    }
-
-    if (!(reply = dbus_message_new_error_printf(msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s: No such property", property))) {
-        r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-        goto finish;
-    }
-    if (!dbus_connection_send(conn, reply, NULL)) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    r = DBUS_HANDLER_RESULT_HANDLED;
-    goto finish;
-
-    if (!(reply = dbus_message_new_error_printf(msg, DBUS_ERROR_ACCESS_DENIED, "%s: Property not settable", property))) {
-        r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-        goto finish;
-    }
-    if (!dbus_connection_send(conn, reply, NULL)) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    r = DBUS_HANDLER_RESULT_HANDLED;
-
-finish:
-    if (reply)
-        dbus_message_unref(reply);
-
-    return r;
-}
-
-static DBusHandlerResult handle_get_all(DBusConnection *conn, DBusMessage *msg, pa_dbusobj_core *c) {
-    DBusHandlerResult r = DBUS_HANDLER_RESULT_HANDLED;
-    DBusMessage *reply = NULL;
-    char *interface = NULL;
-    char const *server_name = PACKAGE_NAME;
-    DBusMessageIter msg_iter;
-    DBusMessageIter dict_iter;
-    DBusMessageIter dict_entry_iter;
-    DBusMessageIter variant_iter;
-
-    pa_assert(conn);
-    pa_assert(msg);
-    pa_assert(c);
-
-    if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID)) {
-        if (!(reply = dbus_message_new_error(msg, DBUS_ERROR_INVALID_ARGS, "Invalid arguments"))) {
-            r = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-            goto finish;
-        }
-        if (!dbus_connection_send(conn, reply, NULL)) {
-            r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-            goto finish;
-        }
-        r = DBUS_HANDLER_RESULT_HANDLED;
-        goto finish;
-    }
-
-    if (!(reply = dbus_message_new_method_return(msg))) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    dbus_message_iter_init_append(reply, &msg_iter);
-    if (!dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter)) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    if (!dbus_message_iter_open_container(&dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter)) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    if (!dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &properties[1])) { /* Name */
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    if (!dbus_message_iter_open_container(&dict_entry_iter, DBUS_TYPE_VARIANT, "s", &variant_iter)) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    if (!dbus_message_iter_append_basic(&variant_iter, DBUS_TYPE_STRING, &server_name)) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    if (!dbus_message_iter_close_container(&dict_entry_iter, &variant_iter)) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    if (!dbus_message_iter_close_container(&dict_iter, &dict_entry_iter)) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    if (!dbus_message_iter_close_container(&msg_iter, &dict_iter)) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    if (!dbus_connection_send(conn, reply, NULL)) {
-        r = DBUS_HANDLER_RESULT_NEED_MEMORY;
-        goto finish;
-    }
-    r = DBUS_HANDLER_RESULT_HANDLED;
-
-finish:
-    if (reply)
-        dbus_message_unref(reply);
-
-    return r;
-}
-
-static DBusHandlerResult receive_cb(DBusConnection *connection, DBusMessage *message, void *user_data) {
-    pa_dbusobj_core *c = user_data;
-
-    pa_assert(connection);
-    pa_assert(message);
-    pa_assert(c);
-
-    if (dbus_message_is_method_call(message, DBUS_INTERFACE_PROPERTIES, "Get") ||
-        (!dbus_message_get_interface(message) && dbus_message_has_member(message, "Get")))
-        return handle_get(connection, message, c);
-
-    if (dbus_message_is_method_call(message, DBUS_INTERFACE_PROPERTIES, "Set") ||
-        (!dbus_message_get_interface(message) && dbus_message_has_member(message, "Set")))
-        return handle_set(connection, message, c);
-
-    if (dbus_message_is_method_call(message, DBUS_INTERFACE_PROPERTIES, "GetAll") ||
-        (!dbus_message_get_interface(message) && dbus_message_has_member(message, "GetAll")))
-        return handle_get_all(connection, message, c);
-
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-}
-
-pa_dbusobj_core *pa_dbusobj_core_new(pa_core *core) {
-    pa_dbusobj_core *c;
-
-    pa_assert(core);
-
-    c = pa_xnew(pa_dbusobj_core, 1);
-    c->core = core;
-
-    pa_dbus_add_interface(core, OBJECT_PATH, INTERFACE_CORE, properties, methods, introspection_snippet, receive_cb, c);
-
-
-    return c;
-}
-
-void pa_dbusobj_core_free(pa_dbusobj_core *c) {
-    pa_assert(c);
-
-    pa_dbus_remove_interface(c->core, OBJECT_PATH, INTERFACE_CORE);
-
-    pa_xfree(c);
-}
diff --git a/src/pulsecore/dbus-objs/core.h b/src/pulsecore/dbus-objs/core.h
deleted file mode 100644
index 8e59cc3..0000000
--- a/src/pulsecore/dbus-objs/core.h
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef foodbusobjscorehfoo
-#define foodbusobjscorehfoo
-
-/***
-  This file is part of PulseAudio.
-
-  Copyright 2009 Tanu Kaskinen
-
-  PulseAudio is free software; you can redistribute it and/or modify
-  it under the terms of the GNU Lesser General Public License as published
-  by the Free Software Foundation; either version 2.1 of the License,
-  or (at your option) any later version.
-
-  PulseAudio is distributed in the hope that it will be useful, but
-  WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-  General Public License for more details.
-
-  You should have received a copy of the GNU Lesser General Public License
-  along with PulseAudio; if not, write to the Free Software
-  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
-  USA.
-***/
-
-/* This object implements the D-Bus object at path /org/pulseaudio/core.
- * The implemented interface is org.pulseaudio.Core.
- *
- * See http://pulseaudio.org/wiki/DBusInterface for the Core interface
- * documentation.
- */
-
-#include <pulsecore/core.h>
-
-typedef struct pa_dbusobj_core pa_dbusobj_core;
-
-pa_dbusobj_core *pa_dbusobj_core_new(pa_core *core);
-void pa_dbusobj_core_free(pa_dbusobj_core *c);
-
-#endif
diff --git a/src/pulsecore/dbus-util.c b/src/pulsecore/dbus-util.c
index e047dc3..cfc3e8c 100644
--- a/src/pulsecore/dbus-util.c
+++ b/src/pulsecore/dbus-util.c
@@ -28,6 +28,7 @@
 
 #include <pulse/rtclock.h>
 #include <pulse/timeval.h>
+#include <pulse/utf8.h>
 #include <pulse/xmalloc.h>
 
 #include <pulsecore/core-rtclock.h>
@@ -444,3 +445,335 @@ void pa_dbus_free_pending_list(pa_dbus_pending **p) {
         pa_dbus_pending_free(i);
     }
 }
+
+void pa_dbus_send_error(DBusConnection *c, DBusMessage *in_reply_to, const char *name, const char *message) {
+    DBusMessage *reply = NULL;
+
+    pa_assert(c);
+    pa_assert(in_reply_to);
+    pa_assert(name);
+    pa_assert(message);
+
+    pa_assert_se((reply = dbus_message_new_error(in_reply_to, name, message)));
+    pa_assert_se(dbus_connection_send(c, reply, NULL));
+
+    dbus_message_unref(reply);
+}
+
+void pa_dbus_send_empty_reply(DBusConnection *c, DBusMessage *in_reply_to) {
+    DBusMessage *reply = NULL;
+
+    pa_assert(c);
+    pa_assert(in_reply_to);
+
+    pa_assert_se((reply = dbus_message_new_method_return(in_reply_to)));
+    pa_assert_se(dbus_connection_send(c, reply, NULL));
+    dbus_message_unref(reply);
+}
+
+void pa_dbus_send_basic_value_reply(DBusConnection *c, DBusMessage *in_reply_to, int type, void *data) {
+    DBusMessage *reply = NULL;
+
+    pa_assert(c);
+    pa_assert(in_reply_to);
+    pa_assert(dbus_type_is_basic(type));
+    pa_assert(data);
+
+    pa_assert_se((reply = dbus_message_new_method_return(in_reply_to)));
+    pa_assert_se(dbus_message_append_args(reply, type, data, DBUS_TYPE_INVALID));
+    pa_assert_se(dbus_connection_send(c, reply, NULL));
+    dbus_message_unref(reply);
+}
+
+static const char *signature_from_basic_type(int type) {
+    switch (type) {
+        case DBUS_TYPE_BOOLEAN: return DBUS_TYPE_BOOLEAN_AS_STRING;
+        case DBUS_TYPE_BYTE: return DBUS_TYPE_BYTE_AS_STRING;
+        case DBUS_TYPE_INT16: return DBUS_TYPE_INT16_AS_STRING;
+        case DBUS_TYPE_UINT16: return DBUS_TYPE_UINT16_AS_STRING;
+        case DBUS_TYPE_INT32: return DBUS_TYPE_INT32_AS_STRING;
+        case DBUS_TYPE_UINT32: return DBUS_TYPE_UINT32_AS_STRING;
+        case DBUS_TYPE_INT64: return DBUS_TYPE_INT64_AS_STRING;
+        case DBUS_TYPE_UINT64: return DBUS_TYPE_UINT64_AS_STRING;
+        case DBUS_TYPE_DOUBLE: return DBUS_TYPE_DOUBLE_AS_STRING;
+        case DBUS_TYPE_STRING: return DBUS_TYPE_STRING_AS_STRING;
+        case DBUS_TYPE_OBJECT_PATH: return DBUS_TYPE_OBJECT_PATH_AS_STRING;
+        case DBUS_TYPE_SIGNATURE: return DBUS_TYPE_SIGNATURE_AS_STRING;
+        default: pa_assert_not_reached();
+    }
+}
+
+void pa_dbus_send_basic_variant_reply(DBusConnection *c, DBusMessage *in_reply_to, int type, void *data) {
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter variant_iter;
+
+    pa_assert(c);
+    pa_assert(in_reply_to);
+    pa_assert(dbus_type_is_basic(type));
+    pa_assert(data);
+
+    pa_assert_se((reply = dbus_message_new_method_return(in_reply_to)));
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_VARIANT, signature_from_basic_type(type), &variant_iter));
+    pa_assert_se(dbus_message_iter_append_basic(&variant_iter, type, data));
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &variant_iter));
+    pa_assert_se(dbus_connection_send(c, reply, NULL));
+    dbus_message_unref(reply);
+}
+
+/* Note: returns sizeof(char*) for strings, object paths and signatures. */
+static unsigned basic_type_size(int type) {
+    switch (type) {
+        case DBUS_TYPE_BOOLEAN: return sizeof(dbus_bool_t);
+        case DBUS_TYPE_BYTE: return 1;
+        case DBUS_TYPE_INT16: return sizeof(dbus_int16_t);
+        case DBUS_TYPE_UINT16: return sizeof(dbus_uint16_t);
+        case DBUS_TYPE_INT32: return sizeof(dbus_int32_t);
+        case DBUS_TYPE_UINT32: return sizeof(dbus_uint32_t);
+        case DBUS_TYPE_INT64: return sizeof(dbus_int64_t);
+        case DBUS_TYPE_UINT64: return sizeof(dbus_uint64_t);
+        case DBUS_TYPE_DOUBLE: return sizeof(double);
+        case DBUS_TYPE_STRING:
+        case DBUS_TYPE_OBJECT_PATH:
+        case DBUS_TYPE_SIGNATURE: return sizeof(char*);
+        default: pa_assert_not_reached();
+    }
+}
+
+void pa_dbus_send_basic_array_variant_reply(DBusConnection *c, DBusMessage *in_reply_to, int item_type, void *array, unsigned n) {
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+
+    pa_assert(c);
+    pa_assert(in_reply_to);
+    pa_assert(dbus_type_is_basic(item_type));
+    pa_assert(array || n == 0);
+
+    pa_assert_se((reply = dbus_message_new_method_return(in_reply_to)));
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_dbus_append_basic_array_variant(&msg_iter, item_type, array, n);
+    pa_assert_se(dbus_connection_send(c, reply, NULL));
+    dbus_message_unref(reply);
+}
+
+void pa_dbus_append_basic_array(DBusMessageIter *iter, int item_type, const void *array, unsigned n) {
+    DBusMessageIter array_iter;
+    unsigned i;
+    unsigned item_size;
+
+    pa_assert(iter);
+    pa_assert(dbus_type_is_basic(item_type));
+    pa_assert(array || n == 0);
+
+    item_size = basic_type_size(item_type);
+
+    pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, signature_from_basic_type(item_type), &array_iter));
+
+    for (i = 0; i < n; ++i)
+        pa_assert_se(dbus_message_iter_append_basic(&array_iter, item_type, &((uint8_t*) array)[i * item_size]));
+
+    pa_assert_se(dbus_message_iter_close_container(iter, &array_iter));
+};
+
+void pa_dbus_append_basic_variant(DBusMessageIter *iter, int type, void *data) {
+    DBusMessageIter variant_iter;
+
+    pa_assert(iter);
+    pa_assert(dbus_type_is_basic(type));
+    pa_assert(data);
+
+    pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, signature_from_basic_type(type), &variant_iter));
+    pa_assert_se(dbus_message_iter_append_basic(&variant_iter, type, data));
+    pa_assert_se(dbus_message_iter_close_container(iter, &variant_iter));
+}
+
+void pa_dbus_append_basic_array_variant(DBusMessageIter *iter, int item_type, const void *array, unsigned n) {
+    DBusMessageIter variant_iter;
+    char *array_signature;
+
+    pa_assert(iter);
+    pa_assert(dbus_type_is_basic(item_type));
+    pa_assert(array || n == 0);
+
+    array_signature = pa_sprintf_malloc("a%c", *signature_from_basic_type(item_type));
+
+    pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, array_signature, &variant_iter));
+    pa_dbus_append_basic_array(&variant_iter, item_type, array, n);
+    pa_assert_se(dbus_message_iter_close_container(iter, &variant_iter));
+
+    pa_xfree(array_signature);
+}
+
+void pa_dbus_append_basic_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, int type, void *data) {
+    DBusMessageIter dict_entry_iter;
+
+    pa_assert(dict_iter);
+    pa_assert(key);
+    pa_assert(dbus_type_is_basic(type));
+    pa_assert(data);
+
+    pa_assert_se(dbus_message_iter_open_container(dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter));
+    pa_assert_se(dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &key));
+    pa_dbus_append_basic_variant(&dict_entry_iter, type, data);
+    pa_assert_se(dbus_message_iter_close_container(dict_iter, &dict_entry_iter));
+}
+
+void pa_dbus_append_basic_array_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, int item_type, const void *array, unsigned n) {
+    DBusMessageIter dict_entry_iter;
+
+    pa_assert(dict_iter);
+    pa_assert(key);
+    pa_assert(dbus_type_is_basic(item_type));
+    pa_assert(array || n == 0);
+
+    pa_assert_se(dbus_message_iter_open_container(dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter));
+    pa_assert_se(dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &key));
+    pa_dbus_append_basic_array_variant(&dict_entry_iter, item_type, array, n);
+    pa_assert_se(dbus_message_iter_close_container(dict_iter, &dict_entry_iter));
+}
+
+int pa_dbus_get_basic_set_property_arg(DBusConnection *c, DBusMessage *msg, int type, void *data) {
+    DBusMessageIter msg_iter;
+    DBusMessageIter variant_iter;
+
+    pa_assert(c);
+    pa_assert(msg);
+    pa_assert(dbus_type_is_basic(type));
+    pa_assert(data);
+
+    /* Skip the interface and property name arguments. */
+    if (!dbus_message_iter_init(msg, &msg_iter) || !dbus_message_iter_next(&msg_iter) || !dbus_message_iter_next(&msg_iter)) {
+        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
+        return -1;
+    }
+
+    if (dbus_message_iter_get_arg_type(&msg_iter) != DBUS_TYPE_VARIANT) {
+        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Message argument isn't a variant.");
+        return -1;
+    }
+
+    dbus_message_iter_recurse(&msg_iter, &variant_iter);
+
+    if (dbus_message_iter_get_arg_type(&variant_iter) != type) {
+        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Variant has wrong contained type.");
+        return -1;
+    }
+
+    dbus_message_iter_get_basic(&variant_iter, data);
+
+    return 0;
+}
+
+int pa_dbus_get_basic_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter, int type, void *data) {
+    pa_assert(c);
+    pa_assert(msg);
+    pa_assert(iter);
+    pa_assert(dbus_type_is_basic(type));
+    pa_assert(data);
+
+    if (dbus_message_iter_get_arg_type(iter) != type) {
+        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type or too few arguments.");
+        return -1;
+    }
+
+    dbus_message_iter_get_basic(iter, data);
+
+    return 0;
+}
+
+int pa_dbus_get_fixed_array_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter, int item_type, void *array, unsigned *n) {
+    DBusMessageIter array_iter;
+    int signed_n;
+
+    pa_assert(c);
+    pa_assert(msg);
+    pa_assert(iter);
+    pa_assert(dbus_type_is_fixed(item_type));
+    pa_assert(array);
+    pa_assert(n);
+
+    if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY) {
+        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type or too few arguments. An array was expected.");
+        return -1;
+    }
+
+    if (dbus_message_iter_get_element_type(iter) != item_type) {
+        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong array element type.");
+        return -1;
+    }
+
+    dbus_message_iter_recurse(iter, &array_iter);
+
+    dbus_message_iter_get_fixed_array(&array_iter, array, &signed_n);
+
+    pa_assert(signed_n >= 0);
+
+    *n = signed_n;
+
+    return 0;
+}
+
+pa_proplist *pa_dbus_get_proplist_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter) {
+    DBusMessageIter dict_iter;
+    pa_proplist *proplist = NULL;
+    const char *key;
+    const uint8_t *value;
+    int value_length;
+
+    pa_assert(c);
+    pa_assert(msg);
+    pa_assert(iter);
+
+    if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY) {
+        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type or too few arguments. An array was expected.");
+        return NULL;
+    }
+
+    if (dbus_message_iter_get_element_type(iter) != DBUS_TYPE_DICT_ENTRY) {
+        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong array element type. A dict entry was expected.");
+        return NULL;
+    }
+
+    proplist = pa_proplist_new();
+
+    dbus_message_iter_recurse(iter, &dict_iter);
+
+    while (dbus_message_iter_has_next(&dict_iter)) {
+        if (dbus_message_iter_get_arg_type(&dict_iter) != DBUS_TYPE_STRING) {
+            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict key type. A string was expected.");
+            goto fail;
+        }
+
+        dbus_message_iter_get_basic(&dict_iter, &key);
+
+        if (strlen(key) <= 0 || !pa_ascii_valid(key)) {
+            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Invalid property list key.");
+            goto fail;
+        }
+
+        if (dbus_message_iter_get_arg_type(&dict_iter) != DBUS_TYPE_ARRAY) {
+            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict value type. An array was expected.");
+            goto fail;
+        }
+
+        if (dbus_message_iter_get_element_type(&dict_iter) != DBUS_TYPE_BYTE) {
+            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict value item type. A byte was expected.");
+            goto fail;
+        }
+
+        dbus_message_iter_get_fixed_array(&dict_iter, &value, &value_length);
+
+        pa_assert(value_length >= 0);
+
+        pa_assert_se(pa_proplist_set(proplist, key, value, value_length) >= 0);
+    }
+
+    return proplist;
+
+fail:
+    if (proplist)
+        pa_proplist_free(proplist);
+
+    return NULL;
+}
diff --git a/src/pulsecore/dbus-util.h b/src/pulsecore/dbus-util.h
index 9732873..1a8aeac 100644
--- a/src/pulsecore/dbus-util.h
+++ b/src/pulsecore/dbus-util.h
@@ -26,6 +26,7 @@
 
 #include <pulsecore/llist.h>
 #include <pulse/mainloop-api.h>
+#include <pulse/proplist.h>
 
 /* A wrap connection is not shared or refcounted, it is available in client side */
 typedef struct pa_dbus_wrap_connection pa_dbus_wrap_connection;
@@ -61,4 +62,32 @@ void pa_dbus_sync_pending_list(pa_dbus_pending **p);
 /* Free up a list of pa_dbus_pending_call objects */
 void pa_dbus_free_pending_list(pa_dbus_pending **p);
 
+/* Sends an error message as the reply to the given message. */
+void pa_dbus_send_error(DBusConnection *c, DBusMessage *in_reply_to, const char *name, const char *message);
+
+void pa_dbus_send_empty_reply(DBusConnection *c, DBusMessage *in_reply_to);
+void pa_dbus_send_basic_value_reply(DBusConnection *c, DBusMessage *in_reply_to, int type, void *data);
+void pa_dbus_send_basic_variant_reply(DBusConnection *c, DBusMessage *in_reply_to, int type, void *data);
+void pa_dbus_send_basic_array_variant_reply(DBusConnection *c, DBusMessage *in_reply_to, int item_type, void *array, unsigned n);
+
+void pa_dbus_append_basic_array(DBusMessageIter *iter, int item_type, const void *array, unsigned n);
+void pa_dbus_append_basic_array_variant(DBusMessageIter *iter, int item_type, const void *array, unsigned n);
+void pa_dbus_append_basic_variant(DBusMessageIter *iter, int type, void *data);
+void pa_dbus_append_basic_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, int type, void *data);
+void pa_dbus_append_basic_array_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, int item_type, const void *array, unsigned n);
+
+/* Helper function for extracting the value argument of a Set call for a
+ * property with a basic type. If the message is invalid, an error reply is
+ * sent and a negative number is returned. */
+int pa_dbus_get_basic_set_property_arg(DBusConnection *c, DBusMessage *msg, int type, void *data);
+
+/* If the arguments can't be read from the iterator, an error reply is sent and
+ * a negative number is returned. */
+int pa_dbus_get_basic_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter, int type, void *data);
+int pa_dbus_get_fixed_array_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter, int item_type, void *array, unsigned *n);
+
+/* Returns a new proplist, that the caller has to free. If the proplist can't
+ * be read from the iterator, an error reply is sent and NULL is returned. */
+pa_proplist *pa_dbus_get_proplist_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter);
+
 #endif
diff --git a/src/pulsecore/namereg.c b/src/pulsecore/namereg.c
index 9df2f58..046c87b 100644
--- a/src/pulsecore/namereg.c
+++ b/src/pulsecore/namereg.c
@@ -149,21 +149,48 @@ const char *pa_namereg_register(pa_core *c, const char *name, pa_namereg_type_t
 
     pa_assert_se(pa_hashmap_put(c->namereg, e->name, e) >= 0);
 
+    if (type == PA_NAMEREG_SINK && !c->default_sink)
+        pa_namereg_set_default_sink(c, data);
+    else if (type == PA_NAMEREG_SOURCE && !c->default_source)
+        pa_namereg_set_default_source(c, data);
+
     return e->name;
 }
 
 void pa_namereg_unregister(pa_core *c, const char *name) {
     struct namereg_entry *e;
+    uint32_t idx;
 
     pa_assert(c);
     pa_assert(name);
 
     pa_assert_se(e = pa_hashmap_remove(c->namereg, name));
 
-    if (c->default_sink == e->data)
-        pa_namereg_set_default_sink(c, NULL);
-    else if (c->default_source == e->data)
-        pa_namereg_set_default_source(c, NULL);
+    if (c->default_sink == e->data) {
+        pa_sink *new_default = pa_idxset_first(c->sinks, &idx);
+
+        if (new_default == e->data)
+            new_default = pa_idxset_next(c->sinks, &idx);
+
+        pa_namereg_set_default_sink(c, new_default);
+
+    } else if (c->default_source == e->data) {
+        pa_source *new_default;
+
+        for (new_default = pa_idxset_first(c->sources, &idx); new_default; new_default = pa_idxset_next(c->sources, &idx)) {
+            if (new_default != e->data && !new_default->monitor_of)
+                break;
+        }
+
+        if (!new_default) {
+            new_default = pa_idxset_first(c->sources, &idx);
+
+            if (new_default == e->data)
+                new_default = pa_idxset_next(c->sources, &idx);
+        }
+
+        pa_namereg_set_default_source(c, new_default);
+    }
 
     pa_xfree(e->name);
     pa_xfree(e);
@@ -191,7 +218,6 @@ void* pa_namereg_get(pa_core *c, const char *name, pa_namereg_type_t type) {
 
         if ((s = pa_namereg_get(c, NULL, PA_NAMEREG_SINK)))
             return s->monitor_source;
-
     }
 
     if (!name)
@@ -242,35 +268,16 @@ pa_source* pa_namereg_set_default_source(pa_core*c, pa_source *s) {
     return s;
 }
 
+/* XXX: After removing old functionality, has this function become useless? */
 pa_sink *pa_namereg_get_default_sink(pa_core *c) {
-    pa_sink *s;
-
     pa_assert(c);
 
-    if (c->default_sink)
-        return c->default_sink;
-
-    if ((s = pa_idxset_first(c->sinks, NULL)))
-        return pa_namereg_set_default_sink(c, s);
-
-    return NULL;
+    return c->default_sink;
 }
 
+/* XXX: After removing old functionality, has this function become useless? */
 pa_source *pa_namereg_get_default_source(pa_core *c) {
-    pa_source *s;
-    uint32_t idx;
-
     pa_assert(c);
 
-    if (c->default_source)
-        return c->default_source;
-
-    for (s = PA_SOURCE(pa_idxset_first(c->sources, &idx)); s; s = PA_SOURCE(pa_idxset_next(c->sources, &idx)))
-        if (!s->monitor_of)
-            return pa_namereg_set_default_source(c, s);
-
-    if ((s = pa_idxset_first(c->sources, NULL)))
-        return pa_namereg_set_default_source(c, s);
-
-    return NULL;
+    return c->default_source;
 }
diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
new file mode 100644
index 0000000..fb7d168
--- /dev/null
+++ b/src/pulsecore/protocol-dbus.c
@@ -0,0 +1,930 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <dbus/dbus.h>
+
+#include <pulse/xmalloc.h>
+
+#include <pulsecore/core-util.h>
+#include <pulsecore/hashmap.h>
+#include <pulsecore/idxset.h>
+#include <pulsecore/shared.h>
+#include <pulsecore/strbuf.h>
+
+#include "protocol-dbus.h"
+
+struct pa_dbus_protocol {
+    PA_REFCNT_DECLARE;
+
+    pa_core *core;
+    pa_hashmap *objects; /* Object path -> struct object_entry */
+    pa_hashmap *connections; /* DBusConnection -> struct connection_entry */
+    pa_hashmap *extensions; /* String -> anything */
+};
+
+struct object_entry {
+    char *path;
+    pa_hashmap *interfaces; /* Interface name -> struct interface_entry */
+    char *introspection;
+};
+
+struct connection_entry {
+    DBusConnection *connection;
+    pa_client *client;
+
+    pa_bool_t listening_for_all_signals;
+
+    /* Contains object paths. If this is empty, then signals from all objects
+     * are accepted. Only used when listening_for_all_signals == TRUE. */
+    pa_idxset *all_signals_objects;
+
+    /* Signal name -> idxset. The idxsets contain object paths. If an idxset is
+     * empty, then that signal is accepted from all objects. Only used when
+     * listening_for_all_signals == FALSE. */
+    pa_hashmap *listening_signals;
+};
+
+struct interface_entry {
+    char *name;
+    pa_hashmap *method_handlers;
+    pa_hashmap *property_handlers;
+    pa_dbus_receive_cb_t get_all_properties_cb;
+    pa_dbus_signal_info *signals;
+    unsigned n_signals;
+    void *userdata;
+};
+
+char *pa_get_dbus_address_from_server_type(pa_server_type_t server_type) {
+    char *address = NULL;
+    char *runtime_path = NULL;
+    char *escaped_path = NULL;
+
+    switch (server_type) {
+        case PA_SERVER_TYPE_USER:
+            pa_assert_se((runtime_path = pa_runtime_path(PA_DBUS_SOCKET_NAME)));
+            pa_assert_se((escaped_path = dbus_address_escape_value(runtime_path)));
+            address = pa_sprintf_malloc("unix:path=%s", escaped_path);
+            break;
+
+        case PA_SERVER_TYPE_SYSTEM:
+            pa_assert_se((escaped_path = dbus_address_escape_value(PA_DBUS_SYSTEM_SOCKET_PATH)));
+            address = pa_sprintf_malloc("unix:path=%s", escaped_path);
+            break;
+
+        case PA_SERVER_TYPE_NONE:
+            address = pa_xnew0(char, 1);
+            break;
+
+        default:
+            pa_assert_not_reached();
+    }
+
+    pa_xfree(runtime_path);
+    pa_xfree(escaped_path);
+
+    return address;
+}
+
+static pa_dbus_protocol *dbus_protocol_new(pa_core *c) {
+    pa_dbus_protocol *p;
+
+    pa_assert(c);
+
+    p = pa_xnew(pa_dbus_protocol, 1);
+    PA_REFCNT_INIT(p);
+    p->core = c;
+    p->objects = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+    p->connections = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+    p->extensions = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+
+    pa_assert_se(pa_shared_set(c, "dbus-protocol", p) >= 0);
+
+    return p;
+}
+
+pa_dbus_protocol* pa_dbus_protocol_get(pa_core *c) {
+    pa_dbus_protocol *p;
+
+    if ((p = pa_shared_get(c, "dbus-protocol")))
+        return pa_dbus_protocol_ref(p);
+
+    return dbus_protocol_new(c);
+}
+
+pa_dbus_protocol* pa_dbus_protocol_ref(pa_dbus_protocol *p) {
+    pa_assert(p);
+    pa_assert(PA_REFCNT_VALUE(p) >= 1);
+
+    PA_REFCNT_INC(p);
+
+    return p;
+}
+
+void pa_dbus_protocol_unref(pa_dbus_protocol *p) {
+    pa_assert(p);
+    pa_assert(PA_REFCNT_VALUE(p) >= 1);
+
+    if (PA_REFCNT_DEC(p) > 0)
+        return;
+
+    pa_assert(pa_hashmap_isempty(p->objects));
+    pa_assert(pa_hashmap_isempty(p->connections));
+    pa_assert(pa_hashmap_isempty(p->extensions));
+
+    pa_hashmap_free(p->objects, NULL, NULL);
+    pa_hashmap_free(p->connections, NULL, NULL);
+    pa_hashmap_free(p->extensions, NULL, NULL);
+
+    pa_assert_se(pa_shared_remove(p->core, "dbus-protocol") >= 0);
+
+    pa_xfree(p);
+}
+
+static void update_introspection(struct object_entry *oe) {
+    pa_strbuf *buf;
+    void *interfaces_state = NULL;
+    struct interface_entry *iface_entry = NULL;
+
+    pa_assert(oe);
+
+    buf = pa_strbuf_new();
+    pa_strbuf_puts(buf, DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE);
+    pa_strbuf_puts(buf, "<node>\n");
+
+    while ((iface_entry = pa_hashmap_iterate(oe->interfaces, &interfaces_state, NULL))) {
+        pa_dbus_method_handler *method_handler;
+        pa_dbus_property_handler *property_handler;
+        void *handlers_state = NULL;
+        unsigned i;
+        unsigned j;
+
+        pa_strbuf_printf(buf, " <interface name=\"%s\">\n", iface_entry->name);
+
+        while ((method_handler = pa_hashmap_iterate(iface_entry->method_handlers, &handlers_state, NULL))) {
+            pa_strbuf_printf(buf, "  <method name=\"%s\">\n", method_handler->method_name);
+
+            for (i = 0; i < method_handler->n_arguments; ++i)
+                pa_strbuf_printf(buf, "   <arg name=\"%s\" type=\"%s\" direction=\"%s\"/>\n", method_handler->arguments[i].name,
+                                                                                              method_handler->arguments[i].type,
+                                                                                              method_handler->arguments[i].direction);
+
+            pa_strbuf_puts(buf, "  </method>\n");
+        }
+
+        handlers_state = NULL;
+
+        while ((property_handler = pa_hashmap_iterate(iface_entry->property_handlers, &handlers_state, NULL)))
+            pa_strbuf_printf(buf, "  <property name=\"%s\" type=\"%s\" access=\"%s\"/>\n", property_handler->property_name,
+                                                                                           property_handler->type,
+                                                                                           property_handler->get_cb ? (property_handler->set_cb ? "readwrite" : "read") : "write");
+
+        for (i = 0; i < iface_entry->n_signals; ++i) {
+            pa_strbuf_printf(buf, "  <signal name=\"%s\">\n", iface_entry->signals[i].name);
+
+            for (j = 0; j < iface_entry->signals[i].n_arguments; ++j)
+                pa_strbuf_printf(buf, "   <arg name=\"%s\" type=\"%s\"/>\n", iface_entry->signals[i].arguments[j].name,
+                                                                             iface_entry->signals[i].arguments[j].type);
+
+            pa_strbuf_puts(buf, "  </signal>\n");
+        }
+
+        pa_strbuf_puts(buf, " </interface>\n");
+    }
+
+    pa_strbuf_puts(buf, " <interface name=\"" DBUS_INTERFACE_INTROSPECTABLE "\">\n"
+                        "  <method name=\"Introspect\">\n"
+                        "   <arg name=\"data\" type=\"s\" direction=\"out\"/>\n"
+                        "  </method>\n"
+                        " </interface>\n"
+                        " <interface name=\"" DBUS_INTERFACE_PROPERTIES "\">\n"
+                        "  <method name=\"Get\">\n"
+                        "   <arg name=\"interface_name\" type=\"s\" direction=\"in\"/>\n"
+                        "   <arg name=\"property_name\" type=\"s\" direction=\"in\"/>\n"
+                        "   <arg name=\"value\" type=\"v\" direction=\"out\"/>\n"
+                        "  </method>\n"
+                        "  <method name=\"Set\">\n"
+                        "   <arg name=\"interface_name\" type=\"s\" direction=\"in\"/>\n"
+                        "   <arg name=\"property_name\" type=\"s\" direction=\"in\"/>\n"
+                        "   <arg name=\"value\" type=\"v\" direction=\"in\"/>\n"
+                        "  </method>\n"
+                        "  <method name=\"GetAll\">\n"
+                        "   <arg name=\"interface_name\" type=\"s\" direction=\"in\"/>\n"
+                        "   <arg name=\"props\" type=\"a{sv}\" direction=\"out\"/>\n"
+                        "  </method>\n"
+                        " </interface>\n");
+
+    pa_strbuf_puts(buf, "</node>\n");
+
+    pa_xfree(oe->introspection);
+    oe->introspection = pa_strbuf_tostring_free(buf);
+}
+
+enum find_result_t {
+    FOUND_METHOD,
+    FOUND_GET_PROPERTY,
+    FOUND_SET_PROPERTY,
+    FOUND_GET_ALL,
+    PROPERTY_ACCESS_DENIED,
+    NO_SUCH_METHOD,
+    NO_SUCH_PROPERTY,
+    INVALID_MESSAGE_ARGUMENTS
+};
+
+static enum find_result_t find_handler_by_property(struct object_entry *obj_entry,
+                                                   DBusMessage *msg,
+                                                   const char *property,
+                                                   struct interface_entry **iface_entry,
+                                                   pa_dbus_property_handler **property_handler) {
+    void *state = NULL;
+
+    pa_assert(obj_entry);
+    pa_assert(msg);
+    pa_assert(property);
+    pa_assert(iface_entry);
+    pa_assert(property_handler);
+
+    while ((*iface_entry = pa_hashmap_iterate(obj_entry->interfaces, &state, NULL))) {
+        if ((*property_handler = pa_hashmap_get((*iface_entry)->property_handlers, property))) {
+            if (dbus_message_has_member(msg, "Get"))
+                return (*property_handler)->get_cb ? FOUND_GET_PROPERTY : PROPERTY_ACCESS_DENIED;
+            else if (dbus_message_has_member(msg, "Set"))
+                return (*property_handler)->set_cb ? FOUND_SET_PROPERTY : PROPERTY_ACCESS_DENIED;
+            else
+                pa_assert_not_reached();
+        }
+    }
+
+    return NO_SUCH_PROPERTY;
+}
+
+static enum find_result_t find_handler_by_method(struct object_entry *obj_entry,
+                                                 const char *method,
+                                                 struct interface_entry **iface_entry,
+                                                 pa_dbus_method_handler **method_handler) {
+    void *state = NULL;
+
+    pa_assert(obj_entry);
+    pa_assert(method);
+    pa_assert(iface_entry);
+    pa_assert(method_handler);
+
+    while ((*iface_entry = pa_hashmap_iterate(obj_entry->interfaces, &state, NULL))) {
+        if ((*method_handler = pa_hashmap_get((*iface_entry)->method_handlers, method)))
+            return FOUND_METHOD;
+    }
+
+    return NO_SUCH_METHOD;
+}
+
+static enum find_result_t find_handler_from_properties_call(struct object_entry *obj_entry,
+                                                            DBusMessage *msg,
+                                                            struct interface_entry **iface_entry,
+                                                            pa_dbus_property_handler **property_handler,
+                                                            const char **attempted_property) {
+    const char *interface;
+
+    pa_assert(obj_entry);
+    pa_assert(msg);
+    pa_assert(iface_entry);
+
+    if (dbus_message_has_member(msg, "GetAll")) {
+        if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID))
+            return INVALID_MESSAGE_ARGUMENTS;
+
+        if (*interface) {
+            if ((*iface_entry = pa_hashmap_get(obj_entry->interfaces, interface)))
+                return FOUND_GET_ALL;
+            else
+                return NO_SUCH_METHOD; /* XXX: NO_SUCH_INTERFACE or something like that might be more accurate. */
+        } else {
+            pa_assert_se((*iface_entry = pa_hashmap_first(obj_entry->interfaces)));
+            return FOUND_GET_ALL;
+        }
+    } else {
+        if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, attempted_property, DBUS_TYPE_INVALID))
+            return INVALID_MESSAGE_ARGUMENTS;
+
+        if (*interface) {
+            if ((*iface_entry = pa_hashmap_get(obj_entry->interfaces, interface)) &&
+                (*property_handler = pa_hashmap_get((*iface_entry)->property_handlers, *attempted_property))) {
+                if (dbus_message_has_member(msg, "Get"))
+                    return (*property_handler)->get_cb ? FOUND_GET_PROPERTY : PROPERTY_ACCESS_DENIED;
+                else if (dbus_message_has_member(msg, "Set"))
+                    return (*property_handler)->set_cb ? FOUND_SET_PROPERTY : PROPERTY_ACCESS_DENIED;
+                else
+                    pa_assert_not_reached();
+            } else
+                return NO_SUCH_PROPERTY;
+        } else
+            return find_handler_by_property(obj_entry, msg, *attempted_property, iface_entry, property_handler);
+    }
+}
+
+static enum find_result_t find_handler(struct object_entry *obj_entry,
+                                       DBusMessage *msg,
+                                       struct interface_entry **iface_entry,
+                                       pa_dbus_method_handler **method_handler,
+                                       pa_dbus_property_handler **property_handler,
+                                       const char **attempted_property) {
+    const char *interface;
+
+    pa_assert(obj_entry);
+    pa_assert(msg);
+    pa_assert(iface_entry);
+    pa_assert(method_handler);
+    pa_assert(property_handler);
+    pa_assert(attempted_property);
+
+    *iface_entry = NULL;
+    *method_handler = NULL;
+
+    if (dbus_message_has_interface(msg, DBUS_INTERFACE_PROPERTIES))
+        return find_handler_from_properties_call(obj_entry, msg, iface_entry, property_handler, attempted_property);
+
+    else if ((interface = dbus_message_get_interface(msg))) {
+        if ((*iface_entry = pa_hashmap_get(obj_entry->interfaces, interface)) &&
+            (*method_handler = pa_hashmap_get((*iface_entry)->method_handlers, dbus_message_get_member(msg))))
+            return FOUND_METHOD;
+        else
+            return NO_SUCH_METHOD;
+
+    } else { /* The method call doesn't contain an interface. */
+        if (dbus_message_has_member(msg, "Get") || dbus_message_has_member(msg, "Set") || dbus_message_has_member(msg, "GetAll")) {
+            if (find_handler_by_method(obj_entry, dbus_message_get_member(msg), iface_entry, method_handler) == FOUND_METHOD)
+                return FOUND_METHOD; /* The object has a method named Get, Set or GetAll in some other interface than .Properties. */
+            else
+                /* Assume this is a .Properties call. */
+                return find_handler_from_properties_call(obj_entry, msg, iface_entry, property_handler, attempted_property);
+
+        } else /* This is not a .Properties call. */
+            return find_handler_by_method(obj_entry, dbus_message_get_member(msg), iface_entry, method_handler);
+    }
+}
+
+static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessage *message, void *user_data) {
+    pa_dbus_protocol *p = user_data;
+    struct object_entry *obj_entry = NULL;
+    struct interface_entry *iface_entry = NULL;
+    pa_dbus_method_handler *method_handler = NULL;
+    pa_dbus_property_handler *property_handler = NULL;
+    const char *attempted_property = NULL;
+    DBusMessage *reply = NULL;
+
+    pa_assert(connection);
+    pa_assert(message);
+    pa_assert(p);
+    pa_assert(p->objects);
+
+    if (dbus_message_get_type(message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
+        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+    pa_assert_se((obj_entry = pa_hashmap_get(p->objects, dbus_message_get_path(message))));
+
+    if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Introspectable", "Introspect") ||
+        (!dbus_message_get_interface(message) && dbus_message_has_member(message, "Introspect"))) {
+        pa_assert_se((reply = dbus_message_new_method_return(message)));
+        pa_assert_se(dbus_message_append_args(reply, DBUS_TYPE_STRING, &obj_entry->introspection, DBUS_TYPE_INVALID));
+        pa_assert_se(dbus_connection_send(connection, reply, NULL));
+
+        pa_log_debug("%s.Introspect handled.", obj_entry->path);
+
+        goto finish;
+    }
+
+    switch (find_handler(obj_entry, message, &iface_entry, &method_handler, &property_handler, &attempted_property)) {
+        case FOUND_METHOD:
+            method_handler->receive_cb(connection, message, iface_entry->userdata);
+            break;
+
+        case FOUND_GET_PROPERTY:
+            property_handler->get_cb(connection, message, iface_entry->userdata);
+            break;
+
+        case FOUND_SET_PROPERTY:
+            property_handler->set_cb(connection, message, iface_entry->userdata);
+            break;
+
+        case FOUND_GET_ALL:
+            if (iface_entry->get_all_properties_cb)
+                iface_entry->get_all_properties_cb(connection, message, iface_entry->userdata);
+            break;
+
+        case PROPERTY_ACCESS_DENIED:
+            pa_assert_se((reply = dbus_message_new_error_printf(message, DBUS_ERROR_ACCESS_DENIED, "%s access denied for property %s", dbus_message_get_member(message), attempted_property)));
+            pa_assert_se(dbus_connection_send(connection, reply, NULL));
+            break;
+
+        case NO_SUCH_METHOD:
+            pa_assert_se((reply = dbus_message_new_error_printf(message, DBUS_ERROR_UNKNOWN_METHOD, "%s: No such method", dbus_message_get_member(message))));
+            pa_assert_se(dbus_connection_send(connection, reply, NULL));
+            break;
+
+        case NO_SUCH_PROPERTY:
+            pa_assert_se((reply = dbus_message_new_error_printf(message, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s: No such property", attempted_property)));
+            pa_assert_se(dbus_connection_send(connection, reply, NULL));
+            break;
+
+        case INVALID_MESSAGE_ARGUMENTS:
+            pa_assert_se((reply = dbus_message_new_error_printf(message, DBUS_ERROR_INVALID_ARGS, "Invalid arguments for %s", dbus_message_get_member(message))));
+            pa_assert_se(dbus_connection_send(connection, reply, NULL));
+            break;
+
+        default:
+            pa_assert_not_reached();
+    }
+
+finish:
+    if (reply)
+        dbus_message_unref(reply);
+
+    return DBUS_HANDLER_RESULT_HANDLED;
+}
+
+static DBusObjectPathVTable vtable = {
+    .unregister_function = NULL,
+    .message_function = handle_message_cb,
+    .dbus_internal_pad1 = NULL,
+    .dbus_internal_pad2 = NULL,
+    .dbus_internal_pad3 = NULL,
+    .dbus_internal_pad4 = NULL
+};
+
+static void register_object(pa_dbus_protocol *p, struct object_entry *obj_entry) {
+    struct connection_entry *conn_entry;
+    void *state = NULL;
+
+    pa_assert(p);
+    pa_assert(obj_entry);
+
+    while ((conn_entry = pa_hashmap_iterate(p->connections, &state, NULL)))
+        pa_assert_se(dbus_connection_register_object_path(conn_entry->connection, obj_entry->path, &vtable, p));
+}
+
+static pa_dbus_arg_info *copy_args(const pa_dbus_arg_info *src, unsigned n) {
+    pa_dbus_arg_info *dst;
+    unsigned i;
+
+    if (n == 0)
+        return NULL;
+
+    pa_assert(src);
+
+    dst = pa_xnew0(pa_dbus_arg_info, n);
+
+    for (i = 0; i < n; ++i) {
+        dst[i].name = pa_xstrdup(src[i].name);
+        dst[i].type = pa_xstrdup(src[i].type);
+        dst[i].direction = pa_xstrdup(src[i].direction);
+    }
+
+    return dst;
+}
+
+static pa_hashmap *create_method_handlers(const pa_dbus_interface_info *info) {
+    pa_hashmap *handlers;
+    unsigned i;
+
+    pa_assert(info);
+    pa_assert(info->method_handlers || info->n_method_handlers == 0);
+
+    handlers = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+
+    for (i = 0; i < info->n_method_handlers; ++i) {
+        pa_dbus_method_handler *h = pa_xnew(pa_dbus_method_handler, 1);
+        h->method_name = pa_xstrdup(info->method_handlers[i].method_name);
+        h->arguments = copy_args(info->method_handlers[i].arguments, info->method_handlers[i].n_arguments);
+        h->n_arguments = info->method_handlers[i].n_arguments;
+        h->receive_cb = info->method_handlers[i].receive_cb;
+
+        pa_hashmap_put(handlers, h->method_name, h);
+    }
+
+    return handlers;
+}
+
+static pa_hashmap *create_property_handlers(const pa_dbus_interface_info *info) {
+    pa_hashmap *handlers;
+    unsigned i = 0;
+
+    pa_assert(info);
+    pa_assert(info->property_handlers || info->n_property_handlers == 0);
+
+    handlers = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+
+    for (i = 0; i < info->n_property_handlers; ++i) {
+        pa_dbus_property_handler *h = pa_xnew(pa_dbus_property_handler, 1);
+        h->property_name = pa_xstrdup(info->property_handlers[i].property_name);
+        h->type = pa_xstrdup(info->property_handlers[i].type);
+        h->get_cb = info->property_handlers[i].get_cb;
+        h->set_cb = info->property_handlers[i].set_cb;
+
+        pa_hashmap_put(handlers, h->property_name, h);
+    }
+
+    return handlers;
+}
+
+static pa_dbus_signal_info *copy_signals(const pa_dbus_interface_info *info) {
+    pa_dbus_signal_info *dst;
+    unsigned i;
+
+    pa_assert(info);
+
+    if (info->n_signals == 0)
+        return NULL;
+
+    pa_assert(info->signals);
+
+    dst = pa_xnew(pa_dbus_signal_info, info->n_signals);
+
+    for (i = 0; i < info->n_signals; ++i) {
+        dst[i].name = pa_xstrdup(info->signals[i].name);
+        dst[i].arguments = copy_args(info->signals[i].arguments, info->signals[i].n_arguments);
+        dst[i].n_arguments = info->signals[i].n_arguments;
+    }
+
+    return dst;
+}
+
+int pa_dbus_protocol_add_interface(pa_dbus_protocol *p,
+                                   const char *path,
+                                   const pa_dbus_interface_info *info,
+                                   void *userdata) {
+    struct object_entry *obj_entry;
+    struct interface_entry *iface_entry;
+    pa_bool_t obj_entry_created = FALSE;
+
+    pa_assert(p);
+    pa_assert(path);
+    pa_assert(info);
+    pa_assert(info->name);
+    pa_assert(info->method_handlers || info->n_method_handlers == 0);
+    pa_assert(info->property_handlers || info->n_property_handlers == 0);
+    pa_assert(info->get_all_properties_cb || info->n_property_handlers == 0);
+    pa_assert(info->signals || info->n_signals == 0);
+
+    if (!(obj_entry = pa_hashmap_get(p->objects, path))) {
+        obj_entry = pa_xnew(struct object_entry, 1);
+        obj_entry->path = pa_xstrdup(path);
+        obj_entry->interfaces = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+        obj_entry->introspection = NULL;
+
+        pa_hashmap_put(p->objects, path, obj_entry);
+        obj_entry_created = TRUE;
+    }
+
+    if (pa_hashmap_get(obj_entry->interfaces, info->name) != NULL)
+        goto fail; /* The interface was already registered. */
+
+    iface_entry = pa_xnew(struct interface_entry, 1);
+    iface_entry->name = pa_xstrdup(info->name);
+    iface_entry->method_handlers = create_method_handlers(info);
+    iface_entry->property_handlers = create_property_handlers(info);
+    iface_entry->get_all_properties_cb = info->get_all_properties_cb;
+    iface_entry->signals = copy_signals(info);
+    iface_entry->n_signals = info->n_signals;
+    iface_entry->userdata = userdata;
+    pa_hashmap_put(obj_entry->interfaces, iface_entry->name, iface_entry);
+
+    update_introspection(obj_entry);
+
+    if (obj_entry_created)
+        register_object(p, obj_entry);
+
+    return 0;
+
+fail:
+    if (obj_entry_created) {
+        pa_hashmap_remove(p->objects, path);
+        pa_dbus_protocol_unref(p);
+        pa_xfree(obj_entry);
+    }
+
+    return -1;
+}
+
+static void unregister_object(pa_dbus_protocol *p, struct object_entry *obj_entry) {
+    struct connection_entry *conn_entry;
+    void *state = NULL;
+
+    pa_assert(p);
+    pa_assert(obj_entry);
+
+    while ((conn_entry = pa_hashmap_iterate(p->connections, &state, NULL)))
+        pa_assert_se(dbus_connection_unregister_object_path(conn_entry->connection, obj_entry->path));
+}
+
+static void method_handler_free_cb(void *p, void *userdata) {
+    pa_dbus_method_handler *h = p;
+    unsigned i;
+
+    pa_assert(h);
+
+    pa_xfree((char *) h->method_name);
+
+    for (i = 0; i < h->n_arguments; ++i) {
+        pa_xfree((char *) h->arguments[i].name);
+        pa_xfree((char *) h->arguments[i].type);
+        pa_xfree((char *) h->arguments[i].direction);
+    }
+
+    pa_xfree((pa_dbus_arg_info *) h->arguments);
+}
+
+static void property_handler_free_cb(void *p, void *userdata) {
+    pa_dbus_property_handler *h = p;
+
+    pa_assert(h);
+
+    pa_xfree((char *) h->property_name);
+    pa_xfree((char *) h->type);
+}
+
+int pa_dbus_protocol_remove_interface(pa_dbus_protocol *p, const char* path, const char* interface) {
+    struct object_entry *obj_entry;
+    struct interface_entry *iface_entry;
+    unsigned i;
+
+    pa_assert(p);
+    pa_assert(path);
+    pa_assert(interface);
+
+    if (!(obj_entry = pa_hashmap_get(p->objects, path)))
+        return -1;
+
+    if (!(iface_entry = pa_hashmap_remove(obj_entry->interfaces, interface)))
+        return -1;
+
+    update_introspection(obj_entry);
+
+    pa_xfree(iface_entry->name);
+    pa_hashmap_free(iface_entry->method_handlers, method_handler_free_cb, NULL);
+    pa_hashmap_free(iface_entry->property_handlers, property_handler_free_cb, NULL);
+
+    for (i = 0; i < iface_entry->n_signals; ++i) {
+        unsigned j;
+
+        pa_xfree((char *) iface_entry->signals[i].name);
+
+        for (j = 0; j < iface_entry->signals[i].n_arguments; ++j) {
+            pa_xfree((char *) iface_entry->signals[i].arguments[j].name);
+            pa_xfree((char *) iface_entry->signals[i].arguments[j].type);
+            pa_assert(iface_entry->signals[i].arguments[j].direction == NULL);
+        }
+
+        pa_xfree((pa_dbus_arg_info *) iface_entry->signals[i].arguments);
+    }
+
+    pa_xfree(iface_entry->signals);
+    pa_xfree(iface_entry);
+
+    if (pa_hashmap_isempty(obj_entry->interfaces)) {
+        unregister_object(p, obj_entry);
+
+        pa_hashmap_remove(p->objects, path);
+        pa_xfree(obj_entry->path);
+        pa_hashmap_free(obj_entry->interfaces, NULL, NULL);
+        pa_xfree(obj_entry->introspection);
+        pa_xfree(obj_entry);
+    }
+
+    return 0;
+}
+
+static void register_all_objects(pa_dbus_protocol *p, DBusConnection *conn) {
+    struct object_entry *obj_entry;
+    void *state = NULL;
+
+    pa_assert(p);
+    pa_assert(conn);
+
+    while ((obj_entry = pa_hashmap_iterate(p->objects, &state, NULL)))
+        pa_assert_se(dbus_connection_register_object_path(conn, obj_entry->path, &vtable, p));
+}
+
+int pa_dbus_protocol_register_connection(pa_dbus_protocol *p, DBusConnection *conn, pa_client *client) {
+    struct connection_entry *conn_entry;
+
+    pa_assert(p);
+    pa_assert(conn);
+    pa_assert(client);
+
+    if (pa_hashmap_get(p->connections, conn))
+        return -1; /* The connection was already registered. */
+
+    register_all_objects(p, conn);
+
+    conn_entry = pa_xnew(struct connection_entry, 1);
+    conn_entry->connection = dbus_connection_ref(conn);
+    conn_entry->client = client;
+    conn_entry->listening_for_all_signals = FALSE;
+    conn_entry->all_signals_objects = pa_idxset_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+    conn_entry->listening_signals = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+
+    pa_hashmap_put(p->connections, conn, conn_entry);
+
+    return 0;
+}
+
+static void unregister_all_objects(pa_dbus_protocol *p, DBusConnection *conn) {
+    struct object_entry *obj_entry;
+    void *state = NULL;
+
+    pa_assert(p);
+    pa_assert(conn);
+
+    while ((obj_entry = pa_hashmap_iterate(p->objects, &state, NULL)))
+        pa_assert_se(dbus_connection_unregister_object_path(conn, obj_entry->path));
+}
+
+static void free_listened_object_name_cb(void *p, void *userdata) {
+    pa_assert(p);
+
+    pa_xfree(p);
+}
+
+static void free_listening_signals_idxset_cb(void *p, void *userdata) {
+    pa_idxset *set = p;
+
+    pa_assert(set);
+
+    pa_idxset_free(set, free_listened_object_name_cb, NULL);
+}
+
+int pa_dbus_protocol_unregister_connection(pa_dbus_protocol *p, DBusConnection *conn) {
+    struct connection_entry *conn_entry;
+
+    pa_assert(p);
+    pa_assert(conn);
+
+    if (!(conn_entry = pa_hashmap_remove(p->connections, conn)))
+        return -1;
+
+    unregister_all_objects(p, conn);
+
+    dbus_connection_unref(conn_entry->connection);
+    pa_idxset_free(conn_entry->all_signals_objects, free_listened_object_name_cb, NULL);
+    pa_hashmap_free(conn_entry->listening_signals, free_listening_signals_idxset_cb, NULL);
+    pa_xfree(conn_entry);
+
+    return 0;
+}
+
+void pa_dbus_protocol_add_signal_listener(pa_dbus_protocol *p, DBusConnection *conn, const char *signal, char **objects, unsigned n_objects) {
+    struct connection_entry *conn_entry;
+    pa_idxset *object_set;
+    char *object_path;
+    unsigned i;
+
+    pa_assert(p);
+    pa_assert(conn);
+    pa_assert(objects || n_objects == 0);
+
+    pa_assert_se((conn_entry = pa_hashmap_get(p->connections, conn)));
+
+    /* all_signals_objects will either be emptied or replaced with new objects,
+     * so we empty it here unconditionally. If listening_for_all_signals is
+     * currently FALSE, the idxset is empty already. */
+    while ((object_path = pa_idxset_steal_first(conn_entry->all_signals_objects, NULL)))
+        pa_xfree(object_path);
+
+    if (signal) {
+        conn_entry->listening_for_all_signals = FALSE;
+
+        /* Replace the old object list with a new one. */
+        if ((object_set = pa_hashmap_get(conn_entry->listening_signals, signal)))
+            pa_idxset_free(object_set, free_listened_object_name_cb, NULL);
+        object_set = pa_idxset_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+
+        for (i = 0; i < n_objects; ++i)
+            pa_idxset_put(object_set, pa_xstrdup(objects[i]), NULL);
+
+    } else {
+        conn_entry->listening_for_all_signals = TRUE;
+
+        /* We're not interested in individual signals anymore, so let's empty
+         * listening_signals. */
+        while ((object_set = pa_hashmap_steal_first(conn_entry->listening_signals)))
+            pa_idxset_free(object_set, free_listened_object_name_cb, NULL);
+
+        for (i = 0; i < n_objects; ++i)
+            pa_idxset_put(conn_entry->all_signals_objects, pa_xstrdup(objects[i]), NULL);
+    }
+}
+
+void pa_dbus_protocol_remove_signal_listener(pa_dbus_protocol *p, DBusConnection *conn, const char *signal) {
+    struct connection_entry *conn_entry;
+    pa_idxset *object_set;
+
+    pa_assert(p);
+    pa_assert(conn);
+
+    pa_assert_se((conn_entry = pa_hashmap_get(p->connections, conn)));
+
+    if (signal) {
+        if ((object_set = pa_hashmap_get(conn_entry->listening_signals, signal)))
+            pa_idxset_free(object_set, free_listened_object_name_cb, NULL);
+
+    } else {
+        char *object_path;
+
+        conn_entry->listening_for_all_signals = FALSE;
+
+        while ((object_path = pa_idxset_steal_first(conn_entry->all_signals_objects, NULL)))
+            pa_xfree(object_path);
+
+        while ((object_set = pa_hashmap_steal_first(conn_entry->listening_signals)))
+            pa_idxset_free(object_set, free_listened_object_name_cb, NULL);
+    }
+}
+
+void pa_dbus_protocol_send_signal(pa_dbus_protocol *p, DBusMessage *signal) {
+    struct connection_entry *conn_entry;
+    void *state = NULL;
+    pa_idxset *object_set;
+    DBusMessage *signal_copy;
+
+    pa_assert(p);
+    pa_assert(signal);
+    pa_assert(dbus_message_get_type(signal) == DBUS_MESSAGE_TYPE_SIGNAL);
+
+    /* XXX: We have to do some linear searching to find connections that want
+     * to receive the signal. This shouldn't be very significant performance
+     * problem, and adding an (object path, signal name) -> connection mapping
+     * would be likely to create substantial complexity. */
+
+    while ((conn_entry = pa_hashmap_iterate(p->connections, &state, NULL))) {
+
+        if ((conn_entry->listening_for_all_signals /* Case 1: listening for all signals */
+             && (pa_idxset_get_by_data(conn_entry->all_signals_objects, dbus_message_get_path(signal), NULL)
+                 || pa_idxset_isempty(conn_entry->all_signals_objects)))
+
+            || (!conn_entry->listening_for_all_signals /* Case 2: not listening for all signals */
+                && (object_set = pa_hashmap_get(conn_entry->listening_signals, signal))
+                && (pa_idxset_get_by_data(object_set, dbus_message_get_path(signal), NULL)
+                    || pa_idxset_isempty(object_set)))) {
+
+            pa_assert_se(signal_copy = dbus_message_copy(signal));
+            pa_assert_se(dbus_connection_send(conn_entry->connection, signal_copy, NULL));
+            dbus_message_unref(signal_copy);
+        }
+    }
+}
+
+pa_client *pa_dbus_protocol_get_client(pa_dbus_protocol *p, DBusConnection *conn) {
+    struct connection_entry *conn_entry;
+
+    pa_assert(p);
+    pa_assert(conn);
+
+    if (!(conn_entry = pa_hashmap_get(p->connections, conn)))
+        return NULL;
+
+    return conn_entry->client;
+}
+
+const char **pa_dbus_protocol_get_extensions(pa_dbus_protocol *p, unsigned *n) {
+    const char **extensions;
+    const char *ext_name;
+    void *state = NULL;
+    unsigned i = 0;
+
+    pa_assert(p);
+    pa_assert(n);
+
+    *n = pa_hashmap_size(p->extensions);
+
+    if (*n <= 0)
+        return NULL;
+
+    extensions = pa_xnew(const char *, *n);
+
+    while (pa_hashmap_iterate(p->extensions, &state, (const void **) &ext_name)) {
+        extensions[i] = ext_name;
+        ++i;
+    }
+
+    return extensions;
+}
diff --git a/src/pulsecore/protocol-dbus.h b/src/pulsecore/protocol-dbus.h
new file mode 100644
index 0000000..27198f4
--- /dev/null
+++ b/src/pulsecore/protocol-dbus.h
@@ -0,0 +1,158 @@
+#ifndef fooprotocoldbushfoo
+#define fooprotocoldbushfoo
+
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#include <dbus/dbus.h>
+
+#include <pulsecore/core.h>
+#include <pulsecore/macro.h>
+
+#define PA_DBUS_DEFAULT_PORT 24883
+#define PA_DBUS_SOCKET_NAME "dbus-socket"
+
+#define PA_DBUS_SYSTEM_SOCKET_PATH PA_SYSTEM_RUNTIME_PATH PA_PATH_SEP PA_DBUS_SOCKET_NAME
+
+#define PA_DBUS_ERROR_NO_SUCH_PROPERTY "org.PulseAudio.Core1.NoSuchPropertyError"
+#define PA_DBUS_ERROR_NOT_FOUND "org.PulseAudio.Core1.NotFoundError"
+
+/* Returns the default address of the server type in the escaped form. For
+ * PA_SERVER_TYPE_NONE an empty string is returned. The caller frees the
+ * string. */
+char *pa_get_dbus_address_from_server_type(pa_server_type_t server_type);
+
+typedef struct pa_dbus_protocol pa_dbus_protocol;
+
+/* This function either creates a new pa_dbus_protocol object, or if one
+ * already exists, increases the reference count. */
+pa_dbus_protocol* pa_dbus_protocol_get(pa_core *c);
+
+pa_dbus_protocol* pa_dbus_protocol_ref(pa_dbus_protocol *p);
+void pa_dbus_protocol_unref(pa_dbus_protocol *p);
+
+/* Called when a received message needs handling. Completely ignoring the
+ * message isn't a good idea; if you can't handle the message, reply with an
+ * error.
+ *
+ * All messages are method calls. */
+typedef void (*pa_dbus_receive_cb_t)(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+typedef struct pa_dbus_arg_info {
+    const char *name;
+    const char *type;
+    const char *direction; /* NULL for signal arguments. */
+} pa_dbus_arg_info;
+
+typedef struct pa_dbus_signal_info {
+    const char *name;
+    const pa_dbus_arg_info *arguments; /* NULL, if the signal has no args. */
+    unsigned n_arguments;
+} pa_dbus_signal_info;
+
+typedef struct pa_dbus_method_handler {
+    const char *method_name;
+    const pa_dbus_arg_info *arguments; /* NULL, if the method has no args. */
+    unsigned n_arguments;
+    pa_dbus_receive_cb_t receive_cb;
+} pa_dbus_method_handler;
+
+typedef struct pa_dbus_property_handler {
+    const char *property_name;
+    const char *type;
+
+    /* The access mode for the property is determined by checking whether
+     * get_cb or set_cb is NULL. */
+    pa_dbus_receive_cb_t get_cb;
+    pa_dbus_receive_cb_t set_cb;
+} pa_dbus_property_handler;
+
+typedef struct pa_dbus_interface_info {
+    const char* name;
+    const pa_dbus_method_handler *method_handlers; /* NULL, if the interface has no methods. */
+    unsigned n_method_handlers;
+    const pa_dbus_property_handler *property_handlers; /* NULL, if the interface has no properties. */
+    unsigned n_property_handlers;
+    const pa_dbus_receive_cb_t get_all_properties_cb; /* May be NULL, in which case GetAll returns an error. */
+    const pa_dbus_signal_info *signals; /* NULL, if the interface has no signals. */
+    unsigned n_signals;
+} pa_dbus_interface_info;
+
+
+/* The following functions may only be called from the main thread. */
+
+/* Registers the given interface to the given object path. It doesn't matter
+ * whether or not the object has already been registered; if it is, then its
+ * interface set is extended.
+ *
+ * Introspection requests are handled automatically.
+ *
+ * Userdata is passed to all the callbacks.
+ *
+ * Fails and returns a negative number if the object already has the interface
+ * registered. */
+int pa_dbus_protocol_add_interface(pa_dbus_protocol *p, const char *path, const pa_dbus_interface_info *info, void *userdata);
+
+/* Returns a negative number if the given object doesn't have the given
+ * interface registered. */
+int pa_dbus_protocol_remove_interface(pa_dbus_protocol *p, const char* path, const char* interface);
+
+/* Fails and returns a negative number if the connection is already
+ * registered. */
+int pa_dbus_protocol_register_connection(pa_dbus_protocol *p, DBusConnection *conn, pa_client *client);
+
+/* Returns a negative number if the connection wasn't registered. */
+int pa_dbus_protocol_unregister_connection(pa_dbus_protocol *p, DBusConnection *conn);
+
+/* Enables signal receiving for the given connection. The connection must have
+ * been registered earlier.
+ *
+ * If the signal argument is NULL, all signals will be sent to the connection,
+ * otherwise calling this function only adds the given signal to the list of
+ * signals that will be delivered to the connection.
+ *
+ * The objects argument is a list of object paths. If the list is not empty,
+ * only signals from the given objects are delivered. If this function is
+ * called multiple time for the same connection and signal, the latest call
+ * always replaces the previous object list. */
+void pa_dbus_protocol_add_signal_listener(pa_dbus_protocol *p, DBusConnection *conn, const char *signal, char **objects, unsigned n_objects);
+
+/* Disables the delivery of the signal for the given connection. The connection
+ * must have been registered. If signal is NULL, all signals are disabled. If
+ * signal is non-NULL and _add_signal_listener() was previously called with
+ * NULL signal (causing all signals to be enabled), this function doesn't do
+ * anything. Also, if the signal wasn't enabled before, this function doesn't
+ * do anything in that case either. */
+void pa_dbus_protocol_remove_signal_listener(pa_dbus_protocol *p, DBusConnection *conn, const char *signal);
+
+void pa_dbus_protocol_send_signal(pa_dbus_protocol *p, DBusMessage *signal);
+
+/* Returns NULL if the connection isn't registered. */
+pa_client *pa_dbus_protocol_get_client(pa_dbus_protocol *p, DBusConnection *conn);
+
+/* Returns an array of extension identifier strings. The strings pointers point
+ * to the internal copies, so don't free the strings. The caller must free the
+ * array, however. Also, do not save the returned pointer or any of the string
+ * pointers, because the contained strings may be freed at any time. If you
+ * need to save the array, copy it. */
+const char **pa_dbus_protocol_get_extensions(pa_dbus_protocol *p, unsigned *n);
+
+#endif

commit 9a77d2f81d693d64b63d38be7214626dedf91e11
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Tue Jul 21 00:04:52 2009 +0300

    Add the forgotten src/modules/dbus directory to git.

diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card.c
new file mode 100644
index 0000000..db6aa26
--- /dev/null
+++ b/src/modules/dbus/iface-card.c
@@ -0,0 +1,61 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <pulsecore/core-util.h>
+
+#include "iface-card.h"
+
+#define OBJECT_NAME "card"
+
+struct pa_dbusiface_card {
+    pa_card *card;
+    char *path;
+};
+
+pa_dbusiface_card *pa_dbusiface_card_new(pa_card *card, const char *path_prefix) {
+    pa_dbusiface_card *c;
+
+    pa_assert(card);
+    pa_assert(path_prefix);
+
+    c = pa_xnew(pa_dbusiface_card, 1);
+    c->card = card;
+    c->path = pa_sprintf_malloc("%s/%s%u", path_prefix, OBJECT_NAME, card->index);
+
+    return c;
+}
+
+void pa_dbusiface_card_free(pa_dbusiface_card *c) {
+    pa_assert(c);
+
+    pa_xfree(c->path);
+    pa_xfree(c);
+}
+
+const char *pa_dbusiface_card_get_path(pa_dbusiface_card *c) {
+    pa_assert(c);
+
+    return c->path;
+}
diff --git a/src/modules/dbus/iface-card.h b/src/modules/dbus/iface-card.h
new file mode 100644
index 0000000..54db610
--- /dev/null
+++ b/src/modules/dbus/iface-card.h
@@ -0,0 +1,40 @@
+#ifndef foodbusifacecardhfoo
+#define foodbusifacecardhfoo
+
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+/* This object implements the D-Bus interface org.PulseAudio.Core1.Card.
+ *
+ * See http://pulseaudio.org/wiki/DBusInterface for the Card interface
+ * documentation.
+ */
+
+#include <pulsecore/card.h>
+
+typedef struct pa_dbusiface_card pa_dbusiface_card;
+
+pa_dbusiface_card *pa_dbusiface_card_new(pa_card *card, const char *path_prefix);
+void pa_dbusiface_card_free(pa_dbusiface_card *c);
+
+const char *pa_dbusiface_card_get_path(pa_dbusiface_card *c);
+
+#endif
diff --git a/src/modules/dbus/iface-client.c b/src/modules/dbus/iface-client.c
new file mode 100644
index 0000000..cfa36d0
--- /dev/null
+++ b/src/modules/dbus/iface-client.c
@@ -0,0 +1,61 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <pulsecore/core-util.h>
+
+#include "iface-client.h"
+
+#define OBJECT_NAME "client"
+
+struct pa_dbusiface_client {
+    pa_client *client;
+    char *path;
+};
+
+pa_dbusiface_client *pa_dbusiface_client_new(pa_client *client, const char *path_prefix) {
+    pa_dbusiface_client *c;
+
+    pa_assert(client);
+    pa_assert(path_prefix);
+
+    c = pa_xnew(pa_dbusiface_client, 1);
+    c->client = client;
+    c->path = pa_sprintf_malloc("%s/%s%u", path_prefix, OBJECT_NAME, client->index);
+
+    return c;
+}
+
+void pa_dbusiface_client_free(pa_dbusiface_client *c) {
+    pa_assert(c);
+
+    pa_xfree(c->path);
+    pa_xfree(c);
+}
+
+const char *pa_dbusiface_client_get_path(pa_dbusiface_client *c) {
+    pa_assert(c);
+
+    return c->path;
+}
diff --git a/src/modules/dbus/iface-client.h b/src/modules/dbus/iface-client.h
new file mode 100644
index 0000000..62cca7f
--- /dev/null
+++ b/src/modules/dbus/iface-client.h
@@ -0,0 +1,40 @@
+#ifndef foodbusifaceclienthfoo
+#define foodbusifaceclienthfoo
+
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+/* This object implements the D-Bus interface org.PulseAudio.Core1.Card.
+ *
+ * See http://pulseaudio.org/wiki/DBusInterface for the Card interface
+ * documentation.
+ */
+
+#include <pulsecore/client.h>
+
+typedef struct pa_dbusiface_client pa_dbusiface_client;
+
+pa_dbusiface_client *pa_dbusiface_client_new(pa_client *client, const char *path_prefix);
+void pa_dbusiface_client_free(pa_dbusiface_client *c);
+
+const char *pa_dbusiface_client_get_path(pa_dbusiface_client *c);
+
+#endif
diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
new file mode 100644
index 0000000..31f1260
--- /dev/null
+++ b/src/modules/dbus/iface-core.c
@@ -0,0 +1,1968 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <ctype.h>
+
+#include <dbus/dbus.h>
+
+#include <pulse/utf8.h>
+#include <pulse/xmalloc.h>
+
+#include <pulsecore/core-util.h>
+#include <pulsecore/dbus-util.h>
+#include <pulsecore/macro.h>
+#include <pulsecore/namereg.h>
+#include <pulsecore/protocol-dbus.h>
+#include <pulsecore/socket-util.h>
+#include <pulsecore/strbuf.h>
+
+#include "iface-card.h"
+#include "iface-client.h"
+#include "iface-device.h"
+#include "iface-module.h"
+#include "iface-sample.h"
+#include "iface-stream.h"
+
+#include "iface-core.h"
+
+#define OBJECT_PATH "/org/pulseaudio/core1"
+#define INTERFACE_CORE "org.PulseAudio.Core1"
+
+#define INTERFACE_REVISION 0
+
+
+
+static void handle_get_interface_revision(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_version(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_is_local(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_username(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_hostname(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_default_channels(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_default_channels(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_default_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_default_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_default_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_default_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_cards(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_sinks(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_fallback_sink(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_fallback_sink(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_sources(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_fallback_source(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_fallback_source(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_playback_streams(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_record_streams(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_samples(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_modules(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_clients(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_my_client(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_extensions(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_get_card_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_sink_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_source_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_sample_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_upload_sample(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_exit(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_listen_for_signal(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_stop_listening_for_signal(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+struct pa_dbusiface_core {
+    pa_core *core;
+    pa_subscription *subscription;
+
+    pa_dbus_protocol *dbus_protocol;
+
+    pa_hashmap *cards;
+    pa_hashmap *sinks_by_index;
+    pa_hashmap *sinks_by_path;
+    pa_hashmap *sources_by_index;
+    pa_hashmap *sources_by_path;
+    pa_hashmap *playback_streams;
+    pa_hashmap *record_streams;
+    pa_hashmap *samples;
+    pa_hashmap *modules;
+    pa_hashmap *clients;
+
+    pa_sink *fallback_sink;
+    pa_source *fallback_source;
+};
+
+enum property_handler_index {
+    PROPERTY_HANDLER_INTERFACE_REVISION,
+    PROPERTY_HANDLER_NAME,
+    PROPERTY_HANDLER_VERSION,
+    PROPERTY_HANDLER_IS_LOCAL,
+    PROPERTY_HANDLER_USERNAME,
+    PROPERTY_HANDLER_HOSTNAME,
+    PROPERTY_HANDLER_DEFAULT_CHANNELS,
+    PROPERTY_HANDLER_DEFAULT_SAMPLE_FORMAT,
+    PROPERTY_HANDLER_DEFAULT_SAMPLE_RATE,
+    PROPERTY_HANDLER_CARDS,
+    PROPERTY_HANDLER_SINKS,
+    PROPERTY_HANDLER_FALLBACK_SINK,
+    PROPERTY_HANDLER_SOURCES,
+    PROPERTY_HANDLER_FALLBACK_SOURCE,
+    PROPERTY_HANDLER_PLAYBACK_STREAMS,
+    PROPERTY_HANDLER_RECORD_STREAMS,
+    PROPERTY_HANDLER_SAMPLES,
+    PROPERTY_HANDLER_MODULES,
+    PROPERTY_HANDLER_CLIENTS,
+    PROPERTY_HANDLER_MY_CLIENT,
+    PROPERTY_HANDLER_EXTENSIONS,
+    PROPERTY_HANDLER_MAX
+};
+
+static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
+    [PROPERTY_HANDLER_INTERFACE_REVISION]    = { .property_name = "InterfaceRevision",   .type = "u",  .get_cb = handle_get_interface_revision,    .set_cb = NULL },
+    [PROPERTY_HANDLER_NAME]                  = { .property_name = "Name",                .type = "s",  .get_cb = handle_get_name,                  .set_cb = NULL },
+    [PROPERTY_HANDLER_VERSION]               = { .property_name = "Version",             .type = "s",  .get_cb = handle_get_version,               .set_cb = NULL },
+    [PROPERTY_HANDLER_IS_LOCAL]              = { .property_name = "IsLocal",             .type = "b",  .get_cb = handle_get_is_local,              .set_cb = NULL },
+    [PROPERTY_HANDLER_USERNAME]              = { .property_name = "Username",            .type = "s",  .get_cb = handle_get_username,              .set_cb = NULL },
+    [PROPERTY_HANDLER_HOSTNAME]              = { .property_name = "Hostname",            .type = "s",  .get_cb = handle_get_hostname,              .set_cb = NULL },
+    [PROPERTY_HANDLER_DEFAULT_CHANNELS]      = { .property_name = "DefaultChannels",     .type = "au", .get_cb = handle_get_default_channels,      .set_cb = handle_set_default_channels },
+    [PROPERTY_HANDLER_DEFAULT_SAMPLE_FORMAT] = { .property_name = "DefaultSampleFormat", .type = "u",  .get_cb = handle_get_default_sample_format, .set_cb = handle_set_default_sample_format },
+    [PROPERTY_HANDLER_DEFAULT_SAMPLE_RATE]   = { .property_name = "DefaultSampleRate",   .type = "u",  .get_cb = handle_get_default_sample_rate,   .set_cb = handle_set_default_sample_rate },
+    [PROPERTY_HANDLER_CARDS]                 = { .property_name = "Cards",               .type = "ao", .get_cb = handle_get_cards,                 .set_cb = NULL },
+    [PROPERTY_HANDLER_SINKS]                 = { .property_name = "Sinks",               .type = "ao", .get_cb = handle_get_sinks,                 .set_cb = NULL },
+    [PROPERTY_HANDLER_FALLBACK_SINK]         = { .property_name = "FallbackSink",        .type = "o",  .get_cb = handle_get_fallback_sink,         .set_cb = handle_set_fallback_sink },
+    [PROPERTY_HANDLER_SOURCES]               = { .property_name = "Sources",             .type = "ao", .get_cb = handle_get_sources,               .set_cb = NULL },
+    [PROPERTY_HANDLER_FALLBACK_SOURCE]       = { .property_name = "FallbackSource",      .type = "o",  .get_cb = handle_get_fallback_source,       .set_cb = handle_set_fallback_source },
+    [PROPERTY_HANDLER_PLAYBACK_STREAMS]      = { .property_name = "PlaybackStreams",     .type = "ao", .get_cb = handle_get_playback_streams,      .set_cb = NULL },
+    [PROPERTY_HANDLER_RECORD_STREAMS]        = { .property_name = "RecordStreams",       .type = "ao", .get_cb = handle_get_record_streams,        .set_cb = NULL },
+    [PROPERTY_HANDLER_SAMPLES]               = { .property_name = "Samples",             .type = "ao", .get_cb = handle_get_samples,               .set_cb = NULL },
+    [PROPERTY_HANDLER_MODULES]               = { .property_name = "Modules",             .type = "ao", .get_cb = handle_get_modules,               .set_cb = NULL },
+    [PROPERTY_HANDLER_CLIENTS]               = { .property_name = "Clients",             .type = "ao", .get_cb = handle_get_clients,               .set_cb = NULL },
+    [PROPERTY_HANDLER_MY_CLIENT]             = { .property_name = "MyClient",            .type = "o",  .get_cb = handle_get_my_client,             .set_cb = NULL },
+    [PROPERTY_HANDLER_EXTENSIONS]            = { .property_name = "Extensions",          .type = "as", .get_cb = handle_get_extensions,            .set_cb = NULL }
+};
+
+enum method_handler_index {
+    METHOD_HANDLER_GET_CARD_BY_NAME,
+    METHOD_HANDLER_GET_SINK_BY_NAME,
+    METHOD_HANDLER_GET_SOURCE_BY_NAME,
+    METHOD_HANDLER_GET_SAMPLE_BY_NAME,
+    METHOD_HANDLER_UPLOAD_SAMPLE,
+    METHOD_HANDLER_LOAD_MODULE,
+    METHOD_HANDLER_EXIT,
+    METHOD_HANDLER_LISTEN_FOR_SIGNAL,
+    METHOD_HANDLER_STOP_LISTENING_FOR_SIGNAL,
+    METHOD_HANDLER_MAX
+};
+
+static pa_dbus_arg_info get_card_by_name_args[] = { { "name", "s", "in" }, { "card", "o", "out" } };
+static pa_dbus_arg_info get_sink_by_name_args[] = { { "name", "s", "in" }, { "sink", "o", "out" } };
+static pa_dbus_arg_info get_source_by_name_args[] = { { "name", "s", "in" }, { "source", "o", "out" } };
+static pa_dbus_arg_info get_sample_by_name_args[] = { { "name", "s", "in" }, { "sample", "o", "out" } };
+static pa_dbus_arg_info upload_sample_args[] = { { "name",           "s",      "in" },
+                                                 { "sample_format",  "u",      "in" },
+                                                 { "sample_rate",    "u",      "in" },
+                                                 { "channels",       "au",     "in" },
+                                                 { "default_volume", "au",     "in" },
+                                                 { "property_list",  "a{say}", "in" },
+                                                 { "data",           "ay",     "in" },
+                                                 { "sample",         "o",      "out" } };
+static pa_dbus_arg_info load_module_args[] = { { "name", "s", "in" }, { "arguments", "a{ss}", "in" }, { "module", "o", "out" } };
+static pa_dbus_arg_info listen_for_signal_args[] = { { "signal", "s", "in" }, { "objects", "ao", "in" } };
+static pa_dbus_arg_info stop_listening_for_signal_args[] = { { "signal", "s", "in" } };
+
+static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
+    [METHOD_HANDLER_GET_CARD_BY_NAME] = {
+        .method_name = "GetCardByName",
+        .arguments = get_card_by_name_args,
+        .n_arguments = sizeof(get_card_by_name_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_get_card_by_name },
+    [METHOD_HANDLER_GET_SINK_BY_NAME] = {
+        .method_name = "GetSinkByName",
+        .arguments = get_sink_by_name_args,
+        .n_arguments = sizeof(get_sink_by_name_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_get_sink_by_name },
+    [METHOD_HANDLER_GET_SOURCE_BY_NAME] = {
+        .method_name = "GetSourceByName",
+        .arguments = get_source_by_name_args,
+        .n_arguments = sizeof(get_source_by_name_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_get_source_by_name },
+    [METHOD_HANDLER_GET_SAMPLE_BY_NAME] = {
+        .method_name = "GetSampleByName",
+        .arguments = get_sample_by_name_args,
+        .n_arguments = sizeof(get_sample_by_name_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_get_sample_by_name },
+    [METHOD_HANDLER_UPLOAD_SAMPLE] = {
+        .method_name = "UploadSample",
+        .arguments = upload_sample_args,
+        .n_arguments = sizeof(upload_sample_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_upload_sample },
+    [METHOD_HANDLER_LOAD_MODULE] = {
+        .method_name = "LoadModule",
+        .arguments = upload_sample_args,
+        .n_arguments = sizeof(load_module_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_load_module },
+    [METHOD_HANDLER_EXIT] = {
+        .method_name = "Exit",
+        .arguments = NULL,
+        .n_arguments = 0,
+        .receive_cb = handle_exit },
+    [METHOD_HANDLER_LISTEN_FOR_SIGNAL] = {
+        .method_name = "ListenForSignal",
+        .arguments = listen_for_signal_args,
+        .n_arguments = sizeof(listen_for_signal_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_listen_for_signal },
+    [METHOD_HANDLER_STOP_LISTENING_FOR_SIGNAL] = {
+        .method_name = "StopListeningForSignal",
+        .arguments = stop_listening_for_signal_args,
+        .n_arguments = sizeof(stop_listening_for_signal_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_stop_listening_for_signal }
+};
+
+enum signal_index {
+    SIGNAL_NEW_CARD,
+    SIGNAL_CARD_REMOVED,
+    SIGNAL_NEW_SINK,
+    SIGNAL_SINK_REMOVED,
+    SIGNAL_FALLBACK_SINK_UPDATED,
+    SIGNAL_NEW_SOURCE,
+    SIGNAL_SOURCE_REMOVED,
+    SIGNAL_FALLBACK_SOURCE_UPDATED,
+    SIGNAL_NEW_PLAYBACK_STREAM,
+    SIGNAL_PLAYBACK_STREAM_REMOVED,
+    SIGNAL_NEW_RECORD_STREAM,
+    SIGNAL_RECORD_STREAM_REMOVED,
+    SIGNAL_NEW_SAMPLE,
+    SIGNAL_SAMPLE_REMOVED,
+    SIGNAL_NEW_MODULE,
+    SIGNAL_MODULE_REMOVED,
+    SIGNAL_NEW_CLIENT,
+    SIGNAL_CLIENT_REMOVED,
+    SIGNAL_MAX
+};
+
+static pa_dbus_arg_info new_card_args[] =                { { "card",            "o", NULL } };
+static pa_dbus_arg_info card_removed_args[] =            { { "card",            "o", NULL } };
+static pa_dbus_arg_info new_sink_args[] =                { { "sink",            "o", NULL } };
+static pa_dbus_arg_info sink_removed_args[] =            { { "sink",            "o", NULL } };
+static pa_dbus_arg_info fallback_sink_updated_args[] =   { { "sink",            "o", NULL } };
+static pa_dbus_arg_info new_source_args[] =              { { "source",          "o", NULL } };
+static pa_dbus_arg_info source_removed_args[] =          { { "source",          "o", NULL } };
+static pa_dbus_arg_info fallback_source_updated_args[] = { { "source",          "o", NULL } };
+static pa_dbus_arg_info new_playback_stream_args[] =     { { "playback_stream", "o", NULL } };
+static pa_dbus_arg_info playback_stream_removed_args[] = { { "playback_stream", "o", NULL } };
+static pa_dbus_arg_info new_record_stream_args[] =       { { "record_stream",   "o", NULL } };
+static pa_dbus_arg_info record_stream_removed_args[] =   { { "record_stream",   "o", NULL } };
+static pa_dbus_arg_info new_sample_args[] =              { { "sample",          "o", NULL } };
+static pa_dbus_arg_info sample_removed_args[] =          { { "sample",          "o", NULL } };
+static pa_dbus_arg_info new_module_args[] =              { { "module",          "o", NULL } };
+static pa_dbus_arg_info module_removed_args[] =          { { "module",          "o", NULL } };
+static pa_dbus_arg_info new_client_args[] =              { { "client",          "o", NULL } };
+static pa_dbus_arg_info client_removed_args[] =          { { "client",          "o", NULL } };
+
+static pa_dbus_signal_info signals[SIGNAL_MAX] = {
+    [SIGNAL_NEW_CARD]                = { .name = "NewCard",               .arguments = new_card_args,                .n_arguments = 1 },
+    [SIGNAL_CARD_REMOVED]            = { .name = "CardRemoved",           .arguments = card_removed_args,            .n_arguments = 1 },
+    [SIGNAL_NEW_SINK]                = { .name = "NewSink",               .arguments = new_sink_args,                .n_arguments = 1 },
+    [SIGNAL_SINK_REMOVED]            = { .name = "SinkRemoved",           .arguments = sink_removed_args,            .n_arguments = 1 },
+    [SIGNAL_FALLBACK_SINK_UPDATED]   = { .name = "FallbackSinkUpdated",   .arguments = fallback_sink_updated_args,   .n_arguments = 1 },
+    [SIGNAL_NEW_SOURCE]              = { .name = "NewSource",             .arguments = new_source_args,              .n_arguments = 1 },
+    [SIGNAL_SOURCE_REMOVED]          = { .name = "SourceRemoved",         .arguments = source_removed_args,          .n_arguments = 1 },
+    [SIGNAL_FALLBACK_SOURCE_UPDATED] = { .name = "FallbackSourceUpdated", .arguments = fallback_source_updated_args, .n_arguments = 1 },
+    [SIGNAL_NEW_PLAYBACK_STREAM]     = { .name = "NewPlaybackStream",     .arguments = new_playback_stream_args,     .n_arguments = 1 },
+    [SIGNAL_PLAYBACK_STREAM_REMOVED] = { .name = "PlaybackStreamRemoved", .arguments = playback_stream_removed_args, .n_arguments = 1 },
+    [SIGNAL_NEW_RECORD_STREAM]       = { .name = "NewRecordStream",       .arguments = new_record_stream_args,       .n_arguments = 1 },
+    [SIGNAL_RECORD_STREAM_REMOVED]   = { .name = "RecordStreamRemoved",   .arguments = record_stream_removed_args,   .n_arguments = 1 },
+    [SIGNAL_NEW_SAMPLE]              = { .name = "NewSample",             .arguments = new_sample_args,              .n_arguments = 1 },
+    [SIGNAL_SAMPLE_REMOVED]          = { .name = "SampleRemoved",         .arguments = sample_removed_args,          .n_arguments = 1 },
+    [SIGNAL_NEW_MODULE]              = { .name = "NewModule",             .arguments = new_module_args,              .n_arguments = 1 },
+    [SIGNAL_MODULE_REMOVED]          = { .name = "ModuleRemoved",         .arguments = module_removed_args,          .n_arguments = 1 },
+    [SIGNAL_NEW_CLIENT]              = { .name = "NewClient",             .arguments = new_client_args,              .n_arguments = 1 },
+    [SIGNAL_CLIENT_REMOVED]          = { .name = "ClientRemoved",         .arguments = client_removed_args,          .n_arguments = 1 },
+};
+
+static pa_dbus_interface_info core_interface_info = {
+    .name = INTERFACE_CORE,
+    .method_handlers = method_handlers,
+    .n_method_handlers = METHOD_HANDLER_MAX,
+    .property_handlers = property_handlers,
+    .n_property_handlers = PROPERTY_HANDLER_MAX,
+    .get_all_properties_cb = handle_get_all,
+    .signals = signals,
+    .n_signals = SIGNAL_MAX
+};
+
+static void handle_get_interface_revision(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    dbus_uint32_t interface_revision = INTERFACE_REVISION;
+
+    pa_assert(conn);
+    pa_assert(msg);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &interface_revision);
+}
+
+static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    const char *server_name = PACKAGE_NAME;
+
+    pa_assert(conn);
+    pa_assert(msg);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &server_name);
+}
+
+static void handle_get_version(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    const char *version = PACKAGE_VERSION;
+
+    pa_assert(conn);
+    pa_assert(msg);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &version);
+}
+
+static dbus_bool_t get_is_local(DBusConnection *conn) {
+    int conn_fd;
+
+    pa_assert(conn);
+
+    if (!dbus_connection_get_socket(conn, &conn_fd))
+        return FALSE;
+
+    return pa_socket_is_local(conn_fd);
+}
+
+static void handle_get_is_local(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    dbus_bool_t is_local;
+
+    pa_assert(conn);
+    pa_assert(msg);
+
+    is_local = get_is_local(conn);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &is_local);
+}
+
+static void handle_get_username(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    char *username = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+
+    username = pa_get_user_name_malloc();
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &username);
+
+    pa_xfree(username);
+}
+
+static void handle_get_hostname(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    char *hostname = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+
+    hostname = pa_get_host_name_malloc();
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &hostname);
+
+    pa_xfree(hostname);
+}
+
+/* Caller frees the returned array. */
+static dbus_uint32_t *get_default_channels(pa_dbusiface_core *c, unsigned *n) {
+    dbus_uint32_t *default_channels = NULL;
+    unsigned i;
+
+    pa_assert(c);
+    pa_assert(n);
+
+    *n = c->core->default_channel_map.channels;
+    default_channels = pa_xnew(dbus_uint32_t, *n);
+
+    for (i = 0; i < *n; ++i)
+        default_channels[i] = c->core->default_channel_map.map[i];
+
+    return default_channels;
+}
+
+static void handle_get_default_channels(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    dbus_uint32_t *default_channels = NULL;
+    unsigned n;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    default_channels = get_default_channels(c, &n);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_UINT32, default_channels, n);
+
+    pa_xfree(default_channels);
+}
+
+static void handle_set_default_channels(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    pa_channel_map new_channel_map;
+    DBusMessageIter msg_iter;
+    DBusMessageIter variant_iter;
+    DBusMessageIter array_iter;
+    dbus_uint32_t *default_channels;
+    int n_channels;
+    unsigned i;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    pa_channel_map_init(&new_channel_map);
+
+    pa_assert_se(dbus_message_iter_init(msg, &msg_iter));
+
+    /* Skip the interface and property name arguments. */
+    if (!dbus_message_iter_next(&msg_iter) || !dbus_message_iter_next(&msg_iter)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
+        return;
+    }
+
+    if (dbus_message_iter_get_arg_type(&msg_iter) != DBUS_TYPE_VARIANT) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Message argument isn't a variant.");
+        return;
+    }
+
+    dbus_message_iter_recurse(&msg_iter, &variant_iter);
+
+    if (dbus_message_iter_get_arg_type(&variant_iter) != DBUS_TYPE_ARRAY) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Variant doesn't contain an array.");
+        return;
+    }
+
+    dbus_message_iter_recurse(&variant_iter, &array_iter);
+
+    if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_UINT32) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Array type is not uint32.");
+        return;
+    }
+
+    dbus_message_iter_get_fixed_array(&array_iter, &default_channels, &n_channels);
+
+    if (n_channels <= 0) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Empty channel array.");
+        return;
+    }
+
+    new_channel_map.channels = n_channels;
+
+    for (i = 0; i < new_channel_map.channels; ++i) {
+        if (default_channels[i] >= PA_CHANNEL_POSITION_MAX) {
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid channel position.");
+            return;
+        }
+
+        new_channel_map.map[i] = default_channels[i];
+    }
+
+    c->core->default_channel_map = new_channel_map;
+    c->core->default_sample_spec.channels = n_channels;
+
+    pa_dbus_send_empty_reply(conn, msg);
+};
+
+static void handle_get_default_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    dbus_uint32_t default_sample_format;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    default_sample_format = c->core->default_sample_spec.format;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &default_sample_format);
+}
+
+static void handle_set_default_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    dbus_uint32_t default_sample_format;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_UINT32, &default_sample_format) < 0)
+        return;
+
+    if (default_sample_format >= PA_SAMPLE_MAX) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid sample format.");
+        return;
+    }
+
+    c->core->default_sample_spec.format = default_sample_format;
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+static void handle_get_default_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    dbus_uint32_t default_sample_rate;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    default_sample_rate = c->core->default_sample_spec.rate;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &default_sample_rate);
+}
+
+static void handle_set_default_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    dbus_uint32_t default_sample_rate;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_UINT32, &default_sample_rate) < 0)
+        return;
+
+    if (default_sample_rate <= 0 || default_sample_rate > PA_RATE_MAX) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid sample format.");
+        return;
+    }
+
+    c->core->default_sample_spec.rate = default_sample_rate;
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+/* The caller frees the array, but not the strings. */
+static const char **get_cards(pa_dbusiface_core *c, unsigned *n) {
+    const char **cards;
+    unsigned i;
+    void *state = NULL;
+    pa_dbusiface_card *card;
+
+    pa_assert(c);
+    pa_assert(n);
+
+    *n = pa_hashmap_size(c->cards);
+
+    if (*n == 0)
+        return NULL;
+
+    cards = pa_xnew(const char *, *n);
+
+    for (i = 0, card = pa_hashmap_iterate(c->cards, &state, NULL); card; ++i, card = pa_hashmap_iterate(c->cards, &state, NULL))
+        cards[i] = pa_dbusiface_card_get_path(card);
+
+    pa_assert(i == *n);
+
+    return cards;
+}
+
+static void handle_get_cards(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    const char **cards;
+    unsigned n;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    cards = get_cards(c, &n);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, cards, n);
+
+    pa_xfree(cards);
+}
+
+/* The caller frees the array, but not the strings. */
+static const char **get_sinks(pa_dbusiface_core *c, unsigned *n) {
+    const char **sinks;
+    unsigned i;
+    void *state = NULL;
+    pa_dbusiface_device *sink;
+
+    pa_assert(c);
+    pa_assert(n);
+
+    *n = pa_hashmap_size(c->sinks_by_index);
+
+    if (*n == 0)
+        return NULL;
+
+    sinks = pa_xnew(const char *, *n);
+
+    for (i = 0, sink = pa_hashmap_iterate(c->sinks_by_index, &state, NULL); sink; ++i, sink = pa_hashmap_iterate(c->sinks_by_index, &state, NULL))
+        sinks[i] = pa_dbusiface_device_get_path(sink);
+
+    pa_assert(i == *n);
+
+    return sinks;
+}
+
+static void handle_get_sinks(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    const char **sinks;
+    unsigned n;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    sinks = get_sinks(c, &n);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, sinks, n);
+
+    pa_xfree(sinks);
+}
+
+static void handle_get_fallback_sink(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    pa_dbusiface_device *fallback_sink;
+    const char *object_path;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    if (!c->fallback_sink) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "There are no sinks, and therefore no fallback sink either.");
+        return;
+    }
+
+    pa_assert_se((fallback_sink = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(c->fallback_sink->index))));
+    object_path = pa_dbusiface_device_get_path(fallback_sink);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path);
+}
+
+static void handle_set_fallback_sink(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    pa_dbusiface_device *fallback_sink;
+    const char *object_path;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    if (!c->fallback_sink) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "There are no sinks, and therefore no fallback sink either.");
+        return;
+    }
+
+    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path) < 0)
+        return;
+
+    if (!(fallback_sink = pa_hashmap_get(c->sinks_by_path, object_path))) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such sink.");
+        return;
+    }
+
+    pa_namereg_set_default_sink(c->core, pa_dbusiface_device_get_sink(fallback_sink));
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+/* The caller frees the array, but not the strings. */
+static const char **get_sources(pa_dbusiface_core *c, unsigned *n) {
+    const char **sources;
+    unsigned i;
+    void *state = NULL;
+    pa_dbusiface_device *source;
+
+    pa_assert(c);
+    pa_assert(n);
+
+    *n = pa_hashmap_size(c->sources_by_index);
+
+    if (*n == 0)
+        return NULL;
+
+    sources = pa_xnew(const char *, *n);
+
+    for (i = 0, source = pa_hashmap_iterate(c->sources_by_index, &state, NULL); source; ++i, source = pa_hashmap_iterate(c->sources_by_index, &state, NULL))
+        sources[i] = pa_dbusiface_device_get_path(source);
+
+    pa_assert(i == *n);
+
+    return sources;
+}
+
+static void handle_get_sources(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    const char **sources;
+    unsigned n;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    sources = get_sources(c, &n);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, sources, n);
+
+    pa_xfree(sources);
+}
+
+static void handle_get_fallback_source(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    pa_dbusiface_device *fallback_source;
+    const char *object_path;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    if (!c->fallback_source) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "There are no sources, and therefore no fallback source either.");
+        return;
+    }
+
+    pa_assert_se((fallback_source = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(c->fallback_source->index))));
+    object_path = pa_dbusiface_device_get_path(fallback_source);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path);
+}
+
+static void handle_set_fallback_source(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    pa_dbusiface_device *fallback_source;
+    const char *object_path;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    if (!c->fallback_source) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "There are no sources, and therefore no fallback source either.");
+        return;
+    }
+
+    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path) < 0)
+        return;
+
+    if (!(fallback_source = pa_hashmap_get(c->sources_by_path, object_path))) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such source.");
+        return;
+    }
+
+    pa_namereg_set_default_source(c->core, pa_dbusiface_device_get_source(fallback_source));
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+/* The caller frees the array, but not the strings. */
+static const char **get_playback_streams(pa_dbusiface_core *c, unsigned *n) {
+    const char **streams;
+    unsigned i;
+    void *state = NULL;
+    pa_dbusiface_stream *stream;
+
+    pa_assert(c);
+    pa_assert(n);
+
+    *n = pa_hashmap_size(c->playback_streams);
+
+    if (*n == 0)
+        return NULL;
+
+    streams = pa_xnew(const char *, *n);
+
+    for (i = 0, stream = pa_hashmap_iterate(c->playback_streams, &state, NULL); stream; ++i, stream = pa_hashmap_iterate(c->playback_streams, &state, NULL))
+        streams[i] = pa_dbusiface_stream_get_path(stream);
+
+    pa_assert(i == *n);
+
+    return streams;
+}
+
+static void handle_get_playback_streams(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    const char **playback_streams;
+    unsigned n;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    playback_streams = get_playback_streams(c, &n);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, playback_streams, n);
+
+    pa_xfree(playback_streams);
+}
+
+/* The caller frees the array, but not the strings. */
+static const char **get_record_streams(pa_dbusiface_core *c, unsigned *n) {
+    const char **streams;
+    unsigned i;
+    void *state = NULL;
+    pa_dbusiface_stream *stream;
+
+    pa_assert(c);
+    pa_assert(n);
+
+    *n = pa_hashmap_size(c->record_streams);
+
+    if (*n == 0)
+        return NULL;
+
+    streams = pa_xnew(const char *, *n);
+
+    for (i = 0, stream = pa_hashmap_iterate(c->record_streams, &state, NULL); stream; ++i, stream = pa_hashmap_iterate(c->record_streams, &state, NULL))
+        streams[i] = pa_dbusiface_stream_get_path(stream);
+
+    pa_assert(i == *n);
+
+    return streams;
+}
+
+static void handle_get_record_streams(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    const char **record_streams;
+    unsigned n;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    record_streams = get_record_streams(c, &n);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, record_streams, n);
+
+    pa_xfree(record_streams);
+}
+
+/* The caller frees the array, but not the strings. */
+static const char **get_samples(pa_dbusiface_core *c, unsigned *n) {
+    const char **samples;
+    unsigned i;
+    void *state = NULL;
+    pa_dbusiface_sample *sample;
+
+    pa_assert(c);
+    pa_assert(n);
+
+    *n = pa_hashmap_size(c->samples);
+
+    if (*n == 0)
+        return NULL;
+
+    samples = pa_xnew(const char *, *n);
+
+    for (i = 0, sample = pa_hashmap_iterate(c->samples, &state, NULL); sample; ++i, sample = pa_hashmap_iterate(c->samples, &state, NULL))
+        samples[i] = pa_dbusiface_sample_get_path(sample);
+
+    pa_assert(i == *n);
+
+    return samples;
+}
+
+static void handle_get_samples(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    const char **samples;
+    unsigned n;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    samples = get_samples(c, &n);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, samples, n);
+
+    pa_xfree(samples);
+}
+
+/* The caller frees the array, but not the strings. */
+static const char **get_modules(pa_dbusiface_core *c, unsigned *n) {
+    const char **modules;
+    unsigned i;
+    void *state = NULL;
+    pa_dbusiface_module *module;
+
+    pa_assert(c);
+    pa_assert(n);
+
+    *n = pa_hashmap_size(c->modules);
+
+    if (*n == 0)
+        return NULL;
+
+    modules = pa_xnew(const char *, *n);
+
+    for (i = 0, module = pa_hashmap_iterate(c->modules, &state, NULL); module; ++i, module = pa_hashmap_iterate(c->modules, &state, NULL))
+        modules[i] = pa_dbusiface_module_get_path(module);
+
+    pa_assert(i == *n);
+
+    return modules;
+}
+
+static void handle_get_modules(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    const char **modules;
+    unsigned n;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    modules = get_modules(c, &n);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, modules, n);
+
+    pa_xfree(modules);
+}
+
+/* The caller frees the array, but not the strings. */
+static const char **get_clients(pa_dbusiface_core *c, unsigned *n) {
+    const char **clients;
+    unsigned i;
+    void *state = NULL;
+    pa_dbusiface_client *client;
+
+    pa_assert(c);
+    pa_assert(n);
+
+    *n = pa_hashmap_size(c->clients);
+
+    if (*n == 0)
+        return NULL;
+
+    clients = pa_xnew(const char *, *n);
+
+    for (i = 0, client = pa_hashmap_iterate(c->clients, &state, NULL); client; ++i, client = pa_hashmap_iterate(c->clients, &state, NULL))
+        clients[i] = pa_dbusiface_client_get_path(client);
+
+    pa_assert(i == *n);
+
+    return clients;
+}
+
+static void handle_get_clients(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    const char **clients;
+    unsigned n;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    clients = get_clients(c, &n);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, clients, n);
+
+    pa_xfree(clients);
+}
+
+static const char *get_my_client(pa_dbusiface_core *c, DBusConnection *conn) {
+    pa_client *my_client;
+
+    pa_assert(c);
+    pa_assert(conn);
+
+    pa_assert_se((my_client = pa_dbus_protocol_get_client(c->dbus_protocol, conn)));
+
+    return pa_dbusiface_client_get_path(pa_hashmap_get(c->clients, PA_UINT32_TO_PTR(my_client->index)));
+}
+
+static void handle_get_my_client(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    const char *my_client;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    my_client = get_my_client(c, conn);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &my_client);
+}
+
+static void handle_get_extensions(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    const char **extensions;
+    unsigned n;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    extensions = pa_dbus_protocol_get_extensions(c->dbus_protocol, &n);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_STRING, extensions, n);
+
+    pa_xfree(extensions);
+}
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+    dbus_uint32_t interface_revision;
+    const char *server_name;
+    const char *version;
+    dbus_bool_t is_local;
+    char *username;
+    char *hostname;
+    dbus_uint32_t *default_channels;
+    unsigned n_default_channels;
+    dbus_uint32_t default_sample_format;
+    dbus_uint32_t default_sample_rate;
+    const char **cards;
+    unsigned n_cards;
+    const char **sinks;
+    unsigned n_sinks;
+    const char *fallback_sink;
+    const char **sources;
+    unsigned n_sources;
+    const char *fallback_source;
+    const char **playback_streams;
+    unsigned n_playback_streams;
+    const char **record_streams;
+    unsigned n_record_streams;
+    const char **samples;
+    unsigned n_samples;
+    const char **modules;
+    unsigned n_modules;
+    const char **clients;
+    unsigned n_clients;
+    const char *my_client;
+    const char **extensions;
+    unsigned n_extensions;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    interface_revision = INTERFACE_REVISION;
+    server_name = PACKAGE_NAME;
+    version = PACKAGE_VERSION;
+    is_local = get_is_local(conn);
+    username = pa_get_user_name_malloc();
+    hostname = pa_get_host_name_malloc();
+    default_channels = get_default_channels(c, &n_default_channels);
+    default_sample_format = c->core->default_sample_spec.format;
+    default_sample_rate = c->core->default_sample_spec.rate;
+    cards = get_cards(c, &n_cards);
+    sinks = get_sinks(c, &n_sinks);
+    fallback_sink = c->fallback_sink ? pa_dbusiface_device_get_path(pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(c->fallback_sink->index))) : NULL;
+    sources = get_sources(c, &n_sources);
+    fallback_source = c->fallback_source ? pa_dbusiface_device_get_path(pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(c->fallback_source->index))) : NULL;
+    playback_streams = get_playback_streams(c, &n_playback_streams);
+    record_streams = get_record_streams(c, &n_record_streams);
+    samples = get_samples(c, &n_samples);
+    modules = get_modules(c, &n_modules);
+    clients = get_clients(c, &n_clients);
+    my_client = get_my_client(c, conn);
+    extensions = pa_dbus_protocol_get_extensions(c->dbus_protocol, &n_extensions);
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INTERFACE_REVISION].property_name, DBUS_TYPE_UINT32, &interface_revision);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &server_name);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_VERSION].property_name, DBUS_TYPE_STRING, &version);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_IS_LOCAL].property_name, DBUS_TYPE_BOOLEAN, &is_local);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_USERNAME].property_name, DBUS_TYPE_STRING, &username);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_HOSTNAME].property_name, DBUS_TYPE_STRING, &hostname);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DEFAULT_CHANNELS].property_name, DBUS_TYPE_UINT32, default_channels, n_default_channels);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DEFAULT_SAMPLE_FORMAT].property_name, DBUS_TYPE_UINT32, &default_sample_format);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DEFAULT_SAMPLE_RATE].property_name, DBUS_TYPE_UINT32, &default_sample_rate);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CARDS].property_name, DBUS_TYPE_OBJECT_PATH, cards, n_cards);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SINKS].property_name, DBUS_TYPE_OBJECT_PATH, sinks, n_sinks);
+
+    if (fallback_sink)
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_FALLBACK_SINK].property_name, DBUS_TYPE_OBJECT_PATH, &fallback_sink);
+
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SOURCES].property_name, DBUS_TYPE_OBJECT_PATH, sources, n_sources);
+
+    if (fallback_source)
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_FALLBACK_SOURCE].property_name, DBUS_TYPE_OBJECT_PATH, &fallback_source);
+
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PLAYBACK_STREAMS].property_name, DBUS_TYPE_OBJECT_PATH, playback_streams, n_playback_streams);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_RECORD_STREAMS].property_name, DBUS_TYPE_OBJECT_PATH, record_streams, n_record_streams);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLES].property_name, DBUS_TYPE_OBJECT_PATH, samples, n_samples);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_MODULES].property_name, DBUS_TYPE_OBJECT_PATH, modules, n_modules);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CLIENTS].property_name, DBUS_TYPE_OBJECT_PATH, clients, n_clients);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_MY_CLIENT].property_name, DBUS_TYPE_OBJECT_PATH, &my_client);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_EXTENSIONS].property_name, DBUS_TYPE_STRING, extensions, n_extensions);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+
+    dbus_message_unref(reply);
+
+    pa_xfree(username);
+    pa_xfree(hostname);
+    pa_xfree(default_channels);
+    pa_xfree(cards);
+    pa_xfree(sinks);
+    pa_xfree(sources);
+    pa_xfree(playback_streams);
+    pa_xfree(record_streams);
+    pa_xfree(samples);
+    pa_xfree(modules);
+    pa_xfree(clients);
+    pa_xfree(extensions);
+}
+
+static void handle_get_card_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    char *card_name;
+    pa_card *card;
+    pa_dbusiface_card *dbus_card;
+    const char *object_path;
+    DBusError error;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    dbus_error_init(&error);
+
+    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &card_name, DBUS_TYPE_INVALID)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, error.message);
+        dbus_error_free(&error);
+        return;
+    }
+
+    if (!(card = pa_namereg_get(c->core, card_name, PA_NAMEREG_CARD))) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such card.");
+        return;
+    }
+
+    pa_assert_se((dbus_card = pa_hashmap_get(c->cards, PA_UINT32_TO_PTR(card->index))));
+
+    object_path = pa_dbusiface_card_get_path(dbus_card);
+
+    pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path);
+}
+
+static void handle_get_sink_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    char *sink_name;
+    pa_sink *sink;
+    pa_dbusiface_device *dbus_sink;
+    const char *object_path;
+    DBusError error;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    dbus_error_init(&error);
+
+    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &sink_name, DBUS_TYPE_INVALID)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, error.message);
+        dbus_error_free(&error);
+        return;
+    }
+
+    if (!(sink = pa_namereg_get(c->core, sink_name, PA_NAMEREG_SINK))) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such sink.");
+        return;
+    }
+
+    pa_assert_se((dbus_sink = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(sink->index))));
+
+    object_path = pa_dbusiface_device_get_path(dbus_sink);
+
+    pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path);
+}
+
+static void handle_get_source_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    char *source_name;
+    pa_source *source;
+    pa_dbusiface_device *dbus_source;
+    const char *object_path;
+    DBusError error;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    dbus_error_init(&error);
+
+    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &source_name, DBUS_TYPE_INVALID)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, error.message);
+        dbus_error_free(&error);
+        return;
+    }
+
+    if (!(source = pa_namereg_get(c->core, source_name, PA_NAMEREG_SOURCE))) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such source.");
+        return;
+    }
+
+    pa_assert_se((dbus_source = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(source->index))));
+
+    object_path = pa_dbusiface_device_get_path(dbus_source);
+
+    pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path);
+}
+
+static void handle_get_sample_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    char *sample_name;
+    pa_scache_entry *sample;
+    pa_dbusiface_sample *dbus_sample;
+    const char *object_path;
+    DBusError error;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    dbus_error_init(&error);
+
+    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &sample_name, DBUS_TYPE_INVALID)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, error.message);
+        dbus_error_free(&error);
+        return;
+    }
+
+    if (!(sample = pa_namereg_get(c->core, sample_name, PA_NAMEREG_SAMPLE))) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such sample.");
+        return;
+    }
+
+    pa_assert_se((dbus_sample = pa_hashmap_get(c->samples, PA_UINT32_TO_PTR(sample->index))));
+
+    object_path = pa_dbusiface_sample_get_path(dbus_sample);
+
+    pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path);
+}
+
+static void handle_upload_sample(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    DBusMessageIter msg_iter;
+    const char *name;
+    dbus_uint32_t sample_format;
+    dbus_uint32_t sample_rate;
+    const dbus_uint32_t *channels;
+    unsigned n_channels;
+    const dbus_uint32_t *default_volume;
+    unsigned n_volume_entries;
+    pa_proplist *property_list;
+    const uint8_t *data;
+    unsigned data_length;
+    unsigned i;
+    pa_sample_spec ss;
+    pa_channel_map map;
+    pa_memchunk chunk;
+    uint32_t idx;
+    pa_dbusiface_sample *dbus_sample = NULL;
+    pa_scache_entry *sample = NULL;
+    const char *object_path;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    chunk.memblock = NULL;
+
+    if (!dbus_message_iter_init(msg, &msg_iter)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
+        return;
+    }
+
+    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_STRING, &name) < 0)
+        return;
+
+    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_UINT32, &sample_format) < 0)
+        return;
+
+    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_UINT32, &sample_rate) < 0)
+        return;
+
+    if (pa_dbus_get_fixed_array_arg(conn, msg, &msg_iter, DBUS_TYPE_UINT32, &channels, &n_channels) < 0)
+        return;
+
+    if (pa_dbus_get_fixed_array_arg(conn, msg, &msg_iter, DBUS_TYPE_UINT32, &default_volume, &n_volume_entries) < 0)
+        return;
+
+    if (!(property_list = pa_dbus_get_proplist_arg(conn, msg, &msg_iter)))
+        return;
+
+    if (pa_dbus_get_fixed_array_arg(conn, msg, &msg_iter, DBUS_TYPE_BYTE, &data, &data_length) < 0)
+        goto finish;
+
+    if (sample_format >= PA_SAMPLE_MAX) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid sample format.");
+        goto finish;
+    }
+
+    if (sample_rate <= 0 || sample_rate > PA_RATE_MAX) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid sample rate.");
+        goto finish;
+    }
+
+    if (n_channels == 0) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Empty channel map.");
+        goto finish;
+    }
+
+    if (n_channels > PA_CHANNELS_MAX) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too many channels.");
+        goto finish;
+    }
+
+    for (i = 0; i < n_channels; ++i) {
+        if (channels[i] >= PA_CHANNEL_POSITION_MAX) {
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid channel position.");
+            goto finish;
+        }
+    }
+
+    if (n_volume_entries != 0 && n_volume_entries != n_channels) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "The channels and default_volume arguments have different number of elements.");
+        goto finish;
+    }
+
+    for (i = 0; i < n_volume_entries; ++i) {
+        if (default_volume[i] > PA_VOLUME_MAX) {
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid volume.");
+            goto finish;
+        }
+    }
+
+    if (data_length == 0) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Empty data.");
+        goto finish;
+    }
+
+    if (data_length > PA_SCACHE_ENTRY_SIZE_MAX) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too big sample.");
+        goto finish;
+    }
+
+    ss.format = sample_format;
+    ss.rate = sample_rate;
+    ss.channels = n_channels;
+
+    if (!pa_frame_aligned(data_length, &ss)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "The sample length in bytes doesn't align with the sample format and channels.");
+        goto finish;
+    }
+
+    map.channels = n_channels;
+    for (i = 0; i < n_channels; ++i)
+        map.map[i] = channels[i];
+
+    chunk.memblock = pa_memblock_new(c->core->mempool, data_length);
+    chunk.index = 0;
+    chunk.length = data_length;
+
+    memcpy(pa_memblock_acquire(chunk.memblock), data, data_length);
+    pa_memblock_release(chunk.memblock);
+
+    if (pa_scache_add_item(c->core, name, &ss, &map, &chunk, property_list, &idx) < 0) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Adding the sample failed.");
+        goto finish;
+    }
+
+    sample = pa_idxset_get_by_index(c->core->scache, idx);
+
+    if (n_volume_entries > 0) {
+        sample->volume.channels = n_channels;
+        for (i = 0; i < n_volume_entries; ++i)
+            sample->volume.values[i] = default_volume[i];
+        sample->volume_is_set = TRUE;
+    } else {
+        sample->volume_is_set = FALSE;
+    }
+
+    dbus_sample = pa_dbusiface_sample_new(sample, OBJECT_PATH);
+    pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), dbus_sample);
+
+    object_path = pa_dbusiface_sample_get_path(dbus_sample);
+
+    pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path);
+
+finish:
+    if (property_list)
+        pa_proplist_free(property_list);
+
+    if (chunk.memblock)
+        pa_memblock_unref(chunk.memblock);
+}
+
+static pa_bool_t contains_space(const char *string) {
+    const char *p;
+
+    pa_assert(string);
+
+    for (p = string; *p; ++p) {
+        if (isspace(*p))
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
+static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+    char *name;
+    const char *key;
+    const char *value;
+    char *escaped_value;
+    pa_strbuf *arg_buffer = NULL;
+    pa_module *module;
+    pa_dbusiface_module *dbus_module;
+    const char *object_path;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    if (c->core->disallow_module_loading) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_ACCESS_DENIED, "The server is configured to disallow module loading.");
+        return;
+    }
+
+    if (!dbus_message_iter_init(msg, &msg_iter)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
+        return;
+    }
+
+    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_STRING, &name) < 0)
+        return;
+
+    if (dbus_message_iter_get_arg_type(&msg_iter) != DBUS_TYPE_ARRAY) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type or too few arguments. An array was expected.");
+        return;
+    }
+
+    if (dbus_message_iter_get_element_type(&msg_iter) != DBUS_TYPE_DICT_ENTRY) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong array element type. A dict entry was expected.");
+        return;
+    }
+
+    arg_buffer = pa_strbuf_new();
+
+    dbus_message_iter_recurse(&msg_iter, &dict_iter);
+
+    while (dbus_message_iter_has_next(&dict_iter)) {
+        if (!pa_strbuf_isempty(arg_buffer))
+            pa_strbuf_putc(arg_buffer, ' ');
+
+        if (dbus_message_iter_get_arg_type(&dict_iter) != DBUS_TYPE_STRING) {
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict key type. A string was expected.");
+            goto finish;
+        }
+
+        dbus_message_iter_get_basic(&dict_iter, &key);
+
+        if (strlen(key) <= 0 || !pa_ascii_valid(key) || contains_space(key)) {
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid module argument name.");
+            goto finish;
+        }
+
+        if (dbus_message_iter_get_arg_type(&dict_iter) != DBUS_TYPE_STRING) {
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict value type. A string was expected.");
+            goto finish;
+        }
+
+        dbus_message_iter_get_basic(&dict_iter, &value);
+
+        escaped_value = pa_escape(value, "\"");
+        pa_strbuf_printf(arg_buffer, "%s=\"%s\"", key, escaped_value);
+        pa_xfree(escaped_value);
+    }
+
+    if (!(module = pa_module_load(c->core, name, pa_strbuf_tostring(arg_buffer)))) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Failed to load module.");
+        goto finish;
+    }
+
+    dbus_module = pa_dbusiface_module_new(module, OBJECT_PATH);
+    pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(module->index), dbus_module);
+
+    object_path = pa_dbusiface_module_get_path(dbus_module);
+
+    pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path);
+
+finish:
+    if (arg_buffer)
+        pa_strbuf_free(arg_buffer);
+}
+
+static void handle_exit(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    if (c->core->disallow_exit) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_ACCESS_DENIED, "The server is configured to disallow exiting.");
+        return;
+    }
+
+    pa_dbus_send_empty_reply(conn, msg);
+
+    pa_core_exit(c->core, FALSE, 0);
+}
+
+static void handle_listen_for_signal(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    const char *signal;
+    char **objects = NULL;
+    int n_objects;
+    DBusError error;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    dbus_error_init(&error);
+
+    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &signal, DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &objects, &n_objects, DBUS_TYPE_INVALID)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, error.message);
+        dbus_error_free(&error);
+        goto finish;
+    }
+
+    pa_dbus_protocol_add_signal_listener(c->dbus_protocol, conn, *signal ? signal : NULL, objects, n_objects);
+
+    pa_dbus_send_empty_reply(conn, msg);
+
+finish:
+    dbus_free_string_array(objects);
+}
+
+static void handle_stop_listening_for_signal(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    const char *signal;
+    DBusError error;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    dbus_error_init(&error);
+
+    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &signal, DBUS_TYPE_INVALID)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, error.message);
+        dbus_error_free(&error);
+        return;
+    }
+
+    pa_dbus_protocol_remove_signal_listener(c->dbus_protocol, conn, *signal ? signal : NULL);
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
+    pa_dbusiface_core *c = userdata;
+    pa_dbusiface_card *card = NULL;
+    pa_dbusiface_device *device = NULL;
+    pa_dbusiface_stream *stream = NULL;
+    pa_dbusiface_sample *sample = NULL;
+    pa_dbusiface_module *module = NULL;
+    pa_dbusiface_client *client = NULL;
+    DBusMessage *signal = NULL;
+    const char *object_path = NULL;
+    pa_sink *new_fallback_sink = NULL;
+    pa_source *new_fallback_source = NULL;
+
+    pa_assert(c);
+
+    switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) {
+        case PA_SUBSCRIPTION_EVENT_SERVER:
+            new_fallback_sink = pa_namereg_get_default_sink(core);
+            new_fallback_source = pa_namereg_get_default_source(core);
+
+            if (c->fallback_sink != new_fallback_sink) {
+                c->fallback_sink = new_fallback_sink;
+
+                if (new_fallback_sink) {
+                    pa_assert_se((device = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(new_fallback_sink->index))));
+
+                    object_path = pa_dbusiface_device_get_path(device);
+
+                    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
+                    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
+                    dbus_message_unref(signal);
+                    signal = NULL;
+                }
+            }
+
+            if (c->fallback_source != new_fallback_source) {
+                c->fallback_source = new_fallback_source;
+
+                if (new_fallback_source) {
+                    pa_assert_se((device = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(new_fallback_source->index))));
+
+                    object_path = pa_dbusiface_device_get_path(device);
+
+                    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
+                    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
+                    dbus_message_unref(signal);
+                    signal = NULL;
+                }
+            }
+            break;
+
+        case PA_SUBSCRIPTION_EVENT_CARD:
+            if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
+                card = pa_dbusiface_card_new(pa_idxset_get_by_index(core->cards, idx), OBJECT_PATH);
+                pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), card);
+
+                object_path = pa_dbusiface_card_get_path(card);
+
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_CARD].name)));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+            } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
+                pa_assert_se((card = pa_hashmap_remove(c->cards, PA_UINT32_TO_PTR(idx))));
+
+                object_path = pa_dbusiface_card_get_path(card);
+
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_CARD_REMOVED].name)));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+                pa_dbusiface_card_free(card);
+            }
+            break;
+
+        case PA_SUBSCRIPTION_EVENT_SINK:
+            if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
+                device = pa_dbusiface_device_new_sink(pa_idxset_get_by_index(core->sinks, idx), OBJECT_PATH);
+                object_path = pa_dbusiface_device_get_path(device);
+
+                pa_hashmap_put(c->sinks_by_index, PA_UINT32_TO_PTR(idx), device);
+                pa_hashmap_put(c->sinks_by_path, object_path, device);
+
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_SINK].name)));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+            } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
+                pa_assert_se((device = pa_hashmap_remove(c->sinks_by_index, PA_UINT32_TO_PTR(idx))));
+                object_path = pa_dbusiface_device_get_path(device);
+                pa_assert_se(pa_hashmap_remove(c->sinks_by_path, object_path));
+
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_SINK_REMOVED].name)));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+                pa_dbusiface_device_free(device);
+            }
+            break;
+
+        case PA_SUBSCRIPTION_EVENT_SOURCE:
+            if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
+                device = pa_dbusiface_device_new_source(pa_idxset_get_by_index(core->sources, idx), OBJECT_PATH);
+                object_path = pa_dbusiface_device_get_path(device);
+
+                pa_hashmap_put(c->sources_by_index, PA_UINT32_TO_PTR(idx), device);
+                pa_hashmap_put(c->sources_by_path, object_path, device);
+
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_SOURCE].name)));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+            } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
+                pa_assert_se((device = pa_hashmap_remove(c->sources_by_index, PA_UINT32_TO_PTR(idx))));
+                object_path = pa_dbusiface_device_get_path(device);
+                pa_assert_se(pa_hashmap_remove(c->sources_by_path, object_path));
+
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_SOURCE_REMOVED].name)));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+                pa_dbusiface_device_free(device);
+            }
+            break;
+
+        case PA_SUBSCRIPTION_EVENT_SINK_INPUT:
+            if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
+                stream = pa_dbusiface_stream_new_playback(pa_idxset_get_by_index(core->sink_inputs, idx), OBJECT_PATH);
+                pa_hashmap_put(c->playback_streams, PA_UINT32_TO_PTR(idx), stream);
+
+                object_path = pa_dbusiface_stream_get_path(stream);
+
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_PLAYBACK_STREAM].name)));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+            } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
+                pa_assert_se((stream = pa_hashmap_remove(c->playback_streams, PA_UINT32_TO_PTR(idx))));
+
+                object_path = pa_dbusiface_stream_get_path(stream);
+
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_PLAYBACK_STREAM_REMOVED].name)));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+                pa_dbusiface_stream_free(stream);
+            }
+            break;
+
+        case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT:
+            if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
+                stream = pa_dbusiface_stream_new_record(pa_idxset_get_by_index(core->source_outputs, idx), OBJECT_PATH);
+                pa_hashmap_put(c->record_streams, PA_UINT32_TO_PTR(idx), stream);
+
+                object_path = pa_dbusiface_stream_get_path(stream);
+
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_RECORD_STREAM].name)));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+            } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
+                pa_assert_se((stream = pa_hashmap_remove(c->record_streams, PA_UINT32_TO_PTR(idx))));
+
+                object_path = pa_dbusiface_stream_get_path(stream);
+
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_RECORD_STREAM_REMOVED].name)));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+                pa_dbusiface_stream_free(stream);
+            }
+            break;
+
+        case PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE:
+            if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
+                /* We may have created the pa_dbusiface_sample object already
+                 * in handle_upload_sample. */
+                if (!(sample = pa_hashmap_get(c->samples, PA_UINT32_TO_PTR(idx)))) {
+                    sample = pa_dbusiface_sample_new(pa_idxset_get_by_index(core->scache, idx), OBJECT_PATH);
+                    pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), sample);
+                }
+
+                object_path = pa_dbusiface_sample_get_path(sample);
+
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_SAMPLE].name)));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+            } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
+                pa_assert_se((sample = pa_hashmap_remove(c->samples, PA_UINT32_TO_PTR(idx))));
+
+                object_path = pa_dbusiface_sample_get_path(sample);
+
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_SAMPLE_REMOVED].name)));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+                pa_dbusiface_sample_free(sample);
+            }
+            break;
+
+        case PA_SUBSCRIPTION_EVENT_MODULE:
+            if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
+                /* We may have created the pa_dbusiface_module object already
+                 * in handle_load_module. */
+                if (!(module = pa_hashmap_get(c->modules, PA_UINT32_TO_PTR(idx)))) {
+                    module = pa_dbusiface_module_new(pa_idxset_get_by_index(core->modules, idx), OBJECT_PATH);
+                    pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(idx), module);
+                }
+
+                object_path = pa_dbusiface_module_get_path(module);
+
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_MODULE].name)));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+            } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
+                pa_assert_se((module = pa_hashmap_remove(c->modules, PA_UINT32_TO_PTR(idx))));
+
+                object_path = pa_dbusiface_module_get_path(module);
+
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_MODULE_REMOVED].name)));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+                pa_dbusiface_module_free(module);
+            }
+            break;
+
+        case PA_SUBSCRIPTION_EVENT_CLIENT:
+            if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
+                client = pa_dbusiface_client_new(pa_idxset_get_by_index(core->clients, idx), OBJECT_PATH);
+                pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(idx), client);
+
+                object_path = pa_dbusiface_client_get_path(client);
+
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_CLIENT].name)));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+            } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
+                pa_assert_se((client = pa_hashmap_remove(c->clients, PA_UINT32_TO_PTR(idx))));
+
+                object_path = pa_dbusiface_client_get_path(client);
+
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_CLIENT_REMOVED].name)));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+                pa_dbusiface_client_free(client);
+            }
+            break;
+    }
+
+    if (signal) {
+        pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
+        dbus_message_unref(signal);
+    }
+}
+
+pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core) {
+    pa_dbusiface_core *c;
+    pa_card *card;
+    pa_sink *sink;
+    pa_source *source;
+    pa_dbusiface_device *device;
+    pa_sink_input *sink_input;
+    pa_source_output *source_output;
+    pa_scache_entry *sample;
+    pa_module *module;
+    pa_client *client;
+    uint32_t idx;
+
+    pa_assert(core);
+
+    c = pa_xnew(pa_dbusiface_core, 1);
+    c->core = core;
+    c->subscription = pa_subscription_new(core, PA_SUBSCRIPTION_MASK_ALL, subscription_cb, c);
+    c->dbus_protocol = pa_dbus_protocol_get(core);
+    c->cards = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+    c->sinks_by_index = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+    c->sinks_by_path = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+    c->sources_by_index = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+    c->sources_by_path = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+    c->playback_streams = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+    c->record_streams = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+    c->samples = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+    c->modules = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+    c->clients = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+    c->fallback_sink = pa_namereg_get_default_sink(core);
+    c->fallback_source = pa_namereg_get_default_source(core);
+
+    for (card = pa_idxset_first(core->cards, &idx); card; card = pa_idxset_next(core->cards, &idx))
+        pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), pa_dbusiface_card_new(card, OBJECT_PATH));
+
+    for (sink = pa_idxset_first(core->sinks, &idx); sink; sink = pa_idxset_next(core->sinks, &idx)) {
+        device = pa_dbusiface_device_new_sink(sink, OBJECT_PATH);
+        pa_hashmap_put(c->sinks_by_index, PA_UINT32_TO_PTR(idx), device);
+        pa_hashmap_put(c->sinks_by_path, pa_dbusiface_device_get_path(device), device);
+    }
+
+    for (source = pa_idxset_first(core->sources, &idx); source; source = pa_idxset_next(core->sources, &idx)) {
+        device = pa_dbusiface_device_new_source(source, OBJECT_PATH);
+        pa_hashmap_put(c->sources_by_index, PA_UINT32_TO_PTR(idx), device);
+        pa_hashmap_put(c->sources_by_path, pa_dbusiface_device_get_path(device), device);
+    }
+
+    for (sink_input = pa_idxset_first(core->sink_inputs, &idx); sink_input; sink_input = pa_idxset_next(core->sink_inputs, &idx))
+        pa_hashmap_put(c->playback_streams, PA_UINT32_TO_PTR(idx), pa_dbusiface_stream_new_playback(sink_input, OBJECT_PATH));
+
+    for (source_output = pa_idxset_first(core->source_outputs, &idx); source_output; source_output = pa_idxset_next(core->source_outputs, &idx))
+        pa_hashmap_put(c->record_streams, PA_UINT32_TO_PTR(idx), pa_dbusiface_stream_new_record(source_output, OBJECT_PATH));
+
+    for (sample = pa_idxset_first(core->scache, &idx); sample; sample = pa_idxset_next(core->scache, &idx))
+        pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), pa_dbusiface_sample_new(sample, OBJECT_PATH));
+
+    for (module = pa_idxset_first(core->modules, &idx); module; module = pa_idxset_next(core->modules, &idx))
+        pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(idx), pa_dbusiface_module_new(module, OBJECT_PATH));
+
+    for (client = pa_idxset_first(core->clients, &idx); client; client = pa_idxset_next(core->clients, &idx))
+        pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(idx), pa_dbusiface_client_new(client, OBJECT_PATH));
+
+    pa_dbus_protocol_add_interface(c->dbus_protocol, OBJECT_PATH, &core_interface_info, c);
+
+    return c;
+}
+
+static void free_card_cb(void *p, void *userdata) {
+    pa_dbusiface_card *c = p;
+
+    pa_assert(c);
+
+    pa_dbusiface_card_free(c);
+}
+
+static void free_device_cb(void *p, void *userdata) {
+    pa_dbusiface_device *d = p;
+
+    pa_assert(d);
+
+    pa_dbusiface_device_free(d);
+}
+
+static void free_stream_cb(void *p, void *userdata) {
+    pa_dbusiface_stream *s = p;
+
+    pa_assert(s);
+
+    pa_dbusiface_stream_free(s);
+}
+
+static void free_sample_cb(void *p, void *userdata) {
+    pa_dbusiface_sample *s = p;
+
+    pa_assert(s);
+
+    pa_dbusiface_sample_free(s);
+}
+
+static void free_module_cb(void *p, void *userdata) {
+    pa_dbusiface_module *m = p;
+
+    pa_assert(m);
+
+    pa_dbusiface_module_free(m);
+}
+
+static void free_client_cb(void *p, void *userdata) {
+    pa_dbusiface_client *c = p;
+
+    pa_assert(c);
+
+    pa_dbusiface_client_free(c);
+}
+
+void pa_dbusiface_core_free(pa_dbusiface_core *c) {
+    pa_assert(c);
+
+    pa_dbus_protocol_remove_interface(c->dbus_protocol, OBJECT_PATH, INTERFACE_CORE);
+
+    pa_subscription_free(c->subscription);
+    pa_hashmap_free(c->cards, free_card_cb, NULL);
+    pa_hashmap_free(c->sinks_by_index, free_device_cb, NULL);
+    pa_hashmap_free(c->sinks_by_path, NULL, NULL);
+    pa_hashmap_free(c->sources_by_index, free_device_cb, NULL);
+    pa_hashmap_free(c->sources_by_path, NULL, NULL);
+    pa_hashmap_free(c->playback_streams, free_stream_cb, NULL);
+    pa_hashmap_free(c->record_streams, free_stream_cb, NULL);
+    pa_hashmap_free(c->samples, free_sample_cb, NULL);
+    pa_hashmap_free(c->modules, free_module_cb, NULL);
+    pa_hashmap_free(c->clients, free_client_cb, NULL);
+
+    pa_dbus_protocol_unref(c->dbus_protocol);
+
+    pa_xfree(c);
+}
diff --git a/src/modules/dbus/iface-core.h b/src/modules/dbus/iface-core.h
new file mode 100644
index 0000000..964a37b
--- /dev/null
+++ b/src/modules/dbus/iface-core.h
@@ -0,0 +1,38 @@
+#ifndef foodbusifacecorehfoo
+#define foodbusifacecorehfoo
+
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+/* This object implements the D-Bus interface org.PulseAudio.Core1.
+ *
+ * See http://pulseaudio.org/wiki/DBusInterface for the Core interface
+ * documentation.
+ */
+
+#include <pulsecore/core.h>
+
+typedef struct pa_dbusiface_core pa_dbusiface_core;
+
+pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core);
+void pa_dbusiface_core_free(pa_dbusiface_core *c);
+
+#endif
diff --git a/src/modules/dbus/iface-device.c b/src/modules/dbus/iface-device.c
new file mode 100644
index 0000000..3b3795e
--- /dev/null
+++ b/src/modules/dbus/iface-device.c
@@ -0,0 +1,105 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <pulsecore/core-util.h>
+
+#include "iface-device.h"
+
+#define SINK_OBJECT_NAME "sink"
+#define SOURCE_OBJECT_NAME "source"
+
+enum device_type {
+    DEVICE_TYPE_SINK,
+    DEVICE_TYPE_SOURCE
+};
+
+struct pa_dbusiface_device {
+    union {
+        pa_sink *sink;
+        pa_source *source;
+    };
+    enum device_type type;
+    char *path;
+};
+
+pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_sink *sink, const char *path_prefix) {
+    pa_dbusiface_device *d;
+
+    pa_assert(sink);
+    pa_assert(path_prefix);
+
+    d = pa_xnew(pa_dbusiface_device, 1);
+    d->sink = pa_sink_ref(sink);
+    d->type = DEVICE_TYPE_SINK;
+    d->path = pa_sprintf_malloc("%s/%s%u", path_prefix, SINK_OBJECT_NAME, sink->index);
+
+    return d;
+}
+
+pa_dbusiface_device *pa_dbusiface_device_new_source(pa_source *source, const char *path_prefix) {
+    pa_dbusiface_device *d;
+
+    pa_assert(source);
+    pa_assert(path_prefix);
+
+    d = pa_xnew(pa_dbusiface_device, 1);
+    d->source = pa_source_ref(source);
+    d->type = DEVICE_TYPE_SOURCE;
+    d->path = pa_sprintf_malloc("%s/%s%u", path_prefix, SOURCE_OBJECT_NAME, source->index);
+
+    return d;
+}
+
+void pa_dbusiface_device_free(pa_dbusiface_device *d) {
+    pa_assert(d);
+
+    if (d->type == DEVICE_TYPE_SINK)
+        pa_sink_unref(d->sink);
+    else
+        pa_source_unref(d->source);
+
+    pa_xfree(d->path);
+    pa_xfree(d);
+}
+
+const char *pa_dbusiface_device_get_path(pa_dbusiface_device *d) {
+    pa_assert(d);
+
+    return d->path;
+}
+
+pa_sink *pa_dbusiface_device_get_sink(pa_dbusiface_device *d) {
+    pa_assert(d);
+    pa_assert(d->type == DEVICE_TYPE_SINK);
+
+    return d->sink;
+}
+
+pa_source *pa_dbusiface_device_get_source(pa_dbusiface_device *d) {
+    pa_assert(d);
+    pa_assert(d->type == DEVICE_TYPE_SOURCE);
+
+    return d->source;
+}
diff --git a/src/modules/dbus/iface-device.h b/src/modules/dbus/iface-device.h
new file mode 100644
index 0000000..81ad1d8
--- /dev/null
+++ b/src/modules/dbus/iface-device.h
@@ -0,0 +1,46 @@
+#ifndef foodbusifacedevicehfoo
+#define foodbusifacedevicehfoo
+
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+/* This object implements the D-Bus interfaces org.PulseAudio.Core1.Device,
+ * org.PulseAudio.Core1.Sink and org.PulseAudio.Core1.Source.
+ *
+ * See http://pulseaudio.org/wiki/DBusInterface for the interface
+ * documentation.
+ */
+
+#include <pulsecore/sink.h>
+#include <pulsecore/source.h>
+
+typedef struct pa_dbusiface_device pa_dbusiface_device;
+
+pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_sink *sink, const char *path_prefix);
+pa_dbusiface_device *pa_dbusiface_device_new_source(pa_source *source, const char *path_prefix);
+void pa_dbusiface_device_free(pa_dbusiface_device *d);
+
+const char *pa_dbusiface_device_get_path(pa_dbusiface_device *d);
+
+pa_sink *pa_dbusiface_device_get_sink(pa_dbusiface_device *d);
+pa_source *pa_dbusiface_device_get_source(pa_dbusiface_device *d);
+
+#endif
diff --git a/src/modules/dbus/iface-module.c b/src/modules/dbus/iface-module.c
new file mode 100644
index 0000000..1c95f9e
--- /dev/null
+++ b/src/modules/dbus/iface-module.c
@@ -0,0 +1,61 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <pulsecore/core-util.h>
+
+#include "iface-module.h"
+
+#define OBJECT_NAME "module"
+
+struct pa_dbusiface_module {
+    pa_module *module;
+    char *path;
+};
+
+pa_dbusiface_module *pa_dbusiface_module_new(pa_module *module, const char *path_prefix) {
+    pa_dbusiface_module *m;
+
+    pa_assert(module);
+    pa_assert(path_prefix);
+
+    m = pa_xnew(pa_dbusiface_module, 1);
+    m->module = module;
+    m->path = pa_sprintf_malloc("%s/%s%u", path_prefix, OBJECT_NAME, module->index);
+
+    return m;
+}
+
+void pa_dbusiface_module_free(pa_dbusiface_module *m) {
+    pa_assert(m);
+
+    pa_xfree(m->path);
+    pa_xfree(m);
+}
+
+const char *pa_dbusiface_module_get_path(pa_dbusiface_module *m) {
+    pa_assert(m);
+
+    return m->path;
+}
diff --git a/src/modules/dbus/iface-module.h b/src/modules/dbus/iface-module.h
new file mode 100644
index 0000000..7f683e6
--- /dev/null
+++ b/src/modules/dbus/iface-module.h
@@ -0,0 +1,40 @@
+#ifndef foodbusifacemodulehfoo
+#define foodbusifacemodulehfoo
+
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+/* This object implements the D-Bus interface org.PulseAudio.Core1.Module.
+ *
+ * See http://pulseaudio.org/wiki/DBusInterface for the Module interface
+ * documentation.
+ */
+
+#include <pulsecore/module.h>
+
+typedef struct pa_dbusiface_module pa_dbusiface_module;
+
+pa_dbusiface_module *pa_dbusiface_module_new(pa_module *module, const char *path_prefix);
+void pa_dbusiface_module_free(pa_dbusiface_module *m);
+
+const char *pa_dbusiface_module_get_path(pa_dbusiface_module *m);
+
+#endif
diff --git a/src/modules/dbus/iface-sample.c b/src/modules/dbus/iface-sample.c
new file mode 100644
index 0000000..b4a308a
--- /dev/null
+++ b/src/modules/dbus/iface-sample.c
@@ -0,0 +1,61 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <pulsecore/core-util.h>
+
+#include "iface-sample.h"
+
+#define OBJECT_NAME "sample"
+
+struct pa_dbusiface_sample {
+    pa_scache_entry *sample;
+    char *path;
+};
+
+pa_dbusiface_sample *pa_dbusiface_sample_new(pa_scache_entry *sample, const char *path_prefix) {
+    pa_dbusiface_sample *s;
+
+    pa_assert(sample);
+    pa_assert(path_prefix);
+
+    s = pa_xnew(pa_dbusiface_sample, 1);
+    s->sample = sample;
+    s->path = pa_sprintf_malloc("%s/%s%u", path_prefix, OBJECT_NAME, sample->index);
+
+    return s;
+}
+
+void pa_dbusiface_sample_free(pa_dbusiface_sample *s) {
+    pa_assert(s);
+
+    pa_xfree(s->path);
+    pa_xfree(s);
+}
+
+const char *pa_dbusiface_sample_get_path(pa_dbusiface_sample *s) {
+    pa_assert(s);
+
+    return s->path;
+}
diff --git a/src/modules/dbus/iface-sample.h b/src/modules/dbus/iface-sample.h
new file mode 100644
index 0000000..1b85404
--- /dev/null
+++ b/src/modules/dbus/iface-sample.h
@@ -0,0 +1,40 @@
+#ifndef foodbusifacesamplehfoo
+#define foodbusifacesamplehfoo
+
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+/* This object implements the D-Bus interface org.PulseAudio.Core1.Sample.
+ *
+ * See http://pulseaudio.org/wiki/DBusInterface for the Sample interface
+ * documentation.
+ */
+
+#include <pulsecore/core-scache.h>
+
+typedef struct pa_dbusiface_sample pa_dbusiface_sample;
+
+pa_dbusiface_sample *pa_dbusiface_sample_new(pa_scache_entry *sample, const char *path_prefix);
+void pa_dbusiface_sample_free(pa_dbusiface_sample *c);
+
+const char *pa_dbusiface_sample_get_path(pa_dbusiface_sample *c);
+
+#endif
diff --git a/src/modules/dbus/iface-stream.c b/src/modules/dbus/iface-stream.c
new file mode 100644
index 0000000..1d9ffee
--- /dev/null
+++ b/src/modules/dbus/iface-stream.c
@@ -0,0 +1,91 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <pulsecore/core-util.h>
+
+#include "iface-stream.h"
+
+#define PLAYBACK_OBJECT_NAME "playback_stream"
+#define RECORD_OBJECT_NAME "record_stream"
+
+enum stream_type {
+    STREAM_TYPE_PLAYBACK,
+    STREAM_TYPE_RECORD
+};
+
+struct pa_dbusiface_stream {
+    union {
+        pa_sink_input *sink_input;
+        pa_source_output *source_output;
+    };
+    enum stream_type type;
+    char *path;
+};
+
+pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_sink_input *sink_input, const char *path_prefix) {
+    pa_dbusiface_stream *s;
+
+    pa_assert(sink_input);
+    pa_assert(path_prefix);
+
+    s = pa_xnew(pa_dbusiface_stream, 1);
+    s->sink_input = pa_sink_input_ref(sink_input);
+    s->type = STREAM_TYPE_PLAYBACK;
+    s->path = pa_sprintf_malloc("%s/%s%u", path_prefix, PLAYBACK_OBJECT_NAME, sink_input->index);
+
+    return s;
+}
+
+pa_dbusiface_stream *pa_dbusiface_stream_new_record(pa_source_output *source_output, const char *path_prefix) {
+    pa_dbusiface_stream *s;
+
+    pa_assert(source_output);
+    pa_assert(path_prefix);
+
+    s = pa_xnew(pa_dbusiface_stream, 1);
+    s->source_output = pa_source_output_ref(source_output);
+    s->type = STREAM_TYPE_RECORD;
+    s->path = pa_sprintf_malloc("%s/%s%u", path_prefix, RECORD_OBJECT_NAME, source_output->index);
+
+    return s;
+}
+
+void pa_dbusiface_stream_free(pa_dbusiface_stream *s) {
+    pa_assert(s);
+
+    if (s->type == STREAM_TYPE_PLAYBACK)
+        pa_sink_input_unref(s->sink_input);
+    else
+        pa_source_output_unref(s->source_output);
+
+    pa_xfree(s->path);
+    pa_xfree(s);
+}
+
+const char *pa_dbusiface_stream_get_path(pa_dbusiface_stream *s) {
+    pa_assert(s);
+
+    return s->path;
+}
diff --git a/src/modules/dbus/iface-stream.h b/src/modules/dbus/iface-stream.h
new file mode 100644
index 0000000..cc2f3d6
--- /dev/null
+++ b/src/modules/dbus/iface-stream.h
@@ -0,0 +1,42 @@
+#ifndef foodbusifacestreamhfoo
+#define foodbusifacestreamhfoo
+
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+/* This object implements the D-Bus interface org.PulseAudio.Core1.Stream.
+ *
+ * See http://pulseaudio.org/wiki/DBusInterface for the Stream interface
+ * documentation.
+ */
+
+#include <pulsecore/sink-input.h>
+#include <pulsecore/source-output.h>
+
+typedef struct pa_dbusiface_stream pa_dbusiface_stream;
+
+pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_sink_input *sink_input, const char *path_prefix);
+pa_dbusiface_stream *pa_dbusiface_stream_new_record(pa_source_output *source_output, const char *path_prefix);
+void pa_dbusiface_stream_free(pa_dbusiface_stream *s);
+
+const char *pa_dbusiface_stream_get_path(pa_dbusiface_stream *s);
+
+#endif
diff --git a/src/modules/dbus/module-dbus-protocol.c b/src/modules/dbus/module-dbus-protocol.c
new file mode 100644
index 0000000..807d32d
--- /dev/null
+++ b/src/modules/dbus/module-dbus-protocol.c
@@ -0,0 +1,580 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+  Copyright 2006 Lennart Poettering
+  Copyright 2006 Shams E. King
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <dbus/dbus.h>
+
+#include <pulse/mainloop-api.h>
+#include <pulse/timeval.h>
+#include <pulse/xmalloc.h>
+
+#include <pulsecore/client.h>
+#include <pulsecore/core-util.h>
+#include <pulsecore/dbus-util.h>
+#include <pulsecore/idxset.h>
+#include <pulsecore/macro.h>
+#include <pulsecore/modargs.h>
+#include <pulsecore/module.h>
+#include <pulsecore/protocol-dbus.h>
+
+#include "iface-core.h"
+
+#include "module-dbus-protocol-symdef.h"
+
+PA_MODULE_DESCRIPTION("D-Bus interface");
+PA_MODULE_USAGE(
+        "access=local|remote|local,remote "
+        "tcp_port=<port number>");
+PA_MODULE_LOAD_ONCE(TRUE);
+PA_MODULE_AUTHOR("Tanu Kaskinen");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+
+#define CLEANUP_INTERVAL 10 /* seconds */
+
+enum server_type {
+    SERVER_TYPE_LOCAL,
+    SERVER_TYPE_TCP
+};
+
+struct server;
+struct connection;
+
+struct userdata {
+    pa_module *module;
+    pa_bool_t local_access;
+    pa_bool_t remote_access;
+    uint32_t tcp_port;
+
+    struct server *local_server;
+    struct server *tcp_server;
+
+    pa_idxset *connections;
+
+    pa_time_event *cleanup_event;
+
+    pa_dbus_protocol *dbus_protocol;
+    pa_dbusiface_core *core_iface;
+};
+
+struct server {
+    struct userdata *userdata;
+    enum server_type type;
+    DBusServer *dbus_server;
+};
+
+struct connection {
+    struct server *server;
+    pa_dbus_wrap_connection *wrap_conn;
+    pa_client *client;
+};
+
+static const char* const valid_modargs[] = {
+    "access",
+    "tcp_port",
+    NULL
+};
+
+static void connection_free(struct connection *c) {
+    pa_assert(c);
+
+    pa_assert_se(pa_dbus_protocol_unregister_connection(c->server->userdata->dbus_protocol, pa_dbus_wrap_connection_get(c->wrap_conn)) >= 0);
+
+    pa_client_free(c->client);
+    pa_assert_se(pa_idxset_remove_by_data(c->server->userdata->connections, c, NULL));
+    pa_dbus_wrap_connection_free(c->wrap_conn);
+    pa_xfree(c);
+}
+
+/* Called from pa_client_kill(). */
+static void client_kill_cb(pa_client *c) {
+    struct connection *conn;
+
+    pa_assert(c);
+    pa_assert(c->userdata);
+
+    conn = c->userdata;
+    connection_free(conn);
+
+    pa_log_info("Connection killed.");
+}
+
+static dbus_bool_t user_check_cb(DBusConnection *connection, unsigned long uid, void *data) {
+    pa_log_debug("Allowing connection by user %lu.", uid);
+
+    return TRUE;
+}
+
+/* Called by D-Bus when a new client connection is received. */
+static void connection_new_cb(DBusServer *dbus_server, DBusConnection *new_connection, void *data) {
+    struct server *s = data;
+    struct connection *c;
+    pa_client_new_data new_data;
+    pa_client *client;
+
+    pa_assert(new_connection);
+    pa_assert(s);
+
+    pa_client_new_data_init(&new_data);
+    new_data.module = s->userdata->module;
+    new_data.driver = __FILE__;
+    pa_proplist_sets(new_data.proplist, PA_PROP_APPLICATION_NAME, "D-Bus client"); /* TODO: It's probably possible to generate a fancier name. Other props? */
+    client = pa_client_new(s->userdata->module->core, &new_data);
+    pa_client_new_data_done(&new_data);
+
+    if (!client) {
+        dbus_connection_close(new_connection);
+        return;
+    }
+
+    if (s->type == SERVER_TYPE_TCP || s->userdata->module->core->server_type == PA_SERVER_TYPE_SYSTEM) {
+        /* FIXME: Here we allow anyone from anywhere to access the server,
+         * anonymously. Access control should be configurable. */
+        dbus_connection_set_unix_user_function(new_connection, user_check_cb, NULL, NULL);
+        dbus_connection_set_allow_anonymous(new_connection, TRUE);
+    }
+
+    c = pa_xnew(struct connection, 1);
+    c->server = s;
+    c->wrap_conn = pa_dbus_wrap_connection_new_from_existing(s->userdata->module->core->mainloop, TRUE, new_connection);
+    c->client = client;
+
+    c->client->kill = client_kill_cb;
+    c->client->send_event = NULL; /* TODO: Implement this. */
+    c->client->userdata = c;
+
+    pa_idxset_put(s->userdata->connections, c, NULL);
+
+    pa_assert_se(pa_dbus_protocol_register_connection(s->userdata->dbus_protocol, new_connection, c->client) >= 0);
+}
+
+/* Called by PA mainloop when a D-Bus fd watch event needs handling. */
+static void io_event_cb(pa_mainloop_api *mainloop, pa_io_event *e, int fd, pa_io_event_flags_t events, void *userdata) {
+    unsigned int flags = 0;
+    DBusWatch *watch = userdata;
+
+#if HAVE_DBUS_WATCH_GET_UNIX_FD
+    pa_assert(fd == dbus_watch_get_unix_fd(watch));
+#else
+    pa_assert(fd == dbus_watch_get_fd(watch));
+#endif
+
+    if (!dbus_watch_get_enabled(watch)) {
+        pa_log_warn("Asked to handle disabled watch: %p %i", (void*) watch, fd);
+        return;
+    }
+
+    if (events & PA_IO_EVENT_INPUT)
+        flags |= DBUS_WATCH_READABLE;
+    if (events & PA_IO_EVENT_OUTPUT)
+        flags |= DBUS_WATCH_WRITABLE;
+    if (events & PA_IO_EVENT_HANGUP)
+        flags |= DBUS_WATCH_HANGUP;
+    if (events & PA_IO_EVENT_ERROR)
+        flags |= DBUS_WATCH_ERROR;
+
+    dbus_watch_handle(watch, flags);
+}
+
+/* Called by PA mainloop when a D-Bus timer event needs handling. */
+static void time_event_cb(pa_mainloop_api *mainloop, pa_time_event* e, const struct timeval *tv, void *userdata) {
+    DBusTimeout *timeout = userdata;
+
+    if (dbus_timeout_get_enabled(timeout)) {
+        struct timeval next = *tv;
+        dbus_timeout_handle(timeout);
+
+        /* restart it for the next scheduled time */
+        pa_timeval_add(&next, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000);
+        mainloop->time_restart(e, &next);
+    }
+}
+
+/* Translates D-Bus fd watch event flags to PA IO event flags. */
+static pa_io_event_flags_t get_watch_flags(DBusWatch *watch) {
+    unsigned int flags;
+    pa_io_event_flags_t events = 0;
+
+    pa_assert(watch);
+
+    flags = dbus_watch_get_flags(watch);
+
+    /* no watch flags for disabled watches */
+    if (!dbus_watch_get_enabled(watch))
+        return PA_IO_EVENT_NULL;
+
+    if (flags & DBUS_WATCH_READABLE)
+        events |= PA_IO_EVENT_INPUT;
+    if (flags & DBUS_WATCH_WRITABLE)
+        events |= PA_IO_EVENT_OUTPUT;
+
+    return events | PA_IO_EVENT_HANGUP | PA_IO_EVENT_ERROR;
+}
+
+/* Called by D-Bus when a D-Bus fd watch event is added. */
+static dbus_bool_t watch_add_cb(DBusWatch *watch, void *data) {
+    struct server *s = data;
+    pa_mainloop_api *mainloop;
+    pa_io_event *ev;
+
+    pa_assert(watch);
+    pa_assert(s);
+
+    mainloop = s->userdata->module->core->mainloop;
+
+    ev = mainloop->io_new(
+            mainloop,
+#if HAVE_DBUS_WATCH_GET_UNIX_FD
+            dbus_watch_get_unix_fd(watch),
+#else
+            dbus_watch_get_fd(watch),
+#endif
+            get_watch_flags(watch), io_event_cb, watch);
+
+    dbus_watch_set_data(watch, ev, NULL);
+
+    return TRUE;
+}
+
+/* Called by D-Bus when a D-Bus fd watch event is removed. */
+static void watch_remove_cb(DBusWatch *watch, void *data) {
+    struct server *s = data;
+    pa_io_event *ev;
+
+    pa_assert(watch);
+    pa_assert(s);
+
+    if ((ev = dbus_watch_get_data(watch)))
+        s->userdata->module->core->mainloop->io_free(ev);
+}
+
+/* Called by D-Bus when a D-Bus fd watch event is toggled. */
+static void watch_toggled_cb(DBusWatch *watch, void *data) {
+    struct server *s = data;
+    pa_io_event *ev;
+
+    pa_assert(watch);
+    pa_assert(s);
+
+    pa_assert_se(ev = dbus_watch_get_data(watch));
+
+    /* get_watch_flags() checks if the watch is enabled */
+    s->userdata->module->core->mainloop->io_enable(ev, get_watch_flags(watch));
+}
+
+/* Called by D-Bus when a D-Bus timer event is added. */
+static dbus_bool_t timeout_add_cb(DBusTimeout *timeout, void *data) {
+    struct server *s = data;
+    pa_mainloop_api *mainloop;
+    pa_time_event *ev;
+    struct timeval tv;
+
+    pa_assert(timeout);
+    pa_assert(s);
+
+    if (!dbus_timeout_get_enabled(timeout))
+        return FALSE;
+
+    mainloop = s->userdata->module->core->mainloop;
+
+    pa_gettimeofday(&tv);
+    pa_timeval_add(&tv, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000);
+
+    ev = mainloop->time_new(mainloop, &tv, time_event_cb, timeout);
+
+    dbus_timeout_set_data(timeout, ev, NULL);
+
+    return TRUE;
+}
+
+/* Called by D-Bus when a D-Bus timer event is removed. */
+static void timeout_remove_cb(DBusTimeout *timeout, void *data) {
+    struct server *s = data;
+    pa_time_event *ev;
+
+    pa_assert(timeout);
+    pa_assert(s);
+
+    if ((ev = dbus_timeout_get_data(timeout)))
+        s->userdata->module->core->mainloop->time_free(ev);
+}
+
+/* Called by D-Bus when a D-Bus timer event is toggled. */
+static void timeout_toggled_cb(DBusTimeout *timeout, void *data) {
+    struct server *s = data;
+    pa_mainloop_api *mainloop;
+    pa_time_event *ev;
+
+    pa_assert(timeout);
+    pa_assert(s);
+
+    mainloop = s->userdata->module->core->mainloop;
+
+    pa_assert_se(ev = dbus_timeout_get_data(timeout));
+
+    if (dbus_timeout_get_enabled(timeout)) {
+        struct timeval tv;
+
+        pa_gettimeofday(&tv);
+        pa_timeval_add(&tv, (pa_usec_t) dbus_timeout_get_interval(timeout) * 1000);
+
+        mainloop->time_restart(ev, &tv);
+    } else
+        mainloop->time_restart(ev, NULL);
+}
+
+static void server_free(struct server *s) {
+    pa_assert(s);
+
+    if (s->dbus_server) {
+        dbus_server_disconnect(s->dbus_server);
+        dbus_server_unref(s->dbus_server);
+    }
+
+    pa_xfree(s);
+}
+
+static struct server *start_server(struct userdata *u, const char *address, enum server_type type) {
+    /* XXX: We assume that when we unref the DBusServer instance at module
+     * shutdown, nobody else holds any references to it. If we stop assuming
+     * that someday, dbus_server_set_new_connection_function,
+     * dbus_server_set_watch_functions and dbus_server_set_timeout_functions
+     * calls should probably register free callbacks, instead of providing NULL
+     * as they do now. */
+
+    struct server *s = NULL;
+    DBusError error;
+
+    pa_assert(u);
+    pa_assert(address);
+
+    dbus_error_init(&error);
+
+    s = pa_xnew0(struct server, 1);
+    s->userdata = u;
+    s->dbus_server = dbus_server_listen(address, &error);
+
+    if (dbus_error_is_set(&error)) {
+        pa_log("dbus_server_listen() failed: %s: %s", error.name, error.message);
+        goto fail;
+    }
+
+    dbus_server_set_new_connection_function(s->dbus_server, connection_new_cb, s, NULL);
+
+    if (!dbus_server_set_watch_functions(s->dbus_server, watch_add_cb, watch_remove_cb, watch_toggled_cb, s, NULL)) {
+        pa_log("dbus_server_set_watch_functions() ran out of memory.");
+        goto fail;
+    }
+
+    if (!dbus_server_set_timeout_functions(s->dbus_server, timeout_add_cb, timeout_remove_cb, timeout_toggled_cb, s, NULL)) {
+        pa_log("dbus_server_set_timeout_functions() ran out of memory.");
+        goto fail;
+    }
+
+    return s;
+
+fail:
+    if (s)
+        server_free(s);
+
+    dbus_error_free(&error);
+
+    return NULL;
+}
+
+static struct server *start_local_server(struct userdata *u) {
+    struct server *s = NULL;
+    char *address = NULL;
+
+    pa_assert(u);
+
+    address = pa_get_dbus_address_from_server_type(u->module->core->server_type);
+
+    s = start_server(u, address, SERVER_TYPE_LOCAL); /* May return NULL */
+
+    pa_xfree(address);
+
+    return s;
+}
+
+static struct server *start_tcp_server(struct userdata *u) {
+    struct server *s = NULL;
+    char *address = NULL;
+
+    pa_assert(u);
+
+    address = pa_sprintf_malloc("tcp:host=127.0.0.1,port=%u", u->tcp_port);
+
+    s = start_server(u, address, SERVER_TYPE_TCP); /* May return NULL */
+
+    pa_xfree(address);
+
+    return s;
+}
+
+static int get_access_arg(pa_modargs *ma, pa_bool_t *local_access, pa_bool_t *remote_access) {
+    const char *value = NULL;
+
+    pa_assert(ma);
+    pa_assert(local_access);
+    pa_assert(remote_access);
+
+    if (!(value = pa_modargs_get_value(ma, "access", NULL)))
+        return 0;
+
+    if (!strcmp(value, "local")) {
+        *local_access = TRUE;
+        *remote_access = FALSE;
+    } else if (!strcmp(value, "remote")) {
+        *local_access = FALSE;
+        *remote_access = TRUE;
+    } else if (!strcmp(value, "local,remote")) {
+        *local_access = TRUE;
+        *remote_access = TRUE;
+    } else
+        return -1;
+
+    return 0;
+}
+
+/* Frees dead client connections. Called every CLEANUP_INTERVAL seconds. */
+static void cleanup_cb(pa_mainloop_api *a, pa_time_event *e, const struct timeval *tv, void *userdata) {
+    struct userdata *u = userdata;
+    struct connection *conn = NULL;
+    uint32_t idx;
+    struct timeval cleanup_timeval;
+    unsigned free_count = 0;
+
+    for (conn = pa_idxset_first(u->connections, &idx); conn; conn = pa_idxset_next(u->connections, &idx)) {
+        if (!dbus_connection_get_is_connected(pa_dbus_wrap_connection_get(conn->wrap_conn))) {
+            connection_free(conn);
+            ++free_count;
+        }
+    }
+
+    if (free_count > 0)
+        pa_log_debug("Freed %u dead D-Bus client connections.", free_count);
+
+    pa_gettimeofday(&cleanup_timeval);
+    cleanup_timeval.tv_sec += CLEANUP_INTERVAL;
+    u->module->core->mainloop->time_restart(e, &cleanup_timeval);
+}
+
+int pa__init(pa_module *m) {
+    struct userdata *u = NULL;
+    pa_modargs *ma = NULL;
+    struct timeval cleanup_timeval;
+
+    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;
+    u->local_access = TRUE;
+    u->remote_access = FALSE;
+    u->tcp_port = PA_DBUS_DEFAULT_PORT;
+
+    if (get_access_arg(ma, &u->local_access, &u->remote_access) < 0) {
+        pa_log("Invalid access argument: '%s'", pa_modargs_get_value(ma, "access", NULL));
+        goto fail;
+    }
+
+    if (pa_modargs_get_value_u32(ma, "tcp_port", &u->tcp_port) < 0 || u->tcp_port < 1 || u->tcp_port > 49150) {
+        pa_log("Invalid tcp_port argument: '%s'", pa_modargs_get_value(ma, "tcp_port", NULL));
+        goto fail;
+    }
+
+    if (u->local_access && !(u->local_server = start_local_server(u))) {
+        pa_log("Starting the local D-Bus server failed.");
+        goto fail;
+    }
+
+    if (u->remote_access && !(u->tcp_server = start_tcp_server(u))) {
+        pa_log("Starting the D-Bus server for remote connections failed.");
+        goto fail;
+    }
+
+    u->connections = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+
+    pa_gettimeofday(&cleanup_timeval);
+    cleanup_timeval.tv_sec += CLEANUP_INTERVAL;
+    u->cleanup_event = m->core->mainloop->time_new(m->core->mainloop, &cleanup_timeval, cleanup_cb, u);
+
+    u->dbus_protocol = pa_dbus_protocol_get(m->core);
+    u->core_iface = pa_dbusiface_core_new(m->core);
+
+    return 0;
+
+fail:
+    if (ma)
+        pa_modargs_free(ma);
+
+    pa__done(m);
+
+    return -1;
+}
+
+/* Called by idxset when the connection set is freed. */
+static void connection_free_cb(void *p, void *userdata) {
+    struct connection *conn = p;
+
+    pa_assert(conn);
+
+    connection_free(conn);
+}
+
+void pa__done(pa_module *m) {
+    struct userdata *u;
+
+    pa_assert(m);
+
+    if (!(u = m->userdata))
+        return;
+
+    if (u->core_iface)
+        pa_dbusiface_core_free(u->core_iface);
+
+    if (u->cleanup_event)
+        m->core->mainloop->time_free(u->cleanup_event);
+
+    if (u->connections)
+        pa_idxset_free(u->connections, connection_free_cb, NULL);
+
+    if (u->tcp_server)
+        server_free(u->tcp_server);
+
+    if (u->local_server)
+        server_free(u->local_server);
+
+    if (u->dbus_protocol)
+        pa_dbus_protocol_unref(u->dbus_protocol);
+
+    pa_xfree(u);
+    m->userdata = NULL;
+}

commit 018810ec9a96d63446bdc9a82d6c931779f7a97d
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Jul 27 20:01:39 2009 +0300

    Bug fixing and minor cleanups.

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index 31f1260..d17499c 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -220,7 +220,7 @@ static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
         .receive_cb = handle_upload_sample },
     [METHOD_HANDLER_LOAD_MODULE] = {
         .method_name = "LoadModule",
-        .arguments = upload_sample_args,
+        .arguments = load_module_args,
         .n_arguments = sizeof(load_module_args) / sizeof(pa_dbus_arg_info),
         .receive_cb = handle_load_module },
     [METHOD_HANDLER_EXIT] = {
@@ -424,11 +424,8 @@ static void handle_get_default_channels(DBusConnection *conn, DBusMessage *msg,
 static void handle_set_default_channels(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_dbusiface_core *c = userdata;
     pa_channel_map new_channel_map;
-    DBusMessageIter msg_iter;
-    DBusMessageIter variant_iter;
-    DBusMessageIter array_iter;
     dbus_uint32_t *default_channels;
-    int n_channels;
+    unsigned n_channels;
     unsigned i;
 
     pa_assert(conn);
@@ -437,37 +434,16 @@ static void handle_set_default_channels(DBusConnection *conn, DBusMessage *msg,
 
     pa_channel_map_init(&new_channel_map);
 
-    pa_assert_se(dbus_message_iter_init(msg, &msg_iter));
-
-    /* Skip the interface and property name arguments. */
-    if (!dbus_message_iter_next(&msg_iter) || !dbus_message_iter_next(&msg_iter)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
+    if (pa_dbus_get_fixed_array_set_property_arg(conn, msg, DBUS_TYPE_UINT32, &default_channels, &n_channels) < 0)
         return;
-    }
-
-    if (dbus_message_iter_get_arg_type(&msg_iter) != DBUS_TYPE_VARIANT) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Message argument isn't a variant.");
-        return;
-    }
-
-    dbus_message_iter_recurse(&msg_iter, &variant_iter);
-
-    if (dbus_message_iter_get_arg_type(&variant_iter) != DBUS_TYPE_ARRAY) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Variant doesn't contain an array.");
-        return;
-    }
 
-    dbus_message_iter_recurse(&variant_iter, &array_iter);
-
-    if (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_UINT32) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Array type is not uint32.");
+    if (n_channels <= 0) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Empty channel array.");
         return;
     }
 
-    dbus_message_iter_get_fixed_array(&array_iter, &default_channels, &n_channels);
-
-    if (n_channels <= 0) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Empty channel array.");
+    if (n_channels > PA_CHANNELS_MAX) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too many channels: %u. The maximum number of channels is %u.", n_channels, PA_CHANNELS_MAX);
         return;
     }
 
@@ -475,7 +451,7 @@ static void handle_set_default_channels(DBusConnection *conn, DBusMessage *msg,
 
     for (i = 0; i < new_channel_map.channels; ++i) {
         if (default_channels[i] >= PA_CHANNEL_POSITION_MAX) {
-            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid channel position.");
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid channel position: %u.", default_channels[i]);
             return;
         }
 
@@ -547,7 +523,7 @@ static void handle_set_default_sample_rate(DBusConnection *conn, DBusMessage *ms
         return;
 
     if (default_sample_rate <= 0 || default_sample_rate > PA_RATE_MAX) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid sample format.");
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid sample rate.");
         return;
     }
 
@@ -1149,7 +1125,7 @@ static void handle_get_card_by_name(DBusConnection *conn, DBusMessage *msg, void
     dbus_error_init(&error);
 
     if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &card_name, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, error.message);
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
         dbus_error_free(&error);
         return;
     }
@@ -1181,7 +1157,7 @@ static void handle_get_sink_by_name(DBusConnection *conn, DBusMessage *msg, void
     dbus_error_init(&error);
 
     if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &sink_name, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, error.message);
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
         dbus_error_free(&error);
         return;
     }
@@ -1213,7 +1189,7 @@ static void handle_get_source_by_name(DBusConnection *conn, DBusMessage *msg, vo
     dbus_error_init(&error);
 
     if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &source_name, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, error.message);
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
         dbus_error_free(&error);
         return;
     }
@@ -1245,7 +1221,7 @@ static void handle_get_sample_by_name(DBusConnection *conn, DBusMessage *msg, vo
     dbus_error_init(&error);
 
     if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &sample_name, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, error.message);
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
         dbus_error_free(&error);
         return;
     }
@@ -1433,6 +1409,7 @@ static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *use
     pa_dbusiface_core *c = userdata;
     DBusMessageIter msg_iter;
     DBusMessageIter dict_iter;
+    DBusMessageIter dict_entry_iter;
     char *name;
     const char *key;
     const char *value;
@@ -1441,6 +1418,7 @@ static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *use
     pa_module *module;
     pa_dbusiface_module *dbus_module;
     const char *object_path;
+    int arg_type;
 
     pa_assert(conn);
     pa_assert(msg);
@@ -1459,13 +1437,18 @@ static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *use
     if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_STRING, &name) < 0)
         return;
 
-    if (dbus_message_iter_get_arg_type(&msg_iter) != DBUS_TYPE_ARRAY) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type or too few arguments. An array was expected.");
+    arg_type = dbus_message_iter_get_arg_type(&msg_iter);
+    if (arg_type != DBUS_TYPE_ARRAY) {
+        if (arg_type == DBUS_TYPE_INVALID)
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments. A dictionary from strings to strings was expected.");
+        else
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type: '%c'. An dictionary from strings to strings was expected.", (char) arg_type);
         return;
     }
 
-    if (dbus_message_iter_get_element_type(&msg_iter) != DBUS_TYPE_DICT_ENTRY) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong array element type. A dict entry was expected.");
+    arg_type = dbus_message_iter_get_element_type(&msg_iter);
+    if (arg_type != DBUS_TYPE_DICT_ENTRY) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong array element type: '%c'. A dict entry (string to string) was expected.", (char) arg_type);
         return;
     }
 
@@ -1473,28 +1456,38 @@ static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *use
 
     dbus_message_iter_recurse(&msg_iter, &dict_iter);
 
-    while (dbus_message_iter_has_next(&dict_iter)) {
+    while (dbus_message_iter_get_arg_type(&dict_iter) != DBUS_TYPE_INVALID) {
         if (!pa_strbuf_isempty(arg_buffer))
             pa_strbuf_putc(arg_buffer, ' ');
 
-        if (dbus_message_iter_get_arg_type(&dict_iter) != DBUS_TYPE_STRING) {
-            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict key type. A string was expected.");
+        dbus_message_iter_recurse(&dict_iter, &dict_entry_iter);
+
+        arg_type = dbus_message_iter_get_arg_type(&dict_entry_iter);
+        if (arg_type != DBUS_TYPE_STRING) {
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict key type: '%c'. A string was expected.", (char) arg_type);
             goto finish;
         }
 
-        dbus_message_iter_get_basic(&dict_iter, &key);
+        dbus_message_iter_get_basic(&dict_entry_iter, &key);
+        dbus_message_iter_next(&dict_entry_iter);
 
         if (strlen(key) <= 0 || !pa_ascii_valid(key) || contains_space(key)) {
-            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid module argument name.");
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid module argument name: %s", key);
             goto finish;
         }
 
-        if (dbus_message_iter_get_arg_type(&dict_iter) != DBUS_TYPE_STRING) {
-            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict value type. A string was expected.");
+        arg_type = dbus_message_iter_get_arg_type(&dict_entry_iter);
+        if (arg_type != DBUS_TYPE_STRING) {
+            if (arg_type == DBUS_TYPE_INVALID)
+                pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Dict value missing.");
+            else
+                pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict value type: '%c'. A string was expected.", (char) arg_type);
             goto finish;
         }
 
-        dbus_message_iter_get_basic(&dict_iter, &value);
+        dbus_message_iter_get_basic(&dict_entry_iter, &value);
+
+        dbus_message_iter_next(&dict_iter);
 
         escaped_value = pa_escape(value, "\"");
         pa_strbuf_printf(arg_buffer, "%s=\"%s\"", key, escaped_value);
@@ -1549,7 +1542,7 @@ static void handle_listen_for_signal(DBusConnection *conn, DBusMessage *msg, voi
     dbus_error_init(&error);
 
     if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &signal, DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &objects, &n_objects, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, error.message);
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
         dbus_error_free(&error);
         goto finish;
     }
@@ -1574,7 +1567,7 @@ static void handle_stop_listening_for_signal(DBusConnection *conn, DBusMessage *
     dbus_error_init(&error);
 
     if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &signal, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, error.message);
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
         dbus_error_free(&error);
         return;
     }
diff --git a/src/pulsecore/dbus-util.c b/src/pulsecore/dbus-util.c
index cfc3e8c..43dbd6b 100644
--- a/src/pulsecore/dbus-util.c
+++ b/src/pulsecore/dbus-util.c
@@ -446,18 +446,25 @@ void pa_dbus_free_pending_list(pa_dbus_pending **p) {
     }
 }
 
-void pa_dbus_send_error(DBusConnection *c, DBusMessage *in_reply_to, const char *name, const char *message) {
+void pa_dbus_send_error(DBusConnection *c, DBusMessage *in_reply_to, const char *name, const char *format, ...) {
+    va_list ap;
+    char *message;
     DBusMessage *reply = NULL;
 
     pa_assert(c);
     pa_assert(in_reply_to);
     pa_assert(name);
-    pa_assert(message);
+    pa_assert(format);
 
+    va_start(ap, format);
+    message = pa_vsprintf_malloc(format, ap);
+    va_end(ap);
     pa_assert_se((reply = dbus_message_new_error(in_reply_to, name, message)));
     pa_assert_se(dbus_connection_send(c, reply, NULL));
 
     dbus_message_unref(reply);
+
+    pa_xfree(message);
 }
 
 void pa_dbus_send_empty_reply(DBusConnection *c, DBusMessage *in_reply_to) {
@@ -655,36 +662,71 @@ int pa_dbus_get_basic_set_property_arg(DBusConnection *c, DBusMessage *msg, int
 
     dbus_message_iter_recurse(&msg_iter, &variant_iter);
 
-    if (dbus_message_iter_get_arg_type(&variant_iter) != type) {
-        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Variant has wrong contained type.");
+    if (pa_dbus_get_basic_arg(c, msg, &variant_iter, type, data) < 0)
+        return -1;
+
+    return 0;
+}
+
+int pa_dbus_get_fixed_array_set_property_arg(DBusConnection *c, DBusMessage *msg, int item_type, void *data, unsigned *n) {
+    DBusMessageIter msg_iter;
+    DBusMessageIter variant_iter;
+
+    pa_assert(c);
+    pa_assert(msg);
+    pa_assert(dbus_type_is_fixed(item_type));
+    pa_assert(data);
+    pa_assert(n);
+
+    /* Skip the interface and property name arguments. */
+    if (!dbus_message_iter_init(msg, &msg_iter) || !dbus_message_iter_next(&msg_iter) || !dbus_message_iter_next(&msg_iter)) {
+        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
         return -1;
     }
 
-    dbus_message_iter_get_basic(&variant_iter, data);
+    if (dbus_message_iter_get_arg_type(&msg_iter) != DBUS_TYPE_VARIANT) {
+        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Message argument isn't a variant.");
+        return -1;
+    }
+
+    dbus_message_iter_recurse(&msg_iter, &variant_iter);
+
+    if (pa_dbus_get_fixed_array_arg(c, msg, &variant_iter, item_type, data, n) < 0)
+        return -1;
 
     return 0;
 }
 
 int pa_dbus_get_basic_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter, int type, void *data) {
+    int arg_type;
+
     pa_assert(c);
     pa_assert(msg);
     pa_assert(iter);
     pa_assert(dbus_type_is_basic(type));
     pa_assert(data);
 
-    if (dbus_message_iter_get_arg_type(iter) != type) {
-        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type or too few arguments.");
+    arg_type = dbus_message_iter_get_arg_type(iter);
+    if (arg_type != type) {
+        if (arg_type == DBUS_TYPE_INVALID)
+            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments. D-Bus type '%c' expected.", (char) type);
+        else
+            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type: '%c'. Expected type '%c'.", (char) arg_type, (char) type);
         return -1;
     }
 
     dbus_message_iter_get_basic(iter, data);
 
+    dbus_message_iter_next(iter);
+
     return 0;
 }
 
 int pa_dbus_get_fixed_array_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter, int item_type, void *array, unsigned *n) {
     DBusMessageIter array_iter;
     int signed_n;
+    int arg_type;
+    int element_type;
 
     pa_assert(c);
     pa_assert(msg);
@@ -693,13 +735,18 @@ int pa_dbus_get_fixed_array_arg(DBusConnection *c, DBusMessage *msg, DBusMessage
     pa_assert(array);
     pa_assert(n);
 
-    if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY) {
-        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type or too few arguments. An array was expected.");
+    arg_type = dbus_message_iter_get_arg_type(iter);
+    if (arg_type != DBUS_TYPE_ARRAY) {
+        if (arg_type == DBUS_TYPE_INVALID)
+            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments. An array of type '%c' was expected.", (char) item_type);
+        else
+            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type: '%c'. An array of type '%c' was expected.", (char) arg_type, (char) item_type);
         return -1;
     }
 
-    if (dbus_message_iter_get_element_type(iter) != item_type) {
-        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong array element type.");
+    element_type = dbus_message_iter_get_element_type(iter);
+    if (element_type != item_type) {
+        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong array element type: '%c'. Element type '%c' was expected.", (char) element_type, (char) item_type);
         return -1;
     }
 
@@ -707,6 +754,8 @@ int pa_dbus_get_fixed_array_arg(DBusConnection *c, DBusMessage *msg, DBusMessage
 
     dbus_message_iter_get_fixed_array(&array_iter, array, &signed_n);
 
+    dbus_message_iter_next(iter);
+
     pa_assert(signed_n >= 0);
 
     *n = signed_n;
@@ -769,6 +818,8 @@ pa_proplist *pa_dbus_get_proplist_arg(DBusConnection *c, DBusMessage *msg, DBusM
         pa_assert_se(pa_proplist_set(proplist, key, value, value_length) >= 0);
     }
 
+    dbus_message_iter_next(iter);
+
     return proplist;
 
 fail:
diff --git a/src/pulsecore/dbus-util.h b/src/pulsecore/dbus-util.h
index 1a8aeac..97aae37 100644
--- a/src/pulsecore/dbus-util.h
+++ b/src/pulsecore/dbus-util.h
@@ -63,7 +63,7 @@ void pa_dbus_sync_pending_list(pa_dbus_pending **p);
 void pa_dbus_free_pending_list(pa_dbus_pending **p);
 
 /* Sends an error message as the reply to the given message. */
-void pa_dbus_send_error(DBusConnection *c, DBusMessage *in_reply_to, const char *name, const char *message);
+void pa_dbus_send_error(DBusConnection *c, DBusMessage *in_reply_to, const char *name, const char *format, ...) PA_GCC_PRINTF_ATTR(4, 5);
 
 void pa_dbus_send_empty_reply(DBusConnection *c, DBusMessage *in_reply_to);
 void pa_dbus_send_basic_value_reply(DBusConnection *c, DBusMessage *in_reply_to, int type, void *data);
@@ -76,10 +76,11 @@ void pa_dbus_append_basic_variant(DBusMessageIter *iter, int type, void *data);
 void pa_dbus_append_basic_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, int type, void *data);
 void pa_dbus_append_basic_array_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, int item_type, const void *array, unsigned n);
 
-/* Helper function for extracting the value argument of a Set call for a
- * property with a basic type. If the message is invalid, an error reply is
- * sent and a negative number is returned. */
+/* Helper functions for extracting the value argument of a Set call. If the
+ * message is invalid, an error reply is sent and a negative number is
+ * returned. */
 int pa_dbus_get_basic_set_property_arg(DBusConnection *c, DBusMessage *msg, int type, void *data);
+int pa_dbus_get_fixed_array_set_property_arg(DBusConnection *c, DBusMessage *msg, int item_type, void *data, unsigned *n);
 
 /* If the arguments can't be read from the iterator, an error reply is sent and
  * a negative number is returned. */

commit b061957e57f74d7aa51bde9d24dd5e5c75af9497
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Thu Jul 30 13:11:32 2009 +0300

    dbus/iface-core.c: Make sure D-Bus objects are created only once.

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index d17499c..cdfd2a3 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -1632,8 +1632,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
         case PA_SUBSCRIPTION_EVENT_CARD:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
-                card = pa_dbusiface_card_new(pa_idxset_get_by_index(core->cards, idx), OBJECT_PATH);
-                pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), card);
+                if (!(card = pa_hashmap_get(c->cards, PA_UINT32_TO_PTR(idx)))) {
+                    card = pa_dbusiface_card_new(pa_idxset_get_by_index(core->cards, idx), OBJECT_PATH);
+                    pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), card);
+                }
 
                 object_path = pa_dbusiface_card_get_path(card);
 
@@ -1654,11 +1656,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
         case PA_SUBSCRIPTION_EVENT_SINK:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
-                device = pa_dbusiface_device_new_sink(pa_idxset_get_by_index(core->sinks, idx), OBJECT_PATH);
-                object_path = pa_dbusiface_device_get_path(device);
+                if (!(device = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(idx)))) {
+                    device = pa_dbusiface_device_new_sink(pa_idxset_get_by_index(core->sinks, idx), OBJECT_PATH);
+                    pa_hashmap_put(c->sinks_by_index, PA_UINT32_TO_PTR(idx), device);
+                    pa_hashmap_put(c->sinks_by_path, pa_dbusiface_device_get_path(device), device);
+                }
 
-                pa_hashmap_put(c->sinks_by_index, PA_UINT32_TO_PTR(idx), device);
-                pa_hashmap_put(c->sinks_by_path, object_path, device);
+                object_path = pa_dbusiface_device_get_path(device);
 
                 pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_SINK].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
@@ -1677,11 +1681,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
         case PA_SUBSCRIPTION_EVENT_SOURCE:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
-                device = pa_dbusiface_device_new_source(pa_idxset_get_by_index(core->sources, idx), OBJECT_PATH);
-                object_path = pa_dbusiface_device_get_path(device);
+                if (!(device = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(idx)))) {
+                    device = pa_dbusiface_device_new_source(pa_idxset_get_by_index(core->sources, idx), OBJECT_PATH);
+                    pa_hashmap_put(c->sources_by_index, PA_UINT32_TO_PTR(idx), device);
+                    pa_hashmap_put(c->sources_by_path, pa_dbusiface_device_get_path(device), device);
+                }
 
-                pa_hashmap_put(c->sources_by_index, PA_UINT32_TO_PTR(idx), device);
-                pa_hashmap_put(c->sources_by_path, object_path, device);
+                object_path = pa_dbusiface_device_get_path(device);
 
                 pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_SOURCE].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
@@ -1700,8 +1706,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
         case PA_SUBSCRIPTION_EVENT_SINK_INPUT:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
-                stream = pa_dbusiface_stream_new_playback(pa_idxset_get_by_index(core->sink_inputs, idx), OBJECT_PATH);
-                pa_hashmap_put(c->playback_streams, PA_UINT32_TO_PTR(idx), stream);
+                if (!(stream = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(idx)))) {
+                    stream = pa_dbusiface_stream_new_playback(pa_idxset_get_by_index(core->sink_inputs, idx), OBJECT_PATH);
+                    pa_hashmap_put(c->playback_streams, PA_UINT32_TO_PTR(idx), stream);
+                }
 
                 object_path = pa_dbusiface_stream_get_path(stream);
 
@@ -1722,8 +1730,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
         case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
-                stream = pa_dbusiface_stream_new_record(pa_idxset_get_by_index(core->source_outputs, idx), OBJECT_PATH);
-                pa_hashmap_put(c->record_streams, PA_UINT32_TO_PTR(idx), stream);
+                if (!(stream = pa_hashmap_get(c->record_streams, PA_UINT32_TO_PTR(idx)))) {
+                    stream = pa_dbusiface_stream_new_record(pa_idxset_get_by_index(core->source_outputs, idx), OBJECT_PATH);
+                    pa_hashmap_put(c->record_streams, PA_UINT32_TO_PTR(idx), stream);
+                }
 
                 object_path = pa_dbusiface_stream_get_path(stream);
 
@@ -1744,8 +1754,6 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
         case PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
-                /* We may have created the pa_dbusiface_sample object already
-                 * in handle_upload_sample. */
                 if (!(sample = pa_hashmap_get(c->samples, PA_UINT32_TO_PTR(idx)))) {
                     sample = pa_dbusiface_sample_new(pa_idxset_get_by_index(core->scache, idx), OBJECT_PATH);
                     pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), sample);
@@ -1770,8 +1778,6 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
         case PA_SUBSCRIPTION_EVENT_MODULE:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
-                /* We may have created the pa_dbusiface_module object already
-                 * in handle_load_module. */
                 if (!(module = pa_hashmap_get(c->modules, PA_UINT32_TO_PTR(idx)))) {
                     module = pa_dbusiface_module_new(pa_idxset_get_by_index(core->modules, idx), OBJECT_PATH);
                     pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(idx), module);
@@ -1796,8 +1802,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
         case PA_SUBSCRIPTION_EVENT_CLIENT:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
-                client = pa_dbusiface_client_new(pa_idxset_get_by_index(core->clients, idx), OBJECT_PATH);
-                pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(idx), client);
+                if (!(client = pa_hashmap_get(c->clients, PA_UINT32_TO_PTR(idx)))) {
+                    client = pa_dbusiface_client_new(pa_idxset_get_by_index(core->clients, idx), OBJECT_PATH);
+                    pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(idx), client);
+                }
 
                 object_path = pa_dbusiface_client_get_path(client);
 

commit c354a08fe3cf2468688264124b763efb1bf1df85
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Fri Jul 31 12:05:49 2009 +0300

    dbus-protocol: Implement extension registration.

diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index fb7d168..81a6c02 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -41,7 +41,9 @@ struct pa_dbus_protocol {
     pa_core *core;
     pa_hashmap *objects; /* Object path -> struct object_entry */
     pa_hashmap *connections; /* DBusConnection -> struct connection_entry */
-    pa_hashmap *extensions; /* String -> anything */
+    pa_idxset *extensions; /* Strings */
+
+    pa_hook hooks[PA_DBUS_PROTOCOL_HOOK_MAX];
 };
 
 struct object_entry {
@@ -109,6 +111,7 @@ char *pa_get_dbus_address_from_server_type(pa_server_type_t server_type) {
 
 static pa_dbus_protocol *dbus_protocol_new(pa_core *c) {
     pa_dbus_protocol *p;
+    unsigned i;
 
     pa_assert(c);
 
@@ -117,7 +120,10 @@ static pa_dbus_protocol *dbus_protocol_new(pa_core *c) {
     p->core = c;
     p->objects = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
     p->connections = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
-    p->extensions = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+    p->extensions = pa_idxset_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+
+    for (i = 0; i < PA_DBUS_PROTOCOL_HOOK_MAX; ++i)
+        pa_hook_init(&p->hooks[i], p);
 
     pa_assert_se(pa_shared_set(c, "dbus-protocol", p) >= 0);
 
@@ -143,6 +149,8 @@ pa_dbus_protocol* pa_dbus_protocol_ref(pa_dbus_protocol *p) {
 }
 
 void pa_dbus_protocol_unref(pa_dbus_protocol *p) {
+    unsigned i;
+
     pa_assert(p);
     pa_assert(PA_REFCNT_VALUE(p) >= 1);
 
@@ -151,11 +159,14 @@ void pa_dbus_protocol_unref(pa_dbus_protocol *p) {
 
     pa_assert(pa_hashmap_isempty(p->objects));
     pa_assert(pa_hashmap_isempty(p->connections));
-    pa_assert(pa_hashmap_isempty(p->extensions));
+    pa_assert(pa_idxset_isempty(p->extensions));
 
     pa_hashmap_free(p->objects, NULL, NULL);
     pa_hashmap_free(p->connections, NULL, NULL);
-    pa_hashmap_free(p->extensions, NULL, NULL);
+    pa_idxset_free(p->extensions, NULL, NULL);
+
+    for (i = 0; i < PA_DBUS_PROTOCOL_HOOK_MAX; ++i)
+        pa_hook_done(&p->hooks[i]);
 
     pa_assert_se(pa_shared_remove(p->core, "dbus-protocol") >= 0);
 
@@ -660,6 +671,8 @@ static void property_handler_free_cb(void *p, void *userdata) {
 
     pa_xfree((char *) h->property_name);
     pa_xfree((char *) h->type);
+
+    pa_xfree(h);
 }
 
 int pa_dbus_protocol_remove_interface(pa_dbus_protocol *p, const char* path, const char* interface) {
@@ -792,6 +805,18 @@ int pa_dbus_protocol_unregister_connection(pa_dbus_protocol *p, DBusConnection *
     return 0;
 }
 
+pa_client *pa_dbus_protocol_get_client(pa_dbus_protocol *p, DBusConnection *conn) {
+    struct connection_entry *conn_entry;
+
+    pa_assert(p);
+    pa_assert(conn);
+
+    if (!(conn_entry = pa_hashmap_get(p->connections, conn)))
+        return NULL;
+
+    return conn_entry->client;
+}
+
 void pa_dbus_protocol_add_signal_listener(pa_dbus_protocol *p, DBusConnection *conn, const char *signal, char **objects, unsigned n_objects) {
     struct connection_entry *conn_entry;
     pa_idxset *object_set;
@@ -893,18 +918,6 @@ void pa_dbus_protocol_send_signal(pa_dbus_protocol *p, DBusMessage *signal) {
     }
 }
 
-pa_client *pa_dbus_protocol_get_client(pa_dbus_protocol *p, DBusConnection *conn) {
-    struct connection_entry *conn_entry;
-
-    pa_assert(p);
-    pa_assert(conn);
-
-    if (!(conn_entry = pa_hashmap_get(p->connections, conn)))
-        return NULL;
-
-    return conn_entry->client;
-}
-
 const char **pa_dbus_protocol_get_extensions(pa_dbus_protocol *p, unsigned *n) {
     const char **extensions;
     const char *ext_name;
@@ -914,17 +927,59 @@ const char **pa_dbus_protocol_get_extensions(pa_dbus_protocol *p, unsigned *n) {
     pa_assert(p);
     pa_assert(n);
 
-    *n = pa_hashmap_size(p->extensions);
+    *n = pa_idxset_size(p->extensions);
 
     if (*n <= 0)
         return NULL;
 
     extensions = pa_xnew(const char *, *n);
 
-    while (pa_hashmap_iterate(p->extensions, &state, (const void **) &ext_name)) {
+    while ((ext_name = pa_idxset_iterate(p->extensions, &state, NULL))) {
         extensions[i] = ext_name;
         ++i;
     }
 
     return extensions;
 }
+
+int pa_dbus_protocol_register_extension(pa_dbus_protocol *p, const char *name) {
+    char *internal_name;
+
+    pa_assert(p);
+    pa_assert(name);
+
+    internal_name = pa_xstrdup(name);
+
+    if (pa_idxset_put(p->extensions, internal_name, NULL) < 0) {
+        pa_xfree(internal_name);
+        return -1;
+    }
+
+    pa_hook_fire(&p->hooks[PA_DBUS_PROTOCOL_HOOK_EXTENSION_REGISTERED], internal_name);
+
+    return 0;
+}
+
+int pa_dbus_protocol_unregister_extension(pa_dbus_protocol *p, const char *name) {
+    char *internal_name;
+
+    pa_assert(p);
+    pa_assert(name);
+
+    if (!(internal_name = pa_idxset_remove_by_data(p->extensions, name, NULL)))
+        return -1;
+
+    pa_hook_fire(&p->hooks[PA_DBUS_PROTOCOL_HOOK_EXTENSION_UNREGISTERED], internal_name);
+
+    pa_xfree(internal_name);
+
+    return 0;
+}
+
+pa_hook_slot *pa_dbus_protocol_hook_connect(pa_dbus_protocol *p, pa_dbus_protocol_hook_t hook, pa_hook_priority_t prio, pa_hook_cb_t cb, void *data) {
+    pa_assert(p);
+    pa_assert(hook < PA_DBUS_PROTOCOL_HOOK_MAX);
+    pa_assert(cb);
+
+    return pa_hook_connect(&p->hooks[hook], prio, cb, data);
+}
diff --git a/src/pulsecore/protocol-dbus.h b/src/pulsecore/protocol-dbus.h
index 27198f4..f2b1b50 100644
--- a/src/pulsecore/protocol-dbus.h
+++ b/src/pulsecore/protocol-dbus.h
@@ -119,9 +119,12 @@ int pa_dbus_protocol_remove_interface(pa_dbus_protocol *p, const char* path, con
  * registered. */
 int pa_dbus_protocol_register_connection(pa_dbus_protocol *p, DBusConnection *conn, pa_client *client);
 
-/* Returns a negative number if the connection wasn't registered. */
+/* Returns a negative number if the connection isn't registered. */
 int pa_dbus_protocol_unregister_connection(pa_dbus_protocol *p, DBusConnection *conn);
 
+/* Returns NULL if the connection isn't registered. */
+pa_client *pa_dbus_protocol_get_client(pa_dbus_protocol *p, DBusConnection *conn);
+
 /* Enables signal receiving for the given connection. The connection must have
  * been registered earlier.
  *
@@ -145,9 +148,6 @@ void pa_dbus_protocol_remove_signal_listener(pa_dbus_protocol *p, DBusConnection
 
 void pa_dbus_protocol_send_signal(pa_dbus_protocol *p, DBusMessage *signal);
 
-/* Returns NULL if the connection isn't registered. */
-pa_client *pa_dbus_protocol_get_client(pa_dbus_protocol *p, DBusConnection *conn);
-
 /* Returns an array of extension identifier strings. The strings pointers point
  * to the internal copies, so don't free the strings. The caller must free the
  * array, however. Also, do not save the returned pointer or any of the string
@@ -155,4 +155,35 @@ pa_client *pa_dbus_protocol_get_client(pa_dbus_protocol *p, DBusConnection *conn
  * need to save the array, copy it. */
 const char **pa_dbus_protocol_get_extensions(pa_dbus_protocol *p, unsigned *n);
 
+/* Modules that want to provide a D-Bus interface for clients should register
+ * an identifier that the clients can use to check whether the additional
+ * functionality is available.
+ *
+ * This function registers the extension with the given name. It is recommended
+ * that the name follows the D-Bus interface naming convention, so that the
+ * names remain unique in case there will be at some point in the future
+ * extensions that aren't included with the main PulseAudio source tree. For
+ * in-tree extensions the convention is to use the org.PulseAudio.Ext
+ * namespace.
+ *
+ * It is suggested that the name contains a version number, and whenever the
+ * extension interface is modified in non-backwards compatible way, the version
+ * number is incremented.
+ *
+ * Fails and returns a negative number if the extension is already registered.
+ */
+int pa_dbus_protocol_register_extension(pa_dbus_protocol *p, const char *name);
+
+/* Returns a negative number if the extension isn't registered. */
+int pa_dbus_protocol_unregister_extension(pa_dbus_protocol *p, const char *name);
+
+/* All hooks have the pa_dbus_protocol object as hook data. */
+typedef enum pa_dbus_protocol_hook {
+    PA_DBUS_PROTOCOL_HOOK_EXTENSION_REGISTERED, /* Extension name as call data. */
+    PA_DBUS_PROTOCOL_HOOK_EXTENSION_UNREGISTERED, /* Extension name as call data. */
+    PA_DBUS_PROTOCOL_HOOK_MAX
+} pa_dbus_protocol_hook_t;
+
+pa_hook_slot *pa_dbus_protocol_hook_connect(pa_dbus_protocol *p, pa_dbus_protocol_hook_t hook, pa_hook_priority_t prio, pa_hook_cb_t cb, void *data);
+
 #endif

commit 68cb63c0d9b1493ebc4274f9ea1fb05a8c273574
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Fri Jul 31 12:06:53 2009 +0300

    dbusiface-core: Send signals whenever extensions are registered and unregistered.

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index cdfd2a3..e2e3be2 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -112,6 +112,9 @@ struct pa_dbusiface_core {
 
     pa_sink *fallback_sink;
     pa_source *fallback_source;
+
+    pa_hook_slot *extension_registered_slot;
+    pa_hook_slot *extension_unregistered_slot;
 };
 
 enum property_handler_index {
@@ -259,6 +262,8 @@ enum signal_index {
     SIGNAL_MODULE_REMOVED,
     SIGNAL_NEW_CLIENT,
     SIGNAL_CLIENT_REMOVED,
+    SIGNAL_NEW_EXTENSION,
+    SIGNAL_EXTENSION_REMOVED,
     SIGNAL_MAX
 };
 
@@ -280,6 +285,8 @@ static pa_dbus_arg_info new_module_args[] =              { { "module",
 static pa_dbus_arg_info module_removed_args[] =          { { "module",          "o", NULL } };
 static pa_dbus_arg_info new_client_args[] =              { { "client",          "o", NULL } };
 static pa_dbus_arg_info client_removed_args[] =          { { "client",          "o", NULL } };
+static pa_dbus_arg_info new_extension_args[] =           { { "extension",       "s", NULL } };
+static pa_dbus_arg_info extension_removed_args[] =       { { "extension",       "s", NULL } };
 
 static pa_dbus_signal_info signals[SIGNAL_MAX] = {
     [SIGNAL_NEW_CARD]                = { .name = "NewCard",               .arguments = new_card_args,                .n_arguments = 1 },
@@ -300,6 +307,8 @@ static pa_dbus_signal_info signals[SIGNAL_MAX] = {
     [SIGNAL_MODULE_REMOVED]          = { .name = "ModuleRemoved",         .arguments = module_removed_args,          .n_arguments = 1 },
     [SIGNAL_NEW_CLIENT]              = { .name = "NewClient",             .arguments = new_client_args,              .n_arguments = 1 },
     [SIGNAL_CLIENT_REMOVED]          = { .name = "ClientRemoved",         .arguments = client_removed_args,          .n_arguments = 1 },
+    [SIGNAL_NEW_EXTENSION]           = { .name = "NewExtension",          .arguments = new_extension_args,           .n_arguments = 1 },
+    [SIGNAL_EXTENSION_REMOVED]       = { .name = "ExtensionRemoved",      .arguments = extension_removed_args,       .n_arguments = 1 }
 };
 
 static pa_dbus_interface_info core_interface_info = {
@@ -1831,6 +1840,40 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
     }
 }
 
+static pa_hook_result_t extension_registered_cb(void *hook_data, void *call_data, void *slot_data) {
+    pa_dbusiface_core *c = slot_data;
+    const char *ext_name = call_data;
+    DBusMessage *signal = NULL;
+
+    pa_assert(c);
+    pa_assert(ext_name);
+
+    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_EXTENSION].name)));
+    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_STRING, &ext_name, DBUS_TYPE_INVALID));
+
+    pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
+    dbus_message_unref(signal);
+
+    return PA_HOOK_OK;
+}
+
+static pa_hook_result_t extension_unregistered_cb(void *hook_data, void *call_data, void *slot_data) {
+    pa_dbusiface_core *c = slot_data;
+    const char *ext_name = call_data;
+    DBusMessage *signal = NULL;
+
+    pa_assert(c);
+    pa_assert(ext_name);
+
+    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_EXTENSION_REMOVED].name)));
+    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_STRING, &ext_name, DBUS_TYPE_INVALID));
+
+    pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
+    dbus_message_unref(signal);
+
+    return PA_HOOK_OK;
+}
+
 pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core) {
     pa_dbusiface_core *c;
     pa_card *card;
@@ -1862,6 +1905,8 @@ pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core) {
     c->clients = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
     c->fallback_sink = pa_namereg_get_default_sink(core);
     c->fallback_source = pa_namereg_get_default_source(core);
+    c->extension_registered_slot = pa_dbus_protocol_hook_connect(c->dbus_protocol, PA_DBUS_PROTOCOL_HOOK_EXTENSION_REGISTERED, PA_HOOK_NORMAL, extension_registered_cb, c);
+    c->extension_unregistered_slot = pa_dbus_protocol_hook_connect(c->dbus_protocol, PA_DBUS_PROTOCOL_HOOK_EXTENSION_UNREGISTERED, PA_HOOK_NORMAL, extension_unregistered_cb, c);
 
     for (card = pa_idxset_first(core->cards, &idx); card; card = pa_idxset_next(core->cards, &idx))
         pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), pa_dbusiface_card_new(card, OBJECT_PATH));
@@ -1962,6 +2007,8 @@ void pa_dbusiface_core_free(pa_dbusiface_core *c) {
     pa_hashmap_free(c->samples, free_sample_cb, NULL);
     pa_hashmap_free(c->modules, free_module_cb, NULL);
     pa_hashmap_free(c->clients, free_client_cb, NULL);
+    pa_hook_slot_free(c->extension_registered_slot);
+    pa_hook_slot_free(c->extension_unregistered_slot);
 
     pa_dbus_protocol_unref(c->dbus_protocol);
 

commit a1ba80bc4e715b8ce77f55676bc63b02c1a82d3c
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sat Aug 1 08:26:51 2009 +0300

    dbusiface-core: Don't die if we get a default sink/source change event before the new default device is actually created.

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index e2e3be2..69c1bd2 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -1609,9 +1609,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
             if (c->fallback_sink != new_fallback_sink) {
                 c->fallback_sink = new_fallback_sink;
 
-                if (new_fallback_sink) {
-                    pa_assert_se((device = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(new_fallback_sink->index))));
-
+                if (new_fallback_sink && (device = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(new_fallback_sink->index)))) {
                     object_path = pa_dbusiface_device_get_path(device);
 
                     pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
@@ -1625,9 +1623,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
             if (c->fallback_source != new_fallback_source) {
                 c->fallback_source = new_fallback_source;
 
-                if (new_fallback_source) {
-                    pa_assert_se((device = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(new_fallback_source->index))));
-
+                if (new_fallback_source && (device = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(new_fallback_source->index)))) {
                     object_path = pa_dbusiface_device_get_path(device);
 
                     pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
@@ -1665,8 +1661,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
         case PA_SUBSCRIPTION_EVENT_SINK:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
+                pa_sink *sink = pa_idxset_get_by_index(core->sinks, idx);
+
                 if (!(device = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(idx)))) {
-                    device = pa_dbusiface_device_new_sink(pa_idxset_get_by_index(core->sinks, idx), OBJECT_PATH);
+                    device = pa_dbusiface_device_new_sink(sink, OBJECT_PATH);
                     pa_hashmap_put(c->sinks_by_index, PA_UINT32_TO_PTR(idx), device);
                     pa_hashmap_put(c->sinks_by_path, pa_dbusiface_device_get_path(device), device);
                 }
@@ -1676,6 +1674,23 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_SINK].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
+                pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
+                dbus_message_unref(signal);
+                signal = NULL;
+
+                if (c->fallback_sink && pa_streq(c->fallback_sink->name, sink->name)) {
+                    /* We have got default sink change event, but at that point
+                     * the D-Bus sink object wasn't created yet. Now that the
+                     * object is created, let's send the fallback sink change
+                     * signal. */
+                    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
+                    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
+                    dbus_message_unref(signal);
+                    signal = NULL;
+                }
+
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
                 pa_assert_se((device = pa_hashmap_remove(c->sinks_by_index, PA_UINT32_TO_PTR(idx))));
                 object_path = pa_dbusiface_device_get_path(device);
@@ -1690,8 +1705,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
         case PA_SUBSCRIPTION_EVENT_SOURCE:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
+                pa_source *source = pa_idxset_get_by_index(core->sources, idx);
+
                 if (!(device = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(idx)))) {
-                    device = pa_dbusiface_device_new_source(pa_idxset_get_by_index(core->sources, idx), OBJECT_PATH);
+                    device = pa_dbusiface_device_new_source(source, OBJECT_PATH);
                     pa_hashmap_put(c->sources_by_index, PA_UINT32_TO_PTR(idx), device);
                     pa_hashmap_put(c->sources_by_path, pa_dbusiface_device_get_path(device), device);
                 }
@@ -1701,6 +1718,23 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_SOURCE].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
+                pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
+                dbus_message_unref(signal);
+                signal = NULL;
+
+                if (c->fallback_source && pa_streq(c->fallback_source->name, source->name)) {
+                    /* We have got default source change event, but at that
+                     * point the D-Bus source object wasn't created yet. Now
+                     * that the object is created, let's send the fallback
+                     * source change signal. */
+                    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
+                    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
+                    dbus_message_unref(signal);
+                    signal = NULL;
+                }
+
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
                 pa_assert_se((device = pa_hashmap_remove(c->sources_by_index, PA_UINT32_TO_PTR(idx))));
                 object_path = pa_dbusiface_device_get_path(device);

commit 8c840572c7e2e560efcefe66707527a1dc4d16a4
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 2 11:12:21 2009 +0300

    dbus-protocol: Add debugging output (temporary change).

diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index 81a6c02..475b952 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -306,6 +306,7 @@ static enum find_result_t find_handler_by_method(struct object_entry *obj_entry,
             return FOUND_METHOD;
     }
 
+    pa_log("find_handler_by_method() failed.");
     return NO_SUCH_METHOD;
 }
 
@@ -327,8 +328,10 @@ static enum find_result_t find_handler_from_properties_call(struct object_entry
         if (*interface) {
             if ((*iface_entry = pa_hashmap_get(obj_entry->interfaces, interface)))
                 return FOUND_GET_ALL;
-            else
+            else {
+                pa_log("GetAll message has unknown interface: %s", interface);
                 return NO_SUCH_METHOD; /* XXX: NO_SUCH_INTERFACE or something like that might be more accurate. */
+            }
         } else {
             pa_assert_se((*iface_entry = pa_hashmap_first(obj_entry->interfaces)));
             return FOUND_GET_ALL;
@@ -378,8 +381,10 @@ static enum find_result_t find_handler(struct object_entry *obj_entry,
         if ((*iface_entry = pa_hashmap_get(obj_entry->interfaces, interface)) &&
             (*method_handler = pa_hashmap_get((*iface_entry)->method_handlers, dbus_message_get_member(msg))))
             return FOUND_METHOD;
-        else
+        else {
+            pa_log("Message has unknown interface or there's no method handler.");
             return NO_SUCH_METHOD;
+        }
 
     } else { /* The method call doesn't contain an interface. */
         if (dbus_message_has_member(msg, "Get") || dbus_message_has_member(msg, "Set") || dbus_message_has_member(msg, "GetAll")) {
@@ -411,6 +416,8 @@ static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessa
     if (dbus_message_get_type(message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
+    pa_log("Received method call: destination = %s, name = %s, iface = %s", dbus_message_get_path(message), dbus_message_get_member(message), dbus_message_get_interface(message));
+
     pa_assert_se((obj_entry = pa_hashmap_get(p->objects, dbus_message_get_path(message))));
 
     if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Introspectable", "Introspect") ||
@@ -624,6 +631,8 @@ int pa_dbus_protocol_add_interface(pa_dbus_protocol *p,
     if (obj_entry_created)
         register_object(p, obj_entry);
 
+    pa_log("Interface %s added for object %s. GetAll callback? %s", iface_entry->name, obj_entry->path, iface_entry->get_all_properties_cb ? "yes" : "no");
+
     return 0;
 
 fail:

commit 805af5e8010228bee7521fbd1148e167cfb21e77
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 3 19:36:19 2009 +0300

    dbus-util: Fix broken proplist reading logic.

diff --git a/src/pulsecore/dbus-util.c b/src/pulsecore/dbus-util.c
index 43dbd6b..5db7f21 100644
--- a/src/pulsecore/dbus-util.c
+++ b/src/pulsecore/dbus-util.c
@@ -765,6 +765,8 @@ int pa_dbus_get_fixed_array_arg(DBusConnection *c, DBusMessage *msg, DBusMessage
 
 pa_proplist *pa_dbus_get_proplist_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter) {
     DBusMessageIter dict_iter;
+    DBusMessageIter dict_entry_iter;
+    int arg_type;
     pa_proplist *proplist = NULL;
     const char *key;
     const uint8_t *value;
@@ -774,13 +776,18 @@ pa_proplist *pa_dbus_get_proplist_arg(DBusConnection *c, DBusMessage *msg, DBusM
     pa_assert(msg);
     pa_assert(iter);
 
-    if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_ARRAY) {
-        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type or too few arguments. An array was expected.");
+    arg_type = dbus_message_iter_get_arg_type(iter);
+    if (arg_type != DBUS_TYPE_ARRAY) {
+        if (arg_type == DBUS_TYPE_INVALID)
+            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments. An array was expected.");
+        else
+            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type: '%c'. An array was expected.", (char) arg_type);
         return NULL;
     }
 
-    if (dbus_message_iter_get_element_type(iter) != DBUS_TYPE_DICT_ENTRY) {
-        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong array element type. A dict entry was expected.");
+    arg_type = dbus_message_iter_get_element_type(iter);
+    if (arg_type != DBUS_TYPE_DICT_ENTRY) {
+        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong array element type: '%c'. A dictionary entry was expected.", (char) arg_type);
         return NULL;
     }
 
@@ -788,34 +795,45 @@ pa_proplist *pa_dbus_get_proplist_arg(DBusConnection *c, DBusMessage *msg, DBusM
 
     dbus_message_iter_recurse(iter, &dict_iter);
 
-    while (dbus_message_iter_has_next(&dict_iter)) {
-        if (dbus_message_iter_get_arg_type(&dict_iter) != DBUS_TYPE_STRING) {
-            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict key type. A string was expected.");
+    while (dbus_message_iter_get_arg_type(&dict_iter) != DBUS_TYPE_INVALID) {
+        dbus_message_iter_recurse(&dict_iter, &dict_entry_iter);
+
+        arg_type = dbus_message_iter_get_arg_type(&dict_entry_iter);
+        if (arg_type != DBUS_TYPE_STRING) {
+            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict key type: '%c'. A string was expected.", (char) arg_type);
             goto fail;
         }
 
-        dbus_message_iter_get_basic(&dict_iter, &key);
+        dbus_message_iter_get_basic(&dict_entry_iter, &key);
+        dbus_message_iter_next(&dict_entry_iter);
 
         if (strlen(key) <= 0 || !pa_ascii_valid(key)) {
             pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Invalid property list key.");
             goto fail;
         }
 
-        if (dbus_message_iter_get_arg_type(&dict_iter) != DBUS_TYPE_ARRAY) {
-            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict value type. An array was expected.");
+        arg_type = dbus_message_iter_get_arg_type(&dict_entry_iter);
+        if (arg_type != DBUS_TYPE_ARRAY) {
+            if (arg_type == DBUS_TYPE_INVALID)
+                pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Dict value missing.");
+            else
+                pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict value type: '%c'. An array was expected.", (char) arg_type);
             goto fail;
         }
 
-        if (dbus_message_iter_get_element_type(&dict_iter) != DBUS_TYPE_BYTE) {
-            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict value item type. A byte was expected.");
+        arg_type = dbus_message_iter_get_element_type(&dict_entry_iter);
+        if (arg_type != DBUS_TYPE_BYTE) {
+            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict value item type: '%c'. A byte was expected.", (char) arg_type);
             goto fail;
         }
 
-        dbus_message_iter_get_fixed_array(&dict_iter, &value, &value_length);
+        dbus_message_iter_get_fixed_array(&dict_entry_iter, &value, &value_length);
 
         pa_assert(value_length >= 0);
 
         pa_assert_se(pa_proplist_set(proplist, key, value, value_length) >= 0);
+
+        dbus_message_iter_next(&dict_iter);
     }
 
     dbus_message_iter_next(iter);

commit d9d166a691cd5ecc786b73f1377244b8d51b4327
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 3 19:38:02 2009 +0300

    stream-restore: Expose module to D-Bus.

diff --git a/src/Makefile.am b/src/Makefile.am
index 47eb647..07f81a6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1536,6 +1536,11 @@ module_stream_restore_la_LDFLAGS = $(MODULE_LDFLAGS)
 module_stream_restore_la_LIBADD = $(AM_LIBADD) libprotocol-native.la libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
 module_stream_restore_la_CFLAGS = $(AM_CFLAGS)
 
+if HAVE_DBUS
+module_stream_restore_la_LIBADD += $(DBUS_LIBS)
+module_stream_restore_la_CFLAGS += $(DBUS_CFLAGS)
+endif
+
 # Card profile restore module
 module_card_restore_la_SOURCES = modules/module-card-restore.c
 module_card_restore_la_LDFLAGS = $(MODULE_LDFLAGS)
diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index e60cc73..bccdf93 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -2,6 +2,7 @@
   This file is part of PulseAudio.
 
   Copyright 2008 Lennart Poettering
+  Copyright 2009 Tanu Kaskinen
 
   PulseAudio is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as published
@@ -51,6 +52,11 @@
 #include <pulsecore/pstream-util.h>
 #include <pulsecore/database.h>
 
+#ifdef HAVE_DBUS
+#include <pulsecore/dbus-util.h>
+#include <pulsecore/protocol-dbus.h>
+#endif
+
 #include "module-stream-restore-symdef.h"
 
 PA_MODULE_AUTHOR("Lennart Poettering");
@@ -100,6 +106,12 @@ struct userdata {
 
     pa_native_protocol *protocol;
     pa_idxset *subscribed;
+
+#ifdef HAVE_DBUS
+    pa_dbus_protocol *dbus_protocol;
+    pa_hashmap *dbus_entries;
+    uint32_t next_index; /* For generating object paths for entries. */
+#endif
 };
 
 #define ENTRY_VERSION 2
@@ -122,6 +134,883 @@ enum {
     SUBCOMMAND_EVENT
 };
 
+static struct entry *read_entry(struct userdata *u, const char *name);
+static void apply_entry(struct userdata *u, const char *name, struct entry *e);
+static void trigger_save(struct userdata *u);
+
+#ifdef HAVE_DBUS
+
+#define OBJECT_PATH "/org/pulseaudio/stream_restore1"
+#define ENTRY_OBJECT_NAME "entry"
+#define INTERFACE_STREAM_RESTORE "org.PulseAudio.Ext.StreamRestore1"
+#define INTERFACE_ENTRY INTERFACE_STREAM_RESTORE ".RestoreEntry"
+
+#define DBUS_INTERFACE_REVISION 0
+
+struct dbus_entry {
+    struct userdata *userdata;
+
+    char *entry_name;
+    uint32_t index;
+    char *object_path;
+};
+
+static void handle_get_interface_revision(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_entries(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_add_entry(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_entry_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_entry_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_entry_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_entry_get_device(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_entry_set_device(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_entry_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_entry_set_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_entry_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_entry_set_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_entry_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_entry_remove(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+enum property_handler_index {
+    PROPERTY_HANDLER_INTERFACE_REVISION,
+    PROPERTY_HANDLER_ENTRIES,
+    PROPERTY_HANDLER_MAX
+};
+
+enum entry_property_handler_index {
+    ENTRY_PROPERTY_HANDLER_INDEX,
+    ENTRY_PROPERTY_HANDLER_NAME,
+    ENTRY_PROPERTY_HANDLER_DEVICE,
+    ENTRY_PROPERTY_HANDLER_VOLUME,
+    ENTRY_PROPERTY_HANDLER_IS_MUTED,
+    ENTRY_PROPERTY_HANDLER_MAX
+};
+
+static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
+    [PROPERTY_HANDLER_INTERFACE_REVISION] = { .property_name = "InterfaceRevision", .type = "u",  .get_cb = handle_get_interface_revision, .set_cb = NULL },
+    [PROPERTY_HANDLER_ENTRIES]            = { .property_name = "Entries",           .type = "ao", .get_cb = handle_get_entries,            .set_cb = NULL }
+};
+
+static pa_dbus_property_handler entry_property_handlers[ENTRY_PROPERTY_HANDLER_MAX] = {
+    [ENTRY_PROPERTY_HANDLER_INDEX]    = { .property_name = "Index",   .type = "u",     .get_cb = handle_entry_get_index,    .set_cb = NULL },
+    [ENTRY_PROPERTY_HANDLER_NAME]     = { .property_name = "Name",    .type = "s",     .get_cb = handle_entry_get_name,     .set_cb = NULL },
+    [ENTRY_PROPERTY_HANDLER_DEVICE]   = { .property_name = "Device",  .type = "s",     .get_cb = handle_entry_get_device,   .set_cb = handle_entry_set_device },
+    [ENTRY_PROPERTY_HANDLER_VOLUME]   = { .property_name = "Volume",  .type = "a(uu)", .get_cb = handle_entry_get_volume,   .set_cb = handle_entry_set_volume },
+    [ENTRY_PROPERTY_HANDLER_IS_MUTED] = { .property_name = "IsMuted", .type = "b",     .get_cb = handle_entry_get_is_muted, .set_cb = handle_entry_set_is_muted }
+};
+
+enum method_handler_index {
+    METHOD_HANDLER_ADD_ENTRY,
+    METHOD_HANDLER_GET_ENTRY_BY_NAME,
+    METHOD_HANDLER_MAX
+};
+
+enum entry_method_handler_index {
+    ENTRY_METHOD_HANDLER_REMOVE,
+    ENTRY_METHOD_HANDLER_MAX
+};
+
+static pa_dbus_arg_info add_entry_args[] = { { "name",     "s",     "in" },
+                                             { "device",   "s",     "in" },
+                                             { "volume",   "a(uu)", "in" },
+                                             { "is_muted", "b",     "in" },
+                                             { "entry",    "o",     "out" } };
+static pa_dbus_arg_info get_entry_by_name_args[] = { { "name", "s", "in" }, { "entry", "o", "out" } };
+
+static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
+    [METHOD_HANDLER_ADD_ENTRY] = {
+        .method_name = "AddEntry",
+        .arguments = add_entry_args,
+        .n_arguments = sizeof(add_entry_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_add_entry },
+    [METHOD_HANDLER_GET_ENTRY_BY_NAME] = {
+        .method_name = "GetEntryByName",
+        .arguments = get_entry_by_name_args,
+        .n_arguments = sizeof(get_entry_by_name_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_get_entry_by_name }
+};
+
+static pa_dbus_method_handler entry_method_handlers[ENTRY_METHOD_HANDLER_MAX] = {
+    [ENTRY_METHOD_HANDLER_REMOVE] = {
+        .method_name = "Remove",
+        .arguments = NULL,
+        .n_arguments = 0,
+        .receive_cb = handle_entry_remove }
+};
+
+enum signal_index {
+    SIGNAL_NEW_ENTRY,
+    SIGNAL_ENTRY_REMOVED,
+    SIGNAL_MAX
+};
+
+enum entry_signal_index {
+    ENTRY_SIGNAL_DEVICE_UPDATED,
+    ENTRY_SIGNAL_VOLUME_UPDATED,
+    ENTRY_SIGNAL_MUTE_UPDATED,
+    ENTRY_SIGNAL_MAX
+};
+
+static pa_dbus_arg_info new_entry_args[]     = { { "entry", "o", NULL } };
+static pa_dbus_arg_info entry_removed_args[] = { { "entry", "o", NULL } };
+
+static pa_dbus_arg_info entry_device_updated_args[] = { { "device", "s",     NULL } };
+static pa_dbus_arg_info entry_volume_updated_args[] = { { "volume", "a(uu)", NULL } };
+static pa_dbus_arg_info entry_mute_updated_args[]   = { { "muted",  "b",     NULL } };
+
+static pa_dbus_signal_info signals[SIGNAL_MAX] = {
+    [SIGNAL_NEW_ENTRY]     = { .name = "NewEntry",     .arguments = new_entry_args,     .n_arguments = 1 },
+    [SIGNAL_ENTRY_REMOVED] = { .name = "EntryRemoved", .arguments = entry_removed_args, .n_arguments = 1 }
+};
+
+static pa_dbus_signal_info entry_signals[ENTRY_SIGNAL_MAX] = {
+    [ENTRY_SIGNAL_DEVICE_UPDATED] = { .name = "DeviceUpdated", .arguments = entry_device_updated_args, .n_arguments = 1 },
+    [ENTRY_SIGNAL_VOLUME_UPDATED] = { .name = "VolumeUpdated", .arguments = entry_volume_updated_args, .n_arguments = 1 },
+    [ENTRY_SIGNAL_MUTE_UPDATED]   = { .name = "MuteUpdated",   .arguments = entry_mute_updated_args,   .n_arguments = 1 }
+};
+
+static pa_dbus_interface_info stream_restore_interface_info = {
+    .name = INTERFACE_STREAM_RESTORE,
+    .method_handlers = method_handlers,
+    .n_method_handlers = METHOD_HANDLER_MAX,
+    .property_handlers = property_handlers,
+    .n_property_handlers = PROPERTY_HANDLER_MAX,
+    .get_all_properties_cb = handle_get_all,
+    .signals = signals,
+    .n_signals = SIGNAL_MAX
+};
+
+static pa_dbus_interface_info entry_interface_info = {
+    .name = INTERFACE_ENTRY,
+    .method_handlers = entry_method_handlers,
+    .n_method_handlers = ENTRY_METHOD_HANDLER_MAX,
+    .property_handlers = entry_property_handlers,
+    .n_property_handlers = ENTRY_PROPERTY_HANDLER_MAX,
+    .get_all_properties_cb = handle_entry_get_all,
+    .signals = entry_signals,
+    .n_signals = ENTRY_SIGNAL_MAX
+};
+
+static struct dbus_entry *dbus_entry_new(struct userdata *u, const char *entry_name) {
+    struct dbus_entry *de;
+
+    pa_assert(u);
+    pa_assert(entry_name);
+    pa_assert(*entry_name);
+
+    de = pa_xnew(struct dbus_entry, 1);
+    de->userdata = u;
+    de->entry_name = pa_xstrdup(entry_name);
+    de->index = u->next_index++;
+    de->object_path = pa_sprintf_malloc("%s/%s%u", OBJECT_PATH, ENTRY_OBJECT_NAME, de->index);
+
+    pa_assert_se(pa_dbus_protocol_add_interface(u->dbus_protocol, de->object_path, &entry_interface_info, u) >= 0);
+
+    return de;
+}
+
+static void dbus_entry_free(struct dbus_entry *de) {
+    pa_assert(de);
+
+    pa_assert_se(pa_dbus_protocol_remove_interface(de->userdata->dbus_protocol, de->object_path, entry_interface_info.name) >= 0);
+
+    pa_xfree(de->entry_name);
+    pa_xfree(de->object_path);
+}
+
+/* Reads an array [(UInt32, UInt32)] from the iterator. The struct items are
+ * are a channel position and a volume value, respectively. The result is
+ * stored in the map and vol arguments. If the volume can't be read from the
+ * iterator, an error reply is sent and a negative number is returned. In case
+ * of a failure we make no guarantees about the state of map and vol. In case
+ * of an empty array the channels field of both map and vol are set to 0. */
+static int get_volume_arg(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, pa_channel_map *map, pa_cvolume *vol) {
+    DBusMessageIter array_iter;
+    DBusMessageIter struct_iter;
+    int arg_type;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(iter);
+    pa_assert(map);
+    pa_assert(vol);
+
+    pa_channel_map_init(map);
+    pa_cvolume_init(vol);
+
+    map->channels = 0;
+    vol->channels = 0;
+
+    arg_type = dbus_message_iter_get_arg_type(iter);
+    if (arg_type != DBUS_TYPE_ARRAY) {
+        if (arg_type == DBUS_TYPE_INVALID)
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments. An array was expected.");
+        else
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type: '%c'. An array was expected.", (char) arg_type);
+        return -1;
+    }
+
+    arg_type = dbus_message_iter_get_element_type(iter);
+    if (arg_type != DBUS_TYPE_STRUCT) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong array element type: '%c'. A struct was expected.", (char) arg_type);
+        return -1;
+    }
+
+    dbus_message_iter_recurse(iter, &array_iter);
+
+    while (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_INVALID) {
+        dbus_uint32_t chan_pos;
+        dbus_uint32_t chan_vol;
+
+        dbus_message_iter_recurse(&array_iter, &struct_iter);
+
+        arg_type = dbus_message_iter_get_arg_type(&struct_iter);
+        if (arg_type != DBUS_TYPE_UINT32) {
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong channel position type: '%c'. An unsigned 32-bit integer was expected.", (char) arg_type);
+            return -1;
+        }
+
+        dbus_message_iter_get_basic(&struct_iter, &chan_pos);
+        dbus_message_iter_next(&struct_iter);
+
+        if (chan_pos >= PA_CHANNEL_POSITION_MAX) {
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid channel position: %u", chan_pos);
+            return -1;
+        }
+
+        arg_type = dbus_message_iter_get_arg_type(&struct_iter);
+        if (arg_type != DBUS_TYPE_UINT32) {
+            if (arg_type == DBUS_TYPE_INVALID)
+                pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Channel volume missing.");
+            else
+                pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong volume value type: '%c'. An unsigned 32-bit integer was expected.", (char) arg_type);
+            return -1;
+        }
+
+        dbus_message_iter_get_basic(&struct_iter, &chan_vol);
+
+        if (chan_vol > PA_VOLUME_MAX) {
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid volume: %u", chan_vol);
+            return -1;
+        }
+
+        if (map->channels < PA_CHANNELS_MAX) {
+            map->map[map->channels] = chan_pos;
+            vol->values[map->channels] = chan_vol;
+        }
+        ++map->channels;
+        ++vol->channels;
+
+        dbus_message_iter_next(&array_iter);
+    }
+
+    if (map->channels > PA_CHANNELS_MAX) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too many channels: %u. The maximum is %u.", map->channels, PA_CHANNELS_MAX);
+        return -1;
+    }
+
+    dbus_message_iter_next(iter);
+
+    return 0;
+}
+
+static void append_volume(DBusMessageIter *iter, struct entry *e) {
+    DBusMessageIter array_iter;
+    DBusMessageIter struct_iter;
+    unsigned i;
+
+    pa_assert(iter);
+    pa_assert(e);
+
+    pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "(uu)", &array_iter));
+
+    if (!e->volume_valid) {
+        pa_assert_se(dbus_message_iter_close_container(iter, &array_iter));
+        return;
+    }
+
+    for (i = 0; i < e->channel_map.channels; ++i) {
+        pa_assert_se(dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter));
+
+        pa_assert_se(dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_UINT32, &e->channel_map.map[i]));
+        pa_assert_se(dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_UINT32, &e->volume.values[i]));
+
+        pa_assert_se(dbus_message_iter_close_container(&array_iter, &struct_iter));
+    }
+
+    pa_assert_se(dbus_message_iter_close_container(iter, &array_iter));
+}
+
+static void append_volume_variant(DBusMessageIter *iter, struct entry *e) {
+    DBusMessageIter variant_iter;
+
+    pa_assert(iter);
+    pa_assert(e);
+
+    pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a(uu)", &variant_iter));
+
+    append_volume(&variant_iter, e);
+
+    pa_assert_se(dbus_message_iter_close_container(iter, &variant_iter));
+}
+
+static void send_new_entry_signal(struct dbus_entry *entry) {
+    DBusMessage *signal;
+
+    pa_assert(entry);
+
+    pa_assert_se(signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_STREAM_RESTORE, signals[SIGNAL_NEW_ENTRY].name));
+    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &entry->object_path, DBUS_TYPE_INVALID));
+    pa_dbus_protocol_send_signal(entry->userdata->dbus_protocol, signal);
+    dbus_message_unref(signal);
+}
+
+static void send_entry_removed_signal(struct dbus_entry *entry) {
+    DBusMessage *signal;
+
+    pa_assert(entry);
+
+    pa_assert_se(signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_STREAM_RESTORE, signals[SIGNAL_ENTRY_REMOVED].name));
+    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &entry->object_path, DBUS_TYPE_INVALID));
+    pa_dbus_protocol_send_signal(entry->userdata->dbus_protocol, signal);
+    dbus_message_unref(signal);
+}
+
+static void send_device_updated_signal(struct dbus_entry *de, struct entry *e) {
+    DBusMessage *signal;
+    const char *device;
+
+    pa_assert(de);
+    pa_assert(e);
+
+    device = e->device_valid ? e->device : "";
+
+    pa_assert_se(signal = dbus_message_new_signal(de->object_path, INTERFACE_ENTRY, entry_signals[ENTRY_SIGNAL_DEVICE_UPDATED].name));
+    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_STRING, &device, DBUS_TYPE_INVALID));
+    pa_dbus_protocol_send_signal(de->userdata->dbus_protocol, signal);
+    dbus_message_unref(signal);
+}
+
+static void send_volume_updated_signal(struct dbus_entry *de, struct entry *e) {
+    DBusMessage *signal;
+    DBusMessageIter msg_iter;
+
+    pa_assert(de);
+    pa_assert(e);
+
+    pa_assert_se(signal = dbus_message_new_signal(de->object_path, INTERFACE_ENTRY, entry_signals[ENTRY_SIGNAL_VOLUME_UPDATED].name));
+    dbus_message_iter_init_append(signal, &msg_iter);
+    append_volume(&msg_iter, e);
+    pa_dbus_protocol_send_signal(de->userdata->dbus_protocol, signal);
+    dbus_message_unref(signal);
+}
+
+static void send_mute_updated_signal(struct dbus_entry *de, struct entry *e) {
+    DBusMessage *signal;
+    dbus_bool_t muted;
+
+    pa_assert(de);
+    pa_assert(e);
+
+    pa_assert(e->muted_valid);
+
+    muted = e->muted;
+
+    pa_assert_se(signal = dbus_message_new_signal(de->object_path, INTERFACE_ENTRY, entry_signals[ENTRY_SIGNAL_MUTE_UPDATED].name));
+    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_BOOLEAN, &muted, DBUS_TYPE_INVALID));
+    pa_dbus_protocol_send_signal(de->userdata->dbus_protocol, signal);
+    dbus_message_unref(signal);
+}
+
+static void handle_get_interface_revision(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    dbus_uint32_t interface_revision = DBUS_INTERFACE_REVISION;
+
+    pa_assert(conn);
+    pa_assert(msg);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &interface_revision);
+}
+
+/* The caller frees the array, but not the strings. */
+static const char **get_entries(struct userdata *u, unsigned *n) {
+    const char **entries;
+    unsigned i = 0;
+    void *state = NULL;
+    struct dbus_entry *de;
+
+    pa_assert(u);
+    pa_assert(n);
+
+    *n = pa_hashmap_size(u->dbus_entries);
+
+    if (*n == 0)
+        return NULL;
+
+    entries = pa_xnew(const char *, *n);
+
+    while ((de = pa_hashmap_iterate(u->dbus_entries, &state, NULL))) {
+        entries[i] = de->object_path;
+        ++i;
+    }
+
+    return entries;
+}
+
+static void handle_get_entries(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    struct userdata *u = userdata;
+    const char **entries;
+    unsigned n;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(u);
+
+    entries = get_entries(u, &n);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, entries, n);
+
+    pa_xfree(entries);
+}
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    struct userdata *u = userdata;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+    dbus_uint32_t interface_revision;
+    const char **entries;
+    unsigned n_entries;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(u);
+
+    interface_revision = DBUS_INTERFACE_REVISION;
+    entries = get_entries(u, &n_entries);
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INTERFACE_REVISION].property_name, DBUS_TYPE_UINT32, &interface_revision);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_ENTRIES].property_name, DBUS_TYPE_OBJECT_PATH, entries, n_entries);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+
+    dbus_message_unref(reply);
+
+    pa_xfree(entries);
+}
+
+static void handle_add_entry(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    struct userdata *u = userdata;
+    DBusMessageIter msg_iter;
+    const char *name;
+    const char *device;
+    pa_channel_map map;
+    pa_cvolume vol;
+    dbus_bool_t muted;
+    dbus_bool_t apply_immediately;
+    pa_datum key;
+    pa_datum value;
+    struct dbus_entry *dbus_entry;
+    struct entry *e;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(u);
+
+    if (!dbus_message_iter_init(msg, &msg_iter)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
+        return;
+    }
+
+    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_STRING, &name) < 0)
+        return;
+
+    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_STRING, &device) < 0)
+        return;
+
+    if (get_volume_arg(conn, msg, &msg_iter, &map, &vol) < 0)
+        return;
+
+    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_BOOLEAN, &muted) < 0)
+        return;
+
+    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_BOOLEAN, &apply_immediately) < 0)
+        return;
+
+    if (!*name) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "An empty string was given as the entry name.");
+        return;
+    }
+
+    if ((dbus_entry = pa_hashmap_get(u->dbus_entries, name))) {
+        pa_bool_t mute_updated = FALSE;
+        pa_bool_t volume_updated = FALSE;
+        pa_bool_t device_updated = FALSE;
+
+        pa_assert_se(e = read_entry(u, name));
+        mute_updated = e->muted != muted;
+        e->muted = muted;
+        e->muted_valid = TRUE;
+
+        volume_updated = (e->volume_valid != !!map.channels) || !pa_cvolume_equal(&e->volume, &vol);
+        e->volume = vol;
+        e->channel_map = map;
+        e->volume_valid = !!map.channels;
+
+        device_updated = (e->device_valid != !!device[0]) || !pa_streq(e->device, device);
+        pa_strlcpy(e->device, device, sizeof(e->device));
+        e->device_valid = !!device[0];
+
+        if (mute_updated)
+            send_mute_updated_signal(dbus_entry, e);
+        if (volume_updated)
+            send_volume_updated_signal(dbus_entry, e);
+        if (device_updated)
+            send_device_updated_signal(dbus_entry, e);
+
+    } else {
+        dbus_entry = dbus_entry_new(u, name);
+        pa_assert(pa_hashmap_put(u->dbus_entries, dbus_entry->entry_name, dbus_entry) >= 0);
+
+        e->muted_valid = TRUE;
+        e->volume_valid = !!map.channels;
+        e->device_valid = !!device[0];
+        e->muted = muted;
+        e->volume = vol;
+        e->channel_map = map;
+        pa_strlcpy(e->device, device, sizeof(e->device));
+
+        send_new_entry_signal(dbus_entry);
+    }
+
+    key.data = (char *) name;
+    key.size = strlen(name);
+
+    value.data = e;
+    value.size = sizeof(struct entry);
+
+    pa_assert_se(pa_database_set(u->database, &key, &value, TRUE) == 0);
+    if (apply_immediately)
+        apply_entry(u, name, e);
+
+    trigger_save(u);
+
+    pa_dbus_send_empty_reply(conn, msg);
+
+    pa_xfree(e);
+}
+
+static void handle_get_entry_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    struct userdata *u = userdata;
+    const char *name;
+    struct dbus_entry *de;
+    DBusError error;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(u);
+
+    dbus_error_init(&error);
+
+    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
+        dbus_error_free(&error);
+        return;
+    }
+
+    if (!(de = pa_hashmap_get(u->dbus_entries, name))) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such stream restore entry.");
+        return;
+    }
+
+    pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &de->object_path);
+}
+
+static void handle_entry_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    struct dbus_entry *de = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(de);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &de->index);
+}
+
+static void handle_entry_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    struct dbus_entry *de = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(de);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &de->entry_name);
+}
+
+static void handle_entry_get_device(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    struct dbus_entry *de = userdata;
+    struct entry *e;
+    const char *device;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(de);
+
+    pa_assert_se(e = read_entry(de->userdata, de->entry_name));
+
+    device = e->device_valid ? e->device : "";
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &device);
+
+    pa_xfree(e);
+}
+
+static void handle_entry_set_device(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    struct dbus_entry *de = userdata;
+    const char *device;
+    struct entry *e;
+    pa_bool_t updated;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(de);
+
+    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_STRING, &device) < 0)
+        return;
+
+    pa_assert_se(e = read_entry(de->userdata, de->entry_name));
+
+    updated = (e->device_valid != !!device[0]) || !pa_streq(e->device, device);
+
+    if (updated) {
+        pa_datum key;
+        pa_datum value;
+
+        pa_strlcpy(e->device, device, sizeof(e->device));
+        e->device_valid = !!device[0];
+
+        key.data = de->entry_name;
+        key.size = strlen(de->entry_name);
+        value.data = e;
+        value.size = sizeof(struct entry);
+        pa_assert_se(pa_database_set(de->userdata->database, &key, &value, TRUE) == 0);
+
+        send_device_updated_signal(de, e);
+        trigger_save(de->userdata);
+    }
+
+    pa_dbus_send_empty_reply(conn, msg);
+
+    pa_xfree(e);
+}
+
+static void handle_entry_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    struct dbus_entry *de = userdata;
+    DBusMessage *reply;
+    DBusMessageIter msg_iter;
+    struct entry *e;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(de);
+
+    pa_assert_se(e = read_entry(de->userdata, de->entry_name));
+
+    pa_assert_se(reply = dbus_message_new_method_return(msg));
+
+    dbus_message_iter_init_append(reply, &msg_iter);
+    append_volume_variant(&msg_iter, e);
+
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+
+    pa_xfree(e);
+}
+
+static void handle_entry_set_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    struct dbus_entry *de = userdata;
+    DBusMessageIter msg_iter;
+    pa_channel_map map;
+    pa_cvolume vol;
+    struct entry *e;
+    pa_bool_t updated;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(de);
+
+    /* Skip the interface and property name arguments. */
+    if (!dbus_message_iter_init(msg, &msg_iter) || !dbus_message_iter_next(&msg_iter) || !dbus_message_iter_next(&msg_iter)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
+        return;
+    }
+
+    if (get_volume_arg(conn, msg, &msg_iter, &map, &vol) < 0)
+        return;
+
+    pa_assert_se(e = read_entry(de->userdata, de->entry_name));
+
+    updated = (e->volume_valid != !!map.channels) || !pa_cvolume_equal(&e->volume, &vol);
+
+    if (updated) {
+        pa_datum key;
+        pa_datum value;
+
+        e->volume = vol;
+        e->channel_map = map;
+        e->volume_valid = !!map.channels;
+
+        key.data = de->entry_name;
+        key.size = strlen(de->entry_name);
+        value.data = e;
+        value.size = sizeof(struct entry);
+        pa_assert_se(pa_database_set(de->userdata->database, &key, &value, TRUE) == 0);
+
+        send_volume_updated_signal(de, e);
+        trigger_save(de->userdata);
+    }
+
+    pa_dbus_send_empty_reply(conn, msg);
+
+    pa_xfree(e);
+}
+
+static void handle_entry_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    struct dbus_entry *de = userdata;
+    struct entry *e;
+    dbus_bool_t muted;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(de);
+
+    pa_assert_se(e = read_entry(de->userdata, de->entry_name));
+
+    muted = e->muted_valid ? e->muted : FALSE;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &muted);
+
+    pa_xfree(e);
+}
+
+static void handle_entry_set_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    struct dbus_entry *de = userdata;
+    pa_bool_t muted;
+    struct entry *e;
+    pa_bool_t updated;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(de);
+
+    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_BOOLEAN, &muted) < 0)
+        return;
+
+    pa_assert_se(e = read_entry(de->userdata, de->entry_name));
+
+    updated = !e->muted_valid || e->muted != muted;
+
+    if (updated) {
+        pa_datum key;
+        pa_datum value;
+
+        e->muted = muted;
+        e->muted_valid = TRUE;
+
+        key.data = de->entry_name;
+        key.size = strlen(de->entry_name);
+        value.data = e;
+        value.size = sizeof(struct entry);
+        pa_assert_se(pa_database_set(de->userdata->database, &key, &value, TRUE) == 0);
+
+        send_mute_updated_signal(de, e);
+        trigger_save(de->userdata);
+    }
+
+    pa_dbus_send_empty_reply(conn, msg);
+
+    pa_xfree(e);
+}
+
+static void handle_entry_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    struct dbus_entry *de = userdata;
+    struct entry *e;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+    DBusMessageIter dict_entry_iter;
+    const char *device;
+    dbus_bool_t muted;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(de);
+
+    pa_assert_se(e = read_entry(de->userdata, de->entry_name));
+
+    device = e->device_valid ? e->device : "";
+    muted = e->muted_valid ? e->muted : FALSE;
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, entry_property_handlers[ENTRY_PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &de->index);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, entry_property_handlers[ENTRY_PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &de->entry_name);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, entry_property_handlers[ENTRY_PROPERTY_HANDLER_DEVICE].property_name, DBUS_TYPE_STRING, &device);
+
+    pa_assert_se(dbus_message_iter_open_container(&dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter));
+
+    pa_assert_se(dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &entry_property_handlers[ENTRY_PROPERTY_HANDLER_VOLUME].property_name));
+    append_volume_variant(&dict_entry_iter, e);
+
+    pa_assert_se(dbus_message_iter_close_container(&dict_iter, &dict_entry_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, entry_property_handlers[ENTRY_PROPERTY_HANDLER_IS_MUTED].property_name, DBUS_TYPE_BOOLEAN, &muted);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+
+    dbus_message_unref(reply);
+
+    pa_xfree(e);
+}
+
+static void handle_entry_remove(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    struct dbus_entry *de = userdata;
+    pa_datum key;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(de);
+
+    key.data = de->entry_name;
+    key.size = strlen(de->entry_name);
+
+    pa_assert_se(pa_database_unset(de->userdata->database, &key) == 0);
+
+    send_entry_removed_signal(de);
+    trigger_save(de->userdata);
+
+    pa_assert_se(pa_hashmap_remove(de->userdata->dbus_entries, de->entry_name));
+    dbus_entry_free(de);
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+#endif /* HAVE_DBUS */
+
 static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) {
     struct userdata *u = userdata;
 
@@ -162,7 +1051,7 @@ static char *get_name(pa_proplist *p, const char *prefix) {
     return t;
 }
 
-static struct entry* read_entry(struct userdata *u, const char *name) {
+static struct entry *read_entry(struct userdata *u, const char *name) {
     pa_datum key, data;
     struct entry *e;
 
@@ -270,6 +1159,17 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3
     char *name;
     pa_datum key, data;
 
+    /* These are only used when D-Bus is enabled, but in order to reduce ifdef
+     * clutter these are defined here unconditionally. */
+    pa_bool_t created_new_entry = TRUE;
+    pa_bool_t device_updated = FALSE;
+    pa_bool_t volume_updated = FALSE;
+    pa_bool_t mute_updated = FALSE;
+
+#ifdef HAVE_DBUS
+    struct dbus_entry *de = NULL;
+#endif
+
     pa_assert(c);
     pa_assert(u);
 
@@ -291,23 +1191,34 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3
         if (!(name = get_name(sink_input->proplist, "sink-input")))
             return;
 
-        if ((old = read_entry(u, name)))
+        if ((old = read_entry(u, name))) {
             entry = *old;
+            created_new_entry = FALSE;
+        }
 
         if (sink_input->save_volume) {
             entry.channel_map = sink_input->channel_map;
             pa_sink_input_get_volume(sink_input, &entry.volume, FALSE);
             entry.volume_valid = TRUE;
+
+            volume_updated = !created_new_entry
+                             && (!old->volume_valid
+                                 || !pa_channel_map_equal(&entry.channel_map, &old->channel_map)
+                                 || !pa_cvolume_equal(&entry.volume, &old->volume));
         }
 
         if (sink_input->save_muted) {
             entry.muted = pa_sink_input_get_mute(sink_input);
             entry.muted_valid = TRUE;
+
+            mute_updated = !created_new_entry && (!old->muted_valid || entry.muted != old->muted);
         }
 
         if (sink_input->save_sink) {
             pa_strlcpy(entry.device, sink_input->sink->name, sizeof(entry.device));
             entry.device_valid = TRUE;
+
+            device_updated = !created_new_entry && (!old->device_valid || !pa_streq(entry.device, old->device));
         }
 
     } else {
@@ -321,12 +1232,16 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3
         if (!(name = get_name(source_output->proplist, "source-output")))
             return;
 
-        if ((old = read_entry(u, name)))
+        if ((old = read_entry(u, name))) {
             entry = *old;
+            created_new_entry = FALSE;
+        }
 
         if (source_output->save_source) {
             pa_strlcpy(entry.device, source_output->source->name, sizeof(entry.device));
             entry.device_valid = source_output->save_source;
+
+            device_updated = !created_new_entry && (!old->device_valid || !pa_streq(entry.device, old->device));
         }
     }
 
@@ -351,6 +1266,23 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3
 
     pa_database_set(u->database, &key, &data, TRUE);
 
+#ifdef HAVE_DBUS
+    if (created_new_entry) {
+        de = dbus_entry_new(u, name);
+        pa_hashmap_put(u->dbus_entries, de->entry_name, de);
+        send_new_entry_signal(de);
+    } else {
+        pa_assert((de = pa_hashmap_get(u->dbus_entries, name)));
+
+        if (device_updated)
+            send_device_updated_signal(de, &entry);
+        if (volume_updated)
+            send_volume_updated_signal(de, &entry);
+        if (mute_updated)
+            send_mute_updated_signal(de, &entry);
+    }
+#endif
+
     pa_xfree(name);
 
     trigger_save(u);
@@ -810,14 +1742,27 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
                 mode != PA_UPDATE_SET)
                 goto fail;
 
-            if (mode == PA_UPDATE_SET)
+            if (mode == PA_UPDATE_SET) {
+#ifdef HAVE_DBUS
+                struct dbus_entry *de;
+                void *state = NULL;
+
+                while ((de = pa_hashmap_iterate(u->dbus_entries, &state, NULL))) {
+                    send_entry_removed_signal(de);
+                    dbus_entry_free(pa_hashmap_remove(u->dbus_entries, de->entry_name));
+                }
+#endif
                 pa_database_clear(u->database);
+            }
 
             while (!pa_tagstruct_eof(t)) {
                 const char *name, *device;
                 pa_bool_t muted;
                 struct entry entry;
                 pa_datum key, data;
+#ifdef HAVE_DBUS
+                struct entry *old;
+#endif
 
                 pa_zero(entry);
                 entry.version = ENTRY_VERSION;
@@ -849,15 +1794,50 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
                     !pa_namereg_is_valid_name(entry.device))
                     goto fail;
 
+#ifdef HAVE_DBUS
+                old = read_entry(u, name);
+#endif
+
                 key.data = (char*) name;
                 key.size = strlen(name);
 
                 data.data = &entry;
                 data.size = sizeof(entry);
 
-                if (pa_database_set(u->database, &key, &data, mode == PA_UPDATE_REPLACE) == 0)
+                if (pa_database_set(u->database, &key, &data, mode == PA_UPDATE_REPLACE) == 0) {
+#ifdef HAVE_DBUS
+                    struct dbus_entry *de;
+
+                    if (old) {
+                        pa_assert_se((de = pa_hashmap_get(u->dbus_entries, name)));
+
+                        if ((old->device_valid != entry.device_valid)
+                            || (entry.device_valid && !pa_streq(entry.device, old->device)))
+                            send_device_updated_signal(de, &entry);
+
+                        if ((old->volume_valid != entry.volume_valid)
+                            || (entry.volume_valid
+                                && (!pa_cvolume_equal(&entry.volume, &old->volume) || !pa_channel_map_equal(&entry.channel_map, &old->channel_map))))
+                            send_volume_updated_signal(de, &entry);
+
+                        if (!old->muted_valid || (entry.muted != old->muted))
+                            send_mute_updated_signal(de, &entry);
+
+                    } else {
+                        de = dbus_entry_new(u, name);
+                        pa_assert_se(pa_hashmap_put(u->dbus_entries, de->entry_name, de));
+                        send_new_entry_signal(de);
+                    }
+#endif
+
                     if (apply_immediately)
                         apply_entry(u, name, &entry);
+                }
+
+#ifdef HAVE_DBUS
+                if (old)
+                    pa_xfree(old);
+#endif
             }
 
             trigger_save(u);
@@ -870,10 +1850,20 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
             while (!pa_tagstruct_eof(t)) {
                 const char *name;
                 pa_datum key;
+#ifdef HAVE_DBUS
+                struct dbus_entry *de;
+#endif
 
                 if (pa_tagstruct_gets(t, &name) < 0)
                     goto fail;
 
+#ifdef HAVE_DBUS
+                if ((de = pa_hashmap_get(u->dbus_entries, name))) {
+                    send_entry_removed_signal(de);
+                    dbus_entry_free(pa_hashmap_remove(u->dbus_entries, name));
+                }
+#endif
+
                 key.data = (char*) name;
                 key.size = strlen(name);
 
@@ -932,6 +1922,10 @@ int pa__init(pa_module*m) {
     pa_source_output *so;
     uint32_t idx;
     pa_bool_t restore_device = TRUE, restore_volume = TRUE, restore_muted = TRUE, on_hotplug = TRUE, on_rescue = TRUE;
+#ifdef HAVE_DBUS
+    pa_datum key;
+    pa_bool_t done;
+#endif
 
     pa_assert(m);
 
@@ -1002,6 +1996,34 @@ int pa__init(pa_module*m) {
     pa_log_info("Sucessfully opened database file '%s'.", fname);
     pa_xfree(fname);
 
+#ifdef HAVE_DBUS
+    u->dbus_protocol = pa_dbus_protocol_get(u->core);
+    u->dbus_entries = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+
+    pa_assert_se(pa_dbus_protocol_add_interface(u->dbus_protocol, OBJECT_PATH, &stream_restore_interface_info, u) >= 0);
+    pa_assert_se(pa_dbus_protocol_register_extension(u->dbus_protocol, INTERFACE_STREAM_RESTORE) >= 0);
+
+    /* Create the initial dbus entries. */
+    done = !pa_database_first(u->database, &key, NULL);
+    while (!done) {
+        pa_datum next_key;
+        char *name;
+        struct dbus_entry *de;
+
+        done = !pa_database_next(u->database, &key, &next_key, NULL);
+
+        name = pa_xstrndup(key.data, key.size);
+        pa_datum_free(&key);
+
+        de = dbus_entry_new(u, name);
+        pa_assert_se(pa_hashmap_put(u->dbus_entries, de->entry_name, de) >= 0);
+
+        pa_xfree(name);
+
+        key = next_key;
+    }
+#endif
+
     PA_IDXSET_FOREACH(si, m->core->sink_inputs, idx)
         subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_NEW, si->index, u);
 
@@ -1020,6 +2042,16 @@ fail:
     return  -1;
 }
 
+#ifdef HAVE_DBUS
+static void free_dbus_entry_cb(void *p, void *userdata) {
+    struct dbus_entry *de = p;
+
+    pa_assert(de);
+
+    dbus_entry_free(de);
+}
+#endif
+
 void pa__done(pa_module*m) {
     struct userdata* u;
 
@@ -1028,6 +2060,19 @@ void pa__done(pa_module*m) {
     if (!(u = m->userdata))
         return;
 
+#ifdef HAVE_DBUS
+    if (u->dbus_protocol) {
+        pa_assert(u->dbus_entries);
+
+        pa_assert_se(pa_dbus_protocol_unregister_extension(u->dbus_protocol, INTERFACE_STREAM_RESTORE) >= 0);
+        pa_assert_se(pa_dbus_protocol_remove_interface(u->dbus_protocol, OBJECT_PATH, stream_restore_interface_info.name) >= 0);
+
+        pa_hashmap_free(u->dbus_entries, free_dbus_entry_cb, NULL);
+
+        pa_dbus_protocol_unref(u->dbus_protocol);
+    }
+#endif
+
     if (u->subscription)
         pa_subscription_free(u->subscription);
 

commit 8966c61d3343e13502cfa210bb7123b7d7e7b27e
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Tue Aug 4 17:50:18 2009 +0300

    dbusiface-core: Make the interface string a public constant.

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index 69c1bd2..695e4a3 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -48,7 +48,6 @@
 #include "iface-core.h"
 
 #define OBJECT_PATH "/org/pulseaudio/core1"
-#define INTERFACE_CORE "org.PulseAudio.Core1"
 
 #define INTERFACE_REVISION 0
 
@@ -312,7 +311,7 @@ static pa_dbus_signal_info signals[SIGNAL_MAX] = {
 };
 
 static pa_dbus_interface_info core_interface_info = {
-    .name = INTERFACE_CORE,
+    .name = PA_DBUSIFACE_CORE_INTERFACE,
     .method_handlers = method_handlers,
     .n_method_handlers = METHOD_HANDLER_MAX,
     .property_handlers = property_handlers,
@@ -1612,7 +1611,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 if (new_fallback_sink && (device = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(new_fallback_sink->index)))) {
                     object_path = pa_dbusiface_device_get_path(device);
 
-                    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
+                    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
                     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
                     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
                     dbus_message_unref(signal);
@@ -1626,7 +1625,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 if (new_fallback_source && (device = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(new_fallback_source->index)))) {
                     object_path = pa_dbusiface_device_get_path(device);
 
-                    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
+                    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
                     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
                     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
                     dbus_message_unref(signal);
@@ -1644,7 +1643,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_card_get_path(card);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_CARD].name)));
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_CARD].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1652,7 +1651,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_card_get_path(card);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_CARD_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_CARD_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_card_free(card);
@@ -1671,7 +1670,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_device_get_path(device);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_SINK].name)));
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_SINK].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1683,7 +1682,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                      * the D-Bus sink object wasn't created yet. Now that the
                      * object is created, let's send the fallback sink change
                      * signal. */
-                    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
+                    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
                     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1696,7 +1695,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 object_path = pa_dbusiface_device_get_path(device);
                 pa_assert_se(pa_hashmap_remove(c->sinks_by_path, object_path));
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_SINK_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_SINK_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_device_free(device);
@@ -1715,7 +1714,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_device_get_path(device);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_SOURCE].name)));
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_SOURCE].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1727,7 +1726,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                      * point the D-Bus source object wasn't created yet. Now
                      * that the object is created, let's send the fallback
                      * source change signal. */
-                    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
+                    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
                     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1740,7 +1739,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 object_path = pa_dbusiface_device_get_path(device);
                 pa_assert_se(pa_hashmap_remove(c->sources_by_path, object_path));
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_SOURCE_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_SOURCE_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_device_free(device);
@@ -1756,7 +1755,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_stream_get_path(stream);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_PLAYBACK_STREAM].name)));
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_PLAYBACK_STREAM].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1764,7 +1763,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_stream_get_path(stream);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_PLAYBACK_STREAM_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_PLAYBACK_STREAM_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_stream_free(stream);
@@ -1780,7 +1779,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_stream_get_path(stream);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_RECORD_STREAM].name)));
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_RECORD_STREAM].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1788,7 +1787,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_stream_get_path(stream);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_RECORD_STREAM_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_RECORD_STREAM_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_stream_free(stream);
@@ -1804,7 +1803,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_sample_get_path(sample);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_SAMPLE].name)));
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_SAMPLE].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1812,7 +1811,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_sample_get_path(sample);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_SAMPLE_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_SAMPLE_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_sample_free(sample);
@@ -1828,7 +1827,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_module_get_path(module);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_MODULE].name)));
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_MODULE].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1836,7 +1835,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_module_get_path(module);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_MODULE_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_MODULE_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_module_free(module);
@@ -1852,7 +1851,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_client_get_path(client);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_CLIENT].name)));
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_CLIENT].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1860,7 +1859,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_client_get_path(client);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_CLIENT_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_CLIENT_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_client_free(client);
@@ -1882,7 +1881,7 @@ static pa_hook_result_t extension_registered_cb(void *hook_data, void *call_data
     pa_assert(c);
     pa_assert(ext_name);
 
-    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_NEW_EXTENSION].name)));
+    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_EXTENSION].name)));
     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_STRING, &ext_name, DBUS_TYPE_INVALID));
 
     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1899,7 +1898,7 @@ static pa_hook_result_t extension_unregistered_cb(void *hook_data, void *call_da
     pa_assert(c);
     pa_assert(ext_name);
 
-    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_CORE, signals[SIGNAL_EXTENSION_REMOVED].name)));
+    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_EXTENSION_REMOVED].name)));
     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_STRING, &ext_name, DBUS_TYPE_INVALID));
 
     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -2028,7 +2027,7 @@ static void free_client_cb(void *p, void *userdata) {
 void pa_dbusiface_core_free(pa_dbusiface_core *c) {
     pa_assert(c);
 
-    pa_dbus_protocol_remove_interface(c->dbus_protocol, OBJECT_PATH, INTERFACE_CORE);
+    pa_dbus_protocol_remove_interface(c->dbus_protocol, OBJECT_PATH, core_interface_info.name);
 
     pa_subscription_free(c->subscription);
     pa_hashmap_free(c->cards, free_card_cb, NULL);
diff --git a/src/modules/dbus/iface-core.h b/src/modules/dbus/iface-core.h
index 964a37b..6c5191b 100644
--- a/src/modules/dbus/iface-core.h
+++ b/src/modules/dbus/iface-core.h
@@ -30,6 +30,8 @@
 
 #include <pulsecore/core.h>
 
+#define PA_DBUSIFACE_CORE_INTERFACE "org.PulseAudio.Core1"
+
 typedef struct pa_dbusiface_core pa_dbusiface_core;
 
 pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core);

commit b1578e27b62e7332111bb706f79858b0866029e3
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Tue Aug 4 17:55:10 2009 +0300

    dbus-protocol, dbusiface-core: Take a reference when storing the core pointer.

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index 695e4a3..ca9ba58 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -1923,7 +1923,7 @@ pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core) {
     pa_assert(core);
 
     c = pa_xnew(pa_dbusiface_core, 1);
-    c->core = core;
+    c->core = pa_core_ref(core);
     c->subscription = pa_subscription_new(core, PA_SUBSCRIPTION_MASK_ALL, subscription_cb, c);
     c->dbus_protocol = pa_dbus_protocol_get(core);
     c->cards = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
@@ -2044,6 +2044,7 @@ void pa_dbusiface_core_free(pa_dbusiface_core *c) {
     pa_hook_slot_free(c->extension_unregistered_slot);
 
     pa_dbus_protocol_unref(c->dbus_protocol);
+    pa_core_unref(c->core);
 
     pa_xfree(c);
 }
diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index 475b952..8fc0803 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -117,7 +117,7 @@ static pa_dbus_protocol *dbus_protocol_new(pa_core *c) {
 
     p = pa_xnew(pa_dbus_protocol, 1);
     PA_REFCNT_INIT(p);
-    p->core = c;
+    p->core = pa_core_ref(c);
     p->objects = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
     p->connections = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
     p->extensions = pa_idxset_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
@@ -170,6 +170,8 @@ void pa_dbus_protocol_unref(pa_dbus_protocol *p) {
 
     pa_assert_se(pa_shared_remove(p->core, "dbus-protocol") >= 0);
 
+    pa_core_unref(p->core);
+
     pa_xfree(p);
 }
 

commit 9eeb8eb2729cdc77fa98c704eb8fc7fcca15336b
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Tue Aug 4 17:57:44 2009 +0300

    dbus-protocol: Make debug logging saner.

diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index 8fc0803..c82bb5f 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -308,7 +308,6 @@ static enum find_result_t find_handler_by_method(struct object_entry *obj_entry,
             return FOUND_METHOD;
     }
 
-    pa_log("find_handler_by_method() failed.");
     return NO_SUCH_METHOD;
 }
 
@@ -331,7 +330,6 @@ static enum find_result_t find_handler_from_properties_call(struct object_entry
             if ((*iface_entry = pa_hashmap_get(obj_entry->interfaces, interface)))
                 return FOUND_GET_ALL;
             else {
-                pa_log("GetAll message has unknown interface: %s", interface);
                 return NO_SUCH_METHOD; /* XXX: NO_SUCH_INTERFACE or something like that might be more accurate. */
             }
         } else {
@@ -418,7 +416,10 @@ static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessa
     if (dbus_message_get_type(message) != DBUS_MESSAGE_TYPE_METHOD_CALL)
         return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
 
-    pa_log("Received method call: destination = %s, name = %s, iface = %s", dbus_message_get_path(message), dbus_message_get_member(message), dbus_message_get_interface(message));
+    pa_log_debug("Received message: destination = %s, interface = %s, member = %s",
+                 dbus_message_get_path(message),
+                 dbus_message_get_interface(message),
+                 dbus_message_get_member(message));
 
     pa_assert_se((obj_entry = pa_hashmap_get(p->objects, dbus_message_get_path(message))));
 
@@ -428,8 +429,6 @@ static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessa
         pa_assert_se(dbus_message_append_args(reply, DBUS_TYPE_STRING, &obj_entry->introspection, DBUS_TYPE_INVALID));
         pa_assert_se(dbus_connection_send(connection, reply, NULL));
 
-        pa_log_debug("%s.Introspect handled.", obj_entry->path);
-
         goto finish;
     }
 
@@ -633,7 +632,7 @@ int pa_dbus_protocol_add_interface(pa_dbus_protocol *p,
     if (obj_entry_created)
         register_object(p, obj_entry);
 
-    pa_log("Interface %s added for object %s. GetAll callback? %s", iface_entry->name, obj_entry->path, iface_entry->get_all_properties_cb ? "yes" : "no");
+    pa_log_debug("Interface %s added for object %s", iface_entry->name, obj_entry->path);
 
     return 0;
 

commit 0fc055226c60fa7429abf80e38f40a565f9e7922
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Tue Aug 4 18:00:08 2009 +0300

    dbus-protocol: Remove erroneous protocol object unref.

diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index c82bb5f..0609867 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -639,7 +639,6 @@ int pa_dbus_protocol_add_interface(pa_dbus_protocol *p,
 fail:
     if (obj_entry_created) {
         pa_hashmap_remove(p->objects, path);
-        pa_dbus_protocol_unref(p);
         pa_xfree(obj_entry);
     }
 

commit 44770c59e92f49288341afe8646d8bc39eb9f589
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Tue Aug 4 18:01:26 2009 +0300

    dbusiface-memstats: Implement the Memstats D-Bus interface.

diff --git a/src/Makefile.am b/src/Makefile.am
index 07f81a6..e10b4ab 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1281,6 +1281,7 @@ module_dbus_protocol_la_SOURCES = \
 		modules/dbus/iface-client.c modules/dbus/iface-client.h \
 		modules/dbus/iface-core.c modules/dbus/iface-core.h \
 		modules/dbus/iface-device.c modules/dbus/iface-device.h \
+		modules/dbus/iface-memstats.c modules/dbus/iface-memstats.h \
 		modules/dbus/iface-module.c modules/dbus/iface-module.h \
 		modules/dbus/iface-sample.c modules/dbus/iface-sample.h \
 		modules/dbus/iface-stream.c modules/dbus/iface-stream.h \
diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index ca9ba58..ad729f9 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -41,6 +41,7 @@
 #include "iface-card.h"
 #include "iface-client.h"
 #include "iface-device.h"
+#include "iface-memstats.h"
 #include "iface-module.h"
 #include "iface-sample.h"
 #include "iface-stream.h"
@@ -114,6 +115,8 @@ struct pa_dbusiface_core {
 
     pa_hook_slot *extension_registered_slot;
     pa_hook_slot *extension_unregistered_slot;
+
+    pa_dbusiface_memstats *memstats;
 };
 
 enum property_handler_index {
@@ -1940,6 +1943,7 @@ pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core) {
     c->fallback_source = pa_namereg_get_default_source(core);
     c->extension_registered_slot = pa_dbus_protocol_hook_connect(c->dbus_protocol, PA_DBUS_PROTOCOL_HOOK_EXTENSION_REGISTERED, PA_HOOK_NORMAL, extension_registered_cb, c);
     c->extension_unregistered_slot = pa_dbus_protocol_hook_connect(c->dbus_protocol, PA_DBUS_PROTOCOL_HOOK_EXTENSION_UNREGISTERED, PA_HOOK_NORMAL, extension_unregistered_cb, c);
+    c->memstats = pa_dbusiface_memstats_new(core, OBJECT_PATH);
 
     for (card = pa_idxset_first(core->cards, &idx); card; card = pa_idxset_next(core->cards, &idx))
         pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), pa_dbusiface_card_new(card, OBJECT_PATH));
@@ -2042,6 +2046,7 @@ void pa_dbusiface_core_free(pa_dbusiface_core *c) {
     pa_hashmap_free(c->clients, free_client_cb, NULL);
     pa_hook_slot_free(c->extension_registered_slot);
     pa_hook_slot_free(c->extension_unregistered_slot);
+    pa_dbusiface_memstats_free(c->memstats);
 
     pa_dbus_protocol_unref(c->dbus_protocol);
     pa_core_unref(c->core);
diff --git a/src/modules/dbus/iface-memstats.c b/src/modules/dbus/iface-memstats.c
new file mode 100644
index 0000000..d3412a2
--- /dev/null
+++ b/src/modules/dbus/iface-memstats.c
@@ -0,0 +1,231 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <dbus/dbus.h>
+
+#include <pulsecore/core-scache.h>
+#include <pulsecore/core-util.h>
+#include <pulsecore/dbus-util.h>
+#include <pulsecore/protocol-dbus.h>
+
+#include "iface-memstats.h"
+
+#define OBJECT_NAME "memstats"
+
+static void handle_get_current_memblocks(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_current_memblocks_size(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_accumulated_memblocks(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_accumulated_memblocks_size(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_sample_cache_size(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+struct pa_dbusiface_memstats {
+    pa_core *core;
+    char *path;
+    pa_dbus_protocol *dbus_protocol;
+};
+
+enum property_handler_index {
+    PROPERTY_HANDLER_CURRENT_MEMBLOCKS,
+    PROPERTY_HANDLER_CURRENT_MEMBLOCKS_SIZE,
+    PROPERTY_HANDLER_ACCUMULATED_MEMBLOCKS,
+    PROPERTY_HANDLER_ACCUMULATED_MEMBLOCKS_SIZE,
+    PROPERTY_HANDLER_SAMPLE_CACHE_SIZE,
+    PROPERTY_HANDLER_MAX
+};
+
+static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
+    [PROPERTY_HANDLER_CURRENT_MEMBLOCKS]          = { .property_name = "CurrentMemblocks",         .type = "u", .get_cb = handle_get_current_memblocks,          .set_cb = NULL },
+    [PROPERTY_HANDLER_CURRENT_MEMBLOCKS_SIZE]     = { .property_name = "CurrentMemblocksSize",     .type = "u", .get_cb = handle_get_current_memblocks_size,     .set_cb = NULL },
+    [PROPERTY_HANDLER_ACCUMULATED_MEMBLOCKS]      = { .property_name = "AccumulatedMemblocks",     .type = "u", .get_cb = handle_get_accumulated_memblocks,      .set_cb = NULL },
+    [PROPERTY_HANDLER_ACCUMULATED_MEMBLOCKS_SIZE] = { .property_name = "AccumulatedMemblocksSize", .type = "u", .get_cb = handle_get_accumulated_memblocks_size, .set_cb = NULL },
+    [PROPERTY_HANDLER_SAMPLE_CACHE_SIZE]          = { .property_name = "SampleCacheSize",          .type = "u", .get_cb = handle_get_sample_cache_size,          .set_cb = NULL }
+};
+
+static pa_dbus_interface_info memstats_interface_info = {
+    .name = PA_DBUSIFACE_MEMSTATS_INTERFACE,
+    .method_handlers = NULL,
+    .n_method_handlers = 0,
+    .property_handlers = property_handlers,
+    .n_property_handlers = PROPERTY_HANDLER_MAX,
+    .get_all_properties_cb = handle_get_all,
+    .signals = NULL,
+    .n_signals = 0
+};
+
+static void handle_get_current_memblocks(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_memstats *m = userdata;
+    const pa_mempool_stat *stat;
+    dbus_uint32_t current_memblocks;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(m);
+
+    stat = pa_mempool_get_stat(m->core->mempool);
+
+    current_memblocks = pa_atomic_load(&stat->n_allocated);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &current_memblocks);
+}
+
+static void handle_get_current_memblocks_size(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_memstats *m = userdata;
+    const pa_mempool_stat *stat;
+    dbus_uint32_t current_memblocks_size;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(m);
+
+    stat = pa_mempool_get_stat(m->core->mempool);
+
+    current_memblocks_size = pa_atomic_load(&stat->allocated_size);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &current_memblocks_size);
+}
+
+static void handle_get_accumulated_memblocks(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_memstats *m = userdata;
+    const pa_mempool_stat *stat;
+    dbus_uint32_t accumulated_memblocks;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(m);
+
+    stat = pa_mempool_get_stat(m->core->mempool);
+
+    accumulated_memblocks = pa_atomic_load(&stat->n_accumulated);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &accumulated_memblocks);
+}
+
+static void handle_get_accumulated_memblocks_size(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_memstats *m = userdata;
+    const pa_mempool_stat *stat;
+    dbus_uint32_t accumulated_memblocks_size;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(m);
+
+    stat = pa_mempool_get_stat(m->core->mempool);
+
+    accumulated_memblocks_size = pa_atomic_load(&stat->accumulated_size);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &accumulated_memblocks_size);
+}
+
+static void handle_get_sample_cache_size(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_memstats *m = userdata;
+    dbus_uint32_t sample_cache_size;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(m);
+
+    sample_cache_size = pa_scache_total_size(m->core);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &sample_cache_size);
+}
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_memstats *m = userdata;
+    const pa_mempool_stat *stat;
+    dbus_uint32_t current_memblocks;
+    dbus_uint32_t current_memblocks_size;
+    dbus_uint32_t accumulated_memblocks;
+    dbus_uint32_t accumulated_memblocks_size;
+    dbus_uint32_t sample_cache_size;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(m);
+
+    stat = pa_mempool_get_stat(m->core->mempool);
+
+    current_memblocks = pa_atomic_load(&stat->n_allocated);
+    current_memblocks_size = pa_atomic_load(&stat->allocated_size);
+    accumulated_memblocks = pa_atomic_load(&stat->n_accumulated);
+    accumulated_memblocks_size = pa_atomic_load(&stat->accumulated_size);
+    sample_cache_size = pa_scache_total_size(m->core);
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CURRENT_MEMBLOCKS].property_name, DBUS_TYPE_UINT32, &current_memblocks);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CURRENT_MEMBLOCKS_SIZE].property_name, DBUS_TYPE_UINT32, &current_memblocks_size);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_ACCUMULATED_MEMBLOCKS].property_name, DBUS_TYPE_UINT32, &accumulated_memblocks);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_ACCUMULATED_MEMBLOCKS_SIZE].property_name, DBUS_TYPE_UINT32, &accumulated_memblocks_size);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLE_CACHE_SIZE].property_name, DBUS_TYPE_UINT32, &sample_cache_size);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+
+    dbus_message_unref(reply);
+}
+
+pa_dbusiface_memstats *pa_dbusiface_memstats_new(pa_core *core, const char *path_prefix) {
+    pa_dbusiface_memstats *m;
+
+    pa_assert(core);
+    pa_assert(path_prefix);
+
+    m = pa_xnew(pa_dbusiface_memstats, 1);
+    m->core = pa_core_ref(core);
+    m->path = pa_sprintf_malloc("%s/%s", path_prefix, OBJECT_NAME);
+    m->dbus_protocol = pa_dbus_protocol_get(core);
+
+    pa_assert_se(pa_dbus_protocol_add_interface(m->dbus_protocol, m->path, &memstats_interface_info, m) >= 0);
+
+    return m;
+}
+
+void pa_dbusiface_memstats_free(pa_dbusiface_memstats *m) {
+    pa_assert(m);
+
+    pa_assert_se(pa_dbus_protocol_remove_interface(m->dbus_protocol, m->path, memstats_interface_info.name) >= 0);
+
+    pa_xfree(m->path);
+
+    pa_dbus_protocol_unref(m->dbus_protocol);
+    pa_core_unref(m->core);
+
+    pa_xfree(m);
+}
+
+const char *pa_dbusiface_memstats_get_path(pa_dbusiface_memstats *m) {
+    pa_assert(m);
+
+    return m->path;
+}
diff --git a/src/modules/dbus/iface-memstats.h b/src/modules/dbus/iface-memstats.h
new file mode 100644
index 0000000..d7773ee
--- /dev/null
+++ b/src/modules/dbus/iface-memstats.h
@@ -0,0 +1,44 @@
+#ifndef foodbusifacememstatshfoo
+#define foodbusifacememstatshfoo
+
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+/* This object implements the D-Bus interface org.PulseAudio.Core1.Memstats.
+ *
+ * See http://pulseaudio.org/wiki/DBusInterface for the Memstats interface
+ * documentation.
+ */
+
+#include <pulsecore/core.h>
+
+#include "iface-core.h"
+
+#define PA_DBUSIFACE_MEMSTATS_INTERFACE PA_DBUSIFACE_CORE_INTERFACE ".Memstats"
+
+typedef struct pa_dbusiface_memstats pa_dbusiface_memstats;
+
+pa_dbusiface_memstats *pa_dbusiface_memstats_new(pa_core *core, const char *path_prefix);
+void pa_dbusiface_memstats_free(pa_dbusiface_memstats *m);
+
+const char *pa_dbusiface_memstats_get_path(pa_dbusiface_memstats *m);
+
+#endif

commit 8eaa40b6f4cae749610770c85ba500f326d59b50
Author: zbt <huan.zheng at intel.com>
Date:   Thu Jul 16 10:41:07 2009 +0800

    Add volume ramping feature - envelop fix

diff --git a/src/pulsecore/envelope.c b/src/pulsecore/envelope.c
index fd6a948..0eca811 100644
--- a/src/pulsecore/envelope.c
+++ b/src/pulsecore/envelope.c
@@ -177,7 +177,7 @@ static int32_t item_get_int(pa_envelope_item *i, pa_usec_t x) {
 
     pa_assert(i->j > 0);
     pa_assert(i->def->points_x[i->j-1] <= x);
-    pa_assert(x < i->def->points_x[i->j]);
+    pa_assert(x <= i->def->points_x[i->j]);
 
     return linear_interpolate_int(i->def->points_x[i->j-1], i->def->points_y.i[i->j-1],
                                   i->def->points_x[i->j], i->def->points_y.i[i->j], x);
@@ -200,7 +200,7 @@ static float item_get_float(pa_envelope_item *i, pa_usec_t x) {
 
     pa_assert(i->j > 0);
     pa_assert(i->def->points_x[i->j-1] <= x);
-    pa_assert(x < i->def->points_x[i->j]);
+    pa_assert(x <= i->def->points_x[i->j]);
 
     return linear_interpolate_float(i->def->points_x[i->j-1], i->def->points_y.f[i->j-1],
                                     i->def->points_x[i->j], i->def->points_y.f[i->j], x);
@@ -550,7 +550,7 @@ static int32_t linear_get_int(pa_envelope *e, int v) {
         e->points[v].cached_valid = TRUE;
     }
 
-    return e->points[v].y.i[e->points[v].n_current] + (e->points[v].cached_dy_i * (int32_t) (e->x - e->points[v].x[e->points[v].n_current])) / (int32_t) e->points[v].cached_dx;
+	return e->points[v].y.i[e->points[v].n_current] + ((float)e->points[v].cached_dy_i * (int32_t) (e->x - e->points[v].x[e->points[v].n_current])) / (int32_t) e->points[v].cached_dx;
 }
 
 static float linear_get_float(pa_envelope *e, int v) {
@@ -597,34 +597,60 @@ void pa_envelope_apply(pa_envelope *e, pa_memchunk *chunk) {
         fs = pa_frame_size(&e->sample_spec);
         n = chunk->length;
 
+        pa_log_debug("Envelop position %d applying factor %d=%f, sample spec is %d, chunk's length is %d, fs is %d\n", e->x, linear_get_int(e, v), ((float) linear_get_int(e,v))/0x10000, e->sample_spec.format, n, fs);
+
         switch (e->sample_spec.format) {
 
             case PA_SAMPLE_U8: {
-                uint8_t *t;
+                uint8_t *d, *s;
+                unsigned channel;
+                int32_t factor = linear_get_int(e, v);
 
-                for (t = p; n > 0; n -= fs) {
-                    int32_t factor = linear_get_int(e, v);
-                    unsigned c;
-                    e->x += fs;
+                s = (uint8_t*) p + n;
 
-                    for (c = 0; c < e->sample_spec.channels; c++, t++)
-                        *t = (uint8_t) (((factor * ((int16_t) *t - 0x80)) / 0x10000) + 0x80);
+                for (channel = 0, d = p; d < s; d++) {
+                    int32_t t, hi, lo;
+
+                    hi = factor >> 16;
+                    lo = factor & 0xFFFF;
+
+                    t = (int32_t) *d - 0x80;
+                    t = ((t * lo) >> 16) + (t * hi);
+                    t = PA_CLAMP_UNLIKELY(t, -0x80, 0x7F);
+                    *d = (uint8_t) (t + 0x80);
+
+                    if (PA_UNLIKELY(++channel >= e->sample_spec.channels)) {
+                        channel = 0;
+                        e->x += fs;
+                        factor = linear_get_int(e, v);
+                    }
                 }
 
                 break;
             }
 
             case PA_SAMPLE_ULAW: {
-                uint8_t *t;
+                uint8_t *d, *s;
+                unsigned channel;
+                int32_t factor = linear_get_int(e, v);
 
-                for (t = p; n > 0; n -= fs) {
-                    int32_t factor = linear_get_int(e, v);
-                    unsigned c;
-                    e->x += fs;
+                s = (uint8_t*) p + n;
 
-                    for (c = 0; c < e->sample_spec.channels; c++, t++) {
-                        int16_t k = st_ulaw2linear16(*t);
-                        *t = (uint8_t) st_14linear2ulaw((int16_t) (((factor * k) / 0x10000) >> 2));
+                for (channel = 0, d = p; d < s; d++) {
+                    int32_t t, hi, lo;
+
+                    hi = factor >> 16;
+                    lo = factor & 0xFFFF;
+
+                    t = (int32_t) st_ulaw2linear16(*d);
+                    t = ((t * lo) >> 16) + (t * hi);
+                    t = PA_CLAMP_UNLIKELY(t, -0x8000, 0x7FFF);
+                    *d = (uint8_t) st_14linear2ulaw((int16_t) t >> 2);
+
+                     if (PA_UNLIKELY(++channel >= e->sample_spec.channels)) {
+                        channel = 0;
+                        e->x += fs;
+                        factor = linear_get_int(e, v);
                     }
                 }
 
@@ -632,16 +658,27 @@ void pa_envelope_apply(pa_envelope *e, pa_memchunk *chunk) {
             }
 
             case PA_SAMPLE_ALAW: {
-                uint8_t *t;
+                uint8_t *d, *s;
+                unsigned channel;
+                int32_t factor = linear_get_int(e, v);
 
-                for (t = p; n > 0; n -= fs) {
-                    int32_t factor = linear_get_int(e, v);
-                    unsigned c;
-                    e->x += fs;
+                s = (uint8_t*) p + n;
 
-                    for (c = 0; c < e->sample_spec.channels; c++, t++) {
-                        int16_t k = st_alaw2linear16(*t);
-                        *t = (uint8_t) st_13linear2alaw((int16_t) (((factor * k) / 0x10000) >> 3));
+                for (channel = 0, d = p; d < s; d++) {
+                    int32_t t, hi, lo;
+
+                    hi = factor >> 16;
+                    lo = factor & 0xFFFF;
+
+                    t = (int32_t) st_alaw2linear16(*d);
+                    t = ((t * lo) >> 16) + (t * hi);
+                    t = PA_CLAMP_UNLIKELY(t, -0x8000, 0x7FFF);
+                    *d = (uint8_t) st_13linear2alaw((int16_t) t >> 3);
+
+                    if (PA_UNLIKELY(++channel >= e->sample_spec.channels)) {
+                        channel = 0;
+                        e->x += fs;
+                        factor = linear_get_int(e, v);
                     }
                 }
 
@@ -649,31 +686,55 @@ void pa_envelope_apply(pa_envelope *e, pa_memchunk *chunk) {
             }
 
             case PA_SAMPLE_S16NE: {
-                int16_t *t;
+                int16_t *d, *s;
+                unsigned channel;
+                int32_t factor = linear_get_int(e, v);
 
-                for (t = p; n > 0; n -= fs) {
-                    int32_t factor = linear_get_int(e, v);
-                    unsigned c;
-                    e->x += fs;
+                s = (int16_t*) p + n/sizeof(int16_t);
 
-                    for (c = 0; c < e->sample_spec.channels; c++, t++)
-                        *t = (int16_t) ((factor * *t) / 0x10000);
+                for (channel = 0, d = p; d < s; d++) {
+                    int32_t t, hi, lo;
+
+                    hi = factor >> 16;
+                    lo = factor & 0xFFFF;
+
+                    t = (int32_t)(*d);
+                    t = ((t * lo) >> 16) + (t * hi);
+                    t = PA_CLAMP_UNLIKELY(t, -0x8000, 0x7FFF);
+                    *d = (int16_t) t;
+
+                    if (PA_UNLIKELY(++channel >= e->sample_spec.channels)) {
+                        channel = 0;
+                        e->x += fs;
+                        factor = linear_get_int(e, v);
+                    }
                 }
 
                 break;
             }
 
             case PA_SAMPLE_S16RE: {
-                int16_t *t;
+                int16_t *d, *s;
+                unsigned channel;
+                int32_t factor = linear_get_int(e, v);
 
-                for (t = p; n > 0; n -= fs) {
-                    int32_t factor = linear_get_int(e, v);
-                    unsigned c;
-                    e->x += fs;
+                s = (int16_t*) p + n/sizeof(int16_t);
 
-                    for (c = 0; c < e->sample_spec.channels; c++, t++) {
-                        int16_t r = (int16_t) ((factor * PA_INT16_SWAP(*t)) / 0x10000);
-                        *t = PA_INT16_SWAP(r);
+                for (channel = 0, d = p; d < s; d++) {
+                    int32_t t, hi, lo;
+
+                    hi = factor >> 16;
+                    lo = factor & 0xFFFF;
+
+                    t = (int32_t) PA_INT16_SWAP(*d);
+                    t = ((t * lo) >> 16) + (t * hi);
+                    t = PA_CLAMP_UNLIKELY(t, -0x8000, 0x7FFF);
+                    *d = PA_INT16_SWAP((int16_t) t);
+
+                    if (PA_UNLIKELY(++channel >= e->sample_spec.channels)) {
+                        channel = 0;
+                        e->x += fs;
+                        factor = linear_get_int(e, v);
                     }
                 }
 
@@ -681,31 +742,49 @@ void pa_envelope_apply(pa_envelope *e, pa_memchunk *chunk) {
             }
 
             case PA_SAMPLE_S32NE: {
-                int32_t *t;
+                int32_t *d, *s;
+                unsigned channel;
+                int32_t factor = linear_get_int(e, v);
 
-                for (t = p; n > 0; n -= fs) {
-                    int32_t factor = linear_get_int(e, v);
-                    unsigned c;
-                    e->x += fs;
+                s = (int32_t*) p + n/sizeof(int32_t);
 
-                    for (c = 0; c < e->sample_spec.channels; c++, t++)
-                        *t = (int32_t) (((int64_t) factor * (int64_t) *t) / 0x10000);
+                for (channel = 0, d = p; d < s; d++) {
+                    int64_t t;
+
+                    t = (int64_t)(*d);
+                    t = (t * factor) >> 16;
+                    t = PA_CLAMP_UNLIKELY(t, -0x80000000LL, 0x7FFFFFFFLL);
+                    *d = (int32_t) t;
+
+                    if (PA_UNLIKELY(++channel >= e->sample_spec.channels)) {
+                        channel = 0;
+                        e->x += fs;
+                        factor = linear_get_int(e, v);
+                    }
                 }
 
                 break;
             }
 
             case PA_SAMPLE_S32RE: {
-                int32_t *t;
+                int32_t *d, *s;
+                unsigned channel;
+                int32_t factor = linear_get_int(e, v);
 
-                for (t = p; n > 0; n -= fs) {
-                    int32_t factor = linear_get_int(e, v);
-                    unsigned c;
-                    e->x += fs;
+                s = (int32_t*) p + n/sizeof(int32_t);
 
-                    for (c = 0; c < e->sample_spec.channels; c++, t++) {
-                        int32_t r = (int32_t) (((int64_t) factor * (int64_t) PA_INT32_SWAP(*t)) / 0x10000);
-                        *t = PA_INT32_SWAP(r);
+                for (channel = 0, d = p; d < s; d++) {
+                    int64_t t;
+
+                    t = (int64_t) PA_INT32_SWAP(*d);
+                    t = (t * factor) >> 16;
+                    t = PA_CLAMP_UNLIKELY(t, -0x80000000LL, 0x7FFFFFFFLL);
+                    *d = PA_INT32_SWAP((int32_t) t);
+
+                    if (PA_UNLIKELY(++channel >= e->sample_spec.channels)) {
+                        channel = 0;
+                        e->x += fs;
+                        factor = linear_get_int(e, v);
                     }
                 }
 
@@ -713,6 +792,7 @@ void pa_envelope_apply(pa_envelope *e, pa_memchunk *chunk) {
             }
 
             case PA_SAMPLE_FLOAT32NE: {
+            /*Seems the FLOAT32NE part of pa_volume_memchunk not right, do not reuse here*/
                 float *t;
 
                 for (t = p; n > 0; n -= fs) {
@@ -728,6 +808,7 @@ void pa_envelope_apply(pa_envelope *e, pa_memchunk *chunk) {
             }
 
             case PA_SAMPLE_FLOAT32RE: {
+            /*Seems the FLOAT32RE part of pa_volume_memchunk not right, do not reuse here*/
                 float *t;
 
                 for (t = p; n > 0; n -= fs) {
@@ -744,10 +825,101 @@ void pa_envelope_apply(pa_envelope *e, pa_memchunk *chunk) {
                 break;
             }
 
-            case PA_SAMPLE_S24LE:
-            case PA_SAMPLE_S24BE:
-            case PA_SAMPLE_S24_32LE:
-            case PA_SAMPLE_S24_32BE:
+            case PA_SAMPLE_S24NE: {
+                uint8_t *d, *s;
+                unsigned channel;
+                int32_t factor = linear_get_int(e, v);
+
+                s = (uint8_t*) p + n/3;
+
+                for (channel = 0, d = p; d < s; d++) {
+                    int64_t t;
+
+                    t = (int64_t)((int32_t) (PA_READ24NE(d) << 8));
+                    t = (t * factor) >> 16;
+                    t = PA_CLAMP_UNLIKELY(t, -0x80000000LL, 0x7FFFFFFFLL);
+                    PA_WRITE24NE(d, ((uint32_t) (int32_t) t) >> 8);
+
+                    if (PA_UNLIKELY(++channel >= e->sample_spec.channels)) {
+                            channel = 0;
+                            e->x += fs;
+                            factor = linear_get_int(e, v);
+                    }
+                }
+
+                break;
+            }
+            case PA_SAMPLE_S24RE: {
+                uint8_t *d, *s;
+                unsigned channel;
+                int32_t factor = linear_get_int(e, v);
+
+                s = (uint8_t*) p + n/3;
+
+                for (channel = 0, d = p; d < s; d++) {
+                    int64_t t;
+
+                    t = (int64_t)((int32_t) (PA_READ24RE(d) << 8));
+                    t = (t * factor) >> 16;
+                    t = PA_CLAMP_UNLIKELY(t, -0x80000000LL, 0x7FFFFFFFLL);
+                    PA_WRITE24RE(d, ((uint32_t) (int32_t) t) >> 8);
+
+                    if (PA_UNLIKELY(++channel >= e->sample_spec.channels)) {
+                            channel = 0;
+                            e->x += fs;
+                            factor = linear_get_int(e, v);
+                    }
+                }
+
+                break;
+            }
+            case PA_SAMPLE_S24_32NE: {
+                uint32_t *d, *s;
+                unsigned channel;
+                int32_t factor = linear_get_int(e, v);
+
+                s = (uint32_t*) p + n/sizeof(uint32_t);
+
+                for (channel = 0, d = p; d < s; d++) {
+                    int64_t t;
+
+                    t = (int64_t) ((int32_t) (*d << 8));
+                    t = (t * factor) >> 16;
+                    t = PA_CLAMP_UNLIKELY(t, -0x80000000LL, 0x7FFFFFFFLL);
+                    *d = ((uint32_t) ((int32_t) t)) >> 8;
+
+                    if (PA_UNLIKELY(++channel >= e->sample_spec.channels)) {
+                            channel = 0;
+                            e->x += fs;
+                            factor = linear_get_int(e, v);
+                    }
+                }
+
+                break;
+            }
+            case PA_SAMPLE_S24_32RE: {
+                uint32_t *d, *s;
+                unsigned channel;
+                int32_t factor = linear_get_int(e, v);
+
+                s = (uint32_t*) p + n/sizeof(uint32_t);
+
+                for (channel = 0, d = p; d < s; d++) {
+                    int64_t t;
+
+                    t = (int64_t) ((int32_t) (PA_UINT32_SWAP(*d) << 8));
+                    t = (t * factor) >> 16;
+                    t = PA_CLAMP_UNLIKELY(t, -0x80000000LL, 0x7FFFFFFFLL);
+                    *d = PA_UINT32_SWAP(((uint32_t) ((int32_t) t)) >> 8);
+
+                    if (PA_UNLIKELY(++channel >= e->sample_spec.channels)) {
+                            channel = 0;
+                            e->x += fs;
+                            factor = linear_get_int(e, v);
+                    }
+                }
+                break;
+            }
                 /* FIXME */
                 pa_assert_not_reached();
 
@@ -757,8 +929,6 @@ void pa_envelope_apply(pa_envelope *e, pa_memchunk *chunk) {
         }
 
         pa_memblock_release(chunk->memblock);
-
-        e->x += chunk->length;
     } else {
         /* When we have no envelope to apply we reset our origin */
         e->x = 0;
@@ -774,13 +944,48 @@ void pa_envelope_rewind(pa_envelope *e, size_t n_bytes) {
 
     envelope_begin_read(e, &v);
 
-    if (n_bytes < e->x)
-        e->x -= n_bytes;
+    if (e->x - n_bytes <= e->points[v].x[0])
+        e->x = e->points[v].x[0];
     else
-        e->x = 0;
+        e->x -= n_bytes;
 
     e->points[v].n_current = 0;
     e->points[v].cached_valid = FALSE;
 
     envelope_commit_read(e, v);
 }
+
+void pa_envelope_restart(pa_envelope* e) {
+    int v;
+    pa_assert(e);
+
+    envelope_begin_read(e, &v);
+    e->x = e->points[v].x[0];
+    envelope_commit_read(e, v);
+}
+
+pa_bool_t pa_envelope_is_finished(pa_envelope* e) {
+    pa_assert(e);
+
+    int v;
+    pa_bool_t finished;
+
+    envelope_begin_read(e, &v);
+    finished = (e->x >=  e->points[v].x[e->points[v].n_points-1]);
+    envelope_commit_read(e, v);
+
+    return finished;
+}
+
+int32_t pa_envelope_length(pa_envelope *e) {
+    pa_assert(e);
+
+    int v;
+    size_t size;
+
+    envelope_begin_read(e, &v);
+    size = e->points[v].x[e->points[v].n_points-1] - e->points[v].x[0];
+    envelope_commit_read(e, v);
+
+    return size;
+}
diff --git a/src/pulsecore/envelope.h b/src/pulsecore/envelope.h
index 5296415..4fa3657 100644
--- a/src/pulsecore/envelope.h
+++ b/src/pulsecore/envelope.h
@@ -49,5 +49,8 @@ pa_envelope_item *pa_envelope_replace(pa_envelope *e, pa_envelope_item *i, const
 void pa_envelope_remove(pa_envelope *e, pa_envelope_item *i);
 void pa_envelope_apply(pa_envelope *e, pa_memchunk *chunk);
 void pa_envelope_rewind(pa_envelope *e, size_t n_bytes);
+void pa_envelope_restart(pa_envelope* e);
+pa_bool_t pa_envelope_is_finished(pa_envelope* e);
+int32_t pa_envelope_length(pa_envelope *e);
 
 #endif

commit 5318eb35ef3f91836084382a4f3d5ef08d322554
Author: zbt <huan.zheng at intel.com>
Date:   Thu Jul 16 10:41:34 2009 +0800

    Add volume ramping feature - sink-input modification

diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index a5f9635..2acaa08 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -38,6 +38,7 @@
 #include <pulsecore/play-memblockq.h>
 #include <pulsecore/namereg.h>
 #include <pulsecore/core-util.h>
+#include <pulse/timeval.h>
 
 #include "sink-input.h"
 
@@ -47,6 +48,11 @@
 static PA_DEFINE_CHECK_TYPE(pa_sink_input, pa_msgobject);
 
 static void sink_input_free(pa_object *o);
+static void sink_input_set_ramping_info(pa_sink_input* i, pa_volume_t  pre_virtual_volume, pa_volume_t target_virtual_volume, pa_usec_t t);
+static void sink_input_set_ramping_info_for_mute(pa_sink_input* i, pa_bool_t mute, pa_usec_t t);
+static void sink_input_volume_ramping(pa_sink_input* i, pa_memchunk* chunk);
+static void sink_input_rewind_ramp_info(pa_sink_input *i, size_t nbytes);
+static void sink_input_release_envelope(pa_sink_input *i);
 
 pa_sink_input_new_data* pa_sink_input_new_data_init(pa_sink_input_new_data *data) {
     pa_assert(data);
@@ -301,6 +307,16 @@ int pa_sink_input_new(
     reset_callbacks(i);
     i->userdata = NULL;
 
+    /* Set Ramping info */
+    i->thread_info.ramp_info.is_ramping = FALSE;
+    i->thread_info.ramp_info.envelope_dead = TRUE;
+    i->thread_info.ramp_info.envelope = NULL;
+    i->thread_info.ramp_info.item = NULL;
+    i->thread_info.ramp_info.envelope_dying = 0;
+
+    pa_atomic_store(&i->before_ramping_v, 0);
+    pa_atomic_store(&i->before_ramping_m, 0);
+
     i->thread_info.state = i->state;
     i->thread_info.attached = FALSE;
     pa_atomic_store(&i->thread_info.drained, 1);
@@ -480,6 +496,12 @@ static void sink_input_free(pa_object *o) {
 
     pa_assert(!i->thread_info.attached);
 
+    if (i->thread_info.ramp_info.envelope) {
+        pa_log_debug ("Freeing envelope\n");
+        pa_envelope_free(i->thread_info.ramp_info.envelope);
+        i->thread_info.ramp_info.envelope = NULL;
+    }
+
     if (i->thread_info.render_memblockq)
         pa_memblockq_free(i->thread_info.render_memblockq);
 
@@ -565,6 +587,7 @@ pa_usec_t pa_sink_input_get_latency(pa_sink_input *i, pa_usec_t *sink_latency) {
 void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink frames */, pa_memchunk *chunk, pa_cvolume *volume) {
     pa_bool_t do_volume_adj_here;
     pa_bool_t volume_is_norm;
+    pa_bool_t ramping;
     size_t block_size_max_sink, block_size_max_sink_input;
     size_t ilength;
 
@@ -608,7 +631,7 @@ void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink frames */, p
      * to adjust the volume *before* we resample. Otherwise we can do
      * it after and leave it for the sink code */
 
-    do_volume_adj_here = !pa_channel_map_equal(&i->channel_map, &i->sink->channel_map);
+    do_volume_adj_here = !pa_channel_map_equal(&i->channel_map, &i->sink->channel_map) || i->thread_info.ramp_info.is_ramping;
     volume_is_norm = pa_cvolume_is_norm(&i->thread_info.soft_volume) && !i->thread_info.muted;
 
     while (!pa_memblockq_is_readable(i->thread_info.render_memblockq)) {
@@ -649,7 +672,7 @@ void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink frames */, p
                 wchunk.length = block_size_max_sink_input;
 
             /* It might be necessary to adjust the volume here */
-            if (do_volume_adj_here && !volume_is_norm) {
+            if (do_volume_adj_here && !volume_is_norm && !i->thread_info.ramp_info.is_ramping) {
                 pa_memchunk_make_writable(&wchunk, 0);
 
                 if (i->thread_info.muted)
@@ -691,6 +714,23 @@ void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink frames */, p
     if (chunk->length > block_size_max_sink)
         chunk->length = block_size_max_sink;
 
+    ramping = i->thread_info.ramp_info.is_ramping;
+    if (ramping)
+        sink_input_volume_ramping(i, chunk);
+
+    if (!i->thread_info.ramp_info.envelope_dead) {
+        i->thread_info.ramp_info.envelope_dying += chunk->length;
+        pa_log_debug("Envelope dying is %d, chunk length is %d, dead thresholder is %d\n", i->thread_info.ramp_info.envelope_dying,
+                chunk->length,
+                i->sink->thread_info.max_rewind + pa_envelope_length(i->thread_info.ramp_info.envelope));
+
+        if (i->thread_info.ramp_info.envelope_dying >= (i->sink->thread_info.max_rewind + pa_envelope_length(i->thread_info.ramp_info.envelope))) {
+            pa_log_debug("RELEASE Envelop");
+            i->thread_info.ramp_info.envelope_dead = TRUE;
+            sink_input_release_envelope(i);
+        }
+    }
+
     /* Let's see if we had to apply the volume adjustment ourselves,
      * or if this can be done by the sink for us */
 
@@ -733,6 +773,7 @@ void pa_sink_input_process_rewind(pa_sink_input *i, size_t nbytes /* in sink sam
     if (nbytes > 0 && !i->thread_info.dont_rewind_render) {
         pa_log_debug("Have to rewind %lu bytes on render memblockq.", (unsigned long) nbytes);
         pa_memblockq_rewind(i->thread_info.render_memblockq, nbytes);
+        sink_input_rewind_ramp_info(i, nbytes);
     }
 
     if (i->thread_info.rewrite_nbytes == (size_t) -1) {
@@ -873,50 +914,8 @@ pa_usec_t pa_sink_input_get_requested_latency(pa_sink_input *i) {
 
 /* Called from main context */
 void pa_sink_input_set_volume(pa_sink_input *i, const pa_cvolume *volume, pa_bool_t save, pa_bool_t absolute) {
-    pa_cvolume v;
-
-    pa_sink_input_assert_ref(i);
-    pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
-    pa_assert(volume);
-    pa_assert(pa_cvolume_valid(volume));
-    pa_assert(pa_cvolume_compatible(volume, &i->sample_spec));
-
-    if ((i->sink->flags & PA_SINK_FLAT_VOLUME) && !absolute) {
-        v = i->sink->reference_volume;
-        pa_cvolume_remap(&v, &i->sink->channel_map, &i->channel_map);
-        volume = pa_sw_cvolume_multiply(&v, &v, volume);
-    }
-
-    if (pa_cvolume_equal(volume, &i->virtual_volume))
-        return;
-
-    i->virtual_volume = *volume;
-    i->save_volume = save;
-
-    if (i->sink->flags & PA_SINK_FLAT_VOLUME) {
-        pa_cvolume new_volume;
-
-        /* We are in flat volume mode, so let's update all sink input
-         * volumes and update the flat volume of the sink */
-
-        pa_sink_update_flat_volume(i->sink, &new_volume);
-        pa_sink_set_volume(i->sink, &new_volume, FALSE, TRUE, FALSE, FALSE);
-
-    } else {
-
-        /* OK, we are in normal volume mode. The volume only affects
-         * ourselves */
-        pa_sink_input_set_relative_volume(i, volume);
-
-        /* Hooks have the ability to play games with i->soft_volume */
-        pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_SET_VOLUME], i);
-
-        /* Copy the new soft_volume to the thread_info struct */
-        pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME, NULL, 0, NULL) == 0);
-    }
-
-    /* The virtual volume changed, let's tell people so */
-    pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
+    /* test ramping -> return pa_sink_input_set_volume_with_ramping(i, volume, save, absolute, 2000 * PA_USEC_PER_MSEC); */
+    return pa_sink_input_set_volume_with_ramping(i, volume, save, absolute, 0);
 }
 
 /* Called from main context */
@@ -985,18 +984,8 @@ void pa_sink_input_set_relative_volume(pa_sink_input *i, const pa_cvolume *v) {
 
 /* Called from main context */
 void pa_sink_input_set_mute(pa_sink_input *i, pa_bool_t mute, pa_bool_t save) {
-    pa_assert(i);
-    pa_sink_input_assert_ref(i);
-    pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
-
-    if (!i->muted == !mute)
-        return;
-
-    i->muted = mute;
-    i->save_muted = save;
-
-    pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_MUTE, NULL, 0, NULL) == 0);
-    pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
+    /* test ramping -> return pa_sink_input_set_mute_with_ramping(i, mute, save, 2000 * PA_USEC_PER_MSEC); */
+    return pa_sink_input_set_mute_with_ramping(i, mute, save, 0);
 }
 
 /* Called from main context */
@@ -1347,15 +1336,23 @@ int pa_sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int64_t
     switch (code) {
 
         case PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME:
+            if (pa_atomic_load(&i->before_ramping_v))
+                i->thread_info.future_soft_volume = i->soft_volume;
+
             if (!pa_cvolume_equal(&i->thread_info.soft_volume, &i->soft_volume)) {
-                i->thread_info.soft_volume = i->soft_volume;
+                if (!pa_atomic_load(&i->before_ramping_v))
+                    i->thread_info.soft_volume = i->soft_volume;
                 pa_sink_input_request_rewind(i, 0, TRUE, FALSE, FALSE);
             }
             return 0;
 
         case PA_SINK_INPUT_MESSAGE_SET_SOFT_MUTE:
+            if (pa_atomic_load(&i->before_ramping_m))
+                i->thread_info.future_muted = i->muted;
+
             if (i->thread_info.muted != i->muted) {
-                i->thread_info.muted = i->muted;
+                if (!pa_atomic_load(&i->before_ramping_m))
+                    i->thread_info.muted = i->muted;
                 pa_sink_input_request_rewind(i, 0, TRUE, FALSE, FALSE);
             }
             return 0;
@@ -1403,6 +1400,26 @@ int pa_sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int64_t
             *r = i->thread_info.requested_sink_latency;
             return 0;
         }
+
+        case PA_SINK_INPUT_MESSAGE_SET_ENVELOPE: {
+            if (!i->thread_info.ramp_info.envelope)
+                i->thread_info.ramp_info.envelope = pa_envelope_new(&i->sink->sample_spec);
+
+            if (i->thread_info.ramp_info.envelope && i->thread_info.ramp_info.item) {
+                pa_envelope_remove(i->thread_info.ramp_info.envelope, i->thread_info.ramp_info.item);
+                i->thread_info.ramp_info.item = NULL;
+            }
+
+            i->thread_info.ramp_info.item = pa_envelope_add(i->thread_info.ramp_info.envelope, &i->using_def);
+            i->thread_info.ramp_info.is_ramping = TRUE;
+            i->thread_info.ramp_info.envelope_dead = FALSE;
+            i->thread_info.ramp_info.envelope_dying = 0;
+
+            if (i->thread_info.ramp_info.envelope)
+                pa_envelope_restart(i->thread_info.ramp_info.envelope);
+
+            return 0;
+        }
     }
 
     return -PA_ERR_NOTIMPLEMENTED;
@@ -1550,3 +1567,217 @@ finish:
     if (pl)
         pa_proplist_free(pl);
 }
+
+/* Called from IO context */
+static void sink_input_volume_ramping(pa_sink_input* i, pa_memchunk* chunk) {
+    pa_assert(i);
+    pa_assert(chunk);
+    pa_assert(chunk->memblock);
+    pa_assert(i->thread_info.ramp_info.is_ramping);
+
+    /* Volume is adjusted with ramping effect here */
+    pa_envelope_apply(i->thread_info.ramp_info.envelope, chunk);
+
+    if (pa_envelope_is_finished(i->thread_info.ramp_info.envelope)) {
+        i->thread_info.ramp_info.is_ramping = FALSE;
+        if (pa_atomic_load(&i->before_ramping_v)) {
+            i->thread_info.soft_volume = i->thread_info.future_soft_volume;
+            pa_atomic_store(&i->before_ramping_v, 0);
+        }
+        else if (pa_atomic_load(&i->before_ramping_m)) {
+            i->thread_info.muted = i->thread_info.future_muted;
+            pa_atomic_store(&i->before_ramping_m, 0);
+        }
+    }
+}
+
+/*
+ * Called from main context
+ * This function should be called inside pa_sink_input_set_volume_with_ramping
+ * should be called after soft_volume of sink_input and sink are all adjusted
+ */
+static void sink_input_set_ramping_info(pa_sink_input* i, pa_volume_t  pre_virtual_volume, pa_volume_t target_virtual_volume, pa_usec_t t) {
+
+    int32_t target_abs_vol, target_apply_vol, pre_apply_vol;
+    pa_assert(i);
+
+    pa_log_debug("Sink input's soft volume is %d= %f ", pa_cvolume_avg(&i->soft_volume), pa_sw_volume_to_linear(pa_cvolume_avg(&i->soft_volume)));
+
+    /* Calculation formula are target_abs_vol := i->soft_volume
+     *                                   target_apply_vol := lrint(pa_sw_volume_to_linear(target_abs_vol) * 0x10000)
+     *                                   pre_apply_vol := ( previous_virtual_volume / target_virtual_volume ) * target_apply_vol
+     *
+     * Will do volume adjustment inside pa_sink_input_peek
+     */
+    target_abs_vol = pa_cvolume_avg(&i->soft_volume);
+    target_apply_vol = (int32_t) lrint(pa_sw_volume_to_linear(target_abs_vol) * 0x10000);
+    pre_apply_vol = (int32_t) ((pa_sw_volume_to_linear(pre_virtual_volume) / pa_sw_volume_to_linear(target_virtual_volume)) * target_apply_vol);
+
+    i->using_def.n_points = 2;
+    i->using_def.points_x[0] = 0;
+    i->using_def.points_x[1] = t;
+    i->using_def.points_y.i[0] = pre_apply_vol;
+    i->using_def.points_y.i[1] = target_apply_vol;
+    i->using_def.points_y.f[0] = ((float) i->using_def.points_y.i[0]) /0x10000;
+    i->using_def.points_y.f[1] = ((float) i->using_def.points_y.i[1]) /0x10000;
+
+    pa_log_debug("Volume Ramping: Point 1 is %d=%f, Point 2 is %d=%f\n", i->using_def.points_y.i[0], i->using_def.points_y.f[0],
+                                   i->using_def.points_y.i[1], i->using_def.points_y.f[1]);
+
+    pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_ENVELOPE, NULL, 0, NULL) == 0);
+}
+
+/* Called from main context */
+static void sink_input_set_ramping_info_for_mute(pa_sink_input* i, pa_bool_t mute, pa_usec_t t) {
+
+    int32_t cur_vol;
+    pa_assert(i);
+
+    i->using_def.n_points = 2;
+    i->using_def.points_x[0] = 0;
+    i->using_def.points_x[1] = t;
+    cur_vol = (int32_t) lrint( pa_sw_volume_to_linear(pa_cvolume_avg(&i->soft_volume)) * 0x10000);
+
+    if (mute) {
+        i->using_def.points_y.i[0] = cur_vol;
+        i->using_def.points_y.i[1] = 0;
+    } else {
+        i->using_def.points_y.i[0] = 0;
+        i->using_def.points_y.i[1] = cur_vol;
+    }
+
+    i->using_def.points_y.f[0] = ((float) i->using_def.points_y.i[0]) /0x10000;
+    i->using_def.points_y.f[1] = ((float) i->using_def.points_y.i[1]) /0x10000;
+
+    pa_log_debug("Mute Ramping: Point 1 is %d=%f, Point 2 is %d=%f\n", i->using_def.points_y.i[0], i->using_def.points_y.f[0],
+                   i->using_def.points_y.i[1], i->using_def.points_y.f[1]);
+
+    pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_ENVELOPE, NULL, 0, NULL) == 0);
+}
+
+/* Called from IO context */
+static void sink_input_release_envelope(pa_sink_input *i) {
+    pa_assert(i);
+    pa_assert(!i->thread_info.ramp_info.is_ramping);
+    pa_assert(i->thread_info.ramp_info.envelope_dead);
+
+    pa_envelope_free(i->thread_info.ramp_info.envelope);
+    i->thread_info.ramp_info.envelope = NULL;
+    i->thread_info.ramp_info.item = NULL;
+}
+
+/* Called from IO context */
+static void sink_input_rewind_ramp_info(pa_sink_input *i, size_t nbytes) {
+    pa_assert(i);
+
+    if (!i->thread_info.ramp_info.envelope_dead) {
+        pa_assert(i->thread_info.ramp_info.envelope);
+
+        int32_t envelope_length = pa_envelope_length(i->thread_info.ramp_info.envelope);
+
+        if (i->thread_info.ramp_info.envelope_dying > envelope_length) {
+            if ((i->thread_info.ramp_info.envelope_dying - nbytes) < envelope_length) {
+                pa_log_debug("Envelope Become Alive");
+                pa_envelope_rewind(i->thread_info.ramp_info.envelope, envelope_length - (i->thread_info.ramp_info.envelope_dying - nbytes));
+                i->thread_info.ramp_info.is_ramping = TRUE;
+            }
+        } else if (i->thread_info.ramp_info.envelope_dying < envelope_length) {
+            if ((i->thread_info.ramp_info.envelope_dying - nbytes) <= 0) {
+                pa_log_debug("Envelope Restart");
+                pa_envelope_restart(i->thread_info.ramp_info.envelope);
+            }
+            else {
+                pa_log_debug("Envelope Simple Rewind");
+                pa_envelope_rewind(i->thread_info.ramp_info.envelope, nbytes);
+            }
+        }
+
+        i->thread_info.ramp_info.envelope_dying -= nbytes;
+        if (i->thread_info.ramp_info.envelope_dying <= 0)
+            i->thread_info.ramp_info.envelope_dying = 0;
+    }
+}
+
+void pa_sink_input_set_volume_with_ramping(pa_sink_input *i, const pa_cvolume *volume, pa_bool_t save, pa_bool_t absolute, pa_usec_t t){
+    pa_cvolume v;
+    pa_volume_t previous_virtual_volume, target_virtual_volume;
+    pa_sink_input_assert_ref(i);
+
+    pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
+    pa_assert(volume);
+    pa_assert(pa_cvolume_valid(volume));
+    pa_assert(pa_cvolume_compatible(volume, &i->sample_spec));
+
+    if ((i->sink->flags & PA_SINK_FLAT_VOLUME) && !absolute) {
+        v = i->sink->reference_volume;
+        pa_cvolume_remap(&v, &i->sink->channel_map, &i->channel_map);
+        volume = pa_sw_cvolume_multiply(&v, &v, volume);
+    }
+
+    if (pa_cvolume_equal(volume, &i->virtual_volume))
+        return;
+
+    previous_virtual_volume = pa_cvolume_avg(&i->virtual_volume);
+    target_virtual_volume = pa_cvolume_avg(volume);
+    if (t > 0 && target_virtual_volume > 0)
+        pa_log_debug("SetVolumeWithRamping: Virtual Volume From %u=%f to %u=%f\n", previous_virtual_volume, pa_sw_volume_to_linear(previous_virtual_volume),
+                                             target_virtual_volume, pa_sw_volume_to_linear(target_virtual_volume));
+
+    i->virtual_volume = *volume;
+    i->save_volume = save;
+
+    /* Set this flag before the following code modify i->thread_info.soft_volume */
+    if (t > 0 && target_virtual_volume > 0)
+        pa_atomic_store(&i->before_ramping_v, 1);
+
+    if (i->sink->flags & PA_SINK_FLAT_VOLUME) {
+        pa_cvolume new_volume;
+
+        /* We are in flat volume mode, so let's update all sink input
+         * volumes and update the flat volume of the sink */
+
+        pa_sink_update_flat_volume(i->sink, &new_volume);
+        pa_sink_set_volume(i->sink, &new_volume, FALSE, TRUE, FALSE, FALSE);
+
+    } else {
+
+        /* OK, we are in normal volume mode. The volume only affects
+         * ourselves */
+        pa_sink_input_set_relative_volume(i, volume);
+
+        /* Hooks have the ability to play games with i->soft_volume */
+        pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_SET_VOLUME], i);
+
+        /* Copy the new soft_volume to the thread_info struct */
+        pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME, NULL, 0, NULL) == 0);
+    }
+
+    if (t > 0 && target_virtual_volume > 0)
+        sink_input_set_ramping_info(i, previous_virtual_volume, target_virtual_volume, t);
+
+    /* The virtual volume changed, let's tell people so */
+    pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
+}
+
+void pa_sink_input_set_mute_with_ramping(pa_sink_input *i, pa_bool_t mute, pa_bool_t save, pa_usec_t t){
+
+    pa_assert(i);
+    pa_sink_input_assert_ref(i);
+    pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
+
+    if (!i->muted == !mute)
+        return;
+
+    i->muted = mute;
+    i->save_muted = save;
+    /* Set this flag before the following code modify i->thread_info.muted, otherwise distortion will be heard */
+    if (t > 0)
+        pa_atomic_store(&i->before_ramping_m, 1);
+
+    pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_MUTE, NULL, 0, NULL) == 0);
+
+    if (t > 0)
+        sink_input_set_ramping_info_for_mute(i, mute, t);
+
+    pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
+}
diff --git a/src/pulsecore/sink-input.h b/src/pulsecore/sink-input.h
index 98144d4..036806f 100644
--- a/src/pulsecore/sink-input.h
+++ b/src/pulsecore/sink-input.h
@@ -35,6 +35,7 @@ typedef struct pa_sink_input pa_sink_input;
 #include <pulsecore/client.h>
 #include <pulsecore/sink.h>
 #include <pulsecore/core.h>
+#include <pulsecore/envelope.h>
 
 typedef enum pa_sink_input_state {
     PA_SINK_INPUT_INIT,         /*< The stream is not active yet, because pa_sink_put() has not been called yet */
@@ -212,8 +213,23 @@ struct pa_sink_input {
         pa_usec_t requested_sink_latency;
 
         pa_hashmap *direct_outputs;
+
+        struct {
+            pa_bool_t is_ramping:1;
+            pa_bool_t envelope_dead:1;
+            int32_t envelope_dying; /* Increasing while envelop is not dead.  Reduce it while process_rewind. */
+            pa_envelope *envelope;
+            pa_envelope_item *item;
+        } ramp_info;
+        pa_cvolume future_soft_volume;
+        pa_bool_t future_muted;
+
     } thread_info;
 
+    pa_atomic_t before_ramping_v;  /* Indicates future volume */
+    pa_atomic_t before_ramping_m;  /* Indicates future mute */
+    pa_envelope_def using_def;
+
     void *userdata;
 };
 
@@ -228,6 +244,7 @@ enum {
     PA_SINK_INPUT_MESSAGE_SET_STATE,
     PA_SINK_INPUT_MESSAGE_SET_REQUESTED_LATENCY,
     PA_SINK_INPUT_MESSAGE_GET_REQUESTED_LATENCY,
+    PA_SINK_INPUT_MESSAGE_SET_ENVELOPE,
     PA_SINK_INPUT_MESSAGE_MAX
 };
 
@@ -359,4 +376,8 @@ pa_memchunk* pa_sink_input_get_silence(pa_sink_input *i, pa_memchunk *ret);
 /* To be used by sink.c only */
 void pa_sink_input_set_relative_volume(pa_sink_input *i, const pa_cvolume *v);
 
+/* Volume ramping*/
+void pa_sink_input_set_volume_with_ramping(pa_sink_input *i, const pa_cvolume *volume, pa_bool_t save, pa_bool_t absolute, pa_usec_t t);
+void pa_sink_input_set_mute_with_ramping(pa_sink_input *i, pa_bool_t mute, pa_bool_t save, pa_usec_t t);
+
 #endif

commit 897ef86b7fbb87ef17d30c584e6cd93abfc342bc
Author: zbt <huan.zheng at intel.com>
Date:   Thu Jul 16 10:41:58 2009 +0800

    Add volume ramping feature - sink modification

diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index d8f3c7d..2950071 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -1599,10 +1599,14 @@ static void sync_input_volumes_within_thread(pa_sink *s) {
     pa_sink_assert_ref(s);
 
     while ((i = PA_SINK_INPUT(pa_hashmap_iterate(s->thread_info.inputs, &state, NULL)))) {
+        if (pa_atomic_load(&i->before_ramping_v))
+            i->thread_info.future_soft_volume = i->soft_volume;
+
         if (pa_cvolume_equal(&i->thread_info.soft_volume, &i->soft_volume))
             continue;
 
-        i->thread_info.soft_volume = i->soft_volume;
+        if (!pa_atomic_load(&i->before_ramping_v))
+            i->thread_info.soft_volume = i->soft_volume;
         pa_sink_input_request_rewind(i, 0, TRUE, FALSE, FALSE);
     }
 }

commit 1457df40eee692834d1c5faf95ca0057d74f86d1
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 9 07:59:06 2009 +0300

    proplist: New function: pa_proplist_equal()

diff --git a/src/map-file b/src/map-file
index a1d0a06..3db3a2d 100644
--- a/src/map-file
+++ b/src/map-file
@@ -180,6 +180,7 @@ pa_path_get_filename;
 pa_proplist_clear;
 pa_proplist_contains;
 pa_proplist_copy;
+pa_proplist_equal;
 pa_proplist_free;
 pa_proplist_from_string;
 pa_proplist_get;
diff --git a/src/pulse/proplist.c b/src/pulse/proplist.c
index c904f53..4f0d6a6 100644
--- a/src/pulse/proplist.c
+++ b/src/pulse/proplist.c
@@ -680,3 +680,29 @@ int pa_proplist_isempty(pa_proplist *p) {
 
     return pa_hashmap_isempty(MAKE_HASHMAP(p));
 }
+
+int pa_proplist_equal(pa_proplist *a, pa_proplist *b) {
+    const void *key = NULL;
+    struct property *a_prop = NULL;
+    struct property *b_prop = NULL;
+    void *state = NULL;
+
+    pa_assert(a);
+    pa_assert(b);
+
+    if (pa_proplist_size(a) != pa_proplist_size(b))
+        return 0;
+
+    while ((a_prop = pa_hashmap_iterate(MAKE_HASHMAP(a), &state, &key))) {
+        if (!(b_prop = pa_hashmap_get(MAKE_HASHMAP(b), key)))
+            return 0;
+
+        if (a_prop->nbytes != b_prop->nbytes)
+            return 0;
+
+        if (memcmp(a_prop->value, b_prop->value, a_prop->nbytes) != 0)
+            return 0;
+    }
+
+    return 1;
+}
diff --git a/src/pulse/proplist.h b/src/pulse/proplist.h
index bc4dbd8..a585944 100644
--- a/src/pulse/proplist.h
+++ b/src/pulse/proplist.h
@@ -354,6 +354,9 @@ unsigned pa_proplist_size(pa_proplist *t);
 /** Returns 0 when the proplist is empty, positive otherwise \since 0.9.15 */
 int pa_proplist_isempty(pa_proplist *t);
 
+/** Return non-zero when a and b have the same keys and values. */
+int pa_proplist_equal(pa_proplist *a, pa_proplist *b);
+
 PA_C_DECL_END
 
 #endif

commit fcf68752e687123a171b1144f78f8eba1625a204
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 9 08:37:33 2009 +0300

    dbus: Three entangled changes:
    
     * Make the dbus object constructors take a pa_dbusiface_core pointer
       as an argument. Remove the path_prefix argument.
    
     * Expose the core object path as a constant in protocol-dbus.h.
    
     * Move the core interface name constant from iface-core.h to
       protocol-dbus.h.

diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card.c
index db6aa26..e203c39 100644
--- a/src/modules/dbus/iface-card.c
+++ b/src/modules/dbus/iface-card.c
@@ -24,25 +24,30 @@
 #endif
 
 #include <pulsecore/core-util.h>
+#include <pulsecore/protocol-dbus.h>
 
 #include "iface-card.h"
 
 #define OBJECT_NAME "card"
 
 struct pa_dbusiface_card {
+    pa_dbusiface_core *core;
+
     pa_card *card;
     char *path;
 };
 
-pa_dbusiface_card *pa_dbusiface_card_new(pa_card *card, const char *path_prefix) {
-    pa_dbusiface_card *c;
 
+pa_dbusiface_card *pa_dbusiface_card_new(pa_dbusiface_core *core, pa_card *card) {
+    pa_dbusiface_card *c = NULL;
+
+    pa_assert(core);
     pa_assert(card);
-    pa_assert(path_prefix);
 
-    c = pa_xnew(pa_dbusiface_card, 1);
+    c = pa_xnew0(pa_dbusiface_card, 1);
+    c->core = core;
     c->card = card;
-    c->path = pa_sprintf_malloc("%s/%s%u", path_prefix, OBJECT_NAME, card->index);
+    c->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, card->index);
 
     return c;
 }
diff --git a/src/modules/dbus/iface-card.h b/src/modules/dbus/iface-card.h
index 54db610..57ad4e3 100644
--- a/src/modules/dbus/iface-card.h
+++ b/src/modules/dbus/iface-card.h
@@ -30,9 +30,13 @@
 
 #include <pulsecore/card.h>
 
+#include "iface-core.h"
+
+#define PA_DBUSIFACE_CARD_INTERFACE PA_DBUS_CORE_INTERFACE ".Card"
+
 typedef struct pa_dbusiface_card pa_dbusiface_card;
 
-pa_dbusiface_card *pa_dbusiface_card_new(pa_card *card, const char *path_prefix);
+pa_dbusiface_card *pa_dbusiface_card_new(pa_dbusiface_core *core, pa_card *card);
 void pa_dbusiface_card_free(pa_dbusiface_card *c);
 
 const char *pa_dbusiface_card_get_path(pa_dbusiface_card *c);
diff --git a/src/modules/dbus/iface-client.c b/src/modules/dbus/iface-client.c
index cfa36d0..d9c8653 100644
--- a/src/modules/dbus/iface-client.c
+++ b/src/modules/dbus/iface-client.c
@@ -24,6 +24,7 @@
 #endif
 
 #include <pulsecore/core-util.h>
+#include <pulsecore/protocol-dbus.h>
 
 #include "iface-client.h"
 
@@ -34,15 +35,15 @@ struct pa_dbusiface_client {
     char *path;
 };
 
-pa_dbusiface_client *pa_dbusiface_client_new(pa_client *client, const char *path_prefix) {
+pa_dbusiface_client *pa_dbusiface_client_new(pa_dbusiface_core *core, pa_client *client) {
     pa_dbusiface_client *c;
 
+    pa_assert(core);
     pa_assert(client);
-    pa_assert(path_prefix);
 
     c = pa_xnew(pa_dbusiface_client, 1);
     c->client = client;
-    c->path = pa_sprintf_malloc("%s/%s%u", path_prefix, OBJECT_NAME, client->index);
+    c->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, client->index);
 
     return c;
 }
diff --git a/src/modules/dbus/iface-client.h b/src/modules/dbus/iface-client.h
index 62cca7f..ff90625 100644
--- a/src/modules/dbus/iface-client.h
+++ b/src/modules/dbus/iface-client.h
@@ -30,9 +30,11 @@
 
 #include <pulsecore/client.h>
 
+#include "iface-core.h"
+
 typedef struct pa_dbusiface_client pa_dbusiface_client;
 
-pa_dbusiface_client *pa_dbusiface_client_new(pa_client *client, const char *path_prefix);
+pa_dbusiface_client *pa_dbusiface_client_new(pa_dbusiface_core *core, pa_client *client);
 void pa_dbusiface_client_free(pa_dbusiface_client *c);
 
 const char *pa_dbusiface_client_get_path(pa_dbusiface_client *c);
diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index ad729f9..e40cb97 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -48,12 +48,8 @@
 
 #include "iface-core.h"
 
-#define OBJECT_PATH "/org/pulseaudio/core1"
-
 #define INTERFACE_REVISION 0
 
-
-
 static void handle_get_interface_revision(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_version(DBusConnection *conn, DBusMessage *msg, void *userdata);
@@ -314,7 +310,7 @@ static pa_dbus_signal_info signals[SIGNAL_MAX] = {
 };
 
 static pa_dbus_interface_info core_interface_info = {
-    .name = PA_DBUSIFACE_CORE_INTERFACE,
+    .name = PA_DBUS_CORE_INTERFACE,
     .method_handlers = method_handlers,
     .n_method_handlers = METHOD_HANDLER_MAX,
     .property_handlers = property_handlers,
@@ -1388,7 +1384,7 @@ static void handle_upload_sample(DBusConnection *conn, DBusMessage *msg, void *u
         sample->volume_is_set = FALSE;
     }
 
-    dbus_sample = pa_dbusiface_sample_new(sample, OBJECT_PATH);
+    dbus_sample = pa_dbusiface_sample_new(c, sample);
     pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), dbus_sample);
 
     object_path = pa_dbusiface_sample_get_path(dbus_sample);
@@ -1510,7 +1506,7 @@ static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *use
         goto finish;
     }
 
-    dbus_module = pa_dbusiface_module_new(module, OBJECT_PATH);
+    dbus_module = pa_dbusiface_module_new(c, module);
     pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(module->index), dbus_module);
 
     object_path = pa_dbusiface_module_get_path(dbus_module);
@@ -1614,7 +1610,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 if (new_fallback_sink && (device = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(new_fallback_sink->index)))) {
                     object_path = pa_dbusiface_device_get_path(device);
 
-                    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
+                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
                     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
                     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
                     dbus_message_unref(signal);
@@ -1628,7 +1624,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 if (new_fallback_source && (device = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(new_fallback_source->index)))) {
                     object_path = pa_dbusiface_device_get_path(device);
 
-                    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
+                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
                     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
                     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
                     dbus_message_unref(signal);
@@ -1640,13 +1636,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
         case PA_SUBSCRIPTION_EVENT_CARD:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
                 if (!(card = pa_hashmap_get(c->cards, PA_UINT32_TO_PTR(idx)))) {
-                    card = pa_dbusiface_card_new(pa_idxset_get_by_index(core->cards, idx), OBJECT_PATH);
+                    card = pa_dbusiface_card_new(c, pa_idxset_get_by_index(core->cards, idx));
                     pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), card);
                 }
 
                 object_path = pa_dbusiface_card_get_path(card);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_CARD].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_CARD].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1654,7 +1650,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_card_get_path(card);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_CARD_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_CARD_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_card_free(card);
@@ -1666,14 +1662,14 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 pa_sink *sink = pa_idxset_get_by_index(core->sinks, idx);
 
                 if (!(device = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(idx)))) {
-                    device = pa_dbusiface_device_new_sink(sink, OBJECT_PATH);
+                    device = pa_dbusiface_device_new_sink(c, sink);
                     pa_hashmap_put(c->sinks_by_index, PA_UINT32_TO_PTR(idx), device);
                     pa_hashmap_put(c->sinks_by_path, pa_dbusiface_device_get_path(device), device);
                 }
 
                 object_path = pa_dbusiface_device_get_path(device);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_SINK].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_SINK].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1685,7 +1681,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                      * the D-Bus sink object wasn't created yet. Now that the
                      * object is created, let's send the fallback sink change
                      * signal. */
-                    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
+                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
                     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1698,7 +1694,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 object_path = pa_dbusiface_device_get_path(device);
                 pa_assert_se(pa_hashmap_remove(c->sinks_by_path, object_path));
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_SINK_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_SINK_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_device_free(device);
@@ -1710,14 +1706,14 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 pa_source *source = pa_idxset_get_by_index(core->sources, idx);
 
                 if (!(device = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(idx)))) {
-                    device = pa_dbusiface_device_new_source(source, OBJECT_PATH);
+                    device = pa_dbusiface_device_new_source(c, source);
                     pa_hashmap_put(c->sources_by_index, PA_UINT32_TO_PTR(idx), device);
                     pa_hashmap_put(c->sources_by_path, pa_dbusiface_device_get_path(device), device);
                 }
 
                 object_path = pa_dbusiface_device_get_path(device);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_SOURCE].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_SOURCE].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1729,7 +1725,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                      * point the D-Bus source object wasn't created yet. Now
                      * that the object is created, let's send the fallback
                      * source change signal. */
-                    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
+                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
                     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1742,7 +1738,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 object_path = pa_dbusiface_device_get_path(device);
                 pa_assert_se(pa_hashmap_remove(c->sources_by_path, object_path));
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_SOURCE_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_SOURCE_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_device_free(device);
@@ -1752,13 +1748,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
         case PA_SUBSCRIPTION_EVENT_SINK_INPUT:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
                 if (!(stream = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(idx)))) {
-                    stream = pa_dbusiface_stream_new_playback(pa_idxset_get_by_index(core->sink_inputs, idx), OBJECT_PATH);
+                    stream = pa_dbusiface_stream_new_playback(c, pa_idxset_get_by_index(core->sink_inputs, idx));
                     pa_hashmap_put(c->playback_streams, PA_UINT32_TO_PTR(idx), stream);
                 }
 
                 object_path = pa_dbusiface_stream_get_path(stream);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_PLAYBACK_STREAM].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_PLAYBACK_STREAM].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1766,7 +1762,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_stream_get_path(stream);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_PLAYBACK_STREAM_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_PLAYBACK_STREAM_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_stream_free(stream);
@@ -1776,13 +1772,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
         case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
                 if (!(stream = pa_hashmap_get(c->record_streams, PA_UINT32_TO_PTR(idx)))) {
-                    stream = pa_dbusiface_stream_new_record(pa_idxset_get_by_index(core->source_outputs, idx), OBJECT_PATH);
+                    stream = pa_dbusiface_stream_new_record(c, pa_idxset_get_by_index(core->source_outputs, idx));
                     pa_hashmap_put(c->record_streams, PA_UINT32_TO_PTR(idx), stream);
                 }
 
                 object_path = pa_dbusiface_stream_get_path(stream);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_RECORD_STREAM].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_RECORD_STREAM].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1790,7 +1786,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_stream_get_path(stream);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_RECORD_STREAM_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_RECORD_STREAM_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_stream_free(stream);
@@ -1800,13 +1796,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
         case PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
                 if (!(sample = pa_hashmap_get(c->samples, PA_UINT32_TO_PTR(idx)))) {
-                    sample = pa_dbusiface_sample_new(pa_idxset_get_by_index(core->scache, idx), OBJECT_PATH);
+                    sample = pa_dbusiface_sample_new(c, pa_idxset_get_by_index(core->scache, idx));
                     pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), sample);
                 }
 
                 object_path = pa_dbusiface_sample_get_path(sample);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_SAMPLE].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_SAMPLE].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1814,7 +1810,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_sample_get_path(sample);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_SAMPLE_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_SAMPLE_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_sample_free(sample);
@@ -1824,13 +1820,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
         case PA_SUBSCRIPTION_EVENT_MODULE:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
                 if (!(module = pa_hashmap_get(c->modules, PA_UINT32_TO_PTR(idx)))) {
-                    module = pa_dbusiface_module_new(pa_idxset_get_by_index(core->modules, idx), OBJECT_PATH);
+                    module = pa_dbusiface_module_new(c, pa_idxset_get_by_index(core->modules, idx));
                     pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(idx), module);
                 }
 
                 object_path = pa_dbusiface_module_get_path(module);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_MODULE].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_MODULE].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1838,7 +1834,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_module_get_path(module);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_MODULE_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_MODULE_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_module_free(module);
@@ -1848,13 +1844,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
         case PA_SUBSCRIPTION_EVENT_CLIENT:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
                 if (!(client = pa_hashmap_get(c->clients, PA_UINT32_TO_PTR(idx)))) {
-                    client = pa_dbusiface_client_new(pa_idxset_get_by_index(core->clients, idx), OBJECT_PATH);
+                    client = pa_dbusiface_client_new(c, pa_idxset_get_by_index(core->clients, idx));
                     pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(idx), client);
                 }
 
                 object_path = pa_dbusiface_client_get_path(client);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_CLIENT].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_CLIENT].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1862,7 +1858,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_client_get_path(client);
 
-                pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_CLIENT_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_CLIENT_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_client_free(client);
@@ -1884,7 +1880,7 @@ static pa_hook_result_t extension_registered_cb(void *hook_data, void *call_data
     pa_assert(c);
     pa_assert(ext_name);
 
-    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_NEW_EXTENSION].name)));
+    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_EXTENSION].name)));
     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_STRING, &ext_name, DBUS_TYPE_INVALID));
 
     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1901,7 +1897,7 @@ static pa_hook_result_t extension_unregistered_cb(void *hook_data, void *call_da
     pa_assert(c);
     pa_assert(ext_name);
 
-    pa_assert_se((signal = dbus_message_new_signal(OBJECT_PATH, PA_DBUSIFACE_CORE_INTERFACE, signals[SIGNAL_EXTENSION_REMOVED].name)));
+    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_EXTENSION_REMOVED].name)));
     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_STRING, &ext_name, DBUS_TYPE_INVALID));
 
     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1943,39 +1939,39 @@ pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core) {
     c->fallback_source = pa_namereg_get_default_source(core);
     c->extension_registered_slot = pa_dbus_protocol_hook_connect(c->dbus_protocol, PA_DBUS_PROTOCOL_HOOK_EXTENSION_REGISTERED, PA_HOOK_NORMAL, extension_registered_cb, c);
     c->extension_unregistered_slot = pa_dbus_protocol_hook_connect(c->dbus_protocol, PA_DBUS_PROTOCOL_HOOK_EXTENSION_UNREGISTERED, PA_HOOK_NORMAL, extension_unregistered_cb, c);
-    c->memstats = pa_dbusiface_memstats_new(core, OBJECT_PATH);
+    c->memstats = pa_dbusiface_memstats_new(c, core);
 
     for (card = pa_idxset_first(core->cards, &idx); card; card = pa_idxset_next(core->cards, &idx))
-        pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), pa_dbusiface_card_new(card, OBJECT_PATH));
+        pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), pa_dbusiface_card_new(c, card));
 
     for (sink = pa_idxset_first(core->sinks, &idx); sink; sink = pa_idxset_next(core->sinks, &idx)) {
-        device = pa_dbusiface_device_new_sink(sink, OBJECT_PATH);
+        device = pa_dbusiface_device_new_sink(c, sink);
         pa_hashmap_put(c->sinks_by_index, PA_UINT32_TO_PTR(idx), device);
         pa_hashmap_put(c->sinks_by_path, pa_dbusiface_device_get_path(device), device);
     }
 
     for (source = pa_idxset_first(core->sources, &idx); source; source = pa_idxset_next(core->sources, &idx)) {
-        device = pa_dbusiface_device_new_source(source, OBJECT_PATH);
+        device = pa_dbusiface_device_new_source(c, source);
         pa_hashmap_put(c->sources_by_index, PA_UINT32_TO_PTR(idx), device);
         pa_hashmap_put(c->sources_by_path, pa_dbusiface_device_get_path(device), device);
     }
 
     for (sink_input = pa_idxset_first(core->sink_inputs, &idx); sink_input; sink_input = pa_idxset_next(core->sink_inputs, &idx))
-        pa_hashmap_put(c->playback_streams, PA_UINT32_TO_PTR(idx), pa_dbusiface_stream_new_playback(sink_input, OBJECT_PATH));
+        pa_hashmap_put(c->playback_streams, PA_UINT32_TO_PTR(idx), pa_dbusiface_stream_new_playback(c, sink_input));
 
     for (source_output = pa_idxset_first(core->source_outputs, &idx); source_output; source_output = pa_idxset_next(core->source_outputs, &idx))
-        pa_hashmap_put(c->record_streams, PA_UINT32_TO_PTR(idx), pa_dbusiface_stream_new_record(source_output, OBJECT_PATH));
+        pa_hashmap_put(c->record_streams, PA_UINT32_TO_PTR(idx), pa_dbusiface_stream_new_record(c, source_output));
 
     for (sample = pa_idxset_first(core->scache, &idx); sample; sample = pa_idxset_next(core->scache, &idx))
-        pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), pa_dbusiface_sample_new(sample, OBJECT_PATH));
+        pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), pa_dbusiface_sample_new(c, sample));
 
     for (module = pa_idxset_first(core->modules, &idx); module; module = pa_idxset_next(core->modules, &idx))
-        pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(idx), pa_dbusiface_module_new(module, OBJECT_PATH));
+        pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(idx), pa_dbusiface_module_new(c, module));
 
     for (client = pa_idxset_first(core->clients, &idx); client; client = pa_idxset_next(core->clients, &idx))
-        pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(idx), pa_dbusiface_client_new(client, OBJECT_PATH));
+        pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(idx), pa_dbusiface_client_new(c, client));
 
-    pa_dbus_protocol_add_interface(c->dbus_protocol, OBJECT_PATH, &core_interface_info, c);
+    pa_dbus_protocol_add_interface(c->dbus_protocol, PA_DBUS_CORE_OBJECT_PATH, &core_interface_info, c);
 
     return c;
 }
@@ -2031,7 +2027,7 @@ static void free_client_cb(void *p, void *userdata) {
 void pa_dbusiface_core_free(pa_dbusiface_core *c) {
     pa_assert(c);
 
-    pa_dbus_protocol_remove_interface(c->dbus_protocol, OBJECT_PATH, core_interface_info.name);
+    pa_dbus_protocol_remove_interface(c->dbus_protocol, PA_DBUS_CORE_OBJECT_PATH, core_interface_info.name);
 
     pa_subscription_free(c->subscription);
     pa_hashmap_free(c->cards, free_card_cb, NULL);
diff --git a/src/modules/dbus/iface-core.h b/src/modules/dbus/iface-core.h
index 6c5191b..964a37b 100644
--- a/src/modules/dbus/iface-core.h
+++ b/src/modules/dbus/iface-core.h
@@ -30,8 +30,6 @@
 
 #include <pulsecore/core.h>
 
-#define PA_DBUSIFACE_CORE_INTERFACE "org.PulseAudio.Core1"
-
 typedef struct pa_dbusiface_core pa_dbusiface_core;
 
 pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core);
diff --git a/src/modules/dbus/iface-device.c b/src/modules/dbus/iface-device.c
index 3b3795e..1a64f43 100644
--- a/src/modules/dbus/iface-device.c
+++ b/src/modules/dbus/iface-device.c
@@ -24,6 +24,7 @@
 #endif
 
 #include <pulsecore/core-util.h>
+#include <pulsecore/protocol-dbus.h>
 
 #include "iface-device.h"
 
@@ -44,30 +45,30 @@ struct pa_dbusiface_device {
     char *path;
 };
 
-pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_sink *sink, const char *path_prefix) {
+pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_dbusiface_core *core, pa_sink *sink) {
     pa_dbusiface_device *d;
 
+    pa_assert(core);
     pa_assert(sink);
-    pa_assert(path_prefix);
 
     d = pa_xnew(pa_dbusiface_device, 1);
     d->sink = pa_sink_ref(sink);
     d->type = DEVICE_TYPE_SINK;
-    d->path = pa_sprintf_malloc("%s/%s%u", path_prefix, SINK_OBJECT_NAME, sink->index);
+    d->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, SINK_OBJECT_NAME, sink->index);
 
     return d;
 }
 
-pa_dbusiface_device *pa_dbusiface_device_new_source(pa_source *source, const char *path_prefix) {
+pa_dbusiface_device *pa_dbusiface_device_new_source(pa_dbusiface_core *core, pa_source *source) {
     pa_dbusiface_device *d;
 
+    pa_assert(core);
     pa_assert(source);
-    pa_assert(path_prefix);
 
     d = pa_xnew(pa_dbusiface_device, 1);
     d->source = pa_source_ref(source);
     d->type = DEVICE_TYPE_SOURCE;
-    d->path = pa_sprintf_malloc("%s/%s%u", path_prefix, SOURCE_OBJECT_NAME, source->index);
+    d->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, SOURCE_OBJECT_NAME, source->index);
 
     return d;
 }
diff --git a/src/modules/dbus/iface-device.h b/src/modules/dbus/iface-device.h
index 81ad1d8..1e9af83 100644
--- a/src/modules/dbus/iface-device.h
+++ b/src/modules/dbus/iface-device.h
@@ -32,10 +32,12 @@
 #include <pulsecore/sink.h>
 #include <pulsecore/source.h>
 
+#include "iface-core.h"
+
 typedef struct pa_dbusiface_device pa_dbusiface_device;
 
-pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_sink *sink, const char *path_prefix);
-pa_dbusiface_device *pa_dbusiface_device_new_source(pa_source *source, const char *path_prefix);
+pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_dbusiface_core *core, pa_sink *sink);
+pa_dbusiface_device *pa_dbusiface_device_new_source(pa_dbusiface_core *core, pa_source *source);
 void pa_dbusiface_device_free(pa_dbusiface_device *d);
 
 const char *pa_dbusiface_device_get_path(pa_dbusiface_device *d);
diff --git a/src/modules/dbus/iface-memstats.c b/src/modules/dbus/iface-memstats.c
index d3412a2..73a84be 100644
--- a/src/modules/dbus/iface-memstats.c
+++ b/src/modules/dbus/iface-memstats.c
@@ -195,15 +195,15 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
     dbus_message_unref(reply);
 }
 
-pa_dbusiface_memstats *pa_dbusiface_memstats_new(pa_core *core, const char *path_prefix) {
+pa_dbusiface_memstats *pa_dbusiface_memstats_new(pa_dbusiface_core *dbus_core, pa_core *core) {
     pa_dbusiface_memstats *m;
 
+    pa_assert(dbus_core);
     pa_assert(core);
-    pa_assert(path_prefix);
 
     m = pa_xnew(pa_dbusiface_memstats, 1);
     m->core = pa_core_ref(core);
-    m->path = pa_sprintf_malloc("%s/%s", path_prefix, OBJECT_NAME);
+    m->path = pa_sprintf_malloc("%s/%s", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME);
     m->dbus_protocol = pa_dbus_protocol_get(core);
 
     pa_assert_se(pa_dbus_protocol_add_interface(m->dbus_protocol, m->path, &memstats_interface_info, m) >= 0);
diff --git a/src/modules/dbus/iface-memstats.h b/src/modules/dbus/iface-memstats.h
index d7773ee..0820e8f 100644
--- a/src/modules/dbus/iface-memstats.h
+++ b/src/modules/dbus/iface-memstats.h
@@ -29,14 +29,15 @@
  */
 
 #include <pulsecore/core.h>
+#include <pulsecore/protocol-dbus.h>
 
 #include "iface-core.h"
 
-#define PA_DBUSIFACE_MEMSTATS_INTERFACE PA_DBUSIFACE_CORE_INTERFACE ".Memstats"
+#define PA_DBUSIFACE_MEMSTATS_INTERFACE PA_DBUS_CORE_INTERFACE ".Memstats"
 
 typedef struct pa_dbusiface_memstats pa_dbusiface_memstats;
 
-pa_dbusiface_memstats *pa_dbusiface_memstats_new(pa_core *core, const char *path_prefix);
+pa_dbusiface_memstats *pa_dbusiface_memstats_new(pa_dbusiface_core *dbus_core, pa_core *core);
 void pa_dbusiface_memstats_free(pa_dbusiface_memstats *m);
 
 const char *pa_dbusiface_memstats_get_path(pa_dbusiface_memstats *m);
diff --git a/src/modules/dbus/iface-module.c b/src/modules/dbus/iface-module.c
index 1c95f9e..788d104 100644
--- a/src/modules/dbus/iface-module.c
+++ b/src/modules/dbus/iface-module.c
@@ -24,6 +24,7 @@
 #endif
 
 #include <pulsecore/core-util.h>
+#include <pulsecore/protocol-dbus.h>
 
 #include "iface-module.h"
 
@@ -34,15 +35,15 @@ struct pa_dbusiface_module {
     char *path;
 };
 
-pa_dbusiface_module *pa_dbusiface_module_new(pa_module *module, const char *path_prefix) {
+pa_dbusiface_module *pa_dbusiface_module_new(pa_dbusiface_core *core, pa_module *module) {
     pa_dbusiface_module *m;
 
+    pa_assert(core);
     pa_assert(module);
-    pa_assert(path_prefix);
 
     m = pa_xnew(pa_dbusiface_module, 1);
     m->module = module;
-    m->path = pa_sprintf_malloc("%s/%s%u", path_prefix, OBJECT_NAME, module->index);
+    m->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, module->index);
 
     return m;
 }
diff --git a/src/modules/dbus/iface-module.h b/src/modules/dbus/iface-module.h
index 7f683e6..c4f2921 100644
--- a/src/modules/dbus/iface-module.h
+++ b/src/modules/dbus/iface-module.h
@@ -30,9 +30,11 @@
 
 #include <pulsecore/module.h>
 
+#include "iface-core.h"
+
 typedef struct pa_dbusiface_module pa_dbusiface_module;
 
-pa_dbusiface_module *pa_dbusiface_module_new(pa_module *module, const char *path_prefix);
+pa_dbusiface_module *pa_dbusiface_module_new(pa_dbusiface_core *core, pa_module *module);
 void pa_dbusiface_module_free(pa_dbusiface_module *m);
 
 const char *pa_dbusiface_module_get_path(pa_dbusiface_module *m);
diff --git a/src/modules/dbus/iface-sample.c b/src/modules/dbus/iface-sample.c
index b4a308a..44cfb03 100644
--- a/src/modules/dbus/iface-sample.c
+++ b/src/modules/dbus/iface-sample.c
@@ -24,6 +24,7 @@
 #endif
 
 #include <pulsecore/core-util.h>
+#include <pulsecore/protocol-dbus.h>
 
 #include "iface-sample.h"
 
@@ -34,15 +35,15 @@ struct pa_dbusiface_sample {
     char *path;
 };
 
-pa_dbusiface_sample *pa_dbusiface_sample_new(pa_scache_entry *sample, const char *path_prefix) {
+pa_dbusiface_sample *pa_dbusiface_sample_new(pa_dbusiface_core *core, pa_scache_entry *sample) {
     pa_dbusiface_sample *s;
 
+    pa_assert(core);
     pa_assert(sample);
-    pa_assert(path_prefix);
 
     s = pa_xnew(pa_dbusiface_sample, 1);
     s->sample = sample;
-    s->path = pa_sprintf_malloc("%s/%s%u", path_prefix, OBJECT_NAME, sample->index);
+    s->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, sample->index);
 
     return s;
 }
diff --git a/src/modules/dbus/iface-sample.h b/src/modules/dbus/iface-sample.h
index 1b85404..1b82648 100644
--- a/src/modules/dbus/iface-sample.h
+++ b/src/modules/dbus/iface-sample.h
@@ -30,9 +30,11 @@
 
 #include <pulsecore/core-scache.h>
 
+#include "iface-core.h"
+
 typedef struct pa_dbusiface_sample pa_dbusiface_sample;
 
-pa_dbusiface_sample *pa_dbusiface_sample_new(pa_scache_entry *sample, const char *path_prefix);
+pa_dbusiface_sample *pa_dbusiface_sample_new(pa_dbusiface_core *core, pa_scache_entry *sample);
 void pa_dbusiface_sample_free(pa_dbusiface_sample *c);
 
 const char *pa_dbusiface_sample_get_path(pa_dbusiface_sample *c);
diff --git a/src/modules/dbus/iface-stream.c b/src/modules/dbus/iface-stream.c
index 1d9ffee..b5a1789 100644
--- a/src/modules/dbus/iface-stream.c
+++ b/src/modules/dbus/iface-stream.c
@@ -24,6 +24,7 @@
 #endif
 
 #include <pulsecore/core-util.h>
+#include <pulsecore/protocol-dbus.h>
 
 #include "iface-stream.h"
 
@@ -44,30 +45,30 @@ struct pa_dbusiface_stream {
     char *path;
 };
 
-pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_sink_input *sink_input, const char *path_prefix) {
+pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_dbusiface_core *core, pa_sink_input *sink_input) {
     pa_dbusiface_stream *s;
 
+    pa_assert(core);
     pa_assert(sink_input);
-    pa_assert(path_prefix);
 
     s = pa_xnew(pa_dbusiface_stream, 1);
     s->sink_input = pa_sink_input_ref(sink_input);
     s->type = STREAM_TYPE_PLAYBACK;
-    s->path = pa_sprintf_malloc("%s/%s%u", path_prefix, PLAYBACK_OBJECT_NAME, sink_input->index);
+    s->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, PLAYBACK_OBJECT_NAME, sink_input->index);
 
     return s;
 }
 
-pa_dbusiface_stream *pa_dbusiface_stream_new_record(pa_source_output *source_output, const char *path_prefix) {
+pa_dbusiface_stream *pa_dbusiface_stream_new_record(pa_dbusiface_core *core, pa_source_output *source_output) {
     pa_dbusiface_stream *s;
 
+    pa_assert(core);
     pa_assert(source_output);
-    pa_assert(path_prefix);
 
     s = pa_xnew(pa_dbusiface_stream, 1);
     s->source_output = pa_source_output_ref(source_output);
     s->type = STREAM_TYPE_RECORD;
-    s->path = pa_sprintf_malloc("%s/%s%u", path_prefix, RECORD_OBJECT_NAME, source_output->index);
+    s->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, RECORD_OBJECT_NAME, source_output->index);
 
     return s;
 }
diff --git a/src/modules/dbus/iface-stream.h b/src/modules/dbus/iface-stream.h
index cc2f3d6..b1b1854 100644
--- a/src/modules/dbus/iface-stream.h
+++ b/src/modules/dbus/iface-stream.h
@@ -31,10 +31,12 @@
 #include <pulsecore/sink-input.h>
 #include <pulsecore/source-output.h>
 
+#include "iface-core.h"
+
 typedef struct pa_dbusiface_stream pa_dbusiface_stream;
 
-pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_sink_input *sink_input, const char *path_prefix);
-pa_dbusiface_stream *pa_dbusiface_stream_new_record(pa_source_output *source_output, const char *path_prefix);
+pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_dbusiface_core *core, pa_sink_input *sink_input);
+pa_dbusiface_stream *pa_dbusiface_stream_new_record(pa_dbusiface_core *core, pa_source_output *source_output);
 void pa_dbusiface_stream_free(pa_dbusiface_stream *s);
 
 const char *pa_dbusiface_stream_get_path(pa_dbusiface_stream *s);
diff --git a/src/pulsecore/protocol-dbus.h b/src/pulsecore/protocol-dbus.h
index f2b1b50..c6b630a 100644
--- a/src/pulsecore/protocol-dbus.h
+++ b/src/pulsecore/protocol-dbus.h
@@ -32,8 +32,11 @@
 
 #define PA_DBUS_SYSTEM_SOCKET_PATH PA_SYSTEM_RUNTIME_PATH PA_PATH_SEP PA_DBUS_SOCKET_NAME
 
-#define PA_DBUS_ERROR_NO_SUCH_PROPERTY "org.PulseAudio.Core1.NoSuchPropertyError"
-#define PA_DBUS_ERROR_NOT_FOUND "org.PulseAudio.Core1.NotFoundError"
+#define PA_DBUS_CORE_INTERFACE "org.PulseAudio.Core1"
+#define PA_DBUS_CORE_OBJECT_PATH "/org/pulseaudio/core1"
+
+#define PA_DBUS_ERROR_NO_SUCH_PROPERTY PA_DBUS_CORE_INTERFACE ".NoSuchPropertyError"
+#define PA_DBUS_ERROR_NOT_FOUND PA_DBUS_CORE_INTERFACE ".NotFoundError"
 
 /* Returns the default address of the server type in the escaped form. For
  * PA_SERVER_TYPE_NONE an empty string is returned. The caller frees the

commit 06232e2965ee02d62ca566fcbf5e805c571b574a
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 9 09:04:15 2009 +0300

    dbus: Take advantage of the PA_HASHMAP_FOREACH macro.

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index e40cb97..685ba63 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -542,7 +542,7 @@ static void handle_set_default_sample_rate(DBusConnection *conn, DBusMessage *ms
 /* The caller frees the array, but not the strings. */
 static const char **get_cards(pa_dbusiface_core *c, unsigned *n) {
     const char **cards;
-    unsigned i;
+    unsigned i = 0;
     void *state = NULL;
     pa_dbusiface_card *card;
 
@@ -556,10 +556,8 @@ static const char **get_cards(pa_dbusiface_core *c, unsigned *n) {
 
     cards = pa_xnew(const char *, *n);
 
-    for (i = 0, card = pa_hashmap_iterate(c->cards, &state, NULL); card; ++i, card = pa_hashmap_iterate(c->cards, &state, NULL))
-        cards[i] = pa_dbusiface_card_get_path(card);
-
-    pa_assert(i == *n);
+    PA_HASHMAP_FOREACH(card, c->cards, state)
+        cards[i++] = pa_dbusiface_card_get_path(card);
 
     return cards;
 }
@@ -583,7 +581,7 @@ static void handle_get_cards(DBusConnection *conn, DBusMessage *msg, void *userd
 /* The caller frees the array, but not the strings. */
 static const char **get_sinks(pa_dbusiface_core *c, unsigned *n) {
     const char **sinks;
-    unsigned i;
+    unsigned i = 0;
     void *state = NULL;
     pa_dbusiface_device *sink;
 
@@ -597,10 +595,8 @@ static const char **get_sinks(pa_dbusiface_core *c, unsigned *n) {
 
     sinks = pa_xnew(const char *, *n);
 
-    for (i = 0, sink = pa_hashmap_iterate(c->sinks_by_index, &state, NULL); sink; ++i, sink = pa_hashmap_iterate(c->sinks_by_index, &state, NULL))
-        sinks[i] = pa_dbusiface_device_get_path(sink);
-
-    pa_assert(i == *n);
+    PA_HASHMAP_FOREACH(sink, c->sinks_by_index, state)
+        sinks[i++] = pa_dbusiface_device_get_path(sink);
 
     return sinks;
 }
@@ -671,7 +667,7 @@ static void handle_set_fallback_sink(DBusConnection *conn, DBusMessage *msg, voi
 /* The caller frees the array, but not the strings. */
 static const char **get_sources(pa_dbusiface_core *c, unsigned *n) {
     const char **sources;
-    unsigned i;
+    unsigned i = 0;
     void *state = NULL;
     pa_dbusiface_device *source;
 
@@ -685,10 +681,8 @@ static const char **get_sources(pa_dbusiface_core *c, unsigned *n) {
 
     sources = pa_xnew(const char *, *n);
 
-    for (i = 0, source = pa_hashmap_iterate(c->sources_by_index, &state, NULL); source; ++i, source = pa_hashmap_iterate(c->sources_by_index, &state, NULL))
-        sources[i] = pa_dbusiface_device_get_path(source);
-
-    pa_assert(i == *n);
+    PA_HASHMAP_FOREACH(source, c->sources_by_index, state)
+        sources[i++] = pa_dbusiface_device_get_path(source);
 
     return sources;
 }
@@ -759,7 +753,7 @@ static void handle_set_fallback_source(DBusConnection *conn, DBusMessage *msg, v
 /* The caller frees the array, but not the strings. */
 static const char **get_playback_streams(pa_dbusiface_core *c, unsigned *n) {
     const char **streams;
-    unsigned i;
+    unsigned i = 0;
     void *state = NULL;
     pa_dbusiface_stream *stream;
 
@@ -773,10 +767,8 @@ static const char **get_playback_streams(pa_dbusiface_core *c, unsigned *n) {
 
     streams = pa_xnew(const char *, *n);
 
-    for (i = 0, stream = pa_hashmap_iterate(c->playback_streams, &state, NULL); stream; ++i, stream = pa_hashmap_iterate(c->playback_streams, &state, NULL))
-        streams[i] = pa_dbusiface_stream_get_path(stream);
-
-    pa_assert(i == *n);
+    PA_HASHMAP_FOREACH(stream, c->playback_streams, state)
+        streams[i++] = pa_dbusiface_stream_get_path(stream);
 
     return streams;
 }
@@ -800,7 +792,7 @@ static void handle_get_playback_streams(DBusConnection *conn, DBusMessage *msg,
 /* The caller frees the array, but not the strings. */
 static const char **get_record_streams(pa_dbusiface_core *c, unsigned *n) {
     const char **streams;
-    unsigned i;
+    unsigned i = 0;
     void *state = NULL;
     pa_dbusiface_stream *stream;
 
@@ -814,10 +806,8 @@ static const char **get_record_streams(pa_dbusiface_core *c, unsigned *n) {
 
     streams = pa_xnew(const char *, *n);
 
-    for (i = 0, stream = pa_hashmap_iterate(c->record_streams, &state, NULL); stream; ++i, stream = pa_hashmap_iterate(c->record_streams, &state, NULL))
-        streams[i] = pa_dbusiface_stream_get_path(stream);
-
-    pa_assert(i == *n);
+    PA_HASHMAP_FOREACH(stream, c->record_streams, state)
+        streams[i++] = pa_dbusiface_stream_get_path(stream);
 
     return streams;
 }
@@ -841,7 +831,7 @@ static void handle_get_record_streams(DBusConnection *conn, DBusMessage *msg, vo
 /* The caller frees the array, but not the strings. */
 static const char **get_samples(pa_dbusiface_core *c, unsigned *n) {
     const char **samples;
-    unsigned i;
+    unsigned i = 0;
     void *state = NULL;
     pa_dbusiface_sample *sample;
 
@@ -855,10 +845,8 @@ static const char **get_samples(pa_dbusiface_core *c, unsigned *n) {
 
     samples = pa_xnew(const char *, *n);
 
-    for (i = 0, sample = pa_hashmap_iterate(c->samples, &state, NULL); sample; ++i, sample = pa_hashmap_iterate(c->samples, &state, NULL))
-        samples[i] = pa_dbusiface_sample_get_path(sample);
-
-    pa_assert(i == *n);
+    PA_HASHMAP_FOREACH(sample, c->samples, state)
+        samples[i++] = pa_dbusiface_sample_get_path(sample);
 
     return samples;
 }
@@ -882,7 +870,7 @@ static void handle_get_samples(DBusConnection *conn, DBusMessage *msg, void *use
 /* The caller frees the array, but not the strings. */
 static const char **get_modules(pa_dbusiface_core *c, unsigned *n) {
     const char **modules;
-    unsigned i;
+    unsigned i = 0;
     void *state = NULL;
     pa_dbusiface_module *module;
 
@@ -896,10 +884,8 @@ static const char **get_modules(pa_dbusiface_core *c, unsigned *n) {
 
     modules = pa_xnew(const char *, *n);
 
-    for (i = 0, module = pa_hashmap_iterate(c->modules, &state, NULL); module; ++i, module = pa_hashmap_iterate(c->modules, &state, NULL))
-        modules[i] = pa_dbusiface_module_get_path(module);
-
-    pa_assert(i == *n);
+    PA_HASHMAP_FOREACH(module, c->modules, state)
+        modules[i++] = pa_dbusiface_module_get_path(module);
 
     return modules;
 }
@@ -923,7 +909,7 @@ static void handle_get_modules(DBusConnection *conn, DBusMessage *msg, void *use
 /* The caller frees the array, but not the strings. */
 static const char **get_clients(pa_dbusiface_core *c, unsigned *n) {
     const char **clients;
-    unsigned i;
+    unsigned i = 0;
     void *state = NULL;
     pa_dbusiface_client *client;
 
@@ -937,10 +923,8 @@ static const char **get_clients(pa_dbusiface_core *c, unsigned *n) {
 
     clients = pa_xnew(const char *, *n);
 
-    for (i = 0, client = pa_hashmap_iterate(c->clients, &state, NULL); client; ++i, client = pa_hashmap_iterate(c->clients, &state, NULL))
-        clients[i] = pa_dbusiface_client_get_path(client);
-
-    pa_assert(i == *n);
+    PA_HASHMAP_FOREACH(client, c->clients, state)
+        clients[i++] = pa_dbusiface_client_get_path(client);
 
     return clients;
 }
diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index bccdf93..e906303 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -553,10 +553,8 @@ static const char **get_entries(struct userdata *u, unsigned *n) {
 
     entries = pa_xnew(const char *, *n);
 
-    while ((de = pa_hashmap_iterate(u->dbus_entries, &state, NULL))) {
-        entries[i] = de->object_path;
-        ++i;
-    }
+    PA_HASHMAP_FOREACH(de, u->dbus_entries, state)
+        entries[i++] = de->object_path;
 
     return entries;
 }
@@ -1747,7 +1745,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
                 struct dbus_entry *de;
                 void *state = NULL;
 
-                while ((de = pa_hashmap_iterate(u->dbus_entries, &state, NULL))) {
+                PA_HASHMAP_FOREACH(de, u->dbus_entries, state) {
                     send_entry_removed_signal(de);
                     dbus_entry_free(pa_hashmap_remove(u->dbus_entries, de->entry_name));
                 }
diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index 0609867..5cbd0d9 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -186,7 +186,7 @@ static void update_introspection(struct object_entry *oe) {
     pa_strbuf_puts(buf, DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE);
     pa_strbuf_puts(buf, "<node>\n");
 
-    while ((iface_entry = pa_hashmap_iterate(oe->interfaces, &interfaces_state, NULL))) {
+    PA_HASHMAP_FOREACH(iface_entry, oe->interfaces, interfaces_state) {
         pa_dbus_method_handler *method_handler;
         pa_dbus_property_handler *property_handler;
         void *handlers_state = NULL;
@@ -195,7 +195,7 @@ static void update_introspection(struct object_entry *oe) {
 
         pa_strbuf_printf(buf, " <interface name=\"%s\">\n", iface_entry->name);
 
-        while ((method_handler = pa_hashmap_iterate(iface_entry->method_handlers, &handlers_state, NULL))) {
+        PA_HASHMAP_FOREACH(method_handler, iface_entry->method_handlers, handlers_state) {
             pa_strbuf_printf(buf, "  <method name=\"%s\">\n", method_handler->method_name);
 
             for (i = 0; i < method_handler->n_arguments; ++i)
@@ -278,7 +278,7 @@ static enum find_result_t find_handler_by_property(struct object_entry *obj_entr
     pa_assert(iface_entry);
     pa_assert(property_handler);
 
-    while ((*iface_entry = pa_hashmap_iterate(obj_entry->interfaces, &state, NULL))) {
+    PA_HASHMAP_FOREACH(*iface_entry, obj_entry->interfaces, state) {
         if ((*property_handler = pa_hashmap_get((*iface_entry)->property_handlers, property))) {
             if (dbus_message_has_member(msg, "Get"))
                 return (*property_handler)->get_cb ? FOUND_GET_PROPERTY : PROPERTY_ACCESS_DENIED;
@@ -303,7 +303,7 @@ static enum find_result_t find_handler_by_method(struct object_entry *obj_entry,
     pa_assert(iface_entry);
     pa_assert(method_handler);
 
-    while ((*iface_entry = pa_hashmap_iterate(obj_entry->interfaces, &state, NULL))) {
+    PA_HASHMAP_FOREACH(*iface_entry, obj_entry->interfaces, state) {
         if ((*method_handler = pa_hashmap_get((*iface_entry)->method_handlers, method)))
             return FOUND_METHOD;
     }
@@ -497,7 +497,7 @@ static void register_object(pa_dbus_protocol *p, struct object_entry *obj_entry)
     pa_assert(p);
     pa_assert(obj_entry);
 
-    while ((conn_entry = pa_hashmap_iterate(p->connections, &state, NULL)))
+    PA_HASHMAP_FOREACH(conn_entry, p->connections, state)
         pa_assert_se(dbus_connection_register_object_path(conn_entry->connection, obj_entry->path, &vtable, p));
 }
 
@@ -652,7 +652,7 @@ static void unregister_object(pa_dbus_protocol *p, struct object_entry *obj_entr
     pa_assert(p);
     pa_assert(obj_entry);
 
-    while ((conn_entry = pa_hashmap_iterate(p->connections, &state, NULL)))
+    PA_HASHMAP_FOREACH(conn_entry, p->connections, state)
         pa_assert_se(dbus_connection_unregister_object_path(conn_entry->connection, obj_entry->path));
 }
 
@@ -742,7 +742,7 @@ static void register_all_objects(pa_dbus_protocol *p, DBusConnection *conn) {
     pa_assert(p);
     pa_assert(conn);
 
-    while ((obj_entry = pa_hashmap_iterate(p->objects, &state, NULL)))
+    PA_HASHMAP_FOREACH(obj_entry, p->objects, state)
         pa_assert_se(dbus_connection_register_object_path(conn, obj_entry->path, &vtable, p));
 }
 
@@ -777,7 +777,7 @@ static void unregister_all_objects(pa_dbus_protocol *p, DBusConnection *conn) {
     pa_assert(p);
     pa_assert(conn);
 
-    while ((obj_entry = pa_hashmap_iterate(p->objects, &state, NULL)))
+    PA_HASHMAP_FOREACH(obj_entry, p->objects, state)
         pa_assert_se(dbus_connection_unregister_object_path(conn, obj_entry->path));
 }
 
@@ -904,13 +904,7 @@ void pa_dbus_protocol_send_signal(pa_dbus_protocol *p, DBusMessage *signal) {
     pa_assert(signal);
     pa_assert(dbus_message_get_type(signal) == DBUS_MESSAGE_TYPE_SIGNAL);
 
-    /* XXX: We have to do some linear searching to find connections that want
-     * to receive the signal. This shouldn't be very significant performance
-     * problem, and adding an (object path, signal name) -> connection mapping
-     * would be likely to create substantial complexity. */
-
-    while ((conn_entry = pa_hashmap_iterate(p->connections, &state, NULL))) {
-
+    PA_HASHMAP_FOREACH(conn_entry, p->connections, state) {
         if ((conn_entry->listening_for_all_signals /* Case 1: listening for all signals */
              && (pa_idxset_get_by_data(conn_entry->all_signals_objects, dbus_message_get_path(signal), NULL)
                  || pa_idxset_isempty(conn_entry->all_signals_objects)))
@@ -943,10 +937,8 @@ const char **pa_dbus_protocol_get_extensions(pa_dbus_protocol *p, unsigned *n) {
 
     extensions = pa_xnew(const char *, *n);
 
-    while ((ext_name = pa_idxset_iterate(p->extensions, &state, NULL))) {
-        extensions[i] = ext_name;
-        ++i;
-    }
+    while ((ext_name = pa_idxset_iterate(p->extensions, &state, NULL)))
+        extensions[i++] = ext_name;
 
     return extensions;
 }

commit 0b6662023bfb121b0e553ce00b4229705c8e7aef
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 9 09:06:21 2009 +0300

    dbusiface-core: Generate more informative error messages.

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index 685ba63..be07648 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -655,7 +655,7 @@ static void handle_set_fallback_sink(DBusConnection *conn, DBusMessage *msg, voi
         return;
 
     if (!(fallback_sink = pa_hashmap_get(c->sinks_by_path, object_path))) {
-        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such sink.");
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such sink.", object_path);
         return;
     }
 
@@ -741,7 +741,7 @@ static void handle_set_fallback_source(DBusConnection *conn, DBusMessage *msg, v
         return;
 
     if (!(fallback_source = pa_hashmap_get(c->sources_by_path, object_path))) {
-        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such source.");
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such source.", object_path);
         return;
     }
 
@@ -1154,7 +1154,7 @@ static void handle_get_sink_by_name(DBusConnection *conn, DBusMessage *msg, void
     }
 
     if (!(sink = pa_namereg_get(c->core, sink_name, PA_NAMEREG_SINK))) {
-        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such sink.");
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such sink.", sink_name);
         return;
     }
 
@@ -1186,7 +1186,7 @@ static void handle_get_source_by_name(DBusConnection *conn, DBusMessage *msg, vo
     }
 
     if (!(source = pa_namereg_get(c->core, source_name, PA_NAMEREG_SOURCE))) {
-        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such source.");
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such source.", source_name);
         return;
     }
 

commit 5ece8e8833ff40a4c535fc7d6705377fcf7fd0fd
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 9 09:10:05 2009 +0300

    dbusiface-core: Add functions for getting various object paths.

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index be07648..e8ea50b 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -2033,3 +2033,24 @@ void pa_dbusiface_core_free(pa_dbusiface_core *c) {
 
     pa_xfree(c);
 }
+
+const char *pa_dbusiface_core_get_sink_path(pa_dbusiface_core *c, const pa_sink *sink) {
+    pa_assert(c);
+    pa_assert(sink);
+
+    return pa_dbusiface_device_get_path(pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(sink->index)));
+}
+
+const char *pa_dbusiface_core_get_source_path(pa_dbusiface_core *c, const pa_source *source) {
+    pa_assert(c);
+    pa_assert(source);
+
+    return pa_dbusiface_device_get_path(pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(source->index)));
+}
+
+const char *pa_dbusiface_core_get_module_path(pa_dbusiface_core *c, const pa_module *module) {
+    pa_assert(c);
+    pa_assert(module);
+
+    return pa_dbusiface_module_get_path(pa_hashmap_get(c->modules, PA_UINT32_TO_PTR(module->index)));
+}
diff --git a/src/modules/dbus/iface-core.h b/src/modules/dbus/iface-core.h
index 964a37b..1b73782 100644
--- a/src/modules/dbus/iface-core.h
+++ b/src/modules/dbus/iface-core.h
@@ -35,4 +35,8 @@ typedef struct pa_dbusiface_core pa_dbusiface_core;
 pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core);
 void pa_dbusiface_core_free(pa_dbusiface_core *c);
 
+const char *pa_dbusiface_core_get_sink_path(pa_dbusiface_core *c, const pa_sink *sink);
+const char *pa_dbusiface_core_get_source_path(pa_dbusiface_core *c, const pa_source *source);
+const char *pa_dbusiface_core_get_module_path(pa_dbusiface_core *c, const pa_module *module);
+
 #endif

commit 3e9de1a36c3f85f558f08167cd82163b0cbf3484
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 9 09:12:31 2009 +0300

    dbus-util: Add helpers for proplist handling.

diff --git a/src/pulsecore/dbus-util.c b/src/pulsecore/dbus-util.c
index 5db7f21..903acad 100644
--- a/src/pulsecore/dbus-util.c
+++ b/src/pulsecore/dbus-util.c
@@ -564,6 +564,21 @@ void pa_dbus_send_basic_array_variant_reply(DBusConnection *c, DBusMessage *in_r
     dbus_message_unref(reply);
 }
 
+void pa_dbus_send_proplist_variant_reply(DBusConnection *c, DBusMessage *in_reply_to, pa_proplist *proplist) {
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+
+    pa_assert(c);
+    pa_assert(in_reply_to);
+    pa_assert(proplist);
+
+    pa_assert_se((reply = dbus_message_new_method_return(in_reply_to)));
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_dbus_append_proplist_variant(&msg_iter, proplist);
+    pa_assert_se(dbus_connection_send(c, reply, NULL));
+    dbus_message_unref(reply);
+}
+
 void pa_dbus_append_basic_array(DBusMessageIter *iter, int item_type, const void *array, unsigned n) {
     DBusMessageIter array_iter;
     unsigned i;
@@ -640,6 +655,62 @@ void pa_dbus_append_basic_array_variant_dict_entry(DBusMessageIter *dict_iter, c
     pa_assert_se(dbus_message_iter_close_container(dict_iter, &dict_entry_iter));
 }
 
+void pa_dbus_append_proplist(DBusMessageIter *iter, pa_proplist *proplist) {
+    DBusMessageIter dict_iter;
+    DBusMessageIter dict_entry_iter;
+    DBusMessageIter array_iter;
+    void *state = NULL;
+    const char *key;
+
+    pa_assert(iter);
+    pa_assert(proplist);
+
+    pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "{say}", &dict_iter));
+
+    while ((key = pa_proplist_iterate(proplist, state))) {
+        const void *value = NULL;
+        size_t nbytes;
+
+        pa_assert_se(pa_proplist_get(proplist, key, &value, &nbytes) >= 0);
+
+        pa_assert_se(dbus_message_iter_open_container(&dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter));
+
+        pa_assert_se(dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &key));
+
+        pa_assert_se(dbus_message_iter_open_container(&dict_entry_iter, DBUS_TYPE_ARRAY, "y", &array_iter));
+        pa_assert_se(dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE, &value, nbytes));
+        pa_assert_se(dbus_message_iter_close_container(&dict_entry_iter, &array_iter));
+
+        pa_assert_se(dbus_message_iter_close_container(&dict_iter, &dict_entry_iter));
+    }
+
+    pa_assert_se(dbus_message_iter_close_container(iter, &dict_iter));
+}
+
+void pa_dbus_append_proplist_variant(DBusMessageIter *iter, pa_proplist *proplist) {
+    DBusMessageIter variant_iter;
+
+    pa_assert(iter);
+    pa_assert(proplist);
+
+    pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{say}", &variant_iter));
+    pa_dbus_append_proplist(&variant_iter, proplist);
+    pa_assert_se(dbus_message_iter_close_container(iter, &variant_iter));
+}
+
+void pa_dbus_append_proplist_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, pa_proplist *proplist) {
+    DBusMessageIter dict_entry_iter;
+
+    pa_assert(dict_iter);
+    pa_assert(key);
+    pa_assert(proplist);
+
+    pa_assert_se(dbus_message_iter_open_container(dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter));
+    pa_assert_se(dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &key));
+    pa_dbus_append_proplist_variant(&dict_entry_iter, proplist);
+    pa_assert_se(dbus_message_iter_close_container(dict_iter, &dict_entry_iter));
+}
+
 int pa_dbus_get_basic_set_property_arg(DBusConnection *c, DBusMessage *msg, int type, void *data) {
     DBusMessageIter msg_iter;
     DBusMessageIter variant_iter;
diff --git a/src/pulsecore/dbus-util.h b/src/pulsecore/dbus-util.h
index 97aae37..5443a4c 100644
--- a/src/pulsecore/dbus-util.h
+++ b/src/pulsecore/dbus-util.h
@@ -69,12 +69,16 @@ void pa_dbus_send_empty_reply(DBusConnection *c, DBusMessage *in_reply_to);
 void pa_dbus_send_basic_value_reply(DBusConnection *c, DBusMessage *in_reply_to, int type, void *data);
 void pa_dbus_send_basic_variant_reply(DBusConnection *c, DBusMessage *in_reply_to, int type, void *data);
 void pa_dbus_send_basic_array_variant_reply(DBusConnection *c, DBusMessage *in_reply_to, int item_type, void *array, unsigned n);
+void pa_dbus_send_proplist_variant_reply(DBusConnection *c, DBusMessage *in_reply_to, pa_proplist *proplist);
 
 void pa_dbus_append_basic_array(DBusMessageIter *iter, int item_type, const void *array, unsigned n);
 void pa_dbus_append_basic_array_variant(DBusMessageIter *iter, int item_type, const void *array, unsigned n);
 void pa_dbus_append_basic_variant(DBusMessageIter *iter, int type, void *data);
 void pa_dbus_append_basic_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, int type, void *data);
 void pa_dbus_append_basic_array_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, int item_type, const void *array, unsigned n);
+void pa_dbus_append_proplist(DBusMessageIter *iter, pa_proplist *proplist);
+void pa_dbus_append_proplist_variant(DBusMessageIter *iter, pa_proplist *proplist);
+void pa_dbus_append_proplist_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, pa_proplist *proplist);
 
 /* Helper functions for extracting the value argument of a Set call. If the
  * message is invalid, an error reply is sent and a negative number is

commit 76bd03bddb7967c56d68ead22e5d4eae5a82625a
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 9 09:14:27 2009 +0300

    dbus-util: Trivial comment punctuation fix.

diff --git a/src/pulsecore/dbus-util.h b/src/pulsecore/dbus-util.h
index 5443a4c..9cee293 100644
--- a/src/pulsecore/dbus-util.h
+++ b/src/pulsecore/dbus-util.h
@@ -91,8 +91,8 @@ int pa_dbus_get_fixed_array_set_property_arg(DBusConnection *c, DBusMessage *msg
 int pa_dbus_get_basic_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter, int type, void *data);
 int pa_dbus_get_fixed_array_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter, int item_type, void *array, unsigned *n);
 
-/* Returns a new proplist, that the caller has to free. If the proplist can't
- * be read from the iterator, an error reply is sent and NULL is returned. */
+/* Returns a new proplist that the caller has to free. If the proplist can't be
+ * read from the iterator, an error reply is sent and NULL is returned. */
 pa_proplist *pa_dbus_get_proplist_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter);
 
 #endif

commit 7699cfd4c041eedd2dae124cac75da0879b87f1e
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 9 09:18:03 2009 +0300

    dbus-protocol: Split some overly long lines.

diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index 5cbd0d9..2461e4b 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -199,19 +199,21 @@ static void update_introspection(struct object_entry *oe) {
             pa_strbuf_printf(buf, "  <method name=\"%s\">\n", method_handler->method_name);
 
             for (i = 0; i < method_handler->n_arguments; ++i)
-                pa_strbuf_printf(buf, "   <arg name=\"%s\" type=\"%s\" direction=\"%s\"/>\n", method_handler->arguments[i].name,
-                                                                                              method_handler->arguments[i].type,
-                                                                                              method_handler->arguments[i].direction);
+                pa_strbuf_printf(buf, "   <arg name=\"%s\" type=\"%s\" direction=\"%s\"/>\n",
+                                 method_handler->arguments[i].name,
+                                 method_handler->arguments[i].type,
+                                 method_handler->arguments[i].direction);
 
             pa_strbuf_puts(buf, "  </method>\n");
         }
 
         handlers_state = NULL;
 
-        while ((property_handler = pa_hashmap_iterate(iface_entry->property_handlers, &handlers_state, NULL)))
-            pa_strbuf_printf(buf, "  <property name=\"%s\" type=\"%s\" access=\"%s\"/>\n", property_handler->property_name,
-                                                                                           property_handler->type,
-                                                                                           property_handler->get_cb ? (property_handler->set_cb ? "readwrite" : "read") : "write");
+        PA_HASHMAP_FOREACH(property_handler, iface_entry->property_handlers, handlers_state)
+            pa_strbuf_printf(buf, "  <property name=\"%s\" type=\"%s\" access=\"%s\"/>\n",
+                             property_handler->property_name,
+                             property_handler->type,
+                             property_handler->get_cb ? (property_handler->set_cb ? "readwrite" : "read") : "write");
 
         for (i = 0; i < iface_entry->n_signals; ++i) {
             pa_strbuf_printf(buf, "  <signal name=\"%s\">\n", iface_entry->signals[i].name);

commit 16dce8d7cbe4dcad56c3fbd1f47af6b50d2581a7
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 9 09:19:33 2009 +0300

    dbus-protocol: Take advantage of the helpers in dbus-util.

diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index 2461e4b..62f74a5 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -28,6 +28,7 @@
 #include <pulse/xmalloc.h>
 
 #include <pulsecore/core-util.h>
+#include <pulsecore/dbus-util.h>
 #include <pulsecore/hashmap.h>
 #include <pulsecore/idxset.h>
 #include <pulsecore/shared.h>
@@ -408,7 +409,6 @@ static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessa
     pa_dbus_method_handler *method_handler = NULL;
     pa_dbus_property_handler *property_handler = NULL;
     const char *attempted_property = NULL;
-    DBusMessage *reply = NULL;
 
     pa_assert(connection);
     pa_assert(message);
@@ -427,10 +427,7 @@ static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessa
 
     if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Introspectable", "Introspect") ||
         (!dbus_message_get_interface(message) && dbus_message_has_member(message, "Introspect"))) {
-        pa_assert_se((reply = dbus_message_new_method_return(message)));
-        pa_assert_se(dbus_message_append_args(reply, DBUS_TYPE_STRING, &obj_entry->introspection, DBUS_TYPE_INVALID));
-        pa_assert_se(dbus_connection_send(connection, reply, NULL));
-
+        pa_dbus_send_basic_value_reply(connection, message, DBUS_TYPE_STRING, &obj_entry->introspection);
         goto finish;
     }
 
@@ -450,26 +447,23 @@ static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessa
         case FOUND_GET_ALL:
             if (iface_entry->get_all_properties_cb)
                 iface_entry->get_all_properties_cb(connection, message, iface_entry->userdata);
+            /* TODO: Write an else branch where a dummy response is sent. */
             break;
 
         case PROPERTY_ACCESS_DENIED:
-            pa_assert_se((reply = dbus_message_new_error_printf(message, DBUS_ERROR_ACCESS_DENIED, "%s access denied for property %s", dbus_message_get_member(message), attempted_property)));
-            pa_assert_se(dbus_connection_send(connection, reply, NULL));
+            pa_dbus_send_error(connection, message, DBUS_ERROR_ACCESS_DENIED, "%s access denied for property %s", dbus_message_get_member(message), attempted_property);
             break;
 
         case NO_SUCH_METHOD:
-            pa_assert_se((reply = dbus_message_new_error_printf(message, DBUS_ERROR_UNKNOWN_METHOD, "%s: No such method", dbus_message_get_member(message))));
-            pa_assert_se(dbus_connection_send(connection, reply, NULL));
+            pa_dbus_send_error(connection, message, DBUS_ERROR_UNKNOWN_METHOD, "%s: No such method", dbus_message_get_member(message));
             break;
 
         case NO_SUCH_PROPERTY:
-            pa_assert_se((reply = dbus_message_new_error_printf(message, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s: No such property", attempted_property)));
-            pa_assert_se(dbus_connection_send(connection, reply, NULL));
+            pa_dbus_send_error(connection, message, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s: No such property", attempted_property);
             break;
 
         case INVALID_MESSAGE_ARGUMENTS:
-            pa_assert_se((reply = dbus_message_new_error_printf(message, DBUS_ERROR_INVALID_ARGS, "Invalid arguments for %s", dbus_message_get_member(message))));
-            pa_assert_se(dbus_connection_send(connection, reply, NULL));
+            pa_dbus_send_error(connection, message, DBUS_ERROR_INVALID_ARGS, "Invalid arguments for %s", dbus_message_get_member(message));
             break;
 
         default:
@@ -477,9 +471,6 @@ static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessa
     }
 
 finish:
-    if (reply)
-        dbus_message_unref(reply);
-
     return DBUS_HANDLER_RESULT_HANDLED;
 }
 

commit acad5063284f37315c8208916f1ac151791d7220
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 9 09:20:22 2009 +0300

    dbusiface-card: Implement the Card D-Bus interface.

diff --git a/src/Makefile.am b/src/Makefile.am
index e10b4ab..e605ad7 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1278,6 +1278,7 @@ module_http_protocol_unix_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINORMI
 
 module_dbus_protocol_la_SOURCES = \
 		modules/dbus/iface-card.c modules/dbus/iface-card.h \
+		modules/dbus/iface-card-profile.c modules/dbus/iface-card-profile.h \
 		modules/dbus/iface-client.c modules/dbus/iface-client.h \
 		modules/dbus/iface-core.c modules/dbus/iface-core.h \
 		modules/dbus/iface-device.c modules/dbus/iface-device.h \
diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card-profile.c
similarity index 51%
copy from src/modules/dbus/iface-card.c
copy to src/modules/dbus/iface-card-profile.c
index e203c39..7952494 100644
--- a/src/modules/dbus/iface-card.c
+++ b/src/modules/dbus/iface-card-profile.c
@@ -24,43 +24,44 @@
 #endif
 
 #include <pulsecore/core-util.h>
-#include <pulsecore/protocol-dbus.h>
 
-#include "iface-card.h"
+#include "iface-card-profile.h"
 
-#define OBJECT_NAME "card"
+#define OBJECT_NAME "profile"
 
-struct pa_dbusiface_card {
-    pa_dbusiface_core *core;
-
-    pa_card *card;
+struct pa_dbusiface_card_profile {
+    pa_card_profile *profile;
     char *path;
 };
 
+pa_dbusiface_card_profile *pa_dbusiface_card_profile_new(pa_dbusiface_card *card, pa_card_profile *profile, uint32_t idx) {
+    pa_dbusiface_card_profile *p = NULL;
 
-pa_dbusiface_card *pa_dbusiface_card_new(pa_dbusiface_core *core, pa_card *card) {
-    pa_dbusiface_card *c = NULL;
-
-    pa_assert(core);
     pa_assert(card);
+    pa_assert(profile);
+
+    p = pa_xnew(pa_dbusiface_card_profile, 1);
+    p->profile = profile;
+    p->path = pa_sprintf_malloc("%s/%s%u", pa_dbusiface_card_get_path(card), OBJECT_NAME, idx);
+
+    return p;
+}
 
-    c = pa_xnew0(pa_dbusiface_card, 1);
-    c->core = core;
-    c->card = card;
-    c->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, card->index);
+void pa_dbusiface_card_profile_free(pa_dbusiface_card_profile *p) {
+    pa_assert(p);
 
-    return c;
+    pa_xfree(p->path);
+    pa_xfree(p);
 }
 
-void pa_dbusiface_card_free(pa_dbusiface_card *c) {
-    pa_assert(c);
+const char *pa_dbusiface_card_profile_get_path(pa_dbusiface_card_profile *p) {
+    pa_assert(p);
 
-    pa_xfree(c->path);
-    pa_xfree(c);
+    return p->path;
 }
 
-const char *pa_dbusiface_card_get_path(pa_dbusiface_card *c) {
-    pa_assert(c);
+const char *pa_dbusiface_card_profile_get_name(pa_dbusiface_card_profile *p) {
+    pa_assert(p);
 
-    return c->path;
+    return p->profile->name;
 }
diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card-profile.h
similarity index 50%
copy from src/modules/dbus/iface-card.c
copy to src/modules/dbus/iface-card-profile.h
index e203c39..e90313c 100644
--- a/src/modules/dbus/iface-card.c
+++ b/src/modules/dbus/iface-card-profile.h
@@ -1,3 +1,6 @@
+#ifndef foodbusifacecardprofilehfoo
+#define foodbusifacecardprofilehfoo
+
 /***
   This file is part of PulseAudio.
 
@@ -19,48 +22,22 @@
   USA.
 ***/
 
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
+/* This object implements the D-Bus interface org.PulseAudio.Core1.CardProfile.
+ *
+ * See http://pulseaudio.org/wiki/DBusInterface for the CardProfile interface
+ * documentation.
+ */
 
-#include <pulsecore/core-util.h>
-#include <pulsecore/protocol-dbus.h>
+#include <pulsecore/core-scache.h>
 
 #include "iface-card.h"
 
-#define OBJECT_NAME "card"
-
-struct pa_dbusiface_card {
-    pa_dbusiface_core *core;
-
-    pa_card *card;
-    char *path;
-};
-
-
-pa_dbusiface_card *pa_dbusiface_card_new(pa_dbusiface_core *core, pa_card *card) {
-    pa_dbusiface_card *c = NULL;
+typedef struct pa_dbusiface_card_profile pa_dbusiface_card_profile;
 
-    pa_assert(core);
-    pa_assert(card);
+pa_dbusiface_card_profile *pa_dbusiface_card_profile_new(pa_dbusiface_card *card, pa_card_profile *profile, uint32_t idx);
+void pa_dbusiface_card_profile_free(pa_dbusiface_card_profile *p);
 
-    c = pa_xnew0(pa_dbusiface_card, 1);
-    c->core = core;
-    c->card = card;
-    c->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, card->index);
+const char *pa_dbusiface_card_profile_get_path(pa_dbusiface_card_profile *p);
+const char *pa_dbusiface_card_profile_get_name(pa_dbusiface_card_profile *p);
 
-    return c;
-}
-
-void pa_dbusiface_card_free(pa_dbusiface_card *c) {
-    pa_assert(c);
-
-    pa_xfree(c->path);
-    pa_xfree(c);
-}
-
-const char *pa_dbusiface_card_get_path(pa_dbusiface_card *c) {
-    pa_assert(c);
-
-    return c->path;
-}
+#endif
diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card.c
index e203c39..4ede718 100644
--- a/src/modules/dbus/iface-card.c
+++ b/src/modules/dbus/iface-card.c
@@ -23,20 +23,476 @@
 #include <config.h>
 #endif
 
+#include <dbus/dbus.h>
+
 #include <pulsecore/core-util.h>
+#include <pulsecore/dbus-util.h>
 #include <pulsecore/protocol-dbus.h>
 
+#include "iface-card-profile.h"
+
 #include "iface-card.h"
 
 #define OBJECT_NAME "card"
 
+static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_sinks(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_sources(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_profiles(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_active_profile(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_active_profile(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_get_profile_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
 struct pa_dbusiface_card {
     pa_dbusiface_core *core;
 
     pa_card *card;
     char *path;
+    pa_hashmap *profiles;
+    uint32_t next_profile_index;
+    pa_card_profile *active_profile;
+    pa_proplist *proplist;
+
+    pa_dbus_protocol *dbus_protocol;
+    pa_subscription *subscription;
 };
 
+enum property_handler_index {
+    PROPERTY_HANDLER_INDEX,
+    PROPERTY_HANDLER_NAME,
+    PROPERTY_HANDLER_DRIVER,
+    PROPERTY_HANDLER_OWNER_MODULE,
+    PROPERTY_HANDLER_SINKS,
+    PROPERTY_HANDLER_SOURCES,
+    PROPERTY_HANDLER_PROFILES,
+    PROPERTY_HANDLER_ACTIVE_PROFILE,
+    PROPERTY_HANDLER_PROPERTY_LIST,
+    PROPERTY_HANDLER_MAX
+};
+
+static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
+    [PROPERTY_HANDLER_INDEX]          = { .property_name = "Index",         .type = "u",      .get_cb = handle_get_index,          .set_cb = NULL },
+    [PROPERTY_HANDLER_NAME]           = { .property_name = "Name",          .type = "s",      .get_cb = handle_get_name,           .set_cb = NULL },
+    [PROPERTY_HANDLER_DRIVER]         = { .property_name = "Driver",        .type = "s",      .get_cb = handle_get_driver,         .set_cb = NULL },
+    [PROPERTY_HANDLER_OWNER_MODULE]   = { .property_name = "OwnerModule",   .type = "o",      .get_cb = handle_get_owner_module,   .set_cb = NULL },
+    [PROPERTY_HANDLER_SINKS]          = { .property_name = "Sinks",         .type = "ao",     .get_cb = handle_get_sinks,          .set_cb = NULL },
+    [PROPERTY_HANDLER_SOURCES]        = { .property_name = "Sources",       .type = "ao",     .get_cb = handle_get_sources,        .set_cb = NULL },
+    [PROPERTY_HANDLER_PROFILES]       = { .property_name = "Profiles",      .type = "ao",     .get_cb = handle_get_profiles,       .set_cb = NULL },
+    [PROPERTY_HANDLER_ACTIVE_PROFILE] = { .property_name = "ActiveProfile", .type = "o",      .get_cb = handle_get_active_profile, .set_cb = handle_set_active_profile },
+    [PROPERTY_HANDLER_PROPERTY_LIST]  = { .property_name = "PropertyList",  .type = "a{say}", .get_cb = handle_get_property_list,  .set_cb = NULL }
+};
+
+enum method_handler_index {
+    METHOD_HANDLER_GET_PROFILE_BY_NAME,
+    METHOD_HANDLER_MAX
+};
+
+static pa_dbus_arg_info get_profile_by_name_args[] = { { "name", "s", "in" }, { "profile", "o", "out" } };
+
+static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
+    [METHOD_HANDLER_GET_PROFILE_BY_NAME] = {
+        .method_name = "GetProfileByName",
+        .arguments = get_profile_by_name_args,
+        .n_arguments = sizeof(get_profile_by_name_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_get_profile_by_name }
+};
+
+enum signal_index {
+    SIGNAL_ACTIVE_PROFILE_UPDATED,
+    SIGNAL_PROPERTY_LIST_UPDATED,
+    SIGNAL_MAX
+};
+
+static pa_dbus_arg_info active_profile_updated_args[] = { { "profile",       "o",      NULL } };
+static pa_dbus_arg_info property_list_updated_args[] =  { { "property_list", "a{say}", NULL } };
+
+static pa_dbus_signal_info signals[SIGNAL_MAX] = {
+    [SIGNAL_ACTIVE_PROFILE_UPDATED] = { .name = "ActiveProfileUpdated", .arguments = active_profile_updated_args, .n_arguments = 1 },
+    [SIGNAL_PROPERTY_LIST_UPDATED]  = { .name = "PropertyListUpdated",  .arguments = property_list_updated_args,  .n_arguments = 1 }
+};
+
+static pa_dbus_interface_info card_interface_info = {
+    .name = PA_DBUSIFACE_CARD_INTERFACE,
+    .method_handlers = method_handlers,
+    .n_method_handlers = METHOD_HANDLER_MAX,
+    .property_handlers = property_handlers,
+    .n_property_handlers = PROPERTY_HANDLER_MAX,
+    .get_all_properties_cb = handle_get_all,
+    .signals = signals,
+    .n_signals = SIGNAL_MAX
+};
+
+static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card *c = userdata;
+    dbus_uint32_t idx;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    idx = c->card->index;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &idx);
+}
+
+static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card *c = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &c->card->name);
+}
+
+static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card *c = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &c->card->driver);
+}
+
+static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card *c = userdata;
+    const char *owner_module;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    if (!c->card->module) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Card %s doesn't have an owner module.", c->card->name);
+        return;
+    }
+
+    owner_module = pa_dbusiface_core_get_module_path(c->core, c->card->module);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &owner_module);
+}
+
+/* The caller frees the array, but not the strings. */
+static const char **get_sinks(pa_dbusiface_card *c, unsigned *n) {
+    const char **sinks = NULL;
+    unsigned i = 0;
+    uint32_t idx = 0;
+    pa_sink *sink = NULL;
+
+    pa_assert(c);
+    pa_assert(n);
+
+    *n = pa_idxset_size(c->card->sinks);
+
+    if (*n == 0)
+        return NULL;
+
+    sinks = pa_xnew(const char *, *n);
+
+    PA_IDXSET_FOREACH(sink, c->card->sinks, idx) {
+        sinks[i] = pa_dbusiface_core_get_sink_path(c->core, sink);
+        ++i;
+    }
+
+    return sinks;
+}
+
+static void handle_get_sinks(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card *c = userdata;
+    const char **sinks;
+    unsigned n_sinks;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    sinks = get_sinks(c, &n_sinks);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, sinks, n_sinks);
+
+    pa_xfree(sinks);
+}
+
+/* The caller frees the array, but not the strings. */
+static const char **get_sources(pa_dbusiface_card *c, unsigned *n) {
+    const char **sources = NULL;
+    unsigned i = 0;
+    uint32_t idx = 0;
+    pa_source *source = NULL;
+
+    pa_assert(c);
+    pa_assert(n);
+
+    *n = pa_idxset_size(c->card->sources);
+
+    if (*n == 0)
+        return NULL;
+
+    sources = pa_xnew(const char *, *n);
+
+    PA_IDXSET_FOREACH(source, c->card->sinks, idx) {
+        sources[i] = pa_dbusiface_core_get_source_path(c->core, source);
+        ++i;
+    }
+
+    return sources;
+}
+
+static void handle_get_sources(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card *c = userdata;
+    const char **sources;
+    unsigned n_sources;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    sources = get_sources(c, &n_sources);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, sources, n_sources);
+
+    pa_xfree(sources);
+}
+
+/* The caller frees the array, but not the strings. */
+static const char **get_profiles(pa_dbusiface_card *c, unsigned *n) {
+    const char **profiles;
+    unsigned i = 0;
+    void *state = NULL;
+    pa_dbusiface_card_profile *profile;
+
+    pa_assert(c);
+    pa_assert(n);
+
+    *n = pa_hashmap_size(c->profiles);
+
+    if (*n == 0)
+        return NULL;
+
+    profiles = pa_xnew(const char *, *n);
+
+    PA_HASHMAP_FOREACH(profile, c->profiles, state) {
+        profiles[i] = pa_dbusiface_card_profile_get_path(profile);
+        ++i;
+    }
+
+    return profiles;
+}
+
+static void handle_get_profiles(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card *c = userdata;
+    const char **profiles;
+    unsigned n_profiles;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    profiles = get_profiles(c, &n_profiles);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, profiles, n_profiles);
+
+    pa_xfree(profiles);
+}
+
+static void handle_get_active_profile(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card *c = userdata;
+    const char *active_profile;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    if (!c->active_profile) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "The card %s has no profiles, and therefore there's no active profile either.", c->card->name);
+        return;
+    }
+
+    active_profile = pa_dbusiface_card_profile_get_path(pa_hashmap_get(c->profiles, c->active_profile->name));
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &active_profile);
+}
+
+static void handle_set_active_profile(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card *c = userdata;
+    const char *new_active_path;
+    pa_dbusiface_card_profile *new_active;
+    int r;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_OBJECT_PATH, &new_active_path) < 0)
+        return;
+
+    if (!c->active_profile) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                           "The card %s has no profiles, and therefore there's no active profile either.",
+                           c->card->name);
+        return;
+    }
+
+    if (!(new_active = pa_hashmap_get(c->profiles, new_active_path))) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such profile.", new_active_path);
+        return;
+    }
+
+    if ((r = pa_card_set_profile(c->card, pa_dbusiface_card_profile_get_name(new_active), TRUE)) < 0) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED,
+                           "Internal error in PulseAudio: pa_card_set_profile() failed with error code %i.", r);
+        return;
+    }
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card *c = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    pa_dbus_send_proplist_variant_reply(conn, msg, c->proplist);
+}
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card *c = userdata;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+    dbus_uint32_t idx;
+    const char *owner_module = NULL;
+    const char **sinks = NULL;
+    unsigned n_sinks = 0;
+    const char **sources = NULL;
+    unsigned n_sources = 0;
+    const char **profiles = NULL;
+    unsigned n_profiles = 0;
+    const char *active_profile = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    idx = c->card->index;
+    if (c->card->module)
+        owner_module = pa_dbusiface_core_get_module_path(c->core, c->card->module);
+    sinks = get_sinks(c, &n_sinks);
+    sources = get_sources(c, &n_sources);
+    profiles = get_profiles(c, &n_profiles);
+    if (c->active_profile)
+        active_profile = pa_dbusiface_card_profile_get_path(pa_hashmap_get(c->profiles, c->active_profile->name));
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &idx);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &c->card->name);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DRIVER].property_name, DBUS_TYPE_STRING, &c->card->driver);
+
+    if (owner_module)
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_OWNER_MODULE].property_name, DBUS_TYPE_STRING, &owner_module);
+
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SINKS].property_name, DBUS_TYPE_OBJECT_PATH, sinks, n_sinks);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SOURCES].property_name, DBUS_TYPE_OBJECT_PATH, sources, n_sources);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PROFILES].property_name, DBUS_TYPE_OBJECT_PATH, profiles, n_profiles);
+
+    if (active_profile)
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_ACTIVE_PROFILE].property_name, DBUS_TYPE_OBJECT_PATH, &active_profile);
+
+    pa_dbus_append_proplist_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PROPERTY_LIST].property_name, c->proplist);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+
+    dbus_message_unref(reply);
+
+    pa_xfree(sinks);
+    pa_xfree(sources);
+    pa_xfree(profiles);
+}
+
+static void handle_get_profile_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card *c = userdata;
+    DBusError error;
+    const char *profile_name = NULL;
+    pa_dbusiface_card_profile *profile = NULL;
+    const char *profile_path = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    dbus_error_init(&error);
+
+    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &profile_name, DBUS_TYPE_INVALID)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
+        dbus_error_free(&error);
+        return;
+    }
+
+    if (!(profile = pa_hashmap_get(c->profiles, profile_name))) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such profile on card %s.", profile_name, c->card->name);
+        return;
+    }
+
+    profile_path = pa_dbusiface_card_profile_get_path(profile);
+
+    pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &profile_path);
+}
+
+static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
+    pa_dbusiface_card *c = userdata;
+
+    pa_assert(core);
+    pa_assert((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_CARD);
+    pa_assert(c);
+
+    if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_CHANGE) {
+        DBusMessage *signal = NULL;
+
+        if (c->active_profile != c->card->active_profile) {
+            const char *object_path;
+
+            c->active_profile = c->card->active_profile;
+            object_path = pa_dbusiface_card_profile_get_path(pa_hashmap_get(c->profiles, c->active_profile->name));
+
+            pa_assert_se(signal = dbus_message_new_signal(c->path, PA_DBUSIFACE_CARD_INTERFACE, signals[SIGNAL_ACTIVE_PROFILE_UPDATED].name));
+            pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+            pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
+            dbus_message_unref(signal);
+            signal = NULL;
+        }
+
+        if (!pa_proplist_equal(c->proplist, c->card->proplist)) {
+            DBusMessageIter msg_iter;
+
+            pa_proplist_update(c->proplist, PA_UPDATE_SET, c->card->proplist);
+
+            pa_assert_se(signal = dbus_message_new_signal(c->path, PA_DBUSIFACE_CARD_INTERFACE, signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+            dbus_message_iter_init_append(signal, &msg_iter);
+            pa_dbus_append_proplist(&msg_iter, c->proplist);
+
+            pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
+            dbus_message_unref(signal);
+            signal = NULL;
+        }
+    }
+}
 
 pa_dbusiface_card *pa_dbusiface_card_new(pa_dbusiface_core *core, pa_card *card) {
     pa_dbusiface_card *c = NULL;
@@ -48,13 +504,47 @@ pa_dbusiface_card *pa_dbusiface_card_new(pa_dbusiface_core *core, pa_card *card)
     c->core = core;
     c->card = card;
     c->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, card->index);
+    c->profiles = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+    c->next_profile_index = 0;
+    c->active_profile = NULL;
+    c->proplist = pa_proplist_copy(card->proplist);
+    c->dbus_protocol = pa_dbus_protocol_get(card->core);
+    c->subscription = pa_subscription_new(card->core, PA_SUBSCRIPTION_MASK_CARD, subscription_cb, c);
+
+    if (card->profiles) {
+        pa_card_profile *profile;
+        void *state = NULL;
+
+        PA_HASHMAP_FOREACH(profile, card->profiles, state) {
+            pa_dbusiface_card_profile *p = pa_dbusiface_card_profile_new(c, profile, c->next_profile_index++);
+            pa_hashmap_put(c->profiles, pa_dbusiface_card_profile_get_name(p), p);
+        }
+        pa_assert_se(c->active_profile = card->active_profile);
+    }
+
+    pa_assert_se(pa_dbus_protocol_add_interface(c->dbus_protocol, c->path, &card_interface_info, c) >= 0);
 
     return c;
 }
 
+static void profile_free_cb(void *p, void *userdata) {
+    pa_dbusiface_card_profile *profile = p;
+
+    pa_assert(profile);
+
+    pa_dbusiface_card_profile_free(profile);
+}
+
 void pa_dbusiface_card_free(pa_dbusiface_card *c) {
     pa_assert(c);
 
+    pa_assert_se(pa_dbus_protocol_remove_interface(c->dbus_protocol, c->path, card_interface_info.name) >= 0);
+
+    pa_hashmap_free(c->profiles, profile_free_cb, NULL);
+    pa_proplist_free(c->proplist);
+    pa_dbus_protocol_unref(c->dbus_protocol);
+    pa_subscription_free(c->subscription);
+
     pa_xfree(c->path);
     pa_xfree(c);
 }

commit 8c8df77d2a774a65741539381496d02f04747974
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 9 10:36:20 2009 +0300

    dbusiface-card-profile: Implement the CardProfile D-Bus interface.

diff --git a/src/modules/dbus/iface-card-profile.c b/src/modules/dbus/iface-card-profile.c
index 7952494..2b85a5f 100644
--- a/src/modules/dbus/iface-card-profile.c
+++ b/src/modules/dbus/iface-card-profile.c
@@ -23,26 +23,178 @@
 #include <config.h>
 #endif
 
+#include <dbus/dbus.h>
+
 #include <pulsecore/core-util.h>
+#include <pulsecore/dbus-util.h>
 
 #include "iface-card-profile.h"
 
 #define OBJECT_NAME "profile"
 
+static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_description(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_sinks(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_sources(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_priority(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
 struct pa_dbusiface_card_profile {
+    uint32_t index;
     pa_card_profile *profile;
     char *path;
+    pa_dbus_protocol *dbus_protocol;
+};
+
+enum property_handler_index {
+    PROPERTY_HANDLER_INDEX,
+    PROPERTY_HANDLER_NAME,
+    PROPERTY_HANDLER_DESCRIPTION,
+    PROPERTY_HANDLER_SINKS,
+    PROPERTY_HANDLER_SOURCES,
+    PROPERTY_HANDLER_PRIORITY,
+    PROPERTY_HANDLER_MAX
+};
+
+static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
+    [PROPERTY_HANDLER_INDEX]       = { .property_name = "Index",       .type = "u", .get_cb = handle_get_index,       .set_cb = NULL },
+    [PROPERTY_HANDLER_NAME]        = { .property_name = "Name",        .type = "s", .get_cb = handle_get_name,        .set_cb = NULL },
+    [PROPERTY_HANDLER_DESCRIPTION] = { .property_name = "Description", .type = "s", .get_cb = handle_get_description, .set_cb = NULL },
+    [PROPERTY_HANDLER_SINKS]       = { .property_name = "Sinks",       .type = "u", .get_cb = handle_get_sinks,       .set_cb = NULL },
+    [PROPERTY_HANDLER_SOURCES]     = { .property_name = "Sources",     .type = "u", .get_cb = handle_get_sources,     .set_cb = NULL },
+    [PROPERTY_HANDLER_PRIORITY]    = { .property_name = "Priority",    .type = "u", .get_cb = handle_get_priority,    .set_cb = NULL },
 };
 
-pa_dbusiface_card_profile *pa_dbusiface_card_profile_new(pa_dbusiface_card *card, pa_card_profile *profile, uint32_t idx) {
+static pa_dbus_interface_info profile_interface_info = {
+    .name = PA_DBUSIFACE_CARD_PROFILE_INTERFACE,
+    .method_handlers = NULL,
+    .n_method_handlers = 0,
+    .property_handlers = property_handlers,
+    .n_property_handlers = PROPERTY_HANDLER_MAX,
+    .get_all_properties_cb = handle_get_all,
+    .signals = NULL,
+    .n_signals = 0
+};
+
+static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card_profile *p = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(p);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &p->index);
+}
+
+static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card_profile *p = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(p);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &p->profile->name);
+}
+
+static void handle_get_description(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card_profile *p = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(p);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &p->profile->description);
+}
+
+static void handle_get_sinks(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card_profile *p = userdata;
+    dbus_uint32_t sinks = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(p);
+
+    sinks = p->profile->n_sinks;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &sinks);
+}
+
+static void handle_get_sources(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card_profile *p = userdata;
+    dbus_uint32_t sources = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(p);
+
+    sources = p->profile->n_sources;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &sources);
+}
+
+static void handle_get_priority(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card_profile *p = userdata;
+    dbus_uint32_t priority = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(p);
+
+    priority = p->profile->priority;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &priority);
+}
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card_profile *p = userdata;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+    dbus_uint32_t sinks = 0;
+    dbus_uint32_t sources = 0;
+    dbus_uint32_t priority = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(p);
+
+    sinks = p->profile->n_sinks;
+    sources = p->profile->n_sources;
+    priority = p->profile->priority;
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &p->index);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &p->profile->name);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DESCRIPTION].property_name, DBUS_TYPE_STRING, &p->profile->description);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SINKS].property_name, DBUS_TYPE_UINT32, &sinks);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SOURCES].property_name, DBUS_TYPE_UINT32, &sources);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PRIORITY].property_name, DBUS_TYPE_UINT32, &priority);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+    dbus_message_unref(reply);
+}
+
+pa_dbusiface_card_profile *pa_dbusiface_card_profile_new(pa_dbusiface_card *card, pa_core *core, pa_card_profile *profile, uint32_t idx) {
     pa_dbusiface_card_profile *p = NULL;
 
     pa_assert(card);
     pa_assert(profile);
 
     p = pa_xnew(pa_dbusiface_card_profile, 1);
+    p->index = idx;
     p->profile = profile;
     p->path = pa_sprintf_malloc("%s/%s%u", pa_dbusiface_card_get_path(card), OBJECT_NAME, idx);
+    p->dbus_protocol = pa_dbus_protocol_get(core);
+
+    pa_assert_se(pa_dbus_protocol_add_interface(p->dbus_protocol, p->path, &profile_interface_info, p) >= 0);
 
     return p;
 }
@@ -50,6 +202,10 @@ pa_dbusiface_card_profile *pa_dbusiface_card_profile_new(pa_dbusiface_card *card
 void pa_dbusiface_card_profile_free(pa_dbusiface_card_profile *p) {
     pa_assert(p);
 
+    pa_assert_se(pa_dbus_protocol_remove_interface(p->dbus_protocol, p->path, profile_interface_info.name) >= 0);
+
+    pa_dbus_protocol_unref(p->dbus_protocol);
+
     pa_xfree(p->path);
     pa_xfree(p);
 }
diff --git a/src/modules/dbus/iface-card-profile.h b/src/modules/dbus/iface-card-profile.h
index e90313c..9edcde7 100644
--- a/src/modules/dbus/iface-card-profile.h
+++ b/src/modules/dbus/iface-card-profile.h
@@ -29,12 +29,15 @@
  */
 
 #include <pulsecore/core-scache.h>
+#include <pulsecore/protocol-dbus.h>
 
 #include "iface-card.h"
 
+#define PA_DBUSIFACE_CARD_PROFILE_INTERFACE PA_DBUS_CORE_INTERFACE ".CardProfile"
+
 typedef struct pa_dbusiface_card_profile pa_dbusiface_card_profile;
 
-pa_dbusiface_card_profile *pa_dbusiface_card_profile_new(pa_dbusiface_card *card, pa_card_profile *profile, uint32_t idx);
+pa_dbusiface_card_profile *pa_dbusiface_card_profile_new(pa_dbusiface_card *card, pa_core *core, pa_card_profile *profile, uint32_t idx);
 void pa_dbusiface_card_profile_free(pa_dbusiface_card_profile *p);
 
 const char *pa_dbusiface_card_profile_get_path(pa_dbusiface_card_profile *p);
diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card.c
index 4ede718..64ec12a 100644
--- a/src/modules/dbus/iface-card.c
+++ b/src/modules/dbus/iface-card.c
@@ -516,7 +516,7 @@ pa_dbusiface_card *pa_dbusiface_card_new(pa_dbusiface_core *core, pa_card *card)
         void *state = NULL;
 
         PA_HASHMAP_FOREACH(profile, card->profiles, state) {
-            pa_dbusiface_card_profile *p = pa_dbusiface_card_profile_new(c, profile, c->next_profile_index++);
+            pa_dbusiface_card_profile *p = pa_dbusiface_card_profile_new(c, card->core, profile, c->next_profile_index++);
             pa_hashmap_put(c->profiles, pa_dbusiface_card_profile_get_name(p), p);
         }
         pa_assert_se(c->active_profile = card->active_profile);
diff --git a/src/modules/dbus/iface-card.h b/src/modules/dbus/iface-card.h
index 57ad4e3..e2c08a3 100644
--- a/src/modules/dbus/iface-card.h
+++ b/src/modules/dbus/iface-card.h
@@ -29,6 +29,7 @@
  */
 
 #include <pulsecore/card.h>
+#include <pulsecore/protocol-dbus.h>
 
 #include "iface-core.h"
 

commit 7cfda56af99b6d6bbb92fd6de208edd4c6991240
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 10 10:38:01 2009 +0300

    dbus-protocol: Add a note for _send_signal that by default the signal isn't
    actually sent.

diff --git a/src/pulsecore/protocol-dbus.h b/src/pulsecore/protocol-dbus.h
index c6b630a..38ba8a1 100644
--- a/src/pulsecore/protocol-dbus.h
+++ b/src/pulsecore/protocol-dbus.h
@@ -149,6 +149,10 @@ void pa_dbus_protocol_add_signal_listener(pa_dbus_protocol *p, DBusConnection *c
  * do anything in that case either. */
 void pa_dbus_protocol_remove_signal_listener(pa_dbus_protocol *p, DBusConnection *conn, const char *signal);
 
+/* Sends the given signal to all interested clients. By default no signals are
+ * sent - clients have to explicitly to request signals by calling
+ * .Core1.ListenForSignal. That method's handler then calls
+ * pa_dbus_protocol_add_signal_listener(). */
 void pa_dbus_protocol_send_signal(pa_dbus_protocol *p, DBusMessage *signal);
 
 /* Returns an array of extension identifier strings. The strings pointers point

commit 31117fe99e07b11b55564a6df455211db712c2f3
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 10 10:40:40 2009 +0300

    dbus-protocol: Fix signal sending for the case when the client doesn't listen
    for all signals.

diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index 62f74a5..0128570 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -848,6 +848,8 @@ void pa_dbus_protocol_add_signal_listener(pa_dbus_protocol *p, DBusConnection *c
         for (i = 0; i < n_objects; ++i)
             pa_idxset_put(object_set, pa_xstrdup(objects[i]), NULL);
 
+        pa_hashmap_put(conn_entry->listening_signals, signal, object_set);
+
     } else {
         conn_entry->listening_for_all_signals = TRUE;
 
@@ -892,10 +894,15 @@ void pa_dbus_protocol_send_signal(pa_dbus_protocol *p, DBusMessage *signal) {
     void *state = NULL;
     pa_idxset *object_set;
     DBusMessage *signal_copy;
+    char *signal_string;
 
     pa_assert(p);
     pa_assert(signal);
     pa_assert(dbus_message_get_type(signal) == DBUS_MESSAGE_TYPE_SIGNAL);
+    pa_assert_se(dbus_message_get_interface(signal));
+    pa_assert_se(dbus_message_get_member(signal));
+
+    signal_string = pa_sprintf_malloc("%s.%s", dbus_message_get_interface(signal), dbus_message_get_member(signal));
 
     PA_HASHMAP_FOREACH(conn_entry, p->connections, state) {
         if ((conn_entry->listening_for_all_signals /* Case 1: listening for all signals */
@@ -903,7 +910,7 @@ void pa_dbus_protocol_send_signal(pa_dbus_protocol *p, DBusMessage *signal) {
                  || pa_idxset_isempty(conn_entry->all_signals_objects)))
 
             || (!conn_entry->listening_for_all_signals /* Case 2: not listening for all signals */
-                && (object_set = pa_hashmap_get(conn_entry->listening_signals, signal))
+                && (object_set = pa_hashmap_get(conn_entry->listening_signals, signal_string))
                 && (pa_idxset_get_by_data(object_set, dbus_message_get_path(signal), NULL)
                     || pa_idxset_isempty(object_set)))) {
 
@@ -912,6 +919,8 @@ void pa_dbus_protocol_send_signal(pa_dbus_protocol *p, DBusMessage *signal) {
             dbus_message_unref(signal_copy);
         }
     }
+
+    pa_xfree(signal_string);
 }
 
 const char **pa_dbus_protocol_get_extensions(pa_dbus_protocol *p, unsigned *n) {
diff --git a/src/pulsecore/protocol-dbus.h b/src/pulsecore/protocol-dbus.h
index 38ba8a1..d771b4f 100644
--- a/src/pulsecore/protocol-dbus.h
+++ b/src/pulsecore/protocol-dbus.h
@@ -129,7 +129,8 @@ int pa_dbus_protocol_unregister_connection(pa_dbus_protocol *p, DBusConnection *
 pa_client *pa_dbus_protocol_get_client(pa_dbus_protocol *p, DBusConnection *conn);
 
 /* Enables signal receiving for the given connection. The connection must have
- * been registered earlier.
+ * been registered earlier. The signal string must contain both the signal
+ * interface and the signal name, concatenated using a period as the separator.
  *
  * If the signal argument is NULL, all signals will be sent to the connection,
  * otherwise calling this function only adds the given signal to the list of

commit 8b5550dba32857918fd8e70b93be9094c11cf0c8
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sat Aug 15 05:51:55 2009 +0300

    dbusiface-card: Split some overly long lines.

diff --git a/src/modules/dbus/iface-card-profile.c b/src/modules/dbus/iface-card-profile.c
index 2b85a5f..4a1696c 100644
--- a/src/modules/dbus/iface-card-profile.c
+++ b/src/modules/dbus/iface-card-profile.c
@@ -182,7 +182,11 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
     dbus_message_unref(reply);
 }
 
-pa_dbusiface_card_profile *pa_dbusiface_card_profile_new(pa_dbusiface_card *card, pa_core *core, pa_card_profile *profile, uint32_t idx) {
+pa_dbusiface_card_profile *pa_dbusiface_card_profile_new(
+        pa_dbusiface_card *card,
+        pa_core *core,
+        pa_card_profile *profile,
+        uint32_t idx) {
     pa_dbusiface_card_profile *p = NULL;
 
     pa_assert(card);
diff --git a/src/modules/dbus/iface-card-profile.h b/src/modules/dbus/iface-card-profile.h
index 9edcde7..a09767f 100644
--- a/src/modules/dbus/iface-card-profile.h
+++ b/src/modules/dbus/iface-card-profile.h
@@ -37,7 +37,11 @@
 
 typedef struct pa_dbusiface_card_profile pa_dbusiface_card_profile;
 
-pa_dbusiface_card_profile *pa_dbusiface_card_profile_new(pa_dbusiface_card *card, pa_core *core, pa_card_profile *profile, uint32_t idx);
+pa_dbusiface_card_profile *pa_dbusiface_card_profile_new(
+        pa_dbusiface_card *card,
+        pa_core *core,
+        pa_card_profile *profile,
+        uint32_t idx);
 void pa_dbusiface_card_profile_free(pa_dbusiface_card_profile *p);
 
 const char *pa_dbusiface_card_profile_get_path(pa_dbusiface_card_profile *p);
diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card.c
index 64ec12a..40031d2 100644
--- a/src/modules/dbus/iface-card.c
+++ b/src/modules/dbus/iface-card.c
@@ -312,7 +312,10 @@ static void handle_get_active_profile(DBusConnection *conn, DBusMessage *msg, vo
     pa_assert(c);
 
     if (!c->active_profile) {
-        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "The card %s has no profiles, and therefore there's no active profile either.", c->card->name);
+        pa_assert(pa_hashmap_isempty(c->profiles));
+
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                           "The card %s has no profiles, and therefore there's no active profile either.", c->card->name);
         return;
     }
 
@@ -470,7 +473,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
             c->active_profile = c->card->active_profile;
             object_path = pa_dbusiface_card_profile_get_path(pa_hashmap_get(c->profiles, c->active_profile->name));
 
-            pa_assert_se(signal = dbus_message_new_signal(c->path, PA_DBUSIFACE_CARD_INTERFACE, signals[SIGNAL_ACTIVE_PROFILE_UPDATED].name));
+            pa_assert_se(signal = dbus_message_new_signal(c->path,
+                                                          PA_DBUSIFACE_CARD_INTERFACE,
+                                                          signals[SIGNAL_ACTIVE_PROFILE_UPDATED].name));
             pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -483,7 +488,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
             pa_proplist_update(c->proplist, PA_UPDATE_SET, c->card->proplist);
 
-            pa_assert_se(signal = dbus_message_new_signal(c->path, PA_DBUSIFACE_CARD_INTERFACE, signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+            pa_assert_se(signal = dbus_message_new_signal(c->path,
+                                                          PA_DBUSIFACE_CARD_INTERFACE,
+                                                          signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
             dbus_message_iter_init_append(signal, &msg_iter);
             pa_dbus_append_proplist(&msg_iter, c->proplist);
 

commit afb79ee83e95b3c492abe55ea0c26a9fe902b075
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sat Aug 15 05:53:36 2009 +0300

    dbusiface-card-profile: Assert the core argument isn't NULL.

diff --git a/src/modules/dbus/iface-card-profile.c b/src/modules/dbus/iface-card-profile.c
index 4a1696c..004e2e8 100644
--- a/src/modules/dbus/iface-card-profile.c
+++ b/src/modules/dbus/iface-card-profile.c
@@ -190,6 +190,7 @@ pa_dbusiface_card_profile *pa_dbusiface_card_profile_new(
     pa_dbusiface_card_profile *p = NULL;
 
     pa_assert(card);
+    pa_assert(core);
     pa_assert(profile);
 
     p = pa_xnew(pa_dbusiface_card_profile, 1);

commit 18f9f1b5d17c83280205083760edd4dccb37ed6a
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sat Aug 15 05:58:24 2009 +0300

    dbusiface-card: Use the ++ operator like it's meant to be used.

diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card.c
index 40031d2..e3606c7 100644
--- a/src/modules/dbus/iface-card.c
+++ b/src/modules/dbus/iface-card.c
@@ -279,10 +279,8 @@ static const char **get_profiles(pa_dbusiface_card *c, unsigned *n) {
 
     profiles = pa_xnew(const char *, *n);
 
-    PA_HASHMAP_FOREACH(profile, c->profiles, state) {
-        profiles[i] = pa_dbusiface_card_profile_get_path(profile);
-        ++i;
-    }
+    PA_HASHMAP_FOREACH(profile, c->profiles, state)
+        profiles[i++] = pa_dbusiface_card_profile_get_path(profile);
 
     return profiles;
 }

commit 31c544d8439edee56ecc641c07012042ab38bb80
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sat Aug 15 06:00:46 2009 +0300

    dbusiface-card: Assert that the profiles list is empty if there's no active
    profile.

diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card.c
index e3606c7..924bea9 100644
--- a/src/modules/dbus/iface-card.c
+++ b/src/modules/dbus/iface-card.c
@@ -336,6 +336,8 @@ static void handle_set_active_profile(DBusConnection *conn, DBusMessage *msg, vo
         return;
 
     if (!c->active_profile) {
+        pa_assert(pa_hashmap_isempty(c->profiles));
+
         pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
                            "The card %s has no profiles, and therefore there's no active profile either.",
                            c->card->name);

commit 90c73db449e67cf999a354c7e3ccad3edd44a829
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sat Aug 15 06:09:35 2009 +0300

    dbusiface-card: Fix the OwnerModule property type in handle_get_all().

diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card.c
index 924bea9..5a79794 100644
--- a/src/modules/dbus/iface-card.c
+++ b/src/modules/dbus/iface-card.c
@@ -406,7 +406,7 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DRIVER].property_name, DBUS_TYPE_STRING, &c->card->driver);
 
     if (owner_module)
-        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_OWNER_MODULE].property_name, DBUS_TYPE_STRING, &owner_module);
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_OWNER_MODULE].property_name, DBUS_TYPE_OBJECT_PATH, &owner_module);
 
     pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SINKS].property_name, DBUS_TYPE_OBJECT_PATH, sinks, n_sinks);
     pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SOURCES].property_name, DBUS_TYPE_OBJECT_PATH, sources, n_sources);

commit 1e65d8d35b23d3c76a30155c42bec282257579e5
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sat Aug 15 06:11:38 2009 +0300

    dbusiface-core: New function: pa_dbusiface_core_get_card_path().

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index e8ea50b..81e709f 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -2034,6 +2034,13 @@ void pa_dbusiface_core_free(pa_dbusiface_core *c) {
     pa_xfree(c);
 }
 
+const char *pa_dbusiface_core_get_card_path(pa_dbusiface_core *c, const pa_card *card) {
+    pa_assert(c);
+    pa_assert(card);
+
+    return pa_dbusiface_card_get_path(pa_hashmap_get(c->cards, PA_UINT32_TO_PTR(card->index)));
+}
+
 const char *pa_dbusiface_core_get_sink_path(pa_dbusiface_core *c, const pa_sink *sink) {
     pa_assert(c);
     pa_assert(sink);
diff --git a/src/modules/dbus/iface-core.h b/src/modules/dbus/iface-core.h
index 1b73782..7010205 100644
--- a/src/modules/dbus/iface-core.h
+++ b/src/modules/dbus/iface-core.h
@@ -35,6 +35,7 @@ typedef struct pa_dbusiface_core pa_dbusiface_core;
 pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core);
 void pa_dbusiface_core_free(pa_dbusiface_core *c);
 
+const char *pa_dbusiface_core_get_card_path(pa_dbusiface_core *c, const pa_card *card);
 const char *pa_dbusiface_core_get_sink_path(pa_dbusiface_core *c, const pa_sink *sink);
 const char *pa_dbusiface_core_get_source_path(pa_dbusiface_core *c, const pa_source *source);
 const char *pa_dbusiface_core_get_module_path(pa_dbusiface_core *c, const pa_module *module);

commit 22ab1414507f84d6a42c5255d66ba15d8097d35f
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sat Aug 15 06:13:17 2009 +0300

    dbus-protocol: Use pa_hashmap_remove() instead of _get().

diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index 0128570..cf561c8 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -841,7 +841,7 @@ void pa_dbus_protocol_add_signal_listener(pa_dbus_protocol *p, DBusConnection *c
         conn_entry->listening_for_all_signals = FALSE;
 
         /* Replace the old object list with a new one. */
-        if ((object_set = pa_hashmap_get(conn_entry->listening_signals, signal)))
+        if ((object_set = pa_hashmap_remove(conn_entry->listening_signals, signal)))
             pa_idxset_free(object_set, free_listened_object_name_cb, NULL);
         object_set = pa_idxset_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
 

commit 91f626f777402fa6485658b04cbcdf2a7aac3f01
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sat Aug 15 06:18:41 2009 +0300

    dbusiface-device: Implement the Device and DevicePort D-Bus interfaces.

diff --git a/src/Makefile.am b/src/Makefile.am
index e605ad7..8722f97 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1282,6 +1282,7 @@ module_dbus_protocol_la_SOURCES = \
 		modules/dbus/iface-client.c modules/dbus/iface-client.h \
 		modules/dbus/iface-core.c modules/dbus/iface-core.h \
 		modules/dbus/iface-device.c modules/dbus/iface-device.h \
+		modules/dbus/iface-device-port.c modules/dbus/iface-device-port.h \
 		modules/dbus/iface-memstats.c modules/dbus/iface-memstats.h \
 		modules/dbus/iface-module.c modules/dbus/iface-module.h \
 		modules/dbus/iface-sample.c modules/dbus/iface-sample.h \
diff --git a/src/modules/dbus/iface-device-port.c b/src/modules/dbus/iface-device-port.c
new file mode 100644
index 0000000..d403b6a
--- /dev/null
+++ b/src/modules/dbus/iface-device-port.c
@@ -0,0 +1,190 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Tanu Kaskinen
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <dbus/dbus.h>
+
+#include <pulsecore/core-util.h>
+#include <pulsecore/dbus-util.h>
+
+#include "iface-device-port.h"
+
+#define OBJECT_NAME "port"
+
+static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_description(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_priority(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+struct pa_dbusiface_device_port {
+    uint32_t index;
+    pa_device_port *port;
+    char *path;
+    pa_dbus_protocol *dbus_protocol;
+};
+
+enum property_handler_index {
+    PROPERTY_HANDLER_INDEX,
+    PROPERTY_HANDLER_NAME,
+    PROPERTY_HANDLER_DESCRIPTION,
+    PROPERTY_HANDLER_PRIORITY,
+    PROPERTY_HANDLER_MAX
+};
+
+static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
+    [PROPERTY_HANDLER_INDEX]       = { .property_name = "Index",       .type = "u", .get_cb = handle_get_index,       .set_cb = NULL },
+    [PROPERTY_HANDLER_NAME]        = { .property_name = "Name",        .type = "s", .get_cb = handle_get_name,        .set_cb = NULL },
+    [PROPERTY_HANDLER_DESCRIPTION] = { .property_name = "Description", .type = "s", .get_cb = handle_get_description, .set_cb = NULL },
+    [PROPERTY_HANDLER_PRIORITY]    = { .property_name = "Priority",    .type = "u", .get_cb = handle_get_priority,    .set_cb = NULL },
+};
+
+static pa_dbus_interface_info port_interface_info = {
+    .name = PA_DBUSIFACE_DEVICE_PORT_INTERFACE,
+    .method_handlers = NULL,
+    .n_method_handlers = 0,
+    .property_handlers = property_handlers,
+    .n_property_handlers = PROPERTY_HANDLER_MAX,
+    .get_all_properties_cb = handle_get_all,
+    .signals = NULL,
+    .n_signals = 0
+};
+
+static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device_port *p = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(p);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &p->index);
+}
+
+static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device_port *p = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(p);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &p->port->name);
+}
+
+static void handle_get_description(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device_port *p = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(p);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &p->port->description);
+}
+
+static void handle_get_priority(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device_port *p = userdata;
+    dbus_uint32_t priority = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(p);
+
+    priority = p->port->priority;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &priority);
+}
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device_port *p = userdata;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+    dbus_uint32_t priority = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(p);
+
+    priority = p->port->priority;
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &p->index);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &p->port->name);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DESCRIPTION].property_name, DBUS_TYPE_STRING, &p->port->description);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PRIORITY].property_name, DBUS_TYPE_UINT32, &priority);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+    dbus_message_unref(reply);
+}
+
+pa_dbusiface_device_port *pa_dbusiface_device_port_new(
+        pa_dbusiface_device *device,
+        pa_core *core,
+        pa_device_port *port,
+        uint32_t idx) {
+    pa_dbusiface_device_port *p = NULL;
+
+    pa_assert(device);
+    pa_assert(core);
+    pa_assert(port);
+
+    p = pa_xnew(pa_dbusiface_device_port, 1);
+    p->index = idx;
+    p->port = port;
+    p->path = pa_sprintf_malloc("%s/%s%u", pa_dbusiface_device_get_path(device), OBJECT_NAME, idx);
+    p->dbus_protocol = pa_dbus_protocol_get(core);
+
+    pa_assert_se(pa_dbus_protocol_add_interface(p->dbus_protocol, p->path, &port_interface_info, p) >= 0);
+
+    return p;
+}
+
+void pa_dbusiface_device_port_free(pa_dbusiface_device_port *p) {
+    pa_assert(p);
+
+    pa_assert_se(pa_dbus_protocol_remove_interface(p->dbus_protocol, p->path, port_interface_info.name) >= 0);
+
+    pa_dbus_protocol_unref(p->dbus_protocol);
+
+    pa_xfree(p->path);
+    pa_xfree(p);
+}
+
+const char *pa_dbusiface_device_port_get_path(pa_dbusiface_device_port *p) {
+    pa_assert(p);
+
+    return p->path;
+}
+
+const char *pa_dbusiface_device_port_get_name(pa_dbusiface_device_port *p) {
+    pa_assert(p);
+
+    return p->port->name;
+}
diff --git a/src/modules/dbus/iface-device.h b/src/modules/dbus/iface-device-port.h
similarity index 51%
copy from src/modules/dbus/iface-device.h
copy to src/modules/dbus/iface-device-port.h
index 1e9af83..0461e2f 100644
--- a/src/modules/dbus/iface-device.h
+++ b/src/modules/dbus/iface-device-port.h
@@ -1,5 +1,5 @@
-#ifndef foodbusifacedevicehfoo
-#define foodbusifacedevicehfoo
+#ifndef foodbusifacedeviceporthfoo
+#define foodbusifacedeviceporthfoo
 
 /***
   This file is part of PulseAudio.
@@ -22,27 +22,29 @@
   USA.
 ***/
 
-/* This object implements the D-Bus interfaces org.PulseAudio.Core1.Device,
- * org.PulseAudio.Core1.Sink and org.PulseAudio.Core1.Source.
+/* This object implements the D-Bus interface org.PulseAudio.Core1.DevicePort.
  *
- * See http://pulseaudio.org/wiki/DBusInterface for the interface
+ * See http://pulseaudio.org/wiki/DBusInterface for the DevicePort interface
  * documentation.
  */
 
+#include <pulsecore/protocol-dbus.h>
 #include <pulsecore/sink.h>
-#include <pulsecore/source.h>
 
-#include "iface-core.h"
+#include "iface-device.h"
 
-typedef struct pa_dbusiface_device pa_dbusiface_device;
+#define PA_DBUSIFACE_DEVICE_PORT_INTERFACE PA_DBUS_CORE_INTERFACE ".DevicePort"
 
-pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_dbusiface_core *core, pa_sink *sink);
-pa_dbusiface_device *pa_dbusiface_device_new_source(pa_dbusiface_core *core, pa_source *source);
-void pa_dbusiface_device_free(pa_dbusiface_device *d);
+typedef struct pa_dbusiface_device_port pa_dbusiface_device_port;
 
-const char *pa_dbusiface_device_get_path(pa_dbusiface_device *d);
+pa_dbusiface_device_port *pa_dbusiface_device_port_new(
+        pa_dbusiface_device *device,
+        pa_core *core,
+        pa_device_port *port,
+        uint32_t idx);
+void pa_dbusiface_device_port_free(pa_dbusiface_device_port *p);
 
-pa_sink *pa_dbusiface_device_get_sink(pa_dbusiface_device *d);
-pa_source *pa_dbusiface_device_get_source(pa_dbusiface_device *d);
+const char *pa_dbusiface_device_port_get_path(pa_dbusiface_device_port *p);
+const char *pa_dbusiface_device_port_get_name(pa_dbusiface_device_port *p);
 
 #endif
diff --git a/src/modules/dbus/iface-device.c b/src/modules/dbus/iface-device.c
index 1a64f43..3cf9d19 100644
--- a/src/modules/dbus/iface-device.c
+++ b/src/modules/dbus/iface-device.c
@@ -24,62 +24,1258 @@
 #endif
 
 #include <pulsecore/core-util.h>
+#include <pulsecore/dbus-util.h>
 #include <pulsecore/protocol-dbus.h>
 
+#include "iface-device-port.h"
+
 #include "iface-device.h"
 
 #define SINK_OBJECT_NAME "sink"
 #define SOURCE_OBJECT_NAME "source"
 
+static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_card(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_has_flat_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_has_convertible_to_decibel_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_base_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_volume_steps(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_has_hardware_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_has_hardware_mute(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_configured_latency(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_has_dynamic_latency(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_latency(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_is_hardware_device(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_is_network_device(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_state(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_ports(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_active_port(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_active_port(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_suspend(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_port_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_sink_get_monitor_source(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_sink_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_source_get_monitor_of_sink(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_source_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
 enum device_type {
     DEVICE_TYPE_SINK,
     DEVICE_TYPE_SOURCE
 };
 
 struct pa_dbusiface_device {
+    pa_dbusiface_core *core;
+
     union {
         pa_sink *sink;
         pa_source *source;
     };
     enum device_type type;
     char *path;
+    pa_cvolume volume;
+    pa_bool_t is_muted;
+    union {
+        pa_sink_state_t sink_state;
+        pa_source_state_t source_state;
+    };
+    pa_hashmap *ports;
+    uint32_t next_port_index;
+    pa_device_port *active_port;
+    pa_proplist *proplist;
+
+    pa_dbus_protocol *dbus_protocol;
+    pa_subscription *subscription;
 };
 
+enum property_handler_index {
+    PROPERTY_HANDLER_INDEX,
+    PROPERTY_HANDLER_NAME,
+    PROPERTY_HANDLER_DRIVER,
+    PROPERTY_HANDLER_OWNER_MODULE,
+    PROPERTY_HANDLER_CARD,
+    PROPERTY_HANDLER_SAMPLE_FORMAT,
+    PROPERTY_HANDLER_SAMPLE_RATE,
+    PROPERTY_HANDLER_CHANNELS,
+    PROPERTY_HANDLER_VOLUME,
+    PROPERTY_HANDLER_HAS_FLAT_VOLUME,
+    PROPERTY_HANDLER_HAS_CONVERTIBLE_TO_DECIBEL_VOLUME,
+    PROPERTY_HANDLER_BASE_VOLUME,
+    PROPERTY_HANDLER_VOLUME_STEPS,
+    PROPERTY_HANDLER_IS_MUTED,
+    PROPERTY_HANDLER_HAS_HARDWARE_VOLUME,
+    PROPERTY_HANDLER_HAS_HARDWARE_MUTE,
+    PROPERTY_HANDLER_CONFIGURED_LATENCY,
+    PROPERTY_HANDLER_HAS_DYNAMIC_LATENCY,
+    PROPERTY_HANDLER_LATENCY,
+    PROPERTY_HANDLER_IS_HARDWARE_DEVICE,
+    PROPERTY_HANDLER_IS_NETWORK_DEVICE,
+    PROPERTY_HANDLER_STATE,
+    PROPERTY_HANDLER_PORTS,
+    PROPERTY_HANDLER_ACTIVE_PORT,
+    PROPERTY_HANDLER_PROPERTY_LIST,
+    PROPERTY_HANDLER_MAX
+};
+
+enum sink_property_handler_index {
+    SINK_PROPERTY_HANDLER_MONITOR_SOURCE,
+    SINK_PROPERTY_HANDLER_MAX
+};
+
+enum source_property_handler_index {
+    SOURCE_PROPERTY_HANDLER_MONITOR_OF_SINK,
+    SOURCE_PROPERTY_HANDLER_MAX
+};
+
+static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
+    [PROPERTY_HANDLER_INDEX]                             = { .property_name = "Index",                         .type = "u",      .get_cb = handle_get_index,                             .set_cb = NULL },
+    [PROPERTY_HANDLER_NAME]                              = { .property_name = "Name",                          .type = "s",      .get_cb = handle_get_name,                              .set_cb = NULL },
+    [PROPERTY_HANDLER_DRIVER]                            = { .property_name = "Driver",                        .type = "s",      .get_cb = handle_get_driver,                            .set_cb = NULL },
+    [PROPERTY_HANDLER_OWNER_MODULE]                      = { .property_name = "OwnerModule",                   .type = "o",      .get_cb = handle_get_owner_module,                      .set_cb = NULL },
+    [PROPERTY_HANDLER_CARD]                              = { .property_name = "Card",                          .type = "o",      .get_cb = handle_get_card,                              .set_cb = NULL },
+    [PROPERTY_HANDLER_SAMPLE_FORMAT]                     = { .property_name = "SampleFormat",                  .type = "u",      .get_cb = handle_get_sample_format,                     .set_cb = NULL },
+    [PROPERTY_HANDLER_SAMPLE_RATE]                       = { .property_name = "SampleRate",                    .type = "u",      .get_cb = handle_get_sample_rate,                       .set_cb = NULL },
+    [PROPERTY_HANDLER_CHANNELS]                          = { .property_name = "Channels",                      .type = "au",     .get_cb = handle_get_channels,                          .set_cb = NULL },
+    [PROPERTY_HANDLER_VOLUME]                            = { .property_name = "Volume",                        .type = "au",     .get_cb = handle_get_volume,                            .set_cb = handle_set_volume },
+    [PROPERTY_HANDLER_HAS_FLAT_VOLUME]                   = { .property_name = "HasFlatVolume",                 .type = "b",      .get_cb = handle_get_has_flat_volume,                   .set_cb = NULL },
+    [PROPERTY_HANDLER_HAS_CONVERTIBLE_TO_DECIBEL_VOLUME] = { .property_name = "HasConvertibleToDecibelVolume", .type = "b",      .get_cb = handle_get_has_convertible_to_decibel_volume, .set_cb = NULL },
+    [PROPERTY_HANDLER_BASE_VOLUME]                       = { .property_name = "BaseVolume",                    .type = "u",      .get_cb = handle_get_base_volume,                       .set_cb = NULL },
+    [PROPERTY_HANDLER_VOLUME_STEPS]                      = { .property_name = "VolumeSteps",                   .type = "u",      .get_cb = handle_get_volume_steps,                      .set_cb = NULL },
+    [PROPERTY_HANDLER_IS_MUTED]                          = { .property_name = "IsMuted",                       .type = "b",      .get_cb = handle_get_is_muted,                          .set_cb = handle_set_is_muted },
+    [PROPERTY_HANDLER_HAS_HARDWARE_VOLUME]               = { .property_name = "HasHardwareVolume",             .type = "b",      .get_cb = handle_get_has_hardware_volume,               .set_cb = NULL },
+    [PROPERTY_HANDLER_HAS_HARDWARE_MUTE]                 = { .property_name = "HasHardwareMute",               .type = "b",      .get_cb = handle_get_has_hardware_mute,                 .set_cb = NULL },
+    [PROPERTY_HANDLER_CONFIGURED_LATENCY]                = { .property_name = "ConfiguredLatency",             .type = "t",      .get_cb = handle_get_configured_latency,                .set_cb = NULL },
+    [PROPERTY_HANDLER_HAS_DYNAMIC_LATENCY]               = { .property_name = "HasDynamicLatency",             .type = "b",      .get_cb = handle_get_has_dynamic_latency,               .set_cb = NULL },
+    [PROPERTY_HANDLER_LATENCY]                           = { .property_name = "Latency",                       .type = "t",      .get_cb = handle_get_latency,                           .set_cb = NULL },
+    [PROPERTY_HANDLER_IS_HARDWARE_DEVICE]                = { .property_name = "IsHardwareDevice",              .type = "b",      .get_cb = handle_get_is_hardware_device,                .set_cb = NULL },
+    [PROPERTY_HANDLER_IS_NETWORK_DEVICE]                 = { .property_name = "IsNetworkDevice",               .type = "b",      .get_cb = handle_get_is_network_device,                 .set_cb = NULL },
+    [PROPERTY_HANDLER_STATE]                             = { .property_name = "State",                         .type = "u",      .get_cb = handle_get_state,                             .set_cb = NULL },
+    [PROPERTY_HANDLER_PORTS]                             = { .property_name = "Ports",                         .type = "ao",     .get_cb = handle_get_ports,                             .set_cb = NULL },
+    [PROPERTY_HANDLER_ACTIVE_PORT]                       = { .property_name = "ActivePort",                    .type = "o",      .get_cb = handle_get_active_port,                       .set_cb = handle_set_active_port },
+    [PROPERTY_HANDLER_PROPERTY_LIST]                     = { .property_name = "PropertyList",                  .type = "a{say}", .get_cb = handle_get_property_list,                     .set_cb = NULL }
+};
+
+static pa_dbus_property_handler sink_property_handlers[SINK_PROPERTY_HANDLER_MAX] = {
+    [SINK_PROPERTY_HANDLER_MONITOR_SOURCE] = { .property_name = "MonitorSource", .type = "o", .get_cb = handle_sink_get_monitor_source, .set_cb = NULL }
+};
+
+static pa_dbus_property_handler source_property_handlers[SOURCE_PROPERTY_HANDLER_MAX] = {
+    [SOURCE_PROPERTY_HANDLER_MONITOR_OF_SINK] = { .property_name = "MonitorOfSink", .type = "o", .get_cb = handle_source_get_monitor_of_sink, .set_cb = NULL }
+};
+
+enum method_handler_index {
+    METHOD_HANDLER_SUSPEND,
+    METHOD_HANDLER_GET_PORT_BY_NAME,
+    METHOD_HANDLER_MAX
+};
+
+static pa_dbus_arg_info suspend_args[] = { { "suspend", "b", "in" } };
+static pa_dbus_arg_info get_port_by_name_args[] = { { "name", "s", "in" }, { "port", "o", "out" } };
+
+static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
+    [METHOD_HANDLER_SUSPEND] = {
+        .method_name = "Suspend",
+        .arguments = suspend_args,
+        .n_arguments = sizeof(suspend_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_suspend },
+    [METHOD_HANDLER_GET_PORT_BY_NAME] = {
+        .method_name = "GetPortByName",
+        .arguments = get_port_by_name_args,
+        .n_arguments = sizeof(get_port_by_name_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_get_port_by_name }
+};
+
+enum signal_index {
+    SIGNAL_VOLUME_UPDATED,
+    SIGNAL_MUTE_UPDATED,
+    SIGNAL_STATE_UPDATED,
+    SIGNAL_ACTIVE_PORT_UPDATED,
+    SIGNAL_PROPERTY_LIST_UPDATED,
+    SIGNAL_MAX
+};
+
+static pa_dbus_arg_info volume_updated_args[]        = { { "volume",        "au",     NULL } };
+static pa_dbus_arg_info mute_updated_args[]          = { { "muted",         "b",      NULL } };
+static pa_dbus_arg_info state_updated_args[]         = { { "state",         "u",      NULL } };
+static pa_dbus_arg_info active_port_updated_args[]   = { { "port",          "o",      NULL } };
+static pa_dbus_arg_info property_list_updated_args[] = { { "property_list", "a{say}", NULL } };
+
+static pa_dbus_signal_info signals[SIGNAL_MAX] = {
+    [SIGNAL_VOLUME_UPDATED]        = { .name = "VolumeUpdated",       .arguments = volume_updated_args,        .n_arguments = 1 },
+    [SIGNAL_MUTE_UPDATED]          = { .name = "MuteUpdated",         .arguments = mute_updated_args,          .n_arguments = 1 },
+    [SIGNAL_STATE_UPDATED]         = { .name = "StateUpdated",        .arguments = state_updated_args,         .n_arguments = 1 },
+    [SIGNAL_ACTIVE_PORT_UPDATED]   = { .name = "ActivePortUpdated",   .arguments = active_port_updated_args,   .n_arguments = 1 },
+    [SIGNAL_PROPERTY_LIST_UPDATED] = { .name = "PropertyListUpdated", .arguments = property_list_updated_args, .n_arguments = 1 }
+};
+
+static pa_dbus_interface_info device_interface_info = {
+    .name = PA_DBUSIFACE_DEVICE_INTERFACE,
+    .method_handlers = method_handlers,
+    .n_method_handlers = METHOD_HANDLER_MAX,
+    .property_handlers = property_handlers,
+    .n_property_handlers = PROPERTY_HANDLER_MAX,
+    .get_all_properties_cb = handle_get_all,
+    .signals = signals,
+    .n_signals = SIGNAL_MAX
+};
+
+static pa_dbus_interface_info sink_interface_info = {
+    .name = PA_DBUSIFACE_SINK_INTERFACE,
+    .method_handlers = NULL,
+    .n_method_handlers = 0,
+    .property_handlers = sink_property_handlers,
+    .n_property_handlers = SINK_PROPERTY_HANDLER_MAX,
+    .get_all_properties_cb = handle_sink_get_all,
+    .signals = NULL,
+    .n_signals = 0
+};
+
+static pa_dbus_interface_info source_interface_info = {
+    .name = PA_DBUSIFACE_SOURCE_INTERFACE,
+    .method_handlers = NULL,
+    .n_method_handlers = 0,
+    .property_handlers = source_property_handlers,
+    .n_property_handlers = SOURCE_PROPERTY_HANDLER_MAX,
+    .get_all_properties_cb = handle_source_get_all,
+    .signals = NULL,
+    .n_signals = 0
+};
+
+static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_uint32_t idx = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    idx = (d->type == DEVICE_TYPE_SINK) ? d->sink->index : d->source->index;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &idx);
+}
+
+static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    const char *name = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    name = (d->type == DEVICE_TYPE_SINK) ? d->sink->name : d->source->name;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &name);
+}
+
+static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    const char *driver = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    driver = (d->type == DEVICE_TYPE_SINK) ? d->sink->driver : d->source->driver;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &driver);
+}
+
+static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    pa_module *owner_module = NULL;
+    const char *object_path = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    owner_module = (d->type == DEVICE_TYPE_SINK) ? d->sink->module : d->source->module;
+
+    if (!owner_module) {
+        if (d->type == DEVICE_TYPE_SINK)
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Sink %s doesn't have an owner module.", d->sink->name);
+        else
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Source %s doesn't have an owner module.", d->source->name);
+        return;
+    }
+
+    object_path = pa_dbusiface_core_get_module_path(d->core, owner_module);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path);
+}
+
+static void handle_get_card(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    pa_card *card = NULL;
+    const char *object_path = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    card = (d->type == DEVICE_TYPE_SINK) ? d->sink->card : d->source->card;
+
+    if (!card) {
+        if (d->type == DEVICE_TYPE_SINK)
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Sink %s doesn't belong to any card.", d->sink->name);
+        else
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Source %s doesn't belong to any card.", d->source->name);
+        return;
+    }
+
+    object_path = pa_dbusiface_core_get_card_path(d->core, card);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path);
+}
+
+static void handle_get_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_uint32_t sample_format = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    sample_format = (d->type == DEVICE_TYPE_SINK) ? d->sink->sample_spec.format : d->source->sample_spec.format;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &sample_format);
+}
+
+static void handle_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_uint32_t sample_rate = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    sample_rate = (d->type == DEVICE_TYPE_SINK) ? d->sink->sample_spec.rate : d->source->sample_spec.rate;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &sample_rate);
+}
+
+static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    pa_channel_map *channel_map = NULL;
+    dbus_uint32_t channels[PA_CHANNELS_MAX];
+    unsigned i = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    channel_map = (d->type == DEVICE_TYPE_SINK) ? &d->sink->channel_map : &d->source->channel_map;
+
+    for (i = 0; i < channel_map->channels; ++i)
+        channels[i] = channel_map->map[i];
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_UINT32, channels, channel_map->channels);
+}
+
+static void handle_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_uint32_t volume[PA_CHANNELS_MAX];
+    unsigned i = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    for (i = 0; i < d->volume.channels; ++i)
+        volume[i] = d->volume.values[i];
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_UINT32, volume, d->volume.channels);
+}
+
+static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    unsigned device_channels = 0;
+    dbus_uint32_t *volume = NULL;
+    unsigned n_volume_entries = 0;
+    pa_cvolume new_vol;
+    unsigned i = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    pa_cvolume_init(&new_vol);
+
+    device_channels = (d->type == DEVICE_TYPE_SINK) ? d->sink->channel_map.channels : d->source->channel_map.channels;
+
+    new_vol.channels = device_channels;
+
+    if (pa_dbus_get_fixed_array_set_property_arg(conn, msg, DBUS_TYPE_UINT32, &volume, &n_volume_entries) < 0)
+        return;
+
+    if (n_volume_entries != device_channels) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Expected %u volume entries, got %u.", device_channels, n_volume_entries);
+        return;
+    }
+
+    for (i = 0; i < n_volume_entries; ++i) {
+        if (volume[i] > PA_VOLUME_MAX) {
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too large volume value: %u", volume[i]);
+            return;
+        }
+        new_vol.values[i] = volume[i];
+    }
+
+    if (d->type == DEVICE_TYPE_SINK)
+        pa_sink_set_volume(d->sink, &new_vol, TRUE, TRUE, TRUE, TRUE);
+    else
+        pa_source_set_volume(d->source, &new_vol, TRUE);
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+static void handle_get_has_flat_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_bool_t has_flat_volume = FALSE;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    has_flat_volume = (d->type == DEVICE_TYPE_SINK) ? (d->sink->flags & PA_SINK_FLAT_VOLUME) : FALSE;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &has_flat_volume);
+}
+
+static void handle_get_has_convertible_to_decibel_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_bool_t has_convertible_to_decibel_volume = FALSE;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    has_convertible_to_decibel_volume = (d->type == DEVICE_TYPE_SINK)
+                                        ? (d->sink->flags & PA_SINK_DECIBEL_VOLUME)
+                                        : (d->source->flags & PA_SOURCE_DECIBEL_VOLUME);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &has_convertible_to_decibel_volume);
+}
+
+static void handle_get_base_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_uint32_t base_volume;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    base_volume = (d->type == DEVICE_TYPE_SINK) ? d->sink->base_volume : d->source->base_volume;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &base_volume);
+}
+
+static void handle_get_volume_steps(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_uint32_t volume_steps;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    volume_steps = (d->type == DEVICE_TYPE_SINK) ? d->sink->n_volume_steps : d->source->n_volume_steps;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &volume_steps);
+}
+
+static void handle_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &d->is_muted);
+}
+
+static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_bool_t is_muted = FALSE;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_BOOLEAN, &is_muted) < 0)
+        return;
+
+    if (d->type == DEVICE_TYPE_SINK)
+        pa_sink_set_mute(d->sink, is_muted, TRUE);
+    else
+        pa_source_set_mute(d->source, is_muted, TRUE);
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+static void handle_get_has_hardware_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_bool_t has_hardware_volume = FALSE;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    has_hardware_volume = (d->type == DEVICE_TYPE_SINK)
+                          ? (d->sink->flags & PA_SINK_HW_VOLUME_CTRL)
+                          : (d->source->flags & PA_SOURCE_HW_VOLUME_CTRL);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &has_hardware_volume);
+}
+
+static void handle_get_has_hardware_mute(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_bool_t has_hardware_mute = FALSE;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    has_hardware_mute = (d->type == DEVICE_TYPE_SINK)
+                        ? (d->sink->flags & PA_SINK_HW_MUTE_CTRL)
+                        : (d->source->flags & PA_SOURCE_HW_MUTE_CTRL);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &has_hardware_mute);
+}
+
+static void handle_get_configured_latency(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_uint64_t configured_latency = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    configured_latency = (d->type == DEVICE_TYPE_SINK)
+                         ? pa_sink_get_requested_latency(d->sink)
+                         : pa_source_get_requested_latency(d->source);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT64, &configured_latency);
+}
+
+static void handle_get_has_dynamic_latency(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_bool_t has_dynamic_latency = FALSE;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    has_dynamic_latency = (d->type == DEVICE_TYPE_SINK)
+                          ? (d->sink->flags & PA_SINK_DYNAMIC_LATENCY)
+                          : (d->source->flags & PA_SOURCE_DYNAMIC_LATENCY);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &has_dynamic_latency);
+}
+
+static void handle_get_latency(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_uint64_t latency = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    if (d->type == DEVICE_TYPE_SINK && !(d->sink->flags & PA_SINK_LATENCY))
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Sink %s doesn't support latency querying.", d->sink->name);
+    else if (d->type == DEVICE_TYPE_SOURCE && !(d->source->flags & PA_SOURCE_LATENCY))
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Source %s doesn't support latency querying.", d->source->name);
+    return;
+
+    latency = (d->type == DEVICE_TYPE_SINK) ? pa_sink_get_latency(d->sink) : pa_source_get_latency(d->source);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT64, &latency);
+}
+
+static void handle_get_is_hardware_device(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_bool_t is_hardware_device = FALSE;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    is_hardware_device = (d->type == DEVICE_TYPE_SINK)
+                         ? (d->sink->flags & PA_SINK_HARDWARE)
+                         : (d->source->flags & PA_SOURCE_HARDWARE);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &is_hardware_device);
+}
+
+static void handle_get_is_network_device(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_bool_t is_network_device = FALSE;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    is_network_device = (d->type == DEVICE_TYPE_SINK)
+                        ? (d->sink->flags & PA_SINK_NETWORK)
+                        : (d->source->flags & PA_SOURCE_NETWORK);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &is_network_device);
+}
+
+static void handle_get_state(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_uint32_t state;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    state = (d->type == DEVICE_TYPE_SINK) ? d->sink_state : d->source_state;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &state);
+}
+
+/* The caller frees the array, but not the strings. */
+static const char **get_ports(pa_dbusiface_device *d, unsigned *n) {
+    const char **ports;
+    unsigned i = 0;
+    void *state = NULL;
+    pa_dbusiface_device_port *port = NULL;
+
+    pa_assert(d);
+    pa_assert(n);
+
+    *n = pa_hashmap_size(d->ports);
+
+    if (*n == 0)
+        return NULL;
+
+    ports = pa_xnew(const char *, *n);
+
+    PA_HASHMAP_FOREACH(port, d->ports, state)
+        ports[i++] = pa_dbusiface_device_port_get_path(port);
+
+    return ports;
+}
+
+static void handle_get_ports(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    const char **ports = NULL;
+    unsigned n_ports = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    ports = get_ports(d, &n_ports);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, ports, n_ports);
+
+    pa_xfree(ports);
+}
+
+static void handle_get_active_port(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    const char *active_port;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    if (!d->active_port) {
+        pa_assert(pa_hashmap_isempty(d->ports));
+
+        if (d->type == DEVICE_TYPE_SINK)
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                               "The sink %s has no ports, and therefore there's no active port either.", d->sink->name);
+        else
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                               "The source %s has no ports, and therefore there's no active port either.", d->source->name);
+        return;
+    }
+
+    active_port = pa_dbusiface_device_port_get_path(pa_hashmap_get(d->ports, d->active_port->name));
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &active_port);
+}
+
+static void handle_set_active_port(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    const char *new_active_path;
+    pa_dbusiface_device_port *new_active;
+    int r;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_OBJECT_PATH, &new_active_path) < 0)
+        return;
+
+    if (!d->active_port) {
+        pa_assert(pa_hashmap_isempty(d->ports));
+
+        if (d->type == DEVICE_TYPE_SINK)
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                               "The sink %s has no ports, and therefore there's no active port either.", d->sink->name);
+        else
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                               "The source %s has no ports, and therefore there's no active port either.", d->source->name);
+        return;
+    }
+
+    if (!(new_active = pa_hashmap_get(d->ports, new_active_path))) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such port.", new_active_path);
+        return;
+    }
+
+    if (d->type == DEVICE_TYPE_SINK) {
+        if ((r = pa_sink_set_port(d->sink, pa_dbusiface_device_port_get_name(new_active), TRUE)) < 0) {
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED,
+                               "Internal error in PulseAudio: pa_sink_set_port() failed with error code %i.", r);
+            return;
+        }
+    } else {
+        if ((r = pa_source_set_port(d->source, pa_dbusiface_device_port_get_name(new_active), TRUE)) < 0) {
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED,
+                               "Internal error in PulseAudio: pa_source_set_port() failed with error code %i.", r);
+            return;
+        }
+    }
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    pa_dbus_send_proplist_variant_reply(conn, msg, d->proplist);
+}
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+    dbus_uint32_t idx = 0;
+    const char *name = NULL;
+    const char *driver = NULL;
+    pa_module *owner_module = NULL;
+    const char *owner_module_path = NULL;
+    pa_card *card = NULL;
+    const char *card_path = NULL;
+    dbus_uint32_t sample_format = 0;
+    dbus_uint32_t sample_rate = 0;
+    pa_channel_map *channel_map = NULL;
+    dbus_uint32_t channels[PA_CHANNELS_MAX];
+    dbus_uint32_t volume[PA_CHANNELS_MAX];
+    dbus_bool_t has_flat_volume = FALSE;
+    dbus_bool_t has_convertible_to_decibel_volume = FALSE;
+    dbus_uint32_t base_volume = 0;
+    dbus_uint32_t volume_steps = 0;
+    dbus_bool_t has_hardware_volume = FALSE;
+    dbus_bool_t has_hardware_mute = FALSE;
+    dbus_uint64_t configured_latency = 0;
+    dbus_bool_t has_dynamic_latency = FALSE;
+    dbus_uint64_t latency = 0;
+    dbus_bool_t is_hardware_device = FALSE;
+    dbus_bool_t is_network_device = FALSE;
+    dbus_uint32_t state = 0;
+    const char **ports = NULL;
+    unsigned n_ports = 0;
+    const char *active_port = NULL;
+    unsigned i = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    idx = (d->type == DEVICE_TYPE_SINK) ? d->sink->index : d->source->index;
+    name = (d->type == DEVICE_TYPE_SINK) ? d->sink->name : d->source->name;
+    driver = (d->type == DEVICE_TYPE_SINK) ? d->sink->driver : d->source->driver;
+    owner_module = (d->type == DEVICE_TYPE_SINK) ? d->sink->module : d->source->module;
+    if (owner_module)
+        owner_module_path = pa_dbusiface_core_get_module_path(d->core, owner_module);
+    card = (d->type == DEVICE_TYPE_SINK) ? d->sink->card : d->source->card;
+    if (card)
+        card_path = pa_dbusiface_core_get_card_path(d->core, card);
+    sample_format = (d->type == DEVICE_TYPE_SINK) ? d->sink->sample_spec.format : d->source->sample_spec.format;
+    sample_rate = (d->type == DEVICE_TYPE_SINK) ? d->sink->sample_spec.rate : d->source->sample_spec.rate;
+    channel_map = (d->type == DEVICE_TYPE_SINK) ? &d->sink->channel_map : &d->source->channel_map;
+    for (i = 0; i < channel_map->channels; ++i)
+        channels[i] = channel_map->map[i];
+    for (i = 0; i < d->volume.channels; ++i)
+        volume[i] = d->volume.values[i];
+    has_flat_volume = (d->type == DEVICE_TYPE_SINK) ? (d->sink->flags & PA_SINK_FLAT_VOLUME) : FALSE;
+    has_convertible_to_decibel_volume = (d->type == DEVICE_TYPE_SINK)
+                                        ? (d->sink->flags & PA_SINK_DECIBEL_VOLUME)
+                                        : (d->source->flags & PA_SOURCE_DECIBEL_VOLUME);
+    base_volume = (d->type == DEVICE_TYPE_SINK) ? d->sink->base_volume : d->source->base_volume;
+    volume_steps = (d->type == DEVICE_TYPE_SINK) ? d->sink->n_volume_steps : d->source->n_volume_steps;
+    has_hardware_volume = (d->type == DEVICE_TYPE_SINK)
+                          ? (d->sink->flags & PA_SINK_HW_VOLUME_CTRL)
+                          : (d->source->flags & PA_SOURCE_HW_VOLUME_CTRL);
+    has_hardware_mute = (d->type == DEVICE_TYPE_SINK)
+                        ? (d->sink->flags & PA_SINK_HW_MUTE_CTRL)
+                        : (d->source->flags & PA_SOURCE_HW_MUTE_CTRL);
+    configured_latency = (d->type == DEVICE_TYPE_SINK)
+                         ? pa_sink_get_requested_latency(d->sink)
+                         : pa_source_get_requested_latency(d->source);
+    has_dynamic_latency = (d->type == DEVICE_TYPE_SINK)
+                          ? (d->sink->flags & PA_SINK_DYNAMIC_LATENCY)
+                          : (d->source->flags & PA_SOURCE_DYNAMIC_LATENCY);
+    latency = (d->type == DEVICE_TYPE_SINK) ? pa_sink_get_latency(d->sink) : pa_source_get_latency(d->source);
+    is_hardware_device = (d->type == DEVICE_TYPE_SINK)
+                         ? (d->sink->flags & PA_SINK_HARDWARE)
+                         : (d->source->flags & PA_SOURCE_HARDWARE);
+    is_network_device = (d->type == DEVICE_TYPE_SINK)
+                        ? (d->sink->flags & PA_SINK_NETWORK)
+                        : (d->source->flags & PA_SOURCE_NETWORK);
+    state = (d->type == DEVICE_TYPE_SINK) ? pa_sink_get_state(d->sink) : pa_source_get_state(d->source);
+    ports = get_ports(d, &n_ports);
+    if (d->active_port)
+        active_port = pa_dbusiface_device_port_get_path(pa_hashmap_get(d->ports, d->active_port->name));
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &idx);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &name);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DRIVER].property_name, DBUS_TYPE_STRING, &driver);
+
+    if (owner_module)
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_OWNER_MODULE].property_name, DBUS_TYPE_OBJECT_PATH, &owner_module_path);
+
+    if (card)
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CARD].property_name, DBUS_TYPE_OBJECT_PATH, &card_path);
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLE_FORMAT].property_name, DBUS_TYPE_UINT32, &sample_format);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLE_RATE].property_name, DBUS_TYPE_UINT32, &sample_rate);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CHANNELS].property_name, DBUS_TYPE_UINT32, channels, channel_map->channels);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_VOLUME].property_name, DBUS_TYPE_UINT32, volume, d->volume.channels);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_HAS_FLAT_VOLUME].property_name, DBUS_TYPE_BOOLEAN, &has_flat_volume);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_HAS_CONVERTIBLE_TO_DECIBEL_VOLUME].property_name, DBUS_TYPE_BOOLEAN, &has_convertible_to_decibel_volume);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_BASE_VOLUME].property_name, DBUS_TYPE_UINT32, &base_volume);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_VOLUME_STEPS].property_name, DBUS_TYPE_UINT32, &volume_steps);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_IS_MUTED].property_name, DBUS_TYPE_BOOLEAN, &d->is_muted);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_HAS_HARDWARE_VOLUME].property_name, DBUS_TYPE_BOOLEAN, &has_hardware_volume);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_HAS_HARDWARE_MUTE].property_name, DBUS_TYPE_BOOLEAN, &has_hardware_mute);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CONFIGURED_LATENCY].property_name, DBUS_TYPE_UINT64, &configured_latency);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_HAS_DYNAMIC_LATENCY].property_name, DBUS_TYPE_BOOLEAN, &has_dynamic_latency);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_LATENCY].property_name, DBUS_TYPE_UINT64, &latency);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_IS_HARDWARE_DEVICE].property_name, DBUS_TYPE_BOOLEAN, &is_hardware_device);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_IS_NETWORK_DEVICE].property_name, DBUS_TYPE_BOOLEAN, &is_network_device);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_STATE].property_name, DBUS_TYPE_UINT32, &state);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PORTS].property_name, DBUS_TYPE_OBJECT_PATH, ports, n_ports);
+
+    if (active_port)
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_ACTIVE_PORT].property_name, DBUS_TYPE_OBJECT_PATH, &active_port);
+
+    pa_dbus_append_proplist_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PROPERTY_LIST].property_name, d->proplist);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+
+    dbus_message_unref(reply);
+
+    pa_xfree(ports);
+}
+
+static void handle_suspend(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    dbus_bool_t suspend = FALSE;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_BOOLEAN, &suspend) < 0)
+        return;
+
+    if ((d->type == DEVICE_TYPE_SINK) && (pa_sink_suspend(d->sink, suspend, PA_SUSPEND_USER) < 0)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Internal error in PulseAudio: pa_sink_suspend() failed.");
+        return;
+    } else if ((d->type == DEVICE_TYPE_SOURCE) && (pa_source_suspend(d->source, suspend, PA_SUSPEND_USER) < 0)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Internal error in PulseAudio: pa_source_suspend() failed.");
+        return;
+    }
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+static void handle_get_port_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    DBusError error;
+    const char *port_name = NULL;
+    pa_dbusiface_device_port *port = NULL;
+    const char *port_path = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+
+    dbus_error_init(&error);
+
+    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &port_name, DBUS_TYPE_INVALID)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
+        dbus_error_free(&error);
+        return;
+    }
+
+    if (!(port = pa_hashmap_get(d->ports, port_name))) {
+        if (d->type == DEVICE_TYPE_SINK)
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND,
+                               "%s: No such port on sink %s.", port_name, d->sink->name);
+        else
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND,
+                               "%s: No such port on source %s.", port_name, d->source->name);
+        return;
+    }
+
+    port_path = pa_dbusiface_device_port_get_path(port);
+
+    pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &port_path);
+}
+
+static void handle_sink_get_monitor_source(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    const char *monitor_source = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+    pa_assert(d->type == DEVICE_TYPE_SINK);
+
+    monitor_source = pa_dbusiface_core_get_source_path(d->core, d->sink->monitor_source);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &monitor_source);
+}
+
+static void handle_sink_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+    const char *monitor_source = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+    pa_assert(d->type == DEVICE_TYPE_SINK);
+
+    monitor_source = pa_dbusiface_core_get_source_path(d->core, d->sink->monitor_source);
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[SINK_PROPERTY_HANDLER_MONITOR_SOURCE].property_name, DBUS_TYPE_OBJECT_PATH, &monitor_source);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+
+    dbus_message_unref(reply);
+}
+
+static void handle_source_get_monitor_of_sink(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    const char *monitor_of_sink = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+    pa_assert(d->type == DEVICE_TYPE_SOURCE);
+
+    if (!d->source->monitor_of) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Source %s is not a monitor source.", d->source->name);
+        return;
+    }
+
+    monitor_of_sink = pa_dbusiface_core_get_sink_path(d->core, d->source->monitor_of);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &monitor_of_sink);
+}
+
+static void handle_source_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+    const char *monitor_of_sink = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(d);
+    pa_assert(d->type == DEVICE_TYPE_SOURCE);
+
+    if (d->source->monitor_of)
+        monitor_of_sink = pa_dbusiface_core_get_sink_path(d->core, d->source->monitor_of);
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    if (monitor_of_sink)
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[SOURCE_PROPERTY_HANDLER_MONITOR_OF_SINK].property_name, DBUS_TYPE_OBJECT_PATH, &monitor_of_sink);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+
+    dbus_message_unref(reply);
+}
+
+static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
+    pa_dbusiface_device *d = userdata;
+
+    pa_assert(c);
+    pa_assert(d);
+
+    if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_CHANGE) {
+        DBusMessage *signal = NULL;
+        const pa_cvolume *new_volume = NULL;
+        pa_bool_t new_muted = FALSE;
+        pa_sink_state_t new_sink_state = 0;
+        pa_source_state_t new_source_state = 0;
+        pa_device_port *new_active_port = NULL;
+        pa_proplist *new_proplist = NULL;
+        unsigned i = 0;
+
+        pa_assert(((d->type == DEVICE_TYPE_SINK)
+                    && ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SINK))
+                  || ((d->type == DEVICE_TYPE_SOURCE)
+                       && ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE)));
+
+        new_volume = (d->type == DEVICE_TYPE_SINK)
+                     ? pa_sink_get_volume(d->sink, FALSE, FALSE)
+                     : pa_source_get_volume(d->source, FALSE);
+
+        if (!pa_cvolume_equal(&d->volume, new_volume)) {
+            dbus_uint32_t volume[PA_CHANNELS_MAX];
+            dbus_uint32_t *volume_ptr = volume;
+
+            d->volume = *new_volume;
+
+            for (i = 0; i < d->volume.channels; ++i)
+                volume[i] = d->volume.values[i];
+
+            pa_assert_se(signal = dbus_message_new_signal(d->path,
+                                                          PA_DBUSIFACE_DEVICE_INTERFACE,
+                                                          signals[SIGNAL_VOLUME_UPDATED].name));
+            pa_assert_se(dbus_message_append_args(signal,
+                                                  DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &volume_ptr, d->volume.channels,
+                                                  DBUS_TYPE_INVALID));
+
+            pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
+            dbus_message_unref(signal);
+            signal = NULL;
+        }
+
+        new_muted = (d->type == DEVICE_TYPE_SINK) ? pa_sink_get_mute(d->sink, FALSE) : pa_source_get_mute(d->source, FALSE);
+
+        if (d->is_muted != new_muted) {
+            d->is_muted = new_muted;
+
+            pa_assert_se(signal = dbus_message_new_signal(d->path,
+                                                          PA_DBUSIFACE_DEVICE_INTERFACE,
+                                                          signals[SIGNAL_MUTE_UPDATED].name));
+            pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_BOOLEAN, &d->is_muted, DBUS_TYPE_INVALID));
+
+            pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
+            dbus_message_unref(signal);
+            signal = NULL;
+        }
+
+        if (d->type == DEVICE_TYPE_SINK)
+            new_sink_state = pa_sink_get_state(d->sink);
+        else
+            new_source_state = pa_source_get_state(d->source);
+
+        if ((d->type == DEVICE_TYPE_SINK && d->sink_state != new_sink_state)
+            || (d->type == DEVICE_TYPE_SOURCE && d->source_state != new_source_state)) {
+            dbus_uint32_t state = 0;
+
+            if (d->type == DEVICE_TYPE_SINK)
+                d->sink_state = new_sink_state;
+            else
+                d->source_state = new_source_state;
+
+            state = (d->type == DEVICE_TYPE_SINK) ? d->sink_state : d->source_state;
+
+            pa_assert_se(signal = dbus_message_new_signal(d->path,
+                                                          PA_DBUSIFACE_DEVICE_INTERFACE,
+                                                          signals[SIGNAL_STATE_UPDATED].name));
+            pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_UINT32, &state, DBUS_TYPE_INVALID));
+
+            pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
+            dbus_message_unref(signal);
+            signal = NULL;
+        }
+
+        new_active_port = (d->type == DEVICE_TYPE_SINK) ? d->sink->active_port : d->source->active_port;
+
+        if (d->active_port != new_active_port) {
+            const char *object_path = NULL;
+
+            d->active_port = new_active_port;
+            object_path = pa_dbusiface_device_port_get_path(pa_hashmap_get(d->ports, d->active_port->name));
+
+            pa_assert_se(signal = dbus_message_new_signal(d->path,
+                                                          PA_DBUSIFACE_DEVICE_INTERFACE,
+                                                          signals[SIGNAL_ACTIVE_PORT_UPDATED].name));
+            pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+            pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
+            dbus_message_unref(signal);
+            signal = NULL;
+        }
+
+        new_proplist = (d->type == DEVICE_TYPE_SINK) ? d->sink->proplist : d->source->proplist;
+
+        if (!pa_proplist_equal(d->proplist, new_proplist)) {
+            DBusMessageIter msg_iter;
+
+            pa_proplist_update(d->proplist, PA_UPDATE_SET, new_proplist);
+
+            pa_assert_se(signal = dbus_message_new_signal(d->path,
+                                                          PA_DBUSIFACE_DEVICE_INTERFACE,
+                                                          signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+            dbus_message_iter_init_append(signal, &msg_iter);
+            pa_dbus_append_proplist(&msg_iter, d->proplist);
+
+            pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
+            dbus_message_unref(signal);
+            signal = NULL;
+        }
+    }
+}
+
 pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_dbusiface_core *core, pa_sink *sink) {
-    pa_dbusiface_device *d;
+    pa_dbusiface_device *d = NULL;
 
     pa_assert(core);
     pa_assert(sink);
 
-    d = pa_xnew(pa_dbusiface_device, 1);
+    d = pa_xnew0(pa_dbusiface_device, 1);
+    d->core = core;
     d->sink = pa_sink_ref(sink);
     d->type = DEVICE_TYPE_SINK;
     d->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, SINK_OBJECT_NAME, sink->index);
+    d->volume = *pa_sink_get_volume(sink, FALSE, FALSE);
+    d->is_muted = pa_sink_get_mute(sink, FALSE);
+    d->sink_state = pa_sink_get_state(sink);
+    d->ports = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+    d->next_port_index = 0;
+    d->active_port = NULL;
+    d->proplist = pa_proplist_copy(sink->proplist);
+    d->dbus_protocol = pa_dbus_protocol_get(sink->core);
+    d->subscription = pa_subscription_new(sink->core, PA_SUBSCRIPTION_MASK_SINK, subscription_cb, d);
+
+    if (sink->ports) {
+        pa_device_port *port;
+        void *state = NULL;
+
+        PA_HASHMAP_FOREACH(port, sink->ports, state) {
+            pa_dbusiface_device_port *p = pa_dbusiface_device_port_new(d, sink->core, port, d->next_port_index++);
+            pa_hashmap_put(d->ports, pa_dbusiface_device_port_get_name(p), p);
+        }
+        pa_assert_se(d->active_port = sink->active_port);
+    }
+
+    pa_assert_se(pa_dbus_protocol_add_interface(d->dbus_protocol, d->path, &device_interface_info, d) >= 0);
+    pa_assert_se(pa_dbus_protocol_add_interface(d->dbus_protocol, d->path, &sink_interface_info, d) >= 0);
 
     return d;
 }
 
 pa_dbusiface_device *pa_dbusiface_device_new_source(pa_dbusiface_core *core, pa_source *source) {
-    pa_dbusiface_device *d;
+    pa_dbusiface_device *d = NULL;
 
     pa_assert(core);
     pa_assert(source);
 
-    d = pa_xnew(pa_dbusiface_device, 1);
+    d = pa_xnew0(pa_dbusiface_device, 1);
+    d->core = core;
     d->source = pa_source_ref(source);
     d->type = DEVICE_TYPE_SOURCE;
     d->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, SOURCE_OBJECT_NAME, source->index);
+    d->volume = *pa_source_get_volume(source, FALSE);
+    d->is_muted = pa_source_get_mute(source, FALSE);
+    d->source_state = pa_source_get_state(source);
+    d->ports = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+    d->next_port_index = 0;
+    d->active_port = NULL;
+    d->proplist = pa_proplist_copy(source->proplist);
+    d->dbus_protocol = pa_dbus_protocol_get(source->core);
+    d->subscription = pa_subscription_new(source->core, PA_SUBSCRIPTION_MASK_SOURCE, subscription_cb, d);
+
+    if (source->ports) {
+        pa_device_port *port;
+        void *state = NULL;
+
+        PA_HASHMAP_FOREACH(port, source->ports, state) {
+            pa_dbusiface_device_port *p = pa_dbusiface_device_port_new(d, source->core, port, d->next_port_index++);
+            pa_hashmap_put(d->ports, pa_dbusiface_device_port_get_name(p), p);
+        }
+        pa_assert_se(d->active_port = source->active_port);
+    }
+
+    pa_assert_se(pa_dbus_protocol_add_interface(d->dbus_protocol, d->path, &device_interface_info, d) >= 0);
+    pa_assert_se(pa_dbus_protocol_add_interface(d->dbus_protocol, d->path, &source_interface_info, d) >= 0);
 
     return d;
 }
 
+static void port_free_cb(void *p, void *userdata) {
+    pa_dbusiface_device_port *port = p;
+
+    pa_assert(port);
+
+    pa_dbusiface_device_port_free(port);
+}
+
 void pa_dbusiface_device_free(pa_dbusiface_device *d) {
     pa_assert(d);
 
-    if (d->type == DEVICE_TYPE_SINK)
+    pa_assert_se(pa_dbus_protocol_remove_interface(d->dbus_protocol, d->path, device_interface_info.name) >= 0);
+
+    if (d->type == DEVICE_TYPE_SINK) {
+        pa_assert_se(pa_dbus_protocol_remove_interface(d->dbus_protocol, d->path, sink_interface_info.name) >= 0);
         pa_sink_unref(d->sink);
-    else
+
+    } else {
+        pa_assert_se(pa_dbus_protocol_remove_interface(d->dbus_protocol, d->path, source_interface_info.name) >= 0);
         pa_source_unref(d->source);
+    }
+    pa_hashmap_free(d->ports, port_free_cb, NULL);
+    pa_dbus_protocol_unref(d->dbus_protocol);
+    pa_subscription_free(d->subscription);
 
     pa_xfree(d->path);
     pa_xfree(d);
diff --git a/src/modules/dbus/iface-device.h b/src/modules/dbus/iface-device.h
index 1e9af83..62e05e9 100644
--- a/src/modules/dbus/iface-device.h
+++ b/src/modules/dbus/iface-device.h
@@ -29,11 +29,16 @@
  * documentation.
  */
 
+#include <pulsecore/protocol-dbus.h>
 #include <pulsecore/sink.h>
 #include <pulsecore/source.h>
 
 #include "iface-core.h"
 
+#define PA_DBUSIFACE_DEVICE_INTERFACE PA_DBUS_CORE_INTERFACE ".Device"
+#define PA_DBUSIFACE_SINK_INTERFACE PA_DBUS_CORE_INTERFACE ".Sink"
+#define PA_DBUSIFACE_SOURCE_INTERFACE PA_DBUS_CORE_INTERFACE ".Source"
+
 typedef struct pa_dbusiface_device pa_dbusiface_device;
 
 pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_dbusiface_core *core, pa_sink *sink);

commit f663d13acd306feafe2526c6a9258f14fd5d2ffc
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sat Aug 15 16:54:11 2009 +0300

    dbusiface-core: Two new functions: pa_dbusiface_core_get_playback/record_stream_path().

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index 81e709f..2b5cf0b 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -2055,6 +2055,20 @@ const char *pa_dbusiface_core_get_source_path(pa_dbusiface_core *c, const pa_sou
     return pa_dbusiface_device_get_path(pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(source->index)));
 }
 
+const char *pa_dbusiface_core_get_playback_stream_path(pa_dbusiface_core *c, const pa_sink_input *sink_input) {
+    pa_assert(c);
+    pa_assert(sink_input);
+
+    return pa_dbusiface_stream_get_path(pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(sink_input->index)));
+}
+
+const char *pa_dbusiface_core_get_record_stream_path(pa_dbusiface_core *c, const pa_source_output *source_output) {
+    pa_assert(c);
+    pa_assert(source_output);
+
+    return pa_dbusiface_stream_get_path(pa_hashmap_get(c->record_streams, PA_UINT32_TO_PTR(source_output->index)));
+}
+
 const char *pa_dbusiface_core_get_module_path(pa_dbusiface_core *c, const pa_module *module) {
     pa_assert(c);
     pa_assert(module);
diff --git a/src/modules/dbus/iface-core.h b/src/modules/dbus/iface-core.h
index 7010205..14dff7e 100644
--- a/src/modules/dbus/iface-core.h
+++ b/src/modules/dbus/iface-core.h
@@ -38,6 +38,8 @@ void pa_dbusiface_core_free(pa_dbusiface_core *c);
 const char *pa_dbusiface_core_get_card_path(pa_dbusiface_core *c, const pa_card *card);
 const char *pa_dbusiface_core_get_sink_path(pa_dbusiface_core *c, const pa_sink *sink);
 const char *pa_dbusiface_core_get_source_path(pa_dbusiface_core *c, const pa_source *source);
+const char *pa_dbusiface_core_get_playback_stream_path(pa_dbusiface_core *c, const pa_sink_input *sink_input);
+const char *pa_dbusiface_core_get_record_stream_path(pa_dbusiface_core *c, const pa_source_output *source_output);
 const char *pa_dbusiface_core_get_module_path(pa_dbusiface_core *c, const pa_module *module);
 
 #endif

commit 9ed25d7388bacfb0948d21d9aefa4fe92dbea0b5
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sat Aug 15 16:55:29 2009 +0300

    dbusiface-client: Implement the properties of the Client D-Bus interface.
    
    Based on a patch from Vincent Filali-Ansary.

diff --git a/src/modules/dbus/iface-client.c b/src/modules/dbus/iface-client.c
index d9c8653..dd4e57a 100644
--- a/src/modules/dbus/iface-client.c
+++ b/src/modules/dbus/iface-client.c
@@ -2,6 +2,7 @@
   This file is part of PulseAudio.
 
   Copyright 2009 Tanu Kaskinen
+  Copyright 2009 Vincent Filali-Ansary <filali.v at azurdigitalnetworks.net>
 
   PulseAudio is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as published
@@ -23,7 +24,10 @@
 #include <config.h>
 #endif
 
+#include <dbus/dbus.h>
+
 #include <pulsecore/core-util.h>
+#include <pulsecore/dbus-util.h>
 #include <pulsecore/protocol-dbus.h>
 
 #include "iface-client.h"
@@ -31,19 +35,288 @@
 #define OBJECT_NAME "client"
 
 struct pa_dbusiface_client {
+    pa_dbusiface_core *core;
+
     pa_client *client;
     char *path;
+
+    pa_dbus_protocol *dbus_protocol;
+};
+
+static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_playback_streams(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_record_streams(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+/*static void handle_kill(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_update_properties(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_remove_properties(DBusConnection *conn, DBusMessage *msg, void *userdata);*/
+
+enum property_handler_index {
+    PROPERTY_HANDLER_INDEX,
+    PROPERTY_HANDLER_DRIVER,
+    PROPERTY_HANDLER_OWNER_MODULE,
+    PROPERTY_HANDLER_PLAYBACK_STREAMS,
+    PROPERTY_HANDLER_RECORD_STREAMS,
+    PROPERTY_HANDLER_PROPERTY_LIST,
+    PROPERTY_HANDLER_MAX
+};
+
+static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
+    [PROPERTY_HANDLER_INDEX]            = { .property_name = "Index",           .type = "u",      .get_cb = handle_get_index,            .set_cb = NULL },
+    [PROPERTY_HANDLER_DRIVER]           = { .property_name = "Driver",          .type = "s",      .get_cb = handle_get_driver,           .set_cb = NULL },
+    [PROPERTY_HANDLER_OWNER_MODULE]     = { .property_name = "OwnerModule",     .type = "o",      .get_cb = handle_get_owner_module,     .set_cb = NULL },
+    [PROPERTY_HANDLER_PLAYBACK_STREAMS] = { .property_name = "PlaybackStreams", .type = "ao",     .get_cb = handle_get_playback_streams, .set_cb = NULL },
+    [PROPERTY_HANDLER_RECORD_STREAMS]   = { .property_name = "RecordStreams",   .type = "ao",     .get_cb = handle_get_record_streams,   .set_cb = NULL },
+    [PROPERTY_HANDLER_PROPERTY_LIST]    = { .property_name = "PropertyList",    .type = "a{say}", .get_cb = handle_get_property_list,    .set_cb = NULL }
+};
+
+/*enum method_handler_index {
+    METHOD_HANDLER_KILL,
+    METHOD_HANDLER_UPDATE_PROPERTIES,
+    METHOD_HANDLER_REMOVE_PROPERTIES,
+    METHOD_HANDLER_MAX
 };
 
+static pa_dbus_arg_info update_properties_args[] = { { "property_list", "a{say}", "in" }, { "update_mode", "u", "in" } };
+static pa_dbus_arg_info update_properties_args[] = { { "keys", "as", "in" } };
+
+static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
+    [METHOD_HANDLER_KILL] = {
+        .method_name = "Kill",
+        .arguments = NULL,
+        .n_arguments = 0,
+        .receive_cb = handle_kill },
+    [METHOD_HANDLER_UPDATE_PROPERTIES] = {
+        .method_name = "UpdateProperties",
+        .arguments = update_propertes_args,
+        .n_arguments = sizeof(update_properties_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_update_properties },
+    [METHOD_HANDLER_REMOVE_PROPERTIES] = {
+        .method_name = "RemoveProperties",
+        .arguments = remove_propertes_args,
+        .n_arguments = sizeof(update_properties_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_update_properties }
+};
+
+enum signal_index {
+    SIGNAL_PROPERTY_LIST_UPDATED,
+    SIGNAL_CLIENT_EVENT,
+    SIGNAL_MAX
+};
+
+static pa_dbus_arg_info active_profile_updated_args[] = { { "profile",       "o",      NULL } };
+static pa_dbus_arg_info property_list_updated_args[]  = { { "property_list", "a{say}", NULL } };
+
+static pa_dbus_signal_info signals[SIGNAL_MAX] = {
+    [SIGNAL_ACTIVE_PROFILE_UPDATED] = { .name = "ActiveProfileUpdated", .arguments = active_profile_updated_args, .n_arguments = 1 },
+    [SIGNAL_PROPERTY_LIST_UPDATED]  = { .name = "PropertyListUpdated",  .arguments = property_list_updated_args,  .n_arguments = 1 }
+};*/
+
+static pa_dbus_interface_info client_interface_info = {
+    .name = OBJECT_NAME,
+    .method_handlers = /*method_handlers*/ NULL,
+    .n_method_handlers = /*METHOD_HANDLER_MAX*/ 0,
+    .property_handlers = property_handlers,
+    .n_property_handlers = PROPERTY_HANDLER_MAX,
+    .get_all_properties_cb = handle_get_all,
+    .signals = /*signals*/ NULL,
+    .n_signals = /*SIGNAL_MAX*/ 0
+};
+
+static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+  pa_dbusiface_client *c = userdata;
+  dbus_uint32_t idx = 0;
+
+  pa_assert(conn);
+  pa_assert(msg);
+  pa_assert(c);
+
+  idx = c->client->index;
+
+  pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &idx);
+}
+
+static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_client *c = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &c->client->driver);
+}
+
+static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_client *c = userdata;
+    const char *owner_module = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    if (!c->client->module) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Client %d doesn't have an owner module.", c->client->index);
+        return;
+    }
+
+    owner_module = pa_dbusiface_core_get_module_path(c->core, c->client->module);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &owner_module);
+}
+
+/* The caller frees the array, but not the strings. */
+static const char **get_playback_streams(pa_dbusiface_client *c, unsigned *n) {
+    const char **playback_streams = NULL;
+    unsigned i = 0;
+    uint32_t idx = 0;
+    pa_sink_input *sink_input = NULL;
+
+    pa_assert(c);
+    pa_assert(n);
+
+    *n = pa_idxset_size(c->client->sink_inputs);
+
+    if (*n == 0)
+        return NULL;
+
+    playback_streams = pa_xnew(const char *, *n);
+
+    PA_IDXSET_FOREACH(sink_input, c->client->sink_inputs, idx)
+        playback_streams[i++] = pa_dbusiface_core_get_playback_stream_path(c->core, sink_input);
+
+    return playback_streams;
+}
+
+static void handle_get_playback_streams(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_client *c = userdata;
+    const char **playback_streams = NULL;
+    unsigned n_playback_streams = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    playback_streams = get_playback_streams(c, &n_playback_streams);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, playback_streams, n_playback_streams);
+
+    pa_xfree(playback_streams);
+}
+
+/* The caller frees the array, but not the strings. */
+static const char **get_record_streams(pa_dbusiface_client *c, unsigned *n) {
+    const char **record_streams = NULL;
+    unsigned i = 0;
+    uint32_t idx = 0;
+    pa_source_output *source_output = NULL;
+
+    pa_assert(c);
+    pa_assert(n);
+
+    *n = pa_idxset_size(c->client->source_outputs);
+
+    if (*n == 0)
+        return NULL;
+
+    record_streams = pa_xnew(const char *, *n);
+
+    PA_IDXSET_FOREACH(source_output, c->client->source_outputs, idx)
+        record_streams[i++] = pa_dbusiface_core_get_record_stream_path(c->core, source_output);
+
+    return record_streams;
+}
+
+static void handle_get_record_streams(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_client *c = userdata;
+    const char **record_streams = NULL;
+    unsigned n_record_streams = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    record_streams = get_record_streams(c, &n_record_streams);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, record_streams, n_record_streams);
+
+    pa_xfree(record_streams);
+}
+
+static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_client *c = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    pa_dbus_send_proplist_variant_reply(conn, msg, c->client->proplist);
+}
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_client *c = userdata;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+    dbus_uint32_t idx = 0;
+    const char *owner_module = NULL;
+    const char **playback_streams = NULL;
+    unsigned n_playback_streams = 0;
+    const char **record_streams = NULL;
+    unsigned n_record_streams = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    idx = c->client->index;
+    if (c->client->module)
+        owner_module = pa_dbusiface_core_get_module_path(c->core, c->client->module);
+    playback_streams = get_playback_streams(c, &n_playback_streams);
+    record_streams = get_record_streams(c, &n_record_streams);
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &idx);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DRIVER].property_name, DBUS_TYPE_STRING, &c->client->driver);
+
+    if (owner_module)
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_OWNER_MODULE].property_name, DBUS_TYPE_OBJECT_PATH, &owner_module);
+
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PLAYBACK_STREAMS].property_name, DBUS_TYPE_OBJECT_PATH, playback_streams, n_playback_streams);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_RECORD_STREAMS].property_name, DBUS_TYPE_OBJECT_PATH, record_streams, n_record_streams);
+    pa_dbus_append_proplist_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PROPERTY_LIST].property_name, c->client->proplist);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+
+    dbus_message_unref(reply);
+
+    pa_xfree(playback_streams);
+    pa_xfree(record_streams);
+}
+
 pa_dbusiface_client *pa_dbusiface_client_new(pa_dbusiface_core *core, pa_client *client) {
-    pa_dbusiface_client *c;
+    pa_dbusiface_client *c = NULL;
 
     pa_assert(core);
     pa_assert(client);
 
     c = pa_xnew(pa_dbusiface_client, 1);
+    c->core = core;
     c->client = client;
     c->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, client->index);
+    c->dbus_protocol = pa_dbus_protocol_get(client->core);
+
+    pa_assert_se(pa_dbus_protocol_add_interface(c->dbus_protocol, c->path, &client_interface_info, c) >= 0);
 
     return c;
 }
@@ -51,6 +324,10 @@ pa_dbusiface_client *pa_dbusiface_client_new(pa_dbusiface_core *core, pa_client
 void pa_dbusiface_client_free(pa_dbusiface_client *c) {
     pa_assert(c);
 
+    pa_assert_se(pa_dbus_protocol_remove_interface(c->dbus_protocol, c->path, client_interface_info.name) >= 0);
+
+    pa_dbus_protocol_unref(c->dbus_protocol);
+
     pa_xfree(c->path);
     pa_xfree(c);
 }

commit c7f4ed3c7a0453ff29181fe03666e0c7d3822317
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sat Aug 15 17:08:21 2009 +0300

    dbusiface-client: Fix the interface name.

diff --git a/src/modules/dbus/iface-client.c b/src/modules/dbus/iface-client.c
index dd4e57a..186e2d3 100644
--- a/src/modules/dbus/iface-client.c
+++ b/src/modules/dbus/iface-client.c
@@ -118,7 +118,7 @@ static pa_dbus_signal_info signals[SIGNAL_MAX] = {
 };*/
 
 static pa_dbus_interface_info client_interface_info = {
-    .name = OBJECT_NAME,
+    .name = PA_DBUSIFACE_CLIENT_INTERFACE,
     .method_handlers = /*method_handlers*/ NULL,
     .n_method_handlers = /*METHOD_HANDLER_MAX*/ 0,
     .property_handlers = property_handlers,
diff --git a/src/modules/dbus/iface-client.h b/src/modules/dbus/iface-client.h
index ff90625..e8f151c 100644
--- a/src/modules/dbus/iface-client.h
+++ b/src/modules/dbus/iface-client.h
@@ -22,16 +22,19 @@
   USA.
 ***/
 
-/* This object implements the D-Bus interface org.PulseAudio.Core1.Card.
+/* This object implements the D-Bus interface org.PulseAudio.Core1.Client.
  *
- * See http://pulseaudio.org/wiki/DBusInterface for the Card interface
+ * See http://pulseaudio.org/wiki/DBusInterface for the Client interface
  * documentation.
  */
 
 #include <pulsecore/client.h>
+#include <pulsecore/protocol-dbus.h>
 
 #include "iface-core.h"
 
+#define PA_DBUSIFACE_CLIENT_INTERFACE PA_DBUS_CORE_INTERFACE ".Client"
+
 typedef struct pa_dbusiface_client pa_dbusiface_client;
 
 pa_dbusiface_client *pa_dbusiface_client_new(pa_dbusiface_core *core, pa_client *client);

commit a72bba18ea4dd273371179844a0a964e706fd489
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 16 19:39:39 2009 +0300

    dbusiface-client: Fix indentation.

diff --git a/src/modules/dbus/iface-client.c b/src/modules/dbus/iface-client.c
index 186e2d3..587d5c4 100644
--- a/src/modules/dbus/iface-client.c
+++ b/src/modules/dbus/iface-client.c
@@ -129,16 +129,16 @@ static pa_dbus_interface_info client_interface_info = {
 };
 
 static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) {
-  pa_dbusiface_client *c = userdata;
-  dbus_uint32_t idx = 0;
+    pa_dbusiface_client *c = userdata;
+    dbus_uint32_t idx = 0;
 
-  pa_assert(conn);
-  pa_assert(msg);
-  pa_assert(c);
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
 
-  idx = c->client->index;
+    idx = c->client->index;
 
-  pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &idx);
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &idx);
 }
 
 static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata) {

commit f0db081223dd056d6ddbc2a97c557254198a0eaf
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 16 19:41:43 2009 +0300

    dbusiface-device: Free the copied proplist.

diff --git a/src/modules/dbus/iface-device.c b/src/modules/dbus/iface-device.c
index 3cf9d19..15ece83 100644
--- a/src/modules/dbus/iface-device.c
+++ b/src/modules/dbus/iface-device.c
@@ -1274,6 +1274,7 @@ void pa_dbusiface_device_free(pa_dbusiface_device *d) {
         pa_source_unref(d->source);
     }
     pa_hashmap_free(d->ports, port_free_cb, NULL);
+    pa_proplist_free(d->proplist);
     pa_dbus_protocol_unref(d->dbus_protocol);
     pa_subscription_free(d->subscription);
 

commit 2bb3eef414f80189cf6af6cd66c519630e4c0a43
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 16 19:42:56 2009 +0300

    dbusiface-stream: Implement about a half of the Stream D-Bus interface.

diff --git a/src/modules/dbus/iface-stream.c b/src/modules/dbus/iface-stream.c
index b5a1789..4333c16 100644
--- a/src/modules/dbus/iface-stream.c
+++ b/src/modules/dbus/iface-stream.c
@@ -2,6 +2,7 @@
   This file is part of PulseAudio.
 
   Copyright 2009 Tanu Kaskinen
+  Copyright 2009 Vincent Filali-Ansary <filali.v at azurdigitalnetworks.net>
 
   PulseAudio is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as published
@@ -24,6 +25,7 @@
 #endif
 
 #include <pulsecore/core-util.h>
+#include <pulsecore/dbus-util.h>
 #include <pulsecore/protocol-dbus.h>
 
 #include "iface-stream.h"
@@ -43,8 +45,369 @@ struct pa_dbusiface_stream {
     };
     enum stream_type type;
     char *path;
+    pa_cvolume volume;
+    pa_bool_t is_muted;
+    pa_proplist *proplist;
+
+    pa_dbus_protocol *dbus_protocol;
+    pa_subscription *subscription;
+};
+
+static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata);
+/*static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_client(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_device(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata);*/
+static void handle_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
+/*static void handle_get_buffer_latency(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_device_latency(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_resample_method(DBusConnection *conn, DBusMessage *msg, void *userdata);*/
+static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+/*static void handle_move(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_kill(DBusConnection *conn, DBusMessage *msg, void *userdata);*/
+
+enum property_handler_index {
+    PROPERTY_HANDLER_INDEX,
+/*    PROPERTY_HANDLER_DRIVER,
+    PROPERTY_HANDLER_OWNER_MODULE,
+    PROPERTY_HANDLER_CLIENT,
+    PROPERTY_HANDLER_DEVICE,
+    PROPERTY_HANDLER_SAMPLE_FORMAT,
+    PROPERTY_HANDLER_SAMPLE_RATE,
+    PROPERTY_HANDLER_CHANNELS,*/
+    PROPERTY_HANDLER_VOLUME,
+    PROPERTY_HANDLER_IS_MUTED,
+/*    PROPERTY_HANDLER_BUFFER_LATENCY,
+    PROPERTY_HANDLER_DEVICE_LATENCY,
+    PROPERTY_HANDLER_RESAMPLE_METHOD,*/
+    PROPERTY_HANDLER_PROPERTY_LIST,
+    PROPERTY_HANDLER_MAX
+};
+
+static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
+    [PROPERTY_HANDLER_INDEX]           = { .property_name = "Index",          .type = "u",      .get_cb = handle_get_index,           .set_cb = NULL },
+/*    [PROPERTY_HANDLER_DRIVER]          = { .property_name = "Driver",         .type = "s",      .get_cb = handle_get_driver,          .set_cb = NULL },
+    [PROPERTY_HANDLER_OWNER_MODULE]    = { .property_name = "OwnerModule",    .type = "o",      .get_cb = handle_get_owner_module,    .set_cb = NULL },
+    [PROPERTY_HANDLER_CLIENT]          = { .property_name = "Client",         .type = "o",      .get_cb = handle_get_client,          .set_cb = NULL },
+    [PROPERTY_HANDLER_DEVICE]          = { .property_name = "Device",         .type = "o",      .get_cb = handle_get_device,          .set_cb = NULL },
+    [PROPERTY_HANDLER_SAMPLE_FORMAT]   = { .property_name = "SampleFormat",   .type = "u",      .get_cb = handle_get_sample_format,   .set_cb = NULL },
+    [PROPERTY_HANDLER_SAMPLE_RATE]     = { .property_name = "SampleRate",     .type = "u",      .get_cb = handle_get_sample_rate,     .set_cb = NULL },
+    [PROPERTY_HANDLER_CHANNELS]        = { .property_name = "Channels",       .type = "au",     .get_cb = handle_get_channels,        .set_cb = NULL },*/
+    [PROPERTY_HANDLER_VOLUME]          = { .property_name = "Volume",         .type = "au",     .get_cb = handle_get_volume,          .set_cb = handle_set_volume },
+    [PROPERTY_HANDLER_IS_MUTED]        = { .property_name = "IsMuted",        .type = "b",      .get_cb = handle_get_is_muted,        .set_cb = handle_set_is_muted },
+/*    [PROPERTY_HANDLER_BUFFER_LATENCY]  = { .property_name = "BufferLatency",  .type = "t",      .get_cb = handle_get_buffer_latency,  .set_cb = NULL },
+    [PROPERTY_HANDLER_DEVICE_LATENCY]  = { .property_name = "DeviceLatency",  .type = "t",      .get_cb = handle_get_device_latency,  .set_cb = NULL },
+    [PROPERTY_HANDLER_RESAMPLE_METHOD] = { .property_name = "ResampleMethod", .type = "s",      .get_cb = handle_get_resample_method, .set_cb = NULL },*/
+    [PROPERTY_HANDLER_PROPERTY_LIST]   = { .property_name = "PropertyList",   .type = "a{say}", .get_cb = handle_get_property_list,   .set_cb = NULL }
+};
+
+/*enum method_handler_index {
+    METHOD_HANDLER_MOVE,
+    METHOD_HANDLER_KILL,
+    METHOD_HANDLER_MAX
+};
+
+static pa_dbus_arg_info move_args[] = { { "device", "o", "in" } };
+
+static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
+    [METHOD_HANDLER_MOVE] = {
+        .method_name = "Move",
+        .arguments = move_args,
+        .n_arguments = sizeof(move_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_move },
+    [METHOD_HANDLER_KILL] = {
+        .method_name = "Kill",
+        .arguments = NULL,
+        .n_arguments = 0,
+        .receive_cb = handle_kill }
+};*/
+
+enum signal_index {
+/*    SIGNAL_DEVICE_UPDATED,
+    SIGNAL_SAMPLE_RATE_UPDATED,*/
+    SIGNAL_VOLUME_UPDATED,
+    SIGNAL_MUTE_UPDATED,
+    SIGNAL_PROPERTY_LIST_UPDATED,
+/*    SIGNAL_STREAM_EVENT,*/
+    SIGNAL_MAX
+};
+
+/*static pa_dbus_arg_info device_updated_args[]        = { { "device",        "o",      NULL } };
+static pa_dbus_arg_info sample_rate_updated_args[]   = { { "sample_rate",   "u",      NULL } };*/
+static pa_dbus_arg_info volume_updated_args[]        = { { "volume",        "au",     NULL } };
+static pa_dbus_arg_info mute_updated_args[]          = { { "muted",         "b",      NULL } };
+static pa_dbus_arg_info property_list_updated_args[] = { { "property_list", "a{say}", NULL } };
+/*static pa_dbus_arg_info stream_event_args[]          = { { "name",          "s",      NULL }, { "property_list", "a{say}", NULL } };*/
+
+static pa_dbus_signal_info signals[SIGNAL_MAX] = {
+/*    [SIGNAL_DEVICE_UPDATED]        = { .name = "DeviceUpdated",       .arguments = device_updated_args,        .n_arguments = 1 },
+    [SIGNAL_SAMPLE_RATE_UPDATED]   = { .name = "SampleRateUpdated",   .arguments = sample_rate_updated_args,   .n_arguments = 1 },*/
+    [SIGNAL_VOLUME_UPDATED]        = { .name = "VolumeUpdated",       .arguments = volume_updated_args,        .n_arguments = 1 },
+    [SIGNAL_MUTE_UPDATED]          = { .name = "MuteUpdated",         .arguments = mute_updated_args,          .n_arguments = 1 },
+    [SIGNAL_PROPERTY_LIST_UPDATED] = { .name = "PropertyListUpdated", .arguments = property_list_updated_args, .n_arguments = 1 }/*,
+    [SIGNAL_STREAM_EVENT]          = { .name = "StreamEvent",         .arguments = stream_event_args,          .n_arguments = sizeof(stream_event_args) / sizeof(pa_dbus_arg_info) }*/
 };
 
+static pa_dbus_interface_info stream_interface_info = {
+    .name = PA_DBUSIFACE_STREAM_INTERFACE,
+    .method_handlers = /*method_handlers*/ NULL,
+    .n_method_handlers = /*METHOD_HANDLER_MAX*/ 0,
+    .property_handlers = property_handlers,
+    .n_property_handlers = PROPERTY_HANDLER_MAX,
+    .get_all_properties_cb = handle_get_all,
+    .signals = signals,
+    .n_signals = SIGNAL_MAX
+};
+
+static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+    dbus_uint32_t idx;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    idx = (s->type == STREAM_TYPE_PLAYBACK) ? s->sink_input->index : s->source_output->index;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &idx);
+}
+
+static void handle_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+    dbus_uint32_t volume[PA_CHANNELS_MAX];
+    unsigned i = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (s->type == STREAM_TYPE_RECORD) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Record streams don't have volume.");
+        return;
+    }
+
+    for (i = 0; i < s->volume.channels; ++i)
+        volume[i] = s->volume.values[i];
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_UINT32, volume, s->volume.channels);
+}
+
+static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+    unsigned stream_channels = 0;
+    dbus_uint32_t *volume = NULL;
+    unsigned n_volume_entries = 0;
+    pa_cvolume new_vol;
+    unsigned i = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (s->type == STREAM_TYPE_RECORD) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Record streams don't have volume.");
+        return;
+    }
+
+    pa_cvolume_init(&new_vol);
+
+    stream_channels = s->sink_input->channel_map.channels;
+
+    new_vol.channels = stream_channels;
+
+    if (pa_dbus_get_fixed_array_set_property_arg(conn, msg, DBUS_TYPE_UINT32, &volume, &n_volume_entries) < 0)
+        return;
+
+    if (n_volume_entries != stream_channels) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Expected %u volume entries, got %u.", stream_channels, n_volume_entries);
+        return;
+    }
+
+    for (i = 0; i < n_volume_entries; ++i) {
+        if (volume[i] > PA_VOLUME_MAX) {
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too large volume value: %u", volume[i]);
+            return;
+        }
+        new_vol.values[i] = volume[i];
+    }
+
+    pa_sink_input_set_volume(s->sink_input, &new_vol, TRUE, TRUE);
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+static void handle_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (s->type == STREAM_TYPE_RECORD) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Record streams don't have mute.");
+        return;
+    }
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &s->is_muted);
+}
+
+static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+    dbus_bool_t is_muted = FALSE;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_BOOLEAN, &is_muted) < 0)
+        return;
+
+    if (s->type == STREAM_TYPE_RECORD) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Record streams don't have mute.");
+        return;
+    }
+
+    pa_sink_input_set_mute(s->sink_input, is_muted, TRUE);
+
+    pa_dbus_send_empty_reply(conn, msg);
+};
+
+static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    pa_dbus_send_proplist_variant_reply(conn, msg, s->proplist);
+}
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+    dbus_uint32_t idx;
+    dbus_uint32_t volume[PA_CHANNELS_MAX];
+    unsigned i = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    idx = (s->type == STREAM_TYPE_PLAYBACK) ? s->sink_input->index : s->source_output->index;
+    if (s->type == STREAM_TYPE_PLAYBACK) {
+        for (i = 0; i < s->volume.channels; ++i)
+            volume[i] = s->volume.values[i];
+    }
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &idx);
+
+    if (s->type == STREAM_TYPE_PLAYBACK) {
+        pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_VOLUME].property_name, DBUS_TYPE_UINT32, volume, s->volume.channels);
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_IS_MUTED].property_name, DBUS_TYPE_BOOLEAN, &s->is_muted);
+    }
+
+    pa_dbus_append_proplist_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PROPERTY_LIST].property_name, s->proplist);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+    dbus_message_unref(reply);
+}
+
+static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+
+    pa_assert(c);
+    pa_assert(s);
+
+    if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_CHANGE) {
+        DBusMessage *signal = NULL;
+        pa_proplist *new_proplist = NULL;
+        unsigned i = 0;
+
+        pa_assert(((s->type == STREAM_TYPE_PLAYBACK)
+                    && ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SINK_INPUT))
+                  || ((s->type == STREAM_TYPE_RECORD)
+                       && ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT)));
+
+        if (s->type == STREAM_TYPE_PLAYBACK) {
+            pa_cvolume new_volume;
+            pa_bool_t new_muted = FALSE;
+
+            pa_sink_input_get_volume(s->sink_input, &new_volume, TRUE);
+
+            if (!pa_cvolume_equal(&s->volume, &new_volume)) {
+                dbus_uint32_t volume[PA_CHANNELS_MAX];
+                dbus_uint32_t *volume_ptr = volume;
+
+                s->volume = new_volume;
+
+                for (i = 0; i < s->volume.channels; ++i)
+                    volume[i] = s->volume.values[i];
+
+                pa_assert_se(signal = dbus_message_new_signal(s->path,
+                                                              PA_DBUSIFACE_STREAM_INTERFACE,
+                                                              signals[SIGNAL_VOLUME_UPDATED].name));
+                pa_assert_se(dbus_message_append_args(signal,
+                                                      DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &volume_ptr, s->volume.channels,
+                                                      DBUS_TYPE_INVALID));
+
+                pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
+                dbus_message_unref(signal);
+                signal = NULL;
+            }
+
+            new_muted = pa_sink_input_get_mute(s->sink_input);
+
+            if (s->is_muted != new_muted) {
+                s->is_muted = new_muted;
+
+                pa_assert_se(signal = dbus_message_new_signal(s->path,
+                                                              PA_DBUSIFACE_STREAM_INTERFACE,
+                                                              signals[SIGNAL_MUTE_UPDATED].name));
+                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_BOOLEAN, &s->is_muted, DBUS_TYPE_INVALID));
+
+                pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
+                dbus_message_unref(signal);
+                signal = NULL;
+            }
+        }
+
+        new_proplist = (s->type == STREAM_TYPE_PLAYBACK) ? s->sink_input->proplist : s->source_output->proplist;
+
+        if (!pa_proplist_equal(s->proplist, new_proplist)) {
+            DBusMessageIter msg_iter;
+
+            pa_proplist_update(s->proplist, PA_UPDATE_SET, new_proplist);
+
+            pa_assert_se(signal = dbus_message_new_signal(s->path,
+                                                          PA_DBUSIFACE_STREAM_INTERFACE,
+                                                          signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+            dbus_message_iter_init_append(signal, &msg_iter);
+            pa_dbus_append_proplist(&msg_iter, s->proplist);
+
+            pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
+            dbus_message_unref(signal);
+            signal = NULL;
+        }
+    }
+}
+
 pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_dbusiface_core *core, pa_sink_input *sink_input) {
     pa_dbusiface_stream *s;
 
@@ -55,6 +418,13 @@ pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_dbusiface_core *core, p
     s->sink_input = pa_sink_input_ref(sink_input);
     s->type = STREAM_TYPE_PLAYBACK;
     s->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, PLAYBACK_OBJECT_NAME, sink_input->index);
+    pa_sink_input_get_volume(sink_input, &s->volume, TRUE);
+    s->is_muted = pa_sink_input_get_mute(sink_input);
+    s->proplist = pa_proplist_copy(sink_input->proplist);
+    s->dbus_protocol = pa_dbus_protocol_get(sink_input->core);
+    s->subscription = pa_subscription_new(sink_input->core, PA_SUBSCRIPTION_MASK_SINK_INPUT, subscription_cb, s);
+
+    pa_assert_se(pa_dbus_protocol_add_interface(s->dbus_protocol, s->path, &stream_interface_info, s) >= 0);
 
     return s;
 }
@@ -69,6 +439,13 @@ pa_dbusiface_stream *pa_dbusiface_stream_new_record(pa_dbusiface_core *core, pa_
     s->source_output = pa_source_output_ref(source_output);
     s->type = STREAM_TYPE_RECORD;
     s->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, RECORD_OBJECT_NAME, source_output->index);
+    pa_cvolume_init(&s->volume);
+    s->is_muted = FALSE;
+    s->proplist = pa_proplist_copy(source_output->proplist);
+    s->dbus_protocol = pa_dbus_protocol_get(source_output->core);
+    s->subscription = pa_subscription_new(source_output->core, PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT, subscription_cb, s);
+
+    pa_assert_se(pa_dbus_protocol_add_interface(s->dbus_protocol, s->path, &stream_interface_info, s) >= 0);
 
     return s;
 }
@@ -76,11 +453,17 @@ pa_dbusiface_stream *pa_dbusiface_stream_new_record(pa_dbusiface_core *core, pa_
 void pa_dbusiface_stream_free(pa_dbusiface_stream *s) {
     pa_assert(s);
 
+    pa_assert_se(pa_dbus_protocol_remove_interface(s->dbus_protocol, s->path, stream_interface_info.name) >= 0);
+
     if (s->type == STREAM_TYPE_PLAYBACK)
         pa_sink_input_unref(s->sink_input);
     else
         pa_source_output_unref(s->source_output);
 
+    pa_proplist_free(s->proplist);
+    pa_dbus_protocol_unref(s->dbus_protocol);
+    pa_subscription_free(s->subscription);
+
     pa_xfree(s->path);
     pa_xfree(s);
 }
diff --git a/src/modules/dbus/iface-stream.h b/src/modules/dbus/iface-stream.h
index b1b1854..036b4e7 100644
--- a/src/modules/dbus/iface-stream.h
+++ b/src/modules/dbus/iface-stream.h
@@ -28,11 +28,14 @@
  * documentation.
  */
 
+#include <pulsecore/protocol-dbus.h>
 #include <pulsecore/sink-input.h>
 #include <pulsecore/source-output.h>
 
 #include "iface-core.h"
 
+#define PA_DBUSIFACE_STREAM_INTERFACE PA_DBUS_CORE_INTERFACE ".Stream"
+
 typedef struct pa_dbusiface_stream pa_dbusiface_stream;
 
 pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_dbusiface_core *core, pa_sink_input *sink_input);

commit bcaba0b1b43d6a1b32aadfa98860f40b2c93e136
Merge: 2bb3eef 01e4b61
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 16 21:25:48 2009 +0300

    Merge branch 'master' of git://0pointer.de/pulseaudio into dbus-work
    
    Conflicts:
    	src/Makefile.am
    	src/daemon/daemon-conf.c
    	src/daemon/daemon.conf.in
    	src/modules/module-stream-restore.c
    	src/pulse/client-conf.c
    	src/pulsecore/namereg.c

diff --cc po/es.po
index 8af1c73,b36d693..6995716
--- a/po/es.po
+++ b/po/es.po
@@@ -2600,9 -2408,8 +2408,7 @@@ msgstr "Servidor de Sonido PulseAudio
  #~ "Tipo: %s\n"
  #~ "Módulo: %s\n"
  #~ "Argumento: %s\n"
- 
  #~ msgid "sink"
  #~ msgstr "destino"
- 
  #~ msgid "source"
  #~ msgstr "fuente"
 -
diff --cc po/pt_BR.po
index fd4f539,20365ee..323e5b9
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@@ -2497,6 -2370,6 +2370,5 @@@ msgstr "Servidor de som PulseAudio
  #~ msgstr ""
  #~ "', ou eleve o RLIMIT_NICE/RLIMIT_RTPRIO dos limites do recurso para este "
  #~ "usuário."
- 
  #~ msgid "socketpair(): %s"
  #~ msgstr "socketpair(): %s"
 -
diff --cc src/daemon/daemon-conf.c
index ace460e,9a87b55..31f2900
--- a/src/daemon/daemon-conf.c
+++ b/src/daemon/daemon-conf.c
@@@ -476,14 -441,15 +476,18 @@@ int pa_daemon_conf_load(pa_daemon_conf 
          { "high-priority",              pa_config_parse_bool,     &c->high_priority, NULL },
          { "realtime-scheduling",        pa_config_parse_bool,     &c->realtime_scheduling, NULL },
          { "disallow-module-loading",    pa_config_parse_bool,     &c->disallow_module_loading, NULL },
+         { "allow-module-loading",       pa_config_parse_not_bool, &c->disallow_module_loading, NULL },
          { "disallow-exit",              pa_config_parse_bool,     &c->disallow_exit, NULL },
+         { "allow-exit",                 pa_config_parse_not_bool, &c->disallow_exit, NULL },
          { "use-pid-file",               pa_config_parse_bool,     &c->use_pid_file, NULL },
          { "system-instance",            pa_config_parse_bool,     &c->system_instance, NULL },
 +#ifdef HAVE_DBUS
 +        { "local-server-type",          parse_server_type,        c, NULL },
 +#endif
          { "no-cpu-limit",               pa_config_parse_bool,     &c->no_cpu_limit, NULL },
+         { "cpu-limit",                  pa_config_parse_not_bool, &c->no_cpu_limit, NULL },
          { "disable-shm",                pa_config_parse_bool,     &c->disable_shm, NULL },
+         { "enable-shm",                 pa_config_parse_not_bool, &c->disable_shm, NULL },
          { "flat-volumes",               pa_config_parse_bool,     &c->flat_volumes, NULL },
          { "lock-memory",                pa_config_parse_bool,     &c->lock_memory, NULL },
          { "exit-idle-time",             pa_config_parse_int,      &c->exit_idle_time, NULL },
@@@ -669,15 -629,12 +675,15 @@@ char *pa_daemon_conf_dump(pa_daemon_con
      pa_strbuf_printf(s, "nice-level = %i\n", c->nice_level);
      pa_strbuf_printf(s, "realtime-scheduling = %s\n", pa_yes_no(c->realtime_scheduling));
      pa_strbuf_printf(s, "realtime-priority = %i\n", c->realtime_priority);
-     pa_strbuf_printf(s, "disallow-module-loading = %s\n", pa_yes_no(c->disallow_module_loading));
-     pa_strbuf_printf(s, "disallow-exit = %s\n", pa_yes_no(c->disallow_exit));
+     pa_strbuf_printf(s, "allow-module-loading = %s\n", pa_yes_no(!c->disallow_module_loading));
+     pa_strbuf_printf(s, "allow-exit = %s\n", pa_yes_no(!c->disallow_exit));
      pa_strbuf_printf(s, "use-pid-file = %s\n", pa_yes_no(c->use_pid_file));
      pa_strbuf_printf(s, "system-instance = %s\n", pa_yes_no(c->system_instance));
 +#ifdef HAVE_DBUS
 +    pa_strbuf_printf(s, "local-server-type = %s\n", server_type_to_string[c->local_server_type]);
 +#endif
-     pa_strbuf_printf(s, "no-cpu-limit = %s\n", pa_yes_no(c->no_cpu_limit));
-     pa_strbuf_printf(s, "disable-shm = %s\n", pa_yes_no(c->disable_shm));
+     pa_strbuf_printf(s, "cpu-limit = %s\n", pa_yes_no(!c->no_cpu_limit));
+     pa_strbuf_printf(s, "enable-shm = %s\n", pa_yes_no(!c->disable_shm));
      pa_strbuf_printf(s, "flat-volumes = %s\n", pa_yes_no(c->flat_volumes));
      pa_strbuf_printf(s, "lock-memory = %s\n", pa_yes_no(c->lock_memory));
      pa_strbuf_printf(s, "exit-idle-time = %i\n", c->exit_idle_time);
diff --cc src/daemon/daemon.conf.in
index 9bea614,d8b58d8..a11fd06
--- a/src/daemon/daemon.conf.in
+++ b/src/daemon/daemon.conf.in
@@@ -21,15 -21,14 +21,15 @@@
  
  ; daemonize = no
  ; fail = yes
- ; disallow-module-loading = no
- ; disallow-exit = no
+ ; allow-module-loading = yes
+ ; allow-exit = yes
  ; use-pid-file = yes
  ; system-instance = no
 +; local-server-type = user
- ; disable-shm = no
+ ; enable-shm = yes
  ; shm-size-bytes = 0 # setting this 0 will use the system-default, usually 64 MiB
  ; lock-memory = no
- ; no-cpu-limit = no
+ ; cpu-limit = yes
  
  ; high-priority = yes
  ; nice-level = -11
diff --cc src/modules/module-stream-restore.c
index e906303,e560bd2..076b391
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@@ -106,15 -100,9 +106,15 @@@ struct userdata 
  
      pa_native_protocol *protocol;
      pa_idxset *subscribed;
 +
 +#ifdef HAVE_DBUS
 +    pa_dbus_protocol *dbus_protocol;
 +    pa_hashmap *dbus_entries;
 +    uint32_t next_index; /* For generating object paths for entries. */
 +#endif
  };
  
- #define ENTRY_VERSION 2
+ #define ENTRY_VERSION 3
  
  struct entry {
      uint8_t version;
@@@ -1216,7 -324,10 +1231,11 @@@ static void subscribe_callback(pa_core 
              pa_strlcpy(entry.device, sink_input->sink->name, sizeof(entry.device));
              entry.device_valid = TRUE;
  
 +            device_updated = !created_new_entry && (!old->device_valid || !pa_streq(entry.device, old->device));
+             if (sink_input->sink->card) {
+                 pa_strlcpy(entry.card, sink_input->sink->card->name, sizeof(entry.card));
+                 entry.card_valid = TRUE;
+             }
          }
  
      } else {
@@@ -1239,7 -348,10 +1258,12 @@@
              pa_strlcpy(entry.device, source_output->source->name, sizeof(entry.device));
              entry.device_valid = source_output->save_source;
  
 +            device_updated = !created_new_entry && (!old->device_valid || !pa_streq(entry.device, old->device));
++
+             if (source_output->source->card) {
+                 pa_strlcpy(entry.card, source_output->source->card->name, sizeof(entry.card));
+                 entry.card_valid = TRUE;
+             }
          }
      }
  
diff --cc src/pulse/client-conf.c
index 8eab109,4aa4ba1..62c06f6
--- a/src/pulse/client-conf.c
+++ b/src/pulse/client-conf.c
@@@ -94,17 -92,17 +94,18 @@@ int pa_client_conf_load(pa_client_conf 
  
      /* Prepare the configuration parse table */
      pa_config_item table[] = {
-         { "daemon-binary",          pa_config_parse_string,  &c->daemon_binary, NULL },
-         { "extra-arguments",        pa_config_parse_string,  &c->extra_arguments, NULL },
-         { "default-sink",           pa_config_parse_string,  &c->default_sink, NULL },
-         { "default-source",         pa_config_parse_string,  &c->default_source, NULL },
-         { "default-server",         pa_config_parse_string,  &c->default_server, NULL },
-         { "default-dbus-server",    pa_config_parse_string,  &c->default_dbus_server, NULL },
-         { "autospawn",              pa_config_parse_bool,    &c->autospawn, NULL },
-         { "cookie-file",            pa_config_parse_string,  &c->cookie_file, NULL },
-         { "disable-shm",            pa_config_parse_bool,    &c->disable_shm, NULL },
-         { "shm-size-bytes",         pa_config_parse_size,    &c->shm_size, NULL },
-         { NULL,                     NULL,                    NULL, NULL },
+         { "daemon-binary",          pa_config_parse_string,   &c->daemon_binary, NULL },
+         { "extra-arguments",        pa_config_parse_string,   &c->extra_arguments, NULL },
+         { "default-sink",           pa_config_parse_string,   &c->default_sink, NULL },
+         { "default-source",         pa_config_parse_string,   &c->default_source, NULL },
+         { "default-server",         pa_config_parse_string,   &c->default_server, NULL },
++        { "default-dbus-server",    pa_config_parse_string,   &c->default_dbus_server, NULL },
+         { "autospawn",              pa_config_parse_bool,     &c->autospawn, NULL },
+         { "cookie-file",            pa_config_parse_string,   &c->cookie_file, NULL },
+         { "disable-shm",            pa_config_parse_bool,     &c->disable_shm, NULL },
+         { "enable-shm",             pa_config_parse_not_bool, &c->disable_shm, NULL },
+         { "shm-size-bytes",         pa_config_parse_size,     &c->shm_size, NULL },
+         { NULL,                     NULL,                     NULL, NULL },
      };
  
      if (filename) {
diff --cc src/pulsecore/dbus-util.c
index 903acad,4e6148f..b45e6a6
--- a/src/pulsecore/dbus-util.c
+++ b/src/pulsecore/dbus-util.c
@@@ -445,475 -422,3 +445,475 @@@ void pa_dbus_free_pending_list(pa_dbus_
          pa_dbus_pending_free(i);
      }
  }
 +
 +void pa_dbus_send_error(DBusConnection *c, DBusMessage *in_reply_to, const char *name, const char *format, ...) {
 +    va_list ap;
 +    char *message;
 +    DBusMessage *reply = NULL;
 +
 +    pa_assert(c);
 +    pa_assert(in_reply_to);
 +    pa_assert(name);
 +    pa_assert(format);
 +
 +    va_start(ap, format);
 +    message = pa_vsprintf_malloc(format, ap);
 +    va_end(ap);
 +    pa_assert_se((reply = dbus_message_new_error(in_reply_to, name, message)));
 +    pa_assert_se(dbus_connection_send(c, reply, NULL));
 +
 +    dbus_message_unref(reply);
 +
 +    pa_xfree(message);
 +}
 +
 +void pa_dbus_send_empty_reply(DBusConnection *c, DBusMessage *in_reply_to) {
 +    DBusMessage *reply = NULL;
 +
 +    pa_assert(c);
 +    pa_assert(in_reply_to);
 +
 +    pa_assert_se((reply = dbus_message_new_method_return(in_reply_to)));
 +    pa_assert_se(dbus_connection_send(c, reply, NULL));
 +    dbus_message_unref(reply);
 +}
 +
 +void pa_dbus_send_basic_value_reply(DBusConnection *c, DBusMessage *in_reply_to, int type, void *data) {
 +    DBusMessage *reply = NULL;
 +
 +    pa_assert(c);
 +    pa_assert(in_reply_to);
 +    pa_assert(dbus_type_is_basic(type));
 +    pa_assert(data);
 +
 +    pa_assert_se((reply = dbus_message_new_method_return(in_reply_to)));
 +    pa_assert_se(dbus_message_append_args(reply, type, data, DBUS_TYPE_INVALID));
 +    pa_assert_se(dbus_connection_send(c, reply, NULL));
 +    dbus_message_unref(reply);
 +}
 +
 +static const char *signature_from_basic_type(int type) {
 +    switch (type) {
 +        case DBUS_TYPE_BOOLEAN: return DBUS_TYPE_BOOLEAN_AS_STRING;
 +        case DBUS_TYPE_BYTE: return DBUS_TYPE_BYTE_AS_STRING;
 +        case DBUS_TYPE_INT16: return DBUS_TYPE_INT16_AS_STRING;
 +        case DBUS_TYPE_UINT16: return DBUS_TYPE_UINT16_AS_STRING;
 +        case DBUS_TYPE_INT32: return DBUS_TYPE_INT32_AS_STRING;
 +        case DBUS_TYPE_UINT32: return DBUS_TYPE_UINT32_AS_STRING;
 +        case DBUS_TYPE_INT64: return DBUS_TYPE_INT64_AS_STRING;
 +        case DBUS_TYPE_UINT64: return DBUS_TYPE_UINT64_AS_STRING;
 +        case DBUS_TYPE_DOUBLE: return DBUS_TYPE_DOUBLE_AS_STRING;
 +        case DBUS_TYPE_STRING: return DBUS_TYPE_STRING_AS_STRING;
 +        case DBUS_TYPE_OBJECT_PATH: return DBUS_TYPE_OBJECT_PATH_AS_STRING;
 +        case DBUS_TYPE_SIGNATURE: return DBUS_TYPE_SIGNATURE_AS_STRING;
 +        default: pa_assert_not_reached();
 +    }
 +}
 +
 +void pa_dbus_send_basic_variant_reply(DBusConnection *c, DBusMessage *in_reply_to, int type, void *data) {
 +    DBusMessage *reply = NULL;
 +    DBusMessageIter msg_iter;
 +    DBusMessageIter variant_iter;
 +
 +    pa_assert(c);
 +    pa_assert(in_reply_to);
 +    pa_assert(dbus_type_is_basic(type));
 +    pa_assert(data);
 +
 +    pa_assert_se((reply = dbus_message_new_method_return(in_reply_to)));
 +    dbus_message_iter_init_append(reply, &msg_iter);
 +    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_VARIANT, signature_from_basic_type(type), &variant_iter));
 +    pa_assert_se(dbus_message_iter_append_basic(&variant_iter, type, data));
 +    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &variant_iter));
 +    pa_assert_se(dbus_connection_send(c, reply, NULL));
 +    dbus_message_unref(reply);
 +}
 +
 +/* Note: returns sizeof(char*) for strings, object paths and signatures. */
 +static unsigned basic_type_size(int type) {
 +    switch (type) {
 +        case DBUS_TYPE_BOOLEAN: return sizeof(dbus_bool_t);
 +        case DBUS_TYPE_BYTE: return 1;
 +        case DBUS_TYPE_INT16: return sizeof(dbus_int16_t);
 +        case DBUS_TYPE_UINT16: return sizeof(dbus_uint16_t);
 +        case DBUS_TYPE_INT32: return sizeof(dbus_int32_t);
 +        case DBUS_TYPE_UINT32: return sizeof(dbus_uint32_t);
 +        case DBUS_TYPE_INT64: return sizeof(dbus_int64_t);
 +        case DBUS_TYPE_UINT64: return sizeof(dbus_uint64_t);
 +        case DBUS_TYPE_DOUBLE: return sizeof(double);
 +        case DBUS_TYPE_STRING:
 +        case DBUS_TYPE_OBJECT_PATH:
 +        case DBUS_TYPE_SIGNATURE: return sizeof(char*);
 +        default: pa_assert_not_reached();
 +    }
 +}
 +
 +void pa_dbus_send_basic_array_variant_reply(DBusConnection *c, DBusMessage *in_reply_to, int item_type, void *array, unsigned n) {
 +    DBusMessage *reply = NULL;
 +    DBusMessageIter msg_iter;
 +
 +    pa_assert(c);
 +    pa_assert(in_reply_to);
 +    pa_assert(dbus_type_is_basic(item_type));
 +    pa_assert(array || n == 0);
 +
 +    pa_assert_se((reply = dbus_message_new_method_return(in_reply_to)));
 +    dbus_message_iter_init_append(reply, &msg_iter);
 +    pa_dbus_append_basic_array_variant(&msg_iter, item_type, array, n);
 +    pa_assert_se(dbus_connection_send(c, reply, NULL));
 +    dbus_message_unref(reply);
 +}
 +
 +void pa_dbus_send_proplist_variant_reply(DBusConnection *c, DBusMessage *in_reply_to, pa_proplist *proplist) {
 +    DBusMessage *reply = NULL;
 +    DBusMessageIter msg_iter;
 +
 +    pa_assert(c);
 +    pa_assert(in_reply_to);
 +    pa_assert(proplist);
 +
 +    pa_assert_se((reply = dbus_message_new_method_return(in_reply_to)));
 +    dbus_message_iter_init_append(reply, &msg_iter);
 +    pa_dbus_append_proplist_variant(&msg_iter, proplist);
 +    pa_assert_se(dbus_connection_send(c, reply, NULL));
 +    dbus_message_unref(reply);
 +}
 +
 +void pa_dbus_append_basic_array(DBusMessageIter *iter, int item_type, const void *array, unsigned n) {
 +    DBusMessageIter array_iter;
 +    unsigned i;
 +    unsigned item_size;
 +
 +    pa_assert(iter);
 +    pa_assert(dbus_type_is_basic(item_type));
 +    pa_assert(array || n == 0);
 +
 +    item_size = basic_type_size(item_type);
 +
 +    pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, signature_from_basic_type(item_type), &array_iter));
 +
 +    for (i = 0; i < n; ++i)
 +        pa_assert_se(dbus_message_iter_append_basic(&array_iter, item_type, &((uint8_t*) array)[i * item_size]));
 +
 +    pa_assert_se(dbus_message_iter_close_container(iter, &array_iter));
 +};
 +
 +void pa_dbus_append_basic_variant(DBusMessageIter *iter, int type, void *data) {
 +    DBusMessageIter variant_iter;
 +
 +    pa_assert(iter);
 +    pa_assert(dbus_type_is_basic(type));
 +    pa_assert(data);
 +
 +    pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, signature_from_basic_type(type), &variant_iter));
 +    pa_assert_se(dbus_message_iter_append_basic(&variant_iter, type, data));
 +    pa_assert_se(dbus_message_iter_close_container(iter, &variant_iter));
 +}
 +
 +void pa_dbus_append_basic_array_variant(DBusMessageIter *iter, int item_type, const void *array, unsigned n) {
 +    DBusMessageIter variant_iter;
 +    char *array_signature;
 +
 +    pa_assert(iter);
 +    pa_assert(dbus_type_is_basic(item_type));
 +    pa_assert(array || n == 0);
 +
 +    array_signature = pa_sprintf_malloc("a%c", *signature_from_basic_type(item_type));
 +
 +    pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, array_signature, &variant_iter));
 +    pa_dbus_append_basic_array(&variant_iter, item_type, array, n);
 +    pa_assert_se(dbus_message_iter_close_container(iter, &variant_iter));
 +
 +    pa_xfree(array_signature);
 +}
 +
 +void pa_dbus_append_basic_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, int type, void *data) {
 +    DBusMessageIter dict_entry_iter;
 +
 +    pa_assert(dict_iter);
 +    pa_assert(key);
 +    pa_assert(dbus_type_is_basic(type));
 +    pa_assert(data);
 +
 +    pa_assert_se(dbus_message_iter_open_container(dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter));
 +    pa_assert_se(dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &key));
 +    pa_dbus_append_basic_variant(&dict_entry_iter, type, data);
 +    pa_assert_se(dbus_message_iter_close_container(dict_iter, &dict_entry_iter));
 +}
 +
 +void pa_dbus_append_basic_array_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, int item_type, const void *array, unsigned n) {
 +    DBusMessageIter dict_entry_iter;
 +
 +    pa_assert(dict_iter);
 +    pa_assert(key);
 +    pa_assert(dbus_type_is_basic(item_type));
 +    pa_assert(array || n == 0);
 +
 +    pa_assert_se(dbus_message_iter_open_container(dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter));
 +    pa_assert_se(dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &key));
 +    pa_dbus_append_basic_array_variant(&dict_entry_iter, item_type, array, n);
 +    pa_assert_se(dbus_message_iter_close_container(dict_iter, &dict_entry_iter));
 +}
 +
 +void pa_dbus_append_proplist(DBusMessageIter *iter, pa_proplist *proplist) {
 +    DBusMessageIter dict_iter;
 +    DBusMessageIter dict_entry_iter;
 +    DBusMessageIter array_iter;
 +    void *state = NULL;
 +    const char *key;
 +
 +    pa_assert(iter);
 +    pa_assert(proplist);
 +
 +    pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY, "{say}", &dict_iter));
 +
-     while ((key = pa_proplist_iterate(proplist, state))) {
++    while ((key = pa_proplist_iterate(proplist, &state))) {
 +        const void *value = NULL;
 +        size_t nbytes;
 +
 +        pa_assert_se(pa_proplist_get(proplist, key, &value, &nbytes) >= 0);
 +
 +        pa_assert_se(dbus_message_iter_open_container(&dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter));
 +
 +        pa_assert_se(dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &key));
 +
 +        pa_assert_se(dbus_message_iter_open_container(&dict_entry_iter, DBUS_TYPE_ARRAY, "y", &array_iter));
 +        pa_assert_se(dbus_message_iter_append_fixed_array(&array_iter, DBUS_TYPE_BYTE, &value, nbytes));
 +        pa_assert_se(dbus_message_iter_close_container(&dict_entry_iter, &array_iter));
 +
 +        pa_assert_se(dbus_message_iter_close_container(&dict_iter, &dict_entry_iter));
 +    }
 +
 +    pa_assert_se(dbus_message_iter_close_container(iter, &dict_iter));
 +}
 +
 +void pa_dbus_append_proplist_variant(DBusMessageIter *iter, pa_proplist *proplist) {
 +    DBusMessageIter variant_iter;
 +
 +    pa_assert(iter);
 +    pa_assert(proplist);
 +
 +    pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{say}", &variant_iter));
 +    pa_dbus_append_proplist(&variant_iter, proplist);
 +    pa_assert_se(dbus_message_iter_close_container(iter, &variant_iter));
 +}
 +
 +void pa_dbus_append_proplist_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, pa_proplist *proplist) {
 +    DBusMessageIter dict_entry_iter;
 +
 +    pa_assert(dict_iter);
 +    pa_assert(key);
 +    pa_assert(proplist);
 +
 +    pa_assert_se(dbus_message_iter_open_container(dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter));
 +    pa_assert_se(dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &key));
 +    pa_dbus_append_proplist_variant(&dict_entry_iter, proplist);
 +    pa_assert_se(dbus_message_iter_close_container(dict_iter, &dict_entry_iter));
 +}
 +
 +int pa_dbus_get_basic_set_property_arg(DBusConnection *c, DBusMessage *msg, int type, void *data) {
 +    DBusMessageIter msg_iter;
 +    DBusMessageIter variant_iter;
 +
 +    pa_assert(c);
 +    pa_assert(msg);
 +    pa_assert(dbus_type_is_basic(type));
 +    pa_assert(data);
 +
 +    /* Skip the interface and property name arguments. */
 +    if (!dbus_message_iter_init(msg, &msg_iter) || !dbus_message_iter_next(&msg_iter) || !dbus_message_iter_next(&msg_iter)) {
 +        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
 +        return -1;
 +    }
 +
 +    if (dbus_message_iter_get_arg_type(&msg_iter) != DBUS_TYPE_VARIANT) {
 +        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Message argument isn't a variant.");
 +        return -1;
 +    }
 +
 +    dbus_message_iter_recurse(&msg_iter, &variant_iter);
 +
 +    if (pa_dbus_get_basic_arg(c, msg, &variant_iter, type, data) < 0)
 +        return -1;
 +
 +    return 0;
 +}
 +
 +int pa_dbus_get_fixed_array_set_property_arg(DBusConnection *c, DBusMessage *msg, int item_type, void *data, unsigned *n) {
 +    DBusMessageIter msg_iter;
 +    DBusMessageIter variant_iter;
 +
 +    pa_assert(c);
 +    pa_assert(msg);
 +    pa_assert(dbus_type_is_fixed(item_type));
 +    pa_assert(data);
 +    pa_assert(n);
 +
 +    /* Skip the interface and property name arguments. */
 +    if (!dbus_message_iter_init(msg, &msg_iter) || !dbus_message_iter_next(&msg_iter) || !dbus_message_iter_next(&msg_iter)) {
 +        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
 +        return -1;
 +    }
 +
 +    if (dbus_message_iter_get_arg_type(&msg_iter) != DBUS_TYPE_VARIANT) {
 +        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Message argument isn't a variant.");
 +        return -1;
 +    }
 +
 +    dbus_message_iter_recurse(&msg_iter, &variant_iter);
 +
 +    if (pa_dbus_get_fixed_array_arg(c, msg, &variant_iter, item_type, data, n) < 0)
 +        return -1;
 +
 +    return 0;
 +}
 +
 +int pa_dbus_get_basic_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter, int type, void *data) {
 +    int arg_type;
 +
 +    pa_assert(c);
 +    pa_assert(msg);
 +    pa_assert(iter);
 +    pa_assert(dbus_type_is_basic(type));
 +    pa_assert(data);
 +
 +    arg_type = dbus_message_iter_get_arg_type(iter);
 +    if (arg_type != type) {
 +        if (arg_type == DBUS_TYPE_INVALID)
 +            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments. D-Bus type '%c' expected.", (char) type);
 +        else
 +            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type: '%c'. Expected type '%c'.", (char) arg_type, (char) type);
 +        return -1;
 +    }
 +
 +    dbus_message_iter_get_basic(iter, data);
 +
 +    dbus_message_iter_next(iter);
 +
 +    return 0;
 +}
 +
 +int pa_dbus_get_fixed_array_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter, int item_type, void *array, unsigned *n) {
 +    DBusMessageIter array_iter;
 +    int signed_n;
 +    int arg_type;
 +    int element_type;
 +
 +    pa_assert(c);
 +    pa_assert(msg);
 +    pa_assert(iter);
 +    pa_assert(dbus_type_is_fixed(item_type));
 +    pa_assert(array);
 +    pa_assert(n);
 +
 +    arg_type = dbus_message_iter_get_arg_type(iter);
 +    if (arg_type != DBUS_TYPE_ARRAY) {
 +        if (arg_type == DBUS_TYPE_INVALID)
 +            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments. An array of type '%c' was expected.", (char) item_type);
 +        else
 +            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type: '%c'. An array of type '%c' was expected.", (char) arg_type, (char) item_type);
 +        return -1;
 +    }
 +
 +    element_type = dbus_message_iter_get_element_type(iter);
 +    if (element_type != item_type) {
 +        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong array element type: '%c'. Element type '%c' was expected.", (char) element_type, (char) item_type);
 +        return -1;
 +    }
 +
 +    dbus_message_iter_recurse(iter, &array_iter);
 +
 +    dbus_message_iter_get_fixed_array(&array_iter, array, &signed_n);
 +
 +    dbus_message_iter_next(iter);
 +
 +    pa_assert(signed_n >= 0);
 +
 +    *n = signed_n;
 +
 +    return 0;
 +}
 +
 +pa_proplist *pa_dbus_get_proplist_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter) {
 +    DBusMessageIter dict_iter;
 +    DBusMessageIter dict_entry_iter;
 +    int arg_type;
 +    pa_proplist *proplist = NULL;
 +    const char *key;
 +    const uint8_t *value;
 +    int value_length;
 +
 +    pa_assert(c);
 +    pa_assert(msg);
 +    pa_assert(iter);
 +
 +    arg_type = dbus_message_iter_get_arg_type(iter);
 +    if (arg_type != DBUS_TYPE_ARRAY) {
 +        if (arg_type == DBUS_TYPE_INVALID)
 +            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments. An array was expected.");
 +        else
 +            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type: '%c'. An array was expected.", (char) arg_type);
 +        return NULL;
 +    }
 +
 +    arg_type = dbus_message_iter_get_element_type(iter);
 +    if (arg_type != DBUS_TYPE_DICT_ENTRY) {
 +        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong array element type: '%c'. A dictionary entry was expected.", (char) arg_type);
 +        return NULL;
 +    }
 +
 +    proplist = pa_proplist_new();
 +
 +    dbus_message_iter_recurse(iter, &dict_iter);
 +
 +    while (dbus_message_iter_get_arg_type(&dict_iter) != DBUS_TYPE_INVALID) {
 +        dbus_message_iter_recurse(&dict_iter, &dict_entry_iter);
 +
 +        arg_type = dbus_message_iter_get_arg_type(&dict_entry_iter);
 +        if (arg_type != DBUS_TYPE_STRING) {
 +            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict key type: '%c'. A string was expected.", (char) arg_type);
 +            goto fail;
 +        }
 +
 +        dbus_message_iter_get_basic(&dict_entry_iter, &key);
 +        dbus_message_iter_next(&dict_entry_iter);
 +
 +        if (strlen(key) <= 0 || !pa_ascii_valid(key)) {
 +            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Invalid property list key.");
 +            goto fail;
 +        }
 +
 +        arg_type = dbus_message_iter_get_arg_type(&dict_entry_iter);
 +        if (arg_type != DBUS_TYPE_ARRAY) {
 +            if (arg_type == DBUS_TYPE_INVALID)
 +                pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Dict value missing.");
 +            else
 +                pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict value type: '%c'. An array was expected.", (char) arg_type);
 +            goto fail;
 +        }
 +
 +        arg_type = dbus_message_iter_get_element_type(&dict_entry_iter);
 +        if (arg_type != DBUS_TYPE_BYTE) {
 +            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict value item type: '%c'. A byte was expected.", (char) arg_type);
 +            goto fail;
 +        }
 +
 +        dbus_message_iter_get_fixed_array(&dict_entry_iter, &value, &value_length);
 +
 +        pa_assert(value_length >= 0);
 +
 +        pa_assert_se(pa_proplist_set(proplist, key, value, value_length) >= 0);
 +
 +        dbus_message_iter_next(&dict_iter);
 +    }
 +
 +    dbus_message_iter_next(iter);
 +
 +    return proplist;
 +
 +fail:
 +    if (proplist)
 +        pa_proplist_free(proplist);
 +
 +    return NULL;
 +}
diff --cc src/pulsecore/namereg.c
index 046c87b,e26923d..d7d83c5
--- a/src/pulsecore/namereg.c
+++ b/src/pulsecore/namereg.c
@@@ -166,31 -160,10 +166,38 @@@ void pa_namereg_unregister(pa_core *c, 
  
      pa_assert_se(e = pa_hashmap_remove(c->namereg, name));
  
 -    if (c->default_sink == e->data)
 -        pa_namereg_set_default_sink(c, NULL);
 -    else if (c->default_source == e->data)
 -        pa_namereg_set_default_source(c, NULL);
 +    if (c->default_sink == e->data) {
-         pa_sink *new_default = pa_idxset_first(c->sinks, &idx);
++        pa_sink *new_default = NULL;
 +
-         if (new_default == e->data)
-             new_default = pa_idxset_next(c->sinks, &idx);
++        /* FIXME: the selection here should be based priority values on
++         * the sinks */
++
++        PA_IDXSET_FOREACH(new_default, c->sinks, idx) {
++            if (new_default != e->data && PA_SINK_IS_LINKED(pa_sink_get_state(new_default)))
++                break;
++        }
 +
 +        pa_namereg_set_default_sink(c, new_default);
 +
 +    } else if (c->default_source == e->data) {
-         pa_source *new_default;
++        pa_source *new_default = NULL;
 +
-         for (new_default = pa_idxset_first(c->sources, &idx); new_default; new_default = pa_idxset_next(c->sources, &idx)) {
-             if (new_default != e->data && !new_default->monitor_of)
++        /* First, try to find one that isn't a monitor */
++        PA_IDXSET_FOREACH(new_default, c->sources, idx) {
++            if (new_default != e->data && !new_default->monitor_of && PA_SOURCE_IS_LINKED(pa_source_get_state(new_default)))
 +                break;
 +        }
 +
 +        if (!new_default) {
-             new_default = pa_idxset_first(c->sources, &idx);
- 
-             if (new_default == e->data)
-                 new_default = pa_idxset_next(c->sources, &idx);
++            /* Then, fallback to a monitor */
++            PA_IDXSET_FOREACH(new_default, c->sources, idx) {
++                if (new_default != e->data && PA_SOURCE_IS_LINKED(pa_source_get_state(new_default)))
++                    break;
++            }
 +        }
 +
 +        pa_namereg_set_default_source(c, new_default);
 +    }
  
      pa_xfree(e->name);
      pa_xfree(e);
@@@ -268,16 -248,43 +281,49 @@@ pa_source* pa_namereg_set_default_sourc
      return s;
  }
  
 +/* XXX: After removing old functionality, has this function become useless? */
  pa_sink *pa_namereg_get_default_sink(pa_core *c) {
+     pa_sink *s;
+     uint32_t idx;
+ 
      pa_assert(c);
  
-     return c->default_sink;
 -    if (c->default_sink && PA_SINK_IS_LINKED(pa_sink_get_state(c->default_sink)))
++    if (!c->default_sink || PA_SINK_IS_LINKED(pa_sink_get_state(c->default_sink)))
+         return c->default_sink;
+ 
++    /* The old default sink has become unlinked, set a new one. */
++
+     /* FIXME: the selection here should be based priority values on
+      * the sinks */
+ 
+     PA_IDXSET_FOREACH(s, c->sinks, idx)
+         if (PA_SINK_IS_LINKED(pa_sink_get_state(s)))
+             return pa_namereg_set_default_sink(c, s);
+ 
 -    return NULL;
++    return pa_namereg_set_default_sink(c, NULL);
  }
  
 +/* XXX: After removing old functionality, has this function become useless? */
  pa_source *pa_namereg_get_default_source(pa_core *c) {
+     pa_source *s;
+     uint32_t idx;
+ 
      pa_assert(c);
  
-     return c->default_source;
 -    if (c->default_source && PA_SOURCE_IS_LINKED(pa_source_get_state(c->default_source)))
++    if (!c->default_source || PA_SOURCE_IS_LINKED(pa_source_get_state(c->default_source)))
+         return c->default_source;
+ 
++    /* The old default source has become unlinked, set a new one. */
++
+     /* First, try to find one that isn't a monitor */
+     PA_IDXSET_FOREACH(s, c->sources, idx)
+         if (!s->monitor_of && PA_SOURCE_IS_LINKED(pa_source_get_state(s)))
+             return pa_namereg_set_default_source(c, s);
+ 
+     /* Then, fallback to a monitor */
+     PA_IDXSET_FOREACH(s, c->sources, idx)
+         if (PA_SOURCE_IS_LINKED(pa_source_get_state(s)))
+             return pa_namereg_set_default_source(c, s);
+ 
 -    return NULL;
++    return pa_namereg_set_default_source(c, NULL);
  }

commit f48684e4dbc00d102ed17700fb693726a2676566
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 17 08:26:06 2009 +0300

    namereg: Revert default device handling back to the upstream version.

diff --git a/src/pulsecore/namereg.c b/src/pulsecore/namereg.c
index d7d83c5..e26923d 100644
--- a/src/pulsecore/namereg.c
+++ b/src/pulsecore/namereg.c
@@ -149,55 +149,21 @@ const char *pa_namereg_register(pa_core *c, const char *name, pa_namereg_type_t
 
     pa_assert_se(pa_hashmap_put(c->namereg, e->name, e) >= 0);
 
-    if (type == PA_NAMEREG_SINK && !c->default_sink)
-        pa_namereg_set_default_sink(c, data);
-    else if (type == PA_NAMEREG_SOURCE && !c->default_source)
-        pa_namereg_set_default_source(c, data);
-
     return e->name;
 }
 
 void pa_namereg_unregister(pa_core *c, const char *name) {
     struct namereg_entry *e;
-    uint32_t idx;
 
     pa_assert(c);
     pa_assert(name);
 
     pa_assert_se(e = pa_hashmap_remove(c->namereg, name));
 
-    if (c->default_sink == e->data) {
-        pa_sink *new_default = NULL;
-
-        /* FIXME: the selection here should be based priority values on
-         * the sinks */
-
-        PA_IDXSET_FOREACH(new_default, c->sinks, idx) {
-            if (new_default != e->data && PA_SINK_IS_LINKED(pa_sink_get_state(new_default)))
-                break;
-        }
-
-        pa_namereg_set_default_sink(c, new_default);
-
-    } else if (c->default_source == e->data) {
-        pa_source *new_default = NULL;
-
-        /* First, try to find one that isn't a monitor */
-        PA_IDXSET_FOREACH(new_default, c->sources, idx) {
-            if (new_default != e->data && !new_default->monitor_of && PA_SOURCE_IS_LINKED(pa_source_get_state(new_default)))
-                break;
-        }
-
-        if (!new_default) {
-            /* Then, fallback to a monitor */
-            PA_IDXSET_FOREACH(new_default, c->sources, idx) {
-                if (new_default != e->data && PA_SOURCE_IS_LINKED(pa_source_get_state(new_default)))
-                    break;
-            }
-        }
-
-        pa_namereg_set_default_source(c, new_default);
-    }
+    if (c->default_sink == e->data)
+        pa_namereg_set_default_sink(c, NULL);
+    else if (c->default_source == e->data)
+        pa_namereg_set_default_source(c, NULL);
 
     pa_xfree(e->name);
     pa_xfree(e);
@@ -225,6 +191,7 @@ void* pa_namereg_get(pa_core *c, const char *name, pa_namereg_type_t type) {
 
         if ((s = pa_namereg_get(c, NULL, PA_NAMEREG_SINK)))
             return s->monitor_source;
+
     }
 
     if (!name)
@@ -281,18 +248,15 @@ pa_source* pa_namereg_set_default_source(pa_core*c, pa_source *s) {
     return s;
 }
 
-/* XXX: After removing old functionality, has this function become useless? */
 pa_sink *pa_namereg_get_default_sink(pa_core *c) {
     pa_sink *s;
     uint32_t idx;
 
     pa_assert(c);
 
-    if (!c->default_sink || PA_SINK_IS_LINKED(pa_sink_get_state(c->default_sink)))
+    if (c->default_sink && PA_SINK_IS_LINKED(pa_sink_get_state(c->default_sink)))
         return c->default_sink;
 
-    /* The old default sink has become unlinked, set a new one. */
-
     /* FIXME: the selection here should be based priority values on
      * the sinks */
 
@@ -300,21 +264,18 @@ pa_sink *pa_namereg_get_default_sink(pa_core *c) {
         if (PA_SINK_IS_LINKED(pa_sink_get_state(s)))
             return pa_namereg_set_default_sink(c, s);
 
-    return pa_namereg_set_default_sink(c, NULL);
+    return NULL;
 }
 
-/* XXX: After removing old functionality, has this function become useless? */
 pa_source *pa_namereg_get_default_source(pa_core *c) {
     pa_source *s;
     uint32_t idx;
 
     pa_assert(c);
 
-    if (!c->default_source || PA_SOURCE_IS_LINKED(pa_source_get_state(c->default_source)))
+    if (c->default_source && PA_SOURCE_IS_LINKED(pa_source_get_state(c->default_source)))
         return c->default_source;
 
-    /* The old default source has become unlinked, set a new one. */
-
     /* First, try to find one that isn't a monitor */
     PA_IDXSET_FOREACH(s, c->sources, idx)
         if (!s->monitor_of && PA_SOURCE_IS_LINKED(pa_source_get_state(s)))
@@ -325,5 +286,5 @@ pa_source *pa_namereg_get_default_source(pa_core *c) {
         if (PA_SOURCE_IS_LINKED(pa_source_get_state(s)))
             return pa_namereg_set_default_source(c, s);
 
-    return pa_namereg_set_default_source(c, NULL);
+    return NULL;
 }

commit a10e8360d72626635de1242cfc2c77207f13d56f
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 17 16:42:06 2009 +0300

    dbusiface-core: New function: pa_dbusiface_core_get_client_path().

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index 2b5cf0b..ec87158 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -2075,3 +2075,10 @@ const char *pa_dbusiface_core_get_module_path(pa_dbusiface_core *c, const pa_mod
 
     return pa_dbusiface_module_get_path(pa_hashmap_get(c->modules, PA_UINT32_TO_PTR(module->index)));
 }
+
+const char *pa_dbusiface_core_get_client_path(pa_dbusiface_core *c, const pa_client *client) {
+    pa_assert(c);
+    pa_assert(client);
+
+    return pa_dbusiface_client_get_path(pa_hashmap_get(c->clients, PA_UINT32_TO_PTR(client->index)));
+}
diff --git a/src/modules/dbus/iface-core.h b/src/modules/dbus/iface-core.h
index 14dff7e..cf2a3b2 100644
--- a/src/modules/dbus/iface-core.h
+++ b/src/modules/dbus/iface-core.h
@@ -41,5 +41,6 @@ const char *pa_dbusiface_core_get_source_path(pa_dbusiface_core *c, const pa_sou
 const char *pa_dbusiface_core_get_playback_stream_path(pa_dbusiface_core *c, const pa_sink_input *sink_input);
 const char *pa_dbusiface_core_get_record_stream_path(pa_dbusiface_core *c, const pa_source_output *source_output);
 const char *pa_dbusiface_core_get_module_path(pa_dbusiface_core *c, const pa_module *module);
+const char *pa_dbusiface_core_get_client_path(pa_dbusiface_core *c, const pa_client *client);
 
 #endif

commit efec274b6dcf239f580713f889957c370ac7ffc7
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 17 16:42:58 2009 +0300

    dbusiface-core: Two new functions: pa_dbusiface_core_get_sink/source().

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index ec87158..86a8fc7 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -2082,3 +2082,31 @@ const char *pa_dbusiface_core_get_client_path(pa_dbusiface_core *c, const pa_cli
 
     return pa_dbusiface_client_get_path(pa_hashmap_get(c->clients, PA_UINT32_TO_PTR(client->index)));
 }
+
+pa_sink *pa_dbusiface_core_get_sink(pa_dbusiface_core *c, const char *object_path) {
+    pa_dbusiface_device *device = NULL;
+
+    pa_assert(c);
+    pa_assert(object_path);
+
+    device = pa_hashmap_get(c->sinks_by_path, object_path);
+
+    if (device)
+        return pa_dbusiface_device_get_sink(device);
+    else
+        return NULL;
+}
+
+pa_source *pa_dbusiface_core_get_source(pa_dbusiface_core *c, const char *object_path) {
+    pa_dbusiface_device *device = NULL;
+
+    pa_assert(c);
+    pa_assert(object_path);
+
+    device = pa_hashmap_get(c->sources_by_path, object_path);
+
+    if (device)
+        return pa_dbusiface_device_get_source(device);
+    else
+        return NULL;
+}
diff --git a/src/modules/dbus/iface-core.h b/src/modules/dbus/iface-core.h
index cf2a3b2..900b6d1 100644
--- a/src/modules/dbus/iface-core.h
+++ b/src/modules/dbus/iface-core.h
@@ -43,4 +43,10 @@ const char *pa_dbusiface_core_get_record_stream_path(pa_dbusiface_core *c, const
 const char *pa_dbusiface_core_get_module_path(pa_dbusiface_core *c, const pa_module *module);
 const char *pa_dbusiface_core_get_client_path(pa_dbusiface_core *c, const pa_client *client);
 
+/* Returns NULL if there's no sink with the given path. */
+pa_sink *pa_dbusiface_core_get_sink(pa_dbusiface_core *c, const char *object_path);
+
+/* Returns NULL if there's no source with the given path. */
+pa_source *pa_dbusiface_core_get_source(pa_dbusiface_core *c, const char *object_path);
+
 #endif

commit 150cd1684a1e67d3a3797b34b45256afb0fa7f53
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 17 16:50:29 2009 +0300

    dbusiface-device: Split some overly long lines.

diff --git a/src/modules/dbus/iface-device.c b/src/modules/dbus/iface-device.c
index 15ece83..486a094 100644
--- a/src/modules/dbus/iface-device.c
+++ b/src/modules/dbus/iface-device.c
@@ -310,9 +310,11 @@ static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void
 
     if (!owner_module) {
         if (d->type == DEVICE_TYPE_SINK)
-            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Sink %s doesn't have an owner module.", d->sink->name);
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                               "Sink %s doesn't have an owner module.", d->sink->name);
         else
-            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Source %s doesn't have an owner module.", d->source->name);
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                               "Source %s doesn't have an owner module.", d->source->name);
         return;
     }
 
@@ -334,9 +336,11 @@ static void handle_get_card(DBusConnection *conn, DBusMessage *msg, void *userda
 
     if (!card) {
         if (d->type == DEVICE_TYPE_SINK)
-            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Sink %s doesn't belong to any card.", d->sink->name);
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                               "Sink %s doesn't belong to any card.", d->sink->name);
         else
-            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Source %s doesn't belong to any card.", d->source->name);
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                               "Source %s doesn't belong to any card.", d->source->name);
         return;
     }
 
@@ -426,7 +430,8 @@ static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, void *user
         return;
 
     if (n_volume_entries != device_channels) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Expected %u volume entries, got %u.", device_channels, n_volume_entries);
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
+                           "Expected %u volume entries, got %u.", device_channels, n_volume_entries);
         return;
     }
 
@@ -598,9 +603,11 @@ static void handle_get_latency(DBusConnection *conn, DBusMessage *msg, void *use
     pa_assert(d);
 
     if (d->type == DEVICE_TYPE_SINK && !(d->sink->flags & PA_SINK_LATENCY))
-        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Sink %s doesn't support latency querying.", d->sink->name);
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                           "Sink %s doesn't support latency querying.", d->sink->name);
     else if (d->type == DEVICE_TYPE_SOURCE && !(d->source->flags & PA_SOURCE_LATENCY))
-        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Source %s doesn't support latency querying.", d->source->name);
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                           "Source %s doesn't support latency querying.", d->source->name);
     return;
 
     latency = (d->type == DEVICE_TYPE_SINK) ? pa_sink_get_latency(d->sink) : pa_source_get_latency(d->source);

commit bce6af18a3cc761375acebe589c821fc2abf9d1e
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 17 16:52:10 2009 +0300

    dbusiface-device: Use a single if-else section instead of ternary operator overuse.

diff --git a/src/modules/dbus/iface-device.c b/src/modules/dbus/iface-device.c
index 486a094..078ae74 100644
--- a/src/modules/dbus/iface-device.c
+++ b/src/modules/dbus/iface-device.c
@@ -817,48 +817,57 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
     pa_assert(msg);
     pa_assert(d);
 
-    idx = (d->type == DEVICE_TYPE_SINK) ? d->sink->index : d->source->index;
-    name = (d->type == DEVICE_TYPE_SINK) ? d->sink->name : d->source->name;
-    driver = (d->type == DEVICE_TYPE_SINK) ? d->sink->driver : d->source->driver;
-    owner_module = (d->type == DEVICE_TYPE_SINK) ? d->sink->module : d->source->module;
+    if (d->type == DEVICE_TYPE_SINK) {
+        idx = d->sink->index;
+        name = d->sink->name;
+        driver = d->sink->driver;
+        owner_module = d->sink->module;
+        card = d->sink->card;
+        sample_format = d->sink->sample_spec.format;
+        sample_rate = d->sink->sample_spec.rate;
+        channel_map = &d->sink->channel_map;
+        has_flat_volume = d->sink->flags & PA_SINK_FLAT_VOLUME;
+        has_convertible_to_decibel_volume = d->sink->flags & PA_SINK_DECIBEL_VOLUME;
+        base_volume = d->sink->base_volume;
+        volume_steps = d->sink->n_volume_steps;
+        has_hardware_volume = d->sink->flags & PA_SINK_HW_VOLUME_CTRL;
+        has_hardware_mute = d->sink->flags & PA_SINK_HW_MUTE_CTRL;
+        configured_latency = pa_sink_get_requested_latency(d->sink);
+        has_dynamic_latency = d->sink->flags & PA_SINK_DYNAMIC_LATENCY;
+        latency = pa_sink_get_latency(d->sink);
+        is_hardware_device = d->sink->flags & PA_SINK_HARDWARE;
+        is_network_device = d->sink->flags & PA_SINK_NETWORK;
+        state = pa_sink_get_state(d->sink);
+    } else {
+        idx = d->source->index;
+        name = d->source->name;
+        driver = d->source->driver;
+        owner_module = d->source->module;
+        card = d->source->card;
+        sample_format = d->source->sample_spec.format;
+        sample_rate = d->source->sample_spec.rate;
+        channel_map = &d->source->channel_map;
+        has_flat_volume = FALSE;
+        has_convertible_to_decibel_volume = d->source->flags & PA_SOURCE_DECIBEL_VOLUME;
+        base_volume = d->source->base_volume;
+        volume_steps = d->source->n_volume_steps;
+        has_hardware_volume = d->source->flags & PA_SOURCE_HW_VOLUME_CTRL;
+        has_hardware_mute = d->source->flags & PA_SOURCE_HW_MUTE_CTRL;
+        configured_latency = pa_source_get_requested_latency(d->source);
+        has_dynamic_latency = d->source->flags & PA_SOURCE_DYNAMIC_LATENCY;
+        latency = pa_source_get_latency(d->source);
+        is_hardware_device = d->source->flags & PA_SOURCE_HARDWARE;
+        is_network_device = d->source->flags & PA_SOURCE_NETWORK;
+        state = pa_source_get_state(d->source);
+    }
     if (owner_module)
         owner_module_path = pa_dbusiface_core_get_module_path(d->core, owner_module);
-    card = (d->type == DEVICE_TYPE_SINK) ? d->sink->card : d->source->card;
     if (card)
         card_path = pa_dbusiface_core_get_card_path(d->core, card);
-    sample_format = (d->type == DEVICE_TYPE_SINK) ? d->sink->sample_spec.format : d->source->sample_spec.format;
-    sample_rate = (d->type == DEVICE_TYPE_SINK) ? d->sink->sample_spec.rate : d->source->sample_spec.rate;
-    channel_map = (d->type == DEVICE_TYPE_SINK) ? &d->sink->channel_map : &d->source->channel_map;
     for (i = 0; i < channel_map->channels; ++i)
         channels[i] = channel_map->map[i];
     for (i = 0; i < d->volume.channels; ++i)
         volume[i] = d->volume.values[i];
-    has_flat_volume = (d->type == DEVICE_TYPE_SINK) ? (d->sink->flags & PA_SINK_FLAT_VOLUME) : FALSE;
-    has_convertible_to_decibel_volume = (d->type == DEVICE_TYPE_SINK)
-                                        ? (d->sink->flags & PA_SINK_DECIBEL_VOLUME)
-                                        : (d->source->flags & PA_SOURCE_DECIBEL_VOLUME);
-    base_volume = (d->type == DEVICE_TYPE_SINK) ? d->sink->base_volume : d->source->base_volume;
-    volume_steps = (d->type == DEVICE_TYPE_SINK) ? d->sink->n_volume_steps : d->source->n_volume_steps;
-    has_hardware_volume = (d->type == DEVICE_TYPE_SINK)
-                          ? (d->sink->flags & PA_SINK_HW_VOLUME_CTRL)
-                          : (d->source->flags & PA_SOURCE_HW_VOLUME_CTRL);
-    has_hardware_mute = (d->type == DEVICE_TYPE_SINK)
-                        ? (d->sink->flags & PA_SINK_HW_MUTE_CTRL)
-                        : (d->source->flags & PA_SOURCE_HW_MUTE_CTRL);
-    configured_latency = (d->type == DEVICE_TYPE_SINK)
-                         ? pa_sink_get_requested_latency(d->sink)
-                         : pa_source_get_requested_latency(d->source);
-    has_dynamic_latency = (d->type == DEVICE_TYPE_SINK)
-                          ? (d->sink->flags & PA_SINK_DYNAMIC_LATENCY)
-                          : (d->source->flags & PA_SOURCE_DYNAMIC_LATENCY);
-    latency = (d->type == DEVICE_TYPE_SINK) ? pa_sink_get_latency(d->sink) : pa_source_get_latency(d->source);
-    is_hardware_device = (d->type == DEVICE_TYPE_SINK)
-                         ? (d->sink->flags & PA_SINK_HARDWARE)
-                         : (d->source->flags & PA_SOURCE_HARDWARE);
-    is_network_device = (d->type == DEVICE_TYPE_SINK)
-                        ? (d->sink->flags & PA_SINK_NETWORK)
-                        : (d->source->flags & PA_SOURCE_NETWORK);
-    state = (d->type == DEVICE_TYPE_SINK) ? pa_sink_get_state(d->sink) : pa_source_get_state(d->source);
     ports = get_ports(d, &n_ports);
     if (d->active_port)
         active_port = pa_dbusiface_device_port_get_path(pa_hashmap_get(d->ports, d->active_port->name));

commit b52871517944d55cec549af362398a5012f0b8b8
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 17 16:53:58 2009 +0300

    dbusiface-device: Fix argument reading in handle_suspend().

diff --git a/src/modules/dbus/iface-device.c b/src/modules/dbus/iface-device.c
index 078ae74..2e5940c 100644
--- a/src/modules/dbus/iface-device.c
+++ b/src/modules/dbus/iface-device.c
@@ -923,13 +923,19 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
 static void handle_suspend(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_dbusiface_device *d = userdata;
     dbus_bool_t suspend = FALSE;
+    DBusError error;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(d);
 
-    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_BOOLEAN, &suspend) < 0)
+    dbus_error_init(&error);
+
+    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_BOOLEAN, &suspend, DBUS_TYPE_INVALID)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
+        dbus_error_free(&error);
         return;
+    }
 
     if ((d->type == DEVICE_TYPE_SINK) && (pa_sink_suspend(d->sink, suspend, PA_SUSPEND_USER) < 0)) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Internal error in PulseAudio: pa_sink_suspend() failed.");

commit 70ff96b8ab100abb4969b882f66518ce739ae655
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 17 16:55:08 2009 +0300

    dbusiface-device: Save one level of identation by returning early.

diff --git a/src/modules/dbus/iface-device.c b/src/modules/dbus/iface-device.c
index 2e5940c..8dc0b2c 100644
--- a/src/modules/dbus/iface-device.c
+++ b/src/modules/dbus/iface-device.c
@@ -1075,126 +1075,129 @@ static void handle_source_get_all(DBusConnection *conn, DBusMessage *msg, void *
 
 static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
     pa_dbusiface_device *d = userdata;
+    DBusMessage *signal = NULL;
+    const pa_cvolume *new_volume = NULL;
+    pa_bool_t new_muted = FALSE;
+    pa_sink_state_t new_sink_state = 0;
+    pa_source_state_t new_source_state = 0;
+    pa_device_port *new_active_port = NULL;
+    pa_proplist *new_proplist = NULL;
+    unsigned i = 0;
 
     pa_assert(c);
     pa_assert(d);
 
-    if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_CHANGE) {
-        DBusMessage *signal = NULL;
-        const pa_cvolume *new_volume = NULL;
-        pa_bool_t new_muted = FALSE;
-        pa_sink_state_t new_sink_state = 0;
-        pa_source_state_t new_source_state = 0;
-        pa_device_port *new_active_port = NULL;
-        pa_proplist *new_proplist = NULL;
-        unsigned i = 0;
-
-        pa_assert(((d->type == DEVICE_TYPE_SINK)
-                    && ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SINK))
-                  || ((d->type == DEVICE_TYPE_SOURCE)
-                       && ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE)));
-
-        new_volume = (d->type == DEVICE_TYPE_SINK)
-                     ? pa_sink_get_volume(d->sink, FALSE, FALSE)
-                     : pa_source_get_volume(d->source, FALSE);
-
-        if (!pa_cvolume_equal(&d->volume, new_volume)) {
-            dbus_uint32_t volume[PA_CHANNELS_MAX];
-            dbus_uint32_t *volume_ptr = volume;
-
-            d->volume = *new_volume;
-
-            for (i = 0; i < d->volume.channels; ++i)
-                volume[i] = d->volume.values[i];
-
-            pa_assert_se(signal = dbus_message_new_signal(d->path,
-                                                          PA_DBUSIFACE_DEVICE_INTERFACE,
-                                                          signals[SIGNAL_VOLUME_UPDATED].name));
-            pa_assert_se(dbus_message_append_args(signal,
-                                                  DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &volume_ptr, d->volume.channels,
-                                                  DBUS_TYPE_INVALID));
-
-            pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
-            dbus_message_unref(signal);
-            signal = NULL;
-        }
+    if ((d->type == DEVICE_TYPE_SINK && idx != d->sink->index) || (d->type == DEVICE_TYPE_SOURCE && idx != d->source->index))
+        return;
 
-        new_muted = (d->type == DEVICE_TYPE_SINK) ? pa_sink_get_mute(d->sink, FALSE) : pa_source_get_mute(d->source, FALSE);
+    if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) != PA_SUBSCRIPTION_EVENT_CHANGE)
+        return;
 
-        if (d->is_muted != new_muted) {
-            d->is_muted = new_muted;
+    pa_assert(((d->type == DEVICE_TYPE_SINK)
+                && ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SINK))
+              || ((d->type == DEVICE_TYPE_SOURCE)
+                   && ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE)));
 
-            pa_assert_se(signal = dbus_message_new_signal(d->path,
-                                                          PA_DBUSIFACE_DEVICE_INTERFACE,
-                                                          signals[SIGNAL_MUTE_UPDATED].name));
-            pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_BOOLEAN, &d->is_muted, DBUS_TYPE_INVALID));
+    new_volume = (d->type == DEVICE_TYPE_SINK)
+                 ? pa_sink_get_volume(d->sink, FALSE, FALSE)
+                 : pa_source_get_volume(d->source, FALSE);
 
-            pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
-            dbus_message_unref(signal);
-            signal = NULL;
-        }
+    if (!pa_cvolume_equal(&d->volume, new_volume)) {
+        dbus_uint32_t volume[PA_CHANNELS_MAX];
+        dbus_uint32_t *volume_ptr = volume;
 
-        if (d->type == DEVICE_TYPE_SINK)
-            new_sink_state = pa_sink_get_state(d->sink);
-        else
-            new_source_state = pa_source_get_state(d->source);
+        d->volume = *new_volume;
 
-        if ((d->type == DEVICE_TYPE_SINK && d->sink_state != new_sink_state)
-            || (d->type == DEVICE_TYPE_SOURCE && d->source_state != new_source_state)) {
-            dbus_uint32_t state = 0;
+        for (i = 0; i < d->volume.channels; ++i)
+            volume[i] = d->volume.values[i];
 
-            if (d->type == DEVICE_TYPE_SINK)
-                d->sink_state = new_sink_state;
-            else
-                d->source_state = new_source_state;
+        pa_assert_se(signal = dbus_message_new_signal(d->path,
+                                                      PA_DBUSIFACE_DEVICE_INTERFACE,
+                                                      signals[SIGNAL_VOLUME_UPDATED].name));
+        pa_assert_se(dbus_message_append_args(signal,
+                                              DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &volume_ptr, d->volume.channels,
+                                              DBUS_TYPE_INVALID));
 
-            state = (d->type == DEVICE_TYPE_SINK) ? d->sink_state : d->source_state;
+        pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
+        dbus_message_unref(signal);
+        signal = NULL;
+    }
 
-            pa_assert_se(signal = dbus_message_new_signal(d->path,
-                                                          PA_DBUSIFACE_DEVICE_INTERFACE,
-                                                          signals[SIGNAL_STATE_UPDATED].name));
-            pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_UINT32, &state, DBUS_TYPE_INVALID));
+    new_muted = (d->type == DEVICE_TYPE_SINK) ? pa_sink_get_mute(d->sink, FALSE) : pa_source_get_mute(d->source, FALSE);
 
-            pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
-            dbus_message_unref(signal);
-            signal = NULL;
-        }
+    if (d->is_muted != new_muted) {
+        d->is_muted = new_muted;
 
-        new_active_port = (d->type == DEVICE_TYPE_SINK) ? d->sink->active_port : d->source->active_port;
+        pa_assert_se(signal = dbus_message_new_signal(d->path,
+                                                      PA_DBUSIFACE_DEVICE_INTERFACE,
+                                                      signals[SIGNAL_MUTE_UPDATED].name));
+        pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_BOOLEAN, &d->is_muted, DBUS_TYPE_INVALID));
 
-        if (d->active_port != new_active_port) {
-            const char *object_path = NULL;
+        pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
+        dbus_message_unref(signal);
+        signal = NULL;
+    }
 
-            d->active_port = new_active_port;
-            object_path = pa_dbusiface_device_port_get_path(pa_hashmap_get(d->ports, d->active_port->name));
+    if (d->type == DEVICE_TYPE_SINK)
+        new_sink_state = pa_sink_get_state(d->sink);
+    else
+        new_source_state = pa_source_get_state(d->source);
 
-            pa_assert_se(signal = dbus_message_new_signal(d->path,
-                                                          PA_DBUSIFACE_DEVICE_INTERFACE,
-                                                          signals[SIGNAL_ACTIVE_PORT_UPDATED].name));
-            pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+    if ((d->type == DEVICE_TYPE_SINK && d->sink_state != new_sink_state)
+        || (d->type == DEVICE_TYPE_SOURCE && d->source_state != new_source_state)) {
+        dbus_uint32_t state = 0;
 
-            pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
-            dbus_message_unref(signal);
-            signal = NULL;
-        }
+        if (d->type == DEVICE_TYPE_SINK)
+            d->sink_state = new_sink_state;
+        else
+            d->source_state = new_source_state;
 
-        new_proplist = (d->type == DEVICE_TYPE_SINK) ? d->sink->proplist : d->source->proplist;
+        state = (d->type == DEVICE_TYPE_SINK) ? d->sink_state : d->source_state;
 
-        if (!pa_proplist_equal(d->proplist, new_proplist)) {
-            DBusMessageIter msg_iter;
+        pa_assert_se(signal = dbus_message_new_signal(d->path,
+                                                      PA_DBUSIFACE_DEVICE_INTERFACE,
+                                                      signals[SIGNAL_STATE_UPDATED].name));
+        pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_UINT32, &state, DBUS_TYPE_INVALID));
 
-            pa_proplist_update(d->proplist, PA_UPDATE_SET, new_proplist);
+        pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
+        dbus_message_unref(signal);
+        signal = NULL;
+    }
 
-            pa_assert_se(signal = dbus_message_new_signal(d->path,
-                                                          PA_DBUSIFACE_DEVICE_INTERFACE,
-                                                          signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
-            dbus_message_iter_init_append(signal, &msg_iter);
-            pa_dbus_append_proplist(&msg_iter, d->proplist);
+    new_active_port = (d->type == DEVICE_TYPE_SINK) ? d->sink->active_port : d->source->active_port;
 
-            pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
-            dbus_message_unref(signal);
-            signal = NULL;
-        }
+    if (d->active_port != new_active_port) {
+        const char *object_path = NULL;
+
+        d->active_port = new_active_port;
+        object_path = pa_dbusiface_device_port_get_path(pa_hashmap_get(d->ports, d->active_port->name));
+
+        pa_assert_se(signal = dbus_message_new_signal(d->path,
+                                                      PA_DBUSIFACE_DEVICE_INTERFACE,
+                                                      signals[SIGNAL_ACTIVE_PORT_UPDATED].name));
+        pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+        pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
+        dbus_message_unref(signal);
+        signal = NULL;
+    }
+
+    new_proplist = (d->type == DEVICE_TYPE_SINK) ? d->sink->proplist : d->source->proplist;
+
+    if (!pa_proplist_equal(d->proplist, new_proplist)) {
+        DBusMessageIter msg_iter;
+
+        pa_proplist_update(d->proplist, PA_UPDATE_SET, new_proplist);
+
+        pa_assert_se(signal = dbus_message_new_signal(d->path,
+                                                      PA_DBUSIFACE_DEVICE_INTERFACE,
+                                                      signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+        dbus_message_iter_init_append(signal, &msg_iter);
+        pa_dbus_append_proplist(&msg_iter, d->proplist);
+
+        pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
+        dbus_message_unref(signal);
+        signal = NULL;
     }
 }
 

commit 36dc61a2bff7ee93ca289c33c24b76cb82068cac
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 17 16:56:12 2009 +0300

    dbusiface-stream: Finish the Stream D-Bus interface.

diff --git a/src/modules/dbus/iface-stream.c b/src/modules/dbus/iface-stream.c
index 4333c16..354ca6e 100644
--- a/src/modules/dbus/iface-stream.c
+++ b/src/modules/dbus/iface-stream.c
@@ -39,78 +39,86 @@ enum stream_type {
 };
 
 struct pa_dbusiface_stream {
+    pa_dbusiface_core *core;
+
     union {
         pa_sink_input *sink_input;
         pa_source_output *source_output;
     };
     enum stream_type type;
     char *path;
+    union {
+        pa_sink *sink;
+        pa_source *source;
+    };
+    uint32_t sample_rate;
     pa_cvolume volume;
     pa_bool_t is_muted;
     pa_proplist *proplist;
 
     pa_dbus_protocol *dbus_protocol;
     pa_subscription *subscription;
+    pa_hook_slot *send_event_slot;
 };
 
 static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata);
-/*static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_client(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_device(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata);*/
+static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
-/*static void handle_get_buffer_latency(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_buffer_latency(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_device_latency(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_get_resample_method(DBusConnection *conn, DBusMessage *msg, void *userdata);*/
+static void handle_get_resample_method(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata);
 
 static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
 
-/*static void handle_move(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_kill(DBusConnection *conn, DBusMessage *msg, void *userdata);*/
+static void handle_move(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_kill(DBusConnection *conn, DBusMessage *msg, void *userdata);
 
 enum property_handler_index {
     PROPERTY_HANDLER_INDEX,
-/*    PROPERTY_HANDLER_DRIVER,
+    PROPERTY_HANDLER_DRIVER,
     PROPERTY_HANDLER_OWNER_MODULE,
     PROPERTY_HANDLER_CLIENT,
     PROPERTY_HANDLER_DEVICE,
     PROPERTY_HANDLER_SAMPLE_FORMAT,
     PROPERTY_HANDLER_SAMPLE_RATE,
-    PROPERTY_HANDLER_CHANNELS,*/
+    PROPERTY_HANDLER_CHANNELS,
     PROPERTY_HANDLER_VOLUME,
     PROPERTY_HANDLER_IS_MUTED,
-/*    PROPERTY_HANDLER_BUFFER_LATENCY,
+    PROPERTY_HANDLER_BUFFER_LATENCY,
     PROPERTY_HANDLER_DEVICE_LATENCY,
-    PROPERTY_HANDLER_RESAMPLE_METHOD,*/
+    PROPERTY_HANDLER_RESAMPLE_METHOD,
     PROPERTY_HANDLER_PROPERTY_LIST,
     PROPERTY_HANDLER_MAX
 };
 
 static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
     [PROPERTY_HANDLER_INDEX]           = { .property_name = "Index",          .type = "u",      .get_cb = handle_get_index,           .set_cb = NULL },
-/*    [PROPERTY_HANDLER_DRIVER]          = { .property_name = "Driver",         .type = "s",      .get_cb = handle_get_driver,          .set_cb = NULL },
+    [PROPERTY_HANDLER_DRIVER]          = { .property_name = "Driver",         .type = "s",      .get_cb = handle_get_driver,          .set_cb = NULL },
     [PROPERTY_HANDLER_OWNER_MODULE]    = { .property_name = "OwnerModule",    .type = "o",      .get_cb = handle_get_owner_module,    .set_cb = NULL },
     [PROPERTY_HANDLER_CLIENT]          = { .property_name = "Client",         .type = "o",      .get_cb = handle_get_client,          .set_cb = NULL },
     [PROPERTY_HANDLER_DEVICE]          = { .property_name = "Device",         .type = "o",      .get_cb = handle_get_device,          .set_cb = NULL },
     [PROPERTY_HANDLER_SAMPLE_FORMAT]   = { .property_name = "SampleFormat",   .type = "u",      .get_cb = handle_get_sample_format,   .set_cb = NULL },
     [PROPERTY_HANDLER_SAMPLE_RATE]     = { .property_name = "SampleRate",     .type = "u",      .get_cb = handle_get_sample_rate,     .set_cb = NULL },
-    [PROPERTY_HANDLER_CHANNELS]        = { .property_name = "Channels",       .type = "au",     .get_cb = handle_get_channels,        .set_cb = NULL },*/
+    [PROPERTY_HANDLER_CHANNELS]        = { .property_name = "Channels",       .type = "au",     .get_cb = handle_get_channels,        .set_cb = NULL },
     [PROPERTY_HANDLER_VOLUME]          = { .property_name = "Volume",         .type = "au",     .get_cb = handle_get_volume,          .set_cb = handle_set_volume },
     [PROPERTY_HANDLER_IS_MUTED]        = { .property_name = "IsMuted",        .type = "b",      .get_cb = handle_get_is_muted,        .set_cb = handle_set_is_muted },
-/*    [PROPERTY_HANDLER_BUFFER_LATENCY]  = { .property_name = "BufferLatency",  .type = "t",      .get_cb = handle_get_buffer_latency,  .set_cb = NULL },
+    [PROPERTY_HANDLER_BUFFER_LATENCY]  = { .property_name = "BufferLatency",  .type = "t",      .get_cb = handle_get_buffer_latency,  .set_cb = NULL },
     [PROPERTY_HANDLER_DEVICE_LATENCY]  = { .property_name = "DeviceLatency",  .type = "t",      .get_cb = handle_get_device_latency,  .set_cb = NULL },
-    [PROPERTY_HANDLER_RESAMPLE_METHOD] = { .property_name = "ResampleMethod", .type = "s",      .get_cb = handle_get_resample_method, .set_cb = NULL },*/
+    [PROPERTY_HANDLER_RESAMPLE_METHOD] = { .property_name = "ResampleMethod", .type = "s",      .get_cb = handle_get_resample_method, .set_cb = NULL },
     [PROPERTY_HANDLER_PROPERTY_LIST]   = { .property_name = "PropertyList",   .type = "a{say}", .get_cb = handle_get_property_list,   .set_cb = NULL }
 };
 
-/*enum method_handler_index {
+enum method_handler_index {
     METHOD_HANDLER_MOVE,
     METHOD_HANDLER_KILL,
     METHOD_HANDLER_MAX
@@ -129,38 +137,38 @@ static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
         .arguments = NULL,
         .n_arguments = 0,
         .receive_cb = handle_kill }
-};*/
+};
 
 enum signal_index {
-/*    SIGNAL_DEVICE_UPDATED,
-    SIGNAL_SAMPLE_RATE_UPDATED,*/
+    SIGNAL_DEVICE_UPDATED,
+    SIGNAL_SAMPLE_RATE_UPDATED,
     SIGNAL_VOLUME_UPDATED,
     SIGNAL_MUTE_UPDATED,
     SIGNAL_PROPERTY_LIST_UPDATED,
-/*    SIGNAL_STREAM_EVENT,*/
+    SIGNAL_STREAM_EVENT,
     SIGNAL_MAX
 };
 
-/*static pa_dbus_arg_info device_updated_args[]        = { { "device",        "o",      NULL } };
-static pa_dbus_arg_info sample_rate_updated_args[]   = { { "sample_rate",   "u",      NULL } };*/
+static pa_dbus_arg_info device_updated_args[]        = { { "device",        "o",      NULL } };
+static pa_dbus_arg_info sample_rate_updated_args[]   = { { "sample_rate",   "u",      NULL } };
 static pa_dbus_arg_info volume_updated_args[]        = { { "volume",        "au",     NULL } };
 static pa_dbus_arg_info mute_updated_args[]          = { { "muted",         "b",      NULL } };
 static pa_dbus_arg_info property_list_updated_args[] = { { "property_list", "a{say}", NULL } };
-/*static pa_dbus_arg_info stream_event_args[]          = { { "name",          "s",      NULL }, { "property_list", "a{say}", NULL } };*/
+static pa_dbus_arg_info stream_event_args[]          = { { "name",          "s",      NULL }, { "property_list", "a{say}", NULL } };
 
 static pa_dbus_signal_info signals[SIGNAL_MAX] = {
-/*    [SIGNAL_DEVICE_UPDATED]        = { .name = "DeviceUpdated",       .arguments = device_updated_args,        .n_arguments = 1 },
-    [SIGNAL_SAMPLE_RATE_UPDATED]   = { .name = "SampleRateUpdated",   .arguments = sample_rate_updated_args,   .n_arguments = 1 },*/
+    [SIGNAL_DEVICE_UPDATED]        = { .name = "DeviceUpdated",       .arguments = device_updated_args,        .n_arguments = 1 },
+    [SIGNAL_SAMPLE_RATE_UPDATED]   = { .name = "SampleRateUpdated",   .arguments = sample_rate_updated_args,   .n_arguments = 1 },
     [SIGNAL_VOLUME_UPDATED]        = { .name = "VolumeUpdated",       .arguments = volume_updated_args,        .n_arguments = 1 },
     [SIGNAL_MUTE_UPDATED]          = { .name = "MuteUpdated",         .arguments = mute_updated_args,          .n_arguments = 1 },
-    [SIGNAL_PROPERTY_LIST_UPDATED] = { .name = "PropertyListUpdated", .arguments = property_list_updated_args, .n_arguments = 1 }/*,
-    [SIGNAL_STREAM_EVENT]          = { .name = "StreamEvent",         .arguments = stream_event_args,          .n_arguments = sizeof(stream_event_args) / sizeof(pa_dbus_arg_info) }*/
+    [SIGNAL_PROPERTY_LIST_UPDATED] = { .name = "PropertyListUpdated", .arguments = property_list_updated_args, .n_arguments = 1 },
+    [SIGNAL_STREAM_EVENT]          = { .name = "StreamEvent",         .arguments = stream_event_args,          .n_arguments = sizeof(stream_event_args) / sizeof(pa_dbus_arg_info) }
 };
 
 static pa_dbus_interface_info stream_interface_info = {
     .name = PA_DBUSIFACE_STREAM_INTERFACE,
-    .method_handlers = /*method_handlers*/ NULL,
-    .n_method_handlers = /*METHOD_HANDLER_MAX*/ 0,
+    .method_handlers = method_handlers,
+    .n_method_handlers = METHOD_HANDLER_MAX,
     .property_handlers = property_handlers,
     .n_property_handlers = PROPERTY_HANDLER_MAX,
     .get_all_properties_cb = handle_get_all,
@@ -181,6 +189,140 @@ static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userd
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &idx);
 }
 
+static void handle_get_driver(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+    const char *driver = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    driver = (s->type == STREAM_TYPE_PLAYBACK) ? s->sink_input->driver : s->source_output->driver;
+
+    if (!driver) {
+        if (s->type == STREAM_TYPE_PLAYBACK)
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                               "Playback stream %u doesn't have a driver.", s->sink_input->index);
+        else
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                               "Record stream %u doesn't have a driver.", s->source_output->index);
+        return;
+    }
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &driver);
+}
+
+static void handle_get_owner_module(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+    pa_module *owner_module = NULL;
+    const char *object_path = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    owner_module = (s->type == STREAM_TYPE_PLAYBACK) ? s->sink_input->module : s->source_output->module;
+
+    if (!owner_module) {
+        if (s->type == STREAM_TYPE_PLAYBACK)
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                               "Playback stream %u doesn't have an owner module.", s->sink_input->index);
+        else
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                               "Record stream %u doesn't have an owner module.", s->source_output->index);
+        return;
+    }
+
+    object_path = pa_dbusiface_core_get_module_path(s->core, owner_module);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path);
+}
+
+static void handle_get_client(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+    pa_client *client = NULL;
+    const char *object_path = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    client = (s->type == STREAM_TYPE_PLAYBACK) ? s->sink_input->client : s->source_output->client;
+
+    if (!client) {
+        if (s->type == STREAM_TYPE_PLAYBACK)
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                               "Playback stream %u isn't associated to any client.", s->sink_input->index);
+        else
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                               "Record stream %u isn't associated to any client.", s->source_output->index);
+        return;
+    }
+
+    object_path = pa_dbusiface_core_get_client_path(s->core, client);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path);
+}
+
+static void handle_get_device(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+    const char *device = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (s->type == STREAM_TYPE_PLAYBACK)
+        device = pa_dbusiface_core_get_sink_path(s->core, s->sink);
+    else
+        device = pa_dbusiface_core_get_source_path(s->core, s->source);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &device);
+}
+
+static void handle_get_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+    dbus_uint32_t sample_format = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    sample_format = (s->type == STREAM_TYPE_PLAYBACK)
+                    ? s->sink_input->sample_spec.format
+                    : s->source_output->sample_spec.format;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &sample_format);
+}
+
+static void handle_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &s->sample_rate);
+}
+
+static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+    pa_channel_map *channel_map = NULL;
+    dbus_uint32_t channels[PA_CHANNELS_MAX];
+    unsigned i = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    channel_map = (s->type == STREAM_TYPE_PLAYBACK) ? &s->sink_input->channel_map : &s->source_output->channel_map;
+
+    for (i = 0; i < channel_map->channels; ++i)
+        channels[i] = channel_map->map[i];
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_UINT32, channels, channel_map->channels);
+}
+
 static void handle_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_dbusiface_stream *s = userdata;
     dbus_uint32_t volume[PA_CHANNELS_MAX];
@@ -228,7 +370,8 @@ static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, void *user
         return;
 
     if (n_volume_entries != stream_channels) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Expected %u volume entries, got %u.", stream_channels, n_volume_entries);
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
+                           "Expected %u volume entries, got %u.", stream_channels, n_volume_entries);
         return;
     }
 
@@ -281,6 +424,54 @@ static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, void *us
     pa_dbus_send_empty_reply(conn, msg);
 };
 
+static void handle_get_buffer_latency(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+    dbus_uint64_t buffer_latency = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (s->type == STREAM_TYPE_PLAYBACK)
+        buffer_latency = pa_sink_input_get_latency(s->sink_input, NULL);
+    else
+        buffer_latency = pa_source_output_get_latency(s->source_output, NULL);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT64, &buffer_latency);
+}
+
+static void handle_get_device_latency(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+    dbus_uint64_t device_latency = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (s->type == STREAM_TYPE_PLAYBACK)
+        pa_sink_input_get_latency(s->sink_input, &device_latency);
+    else
+        pa_source_output_get_latency(s->source_output, &device_latency);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT64, &device_latency);
+}
+
+static void handle_get_resample_method(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+    const char *resample_method = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (s->type == STREAM_TYPE_PLAYBACK)
+        resample_method = pa_resample_method_to_string(s->sink_input->actual_resample_method);
+    else
+        resample_method = pa_resample_method_to_string(s->source_output->actual_resample_method);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &resample_method);
+}
+
 static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_dbusiface_stream *s = userdata;
 
@@ -296,19 +487,55 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
     DBusMessage *reply = NULL;
     DBusMessageIter msg_iter;
     DBusMessageIter dict_iter;
-    dbus_uint32_t idx;
+    dbus_uint32_t idx = 0;
+    const char *driver = NULL;
+    pa_module *owner_module = NULL;
+    const char *owner_module_path = NULL;
+    pa_client *client = NULL;
+    const char *client_path = NULL;
+    const char *device = NULL;
+    dbus_uint32_t sample_format = 0;
+    pa_channel_map *channel_map = NULL;
+    dbus_uint32_t channels[PA_CHANNELS_MAX];
     dbus_uint32_t volume[PA_CHANNELS_MAX];
+    dbus_uint64_t buffer_latency = 0;
+    dbus_uint64_t device_latency = 0;
+    const char *resample_method = NULL;
     unsigned i = 0;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(s);
 
-    idx = (s->type == STREAM_TYPE_PLAYBACK) ? s->sink_input->index : s->source_output->index;
     if (s->type == STREAM_TYPE_PLAYBACK) {
+        idx = s->sink_input->index;
+        driver = s->sink_input->driver;
+        owner_module = s->sink_input->module;
+        client = s->sink_input->client;
+        device = pa_dbusiface_core_get_sink_path(s->core, s->sink);
+        sample_format = s->sink_input->sample_spec.format;
+        channel_map = &s->sink_input->channel_map;
         for (i = 0; i < s->volume.channels; ++i)
             volume[i] = s->volume.values[i];
+        buffer_latency = pa_sink_input_get_latency(s->sink_input, &device_latency);
+        resample_method = pa_resample_method_to_string(s->sink_input->actual_resample_method);
+    } else {
+        idx = s->source_output->index;
+        driver = s->source_output->driver;
+        owner_module = s->source_output->module;
+        client = s->source_output->client;
+        device = pa_dbusiface_core_get_source_path(s->core, s->source);
+        sample_format = s->source_output->sample_spec.format;
+        channel_map = &s->source_output->channel_map;
+        buffer_latency = pa_source_output_get_latency(s->source_output, &device_latency);
+        resample_method = pa_resample_method_to_string(s->source_output->actual_resample_method);
     }
+    if (owner_module)
+        owner_module_path = pa_dbusiface_core_get_module_path(s->core, owner_module);
+    if (client)
+        client_path = pa_dbusiface_core_get_client_path(s->core, client);
+    for (i = 0; i < channel_map->channels; ++i)
+        channels[i] = channel_map->map[i];
 
     pa_assert_se((reply = dbus_message_new_method_return(msg)));
 
@@ -317,11 +544,27 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
 
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &idx);
 
+    if (driver)
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DRIVER].property_name, DBUS_TYPE_STRING, &driver);
+
+    if (owner_module)
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_OWNER_MODULE].property_name, DBUS_TYPE_OBJECT_PATH, &owner_module_path);
+
+    if (client)
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CLIENT].property_name, DBUS_TYPE_OBJECT_PATH, &client_path);
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLE_FORMAT].property_name, DBUS_TYPE_UINT32, &sample_format);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLE_RATE].property_name, DBUS_TYPE_UINT32, &s->sample_rate);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CHANNELS].property_name, DBUS_TYPE_UINT32, channels, channel_map->channels);
+
     if (s->type == STREAM_TYPE_PLAYBACK) {
         pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_VOLUME].property_name, DBUS_TYPE_UINT32, volume, s->volume.channels);
         pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_IS_MUTED].property_name, DBUS_TYPE_BOOLEAN, &s->is_muted);
     }
 
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_BUFFER_LATENCY].property_name, DBUS_TYPE_UINT64, &buffer_latency);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DEVICE_LATENCY].property_name, DBUS_TYPE_UINT64, &device_latency);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_RESAMPLE_METHOD].property_name, DBUS_TYPE_STRING, &resample_method);
     pa_dbus_append_proplist_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PROPERTY_LIST].property_name, s->proplist);
 
     pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
@@ -329,83 +572,240 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
     dbus_message_unref(reply);
 }
 
+static void handle_move(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+    const char *device = NULL;
+    DBusError error;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    dbus_error_init(&error);
+
+    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &device, DBUS_TYPE_INVALID)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
+        dbus_error_free(&error);
+        return;
+    }
+
+    if (s->type == STREAM_TYPE_PLAYBACK) {
+        pa_sink *sink = pa_dbusiface_core_get_sink(s->core, device);
+
+        if (!sink) {
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such sink.", device);
+            return;
+        }
+
+        if (pa_sink_input_move_to(s->sink_input, sink, TRUE) < 0) {
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED,
+                               "Moving playback stream %u to sink %s failed.", s->sink_input->index, sink->name);
+            return;
+        }
+    } else {
+        pa_source *source = pa_dbusiface_core_get_source(s->core, device);
+
+        if (!source) {
+            pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such source.", device);
+            return;
+        }
+
+        if (pa_source_output_move_to(s->source_output, source, TRUE) < 0) {
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED,
+                               "Moving record stream %u to source %s failed.", s->source_output->index, source->name);
+            return;
+        }
+    }
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+static void handle_kill(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_stream *s = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (s->type == STREAM_TYPE_PLAYBACK)
+        pa_sink_input_kill(s->sink_input);
+    else
+        pa_source_output_kill(s->source_output);
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
 static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
     pa_dbusiface_stream *s = userdata;
+    DBusMessage *signal = NULL;
+    const char *new_device_path = NULL;
+    uint32_t new_sample_rate = 0;
+    pa_proplist *new_proplist = NULL;
+    unsigned i = 0;
 
     pa_assert(c);
     pa_assert(s);
 
-    if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_CHANGE) {
-        DBusMessage *signal = NULL;
-        pa_proplist *new_proplist = NULL;
-        unsigned i = 0;
-
-        pa_assert(((s->type == STREAM_TYPE_PLAYBACK)
-                    && ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SINK_INPUT))
-                  || ((s->type == STREAM_TYPE_RECORD)
-                       && ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT)));
+    if ((s->type == STREAM_TYPE_PLAYBACK && idx != s->sink_input->index)
+        || (s->type == STREAM_TYPE_RECORD && idx != s->source_output->index))
+        return;
 
-        if (s->type == STREAM_TYPE_PLAYBACK) {
-            pa_cvolume new_volume;
-            pa_bool_t new_muted = FALSE;
+    if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) != PA_SUBSCRIPTION_EVENT_CHANGE)
+        return;
 
-            pa_sink_input_get_volume(s->sink_input, &new_volume, TRUE);
+    pa_assert(((s->type == STREAM_TYPE_PLAYBACK)
+                && ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SINK_INPUT))
+              || ((s->type == STREAM_TYPE_RECORD)
+                   && ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT)));
 
-            if (!pa_cvolume_equal(&s->volume, &new_volume)) {
-                dbus_uint32_t volume[PA_CHANNELS_MAX];
-                dbus_uint32_t *volume_ptr = volume;
+    if (s->type == STREAM_TYPE_PLAYBACK) {
+        pa_sink *new_sink = s->sink_input->sink;
 
-                s->volume = new_volume;
+        if (s->sink != new_sink) {
+            pa_sink_unref(s->sink);
+            s->sink = pa_sink_ref(new_sink);
 
-                for (i = 0; i < s->volume.channels; ++i)
-                    volume[i] = s->volume.values[i];
+            new_device_path = pa_dbusiface_core_get_sink_path(s->core, new_sink);
 
-                pa_assert_se(signal = dbus_message_new_signal(s->path,
-                                                              PA_DBUSIFACE_STREAM_INTERFACE,
-                                                              signals[SIGNAL_VOLUME_UPDATED].name));
-                pa_assert_se(dbus_message_append_args(signal,
-                                                      DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &volume_ptr, s->volume.channels,
-                                                      DBUS_TYPE_INVALID));
+            pa_assert_se(signal = dbus_message_new_signal(s->path,
+                                                          PA_DBUSIFACE_STREAM_INTERFACE,
+                                                          signals[SIGNAL_DEVICE_UPDATED].name));
+            pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &new_device_path, DBUS_TYPE_INVALID));
 
-                pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
-                dbus_message_unref(signal);
-                signal = NULL;
-            }
+            pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
+            dbus_message_unref(signal);
+            signal = NULL;
+        }
+    } else {
+        pa_source *new_source = s->source_output->source;
 
-            new_muted = pa_sink_input_get_mute(s->sink_input);
+        if (s->source != new_source) {
+            pa_source_unref(s->source);
+            s->source = pa_source_ref(new_source);
 
-            if (s->is_muted != new_muted) {
-                s->is_muted = new_muted;
+            new_device_path = pa_dbusiface_core_get_source_path(s->core, new_source);
 
-                pa_assert_se(signal = dbus_message_new_signal(s->path,
-                                                              PA_DBUSIFACE_STREAM_INTERFACE,
-                                                              signals[SIGNAL_MUTE_UPDATED].name));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_BOOLEAN, &s->is_muted, DBUS_TYPE_INVALID));
+            pa_assert_se(signal = dbus_message_new_signal(s->path,
+                                                          PA_DBUSIFACE_STREAM_INTERFACE,
+                                                          signals[SIGNAL_DEVICE_UPDATED].name));
+            pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &new_device_path, DBUS_TYPE_INVALID));
 
-                pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
-                dbus_message_unref(signal);
-                signal = NULL;
-            }
+            pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
+            dbus_message_unref(signal);
+            signal = NULL;
         }
+    }
+
+    new_sample_rate = (s->type == STREAM_TYPE_PLAYBACK) ? s->sink_input->sample_spec.rate : s->source_output->sample_spec.rate;
+
+    if (s->sample_rate != new_sample_rate) {
+        s->sample_rate = new_sample_rate;
+
+        pa_assert_se(signal = dbus_message_new_signal(s->path,
+                                                      PA_DBUSIFACE_STREAM_INTERFACE,
+                                                      signals[SIGNAL_SAMPLE_RATE_UPDATED].name));
+        pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_UINT32, &s->sample_rate, DBUS_TYPE_INVALID));
+
+        pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
+        dbus_message_unref(signal);
+        signal = NULL;
+    }
+
+    if (s->type == STREAM_TYPE_PLAYBACK) {
+        pa_cvolume new_volume;
+        pa_bool_t new_muted = FALSE;
+
+        pa_sink_input_get_volume(s->sink_input, &new_volume, TRUE);
+
+        if (!pa_cvolume_equal(&s->volume, &new_volume)) {
+            dbus_uint32_t volume[PA_CHANNELS_MAX];
+            dbus_uint32_t *volume_ptr = volume;
+
+            s->volume = new_volume;
+
+            for (i = 0; i < s->volume.channels; ++i)
+                volume[i] = s->volume.values[i];
+
+            pa_assert_se(signal = dbus_message_new_signal(s->path,
+                                                          PA_DBUSIFACE_STREAM_INTERFACE,
+                                                          signals[SIGNAL_VOLUME_UPDATED].name));
+            pa_assert_se(dbus_message_append_args(signal,
+                                                  DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &volume_ptr, s->volume.channels,
+                                                  DBUS_TYPE_INVALID));
 
-        new_proplist = (s->type == STREAM_TYPE_PLAYBACK) ? s->sink_input->proplist : s->source_output->proplist;
+            pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
+            dbus_message_unref(signal);
+            signal = NULL;
+        }
 
-        if (!pa_proplist_equal(s->proplist, new_proplist)) {
-            DBusMessageIter msg_iter;
+        new_muted = pa_sink_input_get_mute(s->sink_input);
 
-            pa_proplist_update(s->proplist, PA_UPDATE_SET, new_proplist);
+        if (s->is_muted != new_muted) {
+            s->is_muted = new_muted;
 
             pa_assert_se(signal = dbus_message_new_signal(s->path,
                                                           PA_DBUSIFACE_STREAM_INTERFACE,
-                                                          signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
-            dbus_message_iter_init_append(signal, &msg_iter);
-            pa_dbus_append_proplist(&msg_iter, s->proplist);
+                                                          signals[SIGNAL_MUTE_UPDATED].name));
+            pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_BOOLEAN, &s->is_muted, DBUS_TYPE_INVALID));
 
             pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
             dbus_message_unref(signal);
             signal = NULL;
         }
     }
+
+    new_proplist = (s->type == STREAM_TYPE_PLAYBACK) ? s->sink_input->proplist : s->source_output->proplist;
+
+    if (!pa_proplist_equal(s->proplist, new_proplist)) {
+        DBusMessageIter msg_iter;
+
+        pa_proplist_update(s->proplist, PA_UPDATE_SET, new_proplist);
+
+        pa_assert_se(signal = dbus_message_new_signal(s->path,
+                                                      PA_DBUSIFACE_STREAM_INTERFACE,
+                                                      signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+        dbus_message_iter_init_append(signal, &msg_iter);
+        pa_dbus_append_proplist(&msg_iter, s->proplist);
+
+        pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
+        dbus_message_unref(signal);
+        signal = NULL;
+    }
+}
+
+static pa_hook_result_t send_event_cb(void *hook_data, void *call_data, void *slot_data) {
+    pa_dbusiface_stream *s = slot_data;
+    DBusMessage *signal = NULL;
+    DBusMessageIter msg_iter;
+    const char *name = NULL;
+    pa_proplist *property_list = NULL;
+
+    pa_assert(call_data);
+    pa_assert(s);
+
+    if (s->type == STREAM_TYPE_PLAYBACK) {
+        pa_sink_input_send_event_hook_data *data = call_data;
+
+        name = data->event;
+        property_list = data->data;
+    } else {
+        pa_source_output_send_event_hook_data *data = call_data;
+
+        name = data->event;
+        property_list = data->data;
+    }
+
+    pa_assert_se(signal = dbus_message_new_signal(s->path,
+                                                  PA_DBUSIFACE_STREAM_INTERFACE,
+                                                  signals[SIGNAL_STREAM_EVENT].name));
+    dbus_message_iter_init_append(signal, &msg_iter);
+    pa_assert_se(dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_STRING, &name));
+    pa_dbus_append_proplist(&msg_iter, property_list);
+
+    pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
+    dbus_message_unref(signal);
+
+    return PA_HOOK_OK;
 }
 
 pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_dbusiface_core *core, pa_sink_input *sink_input) {
@@ -415,14 +815,21 @@ pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_dbusiface_core *core, p
     pa_assert(sink_input);
 
     s = pa_xnew(pa_dbusiface_stream, 1);
+    s->core = core;
     s->sink_input = pa_sink_input_ref(sink_input);
     s->type = STREAM_TYPE_PLAYBACK;
     s->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, PLAYBACK_OBJECT_NAME, sink_input->index);
+    s->sink = pa_sink_ref(sink_input->sink);
+    s->sample_rate = sink_input->sample_spec.rate;
     pa_sink_input_get_volume(sink_input, &s->volume, TRUE);
     s->is_muted = pa_sink_input_get_mute(sink_input);
     s->proplist = pa_proplist_copy(sink_input->proplist);
     s->dbus_protocol = pa_dbus_protocol_get(sink_input->core);
     s->subscription = pa_subscription_new(sink_input->core, PA_SUBSCRIPTION_MASK_SINK_INPUT, subscription_cb, s);
+    s->send_event_slot = pa_hook_connect(&sink_input->core->hooks[PA_CORE_HOOK_SINK_INPUT_SEND_EVENT],
+                                         PA_HOOK_NORMAL,
+                                         send_event_cb,
+                                         s);
 
     pa_assert_se(pa_dbus_protocol_add_interface(s->dbus_protocol, s->path, &stream_interface_info, s) >= 0);
 
@@ -436,14 +843,21 @@ pa_dbusiface_stream *pa_dbusiface_stream_new_record(pa_dbusiface_core *core, pa_
     pa_assert(source_output);
 
     s = pa_xnew(pa_dbusiface_stream, 1);
+    s->core = core;
     s->source_output = pa_source_output_ref(source_output);
     s->type = STREAM_TYPE_RECORD;
     s->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, RECORD_OBJECT_NAME, source_output->index);
+    s->source = pa_source_ref(source_output->source);
+    s->sample_rate = source_output->sample_spec.rate;
     pa_cvolume_init(&s->volume);
     s->is_muted = FALSE;
     s->proplist = pa_proplist_copy(source_output->proplist);
     s->dbus_protocol = pa_dbus_protocol_get(source_output->core);
     s->subscription = pa_subscription_new(source_output->core, PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT, subscription_cb, s);
+    s->send_event_slot = pa_hook_connect(&source_output->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_SEND_EVENT],
+                                         PA_HOOK_NORMAL,
+                                         send_event_cb,
+                                         s);
 
     pa_assert_se(pa_dbus_protocol_add_interface(s->dbus_protocol, s->path, &stream_interface_info, s) >= 0);
 
@@ -455,14 +869,18 @@ void pa_dbusiface_stream_free(pa_dbusiface_stream *s) {
 
     pa_assert_se(pa_dbus_protocol_remove_interface(s->dbus_protocol, s->path, stream_interface_info.name) >= 0);
 
-    if (s->type == STREAM_TYPE_PLAYBACK)
+    if (s->type == STREAM_TYPE_PLAYBACK) {
         pa_sink_input_unref(s->sink_input);
-    else
+        pa_sink_unref(s->sink);
+    } else {
         pa_source_output_unref(s->source_output);
+        pa_source_unref(s->source);
+    }
 
     pa_proplist_free(s->proplist);
     pa_dbus_protocol_unref(s->dbus_protocol);
     pa_subscription_free(s->subscription);
+    pa_hook_slot_free(s->send_event_slot);
 
     pa_xfree(s->path);
     pa_xfree(s);

commit 8e6664f499ff3431ea51c99baf366ef11c5301a5
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Wed Aug 19 09:09:40 2009 +0300

    dbusiface-core: Split some overly long lines.

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index 86a8fc7..946fdcc 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -450,7 +450,8 @@ static void handle_set_default_channels(DBusConnection *conn, DBusMessage *msg,
     }
 
     if (n_channels > PA_CHANNELS_MAX) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too many channels: %u. The maximum number of channels is %u.", n_channels, PA_CHANNELS_MAX);
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
+                           "Too many channels: %u. The maximum number of channels is %u.", n_channels, PA_CHANNELS_MAX);
         return;
     }
 
@@ -627,7 +628,8 @@ static void handle_get_fallback_sink(DBusConnection *conn, DBusMessage *msg, voi
     pa_assert(c);
 
     if (!c->fallback_sink) {
-        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "There are no sinks, and therefore no fallback sink either.");
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                           "There are no sinks, and therefore no fallback sink either.");
         return;
     }
 
@@ -647,7 +649,8 @@ static void handle_set_fallback_sink(DBusConnection *conn, DBusMessage *msg, voi
     pa_assert(c);
 
     if (!c->fallback_sink) {
-        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "There are no sinks, and therefore no fallback sink either.");
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                           "There are no sinks, and therefore no fallback sink either.");
         return;
     }
 
@@ -713,7 +716,8 @@ static void handle_get_fallback_source(DBusConnection *conn, DBusMessage *msg, v
     pa_assert(c);
 
     if (!c->fallback_source) {
-        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "There are no sources, and therefore no fallback source either.");
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                           "There are no sources, and therefore no fallback source either.");
         return;
     }
 
@@ -733,7 +737,8 @@ static void handle_set_fallback_source(DBusConnection *conn, DBusMessage *msg, v
     pa_assert(c);
 
     if (!c->fallback_source) {
-        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "There are no sources, and therefore no fallback source either.");
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                           "There are no sources, and therefore no fallback source either.");
         return;
     }
 
@@ -1037,9 +1042,14 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
     default_sample_rate = c->core->default_sample_spec.rate;
     cards = get_cards(c, &n_cards);
     sinks = get_sinks(c, &n_sinks);
-    fallback_sink = c->fallback_sink ? pa_dbusiface_device_get_path(pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(c->fallback_sink->index))) : NULL;
+    fallback_sink = c->fallback_sink
+                    ? pa_dbusiface_device_get_path(pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(c->fallback_sink->index)))
+                    : NULL;
     sources = get_sources(c, &n_sources);
-    fallback_source = c->fallback_source ? pa_dbusiface_device_get_path(pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(c->fallback_source->index))) : NULL;
+    fallback_source = c->fallback_source
+                      ? pa_dbusiface_device_get_path(pa_hashmap_get(c->sources_by_index,
+                                                                    PA_UINT32_TO_PTR(c->fallback_source->index)))
+                      : NULL;
     playback_streams = get_playback_streams(c, &n_playback_streams);
     record_streams = get_record_streams(c, &n_record_streams);
     samples = get_samples(c, &n_samples);
@@ -1299,7 +1309,8 @@ static void handle_upload_sample(DBusConnection *conn, DBusMessage *msg, void *u
     }
 
     if (n_channels > PA_CHANNELS_MAX) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too many channels.");
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
+                           "Too many channels: %u. The maximum is %u.", n_channels, PA_CHANNELS_MAX);
         goto finish;
     }
 
@@ -1311,7 +1322,8 @@ static void handle_upload_sample(DBusConnection *conn, DBusMessage *msg, void *u
     }
 
     if (n_volume_entries != 0 && n_volume_entries != n_channels) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "The channels and default_volume arguments have different number of elements.");
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
+                           "The channels and default_volume arguments have different number of elements.");
         goto finish;
     }
 
@@ -1337,7 +1349,8 @@ static void handle_upload_sample(DBusConnection *conn, DBusMessage *msg, void *u
     ss.channels = n_channels;
 
     if (!pa_frame_aligned(data_length, &ss)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "The sample length in bytes doesn't align with the sample format and channels.");
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
+                           "The sample length in bytes doesn't align with the sample format and channels.");
         goto finish;
     }
 
@@ -1431,15 +1444,19 @@ static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *use
     arg_type = dbus_message_iter_get_arg_type(&msg_iter);
     if (arg_type != DBUS_TYPE_ARRAY) {
         if (arg_type == DBUS_TYPE_INVALID)
-            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments. A dictionary from strings to strings was expected.");
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
+                               "Too few arguments. A dictionary from strings to strings was expected.");
         else
-            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type: '%c'. An dictionary from strings to strings was expected.", (char) arg_type);
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
+                               "Wrong argument type: '%c'. An dictionary from strings to strings was expected.",
+                               (char) arg_type);
         return;
     }
 
     arg_type = dbus_message_iter_get_element_type(&msg_iter);
     if (arg_type != DBUS_TYPE_DICT_ENTRY) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong array element type: '%c'. A dict entry (string to string) was expected.", (char) arg_type);
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
+                           "Wrong array element type: '%c'. A dict entry (string to string) was expected.", (char) arg_type);
         return;
     }
 
@@ -1455,7 +1472,8 @@ static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *use
 
         arg_type = dbus_message_iter_get_arg_type(&dict_entry_iter);
         if (arg_type != DBUS_TYPE_STRING) {
-            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict key type: '%c'. A string was expected.", (char) arg_type);
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
+                               "Wrong dict key type: '%c'. A string was expected.", (char) arg_type);
             goto finish;
         }
 
@@ -1472,7 +1490,8 @@ static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *use
             if (arg_type == DBUS_TYPE_INVALID)
                 pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Dict value missing.");
             else
-                pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict value type: '%c'. A string was expected.", (char) arg_type);
+                pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
+                                   "Wrong dict value type: '%c'. A string was expected.", (char) arg_type);
             goto finish;
         }
 
@@ -1532,7 +1551,10 @@ static void handle_listen_for_signal(DBusConnection *conn, DBusMessage *msg, voi
 
     dbus_error_init(&error);
 
-    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &signal, DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &objects, &n_objects, DBUS_TYPE_INVALID)) {
+    if (!dbus_message_get_args(msg, &error,
+                               DBUS_TYPE_STRING, &signal,
+                               DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &objects, &n_objects,
+                               DBUS_TYPE_INVALID)) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
         dbus_error_free(&error);
         goto finish;
@@ -1591,10 +1613,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
             if (c->fallback_sink != new_fallback_sink) {
                 c->fallback_sink = new_fallback_sink;
 
-                if (new_fallback_sink && (device = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(new_fallback_sink->index)))) {
+                if (new_fallback_sink
+                    && (device = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(new_fallback_sink->index)))) {
                     object_path = pa_dbusiface_device_get_path(device);
 
-                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
+                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                                   PA_DBUS_CORE_INTERFACE,
+                                                                   signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
                     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
                     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
                     dbus_message_unref(signal);
@@ -1605,10 +1630,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
             if (c->fallback_source != new_fallback_source) {
                 c->fallback_source = new_fallback_source;
 
-                if (new_fallback_source && (device = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(new_fallback_source->index)))) {
+                if (new_fallback_source
+                    && (device = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(new_fallback_source->index)))) {
                     object_path = pa_dbusiface_device_get_path(device);
 
-                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
+                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                                   PA_DBUS_CORE_INTERFACE,
+                                                                   signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
                     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
                     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
                     dbus_message_unref(signal);
@@ -1626,7 +1654,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_card_get_path(card);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_CARD].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                               PA_DBUS_CORE_INTERFACE,
+                                                               signals[SIGNAL_NEW_CARD].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1634,7 +1664,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_card_get_path(card);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_CARD_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                               PA_DBUS_CORE_INTERFACE,
+                                                               signals[SIGNAL_CARD_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_card_free(card);
@@ -1653,7 +1685,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_device_get_path(device);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_SINK].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                               PA_DBUS_CORE_INTERFACE,
+                                                               signals[SIGNAL_NEW_SINK].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1665,7 +1699,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                      * the D-Bus sink object wasn't created yet. Now that the
                      * object is created, let's send the fallback sink change
                      * signal. */
-                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
+                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                                   PA_DBUS_CORE_INTERFACE,
+                                                                   signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
                     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1678,7 +1714,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 object_path = pa_dbusiface_device_get_path(device);
                 pa_assert_se(pa_hashmap_remove(c->sinks_by_path, object_path));
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_SINK_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                               PA_DBUS_CORE_INTERFACE,
+                                                               signals[SIGNAL_SINK_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_device_free(device);
@@ -1697,7 +1735,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_device_get_path(device);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_SOURCE].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                               PA_DBUS_CORE_INTERFACE,
+                                                               signals[SIGNAL_NEW_SOURCE].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1709,7 +1749,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                      * point the D-Bus source object wasn't created yet. Now
                      * that the object is created, let's send the fallback
                      * source change signal. */
-                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
+                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                                   PA_DBUS_CORE_INTERFACE,
+                                                                   signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
                     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1722,7 +1764,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 object_path = pa_dbusiface_device_get_path(device);
                 pa_assert_se(pa_hashmap_remove(c->sources_by_path, object_path));
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_SOURCE_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                               PA_DBUS_CORE_INTERFACE,
+                                                               signals[SIGNAL_SOURCE_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_device_free(device);
@@ -1738,7 +1782,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_stream_get_path(stream);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_PLAYBACK_STREAM].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                               PA_DBUS_CORE_INTERFACE,
+                                                               signals[SIGNAL_NEW_PLAYBACK_STREAM].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1746,7 +1792,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_stream_get_path(stream);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_PLAYBACK_STREAM_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                               PA_DBUS_CORE_INTERFACE,
+                                                               signals[SIGNAL_PLAYBACK_STREAM_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_stream_free(stream);
@@ -1762,7 +1810,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_stream_get_path(stream);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_RECORD_STREAM].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                               PA_DBUS_CORE_INTERFACE,
+                                                               signals[SIGNAL_NEW_RECORD_STREAM].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1770,7 +1820,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_stream_get_path(stream);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_RECORD_STREAM_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                               PA_DBUS_CORE_INTERFACE,
+                                                               signals[SIGNAL_RECORD_STREAM_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_stream_free(stream);
@@ -1786,7 +1838,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_sample_get_path(sample);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_SAMPLE].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                               PA_DBUS_CORE_INTERFACE,
+                                                               signals[SIGNAL_NEW_SAMPLE].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1794,7 +1848,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_sample_get_path(sample);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_SAMPLE_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                               PA_DBUS_CORE_INTERFACE,
+                                                               signals[SIGNAL_SAMPLE_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_sample_free(sample);
@@ -1810,7 +1866,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_module_get_path(module);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_MODULE].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                               PA_DBUS_CORE_INTERFACE,
+                                                               signals[SIGNAL_NEW_MODULE].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1818,7 +1876,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_module_get_path(module);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_MODULE_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                               PA_DBUS_CORE_INTERFACE,
+                                                               signals[SIGNAL_MODULE_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_module_free(module);
@@ -1834,7 +1894,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_client_get_path(client);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_CLIENT].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                               PA_DBUS_CORE_INTERFACE,
+                                                               signals[SIGNAL_NEW_CLIENT].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1842,7 +1904,9 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_client_get_path(client);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_CLIENT_REMOVED].name)));
+                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                               PA_DBUS_CORE_INTERFACE,
+                                                               signals[SIGNAL_CLIENT_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_client_free(client);
@@ -1864,7 +1928,9 @@ static pa_hook_result_t extension_registered_cb(void *hook_data, void *call_data
     pa_assert(c);
     pa_assert(ext_name);
 
-    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_NEW_EXTENSION].name)));
+    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                   PA_DBUS_CORE_INTERFACE,
+                                                   signals[SIGNAL_NEW_EXTENSION].name)));
     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_STRING, &ext_name, DBUS_TYPE_INVALID));
 
     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1881,7 +1947,9 @@ static pa_hook_result_t extension_unregistered_cb(void *hook_data, void *call_da
     pa_assert(c);
     pa_assert(ext_name);
 
-    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH, PA_DBUS_CORE_INTERFACE, signals[SIGNAL_EXTENSION_REMOVED].name)));
+    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                   PA_DBUS_CORE_INTERFACE,
+                                                   signals[SIGNAL_EXTENSION_REMOVED].name)));
     pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_STRING, &ext_name, DBUS_TYPE_INVALID));
 
     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
@@ -1921,8 +1989,16 @@ pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core) {
     c->clients = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
     c->fallback_sink = pa_namereg_get_default_sink(core);
     c->fallback_source = pa_namereg_get_default_source(core);
-    c->extension_registered_slot = pa_dbus_protocol_hook_connect(c->dbus_protocol, PA_DBUS_PROTOCOL_HOOK_EXTENSION_REGISTERED, PA_HOOK_NORMAL, extension_registered_cb, c);
-    c->extension_unregistered_slot = pa_dbus_protocol_hook_connect(c->dbus_protocol, PA_DBUS_PROTOCOL_HOOK_EXTENSION_UNREGISTERED, PA_HOOK_NORMAL, extension_unregistered_cb, c);
+    c->extension_registered_slot = pa_dbus_protocol_hook_connect(c->dbus_protocol,
+                                                                 PA_DBUS_PROTOCOL_HOOK_EXTENSION_REGISTERED,
+                                                                 PA_HOOK_NORMAL,
+                                                                 extension_registered_cb,
+                                                                 c);
+    c->extension_unregistered_slot = pa_dbus_protocol_hook_connect(c->dbus_protocol,
+                                                                   PA_DBUS_PROTOCOL_HOOK_EXTENSION_UNREGISTERED,
+                                                                   PA_HOOK_NORMAL,
+                                                                   extension_unregistered_cb,
+                                                                   c);
     c->memstats = pa_dbusiface_memstats_new(c, core);
 
     for (card = pa_idxset_first(core->cards, &idx); card; card = pa_idxset_next(core->cards, &idx))

commit 636dbc31f9f7acd76402ea01121f327d21315177
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Wed Aug 19 09:10:38 2009 +0300

    dbusiface-core: Use the PA_IDXSET_FOREACH macro.

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index 946fdcc..e0aedbe 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -2001,34 +2001,34 @@ pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core) {
                                                                    c);
     c->memstats = pa_dbusiface_memstats_new(c, core);
 
-    for (card = pa_idxset_first(core->cards, &idx); card; card = pa_idxset_next(core->cards, &idx))
+    PA_IDXSET_FOREACH(card, core->cards, idx)
         pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), pa_dbusiface_card_new(c, card));
 
-    for (sink = pa_idxset_first(core->sinks, &idx); sink; sink = pa_idxset_next(core->sinks, &idx)) {
+    PA_IDXSET_FOREACH(sink, core->sinks, idx) {
         device = pa_dbusiface_device_new_sink(c, sink);
         pa_hashmap_put(c->sinks_by_index, PA_UINT32_TO_PTR(idx), device);
         pa_hashmap_put(c->sinks_by_path, pa_dbusiface_device_get_path(device), device);
     }
 
-    for (source = pa_idxset_first(core->sources, &idx); source; source = pa_idxset_next(core->sources, &idx)) {
+    PA_IDXSET_FOREACH(source, core->sources, idx) {
         device = pa_dbusiface_device_new_source(c, source);
         pa_hashmap_put(c->sources_by_index, PA_UINT32_TO_PTR(idx), device);
         pa_hashmap_put(c->sources_by_path, pa_dbusiface_device_get_path(device), device);
     }
 
-    for (sink_input = pa_idxset_first(core->sink_inputs, &idx); sink_input; sink_input = pa_idxset_next(core->sink_inputs, &idx))
+    PA_IDXSET_FOREACH(sink_input, core->sink_inputs, idx)
         pa_hashmap_put(c->playback_streams, PA_UINT32_TO_PTR(idx), pa_dbusiface_stream_new_playback(c, sink_input));
 
-    for (source_output = pa_idxset_first(core->source_outputs, &idx); source_output; source_output = pa_idxset_next(core->source_outputs, &idx))
+    PA_IDXSET_FOREACH(source_output, core->source_outputs, idx)
         pa_hashmap_put(c->record_streams, PA_UINT32_TO_PTR(idx), pa_dbusiface_stream_new_record(c, source_output));
 
-    for (sample = pa_idxset_first(core->scache, &idx); sample; sample = pa_idxset_next(core->scache, &idx))
+    PA_IDXSET_FOREACH(sample, core->scache, idx)
         pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), pa_dbusiface_sample_new(c, sample));
 
-    for (module = pa_idxset_first(core->modules, &idx); module; module = pa_idxset_next(core->modules, &idx))
+    PA_IDXSET_FOREACH(module, core->modules, idx)
         pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(idx), pa_dbusiface_module_new(c, module));
 
-    for (client = pa_idxset_first(core->clients, &idx); client; client = pa_idxset_next(core->clients, &idx))
+    PA_IDXSET_FOREACH(client, core->clients, idx)
         pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(idx), pa_dbusiface_client_new(c, client));
 
     pa_dbus_protocol_add_interface(c->dbus_protocol, PA_DBUS_CORE_OBJECT_PATH, &core_interface_info, c);

commit 3de210b67120debc680d74e93118a80d360fe1e1
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Wed Aug 19 09:13:59 2009 +0300

    dbusiface-core: Assert that _add/remove_interface calls succeed.

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index e0aedbe..a0694d6 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -2031,7 +2031,7 @@ pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core) {
     PA_IDXSET_FOREACH(client, core->clients, idx)
         pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(idx), pa_dbusiface_client_new(c, client));
 
-    pa_dbus_protocol_add_interface(c->dbus_protocol, PA_DBUS_CORE_OBJECT_PATH, &core_interface_info, c);
+    pa_assert_se(pa_dbus_protocol_add_interface(c->dbus_protocol, PA_DBUS_CORE_OBJECT_PATH, &core_interface_info, c) >= 0);
 
     return c;
 }
@@ -2087,7 +2087,7 @@ static void free_client_cb(void *p, void *userdata) {
 void pa_dbusiface_core_free(pa_dbusiface_core *c) {
     pa_assert(c);
 
-    pa_dbus_protocol_remove_interface(c->dbus_protocol, PA_DBUS_CORE_OBJECT_PATH, core_interface_info.name);
+    pa_assert_se(pa_dbus_protocol_remove_interface(c->dbus_protocol, PA_DBUS_CORE_OBJECT_PATH, core_interface_info.name) >= 0);
 
     pa_subscription_free(c->subscription);
     pa_hashmap_free(c->cards, free_card_cb, NULL);

commit b4e0d5d1e17409557d21dae9a770d1429e17cb15
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Wed Aug 19 09:18:50 2009 +0300

    dbusiface-sample: Implement the Sample D-Bus interface.

diff --git a/src/modules/dbus/iface-sample.c b/src/modules/dbus/iface-sample.c
index 44cfb03..4cffd59 100644
--- a/src/modules/dbus/iface-sample.c
+++ b/src/modules/dbus/iface-sample.c
@@ -24,6 +24,8 @@
 #endif
 
 #include <pulsecore/core-util.h>
+#include <pulsecore/dbus-util.h>
+#include <pulsecore/namereg.h>
 #include <pulsecore/protocol-dbus.h>
 
 #include "iface-sample.h"
@@ -31,19 +33,474 @@
 #define OBJECT_NAME "sample"
 
 struct pa_dbusiface_sample {
+    pa_dbusiface_core *core;
+
     pa_scache_entry *sample;
     char *path;
+    pa_proplist *proplist;
+
+    pa_dbus_protocol *dbus_protocol;
+    pa_subscription *subscription;
+};
+
+static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_default_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_duration(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_bytes(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_play(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_play_to_sink(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_remove(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+enum property_handler_index {
+    PROPERTY_HANDLER_INDEX,
+    PROPERTY_HANDLER_NAME,
+    PROPERTY_HANDLER_SAMPLE_FORMAT,
+    PROPERTY_HANDLER_SAMPLE_RATE,
+    PROPERTY_HANDLER_CHANNELS,
+    PROPERTY_HANDLER_DEFAULT_VOLUME,
+    PROPERTY_HANDLER_DURATION,
+    PROPERTY_HANDLER_BYTES,
+    PROPERTY_HANDLER_PROPERTY_LIST,
+    PROPERTY_HANDLER_MAX
+};
+
+static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
+    [PROPERTY_HANDLER_INDEX]          = { .property_name = "Index",         .type = "u",      .get_cb = handle_get_index,          .set_cb = NULL },
+    [PROPERTY_HANDLER_NAME]           = { .property_name = "Name",          .type = "s",      .get_cb = handle_get_name,           .set_cb = NULL },
+    [PROPERTY_HANDLER_SAMPLE_FORMAT]  = { .property_name = "SampleFormat",  .type = "u",      .get_cb = handle_get_sample_format,  .set_cb = NULL },
+    [PROPERTY_HANDLER_SAMPLE_RATE]    = { .property_name = "SampleRate",    .type = "u",      .get_cb = handle_get_sample_rate,    .set_cb = NULL },
+    [PROPERTY_HANDLER_CHANNELS]       = { .property_name = "Channels",      .type = "au",     .get_cb = handle_get_channels,       .set_cb = NULL },
+    [PROPERTY_HANDLER_DEFAULT_VOLUME] = { .property_name = "DefaultVolume", .type = "au",     .get_cb = handle_get_default_volume, .set_cb = NULL },
+    [PROPERTY_HANDLER_DURATION]       = { .property_name = "Duration",      .type = "t",      .get_cb = handle_get_duration,       .set_cb = NULL },
+    [PROPERTY_HANDLER_BYTES]          = { .property_name = "Bytes",         .type = "u",      .get_cb = handle_get_bytes,          .set_cb = NULL },
+    [PROPERTY_HANDLER_PROPERTY_LIST]  = { .property_name = "PropertyList",  .type = "a{say}", .get_cb = handle_get_property_list,  .set_cb = NULL }
+};
+
+enum method_handler_index {
+    METHOD_HANDLER_PLAY,
+    METHOD_HANDLER_PLAY_TO_SINK,
+    METHOD_HANDLER_REMOVE,
+    METHOD_HANDLER_MAX
+};
+
+static pa_dbus_arg_info play_args[] = { { "volume", "u", "in" }, { "property_list", "a{say}", "in" } };
+static pa_dbus_arg_info play_to_sink_args[] = { { "sink",          "o",      "in" },
+                                                { "volume",        "u",      "in" },
+                                                { "property_list", "a{say}", "in" } };
+
+static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
+    [METHOD_HANDLER_PLAY] = {
+        .method_name = "Play",
+        .arguments = play_args,
+        .n_arguments = sizeof(play_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_play },
+    [METHOD_HANDLER_PLAY_TO_SINK] = {
+        .method_name = "PlayToSink",
+        .arguments = play_to_sink_args,
+        .n_arguments = sizeof(play_to_sink_args) / sizeof(pa_dbus_arg_info),
+        .receive_cb = handle_play_to_sink },
+    [METHOD_HANDLER_REMOVE] = {
+        .method_name = "Remove",
+        .arguments = NULL,
+        .n_arguments = 0,
+        .receive_cb = handle_remove }
+};
+
+enum signal_index {
+    SIGNAL_PROPERTY_LIST_UPDATED,
+    SIGNAL_MAX
+};
+
+static pa_dbus_arg_info property_list_updated_args[] = { { "property_list", "a{say}", NULL } };
+
+static pa_dbus_signal_info signals[SIGNAL_MAX] = {
+    [SIGNAL_PROPERTY_LIST_UPDATED] = { .name = "PropertyListUpdated", .arguments = property_list_updated_args, .n_arguments = 1 }
 };
 
+static pa_dbus_interface_info sample_interface_info = {
+    .name = PA_DBUSIFACE_SAMPLE_INTERFACE,
+    .method_handlers = method_handlers,
+    .n_method_handlers = METHOD_HANDLER_MAX,
+    .property_handlers = property_handlers,
+    .n_property_handlers = PROPERTY_HANDLER_MAX,
+    .get_all_properties_cb = handle_get_all,
+    .signals = signals,
+    .n_signals = SIGNAL_MAX
+};
+
+static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_sample *s = userdata;
+    dbus_uint32_t idx = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    idx = s->sample->index;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &idx);
+}
+
+static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_sample *s = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &s->sample->name);
+}
+
+static void handle_get_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_sample *s = userdata;
+    dbus_uint32_t sample_format = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (!s->sample->memchunk.memblock) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                           "Sample %s isn't loaded into memory yet, so its sample format is unknown.", s->sample->name);
+        return;
+    }
+
+    sample_format = s->sample->sample_spec.format;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &sample_format);
+}
+
+static void handle_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_sample *s = userdata;
+    dbus_uint32_t sample_rate = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (!s->sample->memchunk.memblock) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                           "Sample %s isn't loaded into memory yet, so its sample rate is unknown.", s->sample->name);
+        return;
+    }
+
+    sample_rate = s->sample->sample_spec.rate;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &sample_rate);
+}
+
+static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_sample *s = userdata;
+    dbus_uint32_t channels[PA_CHANNELS_MAX];
+    unsigned i = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (!s->sample->memchunk.memblock) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                           "Sample %s isn't loaded into memory yet, so its channel map is unknown.", s->sample->name);
+        return;
+    }
+
+    for (i = 0; i < s->sample->channel_map.channels; ++i)
+        channels[i] = s->sample->channel_map.map[i];
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_UINT32, channels, s->sample->channel_map.channels);
+}
+
+static void handle_get_default_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_sample *s = userdata;
+    dbus_uint32_t default_volume[PA_CHANNELS_MAX];
+    unsigned i = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (!s->sample->volume_is_set) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                           "Sample %s doesn't have default volume stored.", s->sample->name);
+        return;
+    }
+
+    for (i = 0; i < s->sample->volume.channels; ++i)
+        default_volume[i] = s->sample->volume.values[i];
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_UINT32, default_volume, s->sample->volume.channels);
+}
+
+static void handle_get_duration(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_sample *s = userdata;
+    dbus_uint64_t duration = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (!s->sample->memchunk.memblock) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                           "Sample %s isn't loaded into memory yet, so its duration is unknown.", s->sample->name);
+        return;
+    }
+
+    duration = pa_bytes_to_usec(s->sample->memchunk.length, &s->sample->sample_spec);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT64, &duration);
+}
+
+static void handle_get_bytes(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_sample *s = userdata;
+    dbus_uint32_t bytes = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (!s->sample->memchunk.memblock) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                           "Sample %s isn't loaded into memory yet, so its size is unknown.", s->sample->name);
+        return;
+    }
+
+    bytes = s->sample->memchunk.length;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &bytes);
+}
+
+static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_sample *s = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    pa_dbus_send_proplist_variant_reply(conn, msg, s->proplist);
+}
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_sample *s = userdata;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+    dbus_uint32_t idx = 0;
+    dbus_uint32_t sample_format = 0;
+    dbus_uint32_t sample_rate = 0;
+    dbus_uint32_t channels[PA_CHANNELS_MAX];
+    dbus_uint32_t default_volume[PA_CHANNELS_MAX];
+    dbus_uint64_t duration = 0;
+    dbus_uint32_t bytes = 0;
+    unsigned i = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    idx = s->sample->index;
+    if (s->sample->memchunk.memblock) {
+        sample_format = s->sample->sample_spec.format;
+        sample_rate = s->sample->sample_spec.rate;
+        for (i = 0; i < s->sample->channel_map.channels; ++i)
+            channels[i] = s->sample->channel_map.map[i];
+        duration = pa_bytes_to_usec(s->sample->memchunk.length, &s->sample->sample_spec);
+        bytes = s->sample->memchunk.length;
+    }
+    if (s->sample->volume_is_set) {
+        for (i = 0; i < s->sample->volume.channels; ++i)
+            default_volume[i] = s->sample->volume.values[i];
+    }
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &idx);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &s->sample->name);
+
+    if (s->sample->memchunk.memblock) {
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLE_FORMAT].property_name, DBUS_TYPE_UINT32, &sample_format);
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLE_RATE].property_name, DBUS_TYPE_UINT32, &sample_rate);
+        pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CHANNELS].property_name, DBUS_TYPE_UINT32, channels, s->sample->channel_map.channels);
+    }
+
+    if (s->sample->volume_is_set)
+        pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DEFAULT_VOLUME].property_name, DBUS_TYPE_UINT32, default_volume, s->sample->volume.channels);
+
+    if (s->sample->memchunk.memblock) {
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DURATION].property_name, DBUS_TYPE_UINT64, &duration);
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_BYTES].property_name, DBUS_TYPE_UINT32, &bytes);
+    }
+
+    pa_dbus_append_proplist_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PROPERTY_LIST].property_name, s->proplist);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+    dbus_message_unref(reply);
+}
+
+static void handle_play(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_sample *s = userdata;
+    DBusMessageIter msg_iter;
+    dbus_uint32_t volume = 0;
+    pa_proplist *property_list = NULL;
+    pa_sink *sink = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (!dbus_message_iter_init(msg, &msg_iter)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
+        return;
+    }
+
+    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_UINT32, &volume) < 0)
+        return;
+
+    if (!(property_list = pa_dbus_get_proplist_arg(conn, msg, &msg_iter)))
+        return;
+
+    if (volume > PA_VOLUME_MAX) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid volume.");
+        goto finish;
+    }
+
+    if (!(sink = pa_namereg_get_default_sink(s->sample->core))) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED,
+                           "Can't play sample %s, because there are no sinks available.", s->sample->name);
+        goto finish;
+    }
+
+    if (pa_scache_play_item(s->sample->core, s->sample->name, sink, volume, property_list, NULL) < 0) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Playing sample %s failed.", s->sample->name);
+        goto finish;
+    }
+
+    pa_dbus_send_empty_reply(conn, msg);
+
+finish:
+    if (property_list)
+        pa_proplist_free(property_list);
+}
+
+static void handle_play_to_sink(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_sample *s = userdata;
+    DBusMessageIter msg_iter;
+    const char *sink_path = NULL;
+    dbus_uint32_t volume = 0;
+    pa_proplist *property_list = NULL;
+    pa_sink *sink = NULL;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (!dbus_message_iter_init(msg, &msg_iter)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
+        return;
+    }
+
+    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_OBJECT_PATH, &sink_path) < 0)
+        return;
+
+    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_UINT32, &volume) < 0)
+        return;
+
+    if (!(property_list = pa_dbus_get_proplist_arg(conn, msg, &msg_iter)))
+        return;
+
+    if (!(sink = pa_dbusiface_core_get_sink(s->core, sink_path))) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such sink.", sink_path);
+        goto finish;
+    }
+
+    if (volume > PA_VOLUME_MAX) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid volume.");
+        goto finish;
+    }
+
+    if (pa_scache_play_item(s->sample->core, s->sample->name, sink, volume, property_list, NULL) < 0) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Playing sample %s failed.", s->sample->name);
+        goto finish;
+    }
+
+    pa_dbus_send_empty_reply(conn, msg);
+
+finish:
+    if (property_list)
+        pa_proplist_free(property_list);
+}
+
+static void handle_remove(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_sample *s = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(s);
+
+    if (pa_scache_remove_item(s->sample->core, s->sample->name) < 0) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Removing sample %s failed.", s->sample->name);
+        return;
+    }
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
+    pa_dbusiface_sample *s = userdata;
+    DBusMessage *signal = NULL;
+
+    pa_assert(c);
+    pa_assert(s);
+
+    if (idx != s->sample->index)
+        return;
+
+    if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) != PA_SUBSCRIPTION_EVENT_CHANGE)
+        return;
+
+    if (!pa_proplist_equal(s->proplist, s->sample->proplist)) {
+        DBusMessageIter msg_iter;
+
+        pa_proplist_update(s->proplist, PA_UPDATE_SET, s->sample->proplist);
+
+        pa_assert_se(signal = dbus_message_new_signal(s->path,
+                                                      PA_DBUSIFACE_SAMPLE_INTERFACE,
+                                                      signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+        dbus_message_iter_init_append(signal, &msg_iter);
+        pa_dbus_append_proplist(&msg_iter, s->proplist);
+
+        pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
+        dbus_message_unref(signal);
+        signal = NULL;
+    }
+}
+
 pa_dbusiface_sample *pa_dbusiface_sample_new(pa_dbusiface_core *core, pa_scache_entry *sample) {
-    pa_dbusiface_sample *s;
+    pa_dbusiface_sample *s = NULL;
 
     pa_assert(core);
     pa_assert(sample);
 
-    s = pa_xnew(pa_dbusiface_sample, 1);
+    s = pa_xnew0(pa_dbusiface_sample, 1);
+    s->core = core;
     s->sample = sample;
     s->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, sample->index);
+    s->proplist = pa_proplist_copy(sample->proplist);
+    s->dbus_protocol = pa_dbus_protocol_get(sample->core);
+    s->subscription = pa_subscription_new(sample->core, PA_SUBSCRIPTION_MASK_SAMPLE_CACHE, subscription_cb, s);
+
+    pa_assert_se(pa_dbus_protocol_add_interface(s->dbus_protocol, s->path, &sample_interface_info, s) >= 0);
 
     return s;
 }
@@ -51,6 +508,12 @@ pa_dbusiface_sample *pa_dbusiface_sample_new(pa_dbusiface_core *core, pa_scache_
 void pa_dbusiface_sample_free(pa_dbusiface_sample *s) {
     pa_assert(s);
 
+    pa_assert_se(pa_dbus_protocol_remove_interface(s->dbus_protocol, s->path, sample_interface_info.name) >= 0);
+
+    pa_proplist_free(s->proplist);
+    pa_dbus_protocol_unref(s->dbus_protocol);
+    pa_subscription_free(s->subscription);
+
     pa_xfree(s->path);
     pa_xfree(s);
 }
diff --git a/src/modules/dbus/iface-sample.h b/src/modules/dbus/iface-sample.h
index 1b82648..f1947ce 100644
--- a/src/modules/dbus/iface-sample.h
+++ b/src/modules/dbus/iface-sample.h
@@ -29,9 +29,12 @@
  */
 
 #include <pulsecore/core-scache.h>
+#include <pulsecore/protocol-dbus.h>
 
 #include "iface-core.h"
 
+#define PA_DBUSIFACE_SAMPLE_INTERFACE PA_DBUS_CORE_INTERFACE ".Sample"
+
 typedef struct pa_dbusiface_sample pa_dbusiface_sample;
 
 pa_dbusiface_sample *pa_dbusiface_sample_new(pa_dbusiface_core *core, pa_scache_entry *sample);

commit 292d6dcb5f1568fdc66a813cc464c66571092991
Merge: b4e0d5d f4f16ab
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Wed Aug 19 09:20:02 2009 +0300

    Merge branch 'master' of git://0pointer.de/pulseaudio into dbus-work


commit 179f849c0869982c6fc97d6bbf9083203c586b17
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Wed Aug 19 09:54:09 2009 +0300

    dbusifaca-device: Adapt to the changed pa_sink_get/set_volume() interface.

diff --git a/src/modules/dbus/iface-device.c b/src/modules/dbus/iface-device.c
index 8dc0b2c..8f719bc 100644
--- a/src/modules/dbus/iface-device.c
+++ b/src/modules/dbus/iface-device.c
@@ -444,7 +444,7 @@ static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, void *user
     }
 
     if (d->type == DEVICE_TYPE_SINK)
-        pa_sink_set_volume(d->sink, &new_vol, TRUE, TRUE, TRUE, TRUE);
+        pa_sink_set_volume(d->sink, &new_vol, TRUE, TRUE);
     else
         pa_source_set_volume(d->source, &new_vol, TRUE);
 
@@ -1099,7 +1099,7 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
                    && ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE)));
 
     new_volume = (d->type == DEVICE_TYPE_SINK)
-                 ? pa_sink_get_volume(d->sink, FALSE, FALSE)
+                 ? pa_sink_get_volume(d->sink, FALSE)
                  : pa_source_get_volume(d->source, FALSE);
 
     if (!pa_cvolume_equal(&d->volume, new_volume)) {
@@ -1212,7 +1212,7 @@ pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_dbusiface_core *core, pa_si
     d->sink = pa_sink_ref(sink);
     d->type = DEVICE_TYPE_SINK;
     d->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, SINK_OBJECT_NAME, sink->index);
-    d->volume = *pa_sink_get_volume(sink, FALSE, FALSE);
+    d->volume = *pa_sink_get_volume(sink, FALSE);
     d->is_muted = pa_sink_get_mute(sink, FALSE);
     d->sink_state = pa_sink_get_state(sink);
     d->ports = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);

commit 1e4e26c87fc4f74c9805cc084c88783558acb418
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 24 14:22:32 2009 +0300

    proplist: Return early from pa_proplist_equal() if the pointers are equal.

diff --git a/src/pulse/proplist.c b/src/pulse/proplist.c
index 4f0d6a6..8b5b653 100644
--- a/src/pulse/proplist.c
+++ b/src/pulse/proplist.c
@@ -690,6 +690,9 @@ int pa_proplist_equal(pa_proplist *a, pa_proplist *b) {
     pa_assert(a);
     pa_assert(b);
 
+    if (a == b)
+        return 1;
+
     if (pa_proplist_size(a) != pa_proplist_size(b))
         return 0;
 

commit 187c4f32cffb75787213e8692b27d0a3c736b95e
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 24 14:23:49 2009 +0300

    proplist: A couple of documentation fixes.

diff --git a/src/pulse/proplist.h b/src/pulse/proplist.h
index a585944..9effc86 100644
--- a/src/pulse/proplist.h
+++ b/src/pulse/proplist.h
@@ -337,7 +337,7 @@ char *pa_proplist_to_string_sep(pa_proplist *p, const char *sep);
  * readable string. \since 0.9.15 */
 pa_proplist *pa_proplist_from_string(const char *str);
 
-  /** Returns 1 if an entry for the specified key is existant in the
+/** Returns 1 if an entry for the specified key is existant in the
  * property list. \since 0.9.11 */
 int pa_proplist_contains(pa_proplist *p, const char *key);
 
@@ -354,7 +354,8 @@ unsigned pa_proplist_size(pa_proplist *t);
 /** Returns 0 when the proplist is empty, positive otherwise \since 0.9.15 */
 int pa_proplist_isempty(pa_proplist *t);
 
-/** Return non-zero when a and b have the same keys and values. */
+/** Return non-zero when a and b have the same keys and values.
+ * \since 0.9.16 */
 int pa_proplist_equal(pa_proplist *a, pa_proplist *b);
 
 PA_C_DECL_END

commit 7049b3c5bc351b9ea7ed932baa5bf7ccc1b67347
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 24 14:24:59 2009 +0300

    modargs: New function: pa_modargs_iterate().

diff --git a/src/pulsecore/modargs.c b/src/pulsecore/modargs.c
index c7d734d..e78cdb9 100644
--- a/src/pulsecore/modargs.c
+++ b/src/pulsecore/modargs.c
@@ -415,3 +415,13 @@ int pa_modargs_get_proplist(pa_modargs *ma, const char *name, pa_proplist *p, pa
 
     return 0;
 }
+
+const char *pa_modargs_iterate(pa_modargs *ma, void **state) {
+    pa_hashmap *map = (pa_hashmap*) ma;
+    struct entry *e;
+
+    if (!(e = pa_hashmap_iterate(map, state, NULL)))
+        return NULL;
+
+    return e->key;
+}
diff --git a/src/pulsecore/modargs.h b/src/pulsecore/modargs.h
index b3125b1..1ed66e9 100644
--- a/src/pulsecore/modargs.h
+++ b/src/pulsecore/modargs.h
@@ -60,4 +60,13 @@ int pa_modargs_get_sample_spec_and_channel_map(pa_modargs *ma, pa_sample_spec *s
 
 int pa_modargs_get_proplist(pa_modargs *ma, const char *name, pa_proplist *p, pa_update_mode_t m);
 
+/* Iterate through the module argument list. The user should allocate a
+ * state variable of type void* and initialize it with NULL. A pointer
+ * to this variable should then be passed to pa_modargs_iterate()
+ * which should be called in a loop until it returns NULL which
+ * signifies EOL. On each invication this function will return the
+ * key string for the next entry. The keys in the argument list do not
+ * have any particular order. */
+const char *pa_modargs_iterate(pa_modargs *ma, void **state);
+
 #endif

commit 57886ff34ac39dae709cb50cbc7fbbf817df534b
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 24 14:26:13 2009 +0300

    dbus-protocol: Print a debug line whenever interfaces are unregistered.

diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index cf561c8..d1e19ff 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -694,6 +694,8 @@ int pa_dbus_protocol_remove_interface(pa_dbus_protocol *p, const char* path, con
 
     update_introspection(obj_entry);
 
+    pa_log_debug("Interface %s removed from object %s", iface_entry->name, obj_entry->path);
+
     pa_xfree(iface_entry->name);
     pa_hashmap_free(iface_entry->method_handlers, method_handler_free_cb, NULL);
     pa_hashmap_free(iface_entry->property_handlers, property_handler_free_cb, NULL);

commit 3025645b0b58f476f6404f2aed3b61a633794d10
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 24 14:27:14 2009 +0300

    dbusiface-module: Implement the Module D-Bus interface.

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index a0694d6..9e8f775 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -1509,7 +1509,7 @@ static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *use
         goto finish;
     }
 
-    dbus_module = pa_dbusiface_module_new(c, module);
+    dbus_module = pa_dbusiface_module_new(module);
     pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(module->index), dbus_module);
 
     object_path = pa_dbusiface_module_get_path(dbus_module);
@@ -1860,7 +1860,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
         case PA_SUBSCRIPTION_EVENT_MODULE:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
                 if (!(module = pa_hashmap_get(c->modules, PA_UINT32_TO_PTR(idx)))) {
-                    module = pa_dbusiface_module_new(c, pa_idxset_get_by_index(core->modules, idx));
+                    module = pa_dbusiface_module_new(pa_idxset_get_by_index(core->modules, idx));
                     pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(idx), module);
                 }
 
@@ -2026,7 +2026,7 @@ pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core) {
         pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), pa_dbusiface_sample_new(c, sample));
 
     PA_IDXSET_FOREACH(module, core->modules, idx)
-        pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(idx), pa_dbusiface_module_new(c, module));
+        pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(idx), pa_dbusiface_module_new(module));
 
     PA_IDXSET_FOREACH(client, core->clients, idx)
         pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(idx), pa_dbusiface_client_new(c, client));
diff --git a/src/modules/dbus/iface-module.c b/src/modules/dbus/iface-module.c
index 788d104..63786da 100644
--- a/src/modules/dbus/iface-module.c
+++ b/src/modules/dbus/iface-module.c
@@ -24,6 +24,8 @@
 #endif
 
 #include <pulsecore/core-util.h>
+#include <pulsecore/dbus-util.h>
+#include <pulsecore/modargs.h>
 #include <pulsecore/protocol-dbus.h>
 
 #include "iface-module.h"
@@ -33,17 +35,278 @@
 struct pa_dbusiface_module {
     pa_module *module;
     char *path;
+    pa_proplist *proplist;
+
+    pa_dbus_protocol *dbus_protocol;
+    pa_subscription *subscription;
 };
 
-pa_dbusiface_module *pa_dbusiface_module_new(pa_dbusiface_core *core, pa_module *module) {
-    pa_dbusiface_module *m;
+static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_arguments(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_usage_counter(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+static void handle_unload(DBusConnection *conn, DBusMessage *msg, void *userdata);
+
+enum property_handler_index {
+    PROPERTY_HANDLER_INDEX,
+    PROPERTY_HANDLER_NAME,
+    PROPERTY_HANDLER_ARGUMENTS,
+    PROPERTY_HANDLER_USAGE_COUNTER,
+    PROPERTY_HANDLER_PROPERTY_LIST,
+    PROPERTY_HANDLER_MAX
+};
+
+static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
+    [PROPERTY_HANDLER_INDEX]         = { .property_name = "Index",        .type = "u",      .get_cb = handle_get_index,         .set_cb = NULL },
+    [PROPERTY_HANDLER_NAME]          = { .property_name = "Name",         .type = "s",      .get_cb = handle_get_name,          .set_cb = NULL },
+    [PROPERTY_HANDLER_ARGUMENTS]     = { .property_name = "Arguments",    .type = "a{ss}",  .get_cb = handle_get_arguments,     .set_cb = NULL },
+    [PROPERTY_HANDLER_USAGE_COUNTER] = { .property_name = "UsageCounter", .type = "u",      .get_cb = handle_get_usage_counter, .set_cb = NULL },
+    [PROPERTY_HANDLER_PROPERTY_LIST] = { .property_name = "PropertyList", .type = "a{say}", .get_cb = handle_get_property_list, .set_cb = NULL }
+};
+
+enum method_handler_index {
+    METHOD_HANDLER_UNLOAD,
+    METHOD_HANDLER_MAX
+};
+
+static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
+    [METHOD_HANDLER_UNLOAD] = {
+        .method_name = "Unload",
+        .arguments = NULL,
+        .n_arguments = 0,
+        .receive_cb = handle_unload }
+};
+
+enum signal_index {
+    SIGNAL_PROPERTY_LIST_UPDATED,
+    SIGNAL_MAX
+};
+
+static pa_dbus_arg_info property_list_updated_args[] =  { { "property_list", "a{say}", NULL } };
+
+static pa_dbus_signal_info signals[SIGNAL_MAX] = {
+    [SIGNAL_PROPERTY_LIST_UPDATED] = { .name = "PropertyListUpdated", .arguments = property_list_updated_args, .n_arguments = 1 }
+};
+
+static pa_dbus_interface_info module_interface_info = {
+    .name = PA_DBUSIFACE_MODULE_INTERFACE,
+    .method_handlers = method_handlers,
+    .n_method_handlers = METHOD_HANDLER_MAX,
+    .property_handlers = property_handlers,
+    .n_property_handlers = PROPERTY_HANDLER_MAX,
+    .get_all_properties_cb = handle_get_all,
+    .signals = signals,
+    .n_signals = SIGNAL_MAX
+};
+
+static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_module *m = userdata;
+    dbus_uint32_t idx = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(m);
+
+    idx = m->module->index;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &idx);
+}
+
+static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_module *m = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(m);
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_STRING, &m->module->name);
+}
+
+static void append_modargs_variant(DBusMessageIter *iter, pa_dbusiface_module *m) {
+    pa_modargs *ma = NULL;
+    DBusMessageIter variant_iter;
+    DBusMessageIter dict_iter;
+    DBusMessageIter dict_entry_iter;
+    void *state = NULL;
+    const char *key = NULL;
+    const char *value = NULL;
+
+    pa_assert(iter);
+    pa_assert(m);
+
+    pa_assert_se(ma = pa_modargs_new(m->module->argument, NULL));
+
+    pa_assert_se(dbus_message_iter_open_container(iter, DBUS_TYPE_VARIANT, "a{ss}", &variant_iter));
+    pa_assert_se(dbus_message_iter_open_container(&variant_iter, DBUS_TYPE_ARRAY, "{ss}", &dict_iter));
+
+    for (state = NULL, key = pa_modargs_iterate(ma, &state); key; key = pa_modargs_iterate(ma, &state)) {
+        pa_assert_se(value = pa_modargs_get_value(ma, key, NULL));
+
+        pa_assert_se(dbus_message_iter_open_container(&dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter));
+
+        pa_assert_se(dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &key));
+        pa_assert_se(dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &value));
+
+        pa_assert_se(dbus_message_iter_close_container(&dict_iter, &dict_entry_iter));
+    }
+
+    pa_assert_se(dbus_message_iter_close_container(&variant_iter, &dict_iter));
+    pa_assert_se(dbus_message_iter_close_container(iter, &variant_iter));
+
+    pa_modargs_free(ma);
+}
+
+static void handle_get_arguments(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_module *m = userdata;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(m);
+
+    pa_assert_se(reply = dbus_message_new_method_return(msg));
+    dbus_message_iter_init_append(reply, &msg_iter);
+    append_modargs_variant(&msg_iter, m);
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+    dbus_message_unref(reply);
+}
+
+static void handle_get_usage_counter(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_module *m = userdata;
+    int real_counter_value = -1;
+    dbus_uint32_t usage_counter = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(m);
+
+    if (!m->module->get_n_used || (real_counter_value = m->module->get_n_used(m->module)) < 0) {
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY,
+                           "Module %u (%s) doesn't have a usage counter.", m->module->index, m->module->name);
+        return;
+    }
+
+    usage_counter = real_counter_value;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &usage_counter);
+}
+
+static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_module *m = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(m);
+
+    pa_dbus_send_proplist_variant_reply(conn, msg, m->proplist);
+}
+
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_module *m = userdata;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+    DBusMessageIter dict_iter;
+    DBusMessageIter dict_entry_iter;
+    dbus_uint32_t idx = 0;
+    int real_counter_value = -1;
+    dbus_uint32_t usage_counter = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(m);
+
+    idx = m->module->index;
+    if (m->module->get_n_used && (real_counter_value = m->module->get_n_used(m->module)) >= 0)
+        usage_counter = real_counter_value;
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_INDEX].property_name, DBUS_TYPE_UINT32, &idx);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &m->module->name);
+
+    pa_assert_se(dbus_message_iter_open_container(&dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &dict_entry_iter));
+    pa_assert_se(dbus_message_iter_append_basic(&dict_entry_iter, DBUS_TYPE_STRING, &property_handlers[PROPERTY_HANDLER_ARGUMENTS].property_name));
+    append_modargs_variant(&dict_entry_iter, m);
+    pa_assert_se(dbus_message_iter_close_container(&dict_iter, &dict_entry_iter));
+
+    if (real_counter_value >= 0)
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_ARGUMENTS].property_name, DBUS_TYPE_UINT32, &usage_counter);
+
+    pa_dbus_append_proplist_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PROPERTY_LIST].property_name, m->proplist);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+
+    dbus_message_unref(reply);
+}
+
+static void handle_unload(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_module *m = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(m);
+
+    if (m->module->core->disallow_module_loading) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_ACCESS_DENIED, "The server is configured to disallow module unloading.");
+        return;
+    }
+
+    pa_module_unload_request(m->module, FALSE);
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
+    pa_dbusiface_module *m = userdata;
 
     pa_assert(core);
+    pa_assert((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_MODULE);
+    pa_assert(m);
+
+    if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_CHANGE) {
+        DBusMessage *signal = NULL;
+
+        if (!pa_proplist_equal(m->proplist, m->module->proplist)) {
+            DBusMessageIter msg_iter;
+
+            pa_proplist_update(m->proplist, PA_UPDATE_SET, m->module->proplist);
+
+            pa_assert_se(signal = dbus_message_new_signal(m->path,
+                                                          PA_DBUSIFACE_MODULE_INTERFACE,
+                                                          signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+            dbus_message_iter_init_append(signal, &msg_iter);
+            pa_dbus_append_proplist(&msg_iter, m->proplist);
+
+            pa_dbus_protocol_send_signal(m->dbus_protocol, signal);
+            dbus_message_unref(signal);
+            signal = NULL;
+        }
+    }
+}
+
+pa_dbusiface_module *pa_dbusiface_module_new(pa_module *module) {
+    pa_dbusiface_module *m;
+
     pa_assert(module);
 
-    m = pa_xnew(pa_dbusiface_module, 1);
+    m = pa_xnew0(pa_dbusiface_module, 1);
     m->module = module;
     m->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, module->index);
+    m->proplist = pa_proplist_copy(module->proplist);
+    m->dbus_protocol = pa_dbus_protocol_get(module->core);
+    m->subscription = pa_subscription_new(module->core, PA_SUBSCRIPTION_MASK_MODULE, subscription_cb, m);
+
+    pa_assert_se(pa_dbus_protocol_add_interface(m->dbus_protocol, m->path, &module_interface_info, m) >= 0);
 
     return m;
 }
@@ -51,6 +314,12 @@ pa_dbusiface_module *pa_dbusiface_module_new(pa_dbusiface_core *core, pa_module
 void pa_dbusiface_module_free(pa_dbusiface_module *m) {
     pa_assert(m);
 
+    pa_assert_se(pa_dbus_protocol_remove_interface(m->dbus_protocol, m->path, module_interface_info.name) >= 0);
+
+    pa_proplist_free(m->proplist);
+    pa_dbus_protocol_unref(m->dbus_protocol);
+    pa_subscription_free(m->subscription);
+
     pa_xfree(m->path);
     pa_xfree(m);
 }
diff --git a/src/modules/dbus/iface-module.h b/src/modules/dbus/iface-module.h
index c4f2921..68ca1de 100644
--- a/src/modules/dbus/iface-module.h
+++ b/src/modules/dbus/iface-module.h
@@ -29,12 +29,15 @@
  */
 
 #include <pulsecore/module.h>
+#include <pulsecore/protocol-dbus.h>
 
 #include "iface-core.h"
 
+#define PA_DBUSIFACE_MODULE_INTERFACE PA_DBUS_CORE_INTERFACE ".Module"
+
 typedef struct pa_dbusiface_module pa_dbusiface_module;
 
-pa_dbusiface_module *pa_dbusiface_module_new(pa_dbusiface_core *core, pa_module *module);
+pa_dbusiface_module *pa_dbusiface_module_new(pa_module *module);
 void pa_dbusiface_module_free(pa_dbusiface_module *m);
 
 const char *pa_dbusiface_module_get_path(pa_dbusiface_module *m);

commit 2f3fc2f1d6ba418303a4bab6f8fd3caed7d291b4
Merge: 3025645 be46eaa
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 24 14:43:11 2009 +0300

    Merge branch 'master' of git://0pointer.de/pulseaudio into dbus-work
    
    Conflicts:
    	src/Makefile.am

diff --cc src/pulsecore/cpu-arm.h
index b00a16a,3ccd070..a87cb63
--- a/src/pulsecore/cpu-arm.h
+++ b/src/pulsecore/cpu-arm.h
@@@ -5,7 -5,7 +5,7 @@@
    This file is part of PulseAudio.
  
    Copyright 2004-2006 Lennart Poettering
-   Copyright 2006 Pierre Ossman <ossman at cendio.se> for Cendio AB
 -  Copyright 2009 Wim Taymans <wim.taymans at collabora.co.uk> 
++  Copyright 2009 Wim Taymans <wim.taymans at collabora.co.uk>
  
    PulseAudio is free software; you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published
diff --cc src/pulsecore/cpu-x86.h
index 0000000,b11ef6e..f3f9e56
mode 000000,100644..100644
--- a/src/pulsecore/cpu-x86.h
+++ b/src/pulsecore/cpu-x86.h
@@@ -1,0 -1,68 +1,68 @@@
+ #ifndef foocpux86hfoo
+ #define foocpux86hfoo
+ 
+ /***
+   This file is part of PulseAudio.
+ 
+   Copyright 2004-2006 Lennart Poettering
 -  Copyright 2009 Wim Taymans <wim.taymans at collabora.co.uk> 
++  Copyright 2009 Wim Taymans <wim.taymans at collabora.co.uk>
+ 
+   PulseAudio is free software; you can redistribute it and/or modify
+   it under the terms of the GNU Lesser General Public License as published
+   by the Free Software Foundation; either version 2.1 of the License,
+   or (at your option) any later version.
+ 
+   PulseAudio is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+   General Public License for more details.
+ 
+   You should have received a copy of the GNU Lesser General Public License
+   along with PulseAudio; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+   USA.
+ ***/
+ 
+ #include <stdint.h>
+ 
+ typedef enum pa_cpu_x86_flag {
+     PA_CPU_X86_MMX       = (1 << 0),
+     PA_CPU_X86_MMXEXT    = (1 << 1),
+     PA_CPU_X86_SSE       = (1 << 2),
+     PA_CPU_X86_SSE2      = (1 << 3),
+     PA_CPU_X86_SSE3      = (1 << 4),
+     PA_CPU_X86_SSSE3     = (1 << 5),
+     PA_CPU_X86_SSE4_1    = (1 << 6),
+     PA_CPU_X86_SSE4_2    = (1 << 7),
+     PA_CPU_X86_3DNOW     = (1 << 8),
+     PA_CPU_X86_3DNOWEXT  = (1 << 9)
+ } pa_cpu_x86_flag_t;
+ 
+ void pa_cpu_init_x86 (void);
+ 
+ 
+ #if defined (__i386__)
+ typedef int32_t pa_reg_x86;
+ #define PA_REG_a "eax"
+ #define PA_REG_b "ebx"
+ #define PA_REG_c "ecx"
+ #define PA_REG_d "edx"
+ #define PA_REG_D "edi"
+ #define PA_REG_S "esi"
+ #elif defined (__amd64__)
+ typedef int64_t pa_reg_x86;
+ #define PA_REG_a "rax"
+ #define PA_REG_b "rbx"
+ #define PA_REG_c "rcx"
+ #define PA_REG_d "rdx"
+ #define PA_REG_D "rdi"
+ #define PA_REG_S "rsi"
+ #endif
+ 
+ /* some optimized functions */
+ void pa_volume_func_init_mmx(pa_cpu_x86_flag_t flags);
+ void pa_volume_func_init_sse(pa_cpu_x86_flag_t flags);
+ 
+ void pa_remap_func_init_mmx(pa_cpu_x86_flag_t flags);
+ 
+ #endif /* foocpux86hfoo */

commit 3e0e685a8c6372fb67efad5ffa54583dc757203e
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Wed Aug 26 14:12:42 2009 +0300

    dbus: Save one level of identation by returning early.

diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card.c
index 5a79794..fce44ff 100644
--- a/src/modules/dbus/iface-card.c
+++ b/src/modules/dbus/iface-card.c
@@ -459,45 +459,46 @@ static void handle_get_profile_by_name(DBusConnection *conn, DBusMessage *msg, v
 
 static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
     pa_dbusiface_card *c = userdata;
+    DBusMessage *signal = NULL;
 
     pa_assert(core);
     pa_assert((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_CARD);
     pa_assert(c);
 
-    if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_CHANGE) {
-        DBusMessage *signal = NULL;
 
-        if (c->active_profile != c->card->active_profile) {
-            const char *object_path;
+    if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) != PA_SUBSCRIPTION_EVENT_CHANGE)
+        return;
 
-            c->active_profile = c->card->active_profile;
-            object_path = pa_dbusiface_card_profile_get_path(pa_hashmap_get(c->profiles, c->active_profile->name));
+    if (c->active_profile != c->card->active_profile) {
+        const char *object_path;
 
-            pa_assert_se(signal = dbus_message_new_signal(c->path,
-                                                          PA_DBUSIFACE_CARD_INTERFACE,
-                                                          signals[SIGNAL_ACTIVE_PROFILE_UPDATED].name));
-            pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+        c->active_profile = c->card->active_profile;
+        object_path = pa_dbusiface_card_profile_get_path(pa_hashmap_get(c->profiles, c->active_profile->name));
 
-            pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
-            dbus_message_unref(signal);
-            signal = NULL;
-        }
+        pa_assert_se(signal = dbus_message_new_signal(c->path,
+                                                      PA_DBUSIFACE_CARD_INTERFACE,
+                                                      signals[SIGNAL_ACTIVE_PROFILE_UPDATED].name));
+        pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
-        if (!pa_proplist_equal(c->proplist, c->card->proplist)) {
-            DBusMessageIter msg_iter;
+        pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
+        dbus_message_unref(signal);
+        signal = NULL;
+    }
 
-            pa_proplist_update(c->proplist, PA_UPDATE_SET, c->card->proplist);
+    if (!pa_proplist_equal(c->proplist, c->card->proplist)) {
+        DBusMessageIter msg_iter;
 
-            pa_assert_se(signal = dbus_message_new_signal(c->path,
-                                                          PA_DBUSIFACE_CARD_INTERFACE,
-                                                          signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
-            dbus_message_iter_init_append(signal, &msg_iter);
-            pa_dbus_append_proplist(&msg_iter, c->proplist);
+        pa_proplist_update(c->proplist, PA_UPDATE_SET, c->card->proplist);
 
-            pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
-            dbus_message_unref(signal);
-            signal = NULL;
-        }
+        pa_assert_se(signal = dbus_message_new_signal(c->path,
+                                                      PA_DBUSIFACE_CARD_INTERFACE,
+                                                      signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+        dbus_message_iter_init_append(signal, &msg_iter);
+        pa_dbus_append_proplist(&msg_iter, c->proplist);
+
+        pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
+        dbus_message_unref(signal);
+        signal = NULL;
     }
 }
 
diff --git a/src/modules/dbus/iface-module.c b/src/modules/dbus/iface-module.c
index 63786da..e3882fc 100644
--- a/src/modules/dbus/iface-module.c
+++ b/src/modules/dbus/iface-module.c
@@ -268,29 +268,29 @@ static void handle_unload(DBusConnection *conn, DBusMessage *msg, void *userdata
 
 static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
     pa_dbusiface_module *m = userdata;
+    DBusMessage *signal = NULL;
 
     pa_assert(core);
     pa_assert((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_MODULE);
     pa_assert(m);
 
-    if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_CHANGE) {
-        DBusMessage *signal = NULL;
+    if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) != PA_SUBSCRIPTION_EVENT_CHANGE)
+        return;
 
-        if (!pa_proplist_equal(m->proplist, m->module->proplist)) {
-            DBusMessageIter msg_iter;
+    if (!pa_proplist_equal(m->proplist, m->module->proplist)) {
+        DBusMessageIter msg_iter;
 
-            pa_proplist_update(m->proplist, PA_UPDATE_SET, m->module->proplist);
+        pa_proplist_update(m->proplist, PA_UPDATE_SET, m->module->proplist);
 
-            pa_assert_se(signal = dbus_message_new_signal(m->path,
-                                                          PA_DBUSIFACE_MODULE_INTERFACE,
-                                                          signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
-            dbus_message_iter_init_append(signal, &msg_iter);
-            pa_dbus_append_proplist(&msg_iter, m->proplist);
+        pa_assert_se(signal = dbus_message_new_signal(m->path,
+                                                      PA_DBUSIFACE_MODULE_INTERFACE,
+                                                      signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+        dbus_message_iter_init_append(signal, &msg_iter);
+        pa_dbus_append_proplist(&msg_iter, m->proplist);
 
-            pa_dbus_protocol_send_signal(m->dbus_protocol, signal);
-            dbus_message_unref(signal);
-            signal = NULL;
-        }
+        pa_dbus_protocol_send_signal(m->dbus_protocol, signal);
+        dbus_message_unref(signal);
+        signal = NULL;
     }
 }
 

commit edf80104e32830a3d4ec58f88f9a092c32203d8a
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Wed Aug 26 14:17:35 2009 +0300

    dbus: Make sure that subscription callbacks don't try to access removed objects.

diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card.c
index fce44ff..7e37f8b 100644
--- a/src/modules/dbus/iface-card.c
+++ b/src/modules/dbus/iface-card.c
@@ -465,6 +465,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
     pa_assert((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_CARD);
     pa_assert(c);
 
+    /* We can't use idx != c->card->index, because the c->card pointer may
+     * be stale at this point. */
+    if (pa_idxset_get_by_index(core->cards, idx) != c->card)
+        return;
 
     if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) != PA_SUBSCRIPTION_EVENT_CHANGE)
         return;
diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index 9e8f775..c54a3b7 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -1592,12 +1592,12 @@ static void handle_stop_listening_for_signal(DBusConnection *conn, DBusMessage *
 
 static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
     pa_dbusiface_core *c = userdata;
-    pa_dbusiface_card *card = NULL;
-    pa_dbusiface_device *device = NULL;
-    pa_dbusiface_stream *stream = NULL;
-    pa_dbusiface_sample *sample = NULL;
-    pa_dbusiface_module *module = NULL;
-    pa_dbusiface_client *client = NULL;
+    pa_dbusiface_card *card_iface = NULL;
+    pa_dbusiface_device *device_iface = NULL;
+    pa_dbusiface_stream *stream_iface = NULL;
+    pa_dbusiface_sample *sample_iface = NULL;
+    pa_dbusiface_module *module_iface = NULL;
+    pa_dbusiface_client *client_iface = NULL;
     DBusMessage *signal = NULL;
     const char *object_path = NULL;
     pa_sink *new_fallback_sink = NULL;
@@ -1611,11 +1611,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
             new_fallback_source = pa_namereg_get_default_source(core);
 
             if (c->fallback_sink != new_fallback_sink) {
-                c->fallback_sink = new_fallback_sink;
+                if (c->fallback_sink)
+                    pa_sink_unref(c->fallback_sink);
+                c->fallback_sink = new_fallback_sink ? pa_sink_ref(new_fallback_sink) : NULL;
 
                 if (new_fallback_sink
-                    && (device = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(new_fallback_sink->index)))) {
-                    object_path = pa_dbusiface_device_get_path(device);
+                    && (device_iface = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(new_fallback_sink->index)))) {
+                    object_path = pa_dbusiface_device_get_path(device_iface);
 
                     pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
                                                                    PA_DBUS_CORE_INTERFACE,
@@ -1628,11 +1630,13 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
             }
 
             if (c->fallback_source != new_fallback_source) {
-                c->fallback_source = new_fallback_source;
+                if (c->fallback_source)
+                    pa_source_unref(c->fallback_source);
+                c->fallback_source = new_fallback_source ? pa_source_ref(new_fallback_source) : NULL;
 
                 if (new_fallback_source
-                    && (device = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(new_fallback_source->index)))) {
-                    object_path = pa_dbusiface_device_get_path(device);
+                    && (device_iface = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(new_fallback_source->index)))) {
+                    object_path = pa_dbusiface_device_get_path(device_iface);
 
                     pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
                                                                    PA_DBUS_CORE_INTERFACE,
@@ -1647,12 +1651,17 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
         case PA_SUBSCRIPTION_EVENT_CARD:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
-                if (!(card = pa_hashmap_get(c->cards, PA_UINT32_TO_PTR(idx)))) {
-                    card = pa_dbusiface_card_new(c, pa_idxset_get_by_index(core->cards, idx));
-                    pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), card);
+                if (!(card_iface = pa_hashmap_get(c->cards, PA_UINT32_TO_PTR(idx)))) {
+                    pa_card *card = NULL;
+
+                    if (!(card = pa_idxset_get_by_index(core->cards, idx)))
+                        return; /* The card was removed immediately after creation. */
+
+                    card_iface = pa_dbusiface_card_new(c, card);
+                    pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), card_iface);
                 }
 
-                object_path = pa_dbusiface_card_get_path(card);
+                object_path = pa_dbusiface_card_get_path(card_iface);
 
                 pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
                                                                PA_DBUS_CORE_INTERFACE,
@@ -1660,30 +1669,34 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
-                pa_assert_se((card = pa_hashmap_remove(c->cards, PA_UINT32_TO_PTR(idx))));
+                if (!(card_iface = pa_hashmap_remove(c->cards, PA_UINT32_TO_PTR(idx))))
+                    return;
 
-                object_path = pa_dbusiface_card_get_path(card);
+                object_path = pa_dbusiface_card_get_path(card_iface);
 
                 pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
                                                                PA_DBUS_CORE_INTERFACE,
                                                                signals[SIGNAL_CARD_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
-                pa_dbusiface_card_free(card);
+                pa_dbusiface_card_free(card_iface);
             }
             break;
 
         case PA_SUBSCRIPTION_EVENT_SINK:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
-                pa_sink *sink = pa_idxset_get_by_index(core->sinks, idx);
+                pa_sink *sink = NULL;
 
-                if (!(device = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(idx)))) {
-                    device = pa_dbusiface_device_new_sink(c, sink);
-                    pa_hashmap_put(c->sinks_by_index, PA_UINT32_TO_PTR(idx), device);
-                    pa_hashmap_put(c->sinks_by_path, pa_dbusiface_device_get_path(device), device);
+                if (!(sink = pa_idxset_get_by_index(core->sinks, idx)))
+                    return; /* The sink was removed immediately after creation. */
+
+                if (!(device_iface = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(idx)))) {
+                    device_iface = pa_dbusiface_device_new_sink(c, sink);
+                    pa_hashmap_put(c->sinks_by_index, PA_UINT32_TO_PTR(idx), device_iface);
+                    pa_hashmap_put(c->sinks_by_path, pa_dbusiface_device_get_path(device_iface), device_iface);
                 }
 
-                object_path = pa_dbusiface_device_get_path(device);
+                object_path = pa_dbusiface_device_get_path(device_iface);
 
                 pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
                                                                PA_DBUS_CORE_INTERFACE,
@@ -1710,8 +1723,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 }
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
-                pa_assert_se((device = pa_hashmap_remove(c->sinks_by_index, PA_UINT32_TO_PTR(idx))));
-                object_path = pa_dbusiface_device_get_path(device);
+                if (!(device_iface = pa_hashmap_remove(c->sinks_by_index, PA_UINT32_TO_PTR(idx))))
+                    return;
+
+                object_path = pa_dbusiface_device_get_path(device_iface);
                 pa_assert_se(pa_hashmap_remove(c->sinks_by_path, object_path));
 
                 pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
@@ -1719,7 +1734,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                                                                signals[SIGNAL_SINK_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
-                pa_dbusiface_device_free(device);
+                pa_dbusiface_device_free(device_iface);
             }
             break;
 
@@ -1727,13 +1742,16 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
                 pa_source *source = pa_idxset_get_by_index(core->sources, idx);
 
-                if (!(device = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(idx)))) {
-                    device = pa_dbusiface_device_new_source(c, source);
-                    pa_hashmap_put(c->sources_by_index, PA_UINT32_TO_PTR(idx), device);
-                    pa_hashmap_put(c->sources_by_path, pa_dbusiface_device_get_path(device), device);
+                if (!(source = pa_idxset_get_by_index(core->sources, idx)))
+                    return; /* The source was removed immediately after creation. */
+
+                if (!(device_iface = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(idx)))) {
+                    device_iface = pa_dbusiface_device_new_source(c, source);
+                    pa_hashmap_put(c->sources_by_index, PA_UINT32_TO_PTR(idx), device_iface);
+                    pa_hashmap_put(c->sources_by_path, pa_dbusiface_device_get_path(device_iface), device_iface);
                 }
 
-                object_path = pa_dbusiface_device_get_path(device);
+                object_path = pa_dbusiface_device_get_path(device_iface);
 
                 pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
                                                                PA_DBUS_CORE_INTERFACE,
@@ -1760,8 +1778,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 }
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
-                pa_assert_se((device = pa_hashmap_remove(c->sources_by_index, PA_UINT32_TO_PTR(idx))));
-                object_path = pa_dbusiface_device_get_path(device);
+                if (!(device_iface = pa_hashmap_remove(c->sources_by_index, PA_UINT32_TO_PTR(idx))))
+                    return;
+
+                object_path = pa_dbusiface_device_get_path(device_iface);
                 pa_assert_se(pa_hashmap_remove(c->sources_by_path, object_path));
 
                 pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
@@ -1769,18 +1789,23 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                                                                signals[SIGNAL_SOURCE_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
-                pa_dbusiface_device_free(device);
+                pa_dbusiface_device_free(device_iface);
             }
             break;
 
         case PA_SUBSCRIPTION_EVENT_SINK_INPUT:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
-                if (!(stream = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(idx)))) {
-                    stream = pa_dbusiface_stream_new_playback(c, pa_idxset_get_by_index(core->sink_inputs, idx));
-                    pa_hashmap_put(c->playback_streams, PA_UINT32_TO_PTR(idx), stream);
+                pa_sink_input *sink_input = NULL;
+
+                if (!(sink_input = pa_idxset_get_by_index(core->sink_inputs, idx)))
+                    return; /* The sink input was removed immediately after creation. */
+
+                if (!(stream_iface = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(idx)))) {
+                    stream_iface = pa_dbusiface_stream_new_playback(c, sink_input);
+                    pa_hashmap_put(c->playback_streams, PA_UINT32_TO_PTR(idx), stream_iface);
                 }
 
-                object_path = pa_dbusiface_stream_get_path(stream);
+                object_path = pa_dbusiface_stream_get_path(stream_iface);
 
                 pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
                                                                PA_DBUS_CORE_INTERFACE,
@@ -1788,27 +1813,33 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
-                pa_assert_se((stream = pa_hashmap_remove(c->playback_streams, PA_UINT32_TO_PTR(idx))));
+                if (!(stream_iface = pa_hashmap_remove(c->playback_streams, PA_UINT32_TO_PTR(idx))))
+                    return;
 
-                object_path = pa_dbusiface_stream_get_path(stream);
+                object_path = pa_dbusiface_stream_get_path(stream_iface);
 
                 pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
                                                                PA_DBUS_CORE_INTERFACE,
                                                                signals[SIGNAL_PLAYBACK_STREAM_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
-                pa_dbusiface_stream_free(stream);
+                pa_dbusiface_stream_free(stream_iface);
             }
             break;
 
         case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
-                if (!(stream = pa_hashmap_get(c->record_streams, PA_UINT32_TO_PTR(idx)))) {
-                    stream = pa_dbusiface_stream_new_record(c, pa_idxset_get_by_index(core->source_outputs, idx));
-                    pa_hashmap_put(c->record_streams, PA_UINT32_TO_PTR(idx), stream);
+                pa_source_output *source_output = NULL;
+
+                if (!(source_output = pa_idxset_get_by_index(core->source_outputs, idx)))
+                    return; /* The source output was removed immediately after creation. */
+
+                if (!(stream_iface = pa_hashmap_get(c->record_streams, PA_UINT32_TO_PTR(idx)))) {
+                    stream_iface = pa_dbusiface_stream_new_record(c, source_output);
+                    pa_hashmap_put(c->record_streams, PA_UINT32_TO_PTR(idx), stream_iface);
                 }
 
-                object_path = pa_dbusiface_stream_get_path(stream);
+                object_path = pa_dbusiface_stream_get_path(stream_iface);
 
                 pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
                                                                PA_DBUS_CORE_INTERFACE,
@@ -1816,27 +1847,33 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
-                pa_assert_se((stream = pa_hashmap_remove(c->record_streams, PA_UINT32_TO_PTR(idx))));
+                if (!(stream_iface = pa_hashmap_remove(c->record_streams, PA_UINT32_TO_PTR(idx))))
+                    return;
 
-                object_path = pa_dbusiface_stream_get_path(stream);
+                object_path = pa_dbusiface_stream_get_path(stream_iface);
 
                 pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
                                                                PA_DBUS_CORE_INTERFACE,
                                                                signals[SIGNAL_RECORD_STREAM_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
-                pa_dbusiface_stream_free(stream);
+                pa_dbusiface_stream_free(stream_iface);
             }
             break;
 
         case PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
-                if (!(sample = pa_hashmap_get(c->samples, PA_UINT32_TO_PTR(idx)))) {
-                    sample = pa_dbusiface_sample_new(c, pa_idxset_get_by_index(core->scache, idx));
-                    pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), sample);
+                pa_scache_entry *sample = NULL;
+
+                if (!(sample = pa_idxset_get_by_index(core->scache, idx)))
+                    return; /* The sample was removed immediately after creation. */
+
+                if (!(sample_iface = pa_hashmap_get(c->samples, PA_UINT32_TO_PTR(idx)))) {
+                    sample_iface = pa_dbusiface_sample_new(c, sample);
+                    pa_hashmap_put(c->samples, PA_UINT32_TO_PTR(idx), sample_iface);
                 }
 
-                object_path = pa_dbusiface_sample_get_path(sample);
+                object_path = pa_dbusiface_sample_get_path(sample_iface);
 
                 pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
                                                                PA_DBUS_CORE_INTERFACE,
@@ -1844,27 +1881,33 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
-                pa_assert_se((sample = pa_hashmap_remove(c->samples, PA_UINT32_TO_PTR(idx))));
+                if (!(sample_iface = pa_hashmap_remove(c->samples, PA_UINT32_TO_PTR(idx))))
+                    return;
 
-                object_path = pa_dbusiface_sample_get_path(sample);
+                object_path = pa_dbusiface_sample_get_path(sample_iface);
 
                 pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
                                                                PA_DBUS_CORE_INTERFACE,
                                                                signals[SIGNAL_SAMPLE_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
-                pa_dbusiface_sample_free(sample);
+                pa_dbusiface_sample_free(sample_iface);
             }
             break;
 
         case PA_SUBSCRIPTION_EVENT_MODULE:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
-                if (!(module = pa_hashmap_get(c->modules, PA_UINT32_TO_PTR(idx)))) {
-                    module = pa_dbusiface_module_new(pa_idxset_get_by_index(core->modules, idx));
-                    pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(idx), module);
+                pa_module *module = NULL;
+
+                if (!(module = pa_idxset_get_by_index(core->modules, idx)))
+                    return; /* The module was removed immediately after creation. */
+
+                if (!(module_iface = pa_hashmap_get(c->modules, PA_UINT32_TO_PTR(idx)))) {
+                    module_iface = pa_dbusiface_module_new(module);
+                    pa_hashmap_put(c->modules, PA_UINT32_TO_PTR(idx), module_iface);
                 }
 
-                object_path = pa_dbusiface_module_get_path(module);
+                object_path = pa_dbusiface_module_get_path(module_iface);
 
                 pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
                                                                PA_DBUS_CORE_INTERFACE,
@@ -1872,27 +1915,33 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
-                pa_assert_se((module = pa_hashmap_remove(c->modules, PA_UINT32_TO_PTR(idx))));
+                if (!(module_iface = pa_hashmap_remove(c->modules, PA_UINT32_TO_PTR(idx))))
+                    return;
 
-                object_path = pa_dbusiface_module_get_path(module);
+                object_path = pa_dbusiface_module_get_path(module_iface);
 
                 pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
                                                                PA_DBUS_CORE_INTERFACE,
                                                                signals[SIGNAL_MODULE_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
-                pa_dbusiface_module_free(module);
+                pa_dbusiface_module_free(module_iface);
             }
             break;
 
         case PA_SUBSCRIPTION_EVENT_CLIENT:
             if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
-                if (!(client = pa_hashmap_get(c->clients, PA_UINT32_TO_PTR(idx)))) {
-                    client = pa_dbusiface_client_new(c, pa_idxset_get_by_index(core->clients, idx));
-                    pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(idx), client);
+                pa_client *client = NULL;
+
+                if (!(client = pa_idxset_get_by_index(core->clients, idx)))
+                    return; /* The client was removed immediately after creation. */
+
+                if (!(client_iface = pa_hashmap_get(c->clients, PA_UINT32_TO_PTR(idx)))) {
+                    client_iface = pa_dbusiface_client_new(c, client);
+                    pa_hashmap_put(c->clients, PA_UINT32_TO_PTR(idx), client_iface);
                 }
 
-                object_path = pa_dbusiface_client_get_path(client);
+                object_path = pa_dbusiface_client_get_path(client_iface);
 
                 pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
                                                                PA_DBUS_CORE_INTERFACE,
@@ -1900,16 +1949,17 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
-                pa_assert_se((client = pa_hashmap_remove(c->clients, PA_UINT32_TO_PTR(idx))));
+                if (!(client_iface = pa_hashmap_remove(c->clients, PA_UINT32_TO_PTR(idx))))
+                    return;
 
-                object_path = pa_dbusiface_client_get_path(client);
+                object_path = pa_dbusiface_client_get_path(client_iface);
 
                 pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
                                                                PA_DBUS_CORE_INTERFACE,
                                                                signals[SIGNAL_CLIENT_REMOVED].name)));
                 pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
-                pa_dbusiface_client_free(client);
+                pa_dbusiface_client_free(client_iface);
             }
             break;
     }
@@ -2001,6 +2051,11 @@ pa_dbusiface_core *pa_dbusiface_core_new(pa_core *core) {
                                                                    c);
     c->memstats = pa_dbusiface_memstats_new(c, core);
 
+    if (c->fallback_sink)
+        pa_sink_ref(c->fallback_sink);
+    if (c->fallback_source)
+        pa_source_ref(c->fallback_source);
+
     PA_IDXSET_FOREACH(card, core->cards, idx)
         pa_hashmap_put(c->cards, PA_UINT32_TO_PTR(idx), pa_dbusiface_card_new(c, card));
 
@@ -2104,6 +2159,11 @@ void pa_dbusiface_core_free(pa_dbusiface_core *c) {
     pa_hook_slot_free(c->extension_unregistered_slot);
     pa_dbusiface_memstats_free(c->memstats);
 
+    if (c->fallback_sink)
+        pa_sink_unref(c->fallback_sink);
+    if (c->fallback_source)
+        pa_source_unref(c->fallback_source);
+
     pa_dbus_protocol_unref(c->dbus_protocol);
     pa_core_unref(c->core);
 
diff --git a/src/modules/dbus/iface-module.c b/src/modules/dbus/iface-module.c
index e3882fc..e8aea50 100644
--- a/src/modules/dbus/iface-module.c
+++ b/src/modules/dbus/iface-module.c
@@ -274,6 +274,11 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
     pa_assert((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_MODULE);
     pa_assert(m);
 
+    /* We can't use idx != m->module->index, because the m->module pointer may
+     * be stale at this point. */
+    if (pa_idxset_get_by_index(core->modules, idx) != m->module)
+        return;
+
     if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) != PA_SUBSCRIPTION_EVENT_CHANGE)
         return;
 
diff --git a/src/modules/dbus/iface-sample.c b/src/modules/dbus/iface-sample.c
index 4cffd59..7147be1 100644
--- a/src/modules/dbus/iface-sample.c
+++ b/src/modules/dbus/iface-sample.c
@@ -463,7 +463,9 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
     pa_assert(c);
     pa_assert(s);
 
-    if (idx != s->sample->index)
+    /* We can't use idx != s->sample->index, because the s->sample pointer may
+     * be stale at this point. */
+    if (pa_idxset_get_by_index(c->scache, idx) != s->sample)
         return;
 
     if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) != PA_SUBSCRIPTION_EVENT_CHANGE)

commit 11fcc8c85f15dba8e78dffb88b3d0d04ebc329e1
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Wed Aug 26 14:19:11 2009 +0300

    dbusiface-stream: Only send stream event signals from the right D-Bus objects.

diff --git a/src/modules/dbus/iface-stream.c b/src/modules/dbus/iface-stream.c
index 354ca6e..183625b 100644
--- a/src/modules/dbus/iface-stream.c
+++ b/src/modules/dbus/iface-stream.c
@@ -786,11 +786,17 @@ static pa_hook_result_t send_event_cb(void *hook_data, void *call_data, void *sl
     if (s->type == STREAM_TYPE_PLAYBACK) {
         pa_sink_input_send_event_hook_data *data = call_data;
 
+        if (data->sink_input != s->sink_input)
+            return PA_HOOK_OK;
+
         name = data->event;
         property_list = data->data;
     } else {
         pa_source_output_send_event_hook_data *data = call_data;
 
+        if (data->source_output != s->source_output)
+            return PA_HOOK_OK;
+
         name = data->event;
         property_list = data->data;
     }

commit 219f7508f6420f94ad8c426c6aa3dc79df246f36
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Wed Aug 26 14:20:26 2009 +0300

    dbus: Finish the Client D-Bus interface.

diff --git a/src/modules/dbus/iface-client.c b/src/modules/dbus/iface-client.c
index 587d5c4..a68259a 100644
--- a/src/modules/dbus/iface-client.c
+++ b/src/modules/dbus/iface-client.c
@@ -39,8 +39,10 @@ struct pa_dbusiface_client {
 
     pa_client *client;
     char *path;
+    pa_proplist *proplist;
 
     pa_dbus_protocol *dbus_protocol;
+    pa_subscription *subscription;
 };
 
 static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata);
@@ -52,9 +54,9 @@ static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, voi
 
 static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
 
-/*static void handle_kill(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_kill(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_update_properties(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_remove_properties(DBusConnection *conn, DBusMessage *msg, void *userdata);*/
+static void handle_remove_properties(DBusConnection *conn, DBusMessage *msg, void *userdata);
 
 enum property_handler_index {
     PROPERTY_HANDLER_INDEX,
@@ -75,7 +77,7 @@ static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
     [PROPERTY_HANDLER_PROPERTY_LIST]    = { .property_name = "PropertyList",    .type = "a{say}", .get_cb = handle_get_property_list,    .set_cb = NULL }
 };
 
-/*enum method_handler_index {
+enum method_handler_index {
     METHOD_HANDLER_KILL,
     METHOD_HANDLER_UPDATE_PROPERTIES,
     METHOD_HANDLER_REMOVE_PROPERTIES,
@@ -83,7 +85,7 @@ static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
 };
 
 static pa_dbus_arg_info update_properties_args[] = { { "property_list", "a{say}", "in" }, { "update_mode", "u", "in" } };
-static pa_dbus_arg_info update_properties_args[] = { { "keys", "as", "in" } };
+static pa_dbus_arg_info remove_properties_args[] = { { "keys", "as", "in" } };
 
 static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
     [METHOD_HANDLER_KILL] = {
@@ -93,14 +95,14 @@ static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
         .receive_cb = handle_kill },
     [METHOD_HANDLER_UPDATE_PROPERTIES] = {
         .method_name = "UpdateProperties",
-        .arguments = update_propertes_args,
+        .arguments = update_properties_args,
         .n_arguments = sizeof(update_properties_args) / sizeof(pa_dbus_arg_info),
         .receive_cb = handle_update_properties },
     [METHOD_HANDLER_REMOVE_PROPERTIES] = {
         .method_name = "RemoveProperties",
-        .arguments = remove_propertes_args,
+        .arguments = remove_properties_args,
         .n_arguments = sizeof(update_properties_args) / sizeof(pa_dbus_arg_info),
-        .receive_cb = handle_update_properties }
+        .receive_cb = handle_remove_properties }
 };
 
 enum signal_index {
@@ -109,23 +111,25 @@ enum signal_index {
     SIGNAL_MAX
 };
 
-static pa_dbus_arg_info active_profile_updated_args[] = { { "profile",       "o",      NULL } };
-static pa_dbus_arg_info property_list_updated_args[]  = { { "property_list", "a{say}", NULL } };
+static pa_dbus_arg_info property_list_updated_args[] = { { "property_list", "a{say}", NULL } };
+static pa_dbus_arg_info client_event_args[]          = { { "name",          "s",      NULL },
+                                                         { "property_list", "a{say}", NULL } };
 
 static pa_dbus_signal_info signals[SIGNAL_MAX] = {
-    [SIGNAL_ACTIVE_PROFILE_UPDATED] = { .name = "ActiveProfileUpdated", .arguments = active_profile_updated_args, .n_arguments = 1 },
-    [SIGNAL_PROPERTY_LIST_UPDATED]  = { .name = "PropertyListUpdated",  .arguments = property_list_updated_args,  .n_arguments = 1 }
-};*/
+    [SIGNAL_PROPERTY_LIST_UPDATED] = { .name = "PropertyListUpdated", .arguments = property_list_updated_args, .n_arguments = 1 },
+    /* ClientEvent is sent from module-dbus-protocol.c. */
+    [SIGNAL_CLIENT_EVENT]          = { .name = "ClientEvent",         .arguments = client_event_args,          .n_arguments = 1 }
+};
 
 static pa_dbus_interface_info client_interface_info = {
     .name = PA_DBUSIFACE_CLIENT_INTERFACE,
-    .method_handlers = /*method_handlers*/ NULL,
-    .n_method_handlers = /*METHOD_HANDLER_MAX*/ 0,
+    .method_handlers = method_handlers,
+    .n_method_handlers = METHOD_HANDLER_MAX,
     .property_handlers = property_handlers,
     .n_property_handlers = PROPERTY_HANDLER_MAX,
     .get_all_properties_cb = handle_get_all,
-    .signals = /*signals*/ NULL,
-    .n_signals = /*SIGNAL_MAX*/ 0
+    .signals = signals,
+    .n_signals = SIGNAL_MAX
 };
 
 static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) {
@@ -304,6 +308,131 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
     pa_xfree(record_streams);
 }
 
+static void handle_kill(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_client *c = userdata;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    dbus_connection_ref(conn);
+
+    pa_client_kill(c->client);
+
+    pa_dbus_send_empty_reply(conn, msg);
+
+    dbus_connection_unref(conn);
+}
+
+static void handle_update_properties(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_client *c = userdata;
+    DBusMessageIter msg_iter;
+    pa_proplist *property_list = NULL;
+    dbus_uint32_t update_mode = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    if (pa_dbus_protocol_get_client(c->dbus_protocol, conn) != c->client) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_ACCESS_DENIED, "Client tried to modify the property list of another client.");
+        return;
+    }
+
+    if (!dbus_message_iter_init(msg, &msg_iter)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
+        return;
+    }
+
+    if (!(property_list = pa_dbus_get_proplist_arg(conn, msg, &msg_iter)))
+        return;
+
+    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_UINT32, &update_mode) < 0)
+        goto finish;
+
+    if (!(update_mode == PA_UPDATE_SET || update_mode == PA_UPDATE_MERGE || update_mode == PA_UPDATE_REPLACE)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid update mode: %u", update_mode);
+        goto finish;
+    }
+
+    pa_client_update_proplist(c->client, update_mode, property_list);
+
+    pa_dbus_send_empty_reply(conn, msg);
+
+finish:
+    if (property_list)
+        pa_proplist_free(property_list);
+}
+
+static void handle_remove_properties(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_client *c = userdata;
+    char **keys = NULL;
+    int n_keys = 0;
+    DBusError error;
+    pa_bool_t changed = FALSE;
+    int i = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+
+    dbus_error_init(&error);
+
+    if (pa_dbus_protocol_get_client(c->dbus_protocol, conn) != c->client) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_ACCESS_DENIED, "Client tried to modify the property list of another client.");
+        return;
+    }
+
+    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &keys, &n_keys, DBUS_TYPE_INVALID)) {
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
+        dbus_error_free(&error);
+        return;
+    }
+
+    for (i = 0; i < n_keys; ++i)
+        changed |= pa_proplist_unset(c->client->proplist, keys[i]) >= 0;
+
+    pa_dbus_send_empty_reply(conn, msg);
+
+    if (changed)
+        pa_subscription_post(c->client->core, PA_SUBSCRIPTION_EVENT_CLIENT|PA_SUBSCRIPTION_EVENT_CHANGE, c->client->index);
+
+    dbus_free_string_array(keys);
+}
+
+static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
+    pa_dbusiface_client *c = userdata;
+    DBusMessage *signal = NULL;
+
+    pa_assert(core);
+    pa_assert((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_CLIENT);
+    pa_assert(c);
+
+    /* We can't use idx != c->client->index, because the c->client pointer may
+     * be stale at this point. */
+    if (pa_idxset_get_by_index(core->clients, idx) != c->client)
+        return;
+
+    if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) != PA_SUBSCRIPTION_EVENT_CHANGE)
+        return;
+
+    if (!pa_proplist_equal(c->proplist, c->client->proplist)) {
+        DBusMessageIter msg_iter;
+
+        pa_proplist_update(c->proplist, PA_UPDATE_SET, c->client->proplist);
+
+        pa_assert_se(signal = dbus_message_new_signal(c->path,
+                                                      PA_DBUSIFACE_CLIENT_INTERFACE,
+                                                      signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+        dbus_message_iter_init_append(signal, &msg_iter);
+        pa_dbus_append_proplist(&msg_iter, c->proplist);
+
+        pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
+        dbus_message_unref(signal);
+        signal = NULL;
+    }
+}
+
 pa_dbusiface_client *pa_dbusiface_client_new(pa_dbusiface_core *core, pa_client *client) {
     pa_dbusiface_client *c = NULL;
 
@@ -314,7 +443,9 @@ pa_dbusiface_client *pa_dbusiface_client_new(pa_dbusiface_core *core, pa_client
     c->core = core;
     c->client = client;
     c->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, OBJECT_NAME, client->index);
+    c->proplist = pa_proplist_copy(client->proplist);
     c->dbus_protocol = pa_dbus_protocol_get(client->core);
+    c->subscription = pa_subscription_new(client->core, PA_SUBSCRIPTION_MASK_CLIENT, subscription_cb, c);
 
     pa_assert_se(pa_dbus_protocol_add_interface(c->dbus_protocol, c->path, &client_interface_info, c) >= 0);
 
diff --git a/src/modules/dbus/module-dbus-protocol.c b/src/modules/dbus/module-dbus-protocol.c
index 807d32d..11064c3 100644
--- a/src/modules/dbus/module-dbus-protocol.c
+++ b/src/modules/dbus/module-dbus-protocol.c
@@ -40,6 +40,7 @@
 #include <pulsecore/module.h>
 #include <pulsecore/protocol-dbus.h>
 
+#include "iface-client.h"
 #include "iface-core.h"
 
 #include "module-dbus-protocol-symdef.h"
@@ -117,10 +118,36 @@ static void client_kill_cb(pa_client *c) {
 
     conn = c->userdata;
     connection_free(conn);
+    c->userdata = NULL;
 
     pa_log_info("Connection killed.");
 }
 
+/* Called from pa_client_send_event(). */
+static void client_send_event_cb(pa_client *c, const char *name, pa_proplist *data) {
+    struct connection *conn = NULL;
+    DBusMessage *signal = NULL;
+    DBusMessageIter msg_iter;
+
+    pa_assert(c);
+    pa_assert(name);
+    pa_assert(data);
+    pa_assert(c->userdata);
+
+    conn = c->userdata;
+
+    pa_assert_se(signal = dbus_message_new_signal(pa_dbusiface_core_get_client_path(conn->server->userdata->core_iface, c),
+                                                  PA_DBUSIFACE_CLIENT_INTERFACE,
+                                                  "ClientEvent"));
+    dbus_message_iter_init_append(signal, &msg_iter);
+    pa_assert_se(dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_STRING, &name));
+    pa_dbus_append_proplist(&msg_iter, data);
+
+    pa_assert_se(dbus_connection_send(pa_dbus_wrap_connection_get(conn->wrap_conn), signal, NULL));
+    dbus_message_unref(signal);
+}
+
+/* Called by D-Bus at the authentication phase. */
 static dbus_bool_t user_check_cb(DBusConnection *connection, unsigned long uid, void *data) {
     pa_log_debug("Allowing connection by user %lu.", uid);
 
@@ -140,7 +167,7 @@ static void connection_new_cb(DBusServer *dbus_server, DBusConnection *new_conne
     pa_client_new_data_init(&new_data);
     new_data.module = s->userdata->module;
     new_data.driver = __FILE__;
-    pa_proplist_sets(new_data.proplist, PA_PROP_APPLICATION_NAME, "D-Bus client"); /* TODO: It's probably possible to generate a fancier name. Other props? */
+    pa_proplist_sets(new_data.proplist, PA_PROP_APPLICATION_NAME, "D-Bus client");
     client = pa_client_new(s->userdata->module->core, &new_data);
     pa_client_new_data_done(&new_data);
 
@@ -162,7 +189,7 @@ static void connection_new_cb(DBusServer *dbus_server, DBusConnection *new_conne
     c->client = client;
 
     c->client->kill = client_kill_cb;
-    c->client->send_event = NULL; /* TODO: Implement this. */
+    c->client->send_event = client_send_event_cb;
     c->client->userdata = c;
 
     pa_idxset_put(s->userdata->connections, c, NULL);

commit 7bc8a793b8ae4c46e59a444313e4d06186de1680
Merge: 219f750 4614412
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Wed Aug 26 14:29:55 2009 +0300

    Merge branch 'master' of git://0pointer.de/pulseaudio into dbus-work
    
    Conflicts:
    	src/Makefile.am

diff --cc src/Makefile.am
index c3ca1eb,e65662c..16834ee
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@@ -1253,7 -1250,7 +1254,8 @@@ SYMDEF_FILES = 
  		modules/module-augment-properties-symdef.h \
  		modules/module-cork-music-on-phone-symdef.h \
  		modules/module-console-kit-symdef.h \
- 		modules/dbus/module-dbus-protocol-symdef.h
++		modules/dbus/module-dbus-protocol-symdef.h \
+ 		modules/module-loopback-symdef.h
  
  EXTRA_DIST += $(SYMDEF_FILES)
  BUILT_SOURCES += $(SYMDEF_FILES)

commit 0e096632c53b746b9f4b4c0249d9e5a18c1c543d
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 30 19:52:22 2009 +0300

    dbus: Do message argument type checking early, centrally.

diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card.c
index 7e37f8b..1714df3 100644
--- a/src/modules/dbus/iface-card.c
+++ b/src/modules/dbus/iface-card.c
@@ -43,7 +43,7 @@ static void handle_get_sinks(DBusConnection *conn, DBusMessage *msg, void *userd
 static void handle_get_sources(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_profiles(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_active_profile(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_set_active_profile(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_active_profile(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata);
 
 static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
@@ -322,7 +322,7 @@ static void handle_get_active_profile(DBusConnection *conn, DBusMessage *msg, vo
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &active_profile);
 }
 
-static void handle_set_active_profile(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_set_active_profile(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     pa_dbusiface_card *c = userdata;
     const char *new_active_path;
     pa_dbusiface_card_profile *new_active;
@@ -330,11 +330,9 @@ static void handle_set_active_profile(DBusConnection *conn, DBusMessage *msg, vo
 
     pa_assert(conn);
     pa_assert(msg);
+    pa_assert(iter);
     pa_assert(c);
 
-    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_OBJECT_PATH, &new_active_path) < 0)
-        return;
-
     if (!c->active_profile) {
         pa_assert(pa_hashmap_isempty(c->profiles));
 
@@ -344,6 +342,8 @@ static void handle_set_active_profile(DBusConnection *conn, DBusMessage *msg, vo
         return;
     }
 
+    dbus_message_iter_get_basic(iter, &new_active_path);
+
     if (!(new_active = pa_hashmap_get(c->profiles, new_active_path))) {
         pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such profile.", new_active_path);
         return;
@@ -430,7 +430,6 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
 
 static void handle_get_profile_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_dbusiface_card *c = userdata;
-    DBusError error;
     const char *profile_name = NULL;
     pa_dbusiface_card_profile *profile = NULL;
     const char *profile_path = NULL;
@@ -439,13 +438,7 @@ static void handle_get_profile_by_name(DBusConnection *conn, DBusMessage *msg, v
     pa_assert(msg);
     pa_assert(c);
 
-    dbus_error_init(&error);
-
-    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &profile_name, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
-        dbus_error_free(&error);
-        return;
-    }
+    pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &profile_name, DBUS_TYPE_INVALID));
 
     if (!(profile = pa_hashmap_get(c->profiles, profile_name))) {
         pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such profile on card %s.", profile_name, c->card->name);
diff --git a/src/modules/dbus/iface-client.c b/src/modules/dbus/iface-client.c
index a68259a..54550d2 100644
--- a/src/modules/dbus/iface-client.c
+++ b/src/modules/dbus/iface-client.c
@@ -339,16 +339,12 @@ static void handle_update_properties(DBusConnection *conn, DBusMessage *msg, voi
         return;
     }
 
-    if (!dbus_message_iter_init(msg, &msg_iter)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
-        return;
-    }
+    pa_assert_se(dbus_message_iter_init(msg, &msg_iter));
 
     if (!(property_list = pa_dbus_get_proplist_arg(conn, msg, &msg_iter)))
         return;
 
-    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_UINT32, &update_mode) < 0)
-        goto finish;
+    dbus_message_iter_get_basic(&msg_iter, &update_mode);
 
     if (!(update_mode == PA_UPDATE_SET || update_mode == PA_UPDATE_MERGE || update_mode == PA_UPDATE_REPLACE)) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid update mode: %u", update_mode);
@@ -368,7 +364,6 @@ static void handle_remove_properties(DBusConnection *conn, DBusMessage *msg, voi
     pa_dbusiface_client *c = userdata;
     char **keys = NULL;
     int n_keys = 0;
-    DBusError error;
     pa_bool_t changed = FALSE;
     int i = 0;
 
@@ -376,18 +371,12 @@ static void handle_remove_properties(DBusConnection *conn, DBusMessage *msg, voi
     pa_assert(msg);
     pa_assert(c);
 
-    dbus_error_init(&error);
-
     if (pa_dbus_protocol_get_client(c->dbus_protocol, conn) != c->client) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_ACCESS_DENIED, "Client tried to modify the property list of another client.");
         return;
     }
 
-    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &keys, &n_keys, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
-        dbus_error_free(&error);
-        return;
-    }
+    pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &keys, &n_keys, DBUS_TYPE_INVALID));
 
     for (i = 0; i < n_keys; ++i)
         changed |= pa_proplist_unset(c->client->proplist, keys[i]) >= 0;
diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index c54a3b7..0507ac9 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -57,18 +57,18 @@ static void handle_get_is_local(DBusConnection *conn, DBusMessage *msg, void *us
 static void handle_get_username(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_hostname(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_default_channels(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_set_default_channels(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_default_channels(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 static void handle_get_default_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_set_default_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_default_sample_format(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 static void handle_get_default_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_set_default_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_default_sample_rate(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 static void handle_get_cards(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_sinks(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_fallback_sink(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_set_fallback_sink(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_fallback_sink(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 static void handle_get_sources(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_fallback_source(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_set_fallback_source(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_fallback_source(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 static void handle_get_playback_streams(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_record_streams(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_samples(DBusConnection *conn, DBusMessage *msg, void *userdata);
@@ -428,30 +428,32 @@ static void handle_get_default_channels(DBusConnection *conn, DBusMessage *msg,
     pa_xfree(default_channels);
 }
 
-static void handle_set_default_channels(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_set_default_channels(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     pa_dbusiface_core *c = userdata;
+    DBusMessageIter array_iter;
     pa_channel_map new_channel_map;
-    dbus_uint32_t *default_channels;
-    unsigned n_channels;
+    const dbus_uint32_t *default_channels;
+    int n_channels;
     unsigned i;
 
     pa_assert(conn);
     pa_assert(msg);
+    pa_assert(iter);
     pa_assert(c);
 
     pa_channel_map_init(&new_channel_map);
 
-    if (pa_dbus_get_fixed_array_set_property_arg(conn, msg, DBUS_TYPE_UINT32, &default_channels, &n_channels) < 0)
-        return;
+    dbus_message_iter_recurse(iter, &array_iter);
+    dbus_message_iter_get_fixed_array(&array_iter, &default_channels, &n_channels);
 
     if (n_channels <= 0) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Empty channel array.");
         return;
     }
 
-    if (n_channels > PA_CHANNELS_MAX) {
+    if (n_channels > (int) PA_CHANNELS_MAX) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
-                           "Too many channels: %u. The maximum number of channels is %u.", n_channels, PA_CHANNELS_MAX);
+                           "Too many channels: %i. The maximum number of channels is %u.", n_channels, PA_CHANNELS_MAX);
         return;
     }
 
@@ -485,16 +487,16 @@ static void handle_get_default_sample_format(DBusConnection *conn, DBusMessage *
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &default_sample_format);
 }
 
-static void handle_set_default_sample_format(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_set_default_sample_format(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     pa_dbusiface_core *c = userdata;
     dbus_uint32_t default_sample_format;
 
     pa_assert(conn);
     pa_assert(msg);
+    pa_assert(iter);
     pa_assert(c);
 
-    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_UINT32, &default_sample_format) < 0)
-        return;
+    dbus_message_iter_get_basic(iter, &default_sample_format);
 
     if (default_sample_format >= PA_SAMPLE_MAX) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid sample format.");
@@ -519,16 +521,16 @@ static void handle_get_default_sample_rate(DBusConnection *conn, DBusMessage *ms
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &default_sample_rate);
 }
 
-static void handle_set_default_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_set_default_sample_rate(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     pa_dbusiface_core *c = userdata;
     dbus_uint32_t default_sample_rate;
 
     pa_assert(conn);
     pa_assert(msg);
+    pa_assert(iter);
     pa_assert(c);
 
-    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_UINT32, &default_sample_rate) < 0)
-        return;
+    dbus_message_iter_get_basic(iter, &default_sample_rate);
 
     if (default_sample_rate <= 0 || default_sample_rate > PA_RATE_MAX) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid sample rate.");
@@ -639,13 +641,14 @@ static void handle_get_fallback_sink(DBusConnection *conn, DBusMessage *msg, voi
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path);
 }
 
-static void handle_set_fallback_sink(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_set_fallback_sink(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     pa_dbusiface_core *c = userdata;
     pa_dbusiface_device *fallback_sink;
     const char *object_path;
 
     pa_assert(conn);
     pa_assert(msg);
+    pa_assert(iter);
     pa_assert(c);
 
     if (!c->fallback_sink) {
@@ -654,8 +657,7 @@ static void handle_set_fallback_sink(DBusConnection *conn, DBusMessage *msg, voi
         return;
     }
 
-    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path) < 0)
-        return;
+    dbus_message_iter_get_basic(iter, &object_path);
 
     if (!(fallback_sink = pa_hashmap_get(c->sinks_by_path, object_path))) {
         pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such sink.", object_path);
@@ -727,13 +729,14 @@ static void handle_get_fallback_source(DBusConnection *conn, DBusMessage *msg, v
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path);
 }
 
-static void handle_set_fallback_source(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_set_fallback_source(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     pa_dbusiface_core *c = userdata;
     pa_dbusiface_device *fallback_source;
     const char *object_path;
 
     pa_assert(conn);
     pa_assert(msg);
+    pa_assert(iter);
     pa_assert(c);
 
     if (!c->fallback_source) {
@@ -742,8 +745,7 @@ static void handle_set_fallback_source(DBusConnection *conn, DBusMessage *msg, v
         return;
     }
 
-    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_OBJECT_PATH, &object_path) < 0)
-        return;
+    dbus_message_iter_get_basic(iter, &object_path);
 
     if (!(fallback_source = pa_hashmap_get(c->sources_by_path, object_path))) {
         pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such source.", object_path);
@@ -1117,19 +1119,12 @@ static void handle_get_card_by_name(DBusConnection *conn, DBusMessage *msg, void
     pa_card *card;
     pa_dbusiface_card *dbus_card;
     const char *object_path;
-    DBusError error;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(c);
 
-    dbus_error_init(&error);
-
-    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &card_name, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
-        dbus_error_free(&error);
-        return;
-    }
+    pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &card_name, DBUS_TYPE_INVALID));
 
     if (!(card = pa_namereg_get(c->core, card_name, PA_NAMEREG_CARD))) {
         pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such card.");
@@ -1149,19 +1144,12 @@ static void handle_get_sink_by_name(DBusConnection *conn, DBusMessage *msg, void
     pa_sink *sink;
     pa_dbusiface_device *dbus_sink;
     const char *object_path;
-    DBusError error;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(c);
 
-    dbus_error_init(&error);
-
-    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &sink_name, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
-        dbus_error_free(&error);
-        return;
-    }
+    pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &sink_name, DBUS_TYPE_INVALID));
 
     if (!(sink = pa_namereg_get(c->core, sink_name, PA_NAMEREG_SINK))) {
         pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such sink.", sink_name);
@@ -1181,19 +1169,12 @@ static void handle_get_source_by_name(DBusConnection *conn, DBusMessage *msg, vo
     pa_source *source;
     pa_dbusiface_device *dbus_source;
     const char *object_path;
-    DBusError error;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(c);
 
-    dbus_error_init(&error);
-
-    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &source_name, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
-        dbus_error_free(&error);
-        return;
-    }
+    pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &source_name, DBUS_TYPE_INVALID));
 
     if (!(source = pa_namereg_get(c->core, source_name, PA_NAMEREG_SOURCE))) {
         pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such source.", source_name);
@@ -1213,19 +1194,12 @@ static void handle_get_sample_by_name(DBusConnection *conn, DBusMessage *msg, vo
     pa_scache_entry *sample;
     pa_dbusiface_sample *dbus_sample;
     const char *object_path;
-    DBusError error;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(c);
 
-    dbus_error_init(&error);
-
-    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &sample_name, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
-        dbus_error_free(&error);
-        return;
-    }
+    pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &sample_name, DBUS_TYPE_INVALID));
 
     if (!(sample = pa_namereg_get(c->core, sample_name, PA_NAMEREG_SAMPLE))) {
         pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such sample.");
@@ -1242,17 +1216,18 @@ static void handle_get_sample_by_name(DBusConnection *conn, DBusMessage *msg, vo
 static void handle_upload_sample(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_dbusiface_core *c = userdata;
     DBusMessageIter msg_iter;
+    DBusMessageIter array_iter;
     const char *name;
     dbus_uint32_t sample_format;
     dbus_uint32_t sample_rate;
     const dbus_uint32_t *channels;
-    unsigned n_channels;
+    int n_channels;
     const dbus_uint32_t *default_volume;
-    unsigned n_volume_entries;
+    int n_volume_entries;
     pa_proplist *property_list;
     const uint8_t *data;
-    unsigned data_length;
-    unsigned i;
+    int data_length;
+    int i;
     pa_sample_spec ss;
     pa_channel_map map;
     pa_memchunk chunk;
@@ -1267,31 +1242,29 @@ static void handle_upload_sample(DBusConnection *conn, DBusMessage *msg, void *u
 
     chunk.memblock = NULL;
 
-    if (!dbus_message_iter_init(msg, &msg_iter)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
-        return;
-    }
-
-    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_STRING, &name) < 0)
-        return;
+    pa_assert_se(dbus_message_iter_init(msg, &msg_iter));
+    dbus_message_iter_get_basic(&msg_iter, &name);
 
-    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_UINT32, &sample_format) < 0)
-        return;
+    pa_assert_se(dbus_message_iter_next(&msg_iter));
+    dbus_message_iter_get_basic(&msg_iter, &sample_format);
 
-    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_UINT32, &sample_rate) < 0)
-        return;
+    pa_assert_se(dbus_message_iter_next(&msg_iter));
+    dbus_message_iter_get_basic(&msg_iter, &sample_rate);
 
-    if (pa_dbus_get_fixed_array_arg(conn, msg, &msg_iter, DBUS_TYPE_UINT32, &channels, &n_channels) < 0)
-        return;
+    pa_assert_se(dbus_message_iter_next(&msg_iter));
+    dbus_message_iter_recurse(&msg_iter, &array_iter);
+    dbus_message_iter_get_fixed_array(&array_iter, &channels, &n_channels);
 
-    if (pa_dbus_get_fixed_array_arg(conn, msg, &msg_iter, DBUS_TYPE_UINT32, &default_volume, &n_volume_entries) < 0)
-        return;
+    pa_assert_se(dbus_message_iter_next(&msg_iter));
+    dbus_message_iter_recurse(&msg_iter, &array_iter);
+    dbus_message_iter_get_fixed_array(&array_iter, &default_volume, &n_volume_entries);
 
+    pa_assert_se(dbus_message_iter_next(&msg_iter));
     if (!(property_list = pa_dbus_get_proplist_arg(conn, msg, &msg_iter)))
         return;
 
-    if (pa_dbus_get_fixed_array_arg(conn, msg, &msg_iter, DBUS_TYPE_BYTE, &data, &data_length) < 0)
-        goto finish;
+    dbus_message_iter_recurse(&msg_iter, &array_iter);
+    dbus_message_iter_get_fixed_array(&array_iter, &data, &data_length);
 
     if (sample_format >= PA_SAMPLE_MAX) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid sample format.");
@@ -1303,14 +1276,14 @@ static void handle_upload_sample(DBusConnection *conn, DBusMessage *msg, void *u
         goto finish;
     }
 
-    if (n_channels == 0) {
+    if (n_channels <= 0) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Empty channel map.");
         goto finish;
     }
 
-    if (n_channels > PA_CHANNELS_MAX) {
+    if (n_channels > (int) PA_CHANNELS_MAX) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
-                           "Too many channels: %u. The maximum is %u.", n_channels, PA_CHANNELS_MAX);
+                           "Too many channels: %i. The maximum is %u.", n_channels, PA_CHANNELS_MAX);
         goto finish;
     }
 
@@ -1323,13 +1296,14 @@ static void handle_upload_sample(DBusConnection *conn, DBusMessage *msg, void *u
 
     if (n_volume_entries != 0 && n_volume_entries != n_channels) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
-                           "The channels and default_volume arguments have different number of elements.");
+                           "The channels and default_volume arguments have different number of elements (%i and %i, resp).",
+                           n_channels, n_volume_entries);
         goto finish;
     }
 
     for (i = 0; i < n_volume_entries; ++i) {
         if (default_volume[i] > PA_VOLUME_MAX) {
-            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid volume.");
+            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid volume: %u.", default_volume[i]);
             goto finish;
         }
     }
@@ -1340,7 +1314,9 @@ static void handle_upload_sample(DBusConnection *conn, DBusMessage *msg, void *u
     }
 
     if (data_length > PA_SCACHE_ENTRY_SIZE_MAX) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too big sample.");
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
+                           "Too big sample: %i bytes. The maximum sample length is %u bytes.",
+                           data_length, PA_SCACHE_ENTRY_SIZE_MAX);
         goto finish;
     }
 
@@ -1348,9 +1324,13 @@ static void handle_upload_sample(DBusConnection *conn, DBusMessage *msg, void *u
     ss.rate = sample_rate;
     ss.channels = n_channels;
 
+    pa_assert(pa_sample_spec_valid(&ss));
+
     if (!pa_frame_aligned(data_length, &ss)) {
+        char buf[PA_SAMPLE_SPEC_SNPRINT_MAX];
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
-                           "The sample length in bytes doesn't align with the sample format and channels.");
+                           "The sample length (%i bytes) doesn't align with the sample format and channels (%s).",
+                           data_length, pa_sample_spec_snprint(buf, sizeof(buf), &ss));
         goto finish;
     }
 
@@ -1414,15 +1394,15 @@ static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *use
     DBusMessageIter msg_iter;
     DBusMessageIter dict_iter;
     DBusMessageIter dict_entry_iter;
-    char *name;
-    const char *key;
-    const char *value;
-    char *escaped_value;
+    char *name = NULL;
+    const char *key = NULL;
+    const char *value = NULL;
+    char *escaped_value = NULL;
     pa_strbuf *arg_buffer = NULL;
-    pa_module *module;
-    pa_dbusiface_module *dbus_module;
-    const char *object_path;
-    int arg_type;
+    char *arg_string = NULL;
+    pa_module *module = NULL;
+    pa_dbusiface_module *dbus_module = NULL;
+    const char *object_path = NULL;
 
     pa_assert(conn);
     pa_assert(msg);
@@ -1433,35 +1413,12 @@ static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *use
         return;
     }
 
-    if (!dbus_message_iter_init(msg, &msg_iter)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
-        return;
-    }
-
-    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_STRING, &name) < 0)
-        return;
-
-    arg_type = dbus_message_iter_get_arg_type(&msg_iter);
-    if (arg_type != DBUS_TYPE_ARRAY) {
-        if (arg_type == DBUS_TYPE_INVALID)
-            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
-                               "Too few arguments. A dictionary from strings to strings was expected.");
-        else
-            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
-                               "Wrong argument type: '%c'. An dictionary from strings to strings was expected.",
-                               (char) arg_type);
-        return;
-    }
-
-    arg_type = dbus_message_iter_get_element_type(&msg_iter);
-    if (arg_type != DBUS_TYPE_DICT_ENTRY) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
-                           "Wrong array element type: '%c'. A dict entry (string to string) was expected.", (char) arg_type);
-        return;
-    }
+    pa_assert_se(dbus_message_iter_init(msg, &msg_iter));
+    dbus_message_iter_get_basic(&msg_iter, &name);
 
     arg_buffer = pa_strbuf_new();
 
+    pa_assert_se(dbus_message_iter_next(&msg_iter));
     dbus_message_iter_recurse(&msg_iter, &dict_iter);
 
     while (dbus_message_iter_get_arg_type(&dict_iter) != DBUS_TYPE_INVALID) {
@@ -1470,41 +1427,26 @@ static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *use
 
         dbus_message_iter_recurse(&dict_iter, &dict_entry_iter);
 
-        arg_type = dbus_message_iter_get_arg_type(&dict_entry_iter);
-        if (arg_type != DBUS_TYPE_STRING) {
-            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
-                               "Wrong dict key type: '%c'. A string was expected.", (char) arg_type);
-            goto finish;
-        }
-
         dbus_message_iter_get_basic(&dict_entry_iter, &key);
-        dbus_message_iter_next(&dict_entry_iter);
 
         if (strlen(key) <= 0 || !pa_ascii_valid(key) || contains_space(key)) {
             pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid module argument name: %s", key);
             goto finish;
         }
 
-        arg_type = dbus_message_iter_get_arg_type(&dict_entry_iter);
-        if (arg_type != DBUS_TYPE_STRING) {
-            if (arg_type == DBUS_TYPE_INVALID)
-                pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Dict value missing.");
-            else
-                pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
-                                   "Wrong dict value type: '%c'. A string was expected.", (char) arg_type);
-            goto finish;
-        }
-
+        pa_assert_se(dbus_message_iter_next(&dict_entry_iter));
         dbus_message_iter_get_basic(&dict_entry_iter, &value);
 
-        dbus_message_iter_next(&dict_iter);
-
         escaped_value = pa_escape(value, "\"");
         pa_strbuf_printf(arg_buffer, "%s=\"%s\"", key, escaped_value);
         pa_xfree(escaped_value);
+
+        dbus_message_iter_next(&dict_iter);
     }
 
-    if (!(module = pa_module_load(c->core, name, pa_strbuf_tostring(arg_buffer)))) {
+    arg_string = pa_strbuf_tostring(arg_buffer);
+
+    if (!(module = pa_module_load(c->core, name, arg_string))) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Failed to load module.");
         goto finish;
     }
@@ -1519,6 +1461,8 @@ static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *use
 finish:
     if (arg_buffer)
         pa_strbuf_free(arg_buffer);
+
+    pa_xfree(arg_string);
 }
 
 static void handle_exit(DBusConnection *conn, DBusMessage *msg, void *userdata) {
@@ -1543,47 +1487,32 @@ static void handle_listen_for_signal(DBusConnection *conn, DBusMessage *msg, voi
     const char *signal;
     char **objects = NULL;
     int n_objects;
-    DBusError error;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(c);
 
-    dbus_error_init(&error);
-
-    if (!dbus_message_get_args(msg, &error,
-                               DBUS_TYPE_STRING, &signal,
-                               DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &objects, &n_objects,
-                               DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
-        dbus_error_free(&error);
-        goto finish;
-    }
+    pa_assert_se(dbus_message_get_args(msg, NULL,
+                                       DBUS_TYPE_STRING, &signal,
+                                       DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &objects, &n_objects,
+                                       DBUS_TYPE_INVALID));
 
     pa_dbus_protocol_add_signal_listener(c->dbus_protocol, conn, *signal ? signal : NULL, objects, n_objects);
 
     pa_dbus_send_empty_reply(conn, msg);
 
-finish:
     dbus_free_string_array(objects);
 }
 
 static void handle_stop_listening_for_signal(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_dbusiface_core *c = userdata;
     const char *signal;
-    DBusError error;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(c);
 
-    dbus_error_init(&error);
-
-    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &signal, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
-        dbus_error_free(&error);
-        return;
-    }
+    pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &signal, DBUS_TYPE_INVALID));
 
     pa_dbus_protocol_remove_signal_listener(c->dbus_protocol, conn, *signal ? signal : NULL);
 
diff --git a/src/modules/dbus/iface-device.c b/src/modules/dbus/iface-device.c
index 8f719bc..2752511 100644
--- a/src/modules/dbus/iface-device.c
+++ b/src/modules/dbus/iface-device.c
@@ -43,13 +43,13 @@ static void handle_get_sample_format(DBusConnection *conn, DBusMessage *msg, voi
 static void handle_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 static void handle_get_has_flat_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_has_convertible_to_decibel_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_base_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_volume_steps(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 static void handle_get_has_hardware_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_has_hardware_mute(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_configured_latency(DBusConnection *conn, DBusMessage *msg, void *userdata);
@@ -60,7 +60,7 @@ static void handle_get_is_network_device(DBusConnection *conn, DBusMessage *msg,
 static void handle_get_state(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_ports(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_active_port(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_set_active_port(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_active_port(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 static void handle_get_property_list(DBusConnection *conn, DBusMessage *msg, void *userdata);
 
 static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
@@ -408,16 +408,18 @@ static void handle_get_volume(DBusConnection *conn, DBusMessage *msg, void *user
     pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_UINT32, volume, d->volume.channels);
 }
 
-static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     pa_dbusiface_device *d = userdata;
-    unsigned device_channels = 0;
+    DBusMessageIter array_iter;
+    int device_channels = 0;
     dbus_uint32_t *volume = NULL;
-    unsigned n_volume_entries = 0;
+    int n_volume_entries = 0;
     pa_cvolume new_vol;
-    unsigned i = 0;
+    int i = 0;
 
     pa_assert(conn);
     pa_assert(msg);
+    pa_assert(iter);
     pa_assert(d);
 
     pa_cvolume_init(&new_vol);
@@ -426,12 +428,12 @@ static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, void *user
 
     new_vol.channels = device_channels;
 
-    if (pa_dbus_get_fixed_array_set_property_arg(conn, msg, DBUS_TYPE_UINT32, &volume, &n_volume_entries) < 0)
-        return;
+    dbus_message_iter_recurse(iter, &array_iter);
+    dbus_message_iter_get_fixed_array(&array_iter, &volume, &n_volume_entries);
 
     if (n_volume_entries != device_channels) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
-                           "Expected %u volume entries, got %u.", device_channels, n_volume_entries);
+                           "Expected %u volume entries, got %i.", device_channels, n_volume_entries);
         return;
     }
 
@@ -515,16 +517,16 @@ static void handle_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *us
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &d->is_muted);
 }
 
-static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     pa_dbusiface_device *d = userdata;
     dbus_bool_t is_muted = FALSE;
 
     pa_assert(conn);
     pa_assert(msg);
+    pa_assert(iter);
     pa_assert(d);
 
-    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_BOOLEAN, &is_muted) < 0)
-        return;
+    dbus_message_iter_get_basic(iter, &is_muted);
 
     if (d->type == DEVICE_TYPE_SINK)
         pa_sink_set_mute(d->sink, is_muted, TRUE);
@@ -722,7 +724,7 @@ static void handle_get_active_port(DBusConnection *conn, DBusMessage *msg, void
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, &active_port);
 }
 
-static void handle_set_active_port(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_set_active_port(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     pa_dbusiface_device *d = userdata;
     const char *new_active_path;
     pa_dbusiface_device_port *new_active;
@@ -730,11 +732,9 @@ static void handle_set_active_port(DBusConnection *conn, DBusMessage *msg, void
 
     pa_assert(conn);
     pa_assert(msg);
+    pa_assert(iter);
     pa_assert(d);
 
-    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_OBJECT_PATH, &new_active_path) < 0)
-        return;
-
     if (!d->active_port) {
         pa_assert(pa_hashmap_isempty(d->ports));
 
@@ -747,8 +747,10 @@ static void handle_set_active_port(DBusConnection *conn, DBusMessage *msg, void
         return;
     }
 
+    dbus_message_iter_get_basic(iter, &new_active_path);
+
     if (!(new_active = pa_hashmap_get(d->ports, new_active_path))) {
-        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "%s: No such port.", new_active_path);
+        pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such port: %s", new_active_path);
         return;
     }
 
@@ -923,19 +925,12 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
 static void handle_suspend(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_dbusiface_device *d = userdata;
     dbus_bool_t suspend = FALSE;
-    DBusError error;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(d);
 
-    dbus_error_init(&error);
-
-    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_BOOLEAN, &suspend, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
-        dbus_error_free(&error);
-        return;
-    }
+    pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN, &suspend, DBUS_TYPE_INVALID));
 
     if ((d->type == DEVICE_TYPE_SINK) && (pa_sink_suspend(d->sink, suspend, PA_SUSPEND_USER) < 0)) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Internal error in PulseAudio: pa_sink_suspend() failed.");
@@ -950,7 +945,6 @@ static void handle_suspend(DBusConnection *conn, DBusMessage *msg, void *userdat
 
 static void handle_get_port_by_name(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_dbusiface_device *d = userdata;
-    DBusError error;
     const char *port_name = NULL;
     pa_dbusiface_device_port *port = NULL;
     const char *port_path = NULL;
@@ -959,13 +953,7 @@ static void handle_get_port_by_name(DBusConnection *conn, DBusMessage *msg, void
     pa_assert(msg);
     pa_assert(d);
 
-    dbus_error_init(&error);
-
-    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &port_name, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
-        dbus_error_free(&error);
-        return;
-    }
+    pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &port_name, DBUS_TYPE_INVALID));
 
     if (!(port = pa_hashmap_get(d->ports, port_name))) {
         if (d->type == DEVICE_TYPE_SINK)
diff --git a/src/modules/dbus/iface-sample.c b/src/modules/dbus/iface-sample.c
index 7147be1..b0542a6 100644
--- a/src/modules/dbus/iface-sample.c
+++ b/src/modules/dbus/iface-sample.c
@@ -359,14 +359,10 @@ static void handle_play(DBusConnection *conn, DBusMessage *msg, void *userdata)
     pa_assert(msg);
     pa_assert(s);
 
-    if (!dbus_message_iter_init(msg, &msg_iter)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
-        return;
-    }
-
-    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_UINT32, &volume) < 0)
-        return;
+    pa_assert_se(dbus_message_iter_init(msg, &msg_iter));
+    dbus_message_iter_get_basic(&msg_iter, &volume);
 
+    pa_assert_se(dbus_message_iter_next(&msg_iter));
     if (!(property_list = pa_dbus_get_proplist_arg(conn, msg, &msg_iter)))
         return;
 
@@ -405,17 +401,13 @@ static void handle_play_to_sink(DBusConnection *conn, DBusMessage *msg, void *us
     pa_assert(msg);
     pa_assert(s);
 
-    if (!dbus_message_iter_init(msg, &msg_iter)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
-        return;
-    }
-
-    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_OBJECT_PATH, &sink_path) < 0)
-        return;
+    pa_assert_se(dbus_message_iter_init(msg, &msg_iter));
+    dbus_message_iter_get_basic(&msg_iter, &sink_path);
 
-    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_UINT32, &volume) < 0)
-        return;
+    pa_assert_se(dbus_message_iter_next(&msg_iter));
+    dbus_message_iter_get_basic(&msg_iter, &volume);
 
+    pa_assert_se(dbus_message_iter_next(&msg_iter));
     if (!(property_list = pa_dbus_get_proplist_arg(conn, msg, &msg_iter)))
         return;
 
diff --git a/src/modules/dbus/iface-stream.c b/src/modules/dbus/iface-stream.c
index 183625b..a5f9bb5 100644
--- a/src/modules/dbus/iface-stream.c
+++ b/src/modules/dbus/iface-stream.c
@@ -70,9 +70,9 @@ static void handle_get_sample_format(DBusConnection *conn, DBusMessage *msg, voi
 static void handle_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 static void handle_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 static void handle_get_buffer_latency(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_device_latency(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_resample_method(DBusConnection *conn, DBusMessage *msg, void *userdata);
@@ -343,16 +343,18 @@ static void handle_get_volume(DBusConnection *conn, DBusMessage *msg, void *user
     pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_UINT32, volume, s->volume.channels);
 }
 
-static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     pa_dbusiface_stream *s = userdata;
-    unsigned stream_channels = 0;
+    DBusMessageIter array_iter;
+    int stream_channels = 0;
     dbus_uint32_t *volume = NULL;
-    unsigned n_volume_entries = 0;
+    int n_volume_entries = 0;
     pa_cvolume new_vol;
-    unsigned i = 0;
+    int i = 0;
 
     pa_assert(conn);
     pa_assert(msg);
+    pa_assert(iter);
     pa_assert(s);
 
     if (s->type == STREAM_TYPE_RECORD) {
@@ -366,8 +368,8 @@ static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, void *user
 
     new_vol.channels = stream_channels;
 
-    if (pa_dbus_get_fixed_array_set_property_arg(conn, msg, DBUS_TYPE_UINT32, &volume, &n_volume_entries) < 0)
-        return;
+    dbus_message_iter_recurse(iter, &array_iter);
+    dbus_message_iter_get_fixed_array(&array_iter, &volume, &n_volume_entries);
 
     if (n_volume_entries != stream_channels) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS,
@@ -403,16 +405,16 @@ static void handle_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *us
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &s->is_muted);
 }
 
-static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     pa_dbusiface_stream *s = userdata;
     dbus_bool_t is_muted = FALSE;
 
     pa_assert(conn);
     pa_assert(msg);
+    pa_assert(iter);
     pa_assert(s);
 
-    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_BOOLEAN, &is_muted) < 0)
-        return;
+    dbus_message_iter_get_basic(iter, &is_muted);
 
     if (s->type == STREAM_TYPE_RECORD) {
         pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Record streams don't have mute.");
@@ -575,19 +577,12 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
 static void handle_move(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_dbusiface_stream *s = userdata;
     const char *device = NULL;
-    DBusError error;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(s);
 
-    dbus_error_init(&error);
-
-    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &device, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
-        dbus_error_free(&error);
-        return;
-    }
+    pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &device, DBUS_TYPE_INVALID));
 
     if (s->type == STREAM_TYPE_PLAYBACK) {
         pa_sink *sink = pa_dbusiface_core_get_sink(s->core, device);
diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index 076b391..d45cf79 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -167,11 +167,11 @@ static void handle_get_entry_by_name(DBusConnection *conn, DBusMessage *msg, voi
 static void handle_entry_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_entry_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_entry_get_device(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_entry_set_device(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_entry_set_device(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 static void handle_entry_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_entry_set_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_entry_set_volume(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 static void handle_entry_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_entry_set_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_entry_set_is_muted(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 
 static void handle_entry_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
 
@@ -326,18 +326,20 @@ static void dbus_entry_free(struct dbus_entry *de) {
 
 /* Reads an array [(UInt32, UInt32)] from the iterator. The struct items are
  * are a channel position and a volume value, respectively. The result is
- * stored in the map and vol arguments. If the volume can't be read from the
- * iterator, an error reply is sent and a negative number is returned. In case
- * of a failure we make no guarantees about the state of map and vol. In case
- * of an empty array the channels field of both map and vol are set to 0. */
+ * stored in the map and vol arguments. The iterator must point to a "a(uu)"
+ * element. If the data is invalid, an error reply is sent and a negative
+ * number is returned. In case of a failure we make no guarantees about the
+ * state of map and vol. In case of an empty array the channels field of both
+ * map and vol are set to 0. This function calls dbus_message_iter_next(iter)
+ * before returning. */
 static int get_volume_arg(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, pa_channel_map *map, pa_cvolume *vol) {
     DBusMessageIter array_iter;
     DBusMessageIter struct_iter;
-    int arg_type;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(iter);
+    pa_assert(pa_streq(dbus_message_iter_get_signature(iter), "a(uu)"));
     pa_assert(map);
     pa_assert(vol);
 
@@ -347,21 +349,6 @@ static int get_volume_arg(DBusConnection *conn, DBusMessage *msg, DBusMessageIte
     map->channels = 0;
     vol->channels = 0;
 
-    arg_type = dbus_message_iter_get_arg_type(iter);
-    if (arg_type != DBUS_TYPE_ARRAY) {
-        if (arg_type == DBUS_TYPE_INVALID)
-            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments. An array was expected.");
-        else
-            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type: '%c'. An array was expected.", (char) arg_type);
-        return -1;
-    }
-
-    arg_type = dbus_message_iter_get_element_type(iter);
-    if (arg_type != DBUS_TYPE_STRUCT) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong array element type: '%c'. A struct was expected.", (char) arg_type);
-        return -1;
-    }
-
     dbus_message_iter_recurse(iter, &array_iter);
 
     while (dbus_message_iter_get_arg_type(&array_iter) != DBUS_TYPE_INVALID) {
@@ -370,29 +357,14 @@ static int get_volume_arg(DBusConnection *conn, DBusMessage *msg, DBusMessageIte
 
         dbus_message_iter_recurse(&array_iter, &struct_iter);
 
-        arg_type = dbus_message_iter_get_arg_type(&struct_iter);
-        if (arg_type != DBUS_TYPE_UINT32) {
-            pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong channel position type: '%c'. An unsigned 32-bit integer was expected.", (char) arg_type);
-            return -1;
-        }
-
         dbus_message_iter_get_basic(&struct_iter, &chan_pos);
-        dbus_message_iter_next(&struct_iter);
 
         if (chan_pos >= PA_CHANNEL_POSITION_MAX) {
             pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Invalid channel position: %u", chan_pos);
             return -1;
         }
 
-        arg_type = dbus_message_iter_get_arg_type(&struct_iter);
-        if (arg_type != DBUS_TYPE_UINT32) {
-            if (arg_type == DBUS_TYPE_INVALID)
-                pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Channel volume missing.");
-            else
-                pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Wrong volume value type: '%c'. An unsigned 32-bit integer was expected.", (char) arg_type);
-            return -1;
-        }
-
+        pa_assert_se(dbus_message_iter_next(&struct_iter));
         dbus_message_iter_get_basic(&struct_iter, &chan_vol);
 
         if (chan_vol > PA_VOLUME_MAX) {
@@ -612,40 +584,35 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
 static void handle_add_entry(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     struct userdata *u = userdata;
     DBusMessageIter msg_iter;
-    const char *name;
-    const char *device;
+    const char *name = NULL;
+    const char *device = NULL;
     pa_channel_map map;
     pa_cvolume vol;
-    dbus_bool_t muted;
-    dbus_bool_t apply_immediately;
+    dbus_bool_t muted = FALSE;
+    dbus_bool_t apply_immediately = FALSE;
     pa_datum key;
     pa_datum value;
-    struct dbus_entry *dbus_entry;
-    struct entry *e;
+    struct dbus_entry *dbus_entry = NULL;
+    struct entry *e = NULL;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(u);
 
-    if (!dbus_message_iter_init(msg, &msg_iter)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
-        return;
-    }
+    pa_assert_se(dbus_message_iter_init(msg, &msg_iter));
+    dbus_message_iter_get_basic(&msg_iter, &name);
 
-    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_STRING, &name) < 0)
-        return;
-
-    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_STRING, &device) < 0)
-        return;
+    pa_assert_se(dbus_message_iter_next(&msg_iter));
+    dbus_message_iter_get_basic(&msg_iter, &device);
 
+    pa_assert_se(dbus_message_iter_next(&msg_iter));
     if (get_volume_arg(conn, msg, &msg_iter, &map, &vol) < 0)
         return;
 
-    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_BOOLEAN, &muted) < 0)
-        return;
+    dbus_message_iter_get_basic(&msg_iter, &muted);
 
-    if (pa_dbus_get_basic_arg(conn, msg, &msg_iter, DBUS_TYPE_BOOLEAN, &apply_immediately) < 0)
-        return;
+    pa_assert_se(dbus_message_iter_next(&msg_iter));
+    dbus_message_iter_get_basic(&msg_iter, &apply_immediately);
 
     if (!*name) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "An empty string was given as the entry name.");
@@ -714,19 +681,12 @@ static void handle_get_entry_by_name(DBusConnection *conn, DBusMessage *msg, voi
     struct userdata *u = userdata;
     const char *name;
     struct dbus_entry *de;
-    DBusError error;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(u);
 
-    dbus_error_init(&error);
-
-    if (!dbus_message_get_args(msg, &error, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
-        dbus_error_free(&error);
-        return;
-    }
+    pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &name, DBUS_TYPE_INVALID));
 
     if (!(de = pa_hashmap_get(u->dbus_entries, name))) {
         pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NOT_FOUND, "No such stream restore entry.");
@@ -774,7 +734,7 @@ static void handle_entry_get_device(DBusConnection *conn, DBusMessage *msg, void
     pa_xfree(e);
 }
 
-static void handle_entry_set_device(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_entry_set_device(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     struct dbus_entry *de = userdata;
     const char *device;
     struct entry *e;
@@ -782,10 +742,10 @@ static void handle_entry_set_device(DBusConnection *conn, DBusMessage *msg, void
 
     pa_assert(conn);
     pa_assert(msg);
+    pa_assert(iter);
     pa_assert(de);
 
-    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_STRING, &device) < 0)
-        return;
+    dbus_message_iter_get_basic(iter, &device);
 
     pa_assert_se(e = read_entry(de->userdata, de->entry_name));
 
@@ -835,25 +795,19 @@ static void handle_entry_get_volume(DBusConnection *conn, DBusMessage *msg, void
     pa_xfree(e);
 }
 
-static void handle_entry_set_volume(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_entry_set_volume(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     struct dbus_entry *de = userdata;
-    DBusMessageIter msg_iter;
     pa_channel_map map;
     pa_cvolume vol;
-    struct entry *e;
-    pa_bool_t updated;
+    struct entry *e = NULL;
+    pa_bool_t updated = FALSE;
 
     pa_assert(conn);
     pa_assert(msg);
+    pa_assert(iter);
     pa_assert(de);
 
-    /* Skip the interface and property name arguments. */
-    if (!dbus_message_iter_init(msg, &msg_iter) || !dbus_message_iter_next(&msg_iter) || !dbus_message_iter_next(&msg_iter)) {
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
-        return;
-    }
-
-    if (get_volume_arg(conn, msg, &msg_iter, &map, &vol) < 0)
+    if (get_volume_arg(conn, msg, iter, &map, &vol) < 0)
         return;
 
     pa_assert_se(e = read_entry(de->userdata, de->entry_name));
@@ -901,7 +855,7 @@ static void handle_entry_get_is_muted(DBusConnection *conn, DBusMessage *msg, vo
     pa_xfree(e);
 }
 
-static void handle_entry_set_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_entry_set_is_muted(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     struct dbus_entry *de = userdata;
     pa_bool_t muted;
     struct entry *e;
@@ -909,10 +863,10 @@ static void handle_entry_set_is_muted(DBusConnection *conn, DBusMessage *msg, vo
 
     pa_assert(conn);
     pa_assert(msg);
+    pa_assert(iter);
     pa_assert(de);
 
-    if (pa_dbus_get_basic_set_property_arg(conn, msg, DBUS_TYPE_BOOLEAN, &muted) < 0)
-        return;
+    dbus_message_iter_get_basic(iter, &muted);
 
     pa_assert_se(e = read_entry(de->userdata, de->entry_name));
 
diff --git a/src/pulsecore/dbus-util.c b/src/pulsecore/dbus-util.c
index b45e6a6..e3700ea 100644
--- a/src/pulsecore/dbus-util.c
+++ b/src/pulsecore/dbus-util.c
@@ -291,7 +291,10 @@ pa_dbus_wrap_connection* pa_dbus_wrap_connection_new(pa_mainloop_api *m, pa_bool
     return pconn;
 }
 
-pa_dbus_wrap_connection* pa_dbus_wrap_connection_new_from_existing(pa_mainloop_api *m, pa_bool_t use_rtclock, DBusConnection *conn) {
+pa_dbus_wrap_connection* pa_dbus_wrap_connection_new_from_existing(
+        pa_mainloop_api *m,
+        pa_bool_t use_rtclock,
+        DBusConnection *conn) {
     pa_dbus_wrap_connection *pconn;
 
     pa_assert(m);
@@ -522,7 +525,10 @@ void pa_dbus_send_basic_variant_reply(DBusConnection *c, DBusMessage *in_reply_t
 
     pa_assert_se((reply = dbus_message_new_method_return(in_reply_to)));
     dbus_message_iter_init_append(reply, &msg_iter);
-    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_VARIANT, signature_from_basic_type(type), &variant_iter));
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter,
+                                                  DBUS_TYPE_VARIANT,
+                                                  signature_from_basic_type(type),
+                                                  &variant_iter));
     pa_assert_se(dbus_message_iter_append_basic(&variant_iter, type, data));
     pa_assert_se(dbus_message_iter_close_container(&msg_iter, &variant_iter));
     pa_assert_se(dbus_connection_send(c, reply, NULL));
@@ -548,7 +554,12 @@ static unsigned basic_type_size(int type) {
     }
 }
 
-void pa_dbus_send_basic_array_variant_reply(DBusConnection *c, DBusMessage *in_reply_to, int item_type, void *array, unsigned n) {
+void pa_dbus_send_basic_array_variant_reply(
+        DBusConnection *c,
+        DBusMessage *in_reply_to,
+        int item_type,
+        void *array,
+        unsigned n) {
     DBusMessage *reply = NULL;
     DBusMessageIter msg_iter;
 
@@ -641,7 +652,12 @@ void pa_dbus_append_basic_variant_dict_entry(DBusMessageIter *dict_iter, const c
     pa_assert_se(dbus_message_iter_close_container(dict_iter, &dict_entry_iter));
 }
 
-void pa_dbus_append_basic_array_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, int item_type, const void *array, unsigned n) {
+void pa_dbus_append_basic_array_variant_dict_entry(
+        DBusMessageIter *dict_iter,
+        const char *key,
+        int item_type,
+        const void *array,
+        unsigned n) {
     DBusMessageIter dict_entry_iter;
 
     pa_assert(dict_iter);
@@ -711,156 +727,18 @@ void pa_dbus_append_proplist_variant_dict_entry(DBusMessageIter *dict_iter, cons
     pa_assert_se(dbus_message_iter_close_container(dict_iter, &dict_entry_iter));
 }
 
-int pa_dbus_get_basic_set_property_arg(DBusConnection *c, DBusMessage *msg, int type, void *data) {
-    DBusMessageIter msg_iter;
-    DBusMessageIter variant_iter;
-
-    pa_assert(c);
-    pa_assert(msg);
-    pa_assert(dbus_type_is_basic(type));
-    pa_assert(data);
-
-    /* Skip the interface and property name arguments. */
-    if (!dbus_message_iter_init(msg, &msg_iter) || !dbus_message_iter_next(&msg_iter) || !dbus_message_iter_next(&msg_iter)) {
-        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
-        return -1;
-    }
-
-    if (dbus_message_iter_get_arg_type(&msg_iter) != DBUS_TYPE_VARIANT) {
-        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Message argument isn't a variant.");
-        return -1;
-    }
-
-    dbus_message_iter_recurse(&msg_iter, &variant_iter);
-
-    if (pa_dbus_get_basic_arg(c, msg, &variant_iter, type, data) < 0)
-        return -1;
-
-    return 0;
-}
-
-int pa_dbus_get_fixed_array_set_property_arg(DBusConnection *c, DBusMessage *msg, int item_type, void *data, unsigned *n) {
-    DBusMessageIter msg_iter;
-    DBusMessageIter variant_iter;
-
-    pa_assert(c);
-    pa_assert(msg);
-    pa_assert(dbus_type_is_fixed(item_type));
-    pa_assert(data);
-    pa_assert(n);
-
-    /* Skip the interface and property name arguments. */
-    if (!dbus_message_iter_init(msg, &msg_iter) || !dbus_message_iter_next(&msg_iter) || !dbus_message_iter_next(&msg_iter)) {
-        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments.");
-        return -1;
-    }
-
-    if (dbus_message_iter_get_arg_type(&msg_iter) != DBUS_TYPE_VARIANT) {
-        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Message argument isn't a variant.");
-        return -1;
-    }
-
-    dbus_message_iter_recurse(&msg_iter, &variant_iter);
-
-    if (pa_dbus_get_fixed_array_arg(c, msg, &variant_iter, item_type, data, n) < 0)
-        return -1;
-
-    return 0;
-}
-
-int pa_dbus_get_basic_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter, int type, void *data) {
-    int arg_type;
-
-    pa_assert(c);
-    pa_assert(msg);
-    pa_assert(iter);
-    pa_assert(dbus_type_is_basic(type));
-    pa_assert(data);
-
-    arg_type = dbus_message_iter_get_arg_type(iter);
-    if (arg_type != type) {
-        if (arg_type == DBUS_TYPE_INVALID)
-            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments. D-Bus type '%c' expected.", (char) type);
-        else
-            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type: '%c'. Expected type '%c'.", (char) arg_type, (char) type);
-        return -1;
-    }
-
-    dbus_message_iter_get_basic(iter, data);
-
-    dbus_message_iter_next(iter);
-
-    return 0;
-}
-
-int pa_dbus_get_fixed_array_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter, int item_type, void *array, unsigned *n) {
-    DBusMessageIter array_iter;
-    int signed_n;
-    int arg_type;
-    int element_type;
-
-    pa_assert(c);
-    pa_assert(msg);
-    pa_assert(iter);
-    pa_assert(dbus_type_is_fixed(item_type));
-    pa_assert(array);
-    pa_assert(n);
-
-    arg_type = dbus_message_iter_get_arg_type(iter);
-    if (arg_type != DBUS_TYPE_ARRAY) {
-        if (arg_type == DBUS_TYPE_INVALID)
-            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments. An array of type '%c' was expected.", (char) item_type);
-        else
-            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type: '%c'. An array of type '%c' was expected.", (char) arg_type, (char) item_type);
-        return -1;
-    }
-
-    element_type = dbus_message_iter_get_element_type(iter);
-    if (element_type != item_type) {
-        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong array element type: '%c'. Element type '%c' was expected.", (char) element_type, (char) item_type);
-        return -1;
-    }
-
-    dbus_message_iter_recurse(iter, &array_iter);
-
-    dbus_message_iter_get_fixed_array(&array_iter, array, &signed_n);
-
-    dbus_message_iter_next(iter);
-
-    pa_assert(signed_n >= 0);
-
-    *n = signed_n;
-
-    return 0;
-}
-
 pa_proplist *pa_dbus_get_proplist_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter) {
     DBusMessageIter dict_iter;
     DBusMessageIter dict_entry_iter;
-    int arg_type;
     pa_proplist *proplist = NULL;
-    const char *key;
-    const uint8_t *value;
-    int value_length;
+    const char *key = NULL;
+    const uint8_t *value = NULL;
+    int value_length = 0;
 
     pa_assert(c);
     pa_assert(msg);
     pa_assert(iter);
-
-    arg_type = dbus_message_iter_get_arg_type(iter);
-    if (arg_type != DBUS_TYPE_ARRAY) {
-        if (arg_type == DBUS_TYPE_INVALID)
-            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Too few arguments. An array was expected.");
-        else
-            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong argument type: '%c'. An array was expected.", (char) arg_type);
-        return NULL;
-    }
-
-    arg_type = dbus_message_iter_get_element_type(iter);
-    if (arg_type != DBUS_TYPE_DICT_ENTRY) {
-        pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong array element type: '%c'. A dictionary entry was expected.", (char) arg_type);
-        return NULL;
-    }
+    pa_assert(pa_streq(dbus_message_iter_get_signature(iter), "a{say}"));
 
     proplist = pa_proplist_new();
 
@@ -869,32 +747,11 @@ pa_proplist *pa_dbus_get_proplist_arg(DBusConnection *c, DBusMessage *msg, DBusM
     while (dbus_message_iter_get_arg_type(&dict_iter) != DBUS_TYPE_INVALID) {
         dbus_message_iter_recurse(&dict_iter, &dict_entry_iter);
 
-        arg_type = dbus_message_iter_get_arg_type(&dict_entry_iter);
-        if (arg_type != DBUS_TYPE_STRING) {
-            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict key type: '%c'. A string was expected.", (char) arg_type);
-            goto fail;
-        }
-
         dbus_message_iter_get_basic(&dict_entry_iter, &key);
         dbus_message_iter_next(&dict_entry_iter);
 
         if (strlen(key) <= 0 || !pa_ascii_valid(key)) {
-            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Invalid property list key.");
-            goto fail;
-        }
-
-        arg_type = dbus_message_iter_get_arg_type(&dict_entry_iter);
-        if (arg_type != DBUS_TYPE_ARRAY) {
-            if (arg_type == DBUS_TYPE_INVALID)
-                pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Dict value missing.");
-            else
-                pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict value type: '%c'. An array was expected.", (char) arg_type);
-            goto fail;
-        }
-
-        arg_type = dbus_message_iter_get_element_type(&dict_entry_iter);
-        if (arg_type != DBUS_TYPE_BYTE) {
-            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Wrong dict value item type: '%c'. A byte was expected.", (char) arg_type);
+            pa_dbus_send_error(c, msg, DBUS_ERROR_INVALID_ARGS, "Invalid property list key: '%s'.", key);
             goto fail;
         }
 
diff --git a/src/pulsecore/dbus-util.h b/src/pulsecore/dbus-util.h
index 9cee293..f35e66c 100644
--- a/src/pulsecore/dbus-util.h
+++ b/src/pulsecore/dbus-util.h
@@ -32,7 +32,10 @@
 typedef struct pa_dbus_wrap_connection pa_dbus_wrap_connection;
 
 pa_dbus_wrap_connection* pa_dbus_wrap_connection_new(pa_mainloop_api *mainloop, pa_bool_t use_rtclock, DBusBusType type, DBusError *error);
-pa_dbus_wrap_connection* pa_dbus_wrap_connection_new_from_existing(pa_mainloop_api *mainloop, pa_bool_t use_rtclock, DBusConnection *conn);
+pa_dbus_wrap_connection* pa_dbus_wrap_connection_new_from_existing(
+        pa_mainloop_api *mainloop,
+        pa_bool_t use_rtclock,
+        DBusConnection *conn);
 void pa_dbus_wrap_connection_free(pa_dbus_wrap_connection* conn);
 
 DBusConnection* pa_dbus_wrap_connection_get(pa_dbus_wrap_connection *conn);
@@ -63,36 +66,41 @@ void pa_dbus_sync_pending_list(pa_dbus_pending **p);
 void pa_dbus_free_pending_list(pa_dbus_pending **p);
 
 /* Sends an error message as the reply to the given message. */
-void pa_dbus_send_error(DBusConnection *c, DBusMessage *in_reply_to, const char *name, const char *format, ...) PA_GCC_PRINTF_ATTR(4, 5);
+void pa_dbus_send_error(
+        DBusConnection *c,
+        DBusMessage *in_reply_to,
+        const char *name,
+        const char *format, ...) PA_GCC_PRINTF_ATTR(4, 5);
 
 void pa_dbus_send_empty_reply(DBusConnection *c, DBusMessage *in_reply_to);
 void pa_dbus_send_basic_value_reply(DBusConnection *c, DBusMessage *in_reply_to, int type, void *data);
 void pa_dbus_send_basic_variant_reply(DBusConnection *c, DBusMessage *in_reply_to, int type, void *data);
-void pa_dbus_send_basic_array_variant_reply(DBusConnection *c, DBusMessage *in_reply_to, int item_type, void *array, unsigned n);
+void pa_dbus_send_basic_array_variant_reply(
+        DBusConnection *c,
+        DBusMessage *in_reply_to,
+        int item_type,
+        void *array,
+        unsigned n);
 void pa_dbus_send_proplist_variant_reply(DBusConnection *c, DBusMessage *in_reply_to, pa_proplist *proplist);
 
 void pa_dbus_append_basic_array(DBusMessageIter *iter, int item_type, const void *array, unsigned n);
 void pa_dbus_append_basic_array_variant(DBusMessageIter *iter, int item_type, const void *array, unsigned n);
 void pa_dbus_append_basic_variant(DBusMessageIter *iter, int type, void *data);
 void pa_dbus_append_basic_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, int type, void *data);
-void pa_dbus_append_basic_array_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, int item_type, const void *array, unsigned n);
+void pa_dbus_append_basic_array_variant_dict_entry(
+        DBusMessageIter *dict_iter,
+        const char *key,
+        int item_type,
+        const void *array,
+        unsigned n);
 void pa_dbus_append_proplist(DBusMessageIter *iter, pa_proplist *proplist);
 void pa_dbus_append_proplist_variant(DBusMessageIter *iter, pa_proplist *proplist);
 void pa_dbus_append_proplist_variant_dict_entry(DBusMessageIter *dict_iter, const char *key, pa_proplist *proplist);
 
-/* Helper functions for extracting the value argument of a Set call. If the
- * message is invalid, an error reply is sent and a negative number is
- * returned. */
-int pa_dbus_get_basic_set_property_arg(DBusConnection *c, DBusMessage *msg, int type, void *data);
-int pa_dbus_get_fixed_array_set_property_arg(DBusConnection *c, DBusMessage *msg, int item_type, void *data, unsigned *n);
-
-/* If the arguments can't be read from the iterator, an error reply is sent and
- * a negative number is returned. */
-int pa_dbus_get_basic_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter, int type, void *data);
-int pa_dbus_get_fixed_array_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter, int item_type, void *array, unsigned *n);
-
-/* Returns a new proplist that the caller has to free. If the proplist can't be
- * read from the iterator, an error reply is sent and NULL is returned. */
+/* Returns a new proplist that the caller has to free. If the proplist contains
+ * invalid keys, an error reply is sent and NULL is returned. The iterator must
+ * point to "a{say}" element. This function calls dbus_message_iter_next(iter)
+ * before returning. */
 pa_proplist *pa_dbus_get_proplist_arg(DBusConnection *c, DBusMessage *msg, DBusMessageIter *iter);
 
 #endif
diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index d1e19ff..9102251 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -257,37 +257,90 @@ static void update_introspection(struct object_entry *oe) {
     oe->introspection = pa_strbuf_tostring_free(buf);
 }
 
+/* Return value of find_handler() and its subfunctions. */
 enum find_result_t {
-    FOUND_METHOD,
+    /* The received message is a valid .Get call. */
     FOUND_GET_PROPERTY,
+
+    /* The received message is a valid .Set call. */
     FOUND_SET_PROPERTY,
+
+    /* The received message is a valid .GetAll call. */
     FOUND_GET_ALL,
+
+    /* The received message is a valid method call. */
+    FOUND_METHOD,
+
+    /* The interface of the received message hasn't been registered for the
+     * destination object. */
+    NO_SUCH_INTERFACE,
+
+    /* No property handler was found for the received .Get or .Set call. */
+    NO_SUCH_PROPERTY,
+
+    /* The interface argument of a property call didn't match any registered
+     * interface. */
+    NO_SUCH_PROPERTY_INTERFACE,
+
+    /* The received message called .Get or .Set for a property whose access
+     * mode doesn't match the call. */
     PROPERTY_ACCESS_DENIED,
+
+    /* The new value signature of a .Set call didn't match the expexted
+     * signature. */
+    INVALID_PROPERTY_SIG,
+
+    /* No method handler was found for the received message. */
     NO_SUCH_METHOD,
-    NO_SUCH_PROPERTY,
-    INVALID_MESSAGE_ARGUMENTS
+
+    /* The signature of the received message didn't match the expected
+     * signature. Despite the name, this can also be returned for a property
+     * call if its message signature is invalid. */
+    INVALID_METHOD_SIG
 };
 
-static enum find_result_t find_handler_by_property(struct object_entry *obj_entry,
-                                                   DBusMessage *msg,
-                                                   const char *property,
-                                                   struct interface_entry **iface_entry,
-                                                   pa_dbus_property_handler **property_handler) {
+/* Data for resolving the correct reaction to a received message. */
+struct call_info {
+    DBusMessage *message; /* The received message. */
+    struct object_entry *obj_entry;
+    const char *interface; /* Destination interface name (extracted from the message). */
+    struct interface_entry *iface_entry;
+
+    const char *property; /* Property name (extracted from the message). */
+    const char *property_interface; /* The interface argument of a property call is stored here. */
+    pa_dbus_property_handler *property_handler;
+    const char *expected_property_sig; /* Property signature from the introspection data. */
+    const char *property_sig; /* The signature of the new value in the received .Set message. */
+    DBusMessageIter variant_iter; /* Iterator pointing to the beginning of the new value variant of a .Set call. */
+
+    const char *method; /* Method name (extracted from the message). */
+    pa_dbus_method_handler *method_handler;
+    const char *expected_method_sig; /* Method signature from the introspection data. */
+    const char *method_sig; /* The signature of the received message. */
+};
+
+/* Called when call_info->property has been set and the property interface has
+ * not been given. In case of a Set call, call_info->property_sig is also set,
+ * which is checked against the expected value in this function. */
+static enum find_result_t find_handler_by_property(struct call_info *call_info) {
     void *state = NULL;
 
-    pa_assert(obj_entry);
-    pa_assert(msg);
-    pa_assert(property);
-    pa_assert(iface_entry);
-    pa_assert(property_handler);
-
-    PA_HASHMAP_FOREACH(*iface_entry, obj_entry->interfaces, state) {
-        if ((*property_handler = pa_hashmap_get((*iface_entry)->property_handlers, property))) {
-            if (dbus_message_has_member(msg, "Get"))
-                return (*property_handler)->get_cb ? FOUND_GET_PROPERTY : PROPERTY_ACCESS_DENIED;
-            else if (dbus_message_has_member(msg, "Set"))
-                return (*property_handler)->set_cb ? FOUND_SET_PROPERTY : PROPERTY_ACCESS_DENIED;
-            else
+    pa_assert(call_info);
+
+    PA_HASHMAP_FOREACH(call_info->iface_entry, call_info->obj_entry->interfaces, state) {
+        if ((call_info->property_handler = pa_hashmap_get(call_info->iface_entry->property_handlers, call_info->property))) {
+            if (pa_streq(call_info->method, "Get"))
+                return call_info->property_handler->get_cb ? FOUND_GET_PROPERTY : PROPERTY_ACCESS_DENIED;
+
+            else if (pa_streq(call_info->method, "Set")) {
+                call_info->expected_property_sig = call_info->property_handler->type;
+
+                if (pa_streq(call_info->property_sig, call_info->expected_property_sig))
+                    return call_info->property_handler->set_cb ? FOUND_SET_PROPERTY : PROPERTY_ACCESS_DENIED;
+                else
+                    return INVALID_PROPERTY_SIG;
+
+            } else
                 pa_assert_not_reached();
         }
     }
@@ -295,120 +348,138 @@ static enum find_result_t find_handler_by_property(struct object_entry *obj_entr
     return NO_SUCH_PROPERTY;
 }
 
-static enum find_result_t find_handler_by_method(struct object_entry *obj_entry,
-                                                 const char *method,
-                                                 struct interface_entry **iface_entry,
-                                                 pa_dbus_method_handler **method_handler) {
+static enum find_result_t find_handler_by_method(struct call_info *call_info) {
     void *state = NULL;
 
-    pa_assert(obj_entry);
-    pa_assert(method);
-    pa_assert(iface_entry);
-    pa_assert(method_handler);
+    pa_assert(call_info);
 
-    PA_HASHMAP_FOREACH(*iface_entry, obj_entry->interfaces, state) {
-        if ((*method_handler = pa_hashmap_get((*iface_entry)->method_handlers, method)))
+    PA_HASHMAP_FOREACH(call_info->iface_entry, call_info->obj_entry->interfaces, state) {
+        if ((call_info->method_handler = pa_hashmap_get(call_info->iface_entry->method_handlers, call_info->method)))
             return FOUND_METHOD;
     }
 
     return NO_SUCH_METHOD;
 }
 
-static enum find_result_t find_handler_from_properties_call(struct object_entry *obj_entry,
-                                                            DBusMessage *msg,
-                                                            struct interface_entry **iface_entry,
-                                                            pa_dbus_property_handler **property_handler,
-                                                            const char **attempted_property) {
-    const char *interface;
+static enum find_result_t find_handler_from_properties_call(struct call_info *call_info) {
+    pa_assert(call_info);
 
-    pa_assert(obj_entry);
-    pa_assert(msg);
-    pa_assert(iface_entry);
+    if (pa_streq(call_info->method, "GetAll")) {
+        call_info->expected_method_sig = "s";
+        if (!pa_streq(call_info->method_sig, call_info->expected_method_sig))
+            return INVALID_METHOD_SIG;
 
-    if (dbus_message_has_member(msg, "GetAll")) {
-        if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_INVALID))
-            return INVALID_MESSAGE_ARGUMENTS;
+        pa_assert_se(dbus_message_get_args(call_info->message, NULL,
+                                           DBUS_TYPE_STRING, &call_info->property_interface,
+                                           DBUS_TYPE_INVALID));
 
-        if (*interface) {
-            if ((*iface_entry = pa_hashmap_get(obj_entry->interfaces, interface)))
+        if (*call_info->property_interface) {
+            if ((call_info->iface_entry = pa_hashmap_get(call_info->obj_entry->interfaces, call_info->property_interface)))
                 return FOUND_GET_ALL;
-            else {
-                return NO_SUCH_METHOD; /* XXX: NO_SUCH_INTERFACE or something like that might be more accurate. */
-            }
+            else
+                return NO_SUCH_PROPERTY_INTERFACE;
+
         } else {
-            pa_assert_se((*iface_entry = pa_hashmap_first(obj_entry->interfaces)));
+            pa_assert_se(call_info->iface_entry = pa_hashmap_first(call_info->obj_entry->interfaces));
             return FOUND_GET_ALL;
         }
-    } else {
-        if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, attempted_property, DBUS_TYPE_INVALID))
-            return INVALID_MESSAGE_ARGUMENTS;
-
-        if (*interface) {
-            if ((*iface_entry = pa_hashmap_get(obj_entry->interfaces, interface)) &&
-                (*property_handler = pa_hashmap_get((*iface_entry)->property_handlers, *attempted_property))) {
-                if (dbus_message_has_member(msg, "Get"))
-                    return (*property_handler)->get_cb ? FOUND_GET_PROPERTY : PROPERTY_ACCESS_DENIED;
-                else if (dbus_message_has_member(msg, "Set"))
-                    return (*property_handler)->set_cb ? FOUND_SET_PROPERTY : PROPERTY_ACCESS_DENIED;
+
+    } else if (pa_streq(call_info->method, "Get")) {
+        call_info->expected_method_sig = "ss";
+        if (!pa_streq(call_info->method_sig, call_info->expected_method_sig))
+            return INVALID_METHOD_SIG;
+
+        pa_assert_se(dbus_message_get_args(call_info->message, NULL,
+                                           DBUS_TYPE_STRING, &call_info->property_interface,
+                                           DBUS_TYPE_STRING, &call_info->property,
+                                           DBUS_TYPE_INVALID));
+
+        if (*call_info->property_interface) {
+            if (!(call_info->iface_entry = pa_hashmap_get(call_info->obj_entry->interfaces, call_info->property_interface)))
+                return NO_SUCH_PROPERTY_INTERFACE;
+            else if ((call_info->property_handler =
+                        pa_hashmap_get(call_info->iface_entry->property_handlers, call_info->property)))
+                return FOUND_GET_PROPERTY;
+            else
+                return NO_SUCH_PROPERTY;
+
+        } else
+            return find_handler_by_property(call_info);
+
+    } else if (pa_streq(call_info->method, "Set")) {
+        DBusMessageIter msg_iter;
+
+        call_info->expected_method_sig = "ssv";
+        if (!pa_streq(call_info->method_sig, call_info->expected_method_sig))
+            return INVALID_METHOD_SIG;
+
+        pa_assert_se(dbus_message_iter_init(call_info->message, &msg_iter));
+
+        dbus_message_iter_get_basic(&msg_iter, &call_info->property_interface);
+        pa_assert_se(dbus_message_iter_next(&msg_iter));
+        dbus_message_iter_get_basic(&msg_iter, &call_info->property);
+        pa_assert_se(dbus_message_iter_next(&msg_iter));
+
+        dbus_message_iter_recurse(&msg_iter, &call_info->variant_iter);
+
+        call_info->property_sig = dbus_message_iter_get_signature(&call_info->variant_iter);
+
+        if (*call_info->property_interface) {
+            if (!(call_info->iface_entry = pa_hashmap_get(call_info->obj_entry->interfaces, call_info->property_interface)))
+                return NO_SUCH_PROPERTY_INTERFACE;
+
+            else if ((call_info->property_handler =
+                        pa_hashmap_get(call_info->iface_entry->property_handlers, call_info->property))) {
+                call_info->expected_property_sig = call_info->property_handler->type;
+
+                if (pa_streq(call_info->property_sig, call_info->expected_property_sig))
+                    return FOUND_SET_PROPERTY;
                 else
-                    pa_assert_not_reached();
+                    return INVALID_PROPERTY_SIG;
+
             } else
                 return NO_SUCH_PROPERTY;
+
         } else
-            return find_handler_by_property(obj_entry, msg, *attempted_property, iface_entry, property_handler);
-    }
-}
+            return find_handler_by_property(call_info);
 
-static enum find_result_t find_handler(struct object_entry *obj_entry,
-                                       DBusMessage *msg,
-                                       struct interface_entry **iface_entry,
-                                       pa_dbus_method_handler **method_handler,
-                                       pa_dbus_property_handler **property_handler,
-                                       const char **attempted_property) {
-    const char *interface;
+    } else
+        pa_assert_not_reached();
+}
 
-    pa_assert(obj_entry);
-    pa_assert(msg);
-    pa_assert(iface_entry);
-    pa_assert(method_handler);
-    pa_assert(property_handler);
-    pa_assert(attempted_property);
+static enum find_result_t find_handler(struct call_info *call_info) {
+    pa_assert(call_info);
 
-    *iface_entry = NULL;
-    *method_handler = NULL;
+    if (call_info->interface) {
+        if (pa_streq(call_info->interface, DBUS_INTERFACE_PROPERTIES))
+            return find_handler_from_properties_call(call_info);
 
-    if (dbus_message_has_interface(msg, DBUS_INTERFACE_PROPERTIES))
-        return find_handler_from_properties_call(obj_entry, msg, iface_entry, property_handler, attempted_property);
+        else if (!(call_info->iface_entry = pa_hashmap_get(call_info->obj_entry->interfaces, call_info->interface)))
+            return NO_SUCH_INTERFACE;
 
-    else if ((interface = dbus_message_get_interface(msg))) {
-        if ((*iface_entry = pa_hashmap_get(obj_entry->interfaces, interface)) &&
-            (*method_handler = pa_hashmap_get((*iface_entry)->method_handlers, dbus_message_get_member(msg))))
+        else if ((call_info->method_handler = pa_hashmap_get(call_info->iface_entry->method_handlers, call_info->method)))
             return FOUND_METHOD;
-        else {
-            pa_log("Message has unknown interface or there's no method handler.");
+
+        else
             return NO_SUCH_METHOD;
-        }
 
     } else { /* The method call doesn't contain an interface. */
-        if (dbus_message_has_member(msg, "Get") || dbus_message_has_member(msg, "Set") || dbus_message_has_member(msg, "GetAll")) {
-            if (find_handler_by_method(obj_entry, dbus_message_get_member(msg), iface_entry, method_handler) == FOUND_METHOD)
-                return FOUND_METHOD; /* The object has a method named Get, Set or GetAll in some other interface than .Properties. */
+        if (pa_streq(call_info->method, "Get") || pa_streq(call_info->method, "Set") || pa_streq(call_info->method, "GetAll")) {
+            if (find_handler_by_method(call_info) == FOUND_METHOD)
+                /* The object has a method named Get, Set or GetAll in some other interface than .Properties. */
+                return FOUND_METHOD;
             else
                 /* Assume this is a .Properties call. */
-                return find_handler_from_properties_call(obj_entry, msg, iface_entry, property_handler, attempted_property);
+                return find_handler_from_properties_call(call_info);
 
         } else /* This is not a .Properties call. */
-            return find_handler_by_method(obj_entry, dbus_message_get_member(msg), iface_entry, method_handler);
+            return find_handler_by_method(call_info);
     }
 }
 
 static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessage *message, void *user_data) {
     pa_dbus_protocol *p = user_data;
-    struct object_entry *obj_entry = NULL;
-    struct interface_entry *iface_entry = NULL;
-    pa_dbus_method_handler *method_handler = NULL;
-    pa_dbus_property_handler *property_handler = NULL;
-    const char *attempted_property = NULL;
+    struct call_info call_info;
 
     pa_assert(connection);
     pa_assert(message);
@@ -423,49 +494,72 @@ static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessa
                  dbus_message_get_interface(message),
                  dbus_message_get_member(message));
 
-    pa_assert_se((obj_entry = pa_hashmap_get(p->objects, dbus_message_get_path(message))));
+    call_info.message = message;
+    pa_assert_se(call_info.obj_entry = pa_hashmap_get(p->objects, dbus_message_get_path(message)));
+    call_info.interface = dbus_message_get_interface(message);
+    pa_assert_se(call_info.method = dbus_message_get_member(message));
+    pa_assert_se(call_info.method_sig = dbus_message_get_signature(message));
 
     if (dbus_message_is_method_call(message, "org.freedesktop.DBus.Introspectable", "Introspect") ||
         (!dbus_message_get_interface(message) && dbus_message_has_member(message, "Introspect"))) {
-        pa_dbus_send_basic_value_reply(connection, message, DBUS_TYPE_STRING, &obj_entry->introspection);
+        pa_dbus_send_basic_value_reply(connection, message, DBUS_TYPE_STRING, &call_info.obj_entry->introspection);
         goto finish;
     }
 
-    switch (find_handler(obj_entry, message, &iface_entry, &method_handler, &property_handler, &attempted_property)) {
-        case FOUND_METHOD:
-            method_handler->receive_cb(connection, message, iface_entry->userdata);
-            break;
-
+    switch (find_handler(&call_info)) {
         case FOUND_GET_PROPERTY:
-            property_handler->get_cb(connection, message, iface_entry->userdata);
+            call_info.property_handler->get_cb(connection, message, call_info.iface_entry->userdata);
             break;
 
         case FOUND_SET_PROPERTY:
-            property_handler->set_cb(connection, message, iface_entry->userdata);
+            call_info.property_handler->set_cb(connection, message, &call_info.variant_iter, call_info.iface_entry->userdata);
+            break;
+
+        case FOUND_METHOD:
+            call_info.method_handler->receive_cb(connection, message, call_info.iface_entry->userdata);
             break;
 
         case FOUND_GET_ALL:
-            if (iface_entry->get_all_properties_cb)
-                iface_entry->get_all_properties_cb(connection, message, iface_entry->userdata);
-            /* TODO: Write an else branch where a dummy response is sent. */
+            if (call_info.iface_entry->get_all_properties_cb)
+                call_info.iface_entry->get_all_properties_cb(connection, message, call_info.iface_entry->userdata);
+            else {
+                DBusMessage *dummy_reply = NULL;
+                DBusMessageIter msg_iter;
+                DBusMessageIter dict_iter;
+
+                pa_assert_se(dummy_reply = dbus_message_new_method_return(message));
+                dbus_message_iter_init_append(dummy_reply, &msg_iter);
+                pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+                pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+                pa_assert_se(dbus_connection_send(connection, dummy_reply, NULL));
+                dbus_message_unref(dummy_reply);
+            }
             break;
 
         case PROPERTY_ACCESS_DENIED:
-            pa_dbus_send_error(connection, message, DBUS_ERROR_ACCESS_DENIED, "%s access denied for property %s", dbus_message_get_member(message), attempted_property);
+            pa_dbus_send_error(connection, message, DBUS_ERROR_ACCESS_DENIED,
+                               "%s access denied for property %s", call_info.method, call_info.property);
             break;
 
         case NO_SUCH_METHOD:
-            pa_dbus_send_error(connection, message, DBUS_ERROR_UNKNOWN_METHOD, "%s: No such method", dbus_message_get_member(message));
+            pa_dbus_send_error(connection, message, DBUS_ERROR_UNKNOWN_METHOD, "No such method: %s", call_info.method);
             break;
 
         case NO_SUCH_PROPERTY:
-            pa_dbus_send_error(connection, message, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "%s: No such property", attempted_property);
+            pa_dbus_send_error(connection, message, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "No such property: %s", call_info.property);
             break;
 
-        case INVALID_MESSAGE_ARGUMENTS:
-            pa_dbus_send_error(connection, message, DBUS_ERROR_INVALID_ARGS, "Invalid arguments for %s", dbus_message_get_member(message));
+        case INVALID_METHOD_SIG:
+            pa_dbus_send_error(connection, message, DBUS_ERROR_INVALID_ARGS,
+                               "Invalid signature for method %s: '%s'. Expected '%s'.",
+                               call_info.method, call_info.method_sig, call_info.expected_method_sig);
             break;
 
+        case INVALID_PROPERTY_SIG:
+            pa_dbus_send_error(connection, message, DBUS_ERROR_INVALID_ARGS,
+                               "Invalid signature for property %s: '%s'. Expected '%s'.",
+                               call_info.property, call_info.property_sig, call_info.expected_property_sig);
+
         default:
             pa_assert_not_reached();
     }
@@ -821,7 +915,12 @@ pa_client *pa_dbus_protocol_get_client(pa_dbus_protocol *p, DBusConnection *conn
     return conn_entry->client;
 }
 
-void pa_dbus_protocol_add_signal_listener(pa_dbus_protocol *p, DBusConnection *conn, const char *signal, char **objects, unsigned n_objects) {
+void pa_dbus_protocol_add_signal_listener(
+        pa_dbus_protocol *p,
+        DBusConnection *conn,
+        const char *signal,
+        char **objects,
+        unsigned n_objects) {
     struct connection_entry *conn_entry;
     pa_idxset *object_set;
     char *object_path;
@@ -981,7 +1080,12 @@ int pa_dbus_protocol_unregister_extension(pa_dbus_protocol *p, const char *name)
     return 0;
 }
 
-pa_hook_slot *pa_dbus_protocol_hook_connect(pa_dbus_protocol *p, pa_dbus_protocol_hook_t hook, pa_hook_priority_t prio, pa_hook_cb_t cb, void *data) {
+pa_hook_slot *pa_dbus_protocol_hook_connect(
+        pa_dbus_protocol *p,
+        pa_dbus_protocol_hook_t hook,
+        pa_hook_priority_t prio,
+        pa_hook_cb_t cb,
+        void *data) {
     pa_assert(p);
     pa_assert(hook < PA_DBUS_PROTOCOL_HOOK_MAX);
     pa_assert(cb);
diff --git a/src/pulsecore/protocol-dbus.h b/src/pulsecore/protocol-dbus.h
index d771b4f..6d100f7 100644
--- a/src/pulsecore/protocol-dbus.h
+++ b/src/pulsecore/protocol-dbus.h
@@ -56,9 +56,19 @@ void pa_dbus_protocol_unref(pa_dbus_protocol *p);
  * message isn't a good idea; if you can't handle the message, reply with an
  * error.
  *
+ * The message signature is already checked against the introspection data, so
+ * you don't have to do that yourself.
+ *
  * All messages are method calls. */
 typedef void (*pa_dbus_receive_cb_t)(DBusConnection *conn, DBusMessage *msg, void *userdata);
 
+/* A specialized version of pa_dbus_receive_cb_t: the additional iterator
+ * argument points to the element inside the new value variant.
+ *
+ * The new value signature is checked against the introspection data, so you
+ * don't have to do that yourself. */
+typedef void (*pa_dbus_set_property_cb_t)(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
+
 typedef struct pa_dbus_arg_info {
     const char *name;
     const char *type;
@@ -85,7 +95,7 @@ typedef struct pa_dbus_property_handler {
     /* The access mode for the property is determined by checking whether
      * get_cb or set_cb is NULL. */
     pa_dbus_receive_cb_t get_cb;
-    pa_dbus_receive_cb_t set_cb;
+    pa_dbus_set_property_cb_t set_cb;
 } pa_dbus_property_handler;
 
 typedef struct pa_dbus_interface_info {
@@ -140,7 +150,12 @@ pa_client *pa_dbus_protocol_get_client(pa_dbus_protocol *p, DBusConnection *conn
  * only signals from the given objects are delivered. If this function is
  * called multiple time for the same connection and signal, the latest call
  * always replaces the previous object list. */
-void pa_dbus_protocol_add_signal_listener(pa_dbus_protocol *p, DBusConnection *conn, const char *signal, char **objects, unsigned n_objects);
+void pa_dbus_protocol_add_signal_listener(
+        pa_dbus_protocol *p,
+        DBusConnection *conn,
+        const char *signal,
+        char **objects,
+        unsigned n_objects);
 
 /* Disables the delivery of the signal for the given connection. The connection
  * must have been registered. If signal is NULL, all signals are disabled. If
@@ -192,6 +207,11 @@ typedef enum pa_dbus_protocol_hook {
     PA_DBUS_PROTOCOL_HOOK_MAX
 } pa_dbus_protocol_hook_t;
 
-pa_hook_slot *pa_dbus_protocol_hook_connect(pa_dbus_protocol *p, pa_dbus_protocol_hook_t hook, pa_hook_priority_t prio, pa_hook_cb_t cb, void *data);
+pa_hook_slot *pa_dbus_protocol_hook_connect(
+        pa_dbus_protocol *p,
+        pa_dbus_protocol_hook_t hook,
+        pa_hook_priority_t prio,
+        pa_hook_cb_t cb,
+        void *data);
 
 #endif

commit 0ad2d55cbe86d13d5cd355f2b5d59360d681ccc2
Merge: 0e09663 8bf2e3f
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sun Aug 30 20:07:31 2009 +0300

    Merge branch 'master' of git://0pointer.de/pulseaudio into dbus-work
    
    Conflicts:
    	src/modules/module-stream-restore.c

diff --cc src/modules/module-stream-restore.c
index d45cf79,d6e3c15..8389be6
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@@ -1834,40 -934,13 +1834,44 @@@ static int extension_cb(pa_native_proto
                  data.data = &entry;
                  data.size = sizeof(entry);
  
+                 pa_log_debug("Client %s changes entry %s.",
+                              pa_strnull(pa_proplist_gets(pa_native_connection_get_client(c)->proplist, PA_PROP_APPLICATION_PROCESS_BINARY)),
+                              name);
+ 
 -                if (pa_database_set(u->database, &key, &data, mode == PA_UPDATE_REPLACE) == 0)
 +                if (pa_database_set(u->database, &key, &data, mode == PA_UPDATE_REPLACE) == 0) {
 +#ifdef HAVE_DBUS
 +                    struct dbus_entry *de;
 +
 +                    if (old) {
 +                        pa_assert_se((de = pa_hashmap_get(u->dbus_entries, name)));
 +
 +                        if ((old->device_valid != entry.device_valid)
 +                            || (entry.device_valid && !pa_streq(entry.device, old->device)))
 +                            send_device_updated_signal(de, &entry);
 +
 +                        if ((old->volume_valid != entry.volume_valid)
-                             || (entry.volume_valid
-                                 && (!pa_cvolume_equal(&entry.volume, &old->volume) || !pa_channel_map_equal(&entry.channel_map, &old->channel_map))))
++                            || (entry.volume_valid && (!pa_cvolume_equal(&entry.volume, &old->volume)
++                                                       || !pa_channel_map_equal(&entry.channel_map, &old->channel_map))))
 +                            send_volume_updated_signal(de, &entry);
 +
 +                        if (!old->muted_valid || (entry.muted != old->muted))
 +                            send_mute_updated_signal(de, &entry);
 +
 +                    } else {
 +                        de = dbus_entry_new(u, name);
 +                        pa_assert_se(pa_hashmap_put(u->dbus_entries, de->entry_name, de));
 +                        send_new_entry_signal(de);
 +                    }
 +#endif
 +
                      if (apply_immediately)
                          apply_entry(u, name, &entry);
 +                }
 +
 +#ifdef HAVE_DBUS
 +                if (old)
 +                    pa_xfree(old);
 +#endif
              }
  
              trigger_save(u);

commit 411feaed15edcef685e88582d76eddc5acfd965e
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 31 09:14:50 2009 +0300

    dbusiface-core: Add signals FallbackSinkUnset and FallbackSourceUnset.

diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index 0507ac9..169e8e5 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -247,9 +247,11 @@ enum signal_index {
     SIGNAL_NEW_SINK,
     SIGNAL_SINK_REMOVED,
     SIGNAL_FALLBACK_SINK_UPDATED,
+    SIGNAL_FALLBACK_SINK_UNSET,
     SIGNAL_NEW_SOURCE,
     SIGNAL_SOURCE_REMOVED,
     SIGNAL_FALLBACK_SOURCE_UPDATED,
+    SIGNAL_FALLBACK_SOURCE_UNSET,
     SIGNAL_NEW_PLAYBACK_STREAM,
     SIGNAL_PLAYBACK_STREAM_REMOVED,
     SIGNAL_NEW_RECORD_STREAM,
@@ -292,9 +294,11 @@ static pa_dbus_signal_info signals[SIGNAL_MAX] = {
     [SIGNAL_NEW_SINK]                = { .name = "NewSink",               .arguments = new_sink_args,                .n_arguments = 1 },
     [SIGNAL_SINK_REMOVED]            = { .name = "SinkRemoved",           .arguments = sink_removed_args,            .n_arguments = 1 },
     [SIGNAL_FALLBACK_SINK_UPDATED]   = { .name = "FallbackSinkUpdated",   .arguments = fallback_sink_updated_args,   .n_arguments = 1 },
+    [SIGNAL_FALLBACK_SINK_UNSET]     = { .name = "FallbackSinkUnset",     .arguments = NULL,                         .n_arguments = 0 },
     [SIGNAL_NEW_SOURCE]              = { .name = "NewSource",             .arguments = new_source_args,              .n_arguments = 1 },
     [SIGNAL_SOURCE_REMOVED]          = { .name = "SourceRemoved",         .arguments = source_removed_args,          .n_arguments = 1 },
     [SIGNAL_FALLBACK_SOURCE_UPDATED] = { .name = "FallbackSourceUpdated", .arguments = fallback_source_updated_args, .n_arguments = 1 },
+    [SIGNAL_FALLBACK_SOURCE_UNSET]   = { .name = "FallbackSourceUnset",   .arguments = NULL,                         .n_arguments = 0 },
     [SIGNAL_NEW_PLAYBACK_STREAM]     = { .name = "NewPlaybackStream",     .arguments = new_playback_stream_args,     .n_arguments = 1 },
     [SIGNAL_PLAYBACK_STREAM_REMOVED] = { .name = "PlaybackStreamRemoved", .arguments = playback_stream_removed_args, .n_arguments = 1 },
     [SIGNAL_NEW_RECORD_STREAM]       = { .name = "NewRecordStream",       .arguments = new_record_stream_args,       .n_arguments = 1 },
@@ -1555,6 +1559,14 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
                     dbus_message_unref(signal);
                     signal = NULL;
+
+                } else if (!new_fallback_sink) {
+                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                                   PA_DBUS_CORE_INTERFACE,
+                                                                   signals[SIGNAL_FALLBACK_SINK_UNSET].name)));
+                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
+                    dbus_message_unref(signal);
+                    signal = NULL;
                 }
             }
 
@@ -1574,6 +1586,14 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                     pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
                     dbus_message_unref(signal);
                     signal = NULL;
+
+                } else if (!new_fallback_source) {
+                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+                                                                   PA_DBUS_CORE_INTERFACE,
+                                                                   signals[SIGNAL_FALLBACK_SOURCE_UNSET].name)));
+                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
+                    dbus_message_unref(signal);
+                    signal = NULL;
                 }
             }
             break;

commit 8a28e5de941cece0fccaac1c2babc502e2b2d46f
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 31 17:17:09 2009 +0300

    dbus: Change IsMuted property names to Mute.

diff --git a/src/modules/dbus/iface-device.c b/src/modules/dbus/iface-device.c
index 2752511..3a747a4 100644
--- a/src/modules/dbus/iface-device.c
+++ b/src/modules/dbus/iface-device.c
@@ -48,8 +48,8 @@ static void handle_get_has_flat_volume(DBusConnection *conn, DBusMessage *msg, v
 static void handle_get_has_convertible_to_decibel_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_base_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_volume_steps(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
+static void handle_get_mute(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_mute(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 static void handle_get_has_hardware_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_has_hardware_mute(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_configured_latency(DBusConnection *conn, DBusMessage *msg, void *userdata);
@@ -91,7 +91,7 @@ struct pa_dbusiface_device {
     enum device_type type;
     char *path;
     pa_cvolume volume;
-    pa_bool_t is_muted;
+    dbus_bool_t mute;
     union {
         pa_sink_state_t sink_state;
         pa_source_state_t source_state;
@@ -119,7 +119,7 @@ enum property_handler_index {
     PROPERTY_HANDLER_HAS_CONVERTIBLE_TO_DECIBEL_VOLUME,
     PROPERTY_HANDLER_BASE_VOLUME,
     PROPERTY_HANDLER_VOLUME_STEPS,
-    PROPERTY_HANDLER_IS_MUTED,
+    PROPERTY_HANDLER_MUTE,
     PROPERTY_HANDLER_HAS_HARDWARE_VOLUME,
     PROPERTY_HANDLER_HAS_HARDWARE_MUTE,
     PROPERTY_HANDLER_CONFIGURED_LATENCY,
@@ -158,7 +158,7 @@ static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
     [PROPERTY_HANDLER_HAS_CONVERTIBLE_TO_DECIBEL_VOLUME] = { .property_name = "HasConvertibleToDecibelVolume", .type = "b",      .get_cb = handle_get_has_convertible_to_decibel_volume, .set_cb = NULL },
     [PROPERTY_HANDLER_BASE_VOLUME]                       = { .property_name = "BaseVolume",                    .type = "u",      .get_cb = handle_get_base_volume,                       .set_cb = NULL },
     [PROPERTY_HANDLER_VOLUME_STEPS]                      = { .property_name = "VolumeSteps",                   .type = "u",      .get_cb = handle_get_volume_steps,                      .set_cb = NULL },
-    [PROPERTY_HANDLER_IS_MUTED]                          = { .property_name = "IsMuted",                       .type = "b",      .get_cb = handle_get_is_muted,                          .set_cb = handle_set_is_muted },
+    [PROPERTY_HANDLER_MUTE]                              = { .property_name = "Mute",                          .type = "b",      .get_cb = handle_get_mute,                              .set_cb = handle_set_mute },
     [PROPERTY_HANDLER_HAS_HARDWARE_VOLUME]               = { .property_name = "HasHardwareVolume",             .type = "b",      .get_cb = handle_get_has_hardware_volume,               .set_cb = NULL },
     [PROPERTY_HANDLER_HAS_HARDWARE_MUTE]                 = { .property_name = "HasHardwareMute",               .type = "b",      .get_cb = handle_get_has_hardware_mute,                 .set_cb = NULL },
     [PROPERTY_HANDLER_CONFIGURED_LATENCY]                = { .property_name = "ConfiguredLatency",             .type = "t",      .get_cb = handle_get_configured_latency,                .set_cb = NULL },
@@ -507,31 +507,31 @@ static void handle_get_volume_steps(DBusConnection *conn, DBusMessage *msg, void
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &volume_steps);
 }
 
-static void handle_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_get_mute(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_dbusiface_device *d = userdata;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(d);
 
-    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &d->is_muted);
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &d->mute);
 }
 
-static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
+static void handle_set_mute(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     pa_dbusiface_device *d = userdata;
-    dbus_bool_t is_muted = FALSE;
+    dbus_bool_t mute = FALSE;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(iter);
     pa_assert(d);
 
-    dbus_message_iter_get_basic(iter, &is_muted);
+    dbus_message_iter_get_basic(iter, &mute);
 
     if (d->type == DEVICE_TYPE_SINK)
-        pa_sink_set_mute(d->sink, is_muted, TRUE);
+        pa_sink_set_mute(d->sink, mute, TRUE);
     else
-        pa_source_set_mute(d->source, is_muted, TRUE);
+        pa_source_set_mute(d->source, mute, TRUE);
 
     pa_dbus_send_empty_reply(conn, msg);
 }
@@ -897,7 +897,7 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_HAS_CONVERTIBLE_TO_DECIBEL_VOLUME].property_name, DBUS_TYPE_BOOLEAN, &has_convertible_to_decibel_volume);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_BASE_VOLUME].property_name, DBUS_TYPE_UINT32, &base_volume);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_VOLUME_STEPS].property_name, DBUS_TYPE_UINT32, &volume_steps);
-    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_IS_MUTED].property_name, DBUS_TYPE_BOOLEAN, &d->is_muted);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_MUTE].property_name, DBUS_TYPE_BOOLEAN, &d->mute);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_HAS_HARDWARE_VOLUME].property_name, DBUS_TYPE_BOOLEAN, &has_hardware_volume);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_HAS_HARDWARE_MUTE].property_name, DBUS_TYPE_BOOLEAN, &has_hardware_mute);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_CONFIGURED_LATENCY].property_name, DBUS_TYPE_UINT64, &configured_latency);
@@ -1065,7 +1065,7 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
     pa_dbusiface_device *d = userdata;
     DBusMessage *signal = NULL;
     const pa_cvolume *new_volume = NULL;
-    pa_bool_t new_muted = FALSE;
+    pa_bool_t new_mute = FALSE;
     pa_sink_state_t new_sink_state = 0;
     pa_source_state_t new_source_state = 0;
     pa_device_port *new_active_port = NULL;
@@ -1111,15 +1111,15 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
         signal = NULL;
     }
 
-    new_muted = (d->type == DEVICE_TYPE_SINK) ? pa_sink_get_mute(d->sink, FALSE) : pa_source_get_mute(d->source, FALSE);
+    new_mute = (d->type == DEVICE_TYPE_SINK) ? pa_sink_get_mute(d->sink, FALSE) : pa_source_get_mute(d->source, FALSE);
 
-    if (d->is_muted != new_muted) {
-        d->is_muted = new_muted;
+    if (d->mute != new_mute) {
+        d->mute = new_mute;
 
         pa_assert_se(signal = dbus_message_new_signal(d->path,
                                                       PA_DBUSIFACE_DEVICE_INTERFACE,
                                                       signals[SIGNAL_MUTE_UPDATED].name));
-        pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_BOOLEAN, &d->is_muted, DBUS_TYPE_INVALID));
+        pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_BOOLEAN, &d->mute, DBUS_TYPE_INVALID));
 
         pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
         dbus_message_unref(signal);
@@ -1201,7 +1201,7 @@ pa_dbusiface_device *pa_dbusiface_device_new_sink(pa_dbusiface_core *core, pa_si
     d->type = DEVICE_TYPE_SINK;
     d->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, SINK_OBJECT_NAME, sink->index);
     d->volume = *pa_sink_get_volume(sink, FALSE);
-    d->is_muted = pa_sink_get_mute(sink, FALSE);
+    d->mute = pa_sink_get_mute(sink, FALSE);
     d->sink_state = pa_sink_get_state(sink);
     d->ports = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
     d->next_port_index = 0;
@@ -1239,7 +1239,7 @@ pa_dbusiface_device *pa_dbusiface_device_new_source(pa_dbusiface_core *core, pa_
     d->type = DEVICE_TYPE_SOURCE;
     d->path = pa_sprintf_malloc("%s/%s%u", PA_DBUS_CORE_OBJECT_PATH, SOURCE_OBJECT_NAME, source->index);
     d->volume = *pa_source_get_volume(source, FALSE);
-    d->is_muted = pa_source_get_mute(source, FALSE);
+    d->mute = pa_source_get_mute(source, FALSE);
     d->source_state = pa_source_get_state(source);
     d->ports = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
     d->next_port_index = 0;
diff --git a/src/modules/dbus/iface-stream.c b/src/modules/dbus/iface-stream.c
index a5f9bb5..04a45e6 100644
--- a/src/modules/dbus/iface-stream.c
+++ b/src/modules/dbus/iface-stream.c
@@ -53,7 +53,7 @@ struct pa_dbusiface_stream {
     };
     uint32_t sample_rate;
     pa_cvolume volume;
-    pa_bool_t is_muted;
+    dbus_bool_t mute;
     pa_proplist *proplist;
 
     pa_dbus_protocol *dbus_protocol;
@@ -71,8 +71,8 @@ static void handle_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void
 static void handle_get_channels(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
-static void handle_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
+static void handle_get_mute(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_set_mute(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 static void handle_get_buffer_latency(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_device_latency(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_resample_method(DBusConnection *conn, DBusMessage *msg, void *userdata);
@@ -93,7 +93,7 @@ enum property_handler_index {
     PROPERTY_HANDLER_SAMPLE_RATE,
     PROPERTY_HANDLER_CHANNELS,
     PROPERTY_HANDLER_VOLUME,
-    PROPERTY_HANDLER_IS_MUTED,
+    PROPERTY_HANDLER_MUTE,
     PROPERTY_HANDLER_BUFFER_LATENCY,
     PROPERTY_HANDLER_DEVICE_LATENCY,
     PROPERTY_HANDLER_RESAMPLE_METHOD,
@@ -111,7 +111,7 @@ static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
     [PROPERTY_HANDLER_SAMPLE_RATE]     = { .property_name = "SampleRate",     .type = "u",      .get_cb = handle_get_sample_rate,     .set_cb = NULL },
     [PROPERTY_HANDLER_CHANNELS]        = { .property_name = "Channels",       .type = "au",     .get_cb = handle_get_channels,        .set_cb = NULL },
     [PROPERTY_HANDLER_VOLUME]          = { .property_name = "Volume",         .type = "au",     .get_cb = handle_get_volume,          .set_cb = handle_set_volume },
-    [PROPERTY_HANDLER_IS_MUTED]        = { .property_name = "IsMuted",        .type = "b",      .get_cb = handle_get_is_muted,        .set_cb = handle_set_is_muted },
+    [PROPERTY_HANDLER_MUTE]            = { .property_name = "Mute",           .type = "b",      .get_cb = handle_get_mute,            .set_cb = handle_set_mute },
     [PROPERTY_HANDLER_BUFFER_LATENCY]  = { .property_name = "BufferLatency",  .type = "t",      .get_cb = handle_get_buffer_latency,  .set_cb = NULL },
     [PROPERTY_HANDLER_DEVICE_LATENCY]  = { .property_name = "DeviceLatency",  .type = "t",      .get_cb = handle_get_device_latency,  .set_cb = NULL },
     [PROPERTY_HANDLER_RESAMPLE_METHOD] = { .property_name = "ResampleMethod", .type = "s",      .get_cb = handle_get_resample_method, .set_cb = NULL },
@@ -390,7 +390,7 @@ static void handle_set_volume(DBusConnection *conn, DBusMessage *msg, DBusMessag
     pa_dbus_send_empty_reply(conn, msg);
 }
 
-static void handle_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_get_mute(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_dbusiface_stream *s = userdata;
 
     pa_assert(conn);
@@ -402,26 +402,26 @@ static void handle_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *us
         return;
     }
 
-    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &s->is_muted);
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &s->mute);
 }
 
-static void handle_set_is_muted(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
+static void handle_set_mute(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     pa_dbusiface_stream *s = userdata;
-    dbus_bool_t is_muted = FALSE;
+    dbus_bool_t mute = FALSE;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(iter);
     pa_assert(s);
 
-    dbus_message_iter_get_basic(iter, &is_muted);
+    dbus_message_iter_get_basic(iter, &mute);
 
     if (s->type == STREAM_TYPE_RECORD) {
         pa_dbus_send_error(conn, msg, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "Record streams don't have mute.");
         return;
     }
 
-    pa_sink_input_set_mute(s->sink_input, is_muted, TRUE);
+    pa_sink_input_set_mute(s->sink_input, mute, TRUE);
 
     pa_dbus_send_empty_reply(conn, msg);
 };
@@ -561,7 +561,7 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
 
     if (s->type == STREAM_TYPE_PLAYBACK) {
         pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_VOLUME].property_name, DBUS_TYPE_UINT32, volume, s->volume.channels);
-        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_IS_MUTED].property_name, DBUS_TYPE_BOOLEAN, &s->is_muted);
+        pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_MUTE].property_name, DBUS_TYPE_BOOLEAN, &s->mute);
     }
 
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_BUFFER_LATENCY].property_name, DBUS_TYPE_UINT64, &buffer_latency);
@@ -708,7 +708,7 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
 
     if (s->type == STREAM_TYPE_PLAYBACK) {
         pa_cvolume new_volume;
-        pa_bool_t new_muted = FALSE;
+        pa_bool_t new_mute = FALSE;
 
         pa_sink_input_get_volume(s->sink_input, &new_volume, TRUE);
 
@@ -733,15 +733,15 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
             signal = NULL;
         }
 
-        new_muted = pa_sink_input_get_mute(s->sink_input);
+        new_mute = pa_sink_input_get_mute(s->sink_input);
 
-        if (s->is_muted != new_muted) {
-            s->is_muted = new_muted;
+        if (s->mute != new_mute) {
+            s->mute = new_mute;
 
             pa_assert_se(signal = dbus_message_new_signal(s->path,
                                                           PA_DBUSIFACE_STREAM_INTERFACE,
                                                           signals[SIGNAL_MUTE_UPDATED].name));
-            pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_BOOLEAN, &s->is_muted, DBUS_TYPE_INVALID));
+            pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_BOOLEAN, &s->mute, DBUS_TYPE_INVALID));
 
             pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
             dbus_message_unref(signal);
@@ -823,7 +823,7 @@ pa_dbusiface_stream *pa_dbusiface_stream_new_playback(pa_dbusiface_core *core, p
     s->sink = pa_sink_ref(sink_input->sink);
     s->sample_rate = sink_input->sample_spec.rate;
     pa_sink_input_get_volume(sink_input, &s->volume, TRUE);
-    s->is_muted = pa_sink_input_get_mute(sink_input);
+    s->mute = pa_sink_input_get_mute(sink_input);
     s->proplist = pa_proplist_copy(sink_input->proplist);
     s->dbus_protocol = pa_dbus_protocol_get(sink_input->core);
     s->subscription = pa_subscription_new(sink_input->core, PA_SUBSCRIPTION_MASK_SINK_INPUT, subscription_cb, s);
@@ -851,7 +851,7 @@ pa_dbusiface_stream *pa_dbusiface_stream_new_record(pa_dbusiface_core *core, pa_
     s->source = pa_source_ref(source_output->source);
     s->sample_rate = source_output->sample_spec.rate;
     pa_cvolume_init(&s->volume);
-    s->is_muted = FALSE;
+    s->mute = FALSE;
     s->proplist = pa_proplist_copy(source_output->proplist);
     s->dbus_protocol = pa_dbus_protocol_get(source_output->core);
     s->subscription = pa_subscription_new(source_output->core, PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT, subscription_cb, s);
diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index 8389be6..5a6c8a3 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -170,8 +170,8 @@ static void handle_entry_get_device(DBusConnection *conn, DBusMessage *msg, void
 static void handle_entry_set_device(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 static void handle_entry_get_volume(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_entry_set_volume(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
-static void handle_entry_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata);
-static void handle_entry_set_is_muted(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
+static void handle_entry_get_mute(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_entry_set_mute(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata);
 
 static void handle_entry_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
 
@@ -188,7 +188,7 @@ enum entry_property_handler_index {
     ENTRY_PROPERTY_HANDLER_NAME,
     ENTRY_PROPERTY_HANDLER_DEVICE,
     ENTRY_PROPERTY_HANDLER_VOLUME,
-    ENTRY_PROPERTY_HANDLER_IS_MUTED,
+    ENTRY_PROPERTY_HANDLER_MUTE,
     ENTRY_PROPERTY_HANDLER_MAX
 };
 
@@ -202,7 +202,7 @@ static pa_dbus_property_handler entry_property_handlers[ENTRY_PROPERTY_HANDLER_M
     [ENTRY_PROPERTY_HANDLER_NAME]     = { .property_name = "Name",    .type = "s",     .get_cb = handle_entry_get_name,     .set_cb = NULL },
     [ENTRY_PROPERTY_HANDLER_DEVICE]   = { .property_name = "Device",  .type = "s",     .get_cb = handle_entry_get_device,   .set_cb = handle_entry_set_device },
     [ENTRY_PROPERTY_HANDLER_VOLUME]   = { .property_name = "Volume",  .type = "a(uu)", .get_cb = handle_entry_get_volume,   .set_cb = handle_entry_set_volume },
-    [ENTRY_PROPERTY_HANDLER_IS_MUTED] = { .property_name = "IsMuted", .type = "b",     .get_cb = handle_entry_get_is_muted, .set_cb = handle_entry_set_is_muted }
+    [ENTRY_PROPERTY_HANDLER_MUTE]     = { .property_name = "Mute",    .type = "b",     .get_cb = handle_entry_get_mute,     .set_cb = handle_entry_set_mute }
 };
 
 enum method_handler_index {
@@ -216,11 +216,11 @@ enum entry_method_handler_index {
     ENTRY_METHOD_HANDLER_MAX
 };
 
-static pa_dbus_arg_info add_entry_args[] = { { "name",     "s",     "in" },
-                                             { "device",   "s",     "in" },
-                                             { "volume",   "a(uu)", "in" },
-                                             { "is_muted", "b",     "in" },
-                                             { "entry",    "o",     "out" } };
+static pa_dbus_arg_info add_entry_args[] = { { "name",   "s",     "in" },
+                                             { "device", "s",     "in" },
+                                             { "volume", "a(uu)", "in" },
+                                             { "mute",   "b",     "in" },
+                                             { "entry",  "o",     "out" } };
 static pa_dbus_arg_info get_entry_by_name_args[] = { { "name", "s", "in" }, { "entry", "o", "out" } };
 
 static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
@@ -837,10 +837,10 @@ static void handle_entry_set_volume(DBusConnection *conn, DBusMessage *msg, DBus
     pa_xfree(e);
 }
 
-static void handle_entry_get_is_muted(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+static void handle_entry_get_mute(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     struct dbus_entry *de = userdata;
     struct entry *e;
-    dbus_bool_t muted;
+    dbus_bool_t mute;
 
     pa_assert(conn);
     pa_assert(msg);
@@ -848,16 +848,16 @@ static void handle_entry_get_is_muted(DBusConnection *conn, DBusMessage *msg, vo
 
     pa_assert_se(e = read_entry(de->userdata, de->entry_name));
 
-    muted = e->muted_valid ? e->muted : FALSE;
+    mute = e->muted_valid ? e->muted : FALSE;
 
-    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &muted);
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &mute);
 
     pa_xfree(e);
 }
 
-static void handle_entry_set_is_muted(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
+static void handle_entry_set_mute(DBusConnection *conn, DBusMessage *msg, DBusMessageIter *iter, void *userdata) {
     struct dbus_entry *de = userdata;
-    pa_bool_t muted;
+    dbus_bool_t mute;
     struct entry *e;
     pa_bool_t updated;
 
@@ -866,17 +866,17 @@ static void handle_entry_set_is_muted(DBusConnection *conn, DBusMessage *msg, DB
     pa_assert(iter);
     pa_assert(de);
 
-    dbus_message_iter_get_basic(iter, &muted);
+    dbus_message_iter_get_basic(iter, &mute);
 
     pa_assert_se(e = read_entry(de->userdata, de->entry_name));
 
-    updated = !e->muted_valid || e->muted != muted;
+    updated = !e->muted_valid || e->muted != mute;
 
     if (updated) {
         pa_datum key;
         pa_datum value;
 
-        e->muted = muted;
+        e->muted = mute;
         e->muted_valid = TRUE;
 
         key.data = de->entry_name;
@@ -902,7 +902,7 @@ static void handle_entry_get_all(DBusConnection *conn, DBusMessage *msg, void *u
     DBusMessageIter dict_iter;
     DBusMessageIter dict_entry_iter;
     const char *device;
-    dbus_bool_t muted;
+    dbus_bool_t mute;
 
     pa_assert(conn);
     pa_assert(msg);
@@ -911,7 +911,7 @@ static void handle_entry_get_all(DBusConnection *conn, DBusMessage *msg, void *u
     pa_assert_se(e = read_entry(de->userdata, de->entry_name));
 
     device = e->device_valid ? e->device : "";
-    muted = e->muted_valid ? e->muted : FALSE;
+    mute = e->muted_valid ? e->muted : FALSE;
 
     pa_assert_se((reply = dbus_message_new_method_return(msg)));
 
@@ -929,7 +929,7 @@ static void handle_entry_get_all(DBusConnection *conn, DBusMessage *msg, void *u
 
     pa_assert_se(dbus_message_iter_close_container(&dict_iter, &dict_entry_iter));
 
-    pa_dbus_append_basic_variant_dict_entry(&dict_iter, entry_property_handlers[ENTRY_PROPERTY_HANDLER_IS_MUTED].property_name, DBUS_TYPE_BOOLEAN, &muted);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, entry_property_handlers[ENTRY_PROPERTY_HANDLER_MUTE].property_name, DBUS_TYPE_BOOLEAN, &mute);
 
     pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
 

commit 587131917f9129c8347c789febb7e755dfb091de
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Mon Aug 31 18:12:55 2009 +0300

    dbus-protocol: Implement argument type checking for normal methods.

diff --git a/src/modules/dbus/iface-client.c b/src/modules/dbus/iface-client.c
index 54550d2..546370f 100644
--- a/src/modules/dbus/iface-client.c
+++ b/src/modules/dbus/iface-client.c
@@ -101,7 +101,7 @@ static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
     [METHOD_HANDLER_REMOVE_PROPERTIES] = {
         .method_name = "RemoveProperties",
         .arguments = remove_properties_args,
-        .n_arguments = sizeof(update_properties_args) / sizeof(pa_dbus_arg_info),
+        .n_arguments = sizeof(remove_properties_args) / sizeof(pa_dbus_arg_info),
         .receive_cb = handle_remove_properties }
 };
 
diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index 9102251..5c1127b 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -72,6 +72,7 @@ struct connection_entry {
 struct interface_entry {
     char *name;
     pa_hashmap *method_handlers;
+    pa_hashmap *method_signatures; /* Derived from method_handlers. Contains only "in" arguments. */
     pa_hashmap *property_handlers;
     pa_dbus_receive_cb_t get_all_properties_cb;
     pa_dbus_signal_info *signals;
@@ -354,8 +355,14 @@ static enum find_result_t find_handler_by_method(struct call_info *call_info) {
     pa_assert(call_info);
 
     PA_HASHMAP_FOREACH(call_info->iface_entry, call_info->obj_entry->interfaces, state) {
-        if ((call_info->method_handler = pa_hashmap_get(call_info->iface_entry->method_handlers, call_info->method)))
-            return FOUND_METHOD;
+        if ((call_info->method_handler = pa_hashmap_get(call_info->iface_entry->method_handlers, call_info->method))) {
+            call_info->expected_method_sig = pa_hashmap_get(call_info->iface_entry->method_signatures, call_info->method);
+
+            if (pa_streq(call_info->method_sig, call_info->expected_method_sig))
+                return FOUND_METHOD;
+            else
+                return INVALID_METHOD_SIG;
+        }
     }
 
     return NO_SUCH_METHOD;
@@ -630,6 +637,31 @@ static pa_hashmap *create_method_handlers(const pa_dbus_interface_info *info) {
     return handlers;
 }
 
+static pa_hashmap *extract_method_signatures(pa_hashmap *method_handlers) {
+    pa_hashmap *signatures = NULL;
+    pa_dbus_method_handler *handler = NULL;
+    void *state = NULL;
+    pa_strbuf *sig_buf = NULL;
+    unsigned i = 0;
+
+    pa_assert(method_handlers);
+
+    signatures = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+
+    PA_HASHMAP_FOREACH(handler, method_handlers, state) {
+        sig_buf = pa_strbuf_new();
+
+        for (i = 0; i < handler->n_arguments; ++i) {
+            if (pa_streq(handler->arguments[i].direction, "in"))
+                pa_strbuf_puts(sig_buf, handler->arguments[i].type);
+        }
+
+        pa_hashmap_put(signatures, handler->method_name, pa_strbuf_tostring_free(sig_buf));
+    }
+
+    return signatures;
+}
+
 static pa_hashmap *create_property_handlers(const pa_dbus_interface_info *info) {
     pa_hashmap *handlers;
     unsigned i = 0;
@@ -707,6 +739,7 @@ int pa_dbus_protocol_add_interface(pa_dbus_protocol *p,
     iface_entry = pa_xnew(struct interface_entry, 1);
     iface_entry->name = pa_xstrdup(info->name);
     iface_entry->method_handlers = create_method_handlers(info);
+    iface_entry->method_signatures = extract_method_signatures(iface_entry->method_handlers);
     iface_entry->property_handlers = create_property_handlers(info);
     iface_entry->get_all_properties_cb = info->get_all_properties_cb;
     iface_entry->signals = copy_signals(info);
@@ -760,6 +793,12 @@ static void method_handler_free_cb(void *p, void *userdata) {
     pa_xfree((pa_dbus_arg_info *) h->arguments);
 }
 
+static void method_signature_free_cb(void *p, void *userdata) {
+    pa_assert(p);
+
+    pa_xfree(p);
+}
+
 static void property_handler_free_cb(void *p, void *userdata) {
     pa_dbus_property_handler *h = p;
 
@@ -792,6 +831,7 @@ int pa_dbus_protocol_remove_interface(pa_dbus_protocol *p, const char* path, con
 
     pa_xfree(iface_entry->name);
     pa_hashmap_free(iface_entry->method_handlers, method_handler_free_cb, NULL);
+    pa_hashmap_free(iface_entry->method_signatures, method_signature_free_cb, NULL);
     pa_hashmap_free(iface_entry->property_handlers, property_handler_free_cb, NULL);
 
     for (i = 0; i < iface_entry->n_signals; ++i) {

commit bebaa491650c48697b861ec5e76816e9af1a8803
Merge: c6d330e 180ef1e
Author: Daniel Mack <daniel at caiaq.de>
Date:   Mon Sep 14 16:25:35 2009 +0800

    Merge branch 'master' of git://0pointer.de/pulseaudio


commit c1e59f7d762fb147bc5250ebddb9cf5639aba522
Merge: bebaa49 12f2111
Author: Daniel Mack <daniel at caiaq.de>
Date:   Tue Sep 15 11:46:19 2009 +0800

    Merge branch 'master' of git://0pointer.de/pulseaudio


commit 94aa9097f4ded68623160d754a4bf2632b8efc79
Merge: c1e59f7 c194db7
Author: Daniel Mack <daniel at caiaq.de>
Date:   Tue Sep 22 11:30:30 2009 +0800

    Merge branch 'master' of git://0pointer.de/pulseaudio


commit 431555030ead3aabad83028f359849314e95065e
Author: Jason Newton <jason at arcuid.wyred.org>
Date:   Mon Jun 22 00:36:14 2009 -0700

    module-equalizer-sink added
    src/Makefile.am: added module-equalizer-sink

diff --git a/src/Makefile.am b/src/Makefile.am
index 6544e2a..10f9a79 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1006,6 +1006,7 @@ modlibexec_LTLIBRARIES += \
 		module-combine.la \
 		module-remap-sink.la \
 		module-ladspa-sink.la \
+		module-equalizer-sink.la \
 		module-esound-sink.la \
 		module-tunnel-sink.la \
 		module-tunnel-source.la \
@@ -1200,6 +1201,7 @@ SYMDEF_FILES = \
 		modules/module-combine-symdef.h \
 		modules/module-remap-sink-symdef.h \
 		modules/module-ladspa-sink-symdef.h \
+		modules/module-equalizer-sink-symdef.h \
 		modules/module-esound-compat-spawnfd-symdef.h \
 		modules/module-esound-compat-spawnpid-symdef.h \
 		modules/module-match-symdef.h \
@@ -1380,6 +1382,11 @@ module_ladspa_sink_la_CFLAGS = -DLADSPA_PATH=\"$(libdir)/ladspa:/usr/local/lib/l
 module_ladspa_sink_la_LDFLAGS = $(MODULE_LDFLAGS)
 module_ladspa_sink_la_LIBADD = $(AM_LIBADD) $(LIBLTDL) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
 
+module_equalizer_sink_la_SOURCES = modules/module-equalizer-sink.c
+module_equalizer_sink_la_CFLAGS = $(AM_CFLAGS) $(LIBOIL_CFLAGS)
+module_equalizer_sink_la_LDFLAGS = $(MODULE_LDFLAGS)
+module_equalizer_sink_la_LIBADD = $(AM_LIBADD) $(LIBLTDL) $(LIBOIL_LIBS) -lfftw3f libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
+
 module_match_la_SOURCES = modules/module-match.c
 module_match_la_LDFLAGS = $(MODULE_LDFLAGS)
 module_match_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
new file mode 100755
index 0000000..8b34fa0
--- /dev/null
+++ b/src/modules/module-equalizer-sink.c
@@ -0,0 +1,850 @@
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <math.h>
+#include <fftw3.h>
+#include <float.h>
+
+
+#include <pulse/xmalloc.h>
+#include <pulse/i18n.h>
+
+#include <pulsecore/core-error.h>
+#include <pulsecore/namereg.h>
+#include <pulsecore/sink.h>
+#include <pulsecore/module.h>
+#include <pulsecore/core-util.h>
+#include <pulsecore/modargs.h>
+#include <pulsecore/log.h>
+#include <pulsecore/thread.h>
+#include <pulsecore/thread-mq.h>
+#include <pulsecore/rtpoll.h>
+#include <pulsecore/sample-util.h>
+#include <pulsecore/ltdl-helper.h>
+#include <liboil/liboilfuncs.h>
+#include <liboil/liboil.h>
+
+
+#include <stdint.h>
+#include <time.h>
+
+
+#include "module-equalizer-sink-symdef.h"
+
+PA_MODULE_AUTHOR("Jason Newton");
+PA_MODULE_DESCRIPTION(_("General Purpose Equalizer"));
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
+PA_MODULE_USAGE(_("sink=<sink to connect to> "));
+
+#define MEMBLOCKQ_MAXLENGTH (16*1024*1024)
+
+struct userdata {
+    pa_core *core;
+    pa_module *module;
+    pa_sink *sink, *master;
+    pa_sink_input *sink_input;
+
+    size_t channels;
+    size_t fft_size; //length (res) of fft
+    size_t window_size;//even!
+    size_t overlap_size;
+    size_t samples_gathered;
+    size_t n_buffered_output;
+    size_t max_output;
+    float *H;//frequency response filter (magnitude based)
+    float *W;//windowing function (time domain)
+    float *work_buffer,**input,**overlap_accum,**output_buffer;
+    fftwf_complex *output_window;
+    fftwf_plan forward_plan,inverse_plan;
+
+    pa_memblockq *memblockq;
+};
+
+static const char* const valid_modargs[] = {
+    "sink_name",
+    "sink_properties",
+    "master",
+    "format",
+    "rate",
+    "channels",
+    "channel_map",
+    NULL
+};
+
+uint64_t time_diff(struct timespec *timeA_p, struct timespec *timeB_p)
+{
+    return ((timeA_p->tv_sec * 1000000000) + timeA_p->tv_nsec) -
+    ((timeB_p->tv_sec * 1000000000) + timeB_p->tv_nsec);
+}
+
+void hanning_normalized_window(float *W,size_t window_size){
+    //h = sqrt(2)/2 * (1+cos(t*pi)) ./ sqrt( 1+cos(t*pi).^2 )
+    float c;
+    for(size_t i=0;i<window_size;++i){
+        c=cos(M_PI*i/(window_size-1));
+        W[i]=sqrt(2.0)/2.0*(1.0+c) / sqrt(1.0+c*c);
+    }
+}
+void hanning_window(float *W,size_t window_size){
+    //h=.5*(1-cos(2*pi*j/(window_size+1)), COLA for R=(M+1)/2
+    for(size_t i=0;i<window_size;++i){
+        W[i]=.5*(1-cos(2*M_PI*i/(window_size+1)));
+    }
+}
+void hamming_window(float *W,size_t window_size){
+    //h=.54-.46*cos(2*pi*j/(window_size-1))
+    //COLA for R=(M-1)/2,(M-1)/4 etc when endpoints are divided by 2
+    //or one endpoint is zeroed
+    float m;
+    for(size_t i=0;i<window_size;++i){
+        m=i;
+        m/=(window_size-1);
+        W[i]=.54-.46*cos(2*M_PI*m);
+    }
+    W[0]/=2;
+    W[window_size-1]/=2;
+}
+void blackman_window(float *W,size_t window_size){
+    //h=.42-.5*cos(2*pi*m)+.08*cos(4*pi*m), m=(0:W-1)/(W-1)
+    //COLA for R=(M-1)/3 when M is odd and R is an integer
+    //R=M/3 when M is even and R is an integer
+    float m;
+    for(size_t i=0;i<window_size;++i){
+        m=i;
+        m/=(window_size-1);
+        W[i]=.42-.5*cos(2*M_PI*m)+.08*cos(4*M_PI*m);
+    }
+}
+
+
+void sin_window(float *W,size_t window_size){
+    //h = (cos(t*pi)+1)/2 .* float(abs(t)<1);
+    for(size_t i=0;i<window_size;++i){
+        W[i]=sin(M_PI*i/(window_size-1));
+    }
+}
+
+
+void array_out(const char *name,float *a,size_t length){
+    FILE *p=fopen(name,"w");
+    for(size_t i=0;i<length;++i){
+        fprintf(p,"%e,",a[i]);
+        //if(i%1000==0){
+        //    fprintf(p,"\n");
+        //}
+    }
+    fprintf(p,"\n");
+    fclose(p);
+}
+
+
+/* Called from I/O thread context */
+static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
+    struct userdata *u = PA_SINK(o)->userdata;
+
+    switch (code) {
+
+        case PA_SINK_MESSAGE_GET_LATENCY: {
+            pa_usec_t usec = 0;
+            pa_sample_spec *ss=&u->sink->sample_spec;
+
+            /* Get the latency of the master sink */
+            if (PA_MSGOBJECT(u->master)->process_msg(PA_MSGOBJECT(u->master), PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL) < 0)
+                usec = 0;
+
+            usec+=pa_bytes_to_usec(u->n_buffered_output*pa_frame_size(ss),ss);
+            /* Add the latency internal to our sink input on top */
+            usec += pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->master->sample_spec);
+            *((pa_usec_t*) data) = usec;
+            return 0;
+        }
+    }
+
+    return pa_sink_process_msg(o, code, data, offset, chunk);
+}
+
+
+/* Called from main context */
+static int sink_set_state(pa_sink *s, pa_sink_state_t state) {
+    struct userdata *u;
+
+    pa_sink_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    if (PA_SINK_IS_LINKED(state) &&
+        u->sink_input &&
+        PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
+
+        pa_sink_input_cork(u->sink_input, state == PA_SINK_SUSPENDED);
+
+    return 0;
+}
+
+/* Called from I/O thread context */
+static void sink_request_rewind(pa_sink *s) {
+    struct userdata *u;
+
+    pa_sink_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    /* Just hand this one over to the master sink */
+    pa_sink_input_request_rewind(u->sink_input, s->thread_info.rewind_nbytes + pa_memblockq_get_length(u->memblockq), TRUE, FALSE, FALSE);
+}
+
+/* Called from I/O thread context */
+static void sink_update_requested_latency(pa_sink *s) {
+    struct userdata *u;
+
+    pa_sink_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    /* Just hand this one over to the master sink */
+    pa_sink_input_set_requested_latency_within_thread(
+            u->sink_input,
+            pa_sink_get_requested_latency_within_thread(s));
+}
+
+/* Called from I/O thread context */
+static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) {
+    struct userdata *u;
+    float *src, *dst;
+    size_t c;
+    pa_memchunk tchunk;
+    pa_sink_input_assert_ref(i);
+    pa_assert(chunk);
+    pa_assert_se(u = i->userdata);
+    size_t fs = pa_frame_size(&u->sink->sample_spec);
+    size_t ss=pa_sample_size(&u->sink->sample_spec);
+    size_t fe = fs/ss;
+
+    if (!u->sink || !PA_SINK_IS_OPENED(u->sink->thread_info.state))
+        return -1;
+
+    //output any buffered outputs first
+    if(u->n_buffered_output>0){
+        //pa_log("outputing %ld buffered samples",u->n_buffered_output);
+        chunk->index = 0;
+        size_t n_outputable=PA_MIN(u->n_buffered_output,nbytes/fs);
+        chunk->length = n_outputable*fs;
+        chunk->memblock = pa_memblock_new(i->sink->core->mempool, chunk->length);
+        pa_memblockq_drop(u->memblockq, chunk->length);
+        dst = (float*) pa_memblock_acquire(chunk->memblock);
+        for(size_t j=0;j<u->channels;++j){
+            pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst+j, fs, u->output_buffer[j], sizeof(float),n_outputable);
+            memmove(u->output_buffer[j],u->output_buffer[j]+n_outputable,(u->n_buffered_output-n_outputable)*sizeof(float));
+        }
+        u->n_buffered_output-=n_outputable;
+        pa_memblock_release(chunk->memblock);
+        return 0;
+    }
+    pa_assert_se(u->n_buffered_output==0);
+
+    //collect the minimum number of samples
+    while(u->samples_gathered < (u->window_size-u->overlap_size)){
+        //render some new fragments to our memblockq
+        //size_t desired_samples=PA_MIN(u->min_input-samples_gathered,u->max_output);
+        size_t desired_samples=PA_MIN((u->window_size-u->overlap_size)-u->samples_gathered,u->max_output);
+        while (pa_memblockq_peek(u->memblockq, &tchunk) < 0) {
+            pa_memchunk nchunk;
+
+            pa_sink_render(u->sink, desired_samples*fs, &nchunk);
+            pa_memblockq_push(u->memblockq, &nchunk);
+            pa_memblock_unref(nchunk.memblock);
+        }
+        if(tchunk.length/fs!=desired_samples){
+            pa_log("got %ld samples, asked for %ld",tchunk.length/fs,desired_samples);
+        }
+        size_t n_samples=PA_MIN(tchunk.length/fs,u->window_size-u->overlap_size-u->samples_gathered);
+        //TODO: figure out what to do with rest of the samples when there's too many (rare?)
+        src = (float*) ((uint8_t*) pa_memblock_acquire(tchunk.memblock) + tchunk.index);
+        for (size_t c=0;c<u->channels;c++) {
+            pa_sample_clamp(PA_SAMPLE_FLOAT32NE,u->input[c]+u->overlap_size+u->samples_gathered,sizeof(float), src+c, fs, n_samples);
+        }
+
+        u->samples_gathered+=n_samples;
+        pa_memblock_release(tchunk.memblock);
+        pa_memblock_unref(tchunk.memblock);
+    }
+    //IT should be this guy if we're buffering like how its supposed to
+    //size_t n_outputable=PA_MIN(u->window_size-u->overlap_size,nbytes/fs);
+    //This one takes into account the actual data gathered but then the dsp
+    //stuff is wrong when the buffer "underruns"
+    size_t n_outputable=PA_MIN(u->samples_gathered,nbytes/fs);
+    /*
+    //debugging: tests if immediate release of freshly buffered data
+    //plays ok and prevents any other processing
+    chunk->index=0;
+    chunk->length=n_outputable*fs;
+    chunk->memblock = pa_memblock_new(i->sink->core->mempool, chunk->length);
+    pa_memblockq_drop(u->memblockq, chunk->length);
+    dst = (float*) pa_memblock_acquire(chunk->memblock);;
+    for (size_t c=0;c<u->channels;c++) {
+        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst+c, fs, u->input[c]+u->overlap_size, sizeof(float),n_outputable);
+    }
+    u->samples_gathered=0;
+    pa_memblock_release(chunk->memblock);
+    return 0;
+    */
+
+    //pa_log("%ld dequed samples",u->samples_gathered);
+
+    chunk->index=0;
+    chunk->length=n_outputable*fs;
+    chunk->memblock = pa_memblock_new(i->sink->core->mempool, chunk->length);
+    pa_memblockq_drop(u->memblockq, chunk->length);
+    dst = (float*) pa_memblock_acquire(chunk->memblock);
+    //pa_sample_clamp(PA_SAMPLE_FLOAT32NE, u->input, sizeof(float), src+c, fs, samples);
+    //pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst+c,fs, u->input, sizeof(float), samples);
+
+    /*
+    struct timespec start, end;
+    uint64_t elapsed;
+    clock_gettime(CLOCK_MONOTONIC, &start);
+    */
+    //use a zero-phase sliding dft and overlap-add method
+
+    pa_assert_se(u->fft_size>=u->window_size);
+    //pa_assert_se(u->window_size%2==0);
+    pa_assert_se(u->overlap_size<u->window_size);
+    pa_assert_se(u->samples_gathered>=u->window_size-u->overlap_size);
+    size_t sample_rem=u->window_size-u->overlap_size-n_outputable;
+    //size_t w_mid=u->window_size/2;
+    //pa_log("hello world a");
+    for (c=0;c<u->channels;c++) {
+        //center the data for zero phase
+        //zero-pad TODO: optimization if sure these zeros aren't overwritten
+        //memset(u->work_buffer+w_mid,0,(u->fft_size-u->window_size)*sizeof(float));
+        //memset(u->work_buffer,0,u->fft_size*sizeof(float));
+        /*
+        for(size_t j=0;j<u->window_size;++j){
+            u->work_buffer[j]=u->W[j]*u->input[c][j];
+            u->work_buffer[j]=u->input[c][j];
+        }
+        */
+        //zero padd the data, don't worry about zerophase, shouldn't really matter
+        memset(u->work_buffer+u->overlap_size,0,(u->fft_size-u->overlap_size)*sizeof(float));
+        //window the data
+        for(size_t j=0;j<u->window_size;++j){
+            u->work_buffer[j]=u->W[j]*u->input[c][j];
+        }
+        /*
+        //recenter for zero phase
+        for(size_t j=0;j<w_mid;++j){
+            float tmp=u->work_buffer[j];
+            u->work_buffer[j]=u->input[c][j+w_mid];
+            u->work_buffer[j+u->fft_size-w_mid]=tmp;
+        }
+        */
+        //pa_log("hello world b");
+
+        /*
+        //window and zero phase shift
+        for(size_t j=0;j<w_mid;++j){
+            //u->work_buffer[j]=u->input[c][j+w_mid];
+            //u->work_buffer[j+u->fft_size-w_mid]=u->input[c][j];
+            u->work_buffer[j]=u->W[j+w_mid]*u->input[c][j+w_mid];
+            u->work_buffer[j+u->fft_size-w_mid]=u->W[j]*u->input[c][j];
+        }*/
+        //Processing is done here!
+        //do fft
+        fftwf_execute_dft_r2c(u->forward_plan,u->work_buffer,u->output_window);
+        //perform filtering
+        for(size_t j=0;j<u->fft_size/2+1;++j){
+            ////identity transform (fft size)
+            //u->output_window[j][0]/=u->fft_size;
+            //u->output_window[j][1]/=u->fft_size;
+            ////identity transform (window size)
+            //u->output_window[j][0]/=u->window_size;
+            //u->output_window[j][1]/=u->window_size;
+            //filtered
+            u->output_window[j][0]*=u->H[j];
+            u->output_window[j][1]*=u->H[j];
+        }
+        //inverse fft
+        fftwf_execute_dft_c2r(u->inverse_plan,u->output_window,u->work_buffer);
+
+        /*
+        //uncenter the data
+        for(size_t j=0;j<w_mid;++j){
+            const float tmp=u->work_buffer[j];
+            u->work_buffer[j]=u->work_buffer[j+u->fft_size-w_mid];
+            u->work_buffer[j+w_mid]=tmp;
+        }
+        */
+        /*
+        //divide out fft gain (more stable here?)
+        for(size_t j=0;j<u->window_size;++j){
+            u->work_buffer[j]/=u->fft_size;
+        }
+        */
+        /*
+        //debug: tests overlaping add
+        //and negates ALL PREVIOUS processing
+        //yields a perfect reconstruction if COLA is held
+        for(size_t j=0;j<u->window_size;++j){
+            u->work_buffer[j]=u->W[j]*u->input[c][j];
+        }
+        */
+        /*
+        //debug: tests if basic buffering works
+        //shouldn't modify the signal AT ALL
+        for(size_t j=0;j<u->window_size;++j){
+            u->work_buffer[j]=u->input[c][j];
+        }
+        */
+
+        /*
+        //overlap add and preserve overlap component from this window (zero phase)
+        for(size_t j=0;j<u->overlap_size;++j){
+            u->work_buffer[j]+=u->overlap_accum[c][j];
+            u->overlap_accum[c][j]=u->work_buffer[u->window_size-u->overlap_size+j];
+        }
+        */
+        //overlap add and preserve overlap component from this window (linear phase)
+        for(size_t j=0;j<u->overlap_size;++j){
+            u->work_buffer[j]+=u->overlap_accum[c][j];
+            u->overlap_accum[c][j]=u->work_buffer[u->window_size-u->overlap_size+j];
+        }
+
+        //preseve the needed input for the next windows overlap
+        memmove(u->input[c],u->input[c]+u->overlap_size,(u->window_size-u->overlap_size)*sizeof(float));
+        //output the samples that are outputable now
+        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst+c, fs, u->work_buffer, sizeof(float),n_outputable);
+        //buffer the rest of them
+        memcpy(u->output_buffer[c]+u->n_buffered_output,u->work_buffer+n_outputable,sample_rem*sizeof(float));
+    }
+    /*
+    clock_gettime(CLOCK_MONOTONIC, &end);
+    elapsed=time_diff(&end, &start);
+    pa_log("processed: %ld, time: %ld",u->samples_gathered,elapsed);
+    */
+    u->n_buffered_output+=sample_rem;
+    u->samples_gathered=0;
+
+
+    //pa_log("%ld samples queued",u->n_buffered_output);
+
+    pa_memblock_release(chunk->memblock);
+
+
+    return 0;
+}
+
+/* Called from I/O thread context */
+static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
+    struct userdata *u;
+    size_t amount = 0;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    if (!u->sink || !PA_SINK_IS_OPENED(u->sink->thread_info.state))
+        return;
+
+    if (u->sink->thread_info.rewind_nbytes > 0) {
+        size_t max_rewrite;
+
+        max_rewrite = nbytes + pa_memblockq_get_length(u->memblockq);
+        amount = PA_MIN(u->sink->thread_info.rewind_nbytes, max_rewrite);
+        u->sink->thread_info.rewind_nbytes = 0;
+
+        if (amount > 0) {
+            pa_memblockq_seek(u->memblockq, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
+            pa_log_debug("Resetting equalizer");
+        }
+    }
+
+    pa_sink_process_rewind(u->sink, amount);
+    pa_memblockq_rewind(u->memblockq, nbytes);
+}
+
+/* Called from I/O thread context */
+static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
+        return;
+
+    pa_memblockq_set_maxrewind(u->memblockq, nbytes);
+    pa_sink_set_max_rewind_within_thread(u->sink, nbytes);
+}
+
+/* Called from I/O thread context */
+static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
+        return;
+
+    pa_sink_set_max_request_within_thread(u->sink, nbytes);
+}
+
+/* Called from I/O thread context */
+static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
+        return;
+
+    pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
+}
+
+/* Called from I/O thread context */
+static void sink_input_detach_cb(pa_sink_input *i) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
+        return;
+
+    pa_sink_detach_within_thread(u->sink);
+    pa_sink_set_asyncmsgq(u->sink, NULL);
+    pa_sink_set_rtpoll(u->sink, NULL);
+}
+
+/* Called from I/O thread context */
+static void sink_input_attach_cb(pa_sink_input *i) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
+        return;
+
+    pa_sink_set_asyncmsgq(u->sink, i->sink->asyncmsgq);
+    pa_sink_set_rtpoll(u->sink, i->sink->rtpoll);
+    pa_sink_attach_within_thread(u->sink);
+
+    pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->master->thread_info.max_latency);
+}
+
+/* Called from main context */
+static void sink_input_kill_cb(pa_sink_input *i) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    pa_sink_unlink(u->sink);
+    pa_sink_input_unlink(u->sink_input);
+
+    pa_sink_unref(u->sink);
+    u->sink = NULL;
+    pa_sink_input_unref(u->sink_input);
+    u->sink_input = NULL;
+
+    pa_module_unload_request(u->module, TRUE);
+}
+
+/* Called from IO thread context */
+static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t state) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    /* If we are added for the first time, ask for a rewinding so that
+     * we are heard right-away. */
+    if (PA_SINK_INPUT_IS_LINKED(state) &&
+        i->thread_info.state == PA_SINK_INPUT_INIT) {
+        pa_log_debug("Requesting rewind due to state change.");
+        pa_sink_input_request_rewind(i, 0, FALSE, TRUE, TRUE);
+    }
+}
+
+/* Called from main context */
+static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    return u->sink != dest;
+}
+
+int pa__init(pa_module*m) {
+    struct userdata *u;
+    pa_sample_spec ss;
+    pa_channel_map map;
+    pa_modargs *ma;
+    const char *z;
+    pa_sink *master;
+    pa_sink_input_new_data sink_input_data;
+    pa_sink_new_data sink_data;
+    pa_bool_t *use_default = NULL;
+    size_t fs;
+
+    pa_assert(m);
+
+    if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
+        pa_log("Failed to parse module arguments.");
+        goto fail;
+    }
+
+    if (!(master = pa_namereg_get(m->core, pa_modargs_get_value(ma, "master", NULL), PA_NAMEREG_SINK))) {
+        pa_log("Master sink not found");
+        goto fail;
+    }
+
+    ss = master->sample_spec;
+    ss.format = PA_SAMPLE_FLOAT32;
+    map = master->channel_map;
+    if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0) {
+        pa_log("Invalid sample format specification or channel map");
+        goto fail;
+    }
+    fs=pa_frame_size(&ss);
+
+    u = pa_xnew0(struct userdata, 1);
+    u->core = m->core;
+    u->module = m;
+    m->userdata = u;
+    u->master = master;
+    u->sink = NULL;
+    u->sink_input = NULL;
+    u->memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, fs, 1, 1, 0, NULL);
+
+    //u->fft_size=44100;
+    //u->fft_size=48000;
+    //u->fft_size=1024;
+    u->channels=ss.channels;
+    u->fft_size=pow(2,ceil(log(ss.rate)/log(2)));
+    //u->fft_size=ss.rate;
+    //u->fft_size=65536;
+    pa_log("fft size: %ld",u->fft_size);
+    u->window_size=8001;
+    u->overlap_size=(u->window_size+1)/2;
+    //u->overlap_size=u->window_size/2;
+    //u->overlap_size=0;
+    u->samples_gathered=0;
+    u->n_buffered_output=0;
+    u->max_output=pa_frame_align(pa_mempool_block_size_max(m->core->mempool), &ss)/pa_frame_size(&ss);
+    u->H=(float*) fftwf_malloc((u->fft_size/2+1)*sizeof(float));
+    u->W=(float*) fftwf_malloc((u->window_size)*sizeof(float));
+    u->work_buffer=(float*) fftwf_malloc(u->fft_size*sizeof(float));
+    u->input=(float **)malloc(sizeof(float *)*u->channels);
+    u->overlap_accum=(float **)malloc(sizeof(float *)*u->channels);
+    u->output_buffer=(float **)malloc(sizeof(float *)*u->channels);
+    for(size_t c=0;c<u->channels;++c){
+        u->input[c]=(float*) fftwf_malloc(u->window_size*sizeof(float));
+        memset(u->input[c],0,u->window_size*sizeof(float));
+        u->overlap_accum[c]=(float*) fftwf_malloc(u->overlap_size*sizeof(float));
+        memset(u->overlap_accum[c],0,u->overlap_size*sizeof(float));
+        u->output_buffer[c]=(float*) fftwf_malloc(u->window_size*sizeof(float));
+    }
+    u->output_window = (fftwf_complex *) fftwf_malloc(sizeof(fftwf_complex) * (u->fft_size/2+1));
+    u->forward_plan=fftwf_plan_dft_r2c_1d(u->fft_size, u->work_buffer, u->output_window, FFTW_ESTIMATE);
+    u->inverse_plan=fftwf_plan_dft_c2r_1d(u->fft_size, u->output_window, u->work_buffer, FFTW_ESTIMATE);
+
+    /*
+    //rectangular window
+    for(size_t j=0;j<u->window_size;++j){
+        u->W[j]=1.0;
+    }
+    */
+    //hanning_normalized_window(u->W,u->window_size);
+    hanning_window(u->W,u->window_size);
+    //sin_window(u->W,u->window_size);
+    array_out("/home/jason/window.txt",u->W,u->window_size);
+    //u->forward_plan=fftwf_plan_dft_r2c_1d(u->fft_size, u->input, u->output_window, FFTW_ESTIMATE);
+    //u->inverse_plan=fftwf_plan_dft_c2r_1d(u->fft_size, u->output_window, u->work_buffer, FFTW_ESTIMATE);
+    //u->forward_plan=fftwf_plan_dft_r2c_1d(u->fft_size, u->input, u->output, FFTW_MEASURE);
+    //u->inverse_plan=fftwf_plan_dft_c2r_1d(u->fft_size, u->output, u->input, FFTW_MEASURE);
+    const int freqs[]={0,25,50,100,200,300,400,800,1500,
+        2000,3000,4000,5000,6000,7000,8000,9000,10000,11000,12000,
+        13000,14000,15000,16000,17000,18000,19000,20000,21000,22000,23000,24000,INT_MAX};
+    const float coefficients[]={1,1,1,1,1,1,1,1,1,1,
+        1,1,1,1,1,1,1,1,
+        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
+    const size_t ncoefficients=sizeof(coefficients)/sizeof(float);
+    pa_assert_se(sizeof(freqs)/sizeof(int)==sizeof(coefficients)/sizeof(float));
+    float *freq_translated=(float *) malloc(sizeof(float)*(ncoefficients));
+    freq_translated[0]=1;
+    //Translate the frequencies in their natural sampling rate to the new sampling rate frequencies
+    for(size_t i=1;i<ncoefficients-1;++i){
+        freq_translated[i]=((float)freqs[i]*u->fft_size)/ss.rate;
+        //pa_log("i: %ld: %d , %g",i,freqs[i],freq_translated[i]);
+        pa_assert_se(freq_translated[i]>=freq_translated[i-1]);
+    }
+    freq_translated[ncoefficients-1]=DBL_MAX;
+    //Interpolate the specified frequency band values
+    u->H[0]=1;
+    for(size_t i=1,j=0;i<(u->fft_size/2+1);++i){
+        pa_assert_se(j<ncoefficients);
+        //max frequency range passed, consider the rest as one band
+        if(freq_translated[j+1]>=DBL_MAX){
+            for(;i<(u->fft_size/2+1);++i){
+                u->H[i]=coefficients[j];
+            }
+            break;
+        }
+        //pa_log("i: %d, j: %d, freq: %f",i,j,freq_translated[j]);
+        //pa_log("interp: %0.4f %0.4f",freq_translated[j],freq_translated[j+1]);
+        pa_assert_se(freq_translated[j]<freq_translated[j+1]);
+        pa_assert_se(i>=freq_translated[j]);
+        pa_assert_se(i<=freq_translated[j+1]);
+        //bilinear-inerpolation of coefficients specified
+        float c0=(i-freq_translated[j])/(freq_translated[j+1]-freq_translated[j]);
+        pa_assert_se(c0>=0&&c0<=1.0);
+        u->H[i]=((1.0f-c0)*coefficients[j]+c0*coefficients[j+1]);
+        pa_assert_se(u->H[i]>0);
+        while(i>=floor(freq_translated[j+1])){
+            j++;
+        }
+    }
+    array_out("/home/jason/coffs.txt",u->H,u->fft_size/2+1);
+    //divide out the fft gain
+    for(int i=0;i<(u->fft_size/2+1);++i){
+        u->H[i]/=u->fft_size;
+    }
+    free(freq_translated);
+
+    /* Create sink */
+    pa_sink_new_data_init(&sink_data);
+    sink_data.driver = __FILE__;
+    sink_data.module = m;
+    if (!(sink_data.name = pa_xstrdup(pa_modargs_get_value(ma, "sink_name", NULL))))
+        sink_data.name = pa_sprintf_malloc("%s.equalizer", master->name);
+    sink_data.namereg_fail = FALSE;
+    pa_sink_new_data_set_sample_spec(&sink_data, &ss);
+    pa_sink_new_data_set_channel_map(&sink_data, &map);
+    z = pa_proplist_gets(master->proplist, PA_PROP_DEVICE_DESCRIPTION);
+    pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "FFT based equalizer");
+    pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_MASTER_DEVICE, master->name);
+    pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_CLASS, "filter");
+
+    if (pa_modargs_get_proplist(ma, "sink_properties", sink_data.proplist, PA_UPDATE_REPLACE) < 0) {
+        pa_log("Invalid properties");
+        pa_sink_new_data_done(&sink_data);
+        goto fail;
+    }
+
+    u->sink = pa_sink_new(m->core, &sink_data, PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY);
+    pa_sink_new_data_done(&sink_data);
+
+    if (!u->sink) {
+        pa_log("Failed to create sink.");
+        goto fail;
+    }
+
+    u->sink->parent.process_msg = sink_process_msg;
+    u->sink->set_state = sink_set_state;
+    u->sink->update_requested_latency = sink_update_requested_latency;
+    u->sink->request_rewind = sink_request_rewind;
+    u->sink->userdata = u;
+
+    pa_sink_set_asyncmsgq(u->sink, master->asyncmsgq);
+    pa_sink_set_rtpoll(u->sink, master->rtpoll);
+
+    /* Create sink input */
+    pa_sink_input_new_data_init(&sink_input_data);
+    sink_input_data.driver = __FILE__;
+    sink_input_data.module = m;
+    sink_input_data.sink = u->master;
+    pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "Equalized Stream");
+    pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "filter");
+    pa_sink_input_new_data_set_sample_spec(&sink_input_data, &ss);
+    pa_sink_input_new_data_set_channel_map(&sink_input_data, &map);
+
+    pa_sink_input_new(&u->sink_input, m->core, &sink_input_data, PA_SINK_INPUT_DONT_MOVE);
+    pa_sink_input_new_data_done(&sink_input_data);
+
+    if (!u->sink_input)
+        goto fail;
+
+    u->sink_input->pop = sink_input_pop_cb;
+    u->sink_input->process_rewind = sink_input_process_rewind_cb;
+    u->sink_input->update_max_rewind = sink_input_update_max_rewind_cb;
+    u->sink_input->update_max_request = sink_input_update_max_request_cb;
+    u->sink_input->update_sink_latency_range = sink_input_update_sink_latency_range_cb;
+    u->sink_input->kill = sink_input_kill_cb;
+    u->sink_input->attach = sink_input_attach_cb;
+    u->sink_input->detach = sink_input_detach_cb;
+    u->sink_input->state_change = sink_input_state_change_cb;
+    u->sink_input->may_move_to = sink_input_may_move_to_cb;
+    u->sink_input->userdata = u;
+
+    pa_sink_put(u->sink);
+    pa_sink_input_put(u->sink_input);
+
+    pa_modargs_free(ma);
+
+    pa_xfree(use_default);
+
+    return 0;
+
+fail:
+    if (ma)
+        pa_modargs_free(ma);
+
+    pa_xfree(use_default);
+
+    pa__done(m);
+
+    return -1;
+}
+
+int pa__get_n_used(pa_module *m) {
+    struct userdata *u;
+
+    pa_assert(m);
+    pa_assert_se(u = m->userdata);
+
+    return pa_sink_linked_by(u->sink);
+}
+
+void pa__done(pa_module*m) {
+    struct userdata *u;
+
+    pa_assert(m);
+
+    if (!(u = m->userdata))
+        return;
+
+    if (u->sink) {
+        pa_sink_unlink(u->sink);
+        pa_sink_unref(u->sink);
+    }
+
+    if (u->sink_input) {
+        pa_sink_input_unlink(u->sink_input);
+        pa_sink_input_unref(u->sink_input);
+    }
+
+    if (u->memblockq)
+        pa_memblockq_free(u->memblockq);
+
+    fftwf_destroy_plan(u->inverse_plan);
+    fftwf_destroy_plan(u->forward_plan);
+    fftwf_free(u->output_window);
+    for(size_t c=0;c<u->channels;++c){
+        fftwf_free(u->output_buffer[c]);
+        fftwf_free(u->overlap_accum[c]);
+        fftwf_free(u->input[c]);
+    }
+    free(u->output_buffer);
+    free(u->overlap_accum);
+    free(u->input);
+    fftwf_free(u->work_buffer);
+    fftwf_free(u->W);
+    fftwf_free(u->H);
+
+    pa_xfree(u);
+}

commit 2e119060cb6b61fa59976b636300eea913c20827
Author: Jason Newton <jason at arcuid.wyred.org>
Date:   Wed Jul 15 06:57:33 2009 -0700

    module-equalizer-sink:
        added temporary debugging output to track filter output
        removed dead code
        only a small amount of crackling remains

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 8b34fa0..cabb0dc 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -1,4 +1,29 @@
+/***
+This file is part of PulseAudio.
 
+This module is based off Lennart Poettering's LADSPA sink and swaps out
+LADSPA functionality for a STFT OLA based digital equalizer.  All new work
+is published under Pulseaudio's original license.
+Copyright 2009 Jason Newton <nevion at gmail.com>
+
+Original Author:
+Copyright 2004-2008 Lennart Poettering
+
+PulseAudio is free software; you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published
+by the Free Software Foundation; either version 2.1 of the License,
+or (at your option) any later version.
+
+PulseAudio is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with PulseAudio; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+USA.
+***/
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
@@ -25,9 +50,6 @@
 #include <pulsecore/rtpoll.h>
 #include <pulsecore/sample-util.h>
 #include <pulsecore/ltdl-helper.h>
-#include <liboil/liboilfuncs.h>
-#include <liboil/liboil.h>
-
 
 #include <stdint.h>
 #include <time.h>
@@ -50,9 +72,15 @@ struct userdata {
     pa_sink_input *sink_input;
 
     size_t channels;
-    size_t fft_size; //length (res) of fft
-    size_t window_size;//even!
-    size_t overlap_size;
+    size_t fft_size;//length (res) of fft
+    size_t window_size;/*
+                        *sliding window size
+                        *effectively chooses R
+                        */
+    size_t R;/* the hop size between overlapping windows
+              * the latency of the filter, calculated from window_size
+              * based on constraints of COLA and window function
+              */
     size_t samples_gathered;
     size_t n_buffered_output;
     size_t max_output;
@@ -61,6 +89,7 @@ struct userdata {
     float *work_buffer,**input,**overlap_accum,**output_buffer;
     fftwf_complex *output_window;
     fftwf_plan forward_plan,inverse_plan;
+    //size_t samplings;
 
     pa_memblockq *memblockq;
 };
@@ -106,8 +135,9 @@ void hamming_window(float *W,size_t window_size){
         m/=(window_size-1);
         W[i]=.54-.46*cos(2*M_PI*m);
     }
-    W[0]/=2;
-    W[window_size-1]/=2;
+    W[window_size-1]=0;
+    //W[0]/=2;
+    //W[window_size-1]/=2;
 }
 void blackman_window(float *W,size_t window_size){
     //h=.42-.5*cos(2*pi*m)+.08*cos(4*pi*m), m=(0:W-1)/(W-1)
@@ -132,6 +162,10 @@ void sin_window(float *W,size_t window_size){
 
 void array_out(const char *name,float *a,size_t length){
     FILE *p=fopen(name,"w");
+    if(!p){
+        pa_log("opening %s failed!",name);
+        return;
+    }
     for(size_t i=0;i<length;++i){
         fprintf(p,"%e,",a[i]);
         //if(i%1000==0){
@@ -213,7 +247,6 @@ static void sink_update_requested_latency(pa_sink *s) {
 static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) {
     struct userdata *u;
     float *src, *dst;
-    size_t c;
     pa_memchunk tchunk;
     pa_sink_input_assert_ref(i);
     pa_assert(chunk);
@@ -229,7 +262,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     if(u->n_buffered_output>0){
         //pa_log("outputing %ld buffered samples",u->n_buffered_output);
         chunk->index = 0;
-        size_t n_outputable=PA_MIN(u->n_buffered_output,nbytes/fs);
+        size_t n_outputable=PA_MIN(u->n_buffered_output,u->max_output);
         chunk->length = n_outputable*fs;
         chunk->memblock = pa_memblock_new(i->sink->core->mempool, chunk->length);
         pa_memblockq_drop(u->memblockq, chunk->length);
@@ -245,10 +278,11 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     pa_assert_se(u->n_buffered_output==0);
 
     //collect the minimum number of samples
-    while(u->samples_gathered < (u->window_size-u->overlap_size)){
+    //TODO figure out a better way of buffering the needed
+    //number of samples, this doesn't seem to work correctly
+    while(u->samples_gathered < u->R){
         //render some new fragments to our memblockq
-        //size_t desired_samples=PA_MIN(u->min_input-samples_gathered,u->max_output);
-        size_t desired_samples=PA_MIN((u->window_size-u->overlap_size)-u->samples_gathered,u->max_output);
+        size_t desired_samples=PA_MIN(u->R-u->samples_gathered,u->max_output);
         while (pa_memblockq_peek(u->memblockq, &tchunk) < 0) {
             pa_memchunk nchunk;
 
@@ -259,137 +293,80 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         if(tchunk.length/fs!=desired_samples){
             pa_log("got %ld samples, asked for %ld",tchunk.length/fs,desired_samples);
         }
-        size_t n_samples=PA_MIN(tchunk.length/fs,u->window_size-u->overlap_size-u->samples_gathered);
+        size_t n_samples=PA_MIN(tchunk.length/fs,u->R-u->samples_gathered);
         //TODO: figure out what to do with rest of the samples when there's too many (rare?)
         src = (float*) ((uint8_t*) pa_memblock_acquire(tchunk.memblock) + tchunk.index);
         for (size_t c=0;c<u->channels;c++) {
-            pa_sample_clamp(PA_SAMPLE_FLOAT32NE,u->input[c]+u->overlap_size+u->samples_gathered,sizeof(float), src+c, fs, n_samples);
+            pa_sample_clamp(PA_SAMPLE_FLOAT32NE,u->input[c]+(u->window_size-u->R)+u->samples_gathered,sizeof(float), src+c, fs, n_samples);
         }
-
         u->samples_gathered+=n_samples;
         pa_memblock_release(tchunk.memblock);
         pa_memblock_unref(tchunk.memblock);
     }
     //IT should be this guy if we're buffering like how its supposed to
-    //size_t n_outputable=PA_MIN(u->window_size-u->overlap_size,nbytes/fs);
+    //size_t n_outputable=PA_MIN(u->window_size-u->R,u->max_output);
     //This one takes into account the actual data gathered but then the dsp
     //stuff is wrong when the buffer "underruns"
-    size_t n_outputable=PA_MIN(u->samples_gathered,nbytes/fs);
-    /*
-    //debugging: tests if immediate release of freshly buffered data
-    //plays ok and prevents any other processing
-    chunk->index=0;
-    chunk->length=n_outputable*fs;
-    chunk->memblock = pa_memblock_new(i->sink->core->mempool, chunk->length);
-    pa_memblockq_drop(u->memblockq, chunk->length);
-    dst = (float*) pa_memblock_acquire(chunk->memblock);;
-    for (size_t c=0;c<u->channels;c++) {
-        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst+c, fs, u->input[c]+u->overlap_size, sizeof(float),n_outputable);
-    }
-    u->samples_gathered=0;
-    pa_memblock_release(chunk->memblock);
-    return 0;
-    */
+    size_t n_outputable=PA_MIN(u->R,u->max_output);
 
-    //pa_log("%ld dequed samples",u->samples_gathered);
 
     chunk->index=0;
     chunk->length=n_outputable*fs;
     chunk->memblock = pa_memblock_new(i->sink->core->mempool, chunk->length);
     pa_memblockq_drop(u->memblockq, chunk->length);
     dst = (float*) pa_memblock_acquire(chunk->memblock);
-    //pa_sample_clamp(PA_SAMPLE_FLOAT32NE, u->input, sizeof(float), src+c, fs, samples);
-    //pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst+c,fs, u->input, sizeof(float), samples);
-
-    /*
-    struct timespec start, end;
-    uint64_t elapsed;
-    clock_gettime(CLOCK_MONOTONIC, &start);
-    */
-    //use a zero-phase sliding dft and overlap-add method
 
     pa_assert_se(u->fft_size>=u->window_size);
-    //pa_assert_se(u->window_size%2==0);
-    pa_assert_se(u->overlap_size<u->window_size);
-    pa_assert_se(u->samples_gathered>=u->window_size-u->overlap_size);
-    size_t sample_rem=u->window_size-u->overlap_size-n_outputable;
-    //size_t w_mid=u->window_size/2;
-    //pa_log("hello world a");
-    for (c=0;c<u->channels;c++) {
-        //center the data for zero phase
-        //zero-pad TODO: optimization if sure these zeros aren't overwritten
-        //memset(u->work_buffer+w_mid,0,(u->fft_size-u->window_size)*sizeof(float));
+    pa_assert_se(u->R<u->window_size);
+    pa_assert_se(u->samples_gathered>=u->R);
+    size_t sample_rem=u->R-n_outputable;
+    //use a linear-phase sliding STFT and overlap-add method (for each channel)
+    for (size_t c=0;c<u->channels;c++) {
+        ////zero padd the data
         //memset(u->work_buffer,0,u->fft_size*sizeof(float));
-        /*
-        for(size_t j=0;j<u->window_size;++j){
-            u->work_buffer[j]=u->W[j]*u->input[c][j];
-            u->work_buffer[j]=u->input[c][j];
-        }
-        */
-        //zero padd the data, don't worry about zerophase, shouldn't really matter
-        memset(u->work_buffer+u->overlap_size,0,(u->fft_size-u->overlap_size)*sizeof(float));
-        //window the data
+        memset(u->work_buffer+u->window_size,0,(u->fft_size-u->window_size)*sizeof(float));
+        ////window the data
         for(size_t j=0;j<u->window_size;++j){
             u->work_buffer[j]=u->W[j]*u->input[c][j];
         }
-        /*
-        //recenter for zero phase
-        for(size_t j=0;j<w_mid;++j){
-            float tmp=u->work_buffer[j];
-            u->work_buffer[j]=u->input[c][j+w_mid];
-            u->work_buffer[j+u->fft_size-w_mid]=tmp;
-        }
-        */
-        //pa_log("hello world b");
-
-        /*
-        //window and zero phase shift
-        for(size_t j=0;j<w_mid;++j){
-            //u->work_buffer[j]=u->input[c][j+w_mid];
-            //u->work_buffer[j+u->fft_size-w_mid]=u->input[c][j];
-            u->work_buffer[j]=u->W[j+w_mid]*u->input[c][j+w_mid];
-            u->work_buffer[j+u->fft_size-w_mid]=u->W[j]*u->input[c][j];
-        }*/
         //Processing is done here!
         //do fft
+        //char fname[1024];
+        //if(u->samplings==200){
+        //    pa_assert_se(0);
+        //}
+
+        //this iterations input
+        //sprintf(fname,"/home/jason/input%ld-%ld.txt",u->samplings+1,c);
+        //array_out(fname,u->input[c]+(u->window_size-u->R),u->R);
+
         fftwf_execute_dft_r2c(u->forward_plan,u->work_buffer,u->output_window);
         //perform filtering
         for(size_t j=0;j<u->fft_size/2+1;++j){
-            ////identity transform (fft size)
-            //u->output_window[j][0]/=u->fft_size;
-            //u->output_window[j][1]/=u->fft_size;
-            ////identity transform (window size)
-            //u->output_window[j][0]/=u->window_size;
-            //u->output_window[j][1]/=u->window_size;
-            //filtered
             u->output_window[j][0]*=u->H[j];
             u->output_window[j][1]*=u->H[j];
         }
-        //inverse fft
+        ////inverse fft
         fftwf_execute_dft_c2r(u->inverse_plan,u->output_window,u->work_buffer);
+        //the output for the previous iteration's input
+        //sprintf(fname,"/home/jason/output%ld-%ld.txt",u->samplings,c);
+        //array_out(fname,u->work_buffer,u->window_size);
 
-        /*
-        //uncenter the data
-        for(size_t j=0;j<w_mid;++j){
-            const float tmp=u->work_buffer[j];
-            u->work_buffer[j]=u->work_buffer[j+u->fft_size-w_mid];
-            u->work_buffer[j+w_mid]=tmp;
-        }
-        */
-        /*
-        //divide out fft gain (more stable here?)
-        for(size_t j=0;j<u->window_size;++j){
-            u->work_buffer[j]/=u->fft_size;
-        }
-        */
-        /*
-        //debug: tests overlaping add
-        //and negates ALL PREVIOUS processing
-        //yields a perfect reconstruction if COLA is held
-        for(size_t j=0;j<u->window_size;++j){
-            u->work_buffer[j]=u->W[j]*u->input[c][j];
+
+        ////debug: tests overlaping add
+        ////and negates ALL PREVIOUS processing
+        ////yields a perfect reconstruction if COLA is held
+        //for(size_t j=0;j<u->window_size;++j){
+        //    u->work_buffer[j]=u->W[j]*u->input[c][j];
+        //}
+
+        //overlap add and preserve overlap component from this window (linear phase)
+        for(size_t j=0;j<u->R;++j){
+            u->work_buffer[j]+=u->overlap_accum[c][j];
+            u->overlap_accum[c][j]=u->work_buffer[u->window_size-u->R+j];
         }
-        */
+
+
         /*
         //debug: tests if basic buffering works
         //shouldn't modify the signal AT ALL
@@ -398,40 +375,20 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         }
         */
 
-        /*
-        //overlap add and preserve overlap component from this window (zero phase)
-        for(size_t j=0;j<u->overlap_size;++j){
-            u->work_buffer[j]+=u->overlap_accum[c][j];
-            u->overlap_accum[c][j]=u->work_buffer[u->window_size-u->overlap_size+j];
-        }
-        */
-        //overlap add and preserve overlap component from this window (linear phase)
-        for(size_t j=0;j<u->overlap_size;++j){
-            u->work_buffer[j]+=u->overlap_accum[c][j];
-            u->overlap_accum[c][j]=u->work_buffer[u->window_size-u->overlap_size+j];
-        }
-
         //preseve the needed input for the next windows overlap
-        memmove(u->input[c],u->input[c]+u->overlap_size,(u->window_size-u->overlap_size)*sizeof(float));
+        memmove(u->input[c],u->input[c]+u->R,
+            (u->window_size-u->R)*sizeof(float)
+        );
         //output the samples that are outputable now
         pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst+c, fs, u->work_buffer, sizeof(float),n_outputable);
         //buffer the rest of them
         memcpy(u->output_buffer[c]+u->n_buffered_output,u->work_buffer+n_outputable,sample_rem*sizeof(float));
+
     }
-    /*
-    clock_gettime(CLOCK_MONOTONIC, &end);
-    elapsed=time_diff(&end, &start);
-    pa_log("processed: %ld, time: %ld",u->samples_gathered,elapsed);
-    */
+    //u->samplings++;
     u->n_buffered_output+=sample_rem;
     u->samples_gathered=0;
-
-
-    //pa_log("%ld samples queued",u->n_buffered_output);
-
     pa_memblock_release(chunk->memblock);
-
-
     return 0;
 }
 
@@ -456,6 +413,8 @@ static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
         if (amount > 0) {
             pa_memblockq_seek(u->memblockq, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
             pa_log_debug("Resetting equalizer");
+            u->n_buffered_output=0;
+            u->samples_gathered=0;
         }
     }
 
@@ -621,18 +580,12 @@ int pa__init(pa_module*m) {
     u->sink_input = NULL;
     u->memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, fs, 1, 1, 0, NULL);
 
-    //u->fft_size=44100;
-    //u->fft_size=48000;
-    //u->fft_size=1024;
+    //u->samplings=0;
     u->channels=ss.channels;
     u->fft_size=pow(2,ceil(log(ss.rate)/log(2)));
-    //u->fft_size=ss.rate;
-    //u->fft_size=65536;
     pa_log("fft size: %ld",u->fft_size);
-    u->window_size=8001;
-    u->overlap_size=(u->window_size+1)/2;
-    //u->overlap_size=u->window_size/2;
-    //u->overlap_size=0;
+    u->window_size=7999;
+    u->R=(u->window_size+1)/2;
     u->samples_gathered=0;
     u->n_buffered_output=0;
     u->max_output=pa_frame_align(pa_mempool_block_size_max(m->core->mempool), &ss)/pa_frame_size(&ss);
@@ -645,34 +598,26 @@ int pa__init(pa_module*m) {
     for(size_t c=0;c<u->channels;++c){
         u->input[c]=(float*) fftwf_malloc(u->window_size*sizeof(float));
         memset(u->input[c],0,u->window_size*sizeof(float));
-        u->overlap_accum[c]=(float*) fftwf_malloc(u->overlap_size*sizeof(float));
-        memset(u->overlap_accum[c],0,u->overlap_size*sizeof(float));
+        u->overlap_accum[c]=(float*) fftwf_malloc(u->R*sizeof(float));
+        memset(u->overlap_accum[c],0,u->R*sizeof(float));
         u->output_buffer[c]=(float*) fftwf_malloc(u->window_size*sizeof(float));
     }
     u->output_window = (fftwf_complex *) fftwf_malloc(sizeof(fftwf_complex) * (u->fft_size/2+1));
     u->forward_plan=fftwf_plan_dft_r2c_1d(u->fft_size, u->work_buffer, u->output_window, FFTW_ESTIMATE);
     u->inverse_plan=fftwf_plan_dft_c2r_1d(u->fft_size, u->output_window, u->work_buffer, FFTW_ESTIMATE);
-
     /*
-    //rectangular window
     for(size_t j=0;j<u->window_size;++j){
-        u->W[j]=1.0;
+        u->W[j]=.5;
     }
     */
-    //hanning_normalized_window(u->W,u->window_size);
     hanning_window(u->W,u->window_size);
-    //sin_window(u->W,u->window_size);
-    array_out("/home/jason/window.txt",u->W,u->window_size);
-    //u->forward_plan=fftwf_plan_dft_r2c_1d(u->fft_size, u->input, u->output_window, FFTW_ESTIMATE);
-    //u->inverse_plan=fftwf_plan_dft_c2r_1d(u->fft_size, u->output_window, u->work_buffer, FFTW_ESTIMATE);
-    //u->forward_plan=fftwf_plan_dft_r2c_1d(u->fft_size, u->input, u->output, FFTW_MEASURE);
-    //u->inverse_plan=fftwf_plan_dft_c2r_1d(u->fft_size, u->output, u->input, FFTW_MEASURE);
+
     const int freqs[]={0,25,50,100,200,300,400,800,1500,
         2000,3000,4000,5000,6000,7000,8000,9000,10000,11000,12000,
         13000,14000,15000,16000,17000,18000,19000,20000,21000,22000,23000,24000,INT_MAX};
-    const float coefficients[]={1,1,1,1,1,1,1,1,1,1,
-        1,1,1,1,1,1,1,1,
-        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
+    const float coefficients[]={.1,.1,.1,.1,.1,.1,.1,.1,.1,.1,
+        .1,.1,.1,.1,.1,.1,.1,.1,
+        .1,.1,.1,.1,.1,.1,.1,.1,.1,.1,.1,.1,.1,.1,.1};
     const size_t ncoefficients=sizeof(coefficients)/sizeof(float);
     pa_assert_se(sizeof(freqs)/sizeof(int)==sizeof(coefficients)/sizeof(float));
     float *freq_translated=(float *) malloc(sizeof(float)*(ncoefficients));
@@ -683,13 +628,13 @@ int pa__init(pa_module*m) {
         //pa_log("i: %ld: %d , %g",i,freqs[i],freq_translated[i]);
         pa_assert_se(freq_translated[i]>=freq_translated[i-1]);
     }
-    freq_translated[ncoefficients-1]=DBL_MAX;
+    freq_translated[ncoefficients-1]=FLT_MAX;
     //Interpolate the specified frequency band values
     u->H[0]=1;
     for(size_t i=1,j=0;i<(u->fft_size/2+1);++i){
         pa_assert_se(j<ncoefficients);
         //max frequency range passed, consider the rest as one band
-        if(freq_translated[j+1]>=DBL_MAX){
+        if(freq_translated[j+1]>=FLT_MAX){
             for(;i<(u->fft_size/2+1);++i){
                 u->H[i]=coefficients[j];
             }
@@ -709,9 +654,8 @@ int pa__init(pa_module*m) {
             j++;
         }
     }
-    array_out("/home/jason/coffs.txt",u->H,u->fft_size/2+1);
     //divide out the fft gain
-    for(int i=0;i<(u->fft_size/2+1);++i){
+    for(size_t i=0;i<(u->fft_size/2+1);++i){
         u->H[i]/=u->fft_size;
     }
     free(freq_translated);

commit 182c9c7dcb3c7e6b8d273ab85e6f3e67070a4694
Author: Jason Newton <jason at arcuid.wyred.org>
Date:   Thu Jul 16 18:18:14 2009 -0700

    module-equalizer-sink: added more assertions to aid in debugging

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index cabb0dc..d4cec3c 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -251,8 +251,9 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     pa_sink_input_assert_ref(i);
     pa_assert(chunk);
     pa_assert_se(u = i->userdata);
-    size_t fs = pa_frame_size(&u->sink->sample_spec);
-    size_t ss=pa_sample_size(&u->sink->sample_spec);
+    pa_assert_se(u->sink);
+    size_t fs = pa_frame_size(&(u->sink->sample_spec));
+    size_t ss=pa_sample_size(&(u->sink->sample_spec));
     size_t fe = fs/ss;
 
     if (!u->sink || !PA_SINK_IS_OPENED(u->sink->thread_info.state))
@@ -597,10 +598,14 @@ int pa__init(pa_module*m) {
     u->output_buffer=(float **)malloc(sizeof(float *)*u->channels);
     for(size_t c=0;c<u->channels;++c){
         u->input[c]=(float*) fftwf_malloc(u->window_size*sizeof(float));
+        pa_assert_se(u->input[c]);
         memset(u->input[c],0,u->window_size*sizeof(float));
+        pa_assert_se(u->input[c]);
         u->overlap_accum[c]=(float*) fftwf_malloc(u->R*sizeof(float));
+        pa_assert_se(u->overlap_accum[c]);
         memset(u->overlap_accum[c],0,u->R*sizeof(float));
         u->output_buffer[c]=(float*) fftwf_malloc(u->window_size*sizeof(float));
+        pa_assert_se(u->output_buffer[c]);
     }
     u->output_window = (fftwf_complex *) fftwf_malloc(sizeof(fftwf_complex) * (u->fft_size/2+1));
     u->forward_plan=fftwf_plan_dft_r2c_1d(u->fft_size, u->work_buffer, u->output_window, FFTW_ESTIMATE);
@@ -615,9 +620,9 @@ int pa__init(pa_module*m) {
     const int freqs[]={0,25,50,100,200,300,400,800,1500,
         2000,3000,4000,5000,6000,7000,8000,9000,10000,11000,12000,
         13000,14000,15000,16000,17000,18000,19000,20000,21000,22000,23000,24000,INT_MAX};
-    const float coefficients[]={.1,.1,.1,.1,.1,.1,.1,.1,.1,.1,
-        .1,.1,.1,.1,.1,.1,.1,.1,
-        .1,.1,.1,.1,.1,.1,.1,.1,.1,.1,.1,.1,.1,.1,.1};
+    const float coefficients[]={1,1,1,1,1,1,1,1,1,1,
+        1,1,1,1,1,1,1,1,
+        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
     const size_t ncoefficients=sizeof(coefficients)/sizeof(float);
     pa_assert_se(sizeof(freqs)/sizeof(int)==sizeof(coefficients)/sizeof(float));
     float *freq_translated=(float *) malloc(sizeof(float)*(ncoefficients));

commit d4fe5bfce988765fd51d291c61217ffef9df7698
Author: Jason Newton <jason at arcuid.wyred.org>
Date:   Thu Jul 16 22:00:38 2009 -0700

    module-equalizer-sink: attempt different buffering strategy

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index d4cec3c..d6e28f3 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -259,29 +259,11 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     if (!u->sink || !PA_SINK_IS_OPENED(u->sink->thread_info.state))
         return -1;
 
-    //output any buffered outputs first
-    if(u->n_buffered_output>0){
-        //pa_log("outputing %ld buffered samples",u->n_buffered_output);
-        chunk->index = 0;
-        size_t n_outputable=PA_MIN(u->n_buffered_output,u->max_output);
-        chunk->length = n_outputable*fs;
-        chunk->memblock = pa_memblock_new(i->sink->core->mempool, chunk->length);
-        pa_memblockq_drop(u->memblockq, chunk->length);
-        dst = (float*) pa_memblock_acquire(chunk->memblock);
-        for(size_t j=0;j<u->channels;++j){
-            pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst+j, fs, u->output_buffer[j], sizeof(float),n_outputable);
-            memmove(u->output_buffer[j],u->output_buffer[j]+n_outputable,(u->n_buffered_output-n_outputable)*sizeof(float));
-        }
-        u->n_buffered_output-=n_outputable;
-        pa_memblock_release(chunk->memblock);
-        return 0;
-    }
-    pa_assert_se(u->n_buffered_output==0);
-
     //collect the minimum number of samples
     //TODO figure out a better way of buffering the needed
     //number of samples, this doesn't seem to work correctly
-    while(u->samples_gathered < u->R){
+    //most of the itme
+    if(u->samples_gathered < u->R){
         //render some new fragments to our memblockq
         size_t desired_samples=PA_MIN(u->R-u->samples_gathered,u->max_output);
         while (pa_memblockq_peek(u->memblockq, &tchunk) < 0) {
@@ -295,7 +277,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
             pa_log("got %ld samples, asked for %ld",tchunk.length/fs,desired_samples);
         }
         size_t n_samples=PA_MIN(tchunk.length/fs,u->R-u->samples_gathered);
-        //TODO: figure out what to do with rest of the samples when there's too many (rare?)
+        pa_assert_se(n_samples<=u->R-u->samples_gathered);
         src = (float*) ((uint8_t*) pa_memblock_acquire(tchunk.memblock) + tchunk.index);
         for (size_t c=0;c<u->channels;c++) {
             pa_sample_clamp(PA_SAMPLE_FLOAT32NE,u->input[c]+(u->window_size-u->R)+u->samples_gathered,sizeof(float), src+c, fs, n_samples);
@@ -304,12 +286,33 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         pa_memblock_release(tchunk.memblock);
         pa_memblock_unref(tchunk.memblock);
     }
+    //output any buffered outputs first
+    if(u->n_buffered_output>0){
+        //pa_log("outputing %ld buffered samples",u->n_buffered_output);
+        chunk->index = 0;
+        size_t n_outputable=PA_MIN(u->n_buffered_output,u->max_output);
+        chunk->length = n_outputable*fs;
+        chunk->memblock = pa_memblock_new(i->sink->core->mempool, chunk->length);
+        pa_memblockq_drop(u->memblockq, chunk->length);
+        dst = (float*) pa_memblock_acquire(chunk->memblock);
+        for(size_t j=0;j<u->channels;++j){
+            pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst+j, fs, u->output_buffer[j], sizeof(float),n_outputable);
+            memmove(u->output_buffer[j],u->output_buffer[j]+n_outputable,(u->n_buffered_output-n_outputable)*sizeof(float));
+        }
+        u->n_buffered_output-=n_outputable;
+        pa_memblock_release(chunk->memblock);
+        return 0;
+    }
+    pa_assert_se(u->n_buffered_output==0);
+
+    if(u->samples_gathered<u->R){
+        return -1;
+    }
     //IT should be this guy if we're buffering like how its supposed to
     //size_t n_outputable=PA_MIN(u->window_size-u->R,u->max_output);
     //This one takes into account the actual data gathered but then the dsp
     //stuff is wrong when the buffer "underruns"
-    size_t n_outputable=PA_MIN(u->R,u->max_output);
-
+    size_t n_outputable=PA_MIN(u->R,u->max_output)*(u->R==u->samples_gathered);
 
     chunk->index=0;
     chunk->length=n_outputable*fs;
@@ -319,7 +322,6 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
 
     pa_assert_se(u->fft_size>=u->window_size);
     pa_assert_se(u->R<u->window_size);
-    pa_assert_se(u->samples_gathered>=u->R);
     size_t sample_rem=u->R-n_outputable;
     //use a linear-phase sliding STFT and overlap-add method (for each channel)
     for (size_t c=0;c<u->channels;c++) {
@@ -389,6 +391,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     //u->samplings++;
     u->n_buffered_output+=sample_rem;
     u->samples_gathered=0;
+end:
     pa_memblock_release(chunk->memblock);
     return 0;
 }

commit cf8331a0da9df5e4eff6105a002f4912be673d0a
Author: Jason Newton <jason at arcuid.wyred.org>
Date:   Sat Jul 18 01:00:35 2009 -0700

    module-equalizer-sink: trying new buffering strategies

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index d6e28f3..1d4a423 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -81,9 +81,10 @@ struct userdata {
               * the latency of the filter, calculated from window_size
               * based on constraints of COLA and window function
               */
+    size_t overlap_size;//window_size-R
     size_t samples_gathered;
-    size_t n_buffered_output;
     size_t max_output;
+    size_t target_samples;
     float *H;//frequency response filter (magnitude based)
     float *W;//windowing function (time domain)
     float *work_buffer,**input,**overlap_accum,**output_buffer;
@@ -91,7 +92,8 @@ struct userdata {
     fftwf_plan forward_plan,inverse_plan;
     //size_t samplings;
 
-    pa_memblockq *memblockq;
+    pa_memchunk conv_buffer;
+    pa_memblockq *rendered_q;
 };
 
 static const char* const valid_modargs[] = {
@@ -186,12 +188,14 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
         case PA_SINK_MESSAGE_GET_LATENCY: {
             pa_usec_t usec = 0;
             pa_sample_spec *ss=&u->sink->sample_spec;
+            size_t fs=pa_frame_size(ss);
 
             /* Get the latency of the master sink */
             if (PA_MSGOBJECT(u->master)->process_msg(PA_MSGOBJECT(u->master), PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL) < 0)
                 usec = 0;
 
-            usec+=pa_bytes_to_usec(u->n_buffered_output*pa_frame_size(ss),ss);
+            usec+=pa_bytes_to_usec(u->samples_gathered*fs,ss);
+            usec += pa_bytes_to_usec(pa_memblockq_get_length(u->rendered_q), ss);
             /* Add the latency internal to our sink input on top */
             usec += pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->master->sample_spec);
             *((pa_usec_t*) data) = usec;
@@ -227,7 +231,7 @@ static void sink_request_rewind(pa_sink *s) {
     pa_assert_se(u = s->userdata);
 
     /* Just hand this one over to the master sink */
-    pa_sink_input_request_rewind(u->sink_input, s->thread_info.rewind_nbytes + pa_memblockq_get_length(u->memblockq), TRUE, FALSE, FALSE);
+    pa_sink_input_request_rewind(u->sink_input, s->thread_info.rewind_nbytes + pa_memblockq_get_length(u->rendered_q), TRUE, FALSE, FALSE);
 }
 
 /* Called from I/O thread context */
@@ -246,153 +250,159 @@ static void sink_update_requested_latency(pa_sink *s) {
 /* Called from I/O thread context */
 static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) {
     struct userdata *u;
-    float *src, *dst;
-    pa_memchunk tchunk;
     pa_sink_input_assert_ref(i);
     pa_assert(chunk);
     pa_assert_se(u = i->userdata);
     pa_assert_se(u->sink);
-    size_t fs = pa_frame_size(&(u->sink->sample_spec));
+    size_t fs=pa_frame_size(&(u->sink->sample_spec));
     size_t ss=pa_sample_size(&(u->sink->sample_spec));
     size_t fe = fs/ss;
+    size_t samples_requested=nbytes/fs;
+    pa_memchunk tchunk;
+    chunk->memblock=NULL;
+    size_t buffered_samples=pa_memblockq_get_length(u->rendered_q)/fs;
 
     if (!u->sink || !PA_SINK_IS_OPENED(u->sink->thread_info.state))
         return -1;
 
-    //collect the minimum number of samples
-    //TODO figure out a better way of buffering the needed
-    //number of samples, this doesn't seem to work correctly
-    //most of the itme
-    if(u->samples_gathered < u->R){
-        //render some new fragments to our memblockq
-        size_t desired_samples=PA_MIN(u->R-u->samples_gathered,u->max_output);
-        while (pa_memblockq_peek(u->memblockq, &tchunk) < 0) {
-            pa_memchunk nchunk;
-
-            pa_sink_render(u->sink, desired_samples*fs, &nchunk);
-            pa_memblockq_push(u->memblockq, &nchunk);
-            pa_memblock_unref(nchunk.memblock);
-        }
-        if(tchunk.length/fs!=desired_samples){
-            pa_log("got %ld samples, asked for %ld",tchunk.length/fs,desired_samples);
+    pa_log("start output-buffered %ld, input-buffered %ld",buffered_samples,u->samples_gathered);
+    //collect samples
+    size_t buffered_remaining=pa_memblockq_get_length(u->rendered_q)/fs;
+    size_t buffer_missing=pa_memblockq_missing(u->rendered_q)/fs;
+    size_t desired_samples=(buffer_missing>=u->R)*PA_MIN(u->target_samples-u->samples_gathered,buffer_missing);
+    if(desired_samples>0){
+        u->conv_buffer.index=0;
+        //if we still had buffered output, 
+        //or can gather any more in the buffer
+        //politely request (optimistic)
+        if(buffered_samples>=samples_requested ||
+            (u->samples_gathered/u->R)*u->R>=samples_requested){
+            u->conv_buffer.length=desired_samples*fs;
+            pa_log("trying to buffer %ld samples",desired_samples);
+            pa_sink_render_into(u->sink, &u->conv_buffer);
+        }else{//we need it now! force it
+            //TODO: minimum amount or the whole buffer better?
+            desired_samples=u->R-u->samples_gathered%u->R;
+            u->conv_buffer.length=desired_samples*fs;
+            pa_log("force-buffer %ld samples",desired_samples);
+            pa_sink_render_into_full(u->sink, &u->conv_buffer);
+            pa_assert_se(u->conv_buffer.length==desired_samples*fs);
         }
-        size_t n_samples=PA_MIN(tchunk.length/fs,u->R-u->samples_gathered);
-        pa_assert_se(n_samples<=u->R-u->samples_gathered);
-        src = (float*) ((uint8_t*) pa_memblock_acquire(tchunk.memblock) + tchunk.index);
+        size_t n_samples=u->conv_buffer.length/fs;
+        float *src;
+        pa_log("received %ld samples",n_samples);
+
+        pa_assert_se(n_samples<=u->target_samples-u->samples_gathered);
+        src = (float*) ((uint8_t*) pa_memblock_acquire(u->conv_buffer.memblock) + u->conv_buffer.index);
         for (size_t c=0;c<u->channels;c++) {
-            pa_sample_clamp(PA_SAMPLE_FLOAT32NE,u->input[c]+(u->window_size-u->R)+u->samples_gathered,sizeof(float), src+c, fs, n_samples);
+            //buffer with an offset after the overlap from previous
+            //iterations
+            pa_assert_se(
+                u->input[c]+u->overlap_size+u->samples_gathered+n_samples<=u->input[c]+u->target_samples+u->overlap_size
+            );
+            pa_sample_clamp(PA_SAMPLE_FLOAT32NE,u->input[c]+u->overlap_size+u->samples_gathered,sizeof(float), src+c, fs, n_samples);
         }
         u->samples_gathered+=n_samples;
-        pa_memblock_release(tchunk.memblock);
-        pa_memblock_unref(tchunk.memblock);
-    }
-    //output any buffered outputs first
-    if(u->n_buffered_output>0){
-        //pa_log("outputing %ld buffered samples",u->n_buffered_output);
-        chunk->index = 0;
-        size_t n_outputable=PA_MIN(u->n_buffered_output,u->max_output);
-        chunk->length = n_outputable*fs;
-        chunk->memblock = pa_memblock_new(i->sink->core->mempool, chunk->length);
-        pa_memblockq_drop(u->memblockq, chunk->length);
-        dst = (float*) pa_memblock_acquire(chunk->memblock);
-        for(size_t j=0;j<u->channels;++j){
-            pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst+j, fs, u->output_buffer[j], sizeof(float),n_outputable);
-            memmove(u->output_buffer[j],u->output_buffer[j]+n_outputable,(u->n_buffered_output-n_outputable)*sizeof(float));
-        }
-        u->n_buffered_output-=n_outputable;
-        pa_memblock_release(chunk->memblock);
-        return 0;
-    }
-    pa_assert_se(u->n_buffered_output==0);
-
-    if(u->samples_gathered<u->R){
-        return -1;
+        pa_memblock_release(u->conv_buffer.memblock);
     }
-    //IT should be this guy if we're buffering like how its supposed to
-    //size_t n_outputable=PA_MIN(u->window_size-u->R,u->max_output);
-    //This one takes into account the actual data gathered but then the dsp
-    //stuff is wrong when the buffer "underruns"
-    size_t n_outputable=PA_MIN(u->R,u->max_output)*(u->R==u->samples_gathered);
-
-    chunk->index=0;
-    chunk->length=n_outputable*fs;
-    chunk->memblock = pa_memblock_new(i->sink->core->mempool, chunk->length);
-    pa_memblockq_drop(u->memblockq, chunk->length);
-    dst = (float*) pa_memblock_acquire(chunk->memblock);
-
+    //pa_assert_se(u->samples_gathered>=u->R);
     pa_assert_se(u->fft_size>=u->window_size);
     pa_assert_se(u->R<u->window_size);
-    size_t sample_rem=u->R-n_outputable;
-    //use a linear-phase sliding STFT and overlap-add method (for each channel)
-    for (size_t c=0;c<u->channels;c++) {
-        ////zero padd the data
-        //memset(u->work_buffer,0,u->fft_size*sizeof(float));
-        memset(u->work_buffer+u->window_size,0,(u->fft_size-u->window_size)*sizeof(float));
-        ////window the data
-        for(size_t j=0;j<u->window_size;++j){
-            u->work_buffer[j]=u->W[j]*u->input[c][j];
-        }
-        //Processing is done here!
-        //do fft
-        //char fname[1024];
-        //if(u->samplings==200){
-        //    pa_assert_se(0);
-        //}
-
-        //this iterations input
-        //sprintf(fname,"/home/jason/input%ld-%ld.txt",u->samplings+1,c);
-        //array_out(fname,u->input[c]+(u->window_size-u->R),u->R);
-
-        fftwf_execute_dft_r2c(u->forward_plan,u->work_buffer,u->output_window);
-        //perform filtering
-        for(size_t j=0;j<u->fft_size/2+1;++j){
-            u->output_window[j][0]*=u->H[j];
-            u->output_window[j][1]*=u->H[j];
-        }
-        ////inverse fft
-        fftwf_execute_dft_c2r(u->inverse_plan,u->output_window,u->work_buffer);
-        //the output for the previous iteration's input
-        //sprintf(fname,"/home/jason/output%ld-%ld.txt",u->samplings,c);
-        //array_out(fname,u->work_buffer,u->window_size);
-
-
-        ////debug: tests overlaping add
-        ////and negates ALL PREVIOUS processing
-        ////yields a perfect reconstruction if COLA is held
-        //for(size_t j=0;j<u->window_size;++j){
-        //    u->work_buffer[j]=u->W[j]*u->input[c][j];
-        //}
-
-        //overlap add and preserve overlap component from this window (linear phase)
-        for(size_t j=0;j<u->R;++j){
-            u->work_buffer[j]+=u->overlap_accum[c][j];
-            u->overlap_accum[c][j]=u->work_buffer[u->window_size-u->R+j];
-        }
-
-
-        /*
-        //debug: tests if basic buffering works
-        //shouldn't modify the signal AT ALL
-        for(size_t j=0;j<u->window_size;++j){
-            u->work_buffer[j]=u->input[c][j];
+    //process every complete block on hand
+    while(u->samples_gathered>=u->R&&buffer_missing>=u->R){
+        float *dst;
+        //pa_log("iter gathered: %ld",u->samples_gathered);
+        tchunk.index=0;
+        tchunk.length=u->R*fs;
+        tchunk.memblock=pa_memblock_new(u->core->mempool,tchunk.length);
+        //pa_memblockq_drop(u->rendered_q, tchunk.length);
+        pa_assert_se(tchunk.length==u->R*fs);
+        dst=(float*)pa_memblock_acquire(tchunk.memblock);
+        //use a linear-phase sliding STFT and overlap-add method (for each channel)
+        for (size_t c=0;c<u->channels;c++) {
+            //zero padd the data
+            memset(u->work_buffer+u->window_size,0,(u->fft_size-u->window_size)*sizeof(float));
+            //window the data
+            for(size_t j=0;j<u->window_size;++j){
+                u->work_buffer[j]=u->W[j]*u->input[c][j];
+            }
+            //Processing is done here!
+            //do fft
+            fftwf_execute_dft_r2c(u->forward_plan,u->work_buffer,u->output_window);
+            //perform filtering
+            for(size_t j=0;j<u->fft_size/2+1;++j){
+                u->output_window[j][0]*=u->H[j];
+                u->output_window[j][1]*=u->H[j];
+            }
+            //inverse fft
+            fftwf_execute_dft_c2r(u->inverse_plan,u->output_window,u->work_buffer);
+            ////debug: tests overlaping add
+            ////and negates ALL PREVIOUS processing
+            ////yields a perfect reconstruction if COLA is held
+            //for(size_t j=0;j<u->window_size;++j){
+            //    u->work_buffer[j]=u->W[j]*u->input[c][j];
+            //}
+
+            //overlap add and preserve overlap component from this window (linear phase)
+            for(size_t j=0;j<u->R;++j){
+                u->work_buffer[j]+=u->overlap_accum[c][j];
+                u->overlap_accum[c][j]=u->work_buffer[u->overlap_size+j];
+            }
+            
+            //debug: tests if basic buffering works
+            //shouldn't modify the signal AT ALL (beyond roundoff)
+            for(size_t j=0;j<u->window_size;++j){
+                u->work_buffer[j]=u->input[c][j];
+            }
+            
+            //preseve the needed input for the next window's overlap
+            memmove(u->input[c],u->input[c]+u->R,
+                (u->samples_gathered+u->overlap_size-u->R)*sizeof(float)
+            );
+            //output the samples that are outputable now
+            pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst+c, fs, u->work_buffer, sizeof(float),u->R);
         }
-        */
-
-        //preseve the needed input for the next windows overlap
-        memmove(u->input[c],u->input[c]+u->R,
-            (u->window_size-u->R)*sizeof(float)
-        );
-        //output the samples that are outputable now
-        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst+c, fs, u->work_buffer, sizeof(float),n_outputable);
-        //buffer the rest of them
-        memcpy(u->output_buffer[c]+u->n_buffered_output,u->work_buffer+n_outputable,sample_rem*sizeof(float));
-
+        pa_memblock_release(tchunk.memblock);
+        pa_memblockq_push(u->rendered_q, &tchunk);
+        pa_memblock_unref(tchunk.memblock);
+        u->samples_gathered-=u->R;
+        buffer_missing-=u->R;
     }
-    //u->samplings++;
-    u->n_buffered_output+=sample_rem;
-    u->samples_gathered=0;
-end:
-    pa_memblock_release(chunk->memblock);
+    //deque from renderq and output
+    //pa_memblockq_set_prebuf(u->rendered_q,samples_requested*fs);
+    pa_assert_se(pa_memblockq_peek(u->rendered_q,&tchunk)>=0);
+    if(tchunk.length>=nbytes){
+        *chunk=tchunk;
+        chunk->length=samples_requested*fs;
+        pa_memblock_ref(chunk->memblock);
+        pa_memblock_unref(tchunk.memblock);
+        pa_memblockq_drop(u->rendered_q, chunk->length);
+    }else{
+        size_t copied=0;
+        chunk->length=nbytes;
+        chunk->memblock=pa_memblock_new(u->core->mempool,chunk->length);
+        uint8_t *dst=(uint8_t*)pa_memblock_acquire(chunk->memblock);
+        do{
+            size_t l=PA_MIN(tchunk.length-tchunk.index,nbytes-copied);
+            uint8_t *src=(((uint8_t*)pa_memblock_acquire(tchunk.memblock))+tchunk.index);
+            memmove(dst+copied,src,l);
+            copied+=l;
+            pa_memblock_release(tchunk.memblock);
+            pa_memblock_unref(tchunk.memblock);
+            pa_memblockq_drop(u->rendered_q,l);
+            if(copied<nbytes){
+                if(pa_memblockq_get_length(u->rendered_q)==0){
+                    chunk->length=copied;
+                    break;
+                }
+                pa_memblockq_peek(u->rendered_q,&tchunk);
+            }
+        }while(copied<nbytes);
+        pa_memblock_release(chunk->memblock);
+    }
+    pa_assert_se(chunk->memblock);
+    pa_log("output requested %ld, gave %ld",nbytes/fs,chunk->length/fs);
+    //pa_log("end pop");
     return 0;
 }
 
@@ -410,20 +420,19 @@ static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
     if (u->sink->thread_info.rewind_nbytes > 0) {
         size_t max_rewrite;
 
-        max_rewrite = nbytes + pa_memblockq_get_length(u->memblockq);
+        max_rewrite = nbytes + pa_memblockq_get_length(u->rendered_q);
         amount = PA_MIN(u->sink->thread_info.rewind_nbytes, max_rewrite);
         u->sink->thread_info.rewind_nbytes = 0;
 
         if (amount > 0) {
-            pa_memblockq_seek(u->memblockq, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
+            pa_memblockq_seek(u->rendered_q, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
             pa_log_debug("Resetting equalizer");
-            u->n_buffered_output=0;
             u->samples_gathered=0;
         }
     }
 
     pa_sink_process_rewind(u->sink, amount);
-    pa_memblockq_rewind(u->memblockq, nbytes);
+    pa_memblockq_rewind(u->rendered_q, nbytes);
 }
 
 /* Called from I/O thread context */
@@ -436,7 +445,7 @@ static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) {
     if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
         return;
 
-    pa_memblockq_set_maxrewind(u->memblockq, nbytes);
+    pa_memblockq_set_maxrewind(u->rendered_q, nbytes);
     pa_sink_set_max_rewind_within_thread(u->sink, nbytes);
 }
 
@@ -582,17 +591,20 @@ int pa__init(pa_module*m) {
     u->master = master;
     u->sink = NULL;
     u->sink_input = NULL;
-    u->memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, fs, 1, 1, 0, NULL);
 
-    //u->samplings=0;
     u->channels=ss.channels;
     u->fft_size=pow(2,ceil(log(ss.rate)/log(2)));
     pa_log("fft size: %ld",u->fft_size);
     u->window_size=7999;
     u->R=(u->window_size+1)/2;
+    u->overlap_size=u->window_size-u->R;
+    u->target_samples=5*u->R;
     u->samples_gathered=0;
-    u->n_buffered_output=0;
     u->max_output=pa_frame_align(pa_mempool_block_size_max(m->core->mempool), &ss)/pa_frame_size(&ss);
+    u->rendered_q = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH,u->target_samples*fs, fs, fs, 0, 0, NULL);
+    u->conv_buffer.memblock=pa_memblock_new(u->core->mempool,u->target_samples*fs);
+
+
     u->H=(float*) fftwf_malloc((u->fft_size/2+1)*sizeof(float));
     u->W=(float*) fftwf_malloc((u->window_size)*sizeof(float));
     u->work_buffer=(float*) fftwf_malloc(u->fft_size*sizeof(float));
@@ -600,9 +612,9 @@ int pa__init(pa_module*m) {
     u->overlap_accum=(float **)malloc(sizeof(float *)*u->channels);
     u->output_buffer=(float **)malloc(sizeof(float *)*u->channels);
     for(size_t c=0;c<u->channels;++c){
-        u->input[c]=(float*) fftwf_malloc(u->window_size*sizeof(float));
+        u->input[c]=(float*) fftwf_malloc((u->target_samples+u->overlap_size)*sizeof(float));
         pa_assert_se(u->input[c]);
-        memset(u->input[c],0,u->window_size*sizeof(float));
+        memset(u->input[c],0,(u->target_samples+u->overlap_size)*sizeof(float));
         pa_assert_se(u->input[c]);
         u->overlap_accum[c]=(float*) fftwf_malloc(u->R*sizeof(float));
         pa_assert_se(u->overlap_accum[c]);
@@ -780,8 +792,11 @@ void pa__done(pa_module*m) {
         pa_sink_input_unref(u->sink_input);
     }
 
-    if (u->memblockq)
-        pa_memblockq_free(u->memblockq);
+    if(u->conv_buffer.memblock)
+        pa_memblock_unref(u->conv_buffer.memblock);
+
+    if (u->rendered_q)
+        pa_memblockq_free(u->rendered_q);
 
     fftwf_destroy_plan(u->inverse_plan);
     fftwf_destroy_plan(u->forward_plan);
diff --git a/src/pulsecore/memblock.c b/src/pulsecore/memblock.c
index f38b17c..eac4a59 100644
--- a/src/pulsecore/memblock.c
+++ b/src/pulsecore/memblock.c
@@ -54,7 +54,7 @@
  * stored in SHM and our OS does not commit the memory before we use
  * it for the first time. */
 #define PA_MEMPOOL_SLOTS_MAX 1024
-#define PA_MEMPOOL_SLOT_SIZE (64*1024)
+#define PA_MEMPOOL_SLOT_SIZE (128*1024)
 
 #define PA_MEMEXPORT_SLOTS_MAX 128
 

commit 09d9096069360d1eecd30b11df7b4c7d2c39ac35
Author: Jason Newton <jason at arcuid.wyred.org>
Date:   Tue Jul 21 03:24:57 2009 -0700

    module-equalizer-sink: simplified sink_input pop callback and introduced new variables that simplify different strategies.

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 1d4a423..970b20d 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -65,6 +65,7 @@ PA_MODULE_USAGE(_("sink=<sink to connect to> "));
 
 #define MEMBLOCKQ_MAXLENGTH (16*1024*1024)
 
+
 struct userdata {
     pa_core *core;
     pa_module *module;
@@ -107,6 +108,21 @@ static const char* const valid_modargs[] = {
     NULL
 };
 
+uint64_t time_diff(struct timespec *timeA_p, struct timespec *timeB_p);
+void hanning_normalized_window(float *W,size_t window_size);
+void hanning_window(float *W,size_t window_size);
+void hamming_window(float *W,size_t window_size);
+void blackman_window(float *W,size_t window_size);
+void sin_window(float *W,size_t window_size);
+void array_out(const char *name,float *a,size_t length);
+
+static void dsp_logic(float *dst,struct userdata *u);
+static void process_samples(struct userdata *u);
+void input_buffer(struct userdata *u,pa_memchunk *in);
+
+#define gettime(x) clock_gettime(CLOCK_MONOTONIC,&x)
+#define tdiff(x,y) time_diff(&x,&y)
+
 uint64_t time_diff(struct timespec *timeA_p, struct timespec *timeB_p)
 {
     return ((timeA_p->tv_sec * 1000000000) + timeA_p->tv_nsec) -
@@ -188,13 +204,14 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
         case PA_SINK_MESSAGE_GET_LATENCY: {
             pa_usec_t usec = 0;
             pa_sample_spec *ss=&u->sink->sample_spec;
-            size_t fs=pa_frame_size(ss);
+            size_t fs=pa_frame_size(&(u->sink->sample_spec));
 
             /* Get the latency of the master sink */
             if (PA_MSGOBJECT(u->master)->process_msg(PA_MSGOBJECT(u->master), PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL) < 0)
                 usec = 0;
 
-            usec+=pa_bytes_to_usec(u->samples_gathered*fs,ss);
+            usec+=pa_bytes_to_usec(u->R*fs,ss);
+            //usec+=pa_bytes_to_usec(u->samples_gathered*fs,ss);
             usec += pa_bytes_to_usec(pa_memblockq_get_length(u->rendered_q), ss);
             /* Add the latency internal to our sink input on top */
             usec += pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->master->sample_spec);
@@ -247,6 +264,90 @@ static void sink_update_requested_latency(pa_sink *s) {
             pa_sink_get_requested_latency_within_thread(s));
 }
 
+static void process_samples(struct userdata *u){
+    pa_memchunk tchunk;
+    size_t fs=pa_frame_size(&(u->sink->sample_spec));
+    while(u->samples_gathered>=u->R){
+        float *dst;
+        //pa_log("iter gathered: %ld",u->samples_gathered);
+        //pa_memblockq_drop(u->rendered_q, tchunk.length);
+        tchunk.index=0;
+        tchunk.length=u->R*fs;
+        tchunk.memblock=pa_memblock_new(u->core->mempool,tchunk.length);
+        dst=((float*)pa_memblock_acquire(tchunk.memblock));
+        dsp_logic(dst,u);
+        pa_memblock_release(tchunk.memblock);
+        pa_memblockq_push(u->rendered_q, &tchunk);
+        pa_memblock_unref(tchunk.memblock);
+        u->samples_gathered-=u->R;
+    }
+}
+
+static void dsp_logic(float *dst,struct userdata *u){
+    size_t fs=pa_frame_size(&(u->sink->sample_spec));
+    //use a linear-phase sliding STFT and overlap-add method (for each channel)
+    for (size_t c=0;c<u->channels;c++) {
+        //zero padd the data
+        memset(u->work_buffer+u->window_size,0,(u->fft_size-u->window_size)*sizeof(float));
+        //window the data
+        for(size_t j=0;j<u->window_size;++j){
+            u->work_buffer[j]=u->W[j]*u->input[c][j];
+        }
+        //Processing is done here!
+        //do fft
+        fftwf_execute_dft_r2c(u->forward_plan,u->work_buffer,u->output_window);
+        //perform filtering
+        for(size_t j=0;j<u->fft_size/2+1;++j){
+            u->output_window[j][0]*=u->H[j];
+            u->output_window[j][1]*=u->H[j];
+        }
+        //inverse fft
+        fftwf_execute_dft_c2r(u->inverse_plan,u->output_window,u->work_buffer);
+        ////debug: tests overlaping add
+        ////and negates ALL PREVIOUS processing
+        ////yields a perfect reconstruction if COLA is held
+        //for(size_t j=0;j<u->window_size;++j){
+        //    u->work_buffer[j]=u->W[j]*u->input[c][j];
+        //}
+
+        //overlap add and preserve overlap component from this window (linear phase)
+        for(size_t j=0;j<u->R;++j){
+            u->work_buffer[j]+=u->overlap_accum[c][j];
+            u->overlap_accum[c][j]=u->work_buffer[u->overlap_size+j];
+        }
+
+        //debug: tests if basic buffering works
+        //shouldn't modify the signal AT ALL (beyond roundoff)
+        for(size_t j=0;j<u->window_size;++j){
+            u->work_buffer[j]=u->input[c][j];
+        }
+
+        //preseve the needed input for the next window's overlap
+        memmove(u->input[c],u->input[c]+u->R,
+            (u->samples_gathered+u->overlap_size-u->R)*sizeof(float)
+        );
+        //output the samples that are outputable now
+        pa_sample_clamp(PA_SAMPLE_FLOAT32NE,dst+c,fs,u->work_buffer,sizeof(float),u->R);
+    }
+}
+
+void input_buffer(struct userdata *u,pa_memchunk *in){
+    size_t fs=pa_frame_size(&(u->sink->sample_spec));
+    size_t samples=in->length/fs;
+    pa_assert_se(samples<=u->target_samples-u->samples_gathered);
+    float *src = (float*) ((uint8_t*) pa_memblock_acquire(in->memblock) + in->index);
+    for (size_t c=0;c<u->channels;c++) {
+        //buffer with an offset after the overlap from previous
+        //iterations
+        pa_assert_se(
+            u->input[c]+u->overlap_size+u->samples_gathered+samples<=u->input[c]+u->target_samples+u->overlap_size
+        );
+        pa_sample_clamp(PA_SAMPLE_FLOAT32NE,u->input[c]+u->overlap_size+u->samples_gathered,sizeof(float),src+c,fs,samples);
+    }
+    u->samples_gathered+=samples;
+    pa_memblock_release(in->memblock);
+}
+
 /* Called from I/O thread context */
 static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) {
     struct userdata *u;
@@ -255,153 +356,98 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     pa_assert_se(u = i->userdata);
     pa_assert_se(u->sink);
     size_t fs=pa_frame_size(&(u->sink->sample_spec));
-    size_t ss=pa_sample_size(&(u->sink->sample_spec));
-    size_t fe = fs/ss;
     size_t samples_requested=nbytes/fs;
+    size_t buffered_samples=pa_memblockq_get_length(u->rendered_q)/fs;
     pa_memchunk tchunk;
     chunk->memblock=NULL;
-    size_t buffered_samples=pa_memblockq_get_length(u->rendered_q)/fs;
-
     if (!u->sink || !PA_SINK_IS_OPENED(u->sink->thread_info.state))
         return -1;
 
-    pa_log("start output-buffered %ld, input-buffered %ld",buffered_samples,u->samples_gathered);
-    //collect samples
-    size_t buffered_remaining=pa_memblockq_get_length(u->rendered_q)/fs;
-    size_t buffer_missing=pa_memblockq_missing(u->rendered_q)/fs;
-    size_t desired_samples=(buffer_missing>=u->R)*PA_MIN(u->target_samples-u->samples_gathered,buffer_missing);
-    if(desired_samples>0){
-        u->conv_buffer.index=0;
-        //if we still had buffered output, 
-        //or can gather any more in the buffer
-        //politely request (optimistic)
-        if(buffered_samples>=samples_requested ||
-            (u->samples_gathered/u->R)*u->R>=samples_requested){
-            u->conv_buffer.length=desired_samples*fs;
-            pa_log("trying to buffer %ld samples",desired_samples);
-            pa_sink_render_into(u->sink, &u->conv_buffer);
-        }else{//we need it now! force it
-            //TODO: minimum amount or the whole buffer better?
-            desired_samples=u->R-u->samples_gathered%u->R;
-            u->conv_buffer.length=desired_samples*fs;
-            pa_log("force-buffer %ld samples",desired_samples);
-            pa_sink_render_into_full(u->sink, &u->conv_buffer);
-            pa_assert_se(u->conv_buffer.length==desired_samples*fs);
-        }
-        size_t n_samples=u->conv_buffer.length/fs;
-        float *src;
-        pa_log("received %ld samples",n_samples);
-
-        pa_assert_se(n_samples<=u->target_samples-u->samples_gathered);
-        src = (float*) ((uint8_t*) pa_memblock_acquire(u->conv_buffer.memblock) + u->conv_buffer.index);
-        for (size_t c=0;c<u->channels;c++) {
-            //buffer with an offset after the overlap from previous
-            //iterations
-            pa_assert_se(
-                u->input[c]+u->overlap_size+u->samples_gathered+n_samples<=u->input[c]+u->target_samples+u->overlap_size
-            );
-            pa_sample_clamp(PA_SAMPLE_FLOAT32NE,u->input[c]+u->overlap_size+u->samples_gathered,sizeof(float), src+c, fs, n_samples);
-        }
-        u->samples_gathered+=n_samples;
-        pa_memblock_release(u->conv_buffer.memblock);
-    }
-    //pa_assert_se(u->samples_gathered>=u->R);
-    pa_assert_se(u->fft_size>=u->window_size);
-    pa_assert_se(u->R<u->window_size);
-    //process every complete block on hand
-    while(u->samples_gathered>=u->R&&buffer_missing>=u->R){
-        float *dst;
-        //pa_log("iter gathered: %ld",u->samples_gathered);
-        tchunk.index=0;
-        tchunk.length=u->R*fs;
-        tchunk.memblock=pa_memblock_new(u->core->mempool,tchunk.length);
-        //pa_memblockq_drop(u->rendered_q, tchunk.length);
-        pa_assert_se(tchunk.length==u->R*fs);
-        dst=(float*)pa_memblock_acquire(tchunk.memblock);
-        //use a linear-phase sliding STFT and overlap-add method (for each channel)
-        for (size_t c=0;c<u->channels;c++) {
-            //zero padd the data
-            memset(u->work_buffer+u->window_size,0,(u->fft_size-u->window_size)*sizeof(float));
-            //window the data
-            for(size_t j=0;j<u->window_size;++j){
-                u->work_buffer[j]=u->W[j]*u->input[c][j];
-            }
-            //Processing is done here!
-            //do fft
-            fftwf_execute_dft_r2c(u->forward_plan,u->work_buffer,u->output_window);
-            //perform filtering
-            for(size_t j=0;j<u->fft_size/2+1;++j){
-                u->output_window[j][0]*=u->H[j];
-                u->output_window[j][1]*=u->H[j];
-            }
-            //inverse fft
-            fftwf_execute_dft_c2r(u->inverse_plan,u->output_window,u->work_buffer);
-            ////debug: tests overlaping add
-            ////and negates ALL PREVIOUS processing
-            ////yields a perfect reconstruction if COLA is held
-            //for(size_t j=0;j<u->window_size;++j){
-            //    u->work_buffer[j]=u->W[j]*u->input[c][j];
-            //}
-
-            //overlap add and preserve overlap component from this window (linear phase)
-            for(size_t j=0;j<u->R;++j){
-                u->work_buffer[j]+=u->overlap_accum[c][j];
-                u->overlap_accum[c][j]=u->work_buffer[u->overlap_size+j];
-            }
-            
-            //debug: tests if basic buffering works
-            //shouldn't modify the signal AT ALL (beyond roundoff)
-            for(size_t j=0;j<u->window_size;++j){
-                u->work_buffer[j]=u->input[c][j];
-            }
-            
-            //preseve the needed input for the next window's overlap
-            memmove(u->input[c],u->input[c]+u->R,
-                (u->samples_gathered+u->overlap_size-u->R)*sizeof(float)
-            );
-            //output the samples that are outputable now
-            pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst+c, fs, u->work_buffer, sizeof(float),u->R);
-        }
-        pa_memblock_release(tchunk.memblock);
-        pa_memblockq_push(u->rendered_q, &tchunk);
-        pa_memblock_unref(tchunk.memblock);
-        u->samples_gathered-=u->R;
-        buffer_missing-=u->R;
-    }
-    //deque from renderq and output
-    //pa_memblockq_set_prebuf(u->rendered_q,samples_requested*fs);
-    pa_assert_se(pa_memblockq_peek(u->rendered_q,&tchunk)>=0);
-    if(tchunk.length>=nbytes){
+    pa_log("start output-buffered %ld, input-buffered %ld, requested %ld",buffered_samples,u->samples_gathered,samples_requested);
+    struct timespec start,end;
+
+    if(pa_memblockq_peek(u->rendered_q,&tchunk)==0){
         *chunk=tchunk;
-        chunk->length=samples_requested*fs;
-        pa_memblock_ref(chunk->memblock);
-        pa_memblock_unref(tchunk.memblock);
         pa_memblockq_drop(u->rendered_q, chunk->length);
-    }else{
-        size_t copied=0;
-        chunk->length=nbytes;
-        chunk->memblock=pa_memblock_new(u->core->mempool,chunk->length);
-        uint8_t *dst=(uint8_t*)pa_memblock_acquire(chunk->memblock);
-        do{
-            size_t l=PA_MIN(tchunk.length-tchunk.index,nbytes-copied);
-            uint8_t *src=(((uint8_t*)pa_memblock_acquire(tchunk.memblock))+tchunk.index);
-            memmove(dst+copied,src,l);
-            copied+=l;
-            pa_memblock_release(tchunk.memblock);
-            pa_memblock_unref(tchunk.memblock);
-            pa_memblockq_drop(u->rendered_q,l);
-            if(copied<nbytes){
-                if(pa_memblockq_get_length(u->rendered_q)==0){
-                    chunk->length=copied;
-                    break;
-                }
-                pa_memblockq_peek(u->rendered_q,&tchunk);
-            }
-        }while(copied<nbytes);
-        pa_memblock_release(chunk->memblock);
+        return 0;
     }
+    do{
+        pa_memchunk *buffer;
+        size_t input_remaining=u->target_samples-u->samples_gathered;
+        pa_assert(input_remaining>0);
+        //collect samples
+
+        //buffer=&u->conv_buffer;
+        //buffer->length=input_remaining*fs;
+        //buffer->index=0;
+        //pa_memblock_ref(buffer);
+        //pa_sink_render_into(u->sink,buffer);
+
+        if(u->sink->thread_info.rewind_requested)
+            sink_request_rewind(u->sink);
+
+        pa_memchunk p;
+        buffer=&p;
+        pa_sink_render(u->sink,u->R*fs,buffer);
+        buffer->length=PA_MIN(input_remaining*fs,buffer->length);
+
+        //debug block
+        //pa_memblockq_push(u->rendered_q,buffer);
+        //pa_memblock_unref(buffer->memblock);
+        //goto END;
+
+        pa_log("asked for %ld input samples, got %ld samples",input_remaining,buffer->length/fs);
+        //copy new input
+        gettime(start);
+        input_buffer(u,buffer);
+        gettime(end);
+        pa_log("Took %0.5f seconds to setup",tdiff(end,start)*1e-9);
+
+        pa_memblock_unref(buffer->memblock);
+
+        pa_assert_se(u->fft_size>=u->window_size);
+        pa_assert_se(u->R<u->window_size);
+        //process every complete block on hand
+
+        gettime(start);
+        process_samples(u);
+        gettime(end);
+        pa_log("Took %0.5f seconds to process",tdiff(end,start)*1e-9);
+
+        buffered_samples=pa_memblockq_get_length(u->rendered_q)/fs;
+    }while(buffered_samples<u->R);
+
+    //deque from rendered_q and output
+    pa_assert_se(pa_memblockq_peek(u->rendered_q,&tchunk)==0);
+    *chunk=tchunk;
+    pa_memblockq_drop(u->rendered_q, chunk->length);
+    //if(tchunk.length>=nbytes){
+        //chunk->length=PA_MIN(tchunk.length,nbytes);
+    //}else{
+    //    size_t copied=0;
+    //    chunk->index=0;
+    //    chunk->length=PA_MIN(nbytes,pa_memblockq_get_length(u->rendered_q));
+    //    chunk->memblock=pa_memblock_new(u->core->mempool,chunk->length);
+    //    uint8_t *dst=(uint8_t*)pa_memblock_acquire(chunk->memblock);
+    //    for(;;){
+    //        size_t l=PA_MIN(tchunk.length,nbytes-copied);
+    //        pa_assert_se(l>0);
+    //        uint8_t *src=(((uint8_t*)pa_memblock_acquire(tchunk.memblock))+tchunk.index);
+    //        memmove(dst+copied,src,l);
+    //        copied+=l;
+    //        pa_memblock_release(tchunk.memblock);
+    //        pa_memblock_unref(tchunk.memblock);
+    //        pa_memblockq_drop(u->rendered_q,l);
+    //        if(copied<chunk->length){
+    //            pa_assert_se(pa_memblockq_peek(u->rendered_q,&tchunk)==0);
+    //        }else{
+    //            break;
+    //        }
+    //    }
+    //    pa_memblock_release(chunk->memblock);
+    //}
     pa_assert_se(chunk->memblock);
-    pa_log("output requested %ld, gave %ld",nbytes/fs,chunk->length/fs);
+    pa_log("gave %ld",chunk->length/fs);
     //pa_log("end pop");
     return 0;
 }
@@ -411,6 +457,7 @@ static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
     struct userdata *u;
     size_t amount = 0;
 
+    pa_log_debug("Rewind callback!");
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
 
@@ -425,6 +472,7 @@ static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
         u->sink->thread_info.rewind_nbytes = 0;
 
         if (amount > 0) {
+            //pa_sample_spec *ss=&u->sink->sample_spec;
             pa_memblockq_seek(u->rendered_q, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
             pa_log_debug("Resetting equalizer");
             u->samples_gathered=0;
@@ -459,7 +507,8 @@ static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) {
     if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
         return;
 
-    pa_sink_set_max_request_within_thread(u->sink, nbytes);
+    size_t fs=pa_frame_size(&(u->sink->sample_spec));
+    pa_sink_set_max_request_within_thread(u->sink, u->R*fs);
 }
 
 /* Called from I/O thread context */
@@ -472,7 +521,9 @@ static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) {
     if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
         return;
 
-    pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
+    size_t fs=pa_frame_size(&(u->sink->sample_spec));
+    pa_sink_set_latency_range_within_thread(u->sink,u->R*fs ,u->R*fs );
+    //pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
 }
 
 /* Called from I/O thread context */
@@ -504,7 +555,9 @@ static void sink_input_attach_cb(pa_sink_input *i) {
     pa_sink_set_rtpoll(u->sink, i->sink->rtpoll);
     pa_sink_attach_within_thread(u->sink);
 
-    pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->master->thread_info.max_latency);
+    size_t fs=pa_frame_size(&(u->sink->sample_spec));
+    pa_sink_set_latency_range_within_thread(u->sink, u->R*fs, u->R*fs);
+    //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->master->thread_info.max_latency);
 }
 
 /* Called from main context */
@@ -598,7 +651,7 @@ int pa__init(pa_module*m) {
     u->window_size=7999;
     u->R=(u->window_size+1)/2;
     u->overlap_size=u->window_size-u->R;
-    u->target_samples=5*u->R;
+    u->target_samples=1*u->R;
     u->samples_gathered=0;
     u->max_output=pa_frame_align(pa_mempool_block_size_max(m->core->mempool), &ss)/pa_frame_size(&ss);
     u->rendered_q = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH,u->target_samples*fs, fs, fs, 0, 0, NULL);
@@ -716,6 +769,8 @@ int pa__init(pa_module*m) {
 
     pa_sink_set_asyncmsgq(u->sink, master->asyncmsgq);
     pa_sink_set_rtpoll(u->sink, master->rtpoll);
+    pa_sink_set_max_request(u->sink,u->R*fs);
+    //pa_sink_set_fixed_latency(u->sink,pa_bytes_to_usec(u->R*fs,&ss));
 
     /* Create sink input */
     pa_sink_input_new_data_init(&sink_input_data);

commit 702480a8836eefb95cb41d7d4a05d4065d6560dc
Author: Jason Newton <nevion at gmail.com>
Date:   Thu Jul 23 03:26:35 2009 -0700

    module-equalizer-sink:
        first commit of a working state (cpu speed dependant)
        added noop processing for filter debugability

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 970b20d..4d595e1 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -82,6 +82,7 @@ struct userdata {
               * the latency of the filter, calculated from window_size
               * based on constraints of COLA and window function
               */
+    size_t latency;
     size_t overlap_size;//window_size-R
     size_t samples_gathered;
     size_t max_output;
@@ -210,9 +211,9 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
             if (PA_MSGOBJECT(u->master)->process_msg(PA_MSGOBJECT(u->master), PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL) < 0)
                 usec = 0;
 
-            usec+=pa_bytes_to_usec(u->R*fs,ss);
+            usec+=pa_bytes_to_usec(u->latency*fs,ss);
             //usec+=pa_bytes_to_usec(u->samples_gathered*fs,ss);
-            usec += pa_bytes_to_usec(pa_memblockq_get_length(u->rendered_q), ss);
+            //usec += pa_bytes_to_usec(pa_memblockq_get_length(u->rendered_q), ss);
             /* Add the latency internal to our sink input on top */
             usec += pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->master->sample_spec);
             *((pa_usec_t*) data) = usec;
@@ -316,11 +317,11 @@ static void dsp_logic(float *dst,struct userdata *u){
             u->overlap_accum[c][j]=u->work_buffer[u->overlap_size+j];
         }
 
-        //debug: tests if basic buffering works
-        //shouldn't modify the signal AT ALL (beyond roundoff)
-        for(size_t j=0;j<u->window_size;++j){
-            u->work_buffer[j]=u->input[c][j];
-        }
+        ////debug: tests if basic buffering works
+        ////shouldn't modify the signal AT ALL (beyond roundoff)
+        //for(size_t j=0;j<u->window_size;++j){
+        //    u->work_buffer[j]=u->input[c][j];
+        //}
 
         //preseve the needed input for the next window's overlap
         memmove(u->input[c],u->input[c]+u->R,
@@ -363,7 +364,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     if (!u->sink || !PA_SINK_IS_OPENED(u->sink->thread_info.state))
         return -1;
 
-    pa_log("start output-buffered %ld, input-buffered %ld, requested %ld",buffered_samples,u->samples_gathered,samples_requested);
+    //pa_log("start output-buffered %ld, input-buffered %ld, requested %ld",buffered_samples,u->samples_gathered,samples_requested);
     struct timespec start,end;
 
     if(pa_memblockq_peek(u->rendered_q,&tchunk)==0){
@@ -377,31 +378,31 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         pa_assert(input_remaining>0);
         //collect samples
 
-        //buffer=&u->conv_buffer;
-        //buffer->length=input_remaining*fs;
-        //buffer->index=0;
-        //pa_memblock_ref(buffer);
-        //pa_sink_render_into(u->sink,buffer);
+        buffer=&u->conv_buffer;
+        buffer->length=input_remaining*fs;
+        buffer->index=0;
+        pa_memblock_ref(buffer->memblock);
+        pa_sink_render_into(u->sink,buffer);
 
-        if(u->sink->thread_info.rewind_requested)
-            sink_request_rewind(u->sink);
+        //if(u->sink->thread_info.rewind_requested)
+        //    sink_request_rewind(u->sink);
 
-        pa_memchunk p;
-        buffer=&p;
-        pa_sink_render(u->sink,u->R*fs,buffer);
-        buffer->length=PA_MIN(input_remaining*fs,buffer->length);
+        //pa_memchunk p;
+        //buffer=&p;
+        //pa_sink_render(u->sink,u->R*fs,buffer);
+        //buffer->length=PA_MIN(input_remaining*fs,buffer->length);
 
         //debug block
         //pa_memblockq_push(u->rendered_q,buffer);
         //pa_memblock_unref(buffer->memblock);
         //goto END;
 
-        pa_log("asked for %ld input samples, got %ld samples",input_remaining,buffer->length/fs);
+        //pa_log("asked for %ld input samples, got %ld samples",input_remaining,buffer->length/fs);
         //copy new input
         gettime(start);
         input_buffer(u,buffer);
         gettime(end);
-        pa_log("Took %0.5f seconds to setup",tdiff(end,start)*1e-9);
+        //pa_log("Took %0.5f seconds to setup",tdiff(end,start)*1e-9);
 
         pa_memblock_unref(buffer->memblock);
 
@@ -412,7 +413,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         gettime(start);
         process_samples(u);
         gettime(end);
-        pa_log("Took %0.5f seconds to process",tdiff(end,start)*1e-9);
+        //pa_log("Took %0.5f seconds to process",tdiff(end,start)*1e-9);
 
         buffered_samples=pa_memblockq_get_length(u->rendered_q)/fs;
     }while(buffered_samples<u->R);
@@ -447,7 +448,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     //    pa_memblock_release(chunk->memblock);
     //}
     pa_assert_se(chunk->memblock);
-    pa_log("gave %ld",chunk->length/fs);
+    //pa_log("gave %ld",chunk->length/fs);
     //pa_log("end pop");
     return 0;
 }
@@ -522,7 +523,7 @@ static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) {
         return;
 
     size_t fs=pa_frame_size(&(u->sink->sample_spec));
-    pa_sink_set_latency_range_within_thread(u->sink,u->R*fs ,u->R*fs );
+    pa_sink_set_latency_range_within_thread(u->sink,u->latency*fs ,u->latency*fs );
     //pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
 }
 
@@ -556,7 +557,7 @@ static void sink_input_attach_cb(pa_sink_input *i) {
     pa_sink_attach_within_thread(u->sink);
 
     size_t fs=pa_frame_size(&(u->sink->sample_spec));
-    pa_sink_set_latency_range_within_thread(u->sink, u->R*fs, u->R*fs);
+    pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->latency*fs);
     //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->master->thread_info.max_latency);
 }
 
@@ -656,6 +657,7 @@ int pa__init(pa_module*m) {
     u->max_output=pa_frame_align(pa_mempool_block_size_max(m->core->mempool), &ss)/pa_frame_size(&ss);
     u->rendered_q = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH,u->target_samples*fs, fs, fs, 0, 0, NULL);
     u->conv_buffer.memblock=pa_memblock_new(u->core->mempool,u->target_samples*fs);
+    u->latency=u->R;
 
 
     u->H=(float*) fftwf_malloc((u->fft_size/2+1)*sizeof(float));
@@ -676,8 +678,8 @@ int pa__init(pa_module*m) {
         pa_assert_se(u->output_buffer[c]);
     }
     u->output_window = (fftwf_complex *) fftwf_malloc(sizeof(fftwf_complex) * (u->fft_size/2+1));
-    u->forward_plan=fftwf_plan_dft_r2c_1d(u->fft_size, u->work_buffer, u->output_window, FFTW_ESTIMATE);
-    u->inverse_plan=fftwf_plan_dft_c2r_1d(u->fft_size, u->output_window, u->work_buffer, FFTW_ESTIMATE);
+    u->forward_plan=fftwf_plan_dft_r2c_1d(u->fft_size, u->work_buffer, u->output_window, FFTW_MEASURE);
+    u->inverse_plan=fftwf_plan_dft_c2r_1d(u->fft_size, u->output_window, u->work_buffer, FFTW_MEASURE);
     /*
     for(size_t j=0;j<u->window_size;++j){
         u->W[j]=.5;

commit c7fcc9cc01c807c30b6c96f9995ef2c596c74146
Author: Jason Newton <nevion at gmail.com>
Date:   Mon Jul 27 01:22:26 2009 -0700

    module-equalizer-sink:
        removed liboil
        added sse2 optimized dsp logic implementation
        cleaned up a bit

diff --git a/src/Makefile.am b/src/Makefile.am
index 10f9a79..281bdf1 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1383,9 +1383,9 @@ module_ladspa_sink_la_LDFLAGS = $(MODULE_LDFLAGS)
 module_ladspa_sink_la_LIBADD = $(AM_LIBADD) $(LIBLTDL) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
 
 module_equalizer_sink_la_SOURCES = modules/module-equalizer-sink.c
-module_equalizer_sink_la_CFLAGS = $(AM_CFLAGS) $(LIBOIL_CFLAGS)
+module_equalizer_sink_la_CFLAGS = $(AM_CFLAGS)
 module_equalizer_sink_la_LDFLAGS = $(MODULE_LDFLAGS)
-module_equalizer_sink_la_LIBADD = $(AM_LIBADD) $(LIBLTDL) $(LIBOIL_LIBS) -lfftw3f libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
+module_equalizer_sink_la_LIBADD = $(AM_LIBADD) $(LIBLTDL) -lfftw3f libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
 
 module_match_la_SOURCES = modules/module-match.c
 module_match_la_LDFLAGS = $(MODULE_LDFLAGS)
diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 4d595e1..e20e07f 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -29,11 +29,13 @@ USA.
 #include <config.h>
 #endif
 
+#include <stdlib.h>
 #include <stdio.h>
+#include <float.h>
 #include <math.h>
 #include <fftw3.h>
-#include <float.h>
-
+#include <string.h>
+#include <malloc.h>
 
 #include <pulse/xmalloc.h>
 #include <pulse/i18n.h>
@@ -55,6 +57,14 @@ USA.
 #include <time.h>
 
 
+//#undef __SSE2__
+#ifdef __SSE2__
+#include <xmmintrin.h>
+#include <emmintrin.h>
+#endif
+
+
+
 #include "module-equalizer-sink-symdef.h"
 
 PA_MODULE_AUTHOR("Jason Newton");
@@ -82,10 +92,12 @@ struct userdata {
               * the latency of the filter, calculated from window_size
               * based on constraints of COLA and window function
               */
-    size_t latency;
+    size_t latency;//Really just R but made into it's own variable
+    //for twiddling with pulseaudio
     size_t overlap_size;//window_size-R
     size_t samples_gathered;
-    size_t max_output;
+    size_t max_output;//max amount of samples outputable in a single
+    //message
     size_t target_samples;
     float *H;//frequency response filter (magnitude based)
     float *W;//windowing function (time domain)
@@ -109,76 +121,39 @@ static const char* const valid_modargs[] = {
     NULL
 };
 
-uint64_t time_diff(struct timespec *timeA_p, struct timespec *timeB_p);
-void hanning_normalized_window(float *W,size_t window_size);
-void hanning_window(float *W,size_t window_size);
-void hamming_window(float *W,size_t window_size);
-void blackman_window(float *W,size_t window_size);
-void sin_window(float *W,size_t window_size);
-void array_out(const char *name,float *a,size_t length);
-
-static void dsp_logic(float *dst,struct userdata *u);
+static uint64_t time_diff(struct timespec *timeA_p, struct timespec *timeB_p);
+static void hanning_window(float *W,size_t window_size);
+static void array_out(const char *name,float *a,size_t length);
 static void process_samples(struct userdata *u);
-void input_buffer(struct userdata *u,pa_memchunk *in);
-
+static void input_buffer(struct userdata *u,pa_memchunk *in);
+
+void dsp_logic(
+    float * __restrict__ dst,
+    float * __restrict__ src,
+    float * __restrict__ overlap,
+    const float * __restrict__ H,
+    const float * __restrict__ W,
+    fftwf_complex * __restrict__ output_window,
+    struct userdata *u);
+
+#define v_size 4
 #define gettime(x) clock_gettime(CLOCK_MONOTONIC,&x)
 #define tdiff(x,y) time_diff(&x,&y)
+#define mround(x,y) (x%y==0?x:(x/y+1)*y)
 
 uint64_t time_diff(struct timespec *timeA_p, struct timespec *timeB_p)
 {
-    return ((timeA_p->tv_sec * 1000000000) + timeA_p->tv_nsec) -
-    ((timeB_p->tv_sec * 1000000000) + timeB_p->tv_nsec);
+    return ((timeA_p->tv_sec * 1000000000ULL) + timeA_p->tv_nsec) -
+    ((timeB_p->tv_sec * 1000000000ULL) + timeB_p->tv_nsec);
 }
 
-void hanning_normalized_window(float *W,size_t window_size){
-    //h = sqrt(2)/2 * (1+cos(t*pi)) ./ sqrt( 1+cos(t*pi).^2 )
-    float c;
-    for(size_t i=0;i<window_size;++i){
-        c=cos(M_PI*i/(window_size-1));
-        W[i]=sqrt(2.0)/2.0*(1.0+c) / sqrt(1.0+c*c);
-    }
-}
 void hanning_window(float *W,size_t window_size){
     //h=.5*(1-cos(2*pi*j/(window_size+1)), COLA for R=(M+1)/2
     for(size_t i=0;i<window_size;++i){
-        W[i]=.5*(1-cos(2*M_PI*i/(window_size+1)));
-    }
-}
-void hamming_window(float *W,size_t window_size){
-    //h=.54-.46*cos(2*pi*j/(window_size-1))
-    //COLA for R=(M-1)/2,(M-1)/4 etc when endpoints are divided by 2
-    //or one endpoint is zeroed
-    float m;
-    for(size_t i=0;i<window_size;++i){
-        m=i;
-        m/=(window_size-1);
-        W[i]=.54-.46*cos(2*M_PI*m);
-    }
-    W[window_size-1]=0;
-    //W[0]/=2;
-    //W[window_size-1]/=2;
-}
-void blackman_window(float *W,size_t window_size){
-    //h=.42-.5*cos(2*pi*m)+.08*cos(4*pi*m), m=(0:W-1)/(W-1)
-    //COLA for R=(M-1)/3 when M is odd and R is an integer
-    //R=M/3 when M is even and R is an integer
-    float m;
-    for(size_t i=0;i<window_size;++i){
-        m=i;
-        m/=(window_size-1);
-        W[i]=.42-.5*cos(2*M_PI*m)+.08*cos(4*M_PI*m);
-    }
-}
-
-
-void sin_window(float *W,size_t window_size){
-    //h = (cos(t*pi)+1)/2 .* float(abs(t)<1);
-    for(size_t i=0;i<window_size;++i){
-        W[i]=sin(M_PI*i/(window_size-1));
+        W[i]=(float).5*(1-cos(2*M_PI*i/(window_size+1)));
     }
 }
 
-
 void array_out(const char *name,float *a,size_t length){
     FILE *p=fopen(name,"w");
     if(!p){
@@ -211,9 +186,9 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
             if (PA_MSGOBJECT(u->master)->process_msg(PA_MSGOBJECT(u->master), PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL) < 0)
                 usec = 0;
 
-            usec+=pa_bytes_to_usec(u->latency*fs,ss);
+            //usec+=pa_bytes_to_usec(u->latency*fs,ss);
             //usec+=pa_bytes_to_usec(u->samples_gathered*fs,ss);
-            //usec += pa_bytes_to_usec(pa_memblockq_get_length(u->rendered_q), ss);
+            usec += pa_bytes_to_usec(pa_memblockq_get_length(u->rendered_q), ss);
             /* Add the latency internal to our sink input on top */
             usec += pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->master->sample_spec);
             *((pa_usec_t*) data) = usec;
@@ -276,7 +251,18 @@ static void process_samples(struct userdata *u){
         tchunk.length=u->R*fs;
         tchunk.memblock=pa_memblock_new(u->core->mempool,tchunk.length);
         dst=((float*)pa_memblock_acquire(tchunk.memblock));
-        dsp_logic(dst,u);
+        for (size_t c=0;c<u->channels;c++) {
+            dsp_logic(
+                u->work_buffer,
+                u->input[c],
+                u->overlap_accum[c],
+                u->H,
+                u->W,
+                u->output_window,
+                u
+            );
+            pa_sample_clamp(PA_SAMPLE_FLOAT32NE,dst+c,fs,u->work_buffer,sizeof(float),u->R);
+        }
         pa_memblock_release(tchunk.memblock);
         pa_memblockq_push(u->rendered_q, &tchunk);
         pa_memblock_unref(tchunk.memblock);
@@ -284,54 +270,166 @@ static void process_samples(struct userdata *u){
     }
 }
 
-static void dsp_logic(float *dst,struct userdata *u){
-    size_t fs=pa_frame_size(&(u->sink->sample_spec));
-    //use a linear-phase sliding STFT and overlap-add method (for each channel)
-    for (size_t c=0;c<u->channels;c++) {
-        //zero padd the data
-        memset(u->work_buffer+u->window_size,0,(u->fft_size-u->window_size)*sizeof(float));
-        //window the data
-        for(size_t j=0;j<u->window_size;++j){
-            u->work_buffer[j]=u->W[j]*u->input[c][j];
-        }
-        //Processing is done here!
-        //do fft
-        fftwf_execute_dft_r2c(u->forward_plan,u->work_buffer,u->output_window);
-        //perform filtering
-        for(size_t j=0;j<u->fft_size/2+1;++j){
-            u->output_window[j][0]*=u->H[j];
-            u->output_window[j][1]*=u->H[j];
-        }
-        //inverse fft
-        fftwf_execute_dft_c2r(u->inverse_plan,u->output_window,u->work_buffer);
-        ////debug: tests overlaping add
-        ////and negates ALL PREVIOUS processing
-        ////yields a perfect reconstruction if COLA is held
-        //for(size_t j=0;j<u->window_size;++j){
-        //    u->work_buffer[j]=u->W[j]*u->input[c][j];
-        //}
+typedef float v4sf __attribute__ ((__aligned__(v_size*sizeof(float))));
+typedef union float_vector {
+    float f[v_size];
+    v4sf v;
+#ifdef __SSE2__
+    __m128 m;
+#endif
+} float_vector_t;
+
+////reference implementation
+//void dsp_logic(
+//    float * __restrict__ dst,//used as a temp array too, needs to be fft_length!
+//    float * __restrict__ src,/*input data w/ overlap at start,
+//                               *automatically cycled in routine
+//                               */
+//    float * __restrict__ overlap,//The size of the overlap
+//    const float * __restrict__ H,//The freq. magnitude scalers filter
+//    const float * __restrict__ W,//The windowing function
+//    fftwf_complex * __restrict__ output_window,//The transformed window'd src
+//    struct userdata *u){
+//    //use a linear-phase sliding STFT and overlap-add method (for each channel)
+//    //zero padd the data
+//    memset(dst+u->window_size,0,(u->fft_size-u->window_size)*sizeof(float));
+//    //window the data
+//    for(size_t j=0;j<u->window_size;++j){
+//        dst[j]=W[j]*src[j];
+//    }
+//    //Processing is done here!
+//    //do fft
+//    fftwf_execute_dft_r2c(u->forward_plan,dst,output_window);
+//    //perform filtering
+//    for(size_t j=0;j<u->fft_size/2+1;++j){
+//        u->output_window[j][0]*=u->H[j];
+//        u->output_window[j][1]*=u->H[j];
+//    }
+//    //inverse fft
+//    fftwf_execute_dft_c2r(u->inverse_plan,output_window,dst);
+//    ////debug: tests overlaping add
+//    ////and negates ALL PREVIOUS processing
+//    ////yields a perfect reconstruction if COLA is held
+//    //for(size_t j=0;j<u->window_size;++j){
+//    //    u->work_buffer[j]=u->W[j]*u->input[c][j];
+//    //}
+//
+//    //overlap add and preserve overlap component from this window (linear phase)
+//    for(size_t j=0;j<u->overlap_size;++j){
+//        u->work_buffer[j]+=overlap[j];
+//        overlap[j]=dst[u->R+j];
+//    }
+//    ////debug: tests if basic buffering works
+//    ////shouldn't modify the signal AT ALL (beyond roundoff)
+//    //for(size_t j=0;j<u->window_size;++j){
+//    //    u->work_buffer[j]=u->input[c][j];
+//    //}
+//
+//    //preseve the needed input for the next window's overlap
+//    memmove(src,src+u->R,
+//        (u->samples_gathered+u->overlap_size-u->R)*sizeof(float)
+//    );
+//}
+
+//regardless of sse enabled, the loops in here assume
+//16 byte aligned addresses and memory allocations divisible by v_size
+void dsp_logic(
+    float * __restrict__ dst,//used as a temp array too, needs to be fft_length!
+    float * __restrict__ src,/*input data w/ overlap at start,
+                               *automatically cycled in routine
+                               */
+    float * __restrict__ overlap,//The size of the overlap
+    const float * __restrict__ H,//The freq. magnitude scalers filter
+    const float * __restrict__ W,//The windowing function
+    fftwf_complex * __restrict__ output_window,//The transformed window'd src
+    struct userdata *u){//Collection of constants
+
+    const size_t window_size=mround(u->window_size,v_size);
+    const size_t fft_h=mround(u->fft_size/2+1,v_size/2);
+    const size_t R=mround(u->R,v_size);
+    const size_t overlap_size=mround(u->overlap_size,v_size);
+
+    //assert(u->samples_gathered>=u->R);
+    //zero out the bit beyond the real overlap so we don't add garbage
+    for(size_t j=overlap_size;j>u->overlap_size;--j){
+       overlap[j-1]=0;
+    }
+    //use a linear-phase sliding STFT and overlap-add method
+    //zero padd the data
+    memset(dst+u->window_size,0,(u->fft_size-u->window_size)*sizeof(float));
+    //window the data
+    for(size_t j=0;j<window_size;j+=v_size){
+        //dst[j]=W[j]*src[j];
+        float_vector_t *d=(float_vector_t*)(dst+j);
+        float_vector_t *w=(float_vector_t*)(W+j);
+        float_vector_t *s=(float_vector_t*)(src+j);
+#if __SSE2__
+        d->m=_mm_mul_ps(w->m,s->m);
+#else
+        d->v=w->v*s->v;
+#endif
+    }
+    //Processing is done here!
+    //do fft
+    fftwf_execute_dft_r2c(u->forward_plan,dst,output_window);
+
+
+    //perform filtering - purely magnitude based
+    for(size_t j=0;j<fft_h;j+=v_size/2){
+        //output_window[j][0]*=H[j];
+        //output_window[j][1]*=H[j];
+        float_vector_t *d=(float_vector_t*)(output_window+j);
+        float_vector_t h;
+        h.f[0]=h.f[1]=H[j];
+        h.f[2]=h.f[3]=H[j+1];
+#if __SSE2__
+        d->m=_mm_mul_ps(d->m,h.m);
+#else
+        d->v=d->v*h->v;
+#endif
+    }
 
-        //overlap add and preserve overlap component from this window (linear phase)
-        for(size_t j=0;j<u->R;++j){
-            u->work_buffer[j]+=u->overlap_accum[c][j];
-            u->overlap_accum[c][j]=u->work_buffer[u->overlap_size+j];
-        }
 
-        ////debug: tests if basic buffering works
-        ////shouldn't modify the signal AT ALL (beyond roundoff)
-        //for(size_t j=0;j<u->window_size;++j){
-        //    u->work_buffer[j]=u->input[c][j];
-        //}
+    //inverse fft
+    fftwf_execute_dft_c2r(u->inverse_plan,output_window,dst);
 
-        //preseve the needed input for the next window's overlap
-        memmove(u->input[c],u->input[c]+u->R,
-            (u->samples_gathered+u->overlap_size-u->R)*sizeof(float)
-        );
-        //output the samples that are outputable now
-        pa_sample_clamp(PA_SAMPLE_FLOAT32NE,dst+c,fs,u->work_buffer,sizeof(float),u->R);
+    ////debug: tests overlaping add
+    ////and negates ALL PREVIOUS processing
+    ////yields a perfect reconstruction if COLA is held
+    //for(size_t j=0;j<u->window_size;++j){
+    //    dst[j]=W[j]*src[j];
+    //}
+
+    //overlap add and preserve overlap component from this window (linear phase)
+    for(size_t j=0;j<overlap_size;j+=v_size){
+        //dst[j]+=overlap[j];
+        //overlap[j]+=dst[j+R];
+        float_vector_t *d=(float_vector_t*)(dst+j);
+        float_vector_t *o=(float_vector_t*)(overlap+j);
+#if __SSE2__
+        d->m=_mm_add_ps(d->m,o->m);
+        o->m=((float_vector_t*)(dst+u->R+j))->m;
+#else
+        d->v=d->v+o->v;
+        o->v=((float_vector_t*)(dst+u->R+j))->v;
+#endif
     }
+    //memcpy(overlap,dst+u->R,u->overlap_size*sizeof(float));
+
+    //////debug: tests if basic buffering works
+    //////shouldn't modify the signal AT ALL (beyond roundoff)
+    //for(size_t j=0;j<u->window_size;++j){
+    //    dst[j]=src[j];
+    //}
+
+    //preseve the needed input for the next window's overlap
+    memmove(src,src+u->R,
+        (u->overlap_size+u->samples_gathered-u->R)*sizeof(float)
+    );
 }
 
+
+
 void input_buffer(struct userdata *u,pa_memchunk *in){
     size_t fs=pa_frame_size(&(u->sink->sample_spec));
     size_t samples=in->length/fs;
@@ -422,31 +520,6 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     pa_assert_se(pa_memblockq_peek(u->rendered_q,&tchunk)==0);
     *chunk=tchunk;
     pa_memblockq_drop(u->rendered_q, chunk->length);
-    //if(tchunk.length>=nbytes){
-        //chunk->length=PA_MIN(tchunk.length,nbytes);
-    //}else{
-    //    size_t copied=0;
-    //    chunk->index=0;
-    //    chunk->length=PA_MIN(nbytes,pa_memblockq_get_length(u->rendered_q));
-    //    chunk->memblock=pa_memblock_new(u->core->mempool,chunk->length);
-    //    uint8_t *dst=(uint8_t*)pa_memblock_acquire(chunk->memblock);
-    //    for(;;){
-    //        size_t l=PA_MIN(tchunk.length,nbytes-copied);
-    //        pa_assert_se(l>0);
-    //        uint8_t *src=(((uint8_t*)pa_memblock_acquire(tchunk.memblock))+tchunk.index);
-    //        memmove(dst+copied,src,l);
-    //        copied+=l;
-    //        pa_memblock_release(tchunk.memblock);
-    //        pa_memblock_unref(tchunk.memblock);
-    //        pa_memblockq_drop(u->rendered_q,l);
-    //        if(copied<chunk->length){
-    //            pa_assert_se(pa_memblockq_peek(u->rendered_q,&tchunk)==0);
-    //        }else{
-    //            break;
-    //        }
-    //    }
-    //    pa_memblock_release(chunk->memblock);
-    //}
     pa_assert_se(chunk->memblock);
     //pa_log("gave %ld",chunk->length/fs);
     //pa_log("end pop");
@@ -509,7 +582,8 @@ static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) {
         return;
 
     size_t fs=pa_frame_size(&(u->sink->sample_spec));
-    pa_sink_set_max_request_within_thread(u->sink, u->R*fs);
+    pa_sink_set_max_request_within_thread(u->sink, nbytes);
+    //pa_sink_set_max_request_within_thread(u->sink, u->R*fs);
 }
 
 /* Called from I/O thread context */
@@ -523,7 +597,8 @@ static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) {
         return;
 
     size_t fs=pa_frame_size(&(u->sink->sample_spec));
-    pa_sink_set_latency_range_within_thread(u->sink,u->latency*fs ,u->latency*fs );
+    pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->latency*fs);
+    //pa_sink_set_latency_range_within_thread(u->sink,u->latency*fs ,u->latency*fs );
     //pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
 }
 
@@ -557,7 +632,12 @@ static void sink_input_attach_cb(pa_sink_input *i) {
     pa_sink_attach_within_thread(u->sink);
 
     size_t fs=pa_frame_size(&(u->sink->sample_spec));
-    pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->latency*fs);
+    //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->latency*fs);
+    //pa_sink_set_latency_range_within_thread(u->sink,u->latency*fs, u->master->thread_info.max_latency);
+    //TODO: setting this guy minimizes drop outs but doesn't get rid
+    //of them completely, figure out why
+    pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->latency*fs);
+    //TODO: this guy causes dropouts constantly+rewinds, it's unusable
     //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->master->thread_info.max_latency);
 }
 
@@ -605,6 +685,16 @@ static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) {
     return u->sink != dest;
 }
 
+
+//ensure's memory allocated is a multiple of v_size
+//and aligned
+static void * alloc(size_t x,size_t s){
+    size_t f=mround(x*s,sizeof(float)*v_size);
+    //printf("requested %ld floats=%ld bytes, rem=%ld\n",x,x*sizeof(float),x*sizeof(float)%16);
+    //printf("giving %ld floats=%ld bytes, rem=%ld\n",f,f*sizeof(float),f*sizeof(float)%16);
+    return fftwf_malloc(f*s);
+}
+
 int pa__init(pa_module*m) {
     struct userdata *u;
     pa_sample_spec ss;
@@ -649,7 +739,7 @@ int pa__init(pa_module*m) {
     u->channels=ss.channels;
     u->fft_size=pow(2,ceil(log(ss.rate)/log(2)));
     pa_log("fft size: %ld",u->fft_size);
-    u->window_size=7999;
+    u->window_size=15999;
     u->R=(u->window_size+1)/2;
     u->overlap_size=u->window_size-u->R;
     u->target_samples=1*u->R;
@@ -659,32 +749,28 @@ int pa__init(pa_module*m) {
     u->conv_buffer.memblock=pa_memblock_new(u->core->mempool,u->target_samples*fs);
     u->latency=u->R;
 
-
-    u->H=(float*) fftwf_malloc((u->fft_size/2+1)*sizeof(float));
-    u->W=(float*) fftwf_malloc((u->window_size)*sizeof(float));
-    u->work_buffer=(float*) fftwf_malloc(u->fft_size*sizeof(float));
+    u->H=alloc((u->fft_size/2+1),sizeof(fftwf_complex));
+    u->W=alloc(u->window_size,sizeof(float));
+    u->work_buffer=alloc(u->fft_size,sizeof(float));
+    memset(u->work_buffer,0,u->fft_size*sizeof(float));
     u->input=(float **)malloc(sizeof(float *)*u->channels);
     u->overlap_accum=(float **)malloc(sizeof(float *)*u->channels);
     u->output_buffer=(float **)malloc(sizeof(float *)*u->channels);
     for(size_t c=0;c<u->channels;++c){
-        u->input[c]=(float*) fftwf_malloc((u->target_samples+u->overlap_size)*sizeof(float));
+        u->input[c]=alloc(u->target_samples+u->overlap_size,sizeof(float));
         pa_assert_se(u->input[c]);
         memset(u->input[c],0,(u->target_samples+u->overlap_size)*sizeof(float));
         pa_assert_se(u->input[c]);
-        u->overlap_accum[c]=(float*) fftwf_malloc(u->R*sizeof(float));
+        u->overlap_accum[c]=alloc(u->overlap_size,sizeof(float));
         pa_assert_se(u->overlap_accum[c]);
-        memset(u->overlap_accum[c],0,u->R*sizeof(float));
-        u->output_buffer[c]=(float*) fftwf_malloc(u->window_size*sizeof(float));
+        memset(u->overlap_accum[c],0,u->overlap_size*sizeof(float));
+        u->output_buffer[c]=alloc(u->window_size,sizeof(float));
         pa_assert_se(u->output_buffer[c]);
     }
-    u->output_window = (fftwf_complex *) fftwf_malloc(sizeof(fftwf_complex) * (u->fft_size/2+1));
+    u->output_window=alloc((u->fft_size/2+1),sizeof(fftwf_complex));
     u->forward_plan=fftwf_plan_dft_r2c_1d(u->fft_size, u->work_buffer, u->output_window, FFTW_MEASURE);
     u->inverse_plan=fftwf_plan_dft_c2r_1d(u->fft_size, u->output_window, u->work_buffer, FFTW_MEASURE);
-    /*
-    for(size_t j=0;j<u->window_size;++j){
-        u->W[j]=.5;
-    }
-    */
+
     hanning_window(u->W,u->window_size);
 
     const int freqs[]={0,25,50,100,200,300,400,800,1500,
@@ -735,6 +821,7 @@ int pa__init(pa_module*m) {
     }
     free(freq_translated);
 
+
     /* Create sink */
     pa_sink_new_data_init(&sink_data);
     sink_data.driver = __FILE__;
@@ -857,18 +944,18 @@ void pa__done(pa_module*m) {
 
     fftwf_destroy_plan(u->inverse_plan);
     fftwf_destroy_plan(u->forward_plan);
-    fftwf_free(u->output_window);
+    free(u->output_window);
     for(size_t c=0;c<u->channels;++c){
-        fftwf_free(u->output_buffer[c]);
-        fftwf_free(u->overlap_accum[c]);
-        fftwf_free(u->input[c]);
+        free(u->output_buffer[c]);
+        free(u->overlap_accum[c]);
+        free(u->input[c]);
     }
     free(u->output_buffer);
     free(u->overlap_accum);
     free(u->input);
-    fftwf_free(u->work_buffer);
-    fftwf_free(u->W);
-    fftwf_free(u->H);
+    free(u->work_buffer);
+    free(u->W);
+    free(u->H);
 
     pa_xfree(u);
 }

commit 8934c314f6401b953b871bbf5b6810b5fe05a9ac
Author: Jason Newton <nevion at gmail.com>
Date:   Fri Jul 31 18:10:11 2009 -0700

    module-equalizer-sink:
        added dbus support
        removed cruft from inherited from ladspa module and improved clarity
        switched dsp processing to reference implementation until project is more mature
        tsched=0 seems to help with the micro-dropouts/crackling! oh my!
        reformatting/spaces

diff --git a/configure.ac b/configure.ac
index 78234fc..ebfdc2b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1199,6 +1199,7 @@ if test "x${dbus}" != xno || test "x${bluez}" != xno || test "x${hal}" != xno ;
             HAVE_DBUS=1
             saved_LIBS="$LIBS"
             LIBS="$LIBS $DBUS_LIBS"
+            CFLAGS="$CFLAGS $DBUS_CFLAGS"
             AC_CHECK_FUNCS(dbus_watch_get_unix_fd)
             LIBS="$saved_LIBS"
             AC_DEFINE([HAVE_DBUS], 1, [Have D-Bus.])
diff --git a/src/Makefile.am b/src/Makefile.am
index 281bdf1..82bc2f9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1385,7 +1385,7 @@ module_ladspa_sink_la_LIBADD = $(AM_LIBADD) $(LIBLTDL) libpulsecore- at PA_MAJORMIN
 module_equalizer_sink_la_SOURCES = modules/module-equalizer-sink.c
 module_equalizer_sink_la_CFLAGS = $(AM_CFLAGS)
 module_equalizer_sink_la_LDFLAGS = $(MODULE_LDFLAGS)
-module_equalizer_sink_la_LIBADD = $(AM_LIBADD) $(LIBLTDL) -lfftw3f libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
+module_equalizer_sink_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) -lfftw3f libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
 
 module_match_la_SOURCES = modules/module-match.c
 module_match_la_LDFLAGS = $(MODULE_LDFLAGS)
diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index e20e07f..d8eb5f3 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -35,7 +35,6 @@ USA.
 #include <math.h>
 #include <fftw3.h>
 #include <string.h>
-#include <malloc.h>
 
 #include <pulse/xmalloc.h>
 #include <pulse/i18n.h>
@@ -52,6 +51,8 @@ USA.
 #include <pulsecore/rtpoll.h>
 #include <pulsecore/sample-util.h>
 #include <pulsecore/ltdl-helper.h>
+#include <pulsecore/protocol-dbus.h>
+#include <pulsecore/dbus-util.h>
 
 #include <stdint.h>
 #include <time.h>
@@ -101,13 +102,18 @@ struct userdata {
     size_t target_samples;
     float *H;//frequency response filter (magnitude based)
     float *W;//windowing function (time domain)
-    float *work_buffer,**input,**overlap_accum,**output_buffer;
+    float *work_buffer, **input, **overlap_accum;
     fftwf_complex *output_window;
-    fftwf_plan forward_plan,inverse_plan;
+    fftwf_plan forward_plan, inverse_plan;
     //size_t samplings;
 
+    float *Hs[2];//thread updatable copies
+    pa_aupdate *a_H;
     pa_memchunk conv_buffer;
     pa_memblockq *rendered_q;
+
+    pa_dbus_protocol *dbus_protocol;
+    char *dbus_path;
 };
 
 static const char* const valid_modargs[] = {
@@ -122,10 +128,10 @@ static const char* const valid_modargs[] = {
 };
 
 static uint64_t time_diff(struct timespec *timeA_p, struct timespec *timeB_p);
-static void hanning_window(float *W,size_t window_size);
-static void array_out(const char *name,float *a,size_t length);
+static void hanning_window(float *W, size_t window_size);
+static void array_out(const char *name, float *a, size_t length);
 static void process_samples(struct userdata *u);
-static void input_buffer(struct userdata *u,pa_memchunk *in);
+static void input_buffer(struct userdata *u, pa_memchunk *in);
 
 void dsp_logic(
     float * __restrict__ dst,
@@ -136,10 +142,17 @@ void dsp_logic(
     fftwf_complex * __restrict__ output_window,
     struct userdata *u);
 
+static void dbus_init(struct userdata *u);
+static void dbus_done(struct userdata *u);
+static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void get_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void set_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
+
 #define v_size 4
-#define gettime(x) clock_gettime(CLOCK_MONOTONIC,&x)
-#define tdiff(x,y) time_diff(&x,&y)
-#define mround(x,y) (x%y==0?x:(x/y+1)*y)
+#define gettime(x) clock_gettime(CLOCK_MONOTONIC, &x)
+#define tdiff(x, y) time_diff(&x, &y)
+#define mround(x, y) (x % y == 0 ? x : ( x / y + 1) * y)
 
 uint64_t time_diff(struct timespec *timeA_p, struct timespec *timeB_p)
 {
@@ -147,26 +160,33 @@ uint64_t time_diff(struct timespec *timeA_p, struct timespec *timeB_p)
     ((timeB_p->tv_sec * 1000000000ULL) + timeB_p->tv_nsec);
 }
 
-void hanning_window(float *W,size_t window_size){
+static void hanning_window(float *W, size_t window_size){
     //h=.5*(1-cos(2*pi*j/(window_size+1)), COLA for R=(M+1)/2
-    for(size_t i=0;i<window_size;++i){
-        W[i]=(float).5*(1-cos(2*M_PI*i/(window_size+1)));
+    for(size_t i=0; i < window_size;++i){
+        W[i] = (float).5*(1-cos(2*M_PI*i/(window_size+1)));
     }
 }
 
-void array_out(const char *name,float *a,size_t length){
-    FILE *p=fopen(name,"w");
+static void fix_filter(float *H, size_t fft_size){
+    //divide out the fft gain
+    for(size_t i = 0; i < (fft_size / 2 + 1); ++i){
+        H[i] /= fft_size;
+    }
+}
+
+void array_out(const char *name, float *a, size_t length){
+    FILE *p=fopen(name, "w");
     if(!p){
-        pa_log("opening %s failed!",name);
+        pa_log("opening %s failed!", name);
         return;
     }
-    for(size_t i=0;i<length;++i){
-        fprintf(p,"%e,",a[i]);
+    for(size_t i = 0; i < length; ++i){
+        fprintf(p, "%e,", a[i]);
         //if(i%1000==0){
-        //    fprintf(p,"\n");
+        //    fprintf(p, "\n");
         //}
     }
-    fprintf(p,"\n");
+    fprintf(p, "\n");
     fclose(p);
 }
 
@@ -180,14 +200,14 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
         case PA_SINK_MESSAGE_GET_LATENCY: {
             pa_usec_t usec = 0;
             pa_sample_spec *ss=&u->sink->sample_spec;
-            size_t fs=pa_frame_size(&(u->sink->sample_spec));
+            //size_t fs=pa_frame_size(&(u->sink->sample_spec));
 
             /* Get the latency of the master sink */
             if (PA_MSGOBJECT(u->master)->process_msg(PA_MSGOBJECT(u->master), PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL) < 0)
                 usec = 0;
 
-            //usec+=pa_bytes_to_usec(u->latency*fs,ss);
-            //usec+=pa_bytes_to_usec(u->samples_gathered*fs,ss);
+            //usec+=pa_bytes_to_usec(u->latency * fs, ss);
+            //usec+=pa_bytes_to_usec(u->samples_gathered * fs, ss);
             usec += pa_bytes_to_usec(pa_memblockq_get_length(u->rendered_q), ss);
             /* Add the latency internal to our sink input on top */
             usec += pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->master->sample_spec);
@@ -243,15 +263,15 @@ static void sink_update_requested_latency(pa_sink *s) {
 static void process_samples(struct userdata *u){
     pa_memchunk tchunk;
     size_t fs=pa_frame_size(&(u->sink->sample_spec));
-    while(u->samples_gathered>=u->R){
+    while(u->samples_gathered >= u->R){
         float *dst;
-        //pa_log("iter gathered: %ld",u->samples_gathered);
+        //pa_log("iter gathered: %ld", u->samples_gathered);
         //pa_memblockq_drop(u->rendered_q, tchunk.length);
         tchunk.index=0;
         tchunk.length=u->R*fs;
-        tchunk.memblock=pa_memblock_new(u->core->mempool,tchunk.length);
+        tchunk.memblock=pa_memblock_new(u->core->mempool, tchunk.length);
         dst=((float*)pa_memblock_acquire(tchunk.memblock));
-        for (size_t c=0;c<u->channels;c++) {
+        for(size_t c=0;c < u->channels; c++) {
             dsp_logic(
                 u->work_buffer,
                 u->input[c],
@@ -261,7 +281,7 @@ static void process_samples(struct userdata *u){
                 u->output_window,
                 u
             );
-            pa_sample_clamp(PA_SAMPLE_FLOAT32NE,dst+c,fs,u->work_buffer,sizeof(float),u->R);
+            pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst + c, fs, u->work_buffer, sizeof(float), u->R);
         }
         pa_memblock_release(tchunk.memblock);
         pa_memblockq_push(u->rendered_q, &tchunk);
@@ -279,60 +299,7 @@ typedef union float_vector {
 #endif
 } float_vector_t;
 
-////reference implementation
-//void dsp_logic(
-//    float * __restrict__ dst,//used as a temp array too, needs to be fft_length!
-//    float * __restrict__ src,/*input data w/ overlap at start,
-//                               *automatically cycled in routine
-//                               */
-//    float * __restrict__ overlap,//The size of the overlap
-//    const float * __restrict__ H,//The freq. magnitude scalers filter
-//    const float * __restrict__ W,//The windowing function
-//    fftwf_complex * __restrict__ output_window,//The transformed window'd src
-//    struct userdata *u){
-//    //use a linear-phase sliding STFT and overlap-add method (for each channel)
-//    //zero padd the data
-//    memset(dst+u->window_size,0,(u->fft_size-u->window_size)*sizeof(float));
-//    //window the data
-//    for(size_t j=0;j<u->window_size;++j){
-//        dst[j]=W[j]*src[j];
-//    }
-//    //Processing is done here!
-//    //do fft
-//    fftwf_execute_dft_r2c(u->forward_plan,dst,output_window);
-//    //perform filtering
-//    for(size_t j=0;j<u->fft_size/2+1;++j){
-//        u->output_window[j][0]*=u->H[j];
-//        u->output_window[j][1]*=u->H[j];
-//    }
-//    //inverse fft
-//    fftwf_execute_dft_c2r(u->inverse_plan,output_window,dst);
-//    ////debug: tests overlaping add
-//    ////and negates ALL PREVIOUS processing
-//    ////yields a perfect reconstruction if COLA is held
-//    //for(size_t j=0;j<u->window_size;++j){
-//    //    u->work_buffer[j]=u->W[j]*u->input[c][j];
-//    //}
-//
-//    //overlap add and preserve overlap component from this window (linear phase)
-//    for(size_t j=0;j<u->overlap_size;++j){
-//        u->work_buffer[j]+=overlap[j];
-//        overlap[j]=dst[u->R+j];
-//    }
-//    ////debug: tests if basic buffering works
-//    ////shouldn't modify the signal AT ALL (beyond roundoff)
-//    //for(size_t j=0;j<u->window_size;++j){
-//    //    u->work_buffer[j]=u->input[c][j];
-//    //}
-//
-//    //preseve the needed input for the next window's overlap
-//    memmove(src,src+u->R,
-//        (u->samples_gathered+u->overlap_size-u->R)*sizeof(float)
-//    );
-//}
-
-//regardless of sse enabled, the loops in here assume
-//16 byte aligned addresses and memory allocations divisible by v_size
+//reference implementation
 void dsp_logic(
     float * __restrict__ dst,//used as a temp array too, needs to be fft_length!
     float * __restrict__ src,/*input data w/ overlap at start,
@@ -342,106 +309,159 @@ void dsp_logic(
     const float * __restrict__ H,//The freq. magnitude scalers filter
     const float * __restrict__ W,//The windowing function
     fftwf_complex * __restrict__ output_window,//The transformed window'd src
-    struct userdata *u){//Collection of constants
-
-    const size_t window_size=mround(u->window_size,v_size);
-    const size_t fft_h=mround(u->fft_size/2+1,v_size/2);
-    const size_t R=mround(u->R,v_size);
-    const size_t overlap_size=mround(u->overlap_size,v_size);
-
-    //assert(u->samples_gathered>=u->R);
-    //zero out the bit beyond the real overlap so we don't add garbage
-    for(size_t j=overlap_size;j>u->overlap_size;--j){
-       overlap[j-1]=0;
-    }
-    //use a linear-phase sliding STFT and overlap-add method
+    struct userdata *u){
+    //use a linear-phase sliding STFT and overlap-add method (for each channel)
     //zero padd the data
-    memset(dst+u->window_size,0,(u->fft_size-u->window_size)*sizeof(float));
+    memset(dst + u->window_size, 0, (u->fft_size - u->window_size) * sizeof(float));
     //window the data
-    for(size_t j=0;j<window_size;j+=v_size){
-        //dst[j]=W[j]*src[j];
-        float_vector_t *d=(float_vector_t*)(dst+j);
-        float_vector_t *w=(float_vector_t*)(W+j);
-        float_vector_t *s=(float_vector_t*)(src+j);
-#if __SSE2__
-        d->m=_mm_mul_ps(w->m,s->m);
-#else
-        d->v=w->v*s->v;
-#endif
+    for(size_t j = 0;j < u->window_size; ++j){
+        dst[j] = W[j] * src[j];
     }
     //Processing is done here!
     //do fft
-    fftwf_execute_dft_r2c(u->forward_plan,dst,output_window);
-
-
-    //perform filtering - purely magnitude based
-    for(size_t j=0;j<fft_h;j+=v_size/2){
-        //output_window[j][0]*=H[j];
-        //output_window[j][1]*=H[j];
-        float_vector_t *d=(float_vector_t*)(output_window+j);
-        float_vector_t h;
-        h.f[0]=h.f[1]=H[j];
-        h.f[2]=h.f[3]=H[j+1];
-#if __SSE2__
-        d->m=_mm_mul_ps(d->m,h.m);
-#else
-        d->v=d->v*h->v;
-#endif
+    fftwf_execute_dft_r2c(u->forward_plan, dst, output_window);
+    //perform filtering
+    for(size_t j = 0;j < u->fft_size / 2 + 1; ++j){
+        u->output_window[j][0] *= u->H[j];
+        u->output_window[j][1] *= u->H[j];
     }
-
-
     //inverse fft
-    fftwf_execute_dft_c2r(u->inverse_plan,output_window,dst);
-
+    fftwf_execute_dft_c2r(u->inverse_plan, output_window, dst);
     ////debug: tests overlaping add
     ////and negates ALL PREVIOUS processing
     ////yields a perfect reconstruction if COLA is held
-    //for(size_t j=0;j<u->window_size;++j){
-    //    dst[j]=W[j]*src[j];
+    //for(size_t j = 0; j < u->window_size; ++j){
+    //    u->work_buffer[j] = u->W[j] * u->input[c][j];
     //}
 
     //overlap add and preserve overlap component from this window (linear phase)
-    for(size_t j=0;j<overlap_size;j+=v_size){
-        //dst[j]+=overlap[j];
-        //overlap[j]+=dst[j+R];
-        float_vector_t *d=(float_vector_t*)(dst+j);
-        float_vector_t *o=(float_vector_t*)(overlap+j);
-#if __SSE2__
-        d->m=_mm_add_ps(d->m,o->m);
-        o->m=((float_vector_t*)(dst+u->R+j))->m;
-#else
-        d->v=d->v+o->v;
-        o->v=((float_vector_t*)(dst+u->R+j))->v;
-#endif
+    for(size_t j = 0;j < u->overlap_size; ++j){
+        u->work_buffer[j] += overlap[j];
+        overlap[j] = dst[u->R+j];
     }
-    //memcpy(overlap,dst+u->R,u->overlap_size*sizeof(float));
-
-    //////debug: tests if basic buffering works
-    //////shouldn't modify the signal AT ALL (beyond roundoff)
-    //for(size_t j=0;j<u->window_size;++j){
-    //    dst[j]=src[j];
+    ////debug: tests if basic buffering works
+    ////shouldn't modify the signal AT ALL (beyond roundoff)
+    //for(size_t j = 0; j < u->window_size;++j){
+    //    u->work_buffer[j] = u->input[c][j];
     //}
 
     //preseve the needed input for the next window's overlap
-    memmove(src,src+u->R,
-        (u->overlap_size+u->samples_gathered-u->R)*sizeof(float)
+    memmove(src, src+u->R,
+        ((u->overlap_size + u->samples_gathered) - u->R)*sizeof(float)
     );
 }
 
+////regardless of sse enabled, the loops in here assume
+////16 byte aligned addresses and memory allocations divisible by v_size
+//void dsp_logic(
+//    float * __restrict__ dst,//used as a temp array too, needs to be fft_length!
+//    float * __restrict__ src,/*input data w/ overlap at start,
+//                               *automatically cycled in routine
+//                               */
+//    float * __restrict__ overlap,//The size of the overlap
+//    const float * __restrict__ H,//The freq. magnitude scalers filter
+//    const float * __restrict__ W,//The windowing function
+//    fftwf_complex * __restrict__ output_window,//The transformed window'd src
+//    struct userdata *u){//Collection of constants
+//
+//    const size_t window_size = mround(u->window_size,v_size);
+//    const size_t fft_h = mround(u->fft_size / 2 + 1, v_size / 2);
+//    //const size_t R = mround(u->R, v_size);
+//    const size_t overlap_size = mround(u->overlap_size, v_size);
+//
+//    //assert(u->samples_gathered >= u->R);
+//    //zero out the bit beyond the real overlap so we don't add garbage
+//    for(size_t j = overlap_size; j > u->overlap_size; --j){
+//       overlap[j-1] = 0;
+//    }
+//    //use a linear-phase sliding STFT and overlap-add method
+//    //zero padd the data
+//    memset(dst + u->window_size, 0, (u->fft_size - u->window_size)*sizeof(float));
+//    //window the data
+//    for(size_t j = 0; j < window_size; j += v_size){
+//        //dst[j] = W[j]*src[j];
+//        float_vector_t *d = (float_vector_t*) (dst+j);
+//        float_vector_t *w = (float_vector_t*) (W+j);
+//        float_vector_t *s = (float_vector_t*) (src+j);
+//#if __SSE2__
+//        d->m = _mm_mul_ps(w->m, s->m);
+//#else
+//        d->v = w->v * s->v;
+//#endif
+//    }
+//    //Processing is done here!
+//    //do fft
+//    fftwf_execute_dft_r2c(u->forward_plan, dst, output_window);
+//
+//
+//    //perform filtering - purely magnitude based
+//    for(size_t j = 0;j < fft_h; j+=v_size/2){
+//        //output_window[j][0]*=H[j];
+//        //output_window[j][1]*=H[j];
+//        float_vector_t *d = (float_vector_t*)(output_window+j);
+//        float_vector_t h;
+//        h.f[0] = h.f[1] = H[j];
+//        h.f[2] = h.f[3] = H[j+1];
+//#if __SSE2__
+//        d->m = _mm_mul_ps(d->m, h.m);
+//#else
+//        d->v = d->v*h->v;
+//#endif
+//    }
+//
+//
+//    //inverse fft
+//    fftwf_execute_dft_c2r(u->inverse_plan, output_window, dst);
+//
+//    ////debug: tests overlaping add
+//    ////and negates ALL PREVIOUS processing
+//    ////yields a perfect reconstruction if COLA is held
+//    //for(size_t j = 0; j < u->window_size; ++j){
+//    //    dst[j] = W[j]*src[j];
+//    //}
+//
+//    //overlap add and preserve overlap component from this window (linear phase)
+//    for(size_t j = 0; j < overlap_size; j+=v_size){
+//        //dst[j]+=overlap[j];
+//        //overlap[j]+=dst[j+R];
+//        float_vector_t *d = (float_vector_t*)(dst+j);
+//        float_vector_t *o = (float_vector_t*)(overlap+j);
+//#if __SSE2__
+//        d->m = _mm_add_ps(d->m, o->m);
+//        o->m = ((float_vector_t*)(dst+u->R+j))->m;
+//#else
+//        d->v = d->v+o->v;
+//        o->v = ((float_vector_t*)(dst+u->R+j))->v;
+//#endif
+//    }
+//    //memcpy(overlap, dst+u->R, u->overlap_size*sizeof(float));
+//
+//    //////debug: tests if basic buffering works
+//    //////shouldn't modify the signal AT ALL (beyond roundoff)
+//    //for(size_t j = 0; j < u->window_size; ++j){
+//    //    dst[j] = src[j];
+//    //}
+//
+//    //preseve the needed input for the next window's overlap
+//    memmove(src, src+u->R,
+//        ((u->overlap_size+u->samples_gathered)+-u->R)*sizeof(float)
+//    );
+//}
 
 
-void input_buffer(struct userdata *u,pa_memchunk *in){
-    size_t fs=pa_frame_size(&(u->sink->sample_spec));
-    size_t samples=in->length/fs;
-    pa_assert_se(samples<=u->target_samples-u->samples_gathered);
+
+void input_buffer(struct userdata *u, pa_memchunk *in){
+    size_t fs = pa_frame_size(&(u->sink->sample_spec));
+    size_t samples = in->length/fs;
+    pa_assert_se(samples <= u->target_samples-u->samples_gathered);
     float *src = (float*) ((uint8_t*) pa_memblock_acquire(in->memblock) + in->index);
-    for (size_t c=0;c<u->channels;c++) {
+    for(size_t c = 0; c < u->channels; c++) {
         //buffer with an offset after the overlap from previous
         //iterations
         pa_assert_se(
-            u->input[c]+u->overlap_size+u->samples_gathered+samples<=u->input[c]+u->target_samples+u->overlap_size
+            u->input[c]+u->overlap_size+u->samples_gathered+samples <= u->input[c]+u->overlap_size+u->target_samples
         );
-        pa_sample_clamp(PA_SAMPLE_FLOAT32NE,u->input[c]+u->overlap_size+u->samples_gathered,sizeof(float),src+c,fs,samples);
+        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, u->input[c]+u->overlap_size+u->samples_gathered, sizeof(float), src + c, fs, samples);
     }
     u->samples_gathered+=samples;
     pa_memblock_release(in->memblock);
@@ -454,74 +474,81 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     pa_assert(chunk);
     pa_assert_se(u = i->userdata);
     pa_assert_se(u->sink);
-    size_t fs=pa_frame_size(&(u->sink->sample_spec));
-    size_t samples_requested=nbytes/fs;
-    size_t buffered_samples=pa_memblockq_get_length(u->rendered_q)/fs;
+    size_t fs = pa_frame_size(&(u->sink->sample_spec));
+    //size_t samples_requested = nbytes/fs;
+    size_t buffered_samples = pa_memblockq_get_length(u->rendered_q)/fs;
     pa_memchunk tchunk;
-    chunk->memblock=NULL;
+    chunk->memblock = NULL;
     if (!u->sink || !PA_SINK_IS_OPENED(u->sink->thread_info.state))
         return -1;
 
     //pa_log("start output-buffered %ld, input-buffered %ld, requested %ld",buffered_samples,u->samples_gathered,samples_requested);
-    struct timespec start,end;
+    struct timespec start, end;
 
-    if(pa_memblockq_peek(u->rendered_q,&tchunk)==0){
-        *chunk=tchunk;
+    if(pa_memblockq_peek(u->rendered_q, &tchunk)==0){
+        *chunk = tchunk;
         pa_memblockq_drop(u->rendered_q, chunk->length);
         return 0;
     }
+
+    /*
+        Set the H filter
+    */
+    unsigned H_i = pa_aupdate_read_begin(u->a_H);
+    u->H = u->Hs[H_i];
+    
     do{
         pa_memchunk *buffer;
-        size_t input_remaining=u->target_samples-u->samples_gathered;
+        size_t input_remaining = u->target_samples-u->samples_gathered;
         pa_assert(input_remaining>0);
         //collect samples
 
-        buffer=&u->conv_buffer;
-        buffer->length=input_remaining*fs;
-        buffer->index=0;
+        buffer = &u->conv_buffer;
+        buffer->length = input_remaining*fs;
+        buffer->index = 0;
         pa_memblock_ref(buffer->memblock);
-        pa_sink_render_into(u->sink,buffer);
+        pa_sink_render_into(u->sink, buffer);
 
         //if(u->sink->thread_info.rewind_requested)
         //    sink_request_rewind(u->sink);
 
         //pa_memchunk p;
-        //buffer=&p;
-        //pa_sink_render(u->sink,u->R*fs,buffer);
-        //buffer->length=PA_MIN(input_remaining*fs,buffer->length);
+        //buffer = &p;
+        //pa_sink_render(u->sink, u->R*fs, buffer);
+        //buffer->length = PA_MIN(input_remaining*fs, buffer->length);
 
         //debug block
-        //pa_memblockq_push(u->rendered_q,buffer);
+        //pa_memblockq_push(u->rendered_q, buffer);
         //pa_memblock_unref(buffer->memblock);
         //goto END;
 
         //pa_log("asked for %ld input samples, got %ld samples",input_remaining,buffer->length/fs);
         //copy new input
         gettime(start);
-        input_buffer(u,buffer);
+        input_buffer(u, buffer);
         gettime(end);
-        //pa_log("Took %0.5f seconds to setup",tdiff(end,start)*1e-9);
+        //pa_log("Took %0.5f seconds to setup", tdiff(end, start)*1e-9);
 
         pa_memblock_unref(buffer->memblock);
 
-        pa_assert_se(u->fft_size>=u->window_size);
-        pa_assert_se(u->R<u->window_size);
+        pa_assert_se(u->fft_size >= u->window_size);
+        pa_assert_se(u->R < u->window_size);
         //process every complete block on hand
 
         gettime(start);
         process_samples(u);
         gettime(end);
-        //pa_log("Took %0.5f seconds to process",tdiff(end,start)*1e-9);
+        //pa_log("Took %0.5f seconds to process", tdiff(end, start)*1e-9);
 
-        buffered_samples=pa_memblockq_get_length(u->rendered_q)/fs;
-    }while(buffered_samples<u->R);
+        buffered_samples = pa_memblockq_get_length(u->rendered_q)/fs;
+    }while(buffered_samples < u->R);
 
     //deque from rendered_q and output
-    pa_assert_se(pa_memblockq_peek(u->rendered_q,&tchunk)==0);
-    *chunk=tchunk;
+    pa_assert_se(pa_memblockq_peek(u->rendered_q, &tchunk)==0);
+    *chunk = tchunk;
     pa_memblockq_drop(u->rendered_q, chunk->length);
     pa_assert_se(chunk->memblock);
-    //pa_log("gave %ld",chunk->length/fs);
+    //pa_log("gave %ld", chunk->length/fs);
     //pa_log("end pop");
     return 0;
 }
@@ -546,10 +573,10 @@ static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
         u->sink->thread_info.rewind_nbytes = 0;
 
         if (amount > 0) {
-            //pa_sample_spec *ss=&u->sink->sample_spec;
+            //pa_sample_spec *ss = &u->sink->sample_spec;
             pa_memblockq_seek(u->rendered_q, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
             pa_log_debug("Resetting equalizer");
-            u->samples_gathered=0;
+            u->samples_gathered = 0;
         }
     }
 
@@ -581,9 +608,9 @@ static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) {
     if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
         return;
 
-    size_t fs=pa_frame_size(&(u->sink->sample_spec));
-    pa_sink_set_max_request_within_thread(u->sink, nbytes);
-    //pa_sink_set_max_request_within_thread(u->sink, u->R*fs);
+    size_t fs = pa_frame_size(&(u->sink->sample_spec));
+    //pa_sink_set_max_request_within_thread(u->sink, nbytes);
+    pa_sink_set_max_request_within_thread(u->sink, u->R*fs);
 }
 
 /* Called from I/O thread context */
@@ -596,9 +623,9 @@ static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) {
     if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
         return;
 
-    size_t fs=pa_frame_size(&(u->sink->sample_spec));
-    pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->latency*fs);
-    //pa_sink_set_latency_range_within_thread(u->sink,u->latency*fs ,u->latency*fs );
+    size_t fs = pa_frame_size(&(u->sink->sample_spec));
+    //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->latency*fs);
+    pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->latency*fs );
     //pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
 }
 
@@ -631,9 +658,9 @@ static void sink_input_attach_cb(pa_sink_input *i) {
     pa_sink_set_rtpoll(u->sink, i->sink->rtpoll);
     pa_sink_attach_within_thread(u->sink);
 
-    size_t fs=pa_frame_size(&(u->sink->sample_spec));
+    size_t fs = pa_frame_size(&(u->sink->sample_spec));
     //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->latency*fs);
-    //pa_sink_set_latency_range_within_thread(u->sink,u->latency*fs, u->master->thread_info.max_latency);
+    //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->master->thread_info.max_latency);
     //TODO: setting this guy minimizes drop outs but doesn't get rid
     //of them completely, figure out why
     pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->latency*fs);
@@ -689,10 +716,13 @@ static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) {
 //ensure's memory allocated is a multiple of v_size
 //and aligned
 static void * alloc(size_t x,size_t s){
-    size_t f=mround(x*s,sizeof(float)*v_size);
-    //printf("requested %ld floats=%ld bytes, rem=%ld\n",x,x*sizeof(float),x*sizeof(float)%16);
-    //printf("giving %ld floats=%ld bytes, rem=%ld\n",f,f*sizeof(float),f*sizeof(float)%16);
-    return fftwf_malloc(f*s);
+    size_t f = mround(x*s, sizeof(float)*v_size);
+    pa_assert_se(f >= x*s);
+    //printf("requested %ld floats=%ld bytes, rem=%ld\n", x, x*sizeof(float), x*sizeof(float)%16);
+    //printf("giving %ld floats=%ld bytes, rem=%ld\n", f, f*sizeof(float), f*sizeof(float)%16);
+    float *t = fftwf_malloc(f);
+    memset(t, 0, f);
+    return t;
 }
 
 int pa__init(pa_module*m) {
@@ -726,7 +756,7 @@ int pa__init(pa_module*m) {
         pa_log("Invalid sample format specification or channel map");
         goto fail;
     }
-    fs=pa_frame_size(&ss);
+    fs = pa_frame_size(&ss);
 
     u = pa_xnew0(struct userdata, 1);
     u->core = m->core;
@@ -736,90 +766,96 @@ int pa__init(pa_module*m) {
     u->sink = NULL;
     u->sink_input = NULL;
 
-    u->channels=ss.channels;
-    u->fft_size=pow(2,ceil(log(ss.rate)/log(2)));
-    pa_log("fft size: %ld",u->fft_size);
-    u->window_size=15999;
-    u->R=(u->window_size+1)/2;
-    u->overlap_size=u->window_size-u->R;
-    u->target_samples=1*u->R;
-    u->samples_gathered=0;
-    u->max_output=pa_frame_align(pa_mempool_block_size_max(m->core->mempool), &ss)/pa_frame_size(&ss);
-    u->rendered_q = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH,u->target_samples*fs, fs, fs, 0, 0, NULL);
-    u->conv_buffer.memblock=pa_memblock_new(u->core->mempool,u->target_samples*fs);
-    u->latency=u->R;
-
-    u->H=alloc((u->fft_size/2+1),sizeof(fftwf_complex));
-    u->W=alloc(u->window_size,sizeof(float));
-    u->work_buffer=alloc(u->fft_size,sizeof(float));
-    memset(u->work_buffer,0,u->fft_size*sizeof(float));
-    u->input=(float **)malloc(sizeof(float *)*u->channels);
-    u->overlap_accum=(float **)malloc(sizeof(float *)*u->channels);
-    u->output_buffer=(float **)malloc(sizeof(float *)*u->channels);
-    for(size_t c=0;c<u->channels;++c){
-        u->input[c]=alloc(u->target_samples+u->overlap_size,sizeof(float));
+    u->channels = ss.channels;
+    u->fft_size = pow(2, ceil(log(ss.rate)/log(2)));
+    pa_log("fft size: %ld", u->fft_size);
+    u->window_size = 7999;
+    u->R = (u->window_size+1)/2;
+    u->overlap_size = u->window_size-u->R;
+    u->target_samples = 1*u->R;
+    u->samples_gathered = 0;
+    u->max_output = pa_frame_align(pa_mempool_block_size_max(m->core->mempool), &ss)/pa_frame_size(&ss);
+    u->rendered_q = pa_memblockq_new(0,  MEMBLOCKQ_MAXLENGTH, u->target_samples*fs, fs, fs, 0, 0, NULL);
+    u->a_H = pa_aupdate_new();
+    u->conv_buffer.memblock = pa_memblock_new(u->core->mempool, u->target_samples*fs);
+    u->latency = u->R;
+    for(size_t i = 0; i < 2; ++i){
+        u->Hs[i] = alloc((u->fft_size / 2 + 1), sizeof(float));
+    }
+    u->W = alloc(u->window_size, sizeof(float));
+    u->work_buffer = alloc(u->fft_size, sizeof(float));
+    memset(u->work_buffer, 0, u->fft_size*sizeof(float));
+    u->input = (float **)pa_xmalloc0(sizeof(float *)*u->channels);
+    u->overlap_accum = (float **)pa_xmalloc0(sizeof(float *)*u->channels);
+    for(size_t c = 0; c < u->channels; ++c){
+        u->input[c] = alloc(u->overlap_size+u->target_samples, sizeof(float));
         pa_assert_se(u->input[c]);
-        memset(u->input[c],0,(u->target_samples+u->overlap_size)*sizeof(float));
+        memset(u->input[c], 0, (u->overlap_size+u->target_samples)*sizeof(float));
         pa_assert_se(u->input[c]);
-        u->overlap_accum[c]=alloc(u->overlap_size,sizeof(float));
+        u->overlap_accum[c] = alloc(u->overlap_size, sizeof(float));
         pa_assert_se(u->overlap_accum[c]);
-        memset(u->overlap_accum[c],0,u->overlap_size*sizeof(float));
-        u->output_buffer[c]=alloc(u->window_size,sizeof(float));
-        pa_assert_se(u->output_buffer[c]);
-    }
-    u->output_window=alloc((u->fft_size/2+1),sizeof(fftwf_complex));
-    u->forward_plan=fftwf_plan_dft_r2c_1d(u->fft_size, u->work_buffer, u->output_window, FFTW_MEASURE);
-    u->inverse_plan=fftwf_plan_dft_c2r_1d(u->fft_size, u->output_window, u->work_buffer, FFTW_MEASURE);
-
-    hanning_window(u->W,u->window_size);
-
-    const int freqs[]={0,25,50,100,200,300,400,800,1500,
-        2000,3000,4000,5000,6000,7000,8000,9000,10000,11000,12000,
-        13000,14000,15000,16000,17000,18000,19000,20000,21000,22000,23000,24000,INT_MAX};
-    const float coefficients[]={1,1,1,1,1,1,1,1,1,1,
-        1,1,1,1,1,1,1,1,
-        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
-    const size_t ncoefficients=sizeof(coefficients)/sizeof(float);
-    pa_assert_se(sizeof(freqs)/sizeof(int)==sizeof(coefficients)/sizeof(float));
-    float *freq_translated=(float *) malloc(sizeof(float)*(ncoefficients));
-    freq_translated[0]=1;
-    //Translate the frequencies in their natural sampling rate to the new sampling rate frequencies
-    for(size_t i=1;i<ncoefficients-1;++i){
-        freq_translated[i]=((float)freqs[i]*u->fft_size)/ss.rate;
-        //pa_log("i: %ld: %d , %g",i,freqs[i],freq_translated[i]);
-        pa_assert_se(freq_translated[i]>=freq_translated[i-1]);
+        memset(u->overlap_accum[c], 0, u->overlap_size*sizeof(float));
     }
-    freq_translated[ncoefficients-1]=FLT_MAX;
-    //Interpolate the specified frequency band values
-    u->H[0]=1;
-    for(size_t i=1,j=0;i<(u->fft_size/2+1);++i){
-        pa_assert_se(j<ncoefficients);
-        //max frequency range passed, consider the rest as one band
-        if(freq_translated[j+1]>=FLT_MAX){
-            for(;i<(u->fft_size/2+1);++i){
-                u->H[i]=coefficients[j];
-            }
-            break;
-        }
-        //pa_log("i: %d, j: %d, freq: %f",i,j,freq_translated[j]);
-        //pa_log("interp: %0.4f %0.4f",freq_translated[j],freq_translated[j+1]);
-        pa_assert_se(freq_translated[j]<freq_translated[j+1]);
-        pa_assert_se(i>=freq_translated[j]);
-        pa_assert_se(i<=freq_translated[j+1]);
-        //bilinear-inerpolation of coefficients specified
-        float c0=(i-freq_translated[j])/(freq_translated[j+1]-freq_translated[j]);
-        pa_assert_se(c0>=0&&c0<=1.0);
-        u->H[i]=((1.0f-c0)*coefficients[j]+c0*coefficients[j+1]);
-        pa_assert_se(u->H[i]>0);
-        while(i>=floor(freq_translated[j+1])){
-            j++;
-        }
-    }
-    //divide out the fft gain
-    for(size_t i=0;i<(u->fft_size/2+1);++i){
-        u->H[i]/=u->fft_size;
+    u->output_window = alloc((u->fft_size / 2 + 1), sizeof(fftwf_complex));
+    u->forward_plan = fftwf_plan_dft_r2c_1d(u->fft_size, u->work_buffer, u->output_window, FFTW_MEASURE);
+    u->inverse_plan = fftwf_plan_dft_c2r_1d(u->fft_size, u->output_window, u->work_buffer, FFTW_MEASURE);
+
+    hanning_window(u->W, u->window_size);
+
+    unsigned H_i = pa_aupdate_write_begin(u->a_H);
+    u->H = u->Hs[H_i];
+    for(size_t i = 0; i < u->fft_size / 2 + 1; ++i){
+        u->H[i] = 1.0;
     }
-    free(freq_translated);
+
+    //TODO cut this out and leave it for the client side
+    //const int freqs[] = {0,25,50,100,200,300,400,800,1500,
+    //    2000,3000,4000,5000,6000,7000,8000,9000,10000,11000,12000,
+    //    13000,14000,15000,16000,17000,18000,19000,20000,21000,22000,23000,24000,INT_MAX};
+    //const float coefficients[] = {1,1,1,1,1,1,1,1,1,1,
+    //    1,1,1,1,1,1,1,1,
+    //    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
+    //const size_t ncoefficients = sizeof(coefficients)/sizeof(float);
+    //pa_assert_se(sizeof(freqs)/sizeof(int)==sizeof(coefficients)/sizeof(float));
+    //float *freq_translated = (float *) pa_xmalloc0(sizeof(float)*(ncoefficients));
+    //freq_translated[0] = 1;
+    ////Translate the frequencies in their natural sampling rate to the new sampling rate frequencies
+    //for(size_t i = 1; i < ncoefficients-1; ++i){
+    //    freq_translated[i] = ((float)freqs[i]*u->fft_size)/ss.rate;
+    //    //pa_log("i: %ld: %d , %g",i, freqs[i], freq_translated[i]);
+    //    pa_assert_se(freq_translated[i] >= freq_translated[i-1]);
+    //}
+    //freq_translated[ncoefficients-1] = FLT_MAX;
+    //
+    ////Interpolate the specified frequency band values
+    //u->H[0] = 1;
+    //for(size_t i = 1, j = 0; i < (u->fft_size / 2 + 1); ++i){
+    //    pa_assert_se(j < ncoefficients);
+    //    //max frequency range passed, consider the rest as one band
+    //    if(freq_translated[j+1] >= FLT_MAX){
+    //        for(; i < (u->fft_size / 2 + 1); ++i){
+    //            u->H[i] = coefficients[j];
+    //        }
+    //        break;
+    //    }
+    //    //pa_log("i: %d, j: %d, freq: %f", i, j, freq_translated[j]);
+    //    //pa_log("interp: %0.4f %0.4f", freq_translated[j], freq_translated[j+1]);
+    //    pa_assert_se(freq_translated[j] < freq_translated[j+1]);
+    //    pa_assert_se(i >= freq_translated[j]);
+    //    pa_assert_se(i <= freq_translated[j+1]);
+    //    //bilinear-inerpolation of coefficients specified
+    //    float c0 = (i-freq_translated[j])/(freq_translated[j+1]-freq_translated[j]);
+    //    pa_assert_se(c0 >= 0&&c0 <= 1.0);
+    //    u->H[i] = ((1.0f-c0)*coefficients[j]+c0*coefficients[j+1]);
+    //    pa_assert_se(u->H[i]>0);
+    //    while(i >= floor(freq_translated[j+1])){
+    //        j++;
+    //    }
+    //}
+    //pa_xfree(freq_translated);
+    fix_filter(u->H, u->fft_size);
+    pa_aupdate_write_swap(u->a_H);
+    pa_aupdate_write_end(u->a_H);
 
 
     /* Create sink */
@@ -858,8 +894,8 @@ int pa__init(pa_module*m) {
 
     pa_sink_set_asyncmsgq(u->sink, master->asyncmsgq);
     pa_sink_set_rtpoll(u->sink, master->rtpoll);
-    pa_sink_set_max_request(u->sink,u->R*fs);
-    //pa_sink_set_fixed_latency(u->sink,pa_bytes_to_usec(u->R*fs,&ss));
+    pa_sink_set_max_request(u->sink, u->R*fs);
+    //pa_sink_set_fixed_latency(u->sink, pa_bytes_to_usec(u->R*fs, &ss));
 
     /* Create sink input */
     pa_sink_input_new_data_init(&sink_input_data);
@@ -896,6 +932,8 @@ int pa__init(pa_module*m) {
 
     pa_xfree(use_default);
 
+    dbus_init(u);
+
     return 0;
 
 fail:
@@ -925,6 +963,7 @@ void pa__done(pa_module*m) {
 
     if (!(u = m->userdata))
         return;
+    dbus_done(u);
 
     if (u->sink) {
         pa_sink_unlink(u->sink);
@@ -944,18 +983,152 @@ void pa__done(pa_module*m) {
 
     fftwf_destroy_plan(u->inverse_plan);
     fftwf_destroy_plan(u->forward_plan);
-    free(u->output_window);
-    for(size_t c=0;c<u->channels;++c){
-        free(u->output_buffer[c]);
-        free(u->overlap_accum[c]);
-        free(u->input[c]);
+    pa_xfree(u->output_window);
+    for(size_t c=0; c < u->channels; ++c){
+        pa_xfree(u->overlap_accum[c]);
+        pa_xfree(u->input[c]);
+    }
+    pa_xfree(u->overlap_accum);
+    pa_xfree(u->input);
+    pa_xfree(u->work_buffer);
+    pa_xfree(u->W);
+    for(size_t i = 0; i < 2; ++i){
+        pa_xfree(u->Hs[i]);
     }
-    free(u->output_buffer);
-    free(u->overlap_accum);
-    free(u->input);
-    free(u->work_buffer);
-    free(u->W);
-    free(u->H);
 
     pa_xfree(u);
 }
+
+enum property_handler_index {
+    PROPERTY_HANDLER_N_COEFS,
+    PROPERTY_HANDLER_COEFS,
+    PROPERTY_HANDLER_MAX
+};
+
+static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX]={
+    [PROPERTY_HANDLER_N_COEFS]{.property_name="n_filter_coefficients",.type="u",.get_cb=get_n_coefs,.set_cb=NULL},
+    [PROPERTY_HANDLER_COEFS]{.property_name="filter_coefficients",.type="ai",.get_cb=get_filter,.set_cb=set_filter}
+};
+
+//static pa_dbus_arg_info new_equalizer_args[] = { { "path","o",NULL} };
+//static pa_dbus_signal_info signals[SIGNAL_MAX] = {
+//    [SIGNAL_NEW_EQUALIZER]={.name="NewEqualizer",.arguments=new_equalizer_args,.n_arguments=1}
+//};
+
+#define EXTNAME "org.PulseAudio.Ext.Equalizing1"
+
+static pa_dbus_interface_info interface_info={
+    .name=EXTNAME ".Equalizer",
+    .method_handlers=NULL,
+    .n_method_handlers=0,
+    .property_handlers=property_handlers,
+    .n_property_handlers=PROPERTY_HANDLER_MAX,
+    .get_all_properties_cb=handle_get_all,
+    .signals=NULL,
+    .n_signals=0
+};
+
+
+void dbus_init(struct userdata *u){
+    u->dbus_protocol=pa_dbus_protocol_get(u->core);
+    u->dbus_path=pa_sprintf_malloc("/org/pulseaudio/core1/sink%d", u->sink->index);
+
+    pa_dbus_protocol_add_interface(u->dbus_protocol, u->dbus_path, &interface_info, u);
+    pa_dbus_protocol_register_extension(u->dbus_protocol, EXTNAME);
+}
+
+void dbus_done(struct userdata *u){
+    pa_dbus_protocol_unregister_extension(u->dbus_protocol, EXTNAME);
+    pa_dbus_protocol_remove_interface(u->dbus_protocol, u->dbus_path, EXTNAME);
+    
+    pa_xfree(u->dbus_path);
+    pa_dbus_protocol_unref(u->dbus_protocol);
+}
+
+void get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u){
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(_u);
+
+    struct userdata *u=(struct userdata *)_u;
+
+    uint32_t n_coefs=(uint32_t)(u->fft_size / 2 + 1);
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &n_coefs);
+}
+
+void get_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(_u);
+
+    struct userdata *u=(struct userdata *)_u;
+    
+    unsigned n_coefs=(unsigned)(u->fft_size / 2 + 1);
+    double *H_=(double *)pa_xmalloc0(n_coefs*sizeof(double));
+    
+    unsigned H_i=pa_aupdate_read_begin(u->a_H);
+    float *H=u->Hs[H_i];
+    for(size_t i = 0;i < u->fft_size / 2 + 1; ++i){
+        H_[i]=H[i];
+    }
+    pa_aupdate_read_end(u->a_H);
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_DOUBLE, &H_, n_coefs);
+    pa_xfree(H_);
+}
+
+void set_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(_u);
+
+    struct userdata *u=(struct userdata *)_u;
+    double *H_;
+    unsigned _n_coefs;
+    pa_dbus_get_fixed_array_set_property_arg(conn, msg, DBUS_TYPE_DOUBLE, &H_, &_n_coefs);
+    if(_n_coefs!=u->fft_size / 2 + 1){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "This filter takes exactly %ld coefficients, you gave %d", u->fft_size / 2 + 1, _n_coefs);
+        return;
+    }
+    unsigned H_i = pa_aupdate_write_begin(u->a_H);
+    float *H = u->Hs[H_i];
+    for(size_t i = 0; i < u->fft_size / 2 + 1; ++i){
+        H[i] = (float)H_[i];
+    }
+    pa_aupdate_write_swap(u->a_H);
+    pa_aupdate_write_end(u->a_H);
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(_u);
+
+    struct userdata *u = (struct userdata *)_u;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter, dict_iter;
+
+    int n_coefs=(unsigned)(u->fft_size / 2 + 1);
+    double *H_=(double *)pa_xmalloc0(n_coefs*sizeof(double));
+    
+    unsigned H_i=pa_aupdate_read_begin(u->a_H);
+    float *H=u->Hs[H_i];
+    for(size_t i = 0; i < u->fft_size / 2 + 1; ++i){
+        H_[i] = H[i];
+    }
+    pa_aupdate_read_end(u->a_H);
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_N_COEFS].property_name, DBUS_TYPE_UINT32, &n_coefs);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_COEFS].property_name, DBUS_TYPE_DOUBLE, H_, n_coefs);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+    dbus_message_unref(reply);
+
+    pa_xfree(H_);
+}

commit 66a6cc693bcf441d86ed56a3b15be948008e9de7
Author: Jason Newton <nevion at gmail.com>
Date:   Sat Aug 1 20:23:49 2009 -0700

    module-equalizer-sink:
        added support for suspend/resume of filter coefficients
        unregister the correct dbus interface.
        made equalizer state file sink index dependent
        expanded dbus properties
        whitespace

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index d8eb5f3..6ea5951 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -50,7 +50,7 @@ USA.
 #include <pulsecore/thread-mq.h>
 #include <pulsecore/rtpoll.h>
 #include <pulsecore/sample-util.h>
-#include <pulsecore/ltdl-helper.h>
+#include <pulsecore/database.h>
 #include <pulsecore/protocol-dbus.h>
 #include <pulsecore/dbus-util.h>
 
@@ -114,6 +114,8 @@ struct userdata {
 
     pa_dbus_protocol *dbus_protocol;
     char *dbus_path;
+
+    pa_database *database;
 };
 
 static const char* const valid_modargs[] = {
@@ -145,14 +147,18 @@ void dsp_logic(
 static void dbus_init(struct userdata *u);
 static void dbus_done(struct userdata *u);
 static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *_u);
+void get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *_u);
+void get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void get_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void set_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void save_state(struct userdata *u);
 
 #define v_size 4
 #define gettime(x) clock_gettime(CLOCK_MONOTONIC, &x)
 #define tdiff(x, y) time_diff(&x, &y)
 #define mround(x, y) (x % y == 0 ? x : ( x / y + 1) * y)
+#define COEFKEY "coefficients"
 
 uint64_t time_diff(struct timespec *timeA_p, struct timespec *timeB_p)
 {
@@ -321,7 +327,7 @@ void dsp_logic(
     //do fft
     fftwf_execute_dft_r2c(u->forward_plan, dst, output_window);
     //perform filtering
-    for(size_t j = 0;j < u->fft_size / 2 + 1; ++j){
+    for(size_t j = 0; j < u->fft_size / 2 + 1; ++j){
         u->output_window[j][0] *= u->H[j];
         u->output_window[j][1] *= u->H[j];
     }
@@ -702,6 +708,22 @@ static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t s
     }
 }
 
+void save_state(struct userdata *u){
+    const float *H = u->Hs[pa_aupdate_read_begin(u->a_H)];
+    float *H_n = pa_xmalloc((u->fft_size / 2 + 1) * sizeof(float));
+    for(size_t i = 0 ; i <= u->fft_size / 2 + 1; ++i){
+        H_n[i] = H[i] * u->fft_size;
+    }
+    pa_aupdate_read_end(u->a_H);
+    pa_datum key, data;
+    key.data = (char *) COEFKEY;
+    key.size = strlen(key.data);
+    data.data = H_n;
+    data.size = (u->fft_size / 2 + 1) * sizeof(float);
+    pa_database_set(u->database, &key, &data, TRUE);
+    pa_database_sync(u->database);
+}
+
 /* Called from main context */
 static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) {
     struct userdata *u;
@@ -802,62 +824,6 @@ int pa__init(pa_module*m) {
 
     hanning_window(u->W, u->window_size);
 
-    unsigned H_i = pa_aupdate_write_begin(u->a_H);
-    u->H = u->Hs[H_i];
-    for(size_t i = 0; i < u->fft_size / 2 + 1; ++i){
-        u->H[i] = 1.0;
-    }
-
-    //TODO cut this out and leave it for the client side
-    //const int freqs[] = {0,25,50,100,200,300,400,800,1500,
-    //    2000,3000,4000,5000,6000,7000,8000,9000,10000,11000,12000,
-    //    13000,14000,15000,16000,17000,18000,19000,20000,21000,22000,23000,24000,INT_MAX};
-    //const float coefficients[] = {1,1,1,1,1,1,1,1,1,1,
-    //    1,1,1,1,1,1,1,1,
-    //    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
-    //const size_t ncoefficients = sizeof(coefficients)/sizeof(float);
-    //pa_assert_se(sizeof(freqs)/sizeof(int)==sizeof(coefficients)/sizeof(float));
-    //float *freq_translated = (float *) pa_xmalloc0(sizeof(float)*(ncoefficients));
-    //freq_translated[0] = 1;
-    ////Translate the frequencies in their natural sampling rate to the new sampling rate frequencies
-    //for(size_t i = 1; i < ncoefficients-1; ++i){
-    //    freq_translated[i] = ((float)freqs[i]*u->fft_size)/ss.rate;
-    //    //pa_log("i: %ld: %d , %g",i, freqs[i], freq_translated[i]);
-    //    pa_assert_se(freq_translated[i] >= freq_translated[i-1]);
-    //}
-    //freq_translated[ncoefficients-1] = FLT_MAX;
-    //
-    ////Interpolate the specified frequency band values
-    //u->H[0] = 1;
-    //for(size_t i = 1, j = 0; i < (u->fft_size / 2 + 1); ++i){
-    //    pa_assert_se(j < ncoefficients);
-    //    //max frequency range passed, consider the rest as one band
-    //    if(freq_translated[j+1] >= FLT_MAX){
-    //        for(; i < (u->fft_size / 2 + 1); ++i){
-    //            u->H[i] = coefficients[j];
-    //        }
-    //        break;
-    //    }
-    //    //pa_log("i: %d, j: %d, freq: %f", i, j, freq_translated[j]);
-    //    //pa_log("interp: %0.4f %0.4f", freq_translated[j], freq_translated[j+1]);
-    //    pa_assert_se(freq_translated[j] < freq_translated[j+1]);
-    //    pa_assert_se(i >= freq_translated[j]);
-    //    pa_assert_se(i <= freq_translated[j+1]);
-    //    //bilinear-inerpolation of coefficients specified
-    //    float c0 = (i-freq_translated[j])/(freq_translated[j+1]-freq_translated[j]);
-    //    pa_assert_se(c0 >= 0&&c0 <= 1.0);
-    //    u->H[i] = ((1.0f-c0)*coefficients[j]+c0*coefficients[j+1]);
-    //    pa_assert_se(u->H[i]>0);
-    //    while(i >= floor(freq_translated[j+1])){
-    //        j++;
-    //    }
-    //}
-    //pa_xfree(freq_translated);
-    fix_filter(u->H, u->fft_size);
-    pa_aupdate_write_swap(u->a_H);
-    pa_aupdate_write_end(u->a_H);
-
-
     /* Create sink */
     pa_sink_new_data_init(&sink_data);
     sink_data.driver = __FILE__;
@@ -932,6 +898,82 @@ int pa__init(pa_module*m) {
 
     pa_xfree(use_default);
 
+    char *dbname;
+    char *pref = pa_sprintf_malloc("equalizer-%s-state", u->sink->name);
+    pa_assert_se(dbname = pa_state_path(pref, TRUE));
+    pa_xfree(pref);
+    pa_assert_se(u->database = pa_database_open(dbname, TRUE));
+    pa_xfree(dbname);
+
+    unsigned H_i = pa_aupdate_write_begin(u->a_H);
+    u->H = u->Hs[H_i];
+    for(size_t i = 0; i < u->fft_size / 2 + 1; ++i){
+        u->H[i] = 1.0;
+    }
+
+    //TODO cut this out and leave it for the client side
+    //const int freqs[] = {0,25,50,100,200,300,400,800,1500,
+    //    2000,3000,4000,5000,6000,7000,8000,9000,10000,11000,12000,
+    //    13000,14000,15000,16000,17000,18000,19000,20000,21000,22000,23000,24000,INT_MAX};
+    //const float coefficients[] = {1,1,1,1,1,1,1,1,1,1,
+    //    1,1,1,1,1,1,1,1,
+    //    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
+    //const size_t ncoefficients = sizeof(coefficients)/sizeof(float);
+    //pa_assert_se(sizeof(freqs)/sizeof(int)==sizeof(coefficients)/sizeof(float));
+    //float *freq_translated = (float *) pa_xmalloc0(sizeof(float)*(ncoefficients));
+    //freq_translated[0] = 1;
+    ////Translate the frequencies in their natural sampling rate to the new sampling rate frequencies
+    //for(size_t i = 1; i < ncoefficients-1; ++i){
+    //    freq_translated[i] = ((float)freqs[i]*u->fft_size)/ss.rate;
+    //    //pa_log("i: %ld: %d , %g",i, freqs[i], freq_translated[i]);
+    //    pa_assert_se(freq_translated[i] >= freq_translated[i-1]);
+    //}
+    //freq_translated[ncoefficients-1] = FLT_MAX;
+    //
+    ////Interpolate the specified frequency band values
+    //u->H[0] = 1;
+    //for(size_t i = 1, j = 0; i < (u->fft_size / 2 + 1); ++i){
+    //    pa_assert_se(j < ncoefficients);
+    //    //max frequency range passed, consider the rest as one band
+    //    if(freq_translated[j+1] >= FLT_MAX){
+    //        for(; i < (u->fft_size / 2 + 1); ++i){
+    //            u->H[i] = coefficients[j];
+    //        }
+    //        break;
+    //    }
+    //    //pa_log("i: %d, j: %d, freq: %f", i, j, freq_translated[j]);
+    //    //pa_log("interp: %0.4f %0.4f", freq_translated[j], freq_translated[j+1]);
+    //    pa_assert_se(freq_translated[j] < freq_translated[j+1]);
+    //    pa_assert_se(i >= freq_translated[j]);
+    //    pa_assert_se(i <= freq_translated[j+1]);
+    //    //bilinear-inerpolation of coefficients specified
+    //    float c0 = (i-freq_translated[j])/(freq_translated[j+1]-freq_translated[j]);
+    //    pa_assert_se(c0 >= 0&&c0 <= 1.0);
+    //    u->H[i] = ((1.0f-c0)*coefficients[j]+c0*coefficients[j+1]);
+    //    pa_assert_se(u->H[i]>0);
+    //    while(i >= floor(freq_translated[j+1])){
+    //        j++;
+    //    }
+    //}
+    //pa_xfree(freq_translated);
+
+    //load old parameters
+    pa_datum key,value;
+    key.data = (char *) COEFKEY;
+    key.size = strlen(key.data);
+    if (pa_database_get(u->database, &key, &value) != NULL){
+        if(value.size == (u->fft_size / 2 + 1) * sizeof(float)){
+            memcpy(u->H, value.data, (u->fft_size / 2 + 1) * sizeof(float));
+        }
+        pa_datum_free(&value);
+    }
+
+    fix_filter(u->H, u->fft_size);
+    pa_aupdate_write_swap(u->a_H);
+    pa_aupdate_write_end(u->a_H);
+
+
+
     dbus_init(u);
 
     return 0;
@@ -963,6 +1005,10 @@ void pa__done(pa_module*m) {
 
     if (!(u = m->userdata))
         return;
+
+    save_state(u);
+    pa_database_close(u->database);
+
     dbus_done(u);
 
     if (u->sink) {
@@ -1000,14 +1046,18 @@ void pa__done(pa_module*m) {
 }
 
 enum property_handler_index {
+    PROPERTY_HANDLER_SAMPLERATE,
+    PROPERTY_HANDLER_FILTERSAMPLERATE,
     PROPERTY_HANDLER_N_COEFS,
     PROPERTY_HANDLER_COEFS,
     PROPERTY_HANDLER_MAX
 };
 
 static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX]={
-    [PROPERTY_HANDLER_N_COEFS]{.property_name="n_filter_coefficients",.type="u",.get_cb=get_n_coefs,.set_cb=NULL},
-    [PROPERTY_HANDLER_COEFS]{.property_name="filter_coefficients",.type="ai",.get_cb=get_filter,.set_cb=set_filter}
+    [PROPERTY_HANDLER_SAMPLERATE]{.property_name="SampleRate",.type="u",.get_cb=get_sample_rate,.set_cb=NULL},
+    [PROPERTY_HANDLER_FILTERSAMPLERATE]{.property_name="FilterSampleRate",.type="u",.get_cb=get_filter_rate,.set_cb=NULL},
+    [PROPERTY_HANDLER_N_COEFS]{.property_name="NFilterCoefficients",.type="u",.get_cb=get_n_coefs,.set_cb=NULL},
+    [PROPERTY_HANDLER_COEFS]{.property_name="FilterCoefficients",.type="ai",.get_cb=get_filter,.set_cb=set_filter}
 };
 
 //static pa_dbus_arg_info new_equalizer_args[] = { { "path","o",NULL} };
@@ -1039,7 +1089,7 @@ void dbus_init(struct userdata *u){
 
 void dbus_done(struct userdata *u){
     pa_dbus_protocol_unregister_extension(u->dbus_protocol, EXTNAME);
-    pa_dbus_protocol_remove_interface(u->dbus_protocol, u->dbus_path, EXTNAME);
+    pa_dbus_protocol_remove_interface(u->dbus_protocol, u->dbus_path, interface_info.name);
     
     pa_xfree(u->dbus_path);
     pa_dbus_protocol_unref(u->dbus_protocol);
@@ -1056,23 +1106,41 @@ void get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &n_coefs);
 }
 
+void get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(_u);
+
+    struct userdata *u=(struct userdata *) _u;
+    uint32_t rate=(uint32_t) u->sink->sample_spec.rate;
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &rate);
+}
+void get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(_u);
+
+    struct userdata *u=(struct userdata *) _u;
+    uint32_t fft_size=(uint32_t) u->fft_size;
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &fft_size);
+}
+
 void get_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(_u);
 
-    struct userdata *u=(struct userdata *)_u;
+    struct userdata *u = (struct userdata *)_u;
     
-    unsigned n_coefs=(unsigned)(u->fft_size / 2 + 1);
-    double *H_=(double *)pa_xmalloc0(n_coefs*sizeof(double));
+    unsigned n_coefs = (unsigned) (u->fft_size / 2 + 1);
+    double *H_ = (double *) pa_xmalloc0(n_coefs * sizeof(double));
     
-    unsigned H_i=pa_aupdate_read_begin(u->a_H);
-    float *H=u->Hs[H_i];
+    float *H=u->Hs[pa_aupdate_read_begin(u->a_H)];
     for(size_t i = 0;i < u->fft_size / 2 + 1; ++i){
-        H_[i]=H[i];
+        H_[i] = H[i] * u->fft_size;
     }
     pa_aupdate_read_end(u->a_H);
-    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_DOUBLE, &H_, n_coefs);
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_DOUBLE, H_, n_coefs);
     pa_xfree(H_);
 }
 
@@ -1089,14 +1157,17 @@ void set_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "This filter takes exactly %ld coefficients, you gave %d", u->fft_size / 2 + 1, _n_coefs);
         return;
     }
-    unsigned H_i = pa_aupdate_write_begin(u->a_H);
-    float *H = u->Hs[H_i];
+    float *H = u->Hs[pa_aupdate_write_begin(u->a_H)];
     for(size_t i = 0; i < u->fft_size / 2 + 1; ++i){
-        H[i] = (float)H_[i];
+        H[i] = (float) H_[i];
     }
+    fix_filter(H, u->fft_size);
     pa_aupdate_write_swap(u->a_H);
     pa_aupdate_write_end(u->a_H);
 
+    //Stupid for IO reasons?  Add a save signal to dbus instead
+    save_state(u);
+
     pa_dbus_send_empty_reply(conn, msg);
 }
 
@@ -1109,7 +1180,9 @@ void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
     DBusMessage *reply = NULL;
     DBusMessageIter msg_iter, dict_iter;
 
-    int n_coefs=(unsigned)(u->fft_size / 2 + 1);
+    uint32_t rate=(uint32_t) u->sink->sample_spec.rate;
+    uint32_t fft_size=(uint32_t) u->fft_size;
+    uint32_t n_coefs=(uint32_t)(u->fft_size / 2 + 1);
     double *H_=(double *)pa_xmalloc0(n_coefs*sizeof(double));
     
     unsigned H_i=pa_aupdate_read_begin(u->a_H);
@@ -1123,6 +1196,8 @@ void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
     dbus_message_iter_init_append(reply, &msg_iter);
     pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
 
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLERATE].property_name, DBUS_TYPE_UINT32, &rate);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_FILTERSAMPLERATE].property_name, DBUS_TYPE_UINT32, &fft_size);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_N_COEFS].property_name, DBUS_TYPE_UINT32, &n_coefs);
     pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_COEFS].property_name, DBUS_TYPE_DOUBLE, H_, n_coefs);
 

commit 144f1c4f31fe3cde73a0d9ea08d2ae34cc24bdf6
Author: Jason Newton <nevion at gmail.com>
Date:   Wed Aug 5 00:52:16 2009 -0700

    module-equalizer-sink:
        dbus properties and manager so that multiple sinks can be loaded and mixers can be equalizer-sink aware
        functionality to seed new filters quickly (rteq guis)
        profile support
        extra checking in client->server dbus messages

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 6ea5951..285fddb 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -50,6 +50,8 @@ USA.
 #include <pulsecore/thread-mq.h>
 #include <pulsecore/rtpoll.h>
 #include <pulsecore/sample-util.h>
+#include <pulsecore/shared.h>
+#include <pulsecore/idxset.h>
 #include <pulsecore/database.h>
 #include <pulsecore/protocol-dbus.h>
 #include <pulsecore/dbus-util.h>
@@ -82,6 +84,7 @@ struct userdata {
     pa_module *module;
     pa_sink *sink, *master;
     pa_sink_input *sink_input;
+    char *name;
 
     size_t channels;
     size_t fft_size;//length (res) of fft
@@ -131,9 +134,17 @@ static const char* const valid_modargs[] = {
 
 static uint64_t time_diff(struct timespec *timeA_p, struct timespec *timeB_p);
 static void hanning_window(float *W, size_t window_size);
+void fix_filter(float *H, size_t fft_size);
+void interpolate(float *signal, size_t length, uint32_t *xs, float *ys, size_t n_points);
 static void array_out(const char *name, float *a, size_t length);
+static int is_monotonic(uint32_t *xs, size_t length);
 static void process_samples(struct userdata *u);
 static void input_buffer(struct userdata *u, pa_memchunk *in);
+static void save_profile(struct userdata *u,char *name);
+static void save_state(struct userdata *u);
+static void remove_profile(pa_core *u,char *name);
+static const char * load_profile(struct userdata *u,char *name);
+static void load_state(struct userdata *u);
 
 void dsp_logic(
     float * __restrict__ dst,
@@ -144,21 +155,37 @@ void dsp_logic(
     fftwf_complex * __restrict__ output_window,
     struct userdata *u);
 
+
+/*
+ * DBus Routines and Callbacks
+ */
+#define EXTNAME "org.PulseAudio.Ext.Equalizing1"
+#define MANAGER_PATH "/org/pulseaudio/equalizing1"
 static void dbus_init(struct userdata *u);
 static void dbus_done(struct userdata *u);
-static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *_u);
-void get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *_u);
-void get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void get_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void set_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void save_state(struct userdata *u);
+static void manager_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void manager_get_sinks(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void manager_get_profiles(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void manager_get_all(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void manager_handle_remove_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_get_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
 
 #define v_size 4
 #define gettime(x) clock_gettime(CLOCK_MONOTONIC, &x)
 #define tdiff(x, y) time_diff(&x, &y)
 #define mround(x, y) (x % y == 0 ? x : ( x / y + 1) * y)
-#define COEFKEY "coefficients"
+#define SINKLIST "equalized_sinklist"
+#define EQDB "equalizer_db"
 
 uint64_t time_diff(struct timespec *timeA_p, struct timespec *timeB_p)
 {
@@ -166,20 +193,43 @@ uint64_t time_diff(struct timespec *timeA_p, struct timespec *timeB_p)
     ((timeB_p->tv_sec * 1000000000ULL) + timeB_p->tv_nsec);
 }
 
-static void hanning_window(float *W, size_t window_size){
+void hanning_window(float *W, size_t window_size){
     //h=.5*(1-cos(2*pi*j/(window_size+1)), COLA for R=(M+1)/2
     for(size_t i=0; i < window_size;++i){
         W[i] = (float).5*(1-cos(2*M_PI*i/(window_size+1)));
     }
 }
 
-static void fix_filter(float *H, size_t fft_size){
+void fix_filter(float *H, size_t fft_size){
     //divide out the fft gain
-    for(size_t i = 0; i < (fft_size / 2 + 1); ++i){
+    for(size_t i = 0; i < fft_size / 2 + 1; ++i){
         H[i] /= fft_size;
     }
 }
 
+void interpolate(float *signal, size_t length, uint32_t *xs, float *ys, size_t n_points){
+    //Note that xs must be monotonically increasing!
+    pa_assert_se(n_points>=2);
+    pa_assert_se(xs[0] == 0);
+    pa_assert_se(xs[n_points - 1] == length - 1);
+    for(size_t x = 0, x_range_lower_i = 0; x < length-1; ++x){
+        pa_assert(x_range_lower_i < n_points-1);
+        float x_range_lower = (float) (xs[x_range_lower_i]);
+        float x_range_upper = (float) (xs[x_range_lower_i+1]);
+        pa_assert_se(x_range_lower < x_range_upper);
+        pa_assert_se(x >= x_range_lower);
+        pa_assert_se(x <= x_range_upper);
+        //bilinear-interpolation of coefficients specified
+        float c0 = (x-x_range_lower)/(x_range_upper-x_range_lower);
+        pa_assert_se(c0 >= 0&&c0 <= 1.0);
+        signal[x] = ((1.0f - c0) * ys[x_range_lower_i] + c0 * ys[x_range_lower_i + 1]);
+        while(x >= xs[x_range_lower_i + 1]){
+            x_range_lower_i++;
+        }
+    }
+    signal[length-1]=ys[n_points-1];
+}
+
 void array_out(const char *name, float *a, size_t length){
     FILE *p=fopen(name, "w");
     if(!p){
@@ -195,6 +245,17 @@ void array_out(const char *name, float *a, size_t length){
     fprintf(p, "\n");
     fclose(p);
 }
+static int is_monotonic(uint32_t *xs,size_t length){
+    if(length<2){
+        return 1;
+    }
+    for(size_t i = 1; i < length; ++i){
+        if(xs[i]<=xs[i-1]){
+            return 0;
+        }
+    }
+    return 1;
+}
 
 
 /* Called from I/O thread context */
@@ -708,15 +769,16 @@ static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t s
     }
 }
 
-void save_state(struct userdata *u){
-    const float *H = u->Hs[pa_aupdate_read_begin(u->a_H)];
+void save_profile(struct userdata *u, char *name){
     float *H_n = pa_xmalloc((u->fft_size / 2 + 1) * sizeof(float));
+    const float *H = u->Hs[pa_aupdate_read_begin(u->a_H)];
     for(size_t i = 0 ; i <= u->fft_size / 2 + 1; ++i){
-        H_n[i] = H[i] * u->fft_size;
+        //H_n[i] = H[i] * u->fft_size;
+        H_n[i] = H[i];
     }
     pa_aupdate_read_end(u->a_H);
     pa_datum key, data;
-    key.data = (char *) COEFKEY;
+    key.data=name;
     key.size = strlen(key.data);
     data.data = H_n;
     data.size = (u->fft_size / 2 + 1) * sizeof(float);
@@ -724,6 +786,49 @@ void save_state(struct userdata *u){
     pa_database_sync(u->database);
 }
 
+void save_state(struct userdata *u){
+    char *state_name = pa_sprintf_malloc("%s-previous-state", u->name);
+    save_profile(u, state_name);
+    pa_xfree(state_name);
+}
+
+void remove_profile(pa_core *c,char *name){
+    pa_datum key;
+    key.data = name;
+    key.size = strlen(key.data);
+    pa_database *database;
+    pa_assert_se(database = pa_shared_get(c,EQDB));
+    pa_database_unset(database,&key);
+    pa_database_sync(database);
+}
+
+const char* load_profile(struct userdata *u,char *name){
+    pa_datum key,value;
+    key.data = name;
+    key.size = strlen(key.data);
+    if(pa_database_get(u->database, &key, &value) != NULL){
+        if(value.size == (u->fft_size / 2 + 1) * sizeof(float)){
+            float *H=u->Hs[pa_aupdate_write_begin(u->a_H)];
+            memcpy(H, value.data, value.size);
+            pa_aupdate_write_swap(u->a_H);
+            pa_aupdate_write_end(u->a_H);
+        }else{
+            return "incompatible size";
+        }
+        pa_datum_free(&value);
+    }else{
+        return "profile doesn't exist";
+    }
+    return NULL;
+    //fix_filter(u->H, u->fft_size);
+}
+void load_state(struct userdata *u){
+    char *state_name=pa_sprintf_malloc("%s-previous-state", u->name);
+    load_profile(u,state_name);
+    pa_xfree(state_name);
+}
+
+
 /* Called from main context */
 static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) {
     struct userdata *u;
@@ -791,7 +896,7 @@ int pa__init(pa_module*m) {
     u->channels = ss.channels;
     u->fft_size = pow(2, ceil(log(ss.rate)/log(2)));
     pa_log("fft size: %ld", u->fft_size);
-    u->window_size = 7999;
+    u->window_size = 15999;
     u->R = (u->window_size+1)/2;
     u->overlap_size = u->window_size-u->R;
     u->target_samples = 1*u->R;
@@ -851,7 +956,7 @@ int pa__init(pa_module*m) {
         pa_log("Failed to create sink.");
         goto fail;
     }
-
+    u->name=pa_xstrdup(u->sink->name);
     u->sink->parent.process_msg = sink_process_msg;
     u->sink->set_state = sink_set_state;
     u->sink->update_requested_latency = sink_update_requested_latency;
@@ -898,83 +1003,14 @@ int pa__init(pa_module*m) {
 
     pa_xfree(use_default);
 
-    char *dbname;
-    char *pref = pa_sprintf_malloc("equalizer-%s-state", u->sink->name);
-    pa_assert_se(dbname = pa_state_path(pref, TRUE));
-    pa_xfree(pref);
-    pa_assert_se(u->database = pa_database_open(dbname, TRUE));
-    pa_xfree(dbname);
+    dbus_init(u);
 
-    unsigned H_i = pa_aupdate_write_begin(u->a_H);
-    u->H = u->Hs[H_i];
+    //default filter to these
     for(size_t i = 0; i < u->fft_size / 2 + 1; ++i){
-        u->H[i] = 1.0;
+        u->Hs[1][i]=u->Hs[0][i] = 1.0;
     }
-
-    //TODO cut this out and leave it for the client side
-    //const int freqs[] = {0,25,50,100,200,300,400,800,1500,
-    //    2000,3000,4000,5000,6000,7000,8000,9000,10000,11000,12000,
-    //    13000,14000,15000,16000,17000,18000,19000,20000,21000,22000,23000,24000,INT_MAX};
-    //const float coefficients[] = {1,1,1,1,1,1,1,1,1,1,
-    //    1,1,1,1,1,1,1,1,
-    //    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
-    //const size_t ncoefficients = sizeof(coefficients)/sizeof(float);
-    //pa_assert_se(sizeof(freqs)/sizeof(int)==sizeof(coefficients)/sizeof(float));
-    //float *freq_translated = (float *) pa_xmalloc0(sizeof(float)*(ncoefficients));
-    //freq_translated[0] = 1;
-    ////Translate the frequencies in their natural sampling rate to the new sampling rate frequencies
-    //for(size_t i = 1; i < ncoefficients-1; ++i){
-    //    freq_translated[i] = ((float)freqs[i]*u->fft_size)/ss.rate;
-    //    //pa_log("i: %ld: %d , %g",i, freqs[i], freq_translated[i]);
-    //    pa_assert_se(freq_translated[i] >= freq_translated[i-1]);
-    //}
-    //freq_translated[ncoefficients-1] = FLT_MAX;
-    //
-    ////Interpolate the specified frequency band values
-    //u->H[0] = 1;
-    //for(size_t i = 1, j = 0; i < (u->fft_size / 2 + 1); ++i){
-    //    pa_assert_se(j < ncoefficients);
-    //    //max frequency range passed, consider the rest as one band
-    //    if(freq_translated[j+1] >= FLT_MAX){
-    //        for(; i < (u->fft_size / 2 + 1); ++i){
-    //            u->H[i] = coefficients[j];
-    //        }
-    //        break;
-    //    }
-    //    //pa_log("i: %d, j: %d, freq: %f", i, j, freq_translated[j]);
-    //    //pa_log("interp: %0.4f %0.4f", freq_translated[j], freq_translated[j+1]);
-    //    pa_assert_se(freq_translated[j] < freq_translated[j+1]);
-    //    pa_assert_se(i >= freq_translated[j]);
-    //    pa_assert_se(i <= freq_translated[j+1]);
-    //    //bilinear-inerpolation of coefficients specified
-    //    float c0 = (i-freq_translated[j])/(freq_translated[j+1]-freq_translated[j]);
-    //    pa_assert_se(c0 >= 0&&c0 <= 1.0);
-    //    u->H[i] = ((1.0f-c0)*coefficients[j]+c0*coefficients[j+1]);
-    //    pa_assert_se(u->H[i]>0);
-    //    while(i >= floor(freq_translated[j+1])){
-    //        j++;
-    //    }
-    //}
-    //pa_xfree(freq_translated);
-
     //load old parameters
-    pa_datum key,value;
-    key.data = (char *) COEFKEY;
-    key.size = strlen(key.data);
-    if (pa_database_get(u->database, &key, &value) != NULL){
-        if(value.size == (u->fft_size / 2 + 1) * sizeof(float)){
-            memcpy(u->H, value.data, (u->fft_size / 2 + 1) * sizeof(float));
-        }
-        pa_datum_free(&value);
-    }
-
-    fix_filter(u->H, u->fft_size);
-    pa_aupdate_write_swap(u->a_H);
-    pa_aupdate_write_end(u->a_H);
-
-
-
-    dbus_init(u);
+    load_state(u);
 
     return 0;
 
@@ -1007,7 +1043,6 @@ void pa__done(pa_module*m) {
         return;
 
     save_state(u);
-    pa_database_close(u->database);
 
     dbus_done(u);
 
@@ -1042,22 +1077,130 @@ void pa__done(pa_module*m) {
         pa_xfree(u->Hs[i]);
     }
 
+    pa_xfree(u->name);
+
     pa_xfree(u);
 }
 
-enum property_handler_index {
-    PROPERTY_HANDLER_SAMPLERATE,
-    PROPERTY_HANDLER_FILTERSAMPLERATE,
-    PROPERTY_HANDLER_N_COEFS,
-    PROPERTY_HANDLER_COEFS,
-    PROPERTY_HANDLER_MAX
+enum manager_method_index {
+    MANAGER_METHOD_REMOVE_PROFILE,
+    MANAGER_METHOD_MAX
+};
+
+pa_dbus_arg_info remove_profile_args[]={
+    {"name", "s","in"},
+};
+
+static pa_dbus_method_handler manager_methods[MANAGER_METHOD_MAX]={
+    [MANAGER_METHOD_REMOVE_PROFILE]{
+        .method_name="RemoveProfile",
+        .arguments=remove_profile_args,
+        .n_arguments=sizeof(remove_profile_args)/sizeof(pa_dbus_arg_info),
+        .receive_cb=manager_handle_remove_profile}
+};
+
+enum manager_handler_index {
+    MANAGER_HANDLER_REVISION,
+    MANAGER_HANDLER_EQUALIZED_SINKS,
+    MANAGER_HANDLER_PROFILES,
+    MANAGER_HANDLER_MAX
+};
+
+static pa_dbus_property_handler manager_handlers[MANAGER_HANDLER_MAX]={
+    [MANAGER_HANDLER_REVISION]={.property_name="InterfaceRevision",.type="u",.get_cb=manager_get_revision,.set_cb=NULL},
+    [MANAGER_HANDLER_EQUALIZED_SINKS]={.property_name="EqualizedSinks",.type="ao",.get_cb=manager_get_sinks,.set_cb=NULL},
+    [MANAGER_HANDLER_PROFILES]={.property_name="Profiles",.type="as",.get_cb=manager_get_profiles,.set_cb=NULL}
+};
+
+static pa_dbus_interface_info manager_info={
+    .name=EXTNAME ".Manager",
+    .method_handlers=manager_methods,
+    .n_method_handlers=MANAGER_METHOD_MAX,
+    .property_handlers=manager_handlers,
+    .n_property_handlers=MANAGER_HANDLER_MAX,
+    .get_all_properties_cb=manager_get_all,
+    .signals=NULL,
+    .n_signals=0
+};
+
+
+enum equalizer_method_index {
+    EQUALIZER_METHOD_FILTER_POINTS,
+    EQUALIZER_METHOD_SEED_FILTER,
+    EQUALIZER_METHOD_SAVE_PROFILE,
+    EQUALIZER_METHOD_LOAD_PROFILE,
+    EQUALIZER_METHOD_SET_FILTER,
+    EQUALIZER_METHOD_GET_FILTER,
+    EQUALIZER_METHOD_MAX
+};
+
+enum equalizer_handler_index {
+    EQUALIZER_HANDLER_REVISION,
+    EQUALIZER_HANDLER_SAMPLERATE,
+    EQUALIZER_HANDLER_FILTERSAMPLERATE,
+    EQUALIZER_HANDLER_N_COEFS,
+    EQUALIZER_HANDLER_MAX
+};
+
+pa_dbus_arg_info filter_points_args[]={
+    {"xs", "au","in"},
+    {"ys", "ad","out"},
+};
+pa_dbus_arg_info seed_filter_args[]={
+    {"xs", "au","in"},
+    {"ys", "ad","in"},
+};
+pa_dbus_arg_info save_profile_args[]={
+    {"name", "s","in"},
+};
+pa_dbus_arg_info load_profile_args[]={
+    {"name", "s","in"},
+};
+pa_dbus_arg_info set_filter_args[]={
+    {"coefficients", "ad","in"},
+};
+pa_dbus_arg_info get_filter_args[]={
+    {"coefficients", "ad","out"},
+};
+
+static pa_dbus_method_handler equalizer_methods[EQUALIZER_METHOD_MAX]={
+    [EQUALIZER_METHOD_SEED_FILTER]{
+        .method_name="SeedFilter",
+        .arguments=seed_filter_args,
+        .n_arguments=sizeof(seed_filter_args)/sizeof(pa_dbus_arg_info),
+        .receive_cb=equalizer_handle_seed_filter},
+    [EQUALIZER_METHOD_FILTER_POINTS]{
+        .method_name="FilterAtPoints",
+        .arguments=filter_points_args,
+        .n_arguments=sizeof(filter_points_args)/sizeof(pa_dbus_arg_info),
+        .receive_cb=equalizer_handle_get_filter_points},
+    [EQUALIZER_METHOD_SAVE_PROFILE]{
+        .method_name="SaveProfile",
+        .arguments=save_profile_args,
+        .n_arguments=sizeof(save_profile_args)/sizeof(pa_dbus_arg_info),
+        .receive_cb=equalizer_handle_save_profile},
+    [EQUALIZER_METHOD_LOAD_PROFILE]{
+        .method_name="LoadProfile",
+        .arguments=load_profile_args,
+        .n_arguments=sizeof(load_profile_args)/sizeof(pa_dbus_arg_info),
+        .receive_cb=equalizer_handle_load_profile},
+    [EQUALIZER_METHOD_SET_FILTER]{
+        .method_name="SetFilterCoefficients",
+        .arguments=set_filter_args,
+        .n_arguments=sizeof(set_filter_args)/sizeof(pa_dbus_arg_info),
+        .receive_cb=equalizer_set_filter},
+    [EQUALIZER_METHOD_GET_FILTER]{
+        .method_name="GetFilterCoefficients",
+        .arguments=get_filter_args,
+        .n_arguments=sizeof(get_filter_args)/sizeof(pa_dbus_arg_info),
+        .receive_cb=equalizer_get_filter}
 };
 
-static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX]={
-    [PROPERTY_HANDLER_SAMPLERATE]{.property_name="SampleRate",.type="u",.get_cb=get_sample_rate,.set_cb=NULL},
-    [PROPERTY_HANDLER_FILTERSAMPLERATE]{.property_name="FilterSampleRate",.type="u",.get_cb=get_filter_rate,.set_cb=NULL},
-    [PROPERTY_HANDLER_N_COEFS]{.property_name="NFilterCoefficients",.type="u",.get_cb=get_n_coefs,.set_cb=NULL},
-    [PROPERTY_HANDLER_COEFS]{.property_name="FilterCoefficients",.type="ai",.get_cb=get_filter,.set_cb=set_filter}
+static pa_dbus_property_handler equalizer_handlers[EQUALIZER_HANDLER_MAX]={
+    [EQUALIZER_HANDLER_REVISION]={.property_name="InterfaceRevision",.type="u",.get_cb=equalizer_get_revision,.set_cb=NULL},
+    [EQUALIZER_HANDLER_SAMPLERATE]{.property_name="SampleRate",.type="u",.get_cb=equalizer_get_sample_rate,.set_cb=NULL},
+    [EQUALIZER_HANDLER_FILTERSAMPLERATE]{.property_name="FilterSampleRate",.type="u",.get_cb=equalizer_get_filter_rate,.set_cb=NULL},
+    [EQUALIZER_HANDLER_N_COEFS]{.property_name="NFilterCoefficients",.type="u",.get_cb=equalizer_get_n_coefs,.set_cb=NULL},
 };
 
 //static pa_dbus_arg_info new_equalizer_args[] = { { "path","o",NULL} };
@@ -1065,37 +1208,354 @@ static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX]={
 //    [SIGNAL_NEW_EQUALIZER]={.name="NewEqualizer",.arguments=new_equalizer_args,.n_arguments=1}
 //};
 
-#define EXTNAME "org.PulseAudio.Ext.Equalizing1"
-
-static pa_dbus_interface_info interface_info={
+static pa_dbus_interface_info equalizer_info={
     .name=EXTNAME ".Equalizer",
-    .method_handlers=NULL,
-    .n_method_handlers=0,
-    .property_handlers=property_handlers,
-    .n_property_handlers=PROPERTY_HANDLER_MAX,
-    .get_all_properties_cb=handle_get_all,
+    .method_handlers=equalizer_methods,
+    .n_method_handlers=EQUALIZER_METHOD_MAX,
+    .property_handlers=equalizer_handlers,
+    .n_property_handlers=EQUALIZER_HANDLER_MAX,
+    .get_all_properties_cb=equalizer_get_all,
     .signals=NULL,
     .n_signals=0
 };
 
-
 void dbus_init(struct userdata *u){
     u->dbus_protocol=pa_dbus_protocol_get(u->core);
     u->dbus_path=pa_sprintf_malloc("/org/pulseaudio/core1/sink%d", u->sink->index);
 
-    pa_dbus_protocol_add_interface(u->dbus_protocol, u->dbus_path, &interface_info, u);
-    pa_dbus_protocol_register_extension(u->dbus_protocol, EXTNAME);
+    pa_dbus_protocol_add_interface(u->dbus_protocol, u->dbus_path, &equalizer_info, u);
+    pa_idxset *sink_list=pa_shared_get(u->core,SINKLIST);
+    u->database=pa_shared_get(u->core,EQDB);
+    if(sink_list==NULL){
+        sink_list=pa_idxset_new(&pa_idxset_trivial_hash_func, &pa_idxset_trivial_compare_func);
+        pa_shared_set(u->core, SINKLIST, sink_list);
+        char *dbname;
+        pa_assert_se(dbname = pa_state_path("equalizers", TRUE));
+        pa_assert_se(u->database = pa_database_open(dbname, TRUE));
+        pa_xfree(dbname);
+        pa_shared_set(u->core,EQDB,u->database);
+        pa_dbus_protocol_add_interface(u->dbus_protocol, MANAGER_PATH, &manager_info, u->core);
+        pa_dbus_protocol_register_extension(u->dbus_protocol, EXTNAME);
+    }
+    uint32_t dummy;
+    pa_idxset_put(sink_list,u,&dummy);
 }
 
 void dbus_done(struct userdata *u){
-    pa_dbus_protocol_unregister_extension(u->dbus_protocol, EXTNAME);
-    pa_dbus_protocol_remove_interface(u->dbus_protocol, u->dbus_path, interface_info.name);
-    
+    pa_idxset *sink_list;
+    uint32_t dummy;
+
+    pa_assert_se(sink_list=pa_shared_get(u->core,SINKLIST));
+    pa_idxset_remove_by_data(sink_list,u,&dummy);
+    if(pa_idxset_size(sink_list)==0){
+        pa_dbus_protocol_unregister_extension(u->dbus_protocol, EXTNAME);
+        pa_dbus_protocol_remove_interface(u->dbus_protocol, MANAGER_PATH, manager_info.name);
+        pa_shared_remove(u->core, EQDB);
+        pa_database_close(u->database);
+        pa_shared_remove(u->core, SINKLIST);
+        pa_xfree(sink_list);
+    }
+    pa_dbus_protocol_remove_interface(u->dbus_protocol, u->dbus_path, equalizer_info.name);
     pa_xfree(u->dbus_path);
     pa_dbus_protocol_unref(u->dbus_protocol);
 }
 
-void get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u){
+void manager_handle_remove_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
+    DBusError error;
+    pa_core *c = (pa_core *)_u;
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(c);
+    dbus_error_init(&error);
+    char *name;
+    if(!dbus_message_get_args(msg, &error,
+                 DBUS_TYPE_STRING, &name,
+                DBUS_TYPE_INVALID)){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
+        dbus_error_free(&error);
+        return;
+    }
+    remove_profile(c,name);
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+void manager_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){
+    uint32_t rev=1;
+    pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_UINT32, &rev);
+}
+
+void manager_get_sinks(DBusConnection *conn, DBusMessage *msg, void *_u){
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(_u);
+
+    pa_core *c = (pa_core *)_u;
+    pa_idxset *sink_list;
+    uint32_t dummy;
+
+    pa_assert_se(sink_list = pa_shared_get(c, SINKLIST));
+    unsigned n_sinks = (unsigned) pa_idxset_size(sink_list);
+    char **names = NULL;
+    void *iter = NULL;
+    struct userdata *sink_u = NULL;
+    pa_assert_se(names = pa_xnew0(char *,n_sinks));
+    for(uint32_t i = 0; i < n_sinks; ++i){
+        sink_u=(struct userdata *) pa_idxset_iterate(sink_list, &iter, &dummy);
+        names[i] = sink_u->dbus_path;
+    }
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, names, n_sinks);
+    pa_xfree(names);
+}
+
+void manager_get_profiles(DBusConnection *conn, DBusMessage *msg, void *_u){
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(_u);
+
+    pa_core *core=_u;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter, array_iter;
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "s", &array_iter));
+
+    char *name;
+    pa_datum key,next_key;
+    int done;
+    pa_database *database;
+    pa_assert_se(database=pa_shared_get(core, EQDB));
+    done = !pa_database_first(database, &key, NULL);
+
+    while(!done){
+        done = !pa_database_next(database, &key, &next_key, NULL);
+        name=pa_xmalloc(key.size + 1);
+        memcpy(name, key.data, key.size);
+        name[key.size] = '\0';
+        pa_datum_free(&key);
+        dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &name);
+        pa_xfree(name);
+        key = next_key;
+    }
+    dbus_message_iter_close_container(&msg_iter, &array_iter);
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+    dbus_message_unref(reply);
+}
+
+void manager_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(_u);
+
+    pa_core *u=(pa_core *) _u;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter, dict_iter, sub_iter, array_iter;
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    uint32_t rev=1;
+    pa_idxset *sink_list;
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, manager_handlers[MANAGER_HANDLER_REVISION].property_name, DBUS_TYPE_UINT32, &rev);
+
+    pa_assert_se(sink_list = pa_shared_get(u, SINKLIST));
+    unsigned n_sinks = (unsigned) pa_idxset_size(sink_list);
+    char **names = NULL;
+    void *iter = NULL;
+    struct userdata *sink_u = NULL;
+    pa_assert_se(names = pa_xnew0(char *,n_sinks));
+    for(uint32_t i = 0; i < n_sinks; ++i){
+        unsigned dummy;
+        sink_u=(struct userdata *) pa_idxset_iterate(sink_list, &iter, &dummy);
+        names[i] = sink_u->dbus_path;
+    }
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, manager_handlers[MANAGER_HANDLER_EQUALIZED_SINKS].property_name, DBUS_TYPE_OBJECT_PATH, names, n_sinks);
+    pa_xfree(names);
+
+    pa_database *database;
+    pa_assert_se(database=pa_shared_get(u, EQDB));
+
+    pa_datum key,next_key;
+    char *profile_name;
+    int done;
+    done = !pa_database_first(database, &key, NULL);
+    dbus_message_iter_open_container(&dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &sub_iter);
+    dbus_message_iter_append_basic(&sub_iter, DBUS_TYPE_STRING, &manager_handlers[MANAGER_HANDLER_PROFILES].property_name);
+
+    dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_ARRAY, "s", &array_iter);
+    while(!done){
+        done = !pa_database_next(database, &key, &next_key, NULL);
+        profile_name=pa_xmalloc(key.size + 1);
+        memcpy(profile_name, key.data, key.size);
+        profile_name[key.size] = '\0';
+        pa_datum_free(&key);
+        dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &profile_name);
+        pa_xfree(profile_name);
+        key = next_key;
+    }
+    pa_assert_se(dbus_message_iter_close_container(&sub_iter, &array_iter));
+    pa_assert_se(dbus_message_iter_close_container(&dict_iter, &sub_iter));
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+    dbus_message_unref(reply);
+}
+
+void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *_u) {
+    struct userdata *u=(struct userdata *) _u;
+    DBusError error;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(u);
+    float *ys;
+    uint32_t *xs;
+    double *_ys;
+    unsigned x_npoints,y_npoints;
+
+    dbus_error_init(&error);
+
+    if(!dbus_message_get_args(msg, &error,
+                DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &xs, &x_npoints,
+                DBUS_TYPE_ARRAY, DBUS_TYPE_DOUBLE, &_ys, &y_npoints,
+                DBUS_TYPE_INVALID)){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
+        dbus_error_free(&error);
+        return;
+    }
+    int points_good=1;
+    for(size_t i = 0; i < x_npoints; ++i){
+        if(xs[i] >= u->fft_size / 2 + 1){
+            points_good=0;
+            break;
+        }
+    }
+    if(!is_monotonic(xs,x_npoints) || !points_good){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs must be monotonic and 0<x<%ld", u->fft_size / 2);
+        dbus_error_free(&error);
+        return;
+
+    }
+    else if(x_npoints != y_npoints || x_npoints < 2 || x_npoints > u->fft_size / 2 +1  ){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs and ys must be the same length and 2<=l<=%ld!", u->fft_size / 2 + 1);
+        dbus_error_free(&error);
+        return;
+    }
+
+    ys = pa_xmalloc(x_npoints * sizeof(float));
+    for(uint32_t i = 0; i < x_npoints; ++i){
+        ys[i] = (float) _ys[i];
+    }
+
+    float *H = u->Hs[pa_aupdate_write_begin(u->a_H)];
+    interpolate(H, u->fft_size / 2 + 1, xs, ys, x_npoints);
+    fix_filter(H, u->fft_size);
+    pa_aupdate_write_swap(u->a_H);
+    pa_aupdate_write_end(u->a_H);
+    pa_xfree(ys);
+
+    //Stupid for IO reasons?  Add a save signal to dbus instead
+    //save_state(u);
+
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg, void *_u) {
+    struct userdata *u=(struct userdata *) _u;
+    DBusError error;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(u);
+    uint32_t *xs;
+    double *ys;
+    unsigned x_npoints;
+
+    dbus_error_init(&error);
+
+    if(!dbus_message_get_args(msg, &error,
+                DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &xs, &x_npoints,
+                DBUS_TYPE_INVALID)){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
+        dbus_error_free(&error);
+        return;
+    }
+    int points_good=1;
+    for(size_t i = 0; i < x_npoints; ++i){
+        if(xs[i] >= u->fft_size / 2 + 1){
+            points_good=0;
+            break;
+        }
+    }
+
+    if(x_npoints > u->fft_size / 2 +1 || !points_good){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs indices/length must be <= %ld!", u->fft_size / 2 + 1);
+        dbus_error_free(&error);
+        return;
+    }
+
+    ys = pa_xmalloc(x_npoints * sizeof(double));
+    float *H = u->Hs[pa_aupdate_read_begin(u->a_H)];
+    for(uint32_t i = 0; i < x_npoints; ++i){
+        ys[i] = H[xs[i]] * u->fft_size;
+    }
+    pa_aupdate_read_end(u->a_H);
+
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_DOUBLE, ys, x_npoints);
+    pa_xfree(ys);
+}
+
+void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
+    struct userdata *u=(struct userdata *) _u;
+    DBusError error;
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(u);
+    dbus_error_init(&error);
+    char *name;
+
+    if(!dbus_message_get_args(msg, &error,
+                 DBUS_TYPE_STRING, &name,
+                DBUS_TYPE_INVALID)){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
+        dbus_error_free(&error);
+        return;
+    }
+    save_profile(u,name);
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
+    struct userdata *u=(struct userdata *) _u;
+    DBusError error;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(u);
+    dbus_error_init(&error);
+    char *name;
+
+    if(!dbus_message_get_args(msg, &error,
+                 DBUS_TYPE_STRING, &name,
+                DBUS_TYPE_INVALID)){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
+        dbus_error_free(&error);
+        return;
+    }
+    const char *err_msg=load_profile(u,name);
+    if(err_msg!=NULL){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "error loading profile %s: %s", name,err_msg);
+        dbus_error_free(&error);
+        return;
+    }
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
+void equalizer_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){
+    uint32_t rev=1;
+    pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_UINT32, &rev);
+}
+
+void equalizer_get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(_u);
@@ -1106,7 +1566,7 @@ void get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &n_coefs);
 }
 
-void get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
+void equalizer_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(_u);
@@ -1115,7 +1575,8 @@ void get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
     uint32_t rate=(uint32_t) u->sink->sample_spec.rate;
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &rate);
 }
-void get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
+
+void equalizer_get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(_u);
@@ -1125,7 +1586,34 @@ void get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &fft_size);
 }
 
-void get_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
+void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(_u);
+
+    struct userdata *u=(struct userdata *) _u;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter, dict_iter;
+    uint32_t rev=1;
+    uint32_t n_coefs=(uint32_t)(u->fft_size / 2 + 1);
+    uint32_t rate=(uint32_t) u->sink->sample_spec.rate;
+    uint32_t fft_size=(uint32_t) u->fft_size;
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_REVISION].property_name, DBUS_TYPE_UINT32, &rev);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_SAMPLERATE].property_name, DBUS_TYPE_UINT32, &rate);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_FILTERSAMPLERATE].property_name, DBUS_TYPE_UINT32, &fft_size);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_N_COEFS].property_name, DBUS_TYPE_UINT32, &n_coefs);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+    dbus_message_unref(reply);
+}
+
+void equalizer_get_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(_u);
@@ -1144,7 +1632,7 @@ void get_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_xfree(H_);
 }
 
-void set_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
+void equalizer_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(_u);
@@ -1152,7 +1640,9 @@ void set_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
     struct userdata *u=(struct userdata *)_u;
     double *H_;
     unsigned _n_coefs;
-    pa_dbus_get_fixed_array_set_property_arg(conn, msg, DBUS_TYPE_DOUBLE, &H_, &_n_coefs);
+    if(pa_dbus_get_fixed_array_set_property_arg(conn, msg, DBUS_TYPE_DOUBLE, &H_, &_n_coefs)){
+        return;
+    }
     if(_n_coefs!=u->fft_size / 2 + 1){
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "This filter takes exactly %ld coefficients, you gave %d", u->fft_size / 2 + 1, _n_coefs);
         return;
@@ -1166,44 +1656,7 @@ void set_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_aupdate_write_end(u->a_H);
 
     //Stupid for IO reasons?  Add a save signal to dbus instead
-    save_state(u);
+    //save_state(u);
 
     pa_dbus_send_empty_reply(conn, msg);
 }
-
-void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
-    pa_assert(conn);
-    pa_assert(msg);
-    pa_assert(_u);
-
-    struct userdata *u = (struct userdata *)_u;
-    DBusMessage *reply = NULL;
-    DBusMessageIter msg_iter, dict_iter;
-
-    uint32_t rate=(uint32_t) u->sink->sample_spec.rate;
-    uint32_t fft_size=(uint32_t) u->fft_size;
-    uint32_t n_coefs=(uint32_t)(u->fft_size / 2 + 1);
-    double *H_=(double *)pa_xmalloc0(n_coefs*sizeof(double));
-    
-    unsigned H_i=pa_aupdate_read_begin(u->a_H);
-    float *H=u->Hs[H_i];
-    for(size_t i = 0; i < u->fft_size / 2 + 1; ++i){
-        H_[i] = H[i];
-    }
-    pa_aupdate_read_end(u->a_H);
-
-    pa_assert_se((reply = dbus_message_new_method_return(msg)));
-    dbus_message_iter_init_append(reply, &msg_iter);
-    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
-
-    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SAMPLERATE].property_name, DBUS_TYPE_UINT32, &rate);
-    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_FILTERSAMPLERATE].property_name, DBUS_TYPE_UINT32, &fft_size);
-    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_N_COEFS].property_name, DBUS_TYPE_UINT32, &n_coefs);
-    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_COEFS].property_name, DBUS_TYPE_DOUBLE, H_, n_coefs);
-
-    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
-    pa_assert_se(dbus_connection_send(conn, reply, NULL));
-    dbus_message_unref(reply);
-
-    pa_xfree(H_);
-}

commit 857eea062129b4b9e04950a9187ebc47fc84899f
Author: Jason Newton <nevion at gmail.com>
Date:   Fri Aug 7 15:08:57 2009 -0700

    module-equalizer-sink:
        add lennard's fix for piggy-back sinks in pop_cb
        fixed some tsched issues

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 285fddb..eb9d6ef 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -549,6 +549,9 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     if (!u->sink || !PA_SINK_IS_OPENED(u->sink->thread_info.state))
         return -1;
 
+    /* Hmm, process any reweind request that might be queued up */
+    pa_sink_process_rewind(u->sink, 0);
+
     //pa_log("start output-buffered %ld, input-buffered %ld, requested %ld",buffered_samples,u->samples_gathered,samples_requested);
     struct timespec start, end;
 
@@ -559,11 +562,11 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     }
 
     /*
-        Set the H filter
-    */
+     *   Set the H filter
+     */
     unsigned H_i = pa_aupdate_read_begin(u->a_H);
     u->H = u->Hs[H_i];
-    
+
     do{
         pa_memchunk *buffer;
         size_t input_remaining = u->target_samples-u->samples_gathered;
@@ -641,14 +644,14 @@ static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
 
         if (amount > 0) {
             //pa_sample_spec *ss = &u->sink->sample_spec;
-            pa_memblockq_seek(u->rendered_q, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
+            //pa_memblockq_seek(u->rendered_q, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
             pa_log_debug("Resetting equalizer");
             u->samples_gathered = 0;
         }
     }
 
     pa_sink_process_rewind(u->sink, amount);
-    pa_memblockq_rewind(u->rendered_q, nbytes);
+    //pa_memblockq_rewind(u->rendered_q, nbytes);
 }
 
 /* Called from I/O thread context */
@@ -677,7 +680,8 @@ static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) {
 
     size_t fs = pa_frame_size(&(u->sink->sample_spec));
     //pa_sink_set_max_request_within_thread(u->sink, nbytes);
-    pa_sink_set_max_request_within_thread(u->sink, u->R*fs);
+    //pa_sink_set_max_request_within_thread(u->sink, u->R*fs);
+    pa_sink_set_max_request_within_thread(u->sink, ((nbytes+u->R*fs-1)/(u->R*fs))*(u->R*fs));
 }
 
 /* Called from I/O thread context */
@@ -692,8 +696,8 @@ static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) {
 
     size_t fs = pa_frame_size(&(u->sink->sample_spec));
     //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->latency*fs);
-    pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->latency*fs );
-    //pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
+    //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->latency*fs );
+    pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
 }
 
 /* Called from I/O thread context */
@@ -924,8 +928,8 @@ int pa__init(pa_module*m) {
         memset(u->overlap_accum[c], 0, u->overlap_size*sizeof(float));
     }
     u->output_window = alloc((u->fft_size / 2 + 1), sizeof(fftwf_complex));
-    u->forward_plan = fftwf_plan_dft_r2c_1d(u->fft_size, u->work_buffer, u->output_window, FFTW_MEASURE);
-    u->inverse_plan = fftwf_plan_dft_c2r_1d(u->fft_size, u->output_window, u->work_buffer, FFTW_MEASURE);
+    u->forward_plan = fftwf_plan_dft_r2c_1d(u->fft_size, u->work_buffer, u->output_window, FFTW_ESTIMATE);
+    u->inverse_plan = fftwf_plan_dft_c2r_1d(u->fft_size, u->output_window, u->work_buffer, FFTW_ESTIMATE);
 
     hanning_window(u->W, u->window_size);
 
@@ -965,7 +969,9 @@ int pa__init(pa_module*m) {
 
     pa_sink_set_asyncmsgq(u->sink, master->asyncmsgq);
     pa_sink_set_rtpoll(u->sink, master->rtpoll);
-    pa_sink_set_max_request(u->sink, u->R*fs);
+    pa_sink_set_max_request(u->sink,
+        ((pa_sink_get_max_request(u->sink)+u->R*fs-1)/(u->R*fs))*(u->R*fs)
+    );
     //pa_sink_set_fixed_latency(u->sink, pa_bytes_to_usec(u->R*fs, &ss));
 
     /* Create sink input */

commit 4231ac444fc1492bab58fe12d439c4479ef1f648
Author: Jason Newton <nevion at gmail.com>
Date:   Sat Aug 8 00:53:40 2009 -0700

    module-equalizer-sink: reverted buffering logic back to how the ladspa sink did it

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index eb9d6ef..6311181 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -113,7 +113,7 @@ struct userdata {
     float *Hs[2];//thread updatable copies
     pa_aupdate *a_H;
     pa_memchunk conv_buffer;
-    pa_memblockq *rendered_q;
+    pa_memblockq *input_q;
 
     pa_dbus_protocol *dbus_protocol;
     char *dbus_path;
@@ -138,7 +138,7 @@ void fix_filter(float *H, size_t fft_size);
 void interpolate(float *signal, size_t length, uint32_t *xs, float *ys, size_t n_points);
 static void array_out(const char *name, float *a, size_t length);
 static int is_monotonic(uint32_t *xs, size_t length);
-static void process_samples(struct userdata *u);
+static void process_samples(struct userdata *u, pa_memchunk *tchunk);
 static void input_buffer(struct userdata *u, pa_memchunk *in);
 static void save_profile(struct userdata *u,char *name);
 static void save_state(struct userdata *u);
@@ -273,9 +273,9 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
             if (PA_MSGOBJECT(u->master)->process_msg(PA_MSGOBJECT(u->master), PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL) < 0)
                 usec = 0;
 
-            //usec+=pa_bytes_to_usec(u->latency * fs, ss);
-            //usec+=pa_bytes_to_usec(u->samples_gathered * fs, ss);
-            usec += pa_bytes_to_usec(pa_memblockq_get_length(u->rendered_q), ss);
+            //usec += pa_bytes_to_usec(u->latency * fs, ss);
+            //usec += pa_bytes_to_usec(u->samples_gathered * fs, ss);
+            usec += pa_bytes_to_usec(pa_memblockq_get_length(u->input_q), ss);
             /* Add the latency internal to our sink input on top */
             usec += pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->master->sample_spec);
             *((pa_usec_t*) data) = usec;
@@ -310,8 +310,10 @@ static void sink_request_rewind(pa_sink *s) {
     pa_sink_assert_ref(s);
     pa_assert_se(u = s->userdata);
 
+    //pa_memblockq_drop(u->input_q,pa_memblockq_get_length(u->input_q));
+
     /* Just hand this one over to the master sink */
-    pa_sink_input_request_rewind(u->sink_input, s->thread_info.rewind_nbytes + pa_memblockq_get_length(u->rendered_q), TRUE, FALSE, FALSE);
+    pa_sink_input_request_rewind(u->sink_input, s->thread_info.rewind_nbytes+pa_memblockq_get_length(u->input_q), TRUE, FALSE, FALSE);
 }
 
 /* Called from I/O thread context */
@@ -327,34 +329,28 @@ static void sink_update_requested_latency(pa_sink *s) {
             pa_sink_get_requested_latency_within_thread(s));
 }
 
-static void process_samples(struct userdata *u){
-    pa_memchunk tchunk;
+static void process_samples(struct userdata *u, pa_memchunk *tchunk){
     size_t fs=pa_frame_size(&(u->sink->sample_spec));
-    while(u->samples_gathered >= u->R){
-        float *dst;
-        //pa_log("iter gathered: %ld", u->samples_gathered);
-        //pa_memblockq_drop(u->rendered_q, tchunk.length);
-        tchunk.index=0;
-        tchunk.length=u->R*fs;
-        tchunk.memblock=pa_memblock_new(u->core->mempool, tchunk.length);
-        dst=((float*)pa_memblock_acquire(tchunk.memblock));
-        for(size_t c=0;c < u->channels; c++) {
-            dsp_logic(
-                u->work_buffer,
-                u->input[c],
-                u->overlap_accum[c],
-                u->H,
-                u->W,
-                u->output_window,
-                u
-            );
-            pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst + c, fs, u->work_buffer, sizeof(float), u->R);
-        }
-        pa_memblock_release(tchunk.memblock);
-        pa_memblockq_push(u->rendered_q, &tchunk);
-        pa_memblock_unref(tchunk.memblock);
-        u->samples_gathered-=u->R;
+    pa_assert(u->samples_gathered >= u->R);
+    float *dst;
+    tchunk->index=0;
+    tchunk->length=u->R*fs;
+    tchunk->memblock=pa_memblock_new(u->core->mempool, tchunk->length);
+    dst=((float*)pa_memblock_acquire(tchunk->memblock));
+    for(size_t c=0;c < u->channels; c++) {
+        dsp_logic(
+            u->work_buffer,
+            u->input[c],
+            u->overlap_accum[c],
+            u->H,
+            u->W,
+            u->output_window,
+            u
+        );
+        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst + c, fs, u->work_buffer, sizeof(float), u->R);
     }
+    pa_memblock_release(tchunk->memblock);
+    u->samples_gathered-=u->R;
 }
 
 typedef float v4sf __attribute__ ((__aligned__(v_size*sizeof(float))));
@@ -539,85 +535,59 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     struct userdata *u;
     pa_sink_input_assert_ref(i);
     pa_assert(chunk);
-    pa_assert_se(u = i->userdata);
-    pa_assert_se(u->sink);
+    pa_assert(u = i->userdata);
+    pa_assert(u->sink);
     size_t fs = pa_frame_size(&(u->sink->sample_spec));
-    //size_t samples_requested = nbytes/fs;
-    size_t buffered_samples = pa_memblockq_get_length(u->rendered_q)/fs;
     pa_memchunk tchunk;
     chunk->memblock = NULL;
     if (!u->sink || !PA_SINK_IS_OPENED(u->sink->thread_info.state))
         return -1;
 
-    /* Hmm, process any reweind request that might be queued up */
+    /* Hmm, process any rewind request that might be queued up */
     pa_sink_process_rewind(u->sink, 0);
 
     //pa_log("start output-buffered %ld, input-buffered %ld, requested %ld",buffered_samples,u->samples_gathered,samples_requested);
     struct timespec start, end;
 
-    if(pa_memblockq_peek(u->rendered_q, &tchunk)==0){
-        *chunk = tchunk;
-        pa_memblockq_drop(u->rendered_q, chunk->length);
-        return 0;
-    }
-
-    /*
-     *   Set the H filter
-     */
-    unsigned H_i = pa_aupdate_read_begin(u->a_H);
-    u->H = u->Hs[H_i];
-
     do{
-        pa_memchunk *buffer;
         size_t input_remaining = u->target_samples-u->samples_gathered;
         pa_assert(input_remaining>0);
         //collect samples
 
-        buffer = &u->conv_buffer;
-        buffer->length = input_remaining*fs;
-        buffer->index = 0;
-        pa_memblock_ref(buffer->memblock);
-        pa_sink_render_into(u->sink, buffer);
-
-        //if(u->sink->thread_info.rewind_requested)
-        //    sink_request_rewind(u->sink);
-
-        //pa_memchunk p;
-        //buffer = &p;
-        //pa_sink_render(u->sink, u->R*fs, buffer);
-        //buffer->length = PA_MIN(input_remaining*fs, buffer->length);
-
-        //debug block
-        //pa_memblockq_push(u->rendered_q, buffer);
-        //pa_memblock_unref(buffer->memblock);
-        //goto END;
-
+        //buffer = &u->conv_buffer;
+        //buffer->length = input_remaining*fs;
+        //buffer->index = 0;
+        //pa_memblock_ref(buffer->memblock);
+        //pa_sink_render_into(u->sink, buffer);
+        while(pa_memblockq_peek(u->input_q, &tchunk) < 0){
+            pa_sink_render(u->sink, input_remaining*fs, &tchunk);
+            pa_memblockq_push(u->input_q, &tchunk);
+            pa_memblock_unref(tchunk.memblock);
+        }
+        tchunk.length = PA_MIN(input_remaining*fs, tchunk.length);
+        pa_memblockq_drop(u->input_q,tchunk.length);
         //pa_log("asked for %ld input samples, got %ld samples",input_remaining,buffer->length/fs);
-        //copy new input
+        /* copy new input */
         gettime(start);
-        input_buffer(u, buffer);
+        input_buffer(u, &tchunk);
         gettime(end);
         //pa_log("Took %0.5f seconds to setup", tdiff(end, start)*1e-9);
+        pa_memblock_unref(tchunk.memblock);
+    }while(u->samples_gathered < u->R);
 
-        pa_memblock_unref(buffer->memblock);
-
-        pa_assert_se(u->fft_size >= u->window_size);
-        pa_assert_se(u->R < u->window_size);
-        //process every complete block on hand
-
-        gettime(start);
-        process_samples(u);
-        gettime(end);
-        //pa_log("Took %0.5f seconds to process", tdiff(end, start)*1e-9);
-
-        buffered_samples = pa_memblockq_get_length(u->rendered_q)/fs;
-    }while(buffered_samples < u->R);
+    pa_assert(u->fft_size >= u->window_size);
+    pa_assert(u->R < u->window_size);
+    /* set the H filter */
+    unsigned H_i = pa_aupdate_read_begin(u->a_H);
+    u->H = u->Hs[H_i];
+    gettime(start);
+    /* process a block */
+    process_samples(u,chunk);
+    gettime(end);
+    //pa_log("Took %0.5f seconds to process", tdiff(end, start)*1e-9);
+    pa_aupdate_read_end(u->a_H);
 
-    //deque from rendered_q and output
-    pa_assert_se(pa_memblockq_peek(u->rendered_q, &tchunk)==0);
-    *chunk = tchunk;
-    pa_memblockq_drop(u->rendered_q, chunk->length);
-    pa_assert_se(chunk->memblock);
+    pa_assert(chunk->memblock);
     //pa_log("gave %ld", chunk->length/fs);
     //pa_log("end pop");
     return 0;
@@ -638,20 +608,25 @@ static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
     if (u->sink->thread_info.rewind_nbytes > 0) {
         size_t max_rewrite;
 
-        max_rewrite = nbytes + pa_memblockq_get_length(u->rendered_q);
+        //max_rewrite = nbytes;
+        max_rewrite = nbytes + pa_memblockq_get_length(u->input_q);
+        //PA_MIN(pa_memblockq_get_length(u->input_q), nbytes);
         amount = PA_MIN(u->sink->thread_info.rewind_nbytes, max_rewrite);
         u->sink->thread_info.rewind_nbytes = 0;
 
         if (amount > 0) {
             //pa_sample_spec *ss = &u->sink->sample_spec;
-            //pa_memblockq_seek(u->rendered_q, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
+            //invalidate the output q
+            pa_memblockq_seek(u->input_q, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
+            //pa_memblockq_drop(u->input_q, pa_memblockq_get_length(u->input_q));
+            //pa_memblockq_seek(u->input_q, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
             pa_log_debug("Resetting equalizer");
             u->samples_gathered = 0;
         }
     }
 
     pa_sink_process_rewind(u->sink, amount);
-    //pa_memblockq_rewind(u->rendered_q, nbytes);
+    pa_memblockq_rewind(u->input_q, nbytes);
 }
 
 /* Called from I/O thread context */
@@ -664,7 +639,7 @@ static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) {
     if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
         return;
 
-    pa_memblockq_set_maxrewind(u->rendered_q, nbytes);
+    pa_memblockq_set_maxrewind(u->input_q, nbytes);
     pa_sink_set_max_rewind_within_thread(u->sink, nbytes);
 }
 
@@ -694,7 +669,6 @@ static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) {
     if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
         return;
 
-    size_t fs = pa_frame_size(&(u->sink->sample_spec));
     //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->latency*fs);
     //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->latency*fs );
     pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
@@ -729,14 +703,14 @@ static void sink_input_attach_cb(pa_sink_input *i) {
     pa_sink_set_rtpoll(u->sink, i->sink->rtpoll);
     pa_sink_attach_within_thread(u->sink);
 
-    size_t fs = pa_frame_size(&(u->sink->sample_spec));
+    //size_t fs = pa_frame_size(&(u->sink->sample_spec));
     //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->latency*fs);
     //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->master->thread_info.max_latency);
     //TODO: setting this guy minimizes drop outs but doesn't get rid
     //of them completely, figure out why
-    pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->latency*fs);
+    //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->latency*fs);
     //TODO: this guy causes dropouts constantly+rewinds, it's unusable
-    //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->master->thread_info.max_latency);
+    pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->master->thread_info.max_latency);
 }
 
 /* Called from main context */
@@ -906,7 +880,7 @@ int pa__init(pa_module*m) {
     u->target_samples = 1*u->R;
     u->samples_gathered = 0;
     u->max_output = pa_frame_align(pa_mempool_block_size_max(m->core->mempool), &ss)/pa_frame_size(&ss);
-    u->rendered_q = pa_memblockq_new(0,  MEMBLOCKQ_MAXLENGTH, u->target_samples*fs, fs, fs, 0, 0, NULL);
+    u->input_q = pa_memblockq_new(0,  MEMBLOCKQ_MAXLENGTH, 0, fs, 1, 1, 0, NULL);
     u->a_H = pa_aupdate_new();
     u->conv_buffer.memblock = pa_memblock_new(u->core->mempool, u->target_samples*fs);
     u->latency = u->R;
@@ -1062,11 +1036,9 @@ void pa__done(pa_module*m) {
         pa_sink_input_unref(u->sink_input);
     }
 
-    if(u->conv_buffer.memblock)
-        pa_memblock_unref(u->conv_buffer.memblock);
-
-    if (u->rendered_q)
-        pa_memblockq_free(u->rendered_q);
+    pa_aupdate_free(u->a_H);
+    pa_memblock_unref(u->conv_buffer.memblock);
+    pa_memblockq_free(u->input_q);
 
     fftwf_destroy_plan(u->inverse_plan);
     fftwf_destroy_plan(u->forward_plan);

commit 1e3c7d326f4feb2e8dca8626afa58e88bca40fcd
Author: Jason Newton <nevion at gmail.com>
Date:   Sat Aug 8 22:20:05 2009 -0700

    module-equalizer-sink:
        dbus:
            eliminated some redundant code in dbus handlers/getall
            switched filter back to being a property
            signals for changed profiles, added/removed sinks, filter updates and sink reconfigurations
        fixed timing routines

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 6311181..88c1074 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -52,6 +52,7 @@ USA.
 #include <pulsecore/sample-util.h>
 #include <pulsecore/shared.h>
 #include <pulsecore/idxset.h>
+#include <pulsecore/strlist.h>
 #include <pulsecore/database.h>
 #include <pulsecore/protocol-dbus.h>
 #include <pulsecore/dbus-util.h>
@@ -161,10 +162,14 @@ void dsp_logic(
  */
 #define EXTNAME "org.PulseAudio.Ext.Equalizing1"
 #define MANAGER_PATH "/org/pulseaudio/equalizing1"
+#define MANAGER_IFACE EXTNAME ".Manager"
+#define EQUALIZER_IFACE EXTNAME ".Equalizer"
 static void dbus_init(struct userdata *u);
 static void dbus_done(struct userdata *u);
 static void manager_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void get_sinks(pa_core *u, char ***names, unsigned *n_sinks);
 static void manager_get_sinks(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void get_profiles(pa_core *u, char ***names, unsigned *n_sinks);
 static void manager_get_profiles(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void manager_get_all(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void manager_handle_remove_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
@@ -179,6 +184,8 @@ static void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg,
 static void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void get_filter(struct userdata *u, double **H_);
+static void set_filter(struct userdata *u, double **H_);
 
 #define v_size 4
 #define gettime(x) clock_gettime(CLOCK_MONOTONIC, &x)
@@ -471,8 +478,6 @@ void dsp_logic(
 //        d->v = d->v*h->v;
 //#endif
 //    }
-//
-//
 //    //inverse fft
 //    fftwf_execute_dft_c2r(u->inverse_plan, output_window, dst);
 //
@@ -511,8 +516,6 @@ void dsp_logic(
 //    );
 //}
 
-
-
 void input_buffer(struct userdata *u, pa_memchunk *in){
     size_t fs = pa_frame_size(&(u->sink->sample_spec));
     size_t samples = in->length/fs;
@@ -546,9 +549,9 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     /* Hmm, process any rewind request that might be queued up */
     pa_sink_process_rewind(u->sink, 0);
 
-    //pa_log("start output-buffered %ld, input-buffered %ld, requested %ld",buffered_samples,u->samples_gathered,samples_requested);
+    //pa_log_debug("start output-buffered %ld, input-buffered %ld, requested %ld",buffered_samples,u->samples_gathered,samples_requested);
     struct timespec start, end;
-
+    gettime(start);
     do{
         size_t input_remaining = u->target_samples-u->samples_gathered;
         pa_assert(input_remaining>0);
@@ -565,15 +568,17 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
             pa_memblock_unref(tchunk.memblock);
         }
         tchunk.length = PA_MIN(input_remaining*fs, tchunk.length);
-        pa_memblockq_drop(u->input_q,tchunk.length);
-        //pa_log("asked for %ld input samples, got %ld samples",input_remaining,buffer->length/fs);
+        pa_memblockq_drop(u->input_q, tchunk.length);
+        //pa_log_debug("asked for %ld input samples, got %ld samples",input_remaining,buffer->length/fs);
         /* copy new input */
-        gettime(start);
+        //gettime(start);
         input_buffer(u, &tchunk);
-        gettime(end);
-        //pa_log("Took %0.5f seconds to setup", tdiff(end, start)*1e-9);
+        //gettime(end);
+        //pa_log_debug("Took %0.5f seconds to setup", tdiff(end, start)*1e-9);
         pa_memblock_unref(tchunk.memblock);
     }while(u->samples_gathered < u->R);
+    gettime(end);
+    pa_log_debug("Took %0.6f seconds to get data", tdiff(end, start)*1e-9);
 
     pa_assert(u->fft_size >= u->window_size);
     pa_assert(u->R < u->window_size);
@@ -584,12 +589,12 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     /* process a block */
     process_samples(u,chunk);
     gettime(end);
-    //pa_log("Took %0.5f seconds to process", tdiff(end, start)*1e-9);
+    pa_log_debug("Took %0.6f seconds to process", tdiff(end, start)*1e-9);
     pa_aupdate_read_end(u->a_H);
 
     pa_assert(chunk->memblock);
-    //pa_log("gave %ld", chunk->length/fs);
-    //pa_log("end pop");
+    //pa_log_debug("gave %ld", chunk->length/fs);
+    //pa_log_debug("end pop");
     return 0;
 }
 
@@ -1090,25 +1095,39 @@ static pa_dbus_property_handler manager_handlers[MANAGER_HANDLER_MAX]={
     [MANAGER_HANDLER_PROFILES]={.property_name="Profiles",.type="as",.get_cb=manager_get_profiles,.set_cb=NULL}
 };
 
+pa_dbus_arg_info sink_args[]={
+    {"sink", "o", NULL}
+};
+
+enum manager_signal_index{
+    MANAGER_SIGNAL_SINK_ADDED,
+    MANAGER_SIGNAL_SINK_REMOVED,
+    MANAGER_SIGNAL_PROFILES_CHANGED,
+    MANAGER_SIGNAL_MAX
+};
+
+static pa_dbus_signal_info manager_signals[MANAGER_SIGNAL_MAX]={
+    [MANAGER_SIGNAL_SINK_ADDED]={.name="SinkAdded", .arguments=sink_args, .n_arguments=sizeof(sink_args)/sizeof(pa_dbus_arg_info)},
+    [MANAGER_SIGNAL_SINK_REMOVED]={.name="SinkRemoved", .arguments=sink_args, .n_arguments=sizeof(sink_args)/sizeof(pa_dbus_arg_info)},
+    [MANAGER_SIGNAL_PROFILES_CHANGED]={.name="ProfilesChanged", .arguments=NULL, .n_arguments=0}
+};
+
 static pa_dbus_interface_info manager_info={
-    .name=EXTNAME ".Manager",
+    .name=MANAGER_IFACE,
     .method_handlers=manager_methods,
     .n_method_handlers=MANAGER_METHOD_MAX,
     .property_handlers=manager_handlers,
     .n_property_handlers=MANAGER_HANDLER_MAX,
     .get_all_properties_cb=manager_get_all,
-    .signals=NULL,
-    .n_signals=0
+    .signals=manager_signals,
+    .n_signals=MANAGER_SIGNAL_MAX
 };
 
-
 enum equalizer_method_index {
     EQUALIZER_METHOD_FILTER_POINTS,
     EQUALIZER_METHOD_SEED_FILTER,
     EQUALIZER_METHOD_SAVE_PROFILE,
     EQUALIZER_METHOD_LOAD_PROFILE,
-    EQUALIZER_METHOD_SET_FILTER,
-    EQUALIZER_METHOD_GET_FILTER,
     EQUALIZER_METHOD_MAX
 };
 
@@ -1117,6 +1136,7 @@ enum equalizer_handler_index {
     EQUALIZER_HANDLER_SAMPLERATE,
     EQUALIZER_HANDLER_FILTERSAMPLERATE,
     EQUALIZER_HANDLER_N_COEFS,
+    EQUALIZER_HANDLER_FILTER,
     EQUALIZER_HANDLER_MAX
 };
 
@@ -1134,12 +1154,6 @@ pa_dbus_arg_info save_profile_args[]={
 pa_dbus_arg_info load_profile_args[]={
     {"name", "s","in"},
 };
-pa_dbus_arg_info set_filter_args[]={
-    {"coefficients", "ad","in"},
-};
-pa_dbus_arg_info get_filter_args[]={
-    {"coefficients", "ad","out"},
-};
 
 static pa_dbus_method_handler equalizer_methods[EQUALIZER_METHOD_MAX]={
     [EQUALIZER_METHOD_SEED_FILTER]{
@@ -1162,16 +1176,6 @@ static pa_dbus_method_handler equalizer_methods[EQUALIZER_METHOD_MAX]={
         .arguments=load_profile_args,
         .n_arguments=sizeof(load_profile_args)/sizeof(pa_dbus_arg_info),
         .receive_cb=equalizer_handle_load_profile},
-    [EQUALIZER_METHOD_SET_FILTER]{
-        .method_name="SetFilterCoefficients",
-        .arguments=set_filter_args,
-        .n_arguments=sizeof(set_filter_args)/sizeof(pa_dbus_arg_info),
-        .receive_cb=equalizer_set_filter},
-    [EQUALIZER_METHOD_GET_FILTER]{
-        .method_name="GetFilterCoefficients",
-        .arguments=get_filter_args,
-        .n_arguments=sizeof(get_filter_args)/sizeof(pa_dbus_arg_info),
-        .receive_cb=equalizer_get_filter}
 };
 
 static pa_dbus_property_handler equalizer_handlers[EQUALIZER_HANDLER_MAX]={
@@ -1179,22 +1183,29 @@ static pa_dbus_property_handler equalizer_handlers[EQUALIZER_HANDLER_MAX]={
     [EQUALIZER_HANDLER_SAMPLERATE]{.property_name="SampleRate",.type="u",.get_cb=equalizer_get_sample_rate,.set_cb=NULL},
     [EQUALIZER_HANDLER_FILTERSAMPLERATE]{.property_name="FilterSampleRate",.type="u",.get_cb=equalizer_get_filter_rate,.set_cb=NULL},
     [EQUALIZER_HANDLER_N_COEFS]{.property_name="NFilterCoefficients",.type="u",.get_cb=equalizer_get_n_coefs,.set_cb=NULL},
+    [EQUALIZER_HANDLER_FILTER]{.property_name="Filter",.type="ad",.get_cb=equalizer_get_filter,.set_cb=equalizer_set_filter},
+};
+
+enum equalizer_signal_index{
+    EQUALIZER_SIGNAL_FILTER_CHANGED,
+    EQUALIZER_SIGNAL_SINK_RECONFIGURED,
+    EQUALIZER_SIGNAL_MAX
 };
 
-//static pa_dbus_arg_info new_equalizer_args[] = { { "path","o",NULL} };
-//static pa_dbus_signal_info signals[SIGNAL_MAX] = {
-//    [SIGNAL_NEW_EQUALIZER]={.name="NewEqualizer",.arguments=new_equalizer_args,.n_arguments=1}
-//};
+static pa_dbus_signal_info equalizer_signals[EQUALIZER_SIGNAL_MAX]={
+    [EQUALIZER_SIGNAL_FILTER_CHANGED]={.name="FilterChanged", .arguments=NULL, .n_arguments=0},
+    [EQUALIZER_SIGNAL_SINK_RECONFIGURED]={.name="SinkReconfigured", .arguments=NULL, .n_arguments=0},
+};
 
 static pa_dbus_interface_info equalizer_info={
-    .name=EXTNAME ".Equalizer",
+    .name=EQUALIZER_IFACE,
     .method_handlers=equalizer_methods,
     .n_method_handlers=EQUALIZER_METHOD_MAX,
     .property_handlers=equalizer_handlers,
     .n_property_handlers=EQUALIZER_HANDLER_MAX,
     .get_all_properties_cb=equalizer_get_all,
-    .signals=NULL,
-    .n_signals=0
+    .signals=equalizer_signals,
+    .n_signals=EQUALIZER_SIGNAL_MAX
 };
 
 void dbus_init(struct userdata *u){
@@ -1202,8 +1213,8 @@ void dbus_init(struct userdata *u){
     u->dbus_path=pa_sprintf_malloc("/org/pulseaudio/core1/sink%d", u->sink->index);
 
     pa_dbus_protocol_add_interface(u->dbus_protocol, u->dbus_path, &equalizer_info, u);
-    pa_idxset *sink_list=pa_shared_get(u->core,SINKLIST);
-    u->database=pa_shared_get(u->core,EQDB);
+    pa_idxset *sink_list=pa_shared_get(u->core, SINKLIST);
+    u->database=pa_shared_get(u->core, EQDB);
     if(sink_list==NULL){
         sink_list=pa_idxset_new(&pa_idxset_trivial_hash_func, &pa_idxset_trivial_compare_func);
         pa_shared_set(u->core, SINKLIST, sink_list);
@@ -1216,13 +1227,25 @@ void dbus_init(struct userdata *u){
         pa_dbus_protocol_register_extension(u->dbus_protocol, EXTNAME);
     }
     uint32_t dummy;
-    pa_idxset_put(sink_list,u,&dummy);
+    pa_idxset_put(sink_list, u, &dummy);
+
+    DBusMessage *signal = NULL;
+    pa_assert_se((signal = dbus_message_new_signal(MANAGER_PATH, MANAGER_IFACE, manager_signals[MANAGER_SIGNAL_SINK_ADDED].name)));
+    dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &u->dbus_path, DBUS_TYPE_INVALID);
+    pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
+    dbus_message_unref(signal);
 }
 
 void dbus_done(struct userdata *u){
     pa_idxset *sink_list;
     uint32_t dummy;
 
+    DBusMessage *signal = NULL;
+    pa_assert_se((signal = dbus_message_new_signal(MANAGER_PATH, MANAGER_IFACE, manager_signals[MANAGER_SIGNAL_SINK_REMOVED].name)));
+    dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &u->dbus_path, DBUS_TYPE_INVALID);
+    pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
+    dbus_message_unref(signal);
+
     pa_assert_se(sink_list=pa_shared_get(u->core,SINKLIST));
     pa_idxset_remove_by_data(sink_list,u,&dummy);
     if(pa_idxset_size(sink_list)==0){
@@ -1255,6 +1278,13 @@ void manager_handle_remove_profile(DBusConnection *conn, DBusMessage *msg, void
     }
     remove_profile(c,name);
     pa_dbus_send_empty_reply(conn, msg);
+
+    DBusMessage *signal = NULL;
+    pa_assert_se((signal = dbus_message_new_signal(MANAGER_PATH, MANAGER_IFACE, manager_signals[MANAGER_SIGNAL_PROFILES_CHANGED].name)));
+    pa_dbus_protocol *dbus_protocol = pa_dbus_protocol_get(c);
+    pa_dbus_protocol_send_signal(dbus_protocol, signal);
+    pa_dbus_protocol_unref(dbus_protocol);
+    dbus_message_unref(signal);
 }
 
 void manager_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){
@@ -1262,62 +1292,85 @@ void manager_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_UINT32, &rev);
 }
 
-void manager_get_sinks(DBusConnection *conn, DBusMessage *msg, void *_u){
-    pa_assert(conn);
-    pa_assert(msg);
-    pa_assert(_u);
-
-    pa_core *c = (pa_core *)_u;
-    pa_idxset *sink_list;
-    uint32_t dummy;
+void get_sinks(pa_core *u, char ***names, unsigned *n_sinks){
+    pa_assert(u);
+    pa_assert(names);
+    pa_assert(n_sinks);
 
-    pa_assert_se(sink_list = pa_shared_get(c, SINKLIST));
-    unsigned n_sinks = (unsigned) pa_idxset_size(sink_list);
-    char **names = NULL;
     void *iter = NULL;
     struct userdata *sink_u = NULL;
-    pa_assert_se(names = pa_xnew0(char *,n_sinks));
-    for(uint32_t i = 0; i < n_sinks; ++i){
-        sink_u=(struct userdata *) pa_idxset_iterate(sink_list, &iter, &dummy);
-        names[i] = sink_u->dbus_path;
+    uint32_t dummy;
+    pa_idxset *sink_list;
+    pa_assert_se(sink_list = pa_shared_get(u, SINKLIST));
+    *n_sinks = (unsigned) pa_idxset_size(sink_list);
+    pa_assert_se(*names = pa_xnew0(char *,*n_sinks));
+    for(uint32_t i = 0; i < *n_sinks; ++i){
+        sink_u = (struct userdata *) pa_idxset_iterate(sink_list, &iter, &dummy);
+        (*names)[i] = pa_xstrdup(sink_u->dbus_path);
     }
-    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, names, n_sinks);
-    pa_xfree(names);
 }
 
-void manager_get_profiles(DBusConnection *conn, DBusMessage *msg, void *_u){
+void manager_get_sinks(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(_u);
 
-    pa_core *core=_u;
-    DBusMessage *reply = NULL;
-    DBusMessageIter msg_iter, array_iter;
-
-    pa_assert_se((reply = dbus_message_new_method_return(msg)));
-    dbus_message_iter_init_append(reply, &msg_iter);
-    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "s", &array_iter));
+    unsigned n;
+    char **names = NULL;
+    get_sinks((pa_core *) _u, &names, &n);
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, names, n);
+    for(unsigned i = 0; i < n; ++i){
+        pa_xfree(names[i]);
+    }
+    pa_xfree(names);
+}
 
+void get_profiles(pa_core *c, char ***names, unsigned *n){
+    pa_assert(c);
+    pa_assert(names);
+    pa_assert(n);
     char *name;
-    pa_datum key,next_key;
-    int done;
     pa_database *database;
-    pa_assert_se(database=pa_shared_get(core, EQDB));
-    done = !pa_database_first(database, &key, NULL);
+    pa_assert_se(database = pa_shared_get(c, EQDB));
+    pa_datum key, next_key;
+    pa_strlist *head=NULL, *iter;
 
+    int done;
+    done = !pa_database_first(database, &key, NULL);
+    *n = 0;
     while(!done){
         done = !pa_database_next(database, &key, &next_key, NULL);
         name=pa_xmalloc(key.size + 1);
         memcpy(name, key.data, key.size);
         name[key.size] = '\0';
         pa_datum_free(&key);
-        dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &name);
+        head = pa_strlist_prepend(head, name);
         pa_xfree(name);
         key = next_key;
+        (*n)++;
     }
-    dbus_message_iter_close_container(&msg_iter, &array_iter);
-    pa_assert_se(dbus_connection_send(conn, reply, NULL));
-    dbus_message_unref(reply);
+    (*names) = pa_xnew0(char *, *n);
+    iter=head;
+    for(unsigned i = 0; i < *n; ++i){
+        (*names)[*n-1-i]=pa_xstrdup(pa_strlist_data(iter));
+        iter=pa_strlist_next(iter);
+    }
+    pa_strlist_free(head);
+}
+
+void manager_get_profiles(DBusConnection *conn, DBusMessage *msg, void *_u){
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(_u);
+
+    char **names;
+    unsigned n;
+    get_profiles((pa_core *)_u, &names, &n);
+    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_STRING, names, n);
+    for(unsigned i = 0; i < n; ++i){
+        pa_xfree(names[i]);
+    }
+    pa_xfree(names);
 }
 
 void manager_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
@@ -1325,54 +1378,31 @@ void manager_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_assert(msg);
     pa_assert(_u);
 
-    pa_core *u=(pa_core *) _u;
+    pa_core *c = (pa_core *)_u;
+    char **names = NULL;
+    unsigned n;
     DBusMessage *reply = NULL;
-    DBusMessageIter msg_iter, dict_iter, sub_iter, array_iter;
+    DBusMessageIter msg_iter, dict_iter;
     pa_assert_se((reply = dbus_message_new_method_return(msg)));
     dbus_message_iter_init_append(reply, &msg_iter);
     pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
 
     uint32_t rev=1;
-    pa_idxset *sink_list;
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, manager_handlers[MANAGER_HANDLER_REVISION].property_name, DBUS_TYPE_UINT32, &rev);
 
-    pa_assert_se(sink_list = pa_shared_get(u, SINKLIST));
-    unsigned n_sinks = (unsigned) pa_idxset_size(sink_list);
-    char **names = NULL;
-    void *iter = NULL;
-    struct userdata *sink_u = NULL;
-    pa_assert_se(names = pa_xnew0(char *,n_sinks));
-    for(uint32_t i = 0; i < n_sinks; ++i){
-        unsigned dummy;
-        sink_u=(struct userdata *) pa_idxset_iterate(sink_list, &iter, &dummy);
-        names[i] = sink_u->dbus_path;
+    get_sinks(c, &names, &n);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter,manager_handlers[MANAGER_HANDLER_EQUALIZED_SINKS].property_name, DBUS_TYPE_OBJECT_PATH, names, n);
+    for(unsigned i = 0; i < n; ++i){
+        pa_xfree(names[i]);
     }
-    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, manager_handlers[MANAGER_HANDLER_EQUALIZED_SINKS].property_name, DBUS_TYPE_OBJECT_PATH, names, n_sinks);
     pa_xfree(names);
 
-    pa_database *database;
-    pa_assert_se(database=pa_shared_get(u, EQDB));
-
-    pa_datum key,next_key;
-    char *profile_name;
-    int done;
-    done = !pa_database_first(database, &key, NULL);
-    dbus_message_iter_open_container(&dict_iter, DBUS_TYPE_DICT_ENTRY, NULL, &sub_iter);
-    dbus_message_iter_append_basic(&sub_iter, DBUS_TYPE_STRING, &manager_handlers[MANAGER_HANDLER_PROFILES].property_name);
-
-    dbus_message_iter_open_container(&sub_iter, DBUS_TYPE_ARRAY, "s", &array_iter);
-    while(!done){
-        done = !pa_database_next(database, &key, &next_key, NULL);
-        profile_name=pa_xmalloc(key.size + 1);
-        memcpy(profile_name, key.data, key.size);
-        profile_name[key.size] = '\0';
-        pa_datum_free(&key);
-        dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &profile_name);
-        pa_xfree(profile_name);
-        key = next_key;
+    get_profiles(c, &names, &n);
+    pa_dbus_append_basic_array_variant_dict_entry(&dict_iter, manager_handlers[MANAGER_HANDLER_PROFILES].property_name, DBUS_TYPE_STRING, names, n);
+    for(unsigned i = 0; i < n; ++i){
+        pa_xfree(names[i]);
     }
-    pa_assert_se(dbus_message_iter_close_container(&sub_iter, &array_iter));
-    pa_assert_se(dbus_message_iter_close_container(&dict_iter, &sub_iter));
+    pa_xfree(names);
     pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
     pa_assert_se(dbus_connection_send(conn, reply, NULL));
     dbus_message_unref(reply);
@@ -1412,11 +1442,14 @@ void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *
         dbus_error_free(&error);
         return;
 
-    }
-    else if(x_npoints != y_npoints || x_npoints < 2 || x_npoints > u->fft_size / 2 +1  ){
+    }else if(x_npoints != y_npoints || x_npoints < 2 || x_npoints > u->fft_size / 2 +1  ){
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs and ys must be the same length and 2<=l<=%ld!", u->fft_size / 2 + 1);
         dbus_error_free(&error);
         return;
+    }else if(xs[0] != 0 || xs[x_npoints-1] != u->fft_size / 2){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs[0] must be 0 and xs[-1]=fft_size/2");
+        dbus_error_free(&error);
+        return;
     }
 
     ys = pa_xmalloc(x_npoints * sizeof(float));
@@ -1435,6 +1468,11 @@ void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *
     //save_state(u);
 
     pa_dbus_send_empty_reply(conn, msg);
+
+    DBusMessage *signal = NULL;
+    pa_assert_se((signal = dbus_message_new_signal(u->dbus_path, EQUALIZER_IFACE, equalizer_signals[EQUALIZER_SIGNAL_FILTER_CHANGED].name)));
+    pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
+    dbus_message_unref(signal);
 }
 
 void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg, void *_u) {
@@ -1500,6 +1538,11 @@ void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void
     }
     save_profile(u,name);
     pa_dbus_send_empty_reply(conn, msg);
+
+    DBusMessage *signal = NULL;
+    pa_assert_se((signal = dbus_message_new_signal(MANAGER_PATH, MANAGER_IFACE, manager_signals[MANAGER_SIGNAL_PROFILES_CHANGED].name)));
+    pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
+    dbus_message_unref(signal);
 }
 
 void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
@@ -1564,6 +1607,15 @@ void equalizer_get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u)
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &fft_size);
 }
 
+void get_filter(struct userdata *u, double **H_){
+    *H_ = pa_xnew0(double, u->fft_size / 2 + 1);
+    float *H=u->Hs[pa_aupdate_read_begin(u->a_H)];
+    for(size_t i = 0;i < u->fft_size / 2 + 1; ++i){
+        (*H_)[i] = H[i] * u->fft_size;
+    }
+    pa_aupdate_read_end(u->a_H);
+}
+
 void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_assert(conn);
     pa_assert(msg);
@@ -1585,6 +1637,10 @@ void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_SAMPLERATE].property_name, DBUS_TYPE_UINT32, &rate);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_FILTERSAMPLERATE].property_name, DBUS_TYPE_UINT32, &fft_size);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_N_COEFS].property_name, DBUS_TYPE_UINT32, &n_coefs);
+    double *H;
+    get_filter(u, &H);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_FILTER].property_name, DBUS_TYPE_UINT32, &H);
+    pa_xfree(H);
 
     pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
     pa_assert_se(dbus_connection_send(conn, reply, NULL));
@@ -1597,44 +1653,46 @@ void equalizer_get_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_assert(_u);
 
     struct userdata *u = (struct userdata *)_u;
-    
-    unsigned n_coefs = (unsigned) (u->fft_size / 2 + 1);
-    double *H_ = (double *) pa_xmalloc0(n_coefs * sizeof(double));
-    
-    float *H=u->Hs[pa_aupdate_read_begin(u->a_H)];
-    for(size_t i = 0;i < u->fft_size / 2 + 1; ++i){
-        H_[i] = H[i] * u->fft_size;
-    }
-    pa_aupdate_read_end(u->a_H);
+    unsigned n_coefs = u->fft_size / 2 + 1;
+    double *H_;
+    get_filter(u, &H_);
     pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_DOUBLE, H_, n_coefs);
     pa_xfree(H_);
 }
 
+void set_filter(struct userdata *u, double **H_){
+    float *H = u->Hs[pa_aupdate_write_begin(u->a_H)];
+    for(size_t i = 0; i < u->fft_size / 2 + 1; ++i){
+        H[i] = (float) (*H_)[i];
+    }
+    fix_filter(H, u->fft_size);
+    pa_aupdate_write_swap(u->a_H);
+    pa_aupdate_write_end(u->a_H);
+}
+
 void equalizer_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(_u);
 
     struct userdata *u=(struct userdata *)_u;
-    double *H_;
+    double *H;
     unsigned _n_coefs;
-    if(pa_dbus_get_fixed_array_set_property_arg(conn, msg, DBUS_TYPE_DOUBLE, &H_, &_n_coefs)){
+    if(pa_dbus_get_fixed_array_set_property_arg(conn, msg, DBUS_TYPE_DOUBLE, &H, &_n_coefs)){
         return;
     }
     if(_n_coefs!=u->fft_size / 2 + 1){
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "This filter takes exactly %ld coefficients, you gave %d", u->fft_size / 2 + 1, _n_coefs);
         return;
     }
-    float *H = u->Hs[pa_aupdate_write_begin(u->a_H)];
-    for(size_t i = 0; i < u->fft_size / 2 + 1; ++i){
-        H[i] = (float) H_[i];
-    }
-    fix_filter(H, u->fft_size);
-    pa_aupdate_write_swap(u->a_H);
-    pa_aupdate_write_end(u->a_H);
-
+    set_filter(u, &H);
     //Stupid for IO reasons?  Add a save signal to dbus instead
     //save_state(u);
 
     pa_dbus_send_empty_reply(conn, msg);
+
+    DBusMessage *signal = NULL;
+    pa_assert_se((signal = dbus_message_new_signal(u->dbus_path, EQUALIZER_IFACE, equalizer_signals[EQUALIZER_SIGNAL_FILTER_CHANGED].name)));
+    pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
+    dbus_message_unref(signal);
 }

commit 684ad6ddb7ab0e8ba11bf6df620b3cf9c1facf8a
Author: Jason Newton <nevion at gmail.com>
Date:   Mon Aug 10 15:33:55 2009 -0700

    module-equalizer-sink:
        proper fix for pa_xmalloc(0) given that 0 is illegal
        fix coefficients in case there's no resume state
        loadprofile now signals filterchanged

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 88c1074..8049a99 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -991,9 +991,13 @@ int pa__init(pa_module*m) {
     dbus_init(u);
 
     //default filter to these
+    float *H=u->Hs[pa_aupdate_write_begin(u->a_H)];
     for(size_t i = 0; i < u->fft_size / 2 + 1; ++i){
-        u->Hs[1][i]=u->Hs[0][i] = 1.0;
+        H[i] = 1.0 / sqrtf(2.0f);
     }
+    fix_filter(H, u->fft_size);
+    pa_aupdate_write_swap(u->a_H);
+    pa_aupdate_write_end(u->a_H);
     //load old parameters
     load_state(u);
 
@@ -1303,7 +1307,7 @@ void get_sinks(pa_core *u, char ***names, unsigned *n_sinks){
     pa_idxset *sink_list;
     pa_assert_se(sink_list = pa_shared_get(u, SINKLIST));
     *n_sinks = (unsigned) pa_idxset_size(sink_list);
-    pa_assert_se(*names = pa_xnew0(char *,*n_sinks));
+    *names = *n_sinks > 0 ? pa_xnew0(char *,*n_sinks) : NULL;
     for(uint32_t i = 0; i < *n_sinks; ++i){
         sink_u = (struct userdata *) pa_idxset_iterate(sink_list, &iter, &dummy);
         (*names)[i] = pa_xstrdup(sink_u->dbus_path);
@@ -1349,7 +1353,7 @@ void get_profiles(pa_core *c, char ***names, unsigned *n){
         key = next_key;
         (*n)++;
     }
-    (*names) = pa_xnew0(char *, *n);
+    (*names) = *n > 0 ? pa_xnew0(char *, *n) : NULL;
     iter=head;
     for(unsigned i = 0; i < *n; ++i){
         (*names)[*n-1-i]=pa_xstrdup(pa_strlist_data(iter));
@@ -1569,6 +1573,11 @@ void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void
         return;
     }
     pa_dbus_send_empty_reply(conn, msg);
+
+    DBusMessage *signal = NULL;
+    pa_assert_se((signal = dbus_message_new_signal(u->dbus_path, EQUALIZER_IFACE, equalizer_signals[EQUALIZER_SIGNAL_FILTER_CHANGED].name)));
+    pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
+    dbus_message_unref(signal);
 }
 
 void equalizer_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){

commit 8c2f9763df96550e06e94d8e985b24a9f6675677
Author: Jason Newton <nevion at gmail.com>
Date:   Tue Aug 11 03:00:28 2009 -0700

    module-equalizer-sink:
        fix for peek returning a null memblock
        pa_log -> pa_log_debug for fft size
        updated module description
        fixed a comment in dbus error for incorrect x positions

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 8049a99..270e73e 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -2,8 +2,8 @@
 This file is part of PulseAudio.
 
 This module is based off Lennart Poettering's LADSPA sink and swaps out
-LADSPA functionality for a STFT OLA based digital equalizer.  All new work
-is published under Pulseaudio's original license.
+LADSPA functionality for a dbus-aware STFT OLA based digital equalizer.
+All new work is published under Pulseaudio's original license.
 Copyright 2009 Jason Newton <nevion at gmail.com>
 
 Original Author:
@@ -562,11 +562,13 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         //buffer->index = 0;
         //pa_memblock_ref(buffer->memblock);
         //pa_sink_render_into(u->sink, buffer);
-        while(pa_memblockq_peek(u->input_q, &tchunk) < 0){
+        while(pa_memblockq_peek(u->input_q, &tchunk) < 0 || tchunk.memblock == NULL){
             pa_sink_render(u->sink, input_remaining*fs, &tchunk);
+            pa_assert(tchunk.memblock);
             pa_memblockq_push(u->input_q, &tchunk);
             pa_memblock_unref(tchunk.memblock);
         }
+        pa_assert(tchunk.memblock);
         tchunk.length = PA_MIN(input_remaining*fs, tchunk.length);
         pa_memblockq_drop(u->input_q, tchunk.length);
         //pa_log_debug("asked for %ld input samples, got %ld samples",input_remaining,buffer->length/fs);
@@ -878,7 +880,7 @@ int pa__init(pa_module*m) {
 
     u->channels = ss.channels;
     u->fft_size = pow(2, ceil(log(ss.rate)/log(2)));
-    pa_log("fft size: %ld", u->fft_size);
+    pa_log_debug("fft size: %ld", u->fft_size);
     u->window_size = 15999;
     u->R = (u->window_size+1)/2;
     u->overlap_size = u->window_size-u->R;
@@ -1442,7 +1444,7 @@ void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *
         }
     }
     if(!is_monotonic(xs,x_npoints) || !points_good){
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs must be monotonic and 0<x<%ld", u->fft_size / 2);
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs must be monotonic and 0<=x<=%ld", u->fft_size / 2);
         dbus_error_free(&error);
         return;
 

commit 38d608ad5a0a3fa0ff7f93007dde46d8661348c3
Author: Jason Newton <nevion at gmail.com>
Date:   Sat Aug 15 05:22:29 2009 -0700

    module-equalizer-sink:
        reworked processing so we don't have input->output delay of R samples

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 270e73e..5f16cd6 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -103,7 +103,6 @@ struct userdata {
     size_t samples_gathered;
     size_t max_output;//max amount of samples outputable in a single
     //message
-    size_t target_samples;
     float *H;//frequency response filter (magnitude based)
     float *W;//windowing function (time domain)
     float *work_buffer, **input, **overlap_accum;
@@ -115,6 +114,7 @@ struct userdata {
     pa_aupdate *a_H;
     pa_memchunk conv_buffer;
     pa_memblockq *input_q;
+    int first_iteration;
 
     pa_dbus_protocol *dbus_protocol;
     char *dbus_path;
@@ -135,11 +135,13 @@ static const char* const valid_modargs[] = {
 
 static uint64_t time_diff(struct timespec *timeA_p, struct timespec *timeB_p);
 static void hanning_window(float *W, size_t window_size);
-void fix_filter(float *H, size_t fft_size);
-void interpolate(float *signal, size_t length, uint32_t *xs, float *ys, size_t n_points);
+static void fix_filter(float *H, size_t fft_size);
+static void interpolate(float *signal, size_t length, uint32_t *xs, float *ys, size_t n_points);
 static void array_out(const char *name, float *a, size_t length);
 static int is_monotonic(uint32_t *xs, size_t length);
+static void reset_filter(struct userdata *u);
 static void process_samples(struct userdata *u, pa_memchunk *tchunk);
+static void initialize_buffer(struct userdata *u, pa_memchunk *in);
 static void input_buffer(struct userdata *u, pa_memchunk *in);
 static void save_profile(struct userdata *u,char *name);
 static void save_state(struct userdata *u);
@@ -274,13 +276,13 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
         case PA_SINK_MESSAGE_GET_LATENCY: {
             pa_usec_t usec = 0;
             pa_sample_spec *ss=&u->sink->sample_spec;
-            //size_t fs=pa_frame_size(&(u->sink->sample_spec));
+            size_t fs=pa_frame_size(&(u->sink->sample_spec));
 
             /* Get the latency of the master sink */
             if (PA_MSGOBJECT(u->master)->process_msg(PA_MSGOBJECT(u->master), PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL) < 0)
                 usec = 0;
 
-            //usec += pa_bytes_to_usec(u->latency * fs, ss);
+            usec += pa_bytes_to_usec(u->latency * fs, ss);
             //usec += pa_bytes_to_usec(u->samples_gathered * fs, ss);
             usec += pa_bytes_to_usec(pa_memblockq_get_length(u->input_q), ss);
             /* Add the latency internal to our sink input on top */
@@ -340,10 +342,10 @@ static void process_samples(struct userdata *u, pa_memchunk *tchunk){
     size_t fs=pa_frame_size(&(u->sink->sample_spec));
     pa_assert(u->samples_gathered >= u->R);
     float *dst;
-    tchunk->index=0;
-    tchunk->length=u->R*fs;
-    tchunk->memblock=pa_memblock_new(u->core->mempool, tchunk->length);
-    dst=((float*)pa_memblock_acquire(tchunk->memblock));
+    tchunk->index = 0;
+    tchunk->length = u->R * fs;
+    tchunk->memblock = pa_memblock_new(u->core->mempool, tchunk->length);
+    dst = ((float*)pa_memblock_acquire(tchunk->memblock));
     for(size_t c=0;c < u->channels; c++) {
         dsp_logic(
             u->work_buffer,
@@ -354,13 +356,21 @@ static void process_samples(struct userdata *u, pa_memchunk *tchunk){
             u->output_window,
             u
         );
+        if(u->first_iteration){
+            /* The windowing function will make the audio ramped in, as a cheap fix we can
+             * undo the windowing (for non-zero window values)
+             */
+            for(size_t i = 0;i < u->overlap_size; ++i){
+                u->work_buffer[i] = u->W[i] <= FLT_EPSILON ? u->W[i] : u->work_buffer[i] / u->W[i];
+            }
+        }
         pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst + c, fs, u->work_buffer, sizeof(float), u->R);
     }
     pa_memblock_release(tchunk->memblock);
-    u->samples_gathered-=u->R;
+    u->samples_gathered-= u->R;
 }
 
-typedef float v4sf __attribute__ ((__aligned__(v_size*sizeof(float))));
+typedef float v4sf __attribute__ ((__aligned__(v_size * sizeof(float))));
 typedef union float_vector {
     float f[v_size];
     v4sf v;
@@ -516,20 +526,34 @@ void dsp_logic(
 //    );
 //}
 
+void initialize_buffer(struct userdata *u, pa_memchunk *in){
+    size_t fs = pa_frame_size(&(u->sink->sample_spec));
+    size_t samples = in->length/fs;
+    pa_assert_se(u->samples_gathered + samples == u->window_size);
+    float *src = (float*) ((uint8_t*) pa_memblock_acquire(in->memblock) + in->index);
+    for(size_t c = 0; c < u->channels; c++) {
+        //buffer with an offset after the overlap from previous
+        //iterations
+        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, u->input[c]+u->samples_gathered, sizeof(float), src + c, fs, samples);
+    }
+    u->samples_gathered+=samples;
+    pa_memblock_release(in->memblock);
+}
+
 void input_buffer(struct userdata *u, pa_memchunk *in){
     size_t fs = pa_frame_size(&(u->sink->sample_spec));
     size_t samples = in->length/fs;
-    pa_assert_se(samples <= u->target_samples-u->samples_gathered);
+    pa_assert_se(samples <= u->window_size - u->samples_gathered);
     float *src = (float*) ((uint8_t*) pa_memblock_acquire(in->memblock) + in->index);
     for(size_t c = 0; c < u->channels; c++) {
         //buffer with an offset after the overlap from previous
         //iterations
         pa_assert_se(
-            u->input[c]+u->overlap_size+u->samples_gathered+samples <= u->input[c]+u->overlap_size+u->target_samples
+            u->input[c]+u->overlap_size+u->samples_gathered+samples <= u->input[c]+u->window_size
         );
         pa_sample_clamp(PA_SAMPLE_FLOAT32NE, u->input[c]+u->overlap_size+u->samples_gathered, sizeof(float), src + c, fs, samples);
     }
-    u->samples_gathered+=samples;
+    u->samples_gathered += samples;
     pa_memblock_release(in->memblock);
 }
 
@@ -553,8 +577,8 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     struct timespec start, end;
     gettime(start);
     do{
-        size_t input_remaining = u->target_samples-u->samples_gathered;
-        pa_assert(input_remaining>0);
+        size_t input_remaining = u->window_size - u->samples_gathered;
+        pa_assert(input_remaining > 0);
         //collect samples
 
         //buffer = &u->conv_buffer;
@@ -563,7 +587,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         //pa_memblock_ref(buffer->memblock);
         //pa_sink_render_into(u->sink, buffer);
         while(pa_memblockq_peek(u->input_q, &tchunk) < 0 || tchunk.memblock == NULL){
-            pa_sink_render(u->sink, input_remaining*fs, &tchunk);
+            pa_sink_render_full(u->sink, input_remaining*fs, &tchunk);
             pa_assert(tchunk.memblock);
             pa_memblockq_push(u->input_q, &tchunk);
             pa_memblock_unref(tchunk.memblock);
@@ -574,11 +598,15 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         //pa_log_debug("asked for %ld input samples, got %ld samples",input_remaining,buffer->length/fs);
         /* copy new input */
         //gettime(start);
-        input_buffer(u, &tchunk);
+        if(u->first_iteration){
+            initialize_buffer(u, &tchunk);
+        }else{
+            input_buffer(u, &tchunk);
+        }
         //gettime(end);
         //pa_log_debug("Took %0.5f seconds to setup", tdiff(end, start)*1e-9);
         pa_memblock_unref(tchunk.memblock);
-    }while(u->samples_gathered < u->R);
+    }while(u->samples_gathered <= u->window_size);
     gettime(end);
     pa_log_debug("Took %0.6f seconds to get data", tdiff(end, start)*1e-9);
 
@@ -597,6 +625,9 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     pa_assert(chunk->memblock);
     //pa_log_debug("gave %ld", chunk->length/fs);
     //pa_log_debug("end pop");
+    if(u->first_iteration){
+        u->first_iteration = 0;
+    }
     return 0;
 }
 
@@ -627,8 +658,8 @@ static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
             pa_memblockq_seek(u->input_q, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
             //pa_memblockq_drop(u->input_q, pa_memblockq_get_length(u->input_q));
             //pa_memblockq_seek(u->input_q, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
-            pa_log_debug("Resetting equalizer");
-            u->samples_gathered = 0;
+            pa_log("Resetting filter");
+            reset_filter(u);
         }
     }
 
@@ -636,6 +667,14 @@ static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
     pa_memblockq_rewind(u->input_q, nbytes);
 }
 
+void reset_filter(struct userdata *u){
+    u->samples_gathered = 0;
+    for(size_t i = 0;i < u->channels; ++i){
+        memset(u->overlap_accum[i], 0, u->overlap_size * sizeof(float));
+    }
+    u->first_iteration = 1;
+}
+
 /* Called from I/O thread context */
 static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) {
     struct userdata *u;
@@ -882,15 +921,13 @@ int pa__init(pa_module*m) {
     u->fft_size = pow(2, ceil(log(ss.rate)/log(2)));
     pa_log_debug("fft size: %ld", u->fft_size);
     u->window_size = 15999;
-    u->R = (u->window_size+1)/2;
-    u->overlap_size = u->window_size-u->R;
-    u->target_samples = 1*u->R;
+    u->R = (u->window_size + 1) / 2;
+    u->overlap_size = u->window_size - u->R;
     u->samples_gathered = 0;
-    u->max_output = pa_frame_align(pa_mempool_block_size_max(m->core->mempool), &ss)/pa_frame_size(&ss);
+    u->max_output = pa_frame_align(pa_mempool_block_size_max(m->core->mempool), &ss) / pa_frame_size(&ss);
     u->input_q = pa_memblockq_new(0,  MEMBLOCKQ_MAXLENGTH, 0, fs, 1, 1, 0, NULL);
     u->a_H = pa_aupdate_new();
-    u->conv_buffer.memblock = pa_memblock_new(u->core->mempool, u->target_samples*fs);
-    u->latency = u->R;
+    u->latency = u->window_size - u->R;
     for(size_t i = 0; i < 2; ++i){
         u->Hs[i] = alloc((u->fft_size / 2 + 1), sizeof(float));
     }
@@ -900,9 +937,9 @@ int pa__init(pa_module*m) {
     u->input = (float **)pa_xmalloc0(sizeof(float *)*u->channels);
     u->overlap_accum = (float **)pa_xmalloc0(sizeof(float *)*u->channels);
     for(size_t c = 0; c < u->channels; ++c){
-        u->input[c] = alloc(u->overlap_size+u->target_samples, sizeof(float));
+        u->input[c] = alloc(u->window_size, sizeof(float));
         pa_assert_se(u->input[c]);
-        memset(u->input[c], 0, (u->overlap_size+u->target_samples)*sizeof(float));
+        memset(u->input[c], 0, (u->window_size)*sizeof(float));
         pa_assert_se(u->input[c]);
         u->overlap_accum[c] = alloc(u->overlap_size, sizeof(float));
         pa_assert_se(u->overlap_accum[c]);
@@ -913,6 +950,7 @@ int pa__init(pa_module*m) {
     u->inverse_plan = fftwf_plan_dft_c2r_1d(u->fft_size, u->output_window, u->work_buffer, FFTW_ESTIMATE);
 
     hanning_window(u->W, u->window_size);
+    u->first_iteration = 1;
 
     /* Create sink */
     pa_sink_new_data_init(&sink_data);
@@ -1048,7 +1086,6 @@ void pa__done(pa_module*m) {
     }
 
     pa_aupdate_free(u->a_H);
-    pa_memblock_unref(u->conv_buffer.memblock);
     pa_memblockq_free(u->input_q);
 
     fftwf_destroy_plan(u->inverse_plan);

commit 0e6711ddd0659d62613e8812b33e36d581875ba0
Author: Jason Newton <nevion at gmail.com>
Date:   Sat Aug 15 06:17:40 2009 -0700

    module-equalizer-sink:
        merging in upstream changes
        whitespace fix and fix for first iteration un-windowing

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 5f16cd6..944aa7a 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -81,9 +81,8 @@ PA_MODULE_USAGE(_("sink=<sink to connect to> "));
 
 
 struct userdata {
-    pa_core *core;
     pa_module *module;
-    pa_sink *sink, *master;
+    pa_sink *sink;
     pa_sink_input *sink_input;
     char *name;
 
@@ -101,7 +100,6 @@ struct userdata {
     //for twiddling with pulseaudio
     size_t overlap_size;//window_size-R
     size_t samples_gathered;
-    size_t max_output;//max amount of samples outputable in a single
     //message
     float *H;//frequency response filter (magnitude based)
     float *W;//windowing function (time domain)
@@ -274,20 +272,26 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
     switch (code) {
 
         case PA_SINK_MESSAGE_GET_LATENCY: {
-            pa_usec_t usec = 0;
-            pa_sample_spec *ss=&u->sink->sample_spec;
-            size_t fs=pa_frame_size(&(u->sink->sample_spec));
-
-            /* Get the latency of the master sink */
-            if (PA_MSGOBJECT(u->master)->process_msg(PA_MSGOBJECT(u->master), PA_SINK_MESSAGE_GET_LATENCY, &usec, 0, NULL) < 0)
-                usec = 0;
-
-            usec += pa_bytes_to_usec(u->latency * fs, ss);
-            //usec += pa_bytes_to_usec(u->samples_gathered * fs, ss);
-            usec += pa_bytes_to_usec(pa_memblockq_get_length(u->input_q), ss);
-            /* Add the latency internal to our sink input on top */
-            usec += pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->master->sample_spec);
-            *((pa_usec_t*) data) = usec;
+            size_t fs=pa_frame_size(&u->sink->sample_spec);
+
+            /* The sink is _put() before the sink input is, so let's
+             * make sure we don't access it in that time. Also, the
+             * sink input is first shut down, the sink second. */
+            if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
+                !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) {
+                *((pa_usec_t*) data) = 0;
+                return 0;
+            }
+
+            *((pa_usec_t*) data) =
+                /* Get the latency of the master sink */
+                pa_sink_get_latency_within_thread(u->sink_input->sink) +
+
+                /* Add the latency internal to our sink input on top */
+                pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec) +
+                pa_bytes_to_usec(u->samples_gathered * fs, &u->sink->sample_spec);
+            //+ pa_bytes_to_usec(u->latency * fs, ss)
+            //+ pa_bytes_to_usec(pa_memblockq_get_length(u->input_q), ss);
             return 0;
         }
     }
@@ -303,12 +307,11 @@ static int sink_set_state(pa_sink *s, pa_sink_state_t state) {
     pa_sink_assert_ref(s);
     pa_assert_se(u = s->userdata);
 
-    if (PA_SINK_IS_LINKED(state) &&
-        u->sink_input &&
-        PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
-
-        pa_sink_input_cork(u->sink_input, state == PA_SINK_SUSPENDED);
+    if (!PA_SINK_IS_LINKED(state) ||
+        !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
+        return 0;
 
+    pa_sink_input_cork(u->sink_input, state == PA_SINK_SUSPENDED);
     return 0;
 }
 
@@ -319,7 +322,9 @@ static void sink_request_rewind(pa_sink *s) {
     pa_sink_assert_ref(s);
     pa_assert_se(u = s->userdata);
 
-    //pa_memblockq_drop(u->input_q,pa_memblockq_get_length(u->input_q));
+    if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
+        !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state))
+        return;
 
     /* Just hand this one over to the master sink */
     pa_sink_input_request_rewind(u->sink_input, s->thread_info.rewind_nbytes+pa_memblockq_get_length(u->input_q), TRUE, FALSE, FALSE);
@@ -332,6 +337,10 @@ static void sink_update_requested_latency(pa_sink *s) {
     pa_sink_assert_ref(s);
     pa_assert_se(u = s->userdata);
 
+    if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
+        !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state))
+        return;
+
     /* Just hand this one over to the master sink */
     pa_sink_input_set_requested_latency_within_thread(
             u->sink_input,
@@ -344,7 +353,7 @@ static void process_samples(struct userdata *u, pa_memchunk *tchunk){
     float *dst;
     tchunk->index = 0;
     tchunk->length = u->R * fs;
-    tchunk->memblock = pa_memblock_new(u->core->mempool, tchunk->length);
+    tchunk->memblock = pa_memblock_new(u->sink->core->mempool, tchunk->length);
     dst = ((float*)pa_memblock_acquire(tchunk->memblock));
     for(size_t c=0;c < u->channels; c++) {
         dsp_logic(
@@ -361,7 +370,7 @@ static void process_samples(struct userdata *u, pa_memchunk *tchunk){
              * undo the windowing (for non-zero window values)
              */
             for(size_t i = 0;i < u->overlap_size; ++i){
-                u->work_buffer[i] = u->W[i] <= FLT_EPSILON ? u->W[i] : u->work_buffer[i] / u->W[i];
+                u->work_buffer[i] = u->W[i] <= FLT_EPSILON ? u->work_buffer[i] : u->work_buffer[i] / u->W[i];
             }
         }
         pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst + c, fs, u->work_buffer, sizeof(float), u->R);
@@ -529,7 +538,7 @@ void dsp_logic(
 void initialize_buffer(struct userdata *u, pa_memchunk *in){
     size_t fs = pa_frame_size(&(u->sink->sample_spec));
     size_t samples = in->length/fs;
-    pa_assert_se(u->samples_gathered + samples == u->window_size);
+    pa_assert_se(u->samples_gathered + samples <= u->window_size);
     float *src = (float*) ((uint8_t*) pa_memblock_acquire(in->memblock) + in->index);
     for(size_t c = 0; c < u->channels; c++) {
         //buffer with an offset after the overlap from previous
@@ -549,7 +558,7 @@ void input_buffer(struct userdata *u, pa_memchunk *in){
         //buffer with an offset after the overlap from previous
         //iterations
         pa_assert_se(
-            u->input[c]+u->overlap_size+u->samples_gathered+samples <= u->input[c]+u->window_size
+            u->input[c]+u->samples_gathered+samples <= u->input[c]+u->window_size
         );
         pa_sample_clamp(PA_SAMPLE_FLOAT32NE, u->input[c]+u->overlap_size+u->samples_gathered, sizeof(float), src + c, fs, samples);
     }
@@ -561,14 +570,12 @@ void input_buffer(struct userdata *u, pa_memchunk *in){
 static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) {
     struct userdata *u;
     pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
     pa_assert(chunk);
-    pa_assert(u = i->userdata);
     pa_assert(u->sink);
     size_t fs = pa_frame_size(&(u->sink->sample_spec));
     pa_memchunk tchunk;
     chunk->memblock = NULL;
-    if (!u->sink || !PA_SINK_IS_OPENED(u->sink->thread_info.state))
-        return -1;
 
     /* Hmm, process any rewind request that might be queued up */
     pa_sink_process_rewind(u->sink, 0);
@@ -587,13 +594,13 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         //pa_memblock_ref(buffer->memblock);
         //pa_sink_render_into(u->sink, buffer);
         while(pa_memblockq_peek(u->input_q, &tchunk) < 0 || tchunk.memblock == NULL){
-            pa_sink_render_full(u->sink, input_remaining*fs, &tchunk);
+            pa_sink_render(u->sink, input_remaining*fs, &tchunk);
             pa_assert(tchunk.memblock);
             pa_memblockq_push(u->input_q, &tchunk);
             pa_memblock_unref(tchunk.memblock);
         }
         pa_assert(tchunk.memblock);
-        tchunk.length = PA_MIN(input_remaining*fs, tchunk.length);
+        tchunk.length = PA_MIN(input_remaining * fs, tchunk.length);
         pa_memblockq_drop(u->input_q, tchunk.length);
         //pa_log_debug("asked for %ld input samples, got %ld samples",input_remaining,buffer->length/fs);
         /* copy new input */
@@ -606,7 +613,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         //gettime(end);
         //pa_log_debug("Took %0.5f seconds to setup", tdiff(end, start)*1e-9);
         pa_memblock_unref(tchunk.memblock);
-    }while(u->samples_gathered <= u->window_size);
+    }while(u->samples_gathered < u->window_size);
     gettime(end);
     pa_log_debug("Took %0.6f seconds to get data", tdiff(end, start)*1e-9);
 
@@ -617,7 +624,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     u->H = u->Hs[H_i];
     gettime(start);
     /* process a block */
-    process_samples(u,chunk);
+    process_samples(u, chunk);
     gettime(end);
     pa_log_debug("Took %0.6f seconds to process", tdiff(end, start)*1e-9);
     pa_aupdate_read_end(u->a_H);
@@ -640,9 +647,6 @@ static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
 
-    if (!u->sink || !PA_SINK_IS_OPENED(u->sink->thread_info.state))
-        return;
-
     if (u->sink->thread_info.rewind_nbytes > 0) {
         size_t max_rewrite;
 
@@ -682,9 +686,6 @@ static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) {
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
 
-    if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
-        return;
-
     pa_memblockq_set_maxrewind(u->input_q, nbytes);
     pa_sink_set_max_rewind_within_thread(u->sink, nbytes);
 }
@@ -696,9 +697,6 @@ static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) {
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
 
-    if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
-        return;
-
     size_t fs = pa_frame_size(&(u->sink->sample_spec));
     //pa_sink_set_max_request_within_thread(u->sink, nbytes);
     //pa_sink_set_max_request_within_thread(u->sink, u->R*fs);
@@ -712,26 +710,30 @@ static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) {
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
 
-    if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
-        return;
-
     //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->latency*fs);
     //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->latency*fs );
     pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
 }
 
 /* Called from I/O thread context */
-static void sink_input_detach_cb(pa_sink_input *i) {
+static void sink_input_update_sink_fixed_latency_cb(pa_sink_input *i) {
     struct userdata *u;
 
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
 
-    if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
-        return;
+    pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
+}
+
+/* Called from I/O thread context */
+static void sink_input_detach_cb(pa_sink_input *i) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
 
     pa_sink_detach_within_thread(u->sink);
-    pa_sink_set_asyncmsgq(u->sink, NULL);
+
     pa_sink_set_rtpoll(u->sink, NULL);
 }
 
@@ -742,11 +744,10 @@ static void sink_input_attach_cb(pa_sink_input *i) {
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
 
-    if (!u->sink || !PA_SINK_IS_LINKED(u->sink->thread_info.state))
-        return;
+    pa_sink_set_rtpoll(u->sink, i->sink->thread_info.rtpoll);
+    pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
 
-    pa_sink_set_asyncmsgq(u->sink, i->sink->asyncmsgq);
-    pa_sink_set_rtpoll(u->sink, i->sink->rtpoll);
+    pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
     pa_sink_attach_within_thread(u->sink);
 
     //size_t fs = pa_frame_size(&(u->sink->sample_spec));
@@ -756,7 +757,8 @@ static void sink_input_attach_cb(pa_sink_input *i) {
     //of them completely, figure out why
     //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->latency*fs);
     //TODO: this guy causes dropouts constantly+rewinds, it's unusable
-    pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->master->thread_info.max_latency);
+    //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->master->thread_info.max_latency);
+    pa_sink_attach_within_thread(u->sink);
 }
 
 /* Called from main context */
@@ -766,14 +768,18 @@ static void sink_input_kill_cb(pa_sink_input *i) {
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
 
-    pa_sink_unlink(u->sink);
+    /* The order here matters! We first kill the sink input, followed
+     * by the sink. That means the sink callbacks must be protected
+     * against an unconnected sink input! */
     pa_sink_input_unlink(u->sink_input);
+    pa_sink_unlink(u->sink);
 
-    pa_sink_unref(u->sink);
-    u->sink = NULL;
     pa_sink_input_unref(u->sink_input);
     u->sink_input = NULL;
 
+    pa_sink_unref(u->sink);
+    u->sink = NULL;
+
     pa_module_unload_request(u->module, TRUE);
 }
 
@@ -863,6 +869,16 @@ static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) {
     return u->sink != dest;
 }
 
+/* Called from main context */
+static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    pa_sink_set_asyncmsgq(u->sink, dest->asyncmsgq);
+    pa_sink_update_flags(u->sink, PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY, dest->flags);
+}
 
 //ensure's memory allocated is a multiple of v_size
 //and aligned
@@ -910,12 +926,8 @@ int pa__init(pa_module*m) {
     fs = pa_frame_size(&ss);
 
     u = pa_xnew0(struct userdata, 1);
-    u->core = m->core;
     u->module = m;
     m->userdata = u;
-    u->master = master;
-    u->sink = NULL;
-    u->sink_input = NULL;
 
     u->channels = ss.channels;
     u->fft_size = pow(2, ceil(log(ss.rate)/log(2)));
@@ -924,7 +936,6 @@ int pa__init(pa_module*m) {
     u->R = (u->window_size + 1) / 2;
     u->overlap_size = u->window_size - u->R;
     u->samples_gathered = 0;
-    u->max_output = pa_frame_align(pa_mempool_block_size_max(m->core->mempool), &ss) / pa_frame_size(&ss);
     u->input_q = pa_memblockq_new(0,  MEMBLOCKQ_MAXLENGTH, 0, fs, 1, 1, 0, NULL);
     u->a_H = pa_aupdate_new();
     u->latency = u->window_size - u->R;
@@ -958,11 +969,10 @@ int pa__init(pa_module*m) {
     sink_data.module = m;
     if (!(sink_data.name = pa_xstrdup(pa_modargs_get_value(ma, "sink_name", NULL))))
         sink_data.name = pa_sprintf_malloc("%s.equalizer", master->name);
-    sink_data.namereg_fail = FALSE;
     pa_sink_new_data_set_sample_spec(&sink_data, &ss);
     pa_sink_new_data_set_channel_map(&sink_data, &map);
     z = pa_proplist_gets(master->proplist, PA_PROP_DEVICE_DESCRIPTION);
-    pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "FFT based equalizer");
+    pa_proplist_setf(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "FFT based equalizer on %s",z? z: master->name);
     pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_MASTER_DEVICE, master->name);
     pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_CLASS, "filter");
 
@@ -972,7 +982,7 @@ int pa__init(pa_module*m) {
         goto fail;
     }
 
-    u->sink = pa_sink_new(m->core, &sink_data, PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY);
+    u->sink = pa_sink_new(m->core, &sink_data, master->flags & (PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY));
     pa_sink_new_data_done(&sink_data);
 
     if (!u->sink) {
@@ -987,7 +997,6 @@ int pa__init(pa_module*m) {
     u->sink->userdata = u;
 
     pa_sink_set_asyncmsgq(u->sink, master->asyncmsgq);
-    pa_sink_set_rtpoll(u->sink, master->rtpoll);
     pa_sink_set_max_request(u->sink,
         ((pa_sink_get_max_request(u->sink)+u->R*fs-1)/(u->R*fs))*(u->R*fs)
     );
@@ -997,13 +1006,13 @@ int pa__init(pa_module*m) {
     pa_sink_input_new_data_init(&sink_input_data);
     sink_input_data.driver = __FILE__;
     sink_input_data.module = m;
-    sink_input_data.sink = u->master;
+    sink_input_data.sink = master;
     pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "Equalized Stream");
     pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "filter");
     pa_sink_input_new_data_set_sample_spec(&sink_input_data, &ss);
     pa_sink_input_new_data_set_channel_map(&sink_input_data, &map);
 
-    pa_sink_input_new(&u->sink_input, m->core, &sink_input_data, PA_SINK_INPUT_DONT_MOVE);
+    pa_sink_input_new(&u->sink_input, m->core, &sink_input_data, 0);
     pa_sink_input_new_data_done(&sink_input_data);
 
     if (!u->sink_input)
@@ -1014,11 +1023,13 @@ int pa__init(pa_module*m) {
     u->sink_input->update_max_rewind = sink_input_update_max_rewind_cb;
     u->sink_input->update_max_request = sink_input_update_max_request_cb;
     u->sink_input->update_sink_latency_range = sink_input_update_sink_latency_range_cb;
+    u->sink_input->update_sink_fixed_latency = sink_input_update_sink_fixed_latency_cb;
     u->sink_input->kill = sink_input_kill_cb;
     u->sink_input->attach = sink_input_attach_cb;
     u->sink_input->detach = sink_input_detach_cb;
     u->sink_input->state_change = sink_input_state_change_cb;
     u->sink_input->may_move_to = sink_input_may_move_to_cb;
+    u->sink_input->moving = sink_input_moving_cb;
     u->sink_input->userdata = u;
 
     pa_sink_put(u->sink);
@@ -1075,15 +1086,20 @@ void pa__done(pa_module*m) {
 
     dbus_done(u);
 
-    if (u->sink) {
-        pa_sink_unlink(u->sink);
-        pa_sink_unref(u->sink);
-    }
+    /* See comments in sink_input_kill_cb() above regarding
+     * destruction order! */
 
-    if (u->sink_input) {
+    if (u->sink_input)
         pa_sink_input_unlink(u->sink_input);
+
+    if (u->sink)
+        pa_sink_unlink(u->sink);
+
+    if (u->sink_input)
         pa_sink_input_unref(u->sink_input);
-    }
+
+    if (u->sink)
+        pa_sink_unref(u->sink);
 
     pa_aupdate_free(u->a_H);
     pa_memblockq_free(u->input_q);
@@ -1252,21 +1268,21 @@ static pa_dbus_interface_info equalizer_info={
 };
 
 void dbus_init(struct userdata *u){
-    u->dbus_protocol=pa_dbus_protocol_get(u->core);
+    u->dbus_protocol=pa_dbus_protocol_get(u->sink->core);
     u->dbus_path=pa_sprintf_malloc("/org/pulseaudio/core1/sink%d", u->sink->index);
 
     pa_dbus_protocol_add_interface(u->dbus_protocol, u->dbus_path, &equalizer_info, u);
-    pa_idxset *sink_list=pa_shared_get(u->core, SINKLIST);
-    u->database=pa_shared_get(u->core, EQDB);
+    pa_idxset *sink_list=pa_shared_get(u->sink->core, SINKLIST);
+    u->database=pa_shared_get(u->sink->core, EQDB);
     if(sink_list==NULL){
         sink_list=pa_idxset_new(&pa_idxset_trivial_hash_func, &pa_idxset_trivial_compare_func);
-        pa_shared_set(u->core, SINKLIST, sink_list);
+        pa_shared_set(u->sink->core, SINKLIST, sink_list);
         char *dbname;
         pa_assert_se(dbname = pa_state_path("equalizers", TRUE));
         pa_assert_se(u->database = pa_database_open(dbname, TRUE));
         pa_xfree(dbname);
-        pa_shared_set(u->core,EQDB,u->database);
-        pa_dbus_protocol_add_interface(u->dbus_protocol, MANAGER_PATH, &manager_info, u->core);
+        pa_shared_set(u->sink->core,EQDB,u->database);
+        pa_dbus_protocol_add_interface(u->dbus_protocol, MANAGER_PATH, &manager_info, u->sink->core);
         pa_dbus_protocol_register_extension(u->dbus_protocol, EXTNAME);
     }
     uint32_t dummy;
@@ -1289,14 +1305,14 @@ void dbus_done(struct userdata *u){
     pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
     dbus_message_unref(signal);
 
-    pa_assert_se(sink_list=pa_shared_get(u->core,SINKLIST));
+    pa_assert_se(sink_list=pa_shared_get(u->sink->core,SINKLIST));
     pa_idxset_remove_by_data(sink_list,u,&dummy);
     if(pa_idxset_size(sink_list)==0){
         pa_dbus_protocol_unregister_extension(u->dbus_protocol, EXTNAME);
         pa_dbus_protocol_remove_interface(u->dbus_protocol, MANAGER_PATH, manager_info.name);
-        pa_shared_remove(u->core, EQDB);
+        pa_shared_remove(u->sink->core, EQDB);
         pa_database_close(u->database);
-        pa_shared_remove(u->core, SINKLIST);
+        pa_shared_remove(u->sink->core, SINKLIST);
         pa_xfree(sink_list);
     }
     pa_dbus_protocol_remove_interface(u->dbus_protocol, u->dbus_path, equalizer_info.name);

commit 1c1a812b32897a6aa217bbe381e9e82f3b2728fc
Author: Jason Newton <nevion at gmail.com>
Date:   Sun Aug 16 11:38:12 2009 -0700

    module-equalizer-sink
        exchanged improper usage of memblockq_peek'd memchunk for silence block
        dropped unneeded function prototypes
        changed mround to be slightly more elegant
        __restrict__ -> restrict for c99
        removed unneeded pa_aupdate_swap calls
        first_iteration -> pa_bool_t
        cleaned up some usage of pa_malloc0 where pa_new0 was more appropriate
        cruft removal, whitespace fixes and reordering of variables

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 944aa7a..b7f61c6 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -38,7 +38,9 @@ USA.
 
 #include <pulse/xmalloc.h>
 #include <pulse/i18n.h>
+#include <pulse/timeval.h>
 
+#include <pulsecore/aupdate.h>
 #include <pulsecore/core-error.h>
 #include <pulsecore/namereg.h>
 #include <pulsecore/sink.h>
@@ -112,7 +114,7 @@ struct userdata {
     pa_aupdate *a_H;
     pa_memchunk conv_buffer;
     pa_memblockq *input_q;
-    int first_iteration;
+    pa_bool_t first_iteration;
 
     pa_dbus_protocol *dbus_protocol;
     char *dbus_path;
@@ -131,103 +133,43 @@ static const char* const valid_modargs[] = {
     NULL
 };
 
-static uint64_t time_diff(struct timespec *timeA_p, struct timespec *timeB_p);
-static void hanning_window(float *W, size_t window_size);
-static void fix_filter(float *H, size_t fft_size);
-static void interpolate(float *signal, size_t length, uint32_t *xs, float *ys, size_t n_points);
-static void array_out(const char *name, float *a, size_t length);
-static int is_monotonic(uint32_t *xs, size_t length);
-static void reset_filter(struct userdata *u);
-static void process_samples(struct userdata *u, pa_memchunk *tchunk);
-static void initialize_buffer(struct userdata *u, pa_memchunk *in);
-static void input_buffer(struct userdata *u, pa_memchunk *in);
-static void save_profile(struct userdata *u,char *name);
-static void save_state(struct userdata *u);
-static void remove_profile(pa_core *u,char *name);
-static const char * load_profile(struct userdata *u,char *name);
-static void load_state(struct userdata *u);
-
-void dsp_logic(
-    float * __restrict__ dst,
-    float * __restrict__ src,
-    float * __restrict__ overlap,
-    const float * __restrict__ H,
-    const float * __restrict__ W,
-    fftwf_complex * __restrict__ output_window,
-    struct userdata *u);
-
-
-/*
- * DBus Routines and Callbacks
- */
-#define EXTNAME "org.PulseAudio.Ext.Equalizing1"
-#define MANAGER_PATH "/org/pulseaudio/equalizing1"
-#define MANAGER_IFACE EXTNAME ".Manager"
-#define EQUALIZER_IFACE EXTNAME ".Equalizer"
-static void dbus_init(struct userdata *u);
-static void dbus_done(struct userdata *u);
-static void manager_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void get_sinks(pa_core *u, char ***names, unsigned *n_sinks);
-static void manager_get_sinks(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void get_profiles(pa_core *u, char ***names, unsigned *n_sinks);
-static void manager_get_profiles(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void manager_get_all(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void manager_handle_remove_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void equalizer_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void equalizer_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void equalizer_get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void equalizer_get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void equalizer_get_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void equalizer_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void get_filter(struct userdata *u, double **H_);
-static void set_filter(struct userdata *u, double **H_);
 
 #define v_size 4
-#define gettime(x) clock_gettime(CLOCK_MONOTONIC, &x)
-#define tdiff(x, y) time_diff(&x, &y)
-#define mround(x, y) (x % y == 0 ? x : ( x / y + 1) * y)
+#define mround(x, y) ((x + y - 1) / y) * y
 #define SINKLIST "equalized_sinklist"
 #define EQDB "equalizer_db"
+static void dbus_init(struct userdata *u);
+static void dbus_done(struct userdata *u);
 
-uint64_t time_diff(struct timespec *timeA_p, struct timespec *timeB_p)
-{
-    return ((timeA_p->tv_sec * 1000000000ULL) + timeA_p->tv_nsec) -
-    ((timeB_p->tv_sec * 1000000000ULL) + timeB_p->tv_nsec);
-}
-
-void hanning_window(float *W, size_t window_size){
+static void hanning_window(float *W, size_t window_size){
     //h=.5*(1-cos(2*pi*j/(window_size+1)), COLA for R=(M+1)/2
     for(size_t i=0; i < window_size;++i){
         W[i] = (float).5*(1-cos(2*M_PI*i/(window_size+1)));
     }
 }
 
-void fix_filter(float *H, size_t fft_size){
+static void fix_filter(float *H, size_t fft_size){
     //divide out the fft gain
     for(size_t i = 0; i < fft_size / 2 + 1; ++i){
         H[i] /= fft_size;
     }
 }
 
-void interpolate(float *signal, size_t length, uint32_t *xs, float *ys, size_t n_points){
+static void interpolate(float *signal, size_t length, uint32_t *xs, float *ys, size_t n_points){
     //Note that xs must be monotonically increasing!
+    float x_range_lower, x_range_upper, c0;
     pa_assert_se(n_points>=2);
     pa_assert_se(xs[0] == 0);
     pa_assert_se(xs[n_points - 1] == length - 1);
     for(size_t x = 0, x_range_lower_i = 0; x < length-1; ++x){
         pa_assert(x_range_lower_i < n_points-1);
-        float x_range_lower = (float) (xs[x_range_lower_i]);
-        float x_range_upper = (float) (xs[x_range_lower_i+1]);
+        x_range_lower = (float) (xs[x_range_lower_i]);
+        x_range_upper = (float) (xs[x_range_lower_i+1]);
         pa_assert_se(x_range_lower < x_range_upper);
         pa_assert_se(x >= x_range_lower);
         pa_assert_se(x <= x_range_upper);
         //bilinear-interpolation of coefficients specified
-        float c0 = (x-x_range_lower)/(x_range_upper-x_range_lower);
+        c0 = (x-x_range_lower)/(x_range_upper-x_range_lower);
         pa_assert_se(c0 >= 0&&c0 <= 1.0);
         signal[x] = ((1.0f - c0) * ys[x_range_lower_i] + c0 * ys[x_range_lower_i + 1]);
         while(x >= xs[x_range_lower_i + 1]){
@@ -237,22 +179,7 @@ void interpolate(float *signal, size_t length, uint32_t *xs, float *ys, size_t n
     signal[length-1]=ys[n_points-1];
 }
 
-void array_out(const char *name, float *a, size_t length){
-    FILE *p=fopen(name, "w");
-    if(!p){
-        pa_log("opening %s failed!", name);
-        return;
-    }
-    for(size_t i = 0; i < length; ++i){
-        fprintf(p, "%e,", a[i]);
-        //if(i%1000==0){
-        //    fprintf(p, "\n");
-        //}
-    }
-    fprintf(p, "\n");
-    fclose(p);
-}
-static int is_monotonic(uint32_t *xs,size_t length){
+static int is_monotonic(const uint32_t *xs,size_t length){
     if(length<2){
         return 1;
     }
@@ -347,38 +274,6 @@ static void sink_update_requested_latency(pa_sink *s) {
             pa_sink_get_requested_latency_within_thread(s));
 }
 
-static void process_samples(struct userdata *u, pa_memchunk *tchunk){
-    size_t fs=pa_frame_size(&(u->sink->sample_spec));
-    pa_assert(u->samples_gathered >= u->R);
-    float *dst;
-    tchunk->index = 0;
-    tchunk->length = u->R * fs;
-    tchunk->memblock = pa_memblock_new(u->sink->core->mempool, tchunk->length);
-    dst = ((float*)pa_memblock_acquire(tchunk->memblock));
-    for(size_t c=0;c < u->channels; c++) {
-        dsp_logic(
-            u->work_buffer,
-            u->input[c],
-            u->overlap_accum[c],
-            u->H,
-            u->W,
-            u->output_window,
-            u
-        );
-        if(u->first_iteration){
-            /* The windowing function will make the audio ramped in, as a cheap fix we can
-             * undo the windowing (for non-zero window values)
-             */
-            for(size_t i = 0;i < u->overlap_size; ++i){
-                u->work_buffer[i] = u->W[i] <= FLT_EPSILON ? u->work_buffer[i] : u->work_buffer[i] / u->W[i];
-            }
-        }
-        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst + c, fs, u->work_buffer, sizeof(float), u->R);
-    }
-    pa_memblock_release(tchunk->memblock);
-    u->samples_gathered-= u->R;
-}
-
 typedef float v4sf __attribute__ ((__aligned__(v_size * sizeof(float))));
 typedef union float_vector {
     float f[v_size];
@@ -389,15 +284,15 @@ typedef union float_vector {
 } float_vector_t;
 
 //reference implementation
-void dsp_logic(
-    float * __restrict__ dst,//used as a temp array too, needs to be fft_length!
-    float * __restrict__ src,/*input data w/ overlap at start,
+static void dsp_logic(
+    float * restrict dst,//used as a temp array too, needs to be fft_length!
+    float * restrict src,/*input data w/ overlap at start,
                                *automatically cycled in routine
                                */
-    float * __restrict__ overlap,//The size of the overlap
-    const float * __restrict__ H,//The freq. magnitude scalers filter
-    const float * __restrict__ W,//The windowing function
-    fftwf_complex * __restrict__ output_window,//The transformed window'd src
+    float * restrict overlap,//The size of the overlap
+    const float * restrict H,//The freq. magnitude scalers filter
+    const float * restrict W,//The windowing function
+    fftwf_complex * restrict output_window,//The transformed window'd src
     struct userdata *u){
     //use a linear-phase sliding STFT and overlap-add method (for each channel)
     //zero padd the data
@@ -443,14 +338,14 @@ void dsp_logic(
 ////regardless of sse enabled, the loops in here assume
 ////16 byte aligned addresses and memory allocations divisible by v_size
 //void dsp_logic(
-//    float * __restrict__ dst,//used as a temp array too, needs to be fft_length!
-//    float * __restrict__ src,/*input data w/ overlap at start,
+//    float * restrict dst,//used as a temp array too, needs to be fft_length!
+//    float * restrict src,/*input data w/ overlap at start,
 //                               *automatically cycled in routine
 //                               */
-//    float * __restrict__ overlap,//The size of the overlap
-//    const float * __restrict__ H,//The freq. magnitude scalers filter
-//    const float * __restrict__ W,//The windowing function
-//    fftwf_complex * __restrict__ output_window,//The transformed window'd src
+//    float * restrict overlap,//The size of the overlap
+//    const float * restrict H,//The freq. magnitude scalers filter
+//    const float * restrict W,//The windowing function
+//    fftwf_complex * restrict output_window,//The transformed window'd src
 //    struct userdata *u){//Collection of constants
 //
 //    const size_t window_size = mround(u->window_size,v_size);
@@ -535,25 +430,57 @@ void dsp_logic(
 //    );
 //}
 
-void initialize_buffer(struct userdata *u, pa_memchunk *in){
-    size_t fs = pa_frame_size(&(u->sink->sample_spec));
-    size_t samples = in->length/fs;
-    pa_assert_se(u->samples_gathered + samples <= u->window_size);
+static void process_samples(struct userdata *u, pa_memchunk *tchunk){
+    size_t fs=pa_frame_size(&(u->sink->sample_spec));
+    float *dst;
+    pa_assert(u->samples_gathered >= u->R);
+    tchunk->index = 0;
+    tchunk->length = u->R * fs;
+    tchunk->memblock = pa_memblock_new(u->sink->core->mempool, tchunk->length);
+    dst = ((float*)pa_memblock_acquire(tchunk->memblock));
+    for(size_t c=0;c < u->channels; c++) {
+        dsp_logic(
+            u->work_buffer,
+            u->input[c],
+            u->overlap_accum[c],
+            u->H,
+            u->W,
+            u->output_window,
+            u
+        );
+        if(u->first_iteration){
+            /* The windowing function will make the audio ramped in, as a cheap fix we can
+             * undo the windowing (for non-zero window values)
+             */
+            for(size_t i = 0;i < u->overlap_size; ++i){
+                u->work_buffer[i] = u->W[i] <= FLT_EPSILON ? u->work_buffer[i] : u->work_buffer[i] / u->W[i];
+            }
+        }
+        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst + c, fs, u->work_buffer, sizeof(float), u->R);
+    }
+    pa_memblock_release(tchunk->memblock);
+    u->samples_gathered -= u->R;
+}
+
+static void initialize_buffer(struct userdata *u, pa_memchunk *in){
+    size_t fs = pa_frame_size(&u->sink->sample_spec);
+    size_t samples = in->length / fs;
     float *src = (float*) ((uint8_t*) pa_memblock_acquire(in->memblock) + in->index);
+    pa_assert_se(u->samples_gathered + samples <= u->window_size);
     for(size_t c = 0; c < u->channels; c++) {
         //buffer with an offset after the overlap from previous
         //iterations
-        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, u->input[c]+u->samples_gathered, sizeof(float), src + c, fs, samples);
+        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, u->input[c] + u->samples_gathered, sizeof(float), src + c, fs, samples);
     }
-    u->samples_gathered+=samples;
+    u->samples_gathered += samples;
     pa_memblock_release(in->memblock);
 }
 
-void input_buffer(struct userdata *u, pa_memchunk *in){
+static void input_buffer(struct userdata *u, pa_memchunk *in){
     size_t fs = pa_frame_size(&(u->sink->sample_spec));
     size_t samples = in->length/fs;
-    pa_assert_se(samples <= u->window_size - u->samples_gathered);
     float *src = (float*) ((uint8_t*) pa_memblock_acquire(in->memblock) + in->index);
+    pa_assert_se(samples <= u->window_size - u->samples_gathered);
     for(size_t c = 0; c < u->channels; c++) {
         //buffer with an offset after the overlap from previous
         //iterations
@@ -569,20 +496,21 @@ void input_buffer(struct userdata *u, pa_memchunk *in){
 /* Called from I/O thread context */
 static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) {
     struct userdata *u;
+    size_t fs;
+    struct timeval start, end;
+    pa_memchunk tchunk;
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
     pa_assert(chunk);
     pa_assert(u->sink);
-    size_t fs = pa_frame_size(&(u->sink->sample_spec));
-    pa_memchunk tchunk;
+    fs = pa_frame_size(&(u->sink->sample_spec));
     chunk->memblock = NULL;
 
     /* Hmm, process any rewind request that might be queued up */
     pa_sink_process_rewind(u->sink, 0);
 
     //pa_log_debug("start output-buffered %ld, input-buffered %ld, requested %ld",buffered_samples,u->samples_gathered,samples_requested);
-    struct timespec start, end;
-    gettime(start);
+    pa_timeval_load(&start);
     do{
         size_t input_remaining = u->window_size - u->samples_gathered;
         pa_assert(input_remaining > 0);
@@ -593,7 +521,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         //buffer->index = 0;
         //pa_memblock_ref(buffer->memblock);
         //pa_sink_render_into(u->sink, buffer);
-        while(pa_memblockq_peek(u->input_q, &tchunk) < 0 || tchunk.memblock == NULL){
+        while(pa_memblockq_peek(u->input_q, &tchunk) < 0){
             pa_sink_render(u->sink, input_remaining*fs, &tchunk);
             pa_assert(tchunk.memblock);
             pa_memblockq_push(u->input_q, &tchunk);
@@ -604,40 +532,47 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         pa_memblockq_drop(u->input_q, tchunk.length);
         //pa_log_debug("asked for %ld input samples, got %ld samples",input_remaining,buffer->length/fs);
         /* copy new input */
-        //gettime(start);
+        //pa_timeval_load(start);
         if(u->first_iteration){
             initialize_buffer(u, &tchunk);
         }else{
             input_buffer(u, &tchunk);
         }
-        //gettime(end);
-        //pa_log_debug("Took %0.5f seconds to setup", tdiff(end, start)*1e-9);
+        //pa_timeval_load(&end);
+        //pa_log_debug("Took %0.5f seconds to setup", pa_timeval_diff(end, start) / (double) PA_USEC_PER_SEC);
         pa_memblock_unref(tchunk.memblock);
     }while(u->samples_gathered < u->window_size);
-    gettime(end);
-    pa_log_debug("Took %0.6f seconds to get data", tdiff(end, start)*1e-9);
+    pa_timeval_load(&end);
+    pa_log_debug("Took %0.6f seconds to get data", pa_timeval_diff(&end, &start) / (double) PA_USEC_PER_SEC);
 
     pa_assert(u->fft_size >= u->window_size);
     pa_assert(u->R < u->window_size);
     /* set the H filter */
-    unsigned H_i = pa_aupdate_read_begin(u->a_H);
-    u->H = u->Hs[H_i];
-    gettime(start);
+    u->H = u->Hs[pa_aupdate_read_begin(u->a_H)];
+    pa_timeval_load(&start);
     /* process a block */
     process_samples(u, chunk);
-    gettime(end);
-    pa_log_debug("Took %0.6f seconds to process", tdiff(end, start)*1e-9);
+    pa_timeval_load(&end);
+    pa_log_debug("Took %0.6f seconds to process", pa_timeval_diff(&end, &start) / (double) PA_USEC_PER_SEC);
     pa_aupdate_read_end(u->a_H);
 
     pa_assert(chunk->memblock);
     //pa_log_debug("gave %ld", chunk->length/fs);
     //pa_log_debug("end pop");
     if(u->first_iteration){
-        u->first_iteration = 0;
+        u->first_iteration = FALSE;
     }
     return 0;
 }
 
+static void reset_filter(struct userdata *u){
+    u->samples_gathered = 0;
+    for(size_t i = 0;i < u->channels; ++i){
+        memset(u->overlap_accum[i], 0, u->overlap_size * sizeof(float));
+    }
+    u->first_iteration = TRUE;
+}
+
 /* Called from I/O thread context */
 static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
     struct userdata *u;
@@ -671,14 +606,6 @@ static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
     pa_memblockq_rewind(u->input_q, nbytes);
 }
 
-void reset_filter(struct userdata *u){
-    u->samples_gathered = 0;
-    for(size_t i = 0;i < u->channels; ++i){
-        memset(u->overlap_accum[i], 0, u->overlap_size * sizeof(float));
-    }
-    u->first_iteration = 1;
-}
-
 /* Called from I/O thread context */
 static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) {
     struct userdata *u;
@@ -693,11 +620,11 @@ static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) {
 /* Called from I/O thread context */
 static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) {
     struct userdata *u;
-
+    size_t fs;
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
 
-    size_t fs = pa_frame_size(&(u->sink->sample_spec));
+    fs = pa_frame_size(&(u->sink->sample_spec));
     //pa_sink_set_max_request_within_thread(u->sink, nbytes);
     //pa_sink_set_max_request_within_thread(u->sink, u->R*fs);
     pa_sink_set_max_request_within_thread(u->sink, ((nbytes+u->R*fs-1)/(u->R*fs))*(u->R*fs));
@@ -740,7 +667,7 @@ static void sink_input_detach_cb(pa_sink_input *i) {
 /* Called from I/O thread context */
 static void sink_input_attach_cb(pa_sink_input *i) {
     struct userdata *u;
-
+    size_t fs;
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
 
@@ -748,9 +675,10 @@ static void sink_input_attach_cb(pa_sink_input *i) {
     pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
 
     pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
+    fs = pa_frame_size(&(u->sink->sample_spec));
     pa_sink_attach_within_thread(u->sink);
+    pa_sink_set_max_request_within_thread(u->sink, mround(pa_sink_get_max_request(i->sink), u->R*fs));
 
-    //size_t fs = pa_frame_size(&(u->sink->sample_spec));
     //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->latency*fs);
     //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->master->thread_info.max_latency);
     //TODO: setting this guy minimizes drop outs but doesn't get rid
@@ -758,7 +686,6 @@ static void sink_input_attach_cb(pa_sink_input *i) {
     //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->latency*fs);
     //TODO: this guy causes dropouts constantly+rewinds, it's unusable
     //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->master->thread_info.max_latency);
-    pa_sink_attach_within_thread(u->sink);
 }
 
 /* Called from main context */
@@ -799,15 +726,15 @@ static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t s
     }
 }
 
-void save_profile(struct userdata *u, char *name){
+static void save_profile(struct userdata *u, char *name){
     float *H_n = pa_xmalloc((u->fft_size / 2 + 1) * sizeof(float));
     const float *H = u->Hs[pa_aupdate_read_begin(u->a_H)];
+    pa_datum key, data;
     for(size_t i = 0 ; i <= u->fft_size / 2 + 1; ++i){
         //H_n[i] = H[i] * u->fft_size;
         H_n[i] = H[i];
     }
     pa_aupdate_read_end(u->a_H);
-    pa_datum key, data;
     key.data=name;
     key.size = strlen(key.data);
     data.data = H_n;
@@ -816,23 +743,23 @@ void save_profile(struct userdata *u, char *name){
     pa_database_sync(u->database);
 }
 
-void save_state(struct userdata *u){
+static void save_state(struct userdata *u){
     char *state_name = pa_sprintf_malloc("%s-previous-state", u->name);
     save_profile(u, state_name);
     pa_xfree(state_name);
 }
 
-void remove_profile(pa_core *c,char *name){
+static void remove_profile(pa_core *c, char *name){
     pa_datum key;
+    pa_database *database;
     key.data = name;
     key.size = strlen(key.data);
-    pa_database *database;
-    pa_assert_se(database = pa_shared_get(c,EQDB));
-    pa_database_unset(database,&key);
+    pa_assert_se(database = pa_shared_get(c, EQDB));
+    pa_database_unset(database, &key);
     pa_database_sync(database);
 }
 
-const char* load_profile(struct userdata *u,char *name){
+static const char* load_profile(struct userdata *u, char *name){
     pa_datum key,value;
     key.data = name;
     key.size = strlen(key.data);
@@ -840,7 +767,6 @@ const char* load_profile(struct userdata *u,char *name){
         if(value.size == (u->fft_size / 2 + 1) * sizeof(float)){
             float *H=u->Hs[pa_aupdate_write_begin(u->a_H)];
             memcpy(H, value.data, value.size);
-            pa_aupdate_write_swap(u->a_H);
             pa_aupdate_write_end(u->a_H);
         }else{
             return "incompatible size";
@@ -852,13 +778,13 @@ const char* load_profile(struct userdata *u,char *name){
     return NULL;
     //fix_filter(u->H, u->fft_size);
 }
-void load_state(struct userdata *u){
+
+static void load_state(struct userdata *u){
     char *state_name=pa_sprintf_malloc("%s-previous-state", u->name);
     load_profile(u,state_name);
     pa_xfree(state_name);
 }
 
-
 /* Called from main context */
 static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) {
     struct userdata *u;
@@ -884,10 +810,11 @@ static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) {
 //and aligned
 static void * alloc(size_t x,size_t s){
     size_t f = mround(x*s, sizeof(float)*v_size);
+    float *t;
     pa_assert_se(f >= x*s);
     //printf("requested %ld floats=%ld bytes, rem=%ld\n", x, x*sizeof(float), x*sizeof(float)%16);
     //printf("giving %ld floats=%ld bytes, rem=%ld\n", f, f*sizeof(float), f*sizeof(float)%16);
-    float *t = fftwf_malloc(f);
+    t = fftwf_malloc(f);
     memset(t, 0, f);
     return t;
 }
@@ -903,6 +830,7 @@ int pa__init(pa_module*m) {
     pa_sink_new_data sink_data;
     pa_bool_t *use_default = NULL;
     size_t fs;
+    float *H;
 
     pa_assert(m);
 
@@ -936,7 +864,6 @@ int pa__init(pa_module*m) {
     u->R = (u->window_size + 1) / 2;
     u->overlap_size = u->window_size - u->R;
     u->samples_gathered = 0;
-    u->input_q = pa_memblockq_new(0,  MEMBLOCKQ_MAXLENGTH, 0, fs, 1, 1, 0, NULL);
     u->a_H = pa_aupdate_new();
     u->latency = u->window_size - u->R;
     for(size_t i = 0; i < 2; ++i){
@@ -945,8 +872,8 @@ int pa__init(pa_module*m) {
     u->W = alloc(u->window_size, sizeof(float));
     u->work_buffer = alloc(u->fft_size, sizeof(float));
     memset(u->work_buffer, 0, u->fft_size*sizeof(float));
-    u->input = (float **)pa_xmalloc0(sizeof(float *)*u->channels);
-    u->overlap_accum = (float **)pa_xmalloc0(sizeof(float *)*u->channels);
+    u->input = pa_xnew0(float *, u->channels);
+    u->overlap_accum = pa_xnew0(float *, u->channels);
     for(size_t c = 0; c < u->channels; ++c){
         u->input[c] = alloc(u->window_size, sizeof(float));
         pa_assert_se(u->input[c]);
@@ -961,7 +888,7 @@ int pa__init(pa_module*m) {
     u->inverse_plan = fftwf_plan_dft_c2r_1d(u->fft_size, u->output_window, u->work_buffer, FFTW_ESTIMATE);
 
     hanning_window(u->W, u->window_size);
-    u->first_iteration = 1;
+    u->first_iteration = TRUE;
 
     /* Create sink */
     pa_sink_new_data_init(&sink_data);
@@ -995,11 +922,9 @@ int pa__init(pa_module*m) {
     u->sink->update_requested_latency = sink_update_requested_latency;
     u->sink->request_rewind = sink_request_rewind;
     u->sink->userdata = u;
+    u->input_q = pa_memblockq_new(0,  MEMBLOCKQ_MAXLENGTH, 0, fs, 1, 1, 0, &u->sink->silence);
 
     pa_sink_set_asyncmsgq(u->sink, master->asyncmsgq);
-    pa_sink_set_max_request(u->sink,
-        ((pa_sink_get_max_request(u->sink)+u->R*fs-1)/(u->R*fs))*(u->R*fs)
-    );
     //pa_sink_set_fixed_latency(u->sink, pa_bytes_to_usec(u->R*fs, &ss));
 
     /* Create sink input */
@@ -1042,12 +967,11 @@ int pa__init(pa_module*m) {
     dbus_init(u);
 
     //default filter to these
-    float *H=u->Hs[pa_aupdate_write_begin(u->a_H)];
+    H=u->Hs[pa_aupdate_write_begin(u->a_H)];
     for(size_t i = 0; i < u->fft_size / 2 + 1; ++i){
         H[i] = 1.0 / sqrtf(2.0f);
     }
     fix_filter(H, u->fft_size);
-    pa_aupdate_write_swap(u->a_H);
     pa_aupdate_write_end(u->a_H);
     //load old parameters
     load_state(u);
@@ -1124,6 +1048,33 @@ void pa__done(pa_module*m) {
     pa_xfree(u);
 }
 
+/*
+ * DBus Routines and Callbacks
+ */
+#define EXTNAME "org.PulseAudio.Ext.Equalizing1"
+#define MANAGER_PATH "/org/pulseaudio/equalizing1"
+#define MANAGER_IFACE EXTNAME ".Manager"
+#define EQUALIZER_IFACE EXTNAME ".Equalizer"
+static void manager_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void get_sinks(pa_core *u, char ***names, unsigned *n_sinks);
+static void manager_get_sinks(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void get_profiles(pa_core *u, char ***names, unsigned *n_sinks);
+static void manager_get_profiles(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void manager_get_all(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void manager_handle_remove_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_get_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void get_filter(struct userdata *u, double **H_);
+static void set_filter(struct userdata *u, double **H_);
 enum manager_method_index {
     MANAGER_METHOD_REMOVE_PROFILE,
     MANAGER_METHOD_MAX
@@ -1267,17 +1218,20 @@ static pa_dbus_interface_info equalizer_info={
     .n_signals=EQUALIZER_SIGNAL_MAX
 };
 
-void dbus_init(struct userdata *u){
+static void dbus_init(struct userdata *u){
+    uint32_t dummy;
+    DBusMessage *signal = NULL;
+    pa_idxset *sink_list = NULL;
     u->dbus_protocol=pa_dbus_protocol_get(u->sink->core);
     u->dbus_path=pa_sprintf_malloc("/org/pulseaudio/core1/sink%d", u->sink->index);
 
     pa_dbus_protocol_add_interface(u->dbus_protocol, u->dbus_path, &equalizer_info, u);
-    pa_idxset *sink_list=pa_shared_get(u->sink->core, SINKLIST);
+    sink_list = pa_shared_get(u->sink->core, SINKLIST);
     u->database=pa_shared_get(u->sink->core, EQDB);
     if(sink_list==NULL){
+        char *dbname;
         sink_list=pa_idxset_new(&pa_idxset_trivial_hash_func, &pa_idxset_trivial_compare_func);
         pa_shared_set(u->sink->core, SINKLIST, sink_list);
-        char *dbname;
         pa_assert_se(dbname = pa_state_path("equalizers", TRUE));
         pa_assert_se(u->database = pa_database_open(dbname, TRUE));
         pa_xfree(dbname);
@@ -1285,17 +1239,15 @@ void dbus_init(struct userdata *u){
         pa_dbus_protocol_add_interface(u->dbus_protocol, MANAGER_PATH, &manager_info, u->sink->core);
         pa_dbus_protocol_register_extension(u->dbus_protocol, EXTNAME);
     }
-    uint32_t dummy;
     pa_idxset_put(sink_list, u, &dummy);
 
-    DBusMessage *signal = NULL;
     pa_assert_se((signal = dbus_message_new_signal(MANAGER_PATH, MANAGER_IFACE, manager_signals[MANAGER_SIGNAL_SINK_ADDED].name)));
     dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &u->dbus_path, DBUS_TYPE_INVALID);
     pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
     dbus_message_unref(signal);
 }
 
-void dbus_done(struct userdata *u){
+static void dbus_done(struct userdata *u){
     pa_idxset *sink_list;
     uint32_t dummy;
 
@@ -1320,14 +1272,16 @@ void dbus_done(struct userdata *u){
     pa_dbus_protocol_unref(u->dbus_protocol);
 }
 
-void manager_handle_remove_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
+static void manager_handle_remove_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
     DBusError error;
     pa_core *c = (pa_core *)_u;
+    DBusMessage *signal = NULL;
+    pa_dbus_protocol *dbus_protocol;
+    char *name;
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(c);
     dbus_error_init(&error);
-    char *name;
     if(!dbus_message_get_args(msg, &error,
                  DBUS_TYPE_STRING, &name,
                 DBUS_TYPE_INVALID)){
@@ -1338,28 +1292,27 @@ void manager_handle_remove_profile(DBusConnection *conn, DBusMessage *msg, void
     remove_profile(c,name);
     pa_dbus_send_empty_reply(conn, msg);
 
-    DBusMessage *signal = NULL;
     pa_assert_se((signal = dbus_message_new_signal(MANAGER_PATH, MANAGER_IFACE, manager_signals[MANAGER_SIGNAL_PROFILES_CHANGED].name)));
-    pa_dbus_protocol *dbus_protocol = pa_dbus_protocol_get(c);
+    dbus_protocol = pa_dbus_protocol_get(c);
     pa_dbus_protocol_send_signal(dbus_protocol, signal);
     pa_dbus_protocol_unref(dbus_protocol);
     dbus_message_unref(signal);
 }
 
-void manager_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){
+static void manager_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){
     uint32_t rev=1;
     pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_UINT32, &rev);
 }
 
-void get_sinks(pa_core *u, char ***names, unsigned *n_sinks){
-    pa_assert(u);
-    pa_assert(names);
-    pa_assert(n_sinks);
-
+static void get_sinks(pa_core *u, char ***names, unsigned *n_sinks){
     void *iter = NULL;
     struct userdata *sink_u = NULL;
     uint32_t dummy;
     pa_idxset *sink_list;
+    pa_assert(u);
+    pa_assert(names);
+    pa_assert(n_sinks);
+
     pa_assert_se(sink_list = pa_shared_get(u, SINKLIST));
     *n_sinks = (unsigned) pa_idxset_size(sink_list);
     *names = *n_sinks > 0 ? pa_xnew0(char *,*n_sinks) : NULL;
@@ -1369,13 +1322,13 @@ void get_sinks(pa_core *u, char ***names, unsigned *n_sinks){
     }
 }
 
-void manager_get_sinks(DBusConnection *conn, DBusMessage *msg, void *_u){
+static void manager_get_sinks(DBusConnection *conn, DBusMessage *msg, void *_u){
+    unsigned n;
+    char **names = NULL;
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(_u);
 
-    unsigned n;
-    char **names = NULL;
     get_sinks((pa_core *) _u, &names, &n);
     pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_OBJECT_PATH, names, n);
     for(unsigned i = 0; i < n; ++i){
@@ -1384,17 +1337,17 @@ void manager_get_sinks(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_xfree(names);
 }
 
-void get_profiles(pa_core *c, char ***names, unsigned *n){
-    pa_assert(c);
-    pa_assert(names);
-    pa_assert(n);
+static void get_profiles(pa_core *c, char ***names, unsigned *n){
     char *name;
     pa_database *database;
-    pa_assert_se(database = pa_shared_get(c, EQDB));
     pa_datum key, next_key;
     pa_strlist *head=NULL, *iter;
+    pa_bool_t done;
+    pa_assert_se(database = pa_shared_get(c, EQDB));
 
-    int done;
+    pa_assert(c);
+    pa_assert(names);
+    pa_assert(n);
     done = !pa_database_first(database, &key, NULL);
     *n = 0;
     while(!done){
@@ -1411,19 +1364,19 @@ void get_profiles(pa_core *c, char ***names, unsigned *n){
     (*names) = *n > 0 ? pa_xnew0(char *, *n) : NULL;
     iter=head;
     for(unsigned i = 0; i < *n; ++i){
-        (*names)[*n-1-i]=pa_xstrdup(pa_strlist_data(iter));
-        iter=pa_strlist_next(iter);
+        (*names)[*n - 1 - i] = pa_xstrdup(pa_strlist_data(iter));
+        iter = pa_strlist_next(iter);
     }
     pa_strlist_free(head);
 }
 
-void manager_get_profiles(DBusConnection *conn, DBusMessage *msg, void *_u){
+static void manager_get_profiles(DBusConnection *conn, DBusMessage *msg, void *_u){
+    char **names;
+    unsigned n;
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(_u);
 
-    char **names;
-    unsigned n;
     get_profiles((pa_core *)_u, &names, &n);
     pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_STRING, names, n);
     for(unsigned i = 0; i < n; ++i){
@@ -1432,21 +1385,22 @@ void manager_get_profiles(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_xfree(names);
 }
 
-void manager_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
-    pa_assert(conn);
-    pa_assert(msg);
-    pa_assert(_u);
-
-    pa_core *c = (pa_core *)_u;
+static void manager_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
+    pa_core *c;
     char **names = NULL;
     unsigned n;
     DBusMessage *reply = NULL;
     DBusMessageIter msg_iter, dict_iter;
+    uint32_t rev;
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert_se(c = _u);
+
     pa_assert_se((reply = dbus_message_new_method_return(msg)));
     dbus_message_iter_init_append(reply, &msg_iter);
     pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
 
-    uint32_t rev=1;
+    rev = 1;
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, manager_handlers[MANAGER_HANDLER_REVISION].property_name, DBUS_TYPE_UINT32, &rev);
 
     get_sinks(c, &names, &n);
@@ -1467,17 +1421,19 @@ void manager_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
     dbus_message_unref(reply);
 }
 
-void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *_u) {
+static void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *_u) {
     struct userdata *u=(struct userdata *) _u;
     DBusError error;
-
-    pa_assert(conn);
-    pa_assert(msg);
-    pa_assert(u);
+    DBusMessage *signal = NULL;
     float *ys;
     uint32_t *xs;
     double *_ys;
-    unsigned x_npoints,y_npoints;
+    unsigned x_npoints, y_npoints;
+    float *H;
+    pa_bool_t points_good = TRUE;
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(u);
 
     dbus_error_init(&error);
 
@@ -1489,14 +1445,13 @@ void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *
         dbus_error_free(&error);
         return;
     }
-    int points_good=1;
     for(size_t i = 0; i < x_npoints; ++i){
         if(xs[i] >= u->fft_size / 2 + 1){
-            points_good=0;
+            points_good = FALSE;
             break;
         }
     }
-    if(!is_monotonic(xs,x_npoints) || !points_good){
+    if(!is_monotonic(xs, x_npoints) || !points_good){
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs must be monotonic and 0<=x<=%ld", u->fft_size / 2);
         dbus_error_free(&error);
         return;
@@ -1505,7 +1460,7 @@ void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs and ys must be the same length and 2<=l<=%ld!", u->fft_size / 2 + 1);
         dbus_error_free(&error);
         return;
-    }else if(xs[0] != 0 || xs[x_npoints-1] != u->fft_size / 2){
+    }else if(xs[0] != 0 || xs[x_npoints - 1] != u->fft_size / 2){
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs[0] must be 0 and xs[-1]=fft_size/2");
         dbus_error_free(&error);
         return;
@@ -1516,10 +1471,9 @@ void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *
         ys[i] = (float) _ys[i];
     }
 
-    float *H = u->Hs[pa_aupdate_write_begin(u->a_H)];
+    H = u->Hs[pa_aupdate_write_begin(u->a_H)];
     interpolate(H, u->fft_size / 2 + 1, xs, ys, x_npoints);
     fix_filter(H, u->fft_size);
-    pa_aupdate_write_swap(u->a_H);
     pa_aupdate_write_end(u->a_H);
     pa_xfree(ys);
 
@@ -1528,22 +1482,23 @@ void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *
 
     pa_dbus_send_empty_reply(conn, msg);
 
-    DBusMessage *signal = NULL;
     pa_assert_se((signal = dbus_message_new_signal(u->dbus_path, EQUALIZER_IFACE, equalizer_signals[EQUALIZER_SIGNAL_FILTER_CHANGED].name)));
     pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
     dbus_message_unref(signal);
 }
 
-void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg, void *_u) {
-    struct userdata *u=(struct userdata *) _u;
+static void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg, void *_u) {
+    struct userdata *u = (struct userdata *) _u;
     DBusError error;
+    uint32_t *xs;
+    double *ys;
+    unsigned x_npoints;
+    float *H;
+    pa_bool_t points_good=TRUE;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(u);
-    uint32_t *xs;
-    double *ys;
-    unsigned x_npoints;
 
     dbus_error_init(&error);
 
@@ -1554,10 +1509,9 @@ void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg,
         dbus_error_free(&error);
         return;
     }
-    int points_good=1;
     for(size_t i = 0; i < x_npoints; ++i){
         if(xs[i] >= u->fft_size / 2 + 1){
-            points_good=0;
+            points_good=FALSE;
             break;
         }
     }
@@ -1569,7 +1523,7 @@ void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg,
     }
 
     ys = pa_xmalloc(x_npoints * sizeof(double));
-    float *H = u->Hs[pa_aupdate_read_begin(u->a_H)];
+    H = u->Hs[pa_aupdate_read_begin(u->a_H)];
     for(uint32_t i = 0; i < x_npoints; ++i){
         ys[i] = H[xs[i]] * u->fft_size;
     }
@@ -1579,14 +1533,15 @@ void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg,
     pa_xfree(ys);
 }
 
-void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
-    struct userdata *u=(struct userdata *) _u;
+static void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
+    struct userdata *u = (struct userdata *) _u;
+    char *name;
+    DBusMessage *signal = NULL;
     DBusError error;
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(u);
     dbus_error_init(&error);
-    char *name;
 
     if(!dbus_message_get_args(msg, &error,
                  DBUS_TYPE_STRING, &name,
@@ -1598,21 +1553,22 @@ void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void
     save_profile(u,name);
     pa_dbus_send_empty_reply(conn, msg);
 
-    DBusMessage *signal = NULL;
     pa_assert_se((signal = dbus_message_new_signal(MANAGER_PATH, MANAGER_IFACE, manager_signals[MANAGER_SIGNAL_PROFILES_CHANGED].name)));
     pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
     dbus_message_unref(signal);
 }
 
-void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
+static void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
     struct userdata *u=(struct userdata *) _u;
+    char *name;
     DBusError error;
+    const char *err_msg = NULL;
+    DBusMessage *signal = NULL;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(u);
     dbus_error_init(&error);
-    char *name;
 
     if(!dbus_message_get_args(msg, &error,
                  DBUS_TYPE_STRING, &name,
@@ -1621,77 +1577,80 @@ void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void
         dbus_error_free(&error);
         return;
     }
-    const char *err_msg=load_profile(u,name);
-    if(err_msg!=NULL){
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "error loading profile %s: %s", name,err_msg);
+    err_msg = load_profile(u,name);
+    if(err_msg != NULL){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "error loading profile %s: %s", name, err_msg);
         dbus_error_free(&error);
         return;
     }
     pa_dbus_send_empty_reply(conn, msg);
 
-    DBusMessage *signal = NULL;
     pa_assert_se((signal = dbus_message_new_signal(u->dbus_path, EQUALIZER_IFACE, equalizer_signals[EQUALIZER_SIGNAL_FILTER_CHANGED].name)));
     pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
     dbus_message_unref(signal);
 }
 
-void equalizer_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){
+static void equalizer_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){
     uint32_t rev=1;
     pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_UINT32, &rev);
 }
 
-void equalizer_get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u){
+static void equalizer_get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u){
+    struct userdata *u;
+    uint32_t n_coefs;
+    pa_assert_se(u = (struct userdata *) _u);
     pa_assert(conn);
     pa_assert(msg);
-    pa_assert(_u);
-
-    struct userdata *u=(struct userdata *)_u;
 
-    uint32_t n_coefs=(uint32_t)(u->fft_size / 2 + 1);
+    n_coefs = (uint32_t) (u->fft_size / 2 + 1);
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &n_coefs);
 }
 
-void equalizer_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
+static void equalizer_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
+    struct userdata *u;
+    uint32_t rate;
+    pa_assert_se(u = (struct userdata *) _u);
     pa_assert(conn);
     pa_assert(msg);
-    pa_assert(_u);
 
-    struct userdata *u=(struct userdata *) _u;
-    uint32_t rate=(uint32_t) u->sink->sample_spec.rate;
+    rate = (uint32_t) u->sink->sample_spec.rate;
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &rate);
 }
 
-void equalizer_get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
+static void equalizer_get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
+    struct userdata *u;
+    uint32_t fft_size;
+    pa_assert_se(u = (struct userdata *) _u);
     pa_assert(conn);
     pa_assert(msg);
-    pa_assert(_u);
 
-    struct userdata *u=(struct userdata *) _u;
-    uint32_t fft_size=(uint32_t) u->fft_size;
+    fft_size = (uint32_t) u->fft_size;
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &fft_size);
 }
 
-void get_filter(struct userdata *u, double **H_){
+static void get_filter(struct userdata *u, double **H_){
+    float *H;
     *H_ = pa_xnew0(double, u->fft_size / 2 + 1);
-    float *H=u->Hs[pa_aupdate_read_begin(u->a_H)];
+    H = u->Hs[pa_aupdate_read_begin(u->a_H)];
     for(size_t i = 0;i < u->fft_size / 2 + 1; ++i){
         (*H_)[i] = H[i] * u->fft_size;
     }
     pa_aupdate_read_end(u->a_H);
 }
 
-void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
-    pa_assert(conn);
-    pa_assert(msg);
-    pa_assert(_u);
-
-    struct userdata *u=(struct userdata *) _u;
+static void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
+    struct userdata *u;
     DBusMessage *reply = NULL;
     DBusMessageIter msg_iter, dict_iter;
-    uint32_t rev=1;
-    uint32_t n_coefs=(uint32_t)(u->fft_size / 2 + 1);
-    uint32_t rate=(uint32_t) u->sink->sample_spec.rate;
-    uint32_t fft_size=(uint32_t) u->fft_size;
+    uint32_t rev, n_coefs, rate, fft_size;
+    double *H;
+    pa_assert_se(u = (struct userdata *) _u);
+    pa_assert(msg);
+
+    rev = 1;
+    n_coefs = (uint32_t) (u->fft_size / 2 + 1);
+    rate = (uint32_t) u->sink->sample_spec.rate;
+    fft_size = (uint32_t) u->fft_size;
 
     pa_assert_se((reply = dbus_message_new_method_return(msg)));
     dbus_message_iter_init_append(reply, &msg_iter);
@@ -1701,7 +1660,6 @@ void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_SAMPLERATE].property_name, DBUS_TYPE_UINT32, &rate);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_FILTERSAMPLERATE].property_name, DBUS_TYPE_UINT32, &fft_size);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_N_COEFS].property_name, DBUS_TYPE_UINT32, &n_coefs);
-    double *H;
     get_filter(u, &H);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_FILTER].property_name, DBUS_TYPE_UINT32, &H);
     pa_xfree(H);
@@ -1711,37 +1669,38 @@ void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
     dbus_message_unref(reply);
 }
 
-void equalizer_get_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
+static void equalizer_get_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
+    struct userdata *u;
+    unsigned n_coefs;
+    double *H_;
+    pa_assert_se(u = (struct userdata *) _u);
+
+    n_coefs = u->fft_size / 2 + 1;
     pa_assert(conn);
     pa_assert(msg);
-    pa_assert(_u);
-
-    struct userdata *u = (struct userdata *)_u;
-    unsigned n_coefs = u->fft_size / 2 + 1;
-    double *H_;
     get_filter(u, &H_);
     pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_DOUBLE, H_, n_coefs);
     pa_xfree(H_);
 }
 
-void set_filter(struct userdata *u, double **H_){
+static void set_filter(struct userdata *u, double **H_){
     float *H = u->Hs[pa_aupdate_write_begin(u->a_H)];
     for(size_t i = 0; i < u->fft_size / 2 + 1; ++i){
         H[i] = (float) (*H_)[i];
     }
     fix_filter(H, u->fft_size);
-    pa_aupdate_write_swap(u->a_H);
     pa_aupdate_write_end(u->a_H);
 }
 
-void equalizer_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
+static void equalizer_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
+    struct userdata *u;
+    double *H;
+    unsigned _n_coefs;
+    DBusMessage *signal = NULL;
+    pa_assert_se(u = (struct userdata *) _u);
     pa_assert(conn);
     pa_assert(msg);
-    pa_assert(_u);
 
-    struct userdata *u=(struct userdata *)_u;
-    double *H;
-    unsigned _n_coefs;
     if(pa_dbus_get_fixed_array_set_property_arg(conn, msg, DBUS_TYPE_DOUBLE, &H, &_n_coefs)){
         return;
     }
@@ -1755,7 +1714,6 @@ void equalizer_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
 
     pa_dbus_send_empty_reply(conn, msg);
 
-    DBusMessage *signal = NULL;
     pa_assert_se((signal = dbus_message_new_signal(u->dbus_path, EQUALIZER_IFACE, equalizer_signals[EQUALIZER_SIGNAL_FILTER_CHANGED].name)));
     pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
     dbus_message_unref(signal);

commit 07cd6a4c3d357e9406bbb0444995c8c21f3a3cab
Author: Jason Newton <nevion at gmail.com>
Date:   Sun Aug 16 14:29:21 2009 -0700

    module-equalizer-sink.c
        i->sink -> i in pa_get_sink_max_request*

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index b7f61c6..d470774 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -677,7 +677,7 @@ static void sink_input_attach_cb(pa_sink_input *i) {
     pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
     fs = pa_frame_size(&(u->sink->sample_spec));
     pa_sink_attach_within_thread(u->sink);
-    pa_sink_set_max_request_within_thread(u->sink, mround(pa_sink_get_max_request(i->sink), u->R*fs));
+    pa_sink_set_max_request_within_thread(u->sink, mround(pa_sink_input_get_max_request(i), u->R*fs));
 
     //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->latency*fs);
     //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->master->thread_info.max_latency);
@@ -811,7 +811,7 @@ static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) {
 static void * alloc(size_t x,size_t s){
     size_t f = mround(x*s, sizeof(float)*v_size);
     float *t;
-    pa_assert_se(f >= x*s);
+    pa_assert(f >= x*s);
     //printf("requested %ld floats=%ld bytes, rem=%ld\n", x, x*sizeof(float), x*sizeof(float)%16);
     //printf("giving %ld floats=%ld bytes, rem=%ld\n", f, f*sizeof(float), f*sizeof(float)%16);
     t = fftwf_malloc(f);
@@ -876,11 +876,8 @@ int pa__init(pa_module*m) {
     u->overlap_accum = pa_xnew0(float *, u->channels);
     for(size_t c = 0; c < u->channels; ++c){
         u->input[c] = alloc(u->window_size, sizeof(float));
-        pa_assert_se(u->input[c]);
         memset(u->input[c], 0, (u->window_size)*sizeof(float));
-        pa_assert_se(u->input[c]);
         u->overlap_accum[c] = alloc(u->overlap_size, sizeof(float));
-        pa_assert_se(u->overlap_accum[c]);
         memset(u->overlap_accum[c], 0, u->overlap_size*sizeof(float));
     }
     u->output_window = alloc((u->fft_size / 2 + 1), sizeof(fftwf_complex));

commit 7bd7ce6deca125d9061ea8d29f6a17e65ba36116
Author: Jason Newton <nevion at gmail.com>
Date:   Sun Aug 16 15:41:40 2009 -0700

    module-equalizer-sink.c: swapped order of attach_within_thread and set_max_request within sink_input_attach_cb

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index d470774..9a4740f 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -543,7 +543,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         pa_memblock_unref(tchunk.memblock);
     }while(u->samples_gathered < u->window_size);
     pa_timeval_load(&end);
-    pa_log_debug("Took %0.6f seconds to get data", pa_timeval_diff(&end, &start) / (double) PA_USEC_PER_SEC);
+    pa_log_debug("Took %0.6f seconds to get data", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
 
     pa_assert(u->fft_size >= u->window_size);
     pa_assert(u->R < u->window_size);
@@ -553,7 +553,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     /* process a block */
     process_samples(u, chunk);
     pa_timeval_load(&end);
-    pa_log_debug("Took %0.6f seconds to process", pa_timeval_diff(&end, &start) / (double) PA_USEC_PER_SEC);
+    pa_log_debug("Took %0.6f seconds to process", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
     pa_aupdate_read_end(u->a_H);
 
     pa_assert(chunk->memblock);
@@ -676,7 +676,6 @@ static void sink_input_attach_cb(pa_sink_input *i) {
 
     pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
     fs = pa_frame_size(&(u->sink->sample_spec));
-    pa_sink_attach_within_thread(u->sink);
     pa_sink_set_max_request_within_thread(u->sink, mround(pa_sink_input_get_max_request(i), u->R*fs));
 
     //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->latency*fs);
@@ -686,6 +685,7 @@ static void sink_input_attach_cb(pa_sink_input *i) {
     //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->latency*fs);
     //TODO: this guy causes dropouts constantly+rewinds, it's unusable
     //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->master->thread_info.max_latency);
+    pa_sink_attach_within_thread(u->sink);
 }
 
 /* Called from main context */

commit ab0e20ab2c0014e495cadb9c4f8e188df125fa7f
Author: Jason Newton <nevion at gmail.com>
Date:   Sun Aug 16 16:14:30 2009 -0700

    module-equalizer-sink: fixed timeval initialization

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 9a4740f..a8ccff8 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -40,6 +40,7 @@ USA.
 #include <pulse/i18n.h>
 #include <pulse/timeval.h>
 
+#include <pulsecore/core-rtclock.h>
 #include <pulsecore/aupdate.h>
 #include <pulsecore/core-error.h>
 #include <pulsecore/namereg.h>
@@ -510,7 +511,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     pa_sink_process_rewind(u->sink, 0);
 
     //pa_log_debug("start output-buffered %ld, input-buffered %ld, requested %ld",buffered_samples,u->samples_gathered,samples_requested);
-    pa_timeval_load(&start);
+    pa_rtclock_get(&start);
     do{
         size_t input_remaining = u->window_size - u->samples_gathered;
         pa_assert(input_remaining > 0);
@@ -532,27 +533,27 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         pa_memblockq_drop(u->input_q, tchunk.length);
         //pa_log_debug("asked for %ld input samples, got %ld samples",input_remaining,buffer->length/fs);
         /* copy new input */
-        //pa_timeval_load(start);
+        //pa_rtclock_get(start);
         if(u->first_iteration){
             initialize_buffer(u, &tchunk);
         }else{
             input_buffer(u, &tchunk);
         }
-        //pa_timeval_load(&end);
+        //pa_rtclock_get(&end);
         //pa_log_debug("Took %0.5f seconds to setup", pa_timeval_diff(end, start) / (double) PA_USEC_PER_SEC);
         pa_memblock_unref(tchunk.memblock);
     }while(u->samples_gathered < u->window_size);
-    pa_timeval_load(&end);
+    pa_rtclock_get(&end);
     pa_log_debug("Took %0.6f seconds to get data", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
 
     pa_assert(u->fft_size >= u->window_size);
     pa_assert(u->R < u->window_size);
     /* set the H filter */
     u->H = u->Hs[pa_aupdate_read_begin(u->a_H)];
-    pa_timeval_load(&start);
+    pa_rtclock_get(&start);
     /* process a block */
     process_samples(u, chunk);
-    pa_timeval_load(&end);
+    pa_rtclock_get(&end);
     pa_log_debug("Took %0.6f seconds to process", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
     pa_aupdate_read_end(u->a_H);
 

commit cd54ecdc8c6b7947bd06a7db69055cfba078f1bf
Author: Jason Newton <nevion at gmail.com>
Date:   Mon Aug 17 10:52:43 2009 -0700

    module-equalizer-sink: drop old macros for new library based ones

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index a8ccff8..5152b64 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -136,7 +136,6 @@ static const char* const valid_modargs[] = {
 
 
 #define v_size 4
-#define mround(x, y) ((x + y - 1) / y) * y
 #define SINKLIST "equalized_sinklist"
 #define EQDB "equalizer_db"
 static void dbus_init(struct userdata *u);
@@ -349,10 +348,10 @@ static void dsp_logic(
 //    fftwf_complex * restrict output_window,//The transformed window'd src
 //    struct userdata *u){//Collection of constants
 //
-//    const size_t window_size = mround(u->window_size,v_size);
-//    const size_t fft_h = mround(u->fft_size / 2 + 1, v_size / 2);
-//    //const size_t R = mround(u->R, v_size);
-//    const size_t overlap_size = mround(u->overlap_size, v_size);
+//    const size_t window_size = PA_ROUND_UP(u->window_size,v_size);
+//    const size_t fft_h = PA_ROUND_UP(u->fft_size / 2 + 1, v_size / 2);
+//    //const size_t R = PA_ROUND_UP(u->R, v_size);
+//    const size_t overlap_size = PA_ROUND_UP(u->overlap_size, v_size);
 //
 //    //assert(u->samples_gathered >= u->R);
 //    //zero out the bit beyond the real overlap so we don't add garbage
@@ -677,7 +676,7 @@ static void sink_input_attach_cb(pa_sink_input *i) {
 
     pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
     fs = pa_frame_size(&(u->sink->sample_spec));
-    pa_sink_set_max_request_within_thread(u->sink, mround(pa_sink_input_get_max_request(i), u->R*fs));
+    pa_sink_set_max_request_within_thread(u->sink, PA_ROUND_UP(pa_sink_input_get_max_request(i), u->R*fs));
 
     //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->latency*fs);
     //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->master->thread_info.max_latency);
@@ -810,7 +809,7 @@ static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) {
 //ensure's memory allocated is a multiple of v_size
 //and aligned
 static void * alloc(size_t x,size_t s){
-    size_t f = mround(x*s, sizeof(float)*v_size);
+    size_t f = PA_ROUND_UP(x*s, sizeof(float)*v_size);
     float *t;
     pa_assert(f >= x*s);
     //printf("requested %ld floats=%ld bytes, rem=%ld\n", x, x*sizeof(float), x*sizeof(float)%16);

commit 735c8ab6fbd9b673c05a2506f3f3c1d64d4d3970
Author: Jason Newton <nevion at gmail.com>
Date:   Tue Aug 18 22:11:37 2009 -0700

    module-equalizer-sink: added support for preamp

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 5152b64..0d82e01 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -104,6 +104,7 @@ struct userdata {
     size_t overlap_size;//window_size-R
     size_t samples_gathered;
     //message
+    float X;
     float *H;//frequency response filter (magnitude based)
     float *W;//windowing function (time domain)
     float *work_buffer, **input, **overlap_accum;
@@ -111,6 +112,7 @@ struct userdata {
     fftwf_plan forward_plan, inverse_plan;
     //size_t samplings;
 
+    float Xs[2];
     float *Hs[2];//thread updatable copies
     pa_aupdate *a_H;
     pa_memchunk conv_buffer;
@@ -138,6 +140,8 @@ static const char* const valid_modargs[] = {
 #define v_size 4
 #define SINKLIST "equalized_sinklist"
 #define EQDB "equalizer_db"
+#define FILTER_SIZE (u->fft_size / 2 + 1)
+#define PROFILE_SIZE (FILTER_SIZE + 1)
 static void dbus_init(struct userdata *u);
 static void dbus_done(struct userdata *u);
 
@@ -199,7 +203,7 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
     switch (code) {
 
         case PA_SINK_MESSAGE_GET_LATENCY: {
-            size_t fs=pa_frame_size(&u->sink->sample_spec);
+            //size_t fs=pa_frame_size(&u->sink->sample_spec);
 
             /* The sink is _put() before the sink input is, so let's
              * make sure we don't access it in that time. Also, the
@@ -215,8 +219,8 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
                 pa_sink_get_latency_within_thread(u->sink_input->sink) +
 
                 /* Add the latency internal to our sink input on top */
-                pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec) +
-                pa_bytes_to_usec(u->samples_gathered * fs, &u->sink->sample_spec);
+                pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec);
+            //    pa_bytes_to_usec(u->samples_gathered * fs, &u->sink->sample_spec);
             //+ pa_bytes_to_usec(u->latency * fs, ss)
             //+ pa_bytes_to_usec(pa_memblockq_get_length(u->input_q), ss);
             return 0;
@@ -274,15 +278,6 @@ static void sink_update_requested_latency(pa_sink *s) {
             pa_sink_get_requested_latency_within_thread(s));
 }
 
-typedef float v4sf __attribute__ ((__aligned__(v_size * sizeof(float))));
-typedef union float_vector {
-    float f[v_size];
-    v4sf v;
-#ifdef __SSE2__
-    __m128 m;
-#endif
-} float_vector_t;
-
 //reference implementation
 static void dsp_logic(
     float * restrict dst,//used as a temp array too, needs to be fft_length!
@@ -299,13 +294,13 @@ static void dsp_logic(
     memset(dst + u->window_size, 0, (u->fft_size - u->window_size) * sizeof(float));
     //window the data
     for(size_t j = 0;j < u->window_size; ++j){
-        dst[j] = W[j] * src[j];
+        dst[j] = u->X * W[j] * src[j];
     }
     //Processing is done here!
     //do fft
     fftwf_execute_dft_r2c(u->forward_plan, dst, output_window);
     //perform filtering
-    for(size_t j = 0; j < u->fft_size / 2 + 1; ++j){
+    for(size_t j = 0; j < FILTER_SIZE; ++j){
         u->output_window[j][0] *= u->H[j];
         u->output_window[j][1] *= u->H[j];
     }
@@ -335,6 +330,15 @@ static void dsp_logic(
     );
 }
 
+typedef float v4sf __attribute__ ((__aligned__(v_size * sizeof(float))));
+typedef union float_vector {
+    float f[v_size];
+    v4sf v;
+#ifdef __SSE2__
+    __m128 m;
+#endif
+} float_vector_t;
+
 ////regardless of sse enabled, the loops in here assume
 ////16 byte aligned addresses and memory allocations divisible by v_size
 //void dsp_logic(
@@ -347,11 +351,12 @@ static void dsp_logic(
 //    const float * restrict W,//The windowing function
 //    fftwf_complex * restrict output_window,//The transformed window'd src
 //    struct userdata *u){//Collection of constants
-//
+      //float_vector_t x = {u->X, u->X, u->X, u->X};
 //    const size_t window_size = PA_ROUND_UP(u->window_size,v_size);
-//    const size_t fft_h = PA_ROUND_UP(u->fft_size / 2 + 1, v_size / 2);
+//    const size_t fft_h = PA_ROUND_UP(FILTER_SIZE, v_size / 2);
 //    //const size_t R = PA_ROUND_UP(u->R, v_size);
 //    const size_t overlap_size = PA_ROUND_UP(u->overlap_size, v_size);
+//     overlap_size = PA_ROUND_UP(u->overlap_size, v_size);
 //
 //    //assert(u->samples_gathered >= u->R);
 //    //zero out the bit beyond the real overlap so we don't add garbage
@@ -368,9 +373,9 @@ static void dsp_logic(
 //        float_vector_t *w = (float_vector_t*) (W+j);
 //        float_vector_t *s = (float_vector_t*) (src+j);
 //#if __SSE2__
-//        d->m = _mm_mul_ps(w->m, s->m);
+//        d->m = _mm_mul_ps(x->m, _mm_mul_ps(w->m, s->m));
 //#else
-//        d->v = w->v * s->v;
+//        d->v = x->v * w->v * s->v;
 //#endif
 //    }
 //    //Processing is done here!
@@ -498,6 +503,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     struct userdata *u;
     size_t fs;
     struct timeval start, end;
+    unsigned a_i;
     pa_memchunk tchunk;
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
@@ -548,7 +554,9 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     pa_assert(u->fft_size >= u->window_size);
     pa_assert(u->R < u->window_size);
     /* set the H filter */
-    u->H = u->Hs[pa_aupdate_read_begin(u->a_H)];
+    a_i = pa_aupdate_read_begin(u->a_H);
+    u->X = u->Xs[a_i];
+    u->H = u->Hs[a_i];
     pa_rtclock_get(&start);
     /* process a block */
     process_samples(u, chunk);
@@ -727,18 +735,25 @@ static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t s
 }
 
 static void save_profile(struct userdata *u, char *name){
-    float *H_n = pa_xmalloc((u->fft_size / 2 + 1) * sizeof(float));
-    const float *H = u->Hs[pa_aupdate_read_begin(u->a_H)];
+    unsigned a_i;
+    const size_t profile_size = PROFILE_SIZE * sizeof(float);
+    float *H_n, *profile;
+    const float *H;
     pa_datum key, data;
-    for(size_t i = 0 ; i <= u->fft_size / 2 + 1; ++i){
+    profile = pa_xnew0(float, profile_size);
+    a_i = pa_aupdate_read_begin(u->a_H);
+    H_n = profile + 1;
+    H = u->Hs[a_i];
+    profile[0] = u->Xs[a_i];
+    for(size_t i = 0 ; i <= FILTER_SIZE; ++i){
         //H_n[i] = H[i] * u->fft_size;
         H_n[i] = H[i];
     }
     pa_aupdate_read_end(u->a_H);
     key.data=name;
     key.size = strlen(key.data);
-    data.data = H_n;
-    data.size = (u->fft_size / 2 + 1) * sizeof(float);
+    data.data = profile;
+    data.size = profile_size;
     pa_database_set(u->database, &key, &data, TRUE);
     pa_database_sync(u->database);
 }
@@ -760,13 +775,17 @@ static void remove_profile(pa_core *c, char *name){
 }
 
 static const char* load_profile(struct userdata *u, char *name){
-    pa_datum key,value;
+    unsigned a_i;
+    pa_datum key, value;
+    const size_t profile_size = PROFILE_SIZE * sizeof(float);
     key.data = name;
     key.size = strlen(key.data);
     if(pa_database_get(u->database, &key, &value) != NULL){
-        if(value.size == (u->fft_size / 2 + 1) * sizeof(float)){
-            float *H=u->Hs[pa_aupdate_write_begin(u->a_H)];
-            memcpy(H, value.data, value.size);
+        if(value.size == profile_size){
+            float *H = (float *) value.data;
+            a_i = pa_aupdate_write_begin(u->a_H);
+            u->Xs[a_i] = H[0];
+            memcpy(u->Hs[a_i], H + 1, (FILTER_SIZE) * sizeof(float));
             pa_aupdate_write_end(u->a_H);
         }else{
             return "incompatible size";
@@ -831,6 +850,7 @@ int pa__init(pa_module*m) {
     pa_bool_t *use_default = NULL;
     size_t fs;
     float *H;
+    unsigned a_i;
 
     pa_assert(m);
 
@@ -867,7 +887,7 @@ int pa__init(pa_module*m) {
     u->a_H = pa_aupdate_new();
     u->latency = u->window_size - u->R;
     for(size_t i = 0; i < 2; ++i){
-        u->Hs[i] = alloc((u->fft_size / 2 + 1), sizeof(float));
+        u->Hs[i] = alloc((FILTER_SIZE), sizeof(float));
     }
     u->W = alloc(u->window_size, sizeof(float));
     u->work_buffer = alloc(u->fft_size, sizeof(float));
@@ -880,7 +900,7 @@ int pa__init(pa_module*m) {
         u->overlap_accum[c] = alloc(u->overlap_size, sizeof(float));
         memset(u->overlap_accum[c], 0, u->overlap_size*sizeof(float));
     }
-    u->output_window = alloc((u->fft_size / 2 + 1), sizeof(fftwf_complex));
+    u->output_window = alloc((FILTER_SIZE), sizeof(fftwf_complex));
     u->forward_plan = fftwf_plan_dft_r2c_1d(u->fft_size, u->work_buffer, u->output_window, FFTW_ESTIMATE);
     u->inverse_plan = fftwf_plan_dft_c2r_1d(u->fft_size, u->output_window, u->work_buffer, FFTW_ESTIMATE);
 
@@ -964,8 +984,10 @@ int pa__init(pa_module*m) {
     dbus_init(u);
 
     //default filter to these
-    H=u->Hs[pa_aupdate_write_begin(u->a_H)];
-    for(size_t i = 0; i < u->fft_size / 2 + 1; ++i){
+    a_i = pa_aupdate_write_begin(u->a_H);
+    H = u->Hs[a_i];
+    u->Xs[a_i] = 1.0f;
+    for(size_t i = 0; i < FILTER_SIZE; ++i){
         H[i] = 1.0 / sqrtf(2.0f);
     }
     fix_filter(H, u->fft_size);
@@ -1053,9 +1075,7 @@ void pa__done(pa_module*m) {
 #define MANAGER_IFACE EXTNAME ".Manager"
 #define EQUALIZER_IFACE EXTNAME ".Equalizer"
 static void manager_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void get_sinks(pa_core *u, char ***names, unsigned *n_sinks);
 static void manager_get_sinks(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void get_profiles(pa_core *u, char ***names, unsigned *n_sinks);
 static void manager_get_profiles(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void manager_get_all(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void manager_handle_remove_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
@@ -1064,14 +1084,12 @@ static void equalizer_get_sample_rate(DBusConnection *conn, DBusMessage *msg, vo
 static void equalizer_get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_get_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void get_filter(struct userdata *u, double **H_);
-static void set_filter(struct userdata *u, double **H_);
 enum manager_method_index {
     MANAGER_METHOD_REMOVE_PROFILE,
     MANAGER_METHOD_MAX
@@ -1144,16 +1162,19 @@ enum equalizer_handler_index {
     EQUALIZER_HANDLER_FILTERSAMPLERATE,
     EQUALIZER_HANDLER_N_COEFS,
     EQUALIZER_HANDLER_FILTER,
+    EQUALIZER_HANDLER_PREAMP,
     EQUALIZER_HANDLER_MAX
 };
 
 pa_dbus_arg_info filter_points_args[]={
     {"xs", "au","in"},
     {"ys", "ad","out"},
+    {"preamp", "d","out"},
 };
 pa_dbus_arg_info seed_filter_args[]={
     {"xs", "au","in"},
     {"ys", "ad","in"},
+    {"preamp", "d","in"},
 };
 pa_dbus_arg_info save_profile_args[]={
     {"name", "s","in"},
@@ -1190,7 +1211,7 @@ static pa_dbus_property_handler equalizer_handlers[EQUALIZER_HANDLER_MAX]={
     [EQUALIZER_HANDLER_SAMPLERATE]{.property_name="SampleRate",.type="u",.get_cb=equalizer_get_sample_rate,.set_cb=NULL},
     [EQUALIZER_HANDLER_FILTERSAMPLERATE]{.property_name="FilterSampleRate",.type="u",.get_cb=equalizer_get_filter_rate,.set_cb=NULL},
     [EQUALIZER_HANDLER_N_COEFS]{.property_name="NFilterCoefficients",.type="u",.get_cb=equalizer_get_n_coefs,.set_cb=NULL},
-    [EQUALIZER_HANDLER_FILTER]{.property_name="Filter",.type="ad",.get_cb=equalizer_get_filter,.set_cb=equalizer_set_filter},
+    [EQUALIZER_HANDLER_FILTER]{.property_name="Filter",.type="ad",.get_cb=equalizer_get_filter,.set_cb=equalizer_set_filter}
 };
 
 enum equalizer_signal_index{
@@ -1215,7 +1236,7 @@ static pa_dbus_interface_info equalizer_info={
     .n_signals=EQUALIZER_SIGNAL_MAX
 };
 
-static void dbus_init(struct userdata *u){
+void dbus_init(struct userdata *u){
     uint32_t dummy;
     DBusMessage *signal = NULL;
     pa_idxset *sink_list = NULL;
@@ -1244,7 +1265,7 @@ static void dbus_init(struct userdata *u){
     dbus_message_unref(signal);
 }
 
-static void dbus_done(struct userdata *u){
+void dbus_done(struct userdata *u){
     pa_idxset *sink_list;
     uint32_t dummy;
 
@@ -1269,7 +1290,7 @@ static void dbus_done(struct userdata *u){
     pa_dbus_protocol_unref(u->dbus_protocol);
 }
 
-static void manager_handle_remove_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
+void manager_handle_remove_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
     DBusError error;
     pa_core *c = (pa_core *)_u;
     DBusMessage *signal = NULL;
@@ -1296,7 +1317,7 @@ static void manager_handle_remove_profile(DBusConnection *conn, DBusMessage *msg
     dbus_message_unref(signal);
 }
 
-static void manager_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){
+void manager_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){
     uint32_t rev=1;
     pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_UINT32, &rev);
 }
@@ -1319,7 +1340,7 @@ static void get_sinks(pa_core *u, char ***names, unsigned *n_sinks){
     }
 }
 
-static void manager_get_sinks(DBusConnection *conn, DBusMessage *msg, void *_u){
+void manager_get_sinks(DBusConnection *conn, DBusMessage *msg, void *_u){
     unsigned n;
     char **names = NULL;
     pa_assert(conn);
@@ -1367,7 +1388,7 @@ static void get_profiles(pa_core *c, char ***names, unsigned *n){
     pa_strlist_free(head);
 }
 
-static void manager_get_profiles(DBusConnection *conn, DBusMessage *msg, void *_u){
+void manager_get_profiles(DBusConnection *conn, DBusMessage *msg, void *_u){
     char **names;
     unsigned n;
     pa_assert(conn);
@@ -1382,7 +1403,7 @@ static void manager_get_profiles(DBusConnection *conn, DBusMessage *msg, void *_
     pa_xfree(names);
 }
 
-static void manager_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
+void manager_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_core *c;
     char **names = NULL;
     unsigned n;
@@ -1418,14 +1439,14 @@ static void manager_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
     dbus_message_unref(reply);
 }
 
-static void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *_u) {
+void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *_u) {
     struct userdata *u=(struct userdata *) _u;
     DBusError error;
     DBusMessage *signal = NULL;
     float *ys;
     uint32_t *xs;
-    double *_ys;
-    unsigned x_npoints, y_npoints;
+    double *_ys, preamp;
+    unsigned x_npoints, y_npoints, a_i;
     float *H;
     pa_bool_t points_good = TRUE;
     pa_assert(conn);
@@ -1437,13 +1458,14 @@ static void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg,
     if(!dbus_message_get_args(msg, &error,
                 DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &xs, &x_npoints,
                 DBUS_TYPE_ARRAY, DBUS_TYPE_DOUBLE, &_ys, &y_npoints,
+                DBUS_TYPE_DOUBLE, &preamp,
                 DBUS_TYPE_INVALID)){
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
         dbus_error_free(&error);
         return;
     }
     for(size_t i = 0; i < x_npoints; ++i){
-        if(xs[i] >= u->fft_size / 2 + 1){
+        if(xs[i] >= FILTER_SIZE){
             points_good = FALSE;
             break;
         }
@@ -1453,8 +1475,8 @@ static void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg,
         dbus_error_free(&error);
         return;
 
-    }else if(x_npoints != y_npoints || x_npoints < 2 || x_npoints > u->fft_size / 2 +1  ){
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs and ys must be the same length and 2<=l<=%ld!", u->fft_size / 2 + 1);
+    }else if(x_npoints != y_npoints || x_npoints < 2 || x_npoints > FILTER_SIZE  ){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs and ys must be the same length and 2<=l<=%ld!", FILTER_SIZE);
         dbus_error_free(&error);
         return;
     }else if(xs[0] != 0 || xs[x_npoints - 1] != u->fft_size / 2){
@@ -1467,9 +1489,10 @@ static void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg,
     for(uint32_t i = 0; i < x_npoints; ++i){
         ys[i] = (float) _ys[i];
     }
-
-    H = u->Hs[pa_aupdate_write_begin(u->a_H)];
-    interpolate(H, u->fft_size / 2 + 1, xs, ys, x_npoints);
+    a_i = pa_aupdate_write_begin(u->a_H);
+    H = u->Hs[a_i];
+    u->Xs[a_i] = preamp;
+    interpolate(H, FILTER_SIZE, xs, ys, x_npoints);
     fix_filter(H, u->fft_size);
     pa_aupdate_write_end(u->a_H);
     pa_xfree(ys);
@@ -1484,14 +1507,16 @@ static void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg,
     dbus_message_unref(signal);
 }
 
-static void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg, void *_u) {
+void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg, void *_u) {
     struct userdata *u = (struct userdata *) _u;
     DBusError error;
     uint32_t *xs;
-    double *ys;
-    unsigned x_npoints;
+    double *ys, preamp;
+    unsigned x_npoints, a_i;
     float *H;
     pa_bool_t points_good=TRUE;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
 
     pa_assert(conn);
     pa_assert(msg);
@@ -1507,30 +1532,39 @@ static void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage
         return;
     }
     for(size_t i = 0; i < x_npoints; ++i){
-        if(xs[i] >= u->fft_size / 2 + 1){
+        if(xs[i] >= FILTER_SIZE){
             points_good=FALSE;
             break;
         }
     }
 
-    if(x_npoints > u->fft_size / 2 +1 || !points_good){
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs indices/length must be <= %ld!", u->fft_size / 2 + 1);
+    if(x_npoints > FILTER_SIZE || !points_good){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs indices/length must be <= %ld!", FILTER_SIZE);
         dbus_error_free(&error);
         return;
     }
 
     ys = pa_xmalloc(x_npoints * sizeof(double));
-    H = u->Hs[pa_aupdate_read_begin(u->a_H)];
+    a_i = pa_aupdate_read_begin(u->a_H);
+    H = u->Hs[a_i];
+    preamp = u->Xs[a_i];
     for(uint32_t i = 0; i < x_npoints; ++i){
         ys[i] = H[xs[i]] * u->fft_size;
     }
     pa_aupdate_read_end(u->a_H);
 
-    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_DOUBLE, ys, x_npoints);
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+    dbus_message_iter_init_append(reply, &msg_iter);
+
+    pa_dbus_append_basic_array(&msg_iter, DBUS_TYPE_DOUBLE, ys, x_npoints);
+    pa_dbus_append_basic_variant(&msg_iter, DBUS_TYPE_DOUBLE, &preamp);
+
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+    dbus_message_unref(reply);
     pa_xfree(ys);
 }
 
-static void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
+void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
     struct userdata *u = (struct userdata *) _u;
     char *name;
     DBusMessage *signal = NULL;
@@ -1555,7 +1589,7 @@ static void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg
     dbus_message_unref(signal);
 }
 
-static void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
+void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
     struct userdata *u=(struct userdata *) _u;
     char *name;
     DBusError error;
@@ -1574,7 +1608,7 @@ static void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg
         dbus_error_free(&error);
         return;
     }
-    err_msg = load_profile(u,name);
+    err_msg = load_profile(u, name);
     if(err_msg != NULL){
         pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "error loading profile %s: %s", name, err_msg);
         dbus_error_free(&error);
@@ -1587,23 +1621,23 @@ static void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg
     dbus_message_unref(signal);
 }
 
-static void equalizer_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){
+void equalizer_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){
     uint32_t rev=1;
     pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_UINT32, &rev);
 }
 
-static void equalizer_get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u){
+void equalizer_get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u){
     struct userdata *u;
     uint32_t n_coefs;
     pa_assert_se(u = (struct userdata *) _u);
     pa_assert(conn);
     pa_assert(msg);
 
-    n_coefs = (uint32_t) (u->fft_size / 2 + 1);
+    n_coefs = (uint32_t) PROFILE_SIZE;
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &n_coefs);
 }
 
-static void equalizer_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
+void equalizer_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
     struct userdata *u;
     uint32_t rate;
     pa_assert_se(u = (struct userdata *) _u);
@@ -1614,7 +1648,7 @@ static void equalizer_get_sample_rate(DBusConnection *conn, DBusMessage *msg, vo
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &rate);
 }
 
-static void equalizer_get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
+void equalizer_get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u){
     struct userdata *u;
     uint32_t fft_size;
     pa_assert_se(u = (struct userdata *) _u);
@@ -1625,71 +1659,47 @@ static void equalizer_get_filter_rate(DBusConnection *conn, DBusMessage *msg, vo
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &fft_size);
 }
 
-static void get_filter(struct userdata *u, double **H_){
+static double * get_filter(struct userdata *u){
     float *H;
-    *H_ = pa_xnew0(double, u->fft_size / 2 + 1);
-    H = u->Hs[pa_aupdate_read_begin(u->a_H)];
-    for(size_t i = 0;i < u->fft_size / 2 + 1; ++i){
-        (*H_)[i] = H[i] * u->fft_size;
+    double *H_;
+    unsigned a_i;
+    H_ = pa_xnew0(double, PROFILE_SIZE);
+    a_i = pa_aupdate_read_begin(u->a_H);
+    H = u->Hs[a_i];
+    H_[0] = u->Xs[a_i];
+    for(size_t i = 0;i < FILTER_SIZE; ++i){
+        H_[i + 1] = H[i] * u->fft_size;
     }
     pa_aupdate_read_end(u->a_H);
+    return H_;
 }
 
-static void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
-    struct userdata *u;
-    DBusMessage *reply = NULL;
-    DBusMessageIter msg_iter, dict_iter;
-    uint32_t rev, n_coefs, rate, fft_size;
-    double *H;
-    pa_assert_se(u = (struct userdata *) _u);
-    pa_assert(msg);
-
-    rev = 1;
-    n_coefs = (uint32_t) (u->fft_size / 2 + 1);
-    rate = (uint32_t) u->sink->sample_spec.rate;
-    fft_size = (uint32_t) u->fft_size;
-
-    pa_assert_se((reply = dbus_message_new_method_return(msg)));
-    dbus_message_iter_init_append(reply, &msg_iter);
-    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
-
-    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_REVISION].property_name, DBUS_TYPE_UINT32, &rev);
-    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_SAMPLERATE].property_name, DBUS_TYPE_UINT32, &rate);
-    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_FILTERSAMPLERATE].property_name, DBUS_TYPE_UINT32, &fft_size);
-    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_N_COEFS].property_name, DBUS_TYPE_UINT32, &n_coefs);
-    get_filter(u, &H);
-    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_FILTER].property_name, DBUS_TYPE_UINT32, &H);
-    pa_xfree(H);
-
-    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
-    pa_assert_se(dbus_connection_send(conn, reply, NULL));
-    dbus_message_unref(reply);
-}
-
-static void equalizer_get_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
+void equalizer_get_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
     struct userdata *u;
     unsigned n_coefs;
     double *H_;
     pa_assert_se(u = (struct userdata *) _u);
 
-    n_coefs = u->fft_size / 2 + 1;
+    n_coefs = PROFILE_SIZE;
     pa_assert(conn);
     pa_assert(msg);
-    get_filter(u, &H_);
+    H_ = get_filter(u);
     pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_DOUBLE, H_, n_coefs);
     pa_xfree(H_);
 }
 
-static void set_filter(struct userdata *u, double **H_){
-    float *H = u->Hs[pa_aupdate_write_begin(u->a_H)];
-    for(size_t i = 0; i < u->fft_size / 2 + 1; ++i){
-        H[i] = (float) (*H_)[i];
+static void set_filter(struct userdata *u, double *H_){
+    unsigned a_i= pa_aupdate_write_begin(u->a_H);
+    float *H = u->Hs[a_i];
+    u->Xs[a_i] = H_[0];
+    for(size_t i = 0; i < FILTER_SIZE; ++i){
+        H[i] = (float) H_[i + 1];
     }
-    fix_filter(H, u->fft_size);
+    fix_filter(H + 1, u->fft_size);
     pa_aupdate_write_end(u->a_H);
 }
 
-static void equalizer_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
+void equalizer_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
     struct userdata *u;
     double *H;
     unsigned _n_coefs;
@@ -1701,13 +1711,11 @@ static void equalizer_set_filter(DBusConnection *conn, DBusMessage *msg, void *_
     if(pa_dbus_get_fixed_array_set_property_arg(conn, msg, DBUS_TYPE_DOUBLE, &H, &_n_coefs)){
         return;
     }
-    if(_n_coefs!=u->fft_size / 2 + 1){
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "This filter takes exactly %ld coefficients, you gave %d", u->fft_size / 2 + 1, _n_coefs);
+    if(_n_coefs != PROFILE_SIZE){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "This filter takes exactly %ld coefficients, you gave %d", PROFILE_SIZE, _n_coefs);
         return;
     }
-    set_filter(u, &H);
-    //Stupid for IO reasons?  Add a save signal to dbus instead
-    //save_state(u);
+    set_filter(u, H);
 
     pa_dbus_send_empty_reply(conn, msg);
 
@@ -1715,3 +1723,34 @@ static void equalizer_set_filter(DBusConnection *conn, DBusMessage *msg, void *_
     pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
     dbus_message_unref(signal);
 }
+
+void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
+    struct userdata *u;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter, dict_iter;
+    uint32_t rev, n_coefs, rate, fft_size;
+    double *H;
+    pa_assert_se(u = (struct userdata *) _u);
+    pa_assert(msg);
+
+    rev = 1;
+    n_coefs = (uint32_t) PROFILE_SIZE;
+    rate = (uint32_t) u->sink->sample_spec.rate;
+    fft_size = (uint32_t) u->fft_size;
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "{sv}", &dict_iter));
+
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_REVISION].property_name, DBUS_TYPE_UINT32, &rev);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_SAMPLERATE].property_name, DBUS_TYPE_UINT32, &rate);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_FILTERSAMPLERATE].property_name, DBUS_TYPE_UINT32, &fft_size);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_N_COEFS].property_name, DBUS_TYPE_UINT32, &n_coefs);
+    H = get_filter(u);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_FILTER].property_name, DBUS_TYPE_UINT32, &H);
+    pa_xfree(H);
+
+    pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+    dbus_message_unref(reply);
+}

commit 2f6fd32cc5726b47d332ad71c0f04f16614118ba
Author: Jason Newton <nevion at gmail.com>
Date:   Wed Aug 19 00:30:07 2009 -0700

    module-equalizer-sink: fixed a bug w/ new zero-latency input scheme (that was an interesting/cool bug!)

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 0d82e01..67a3d74 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -104,8 +104,6 @@ struct userdata {
     size_t overlap_size;//window_size-R
     size_t samples_gathered;
     //message
-    float X;
-    float *H;//frequency response filter (magnitude based)
     float *W;//windowing function (time domain)
     float *work_buffer, **input, **overlap_accum;
     fftwf_complex *output_window;
@@ -113,7 +111,7 @@ struct userdata {
     //size_t samplings;
 
     float Xs[2];
-    float *Hs[2];//thread updatable copies
+    float *Hs[2];//thread updatable copies of the freq response filters (magintude based)
     pa_aupdate *a_H;
     pa_memchunk conv_buffer;
     pa_memblockq *input_q;
@@ -284,7 +282,8 @@ static void dsp_logic(
     float * restrict src,/*input data w/ overlap at start,
                                *automatically cycled in routine
                                */
-    float * restrict overlap,//The size of the overlap
+    float * restrict overlap,
+    const float X,//multipliar
     const float * restrict H,//The freq. magnitude scalers filter
     const float * restrict W,//The windowing function
     fftwf_complex * restrict output_window,//The transformed window'd src
@@ -293,16 +292,16 @@ static void dsp_logic(
     //zero padd the data
     memset(dst + u->window_size, 0, (u->fft_size - u->window_size) * sizeof(float));
     //window the data
-    for(size_t j = 0;j < u->window_size; ++j){
-        dst[j] = u->X * W[j] * src[j];
+    for(size_t j = 0; j < u->window_size; ++j){
+        dst[j] = X * W[j] * src[j];
     }
     //Processing is done here!
     //do fft
     fftwf_execute_dft_r2c(u->forward_plan, dst, output_window);
     //perform filtering
     for(size_t j = 0; j < FILTER_SIZE; ++j){
-        u->output_window[j][0] *= u->H[j];
-        u->output_window[j][1] *= u->H[j];
+        u->output_window[j][0] *= H[j];
+        u->output_window[j][1] *= H[j];
     }
     //inverse fft
     fftwf_execute_dft_c2r(u->inverse_plan, output_window, dst);
@@ -314,9 +313,9 @@ static void dsp_logic(
     //}
 
     //overlap add and preserve overlap component from this window (linear phase)
-    for(size_t j = 0;j < u->overlap_size; ++j){
+    for(size_t j = 0; j < u->overlap_size; ++j){
         u->work_buffer[j] += overlap[j];
-        overlap[j] = dst[u->R+j];
+        overlap[j] = dst[u->R + j];
     }
     ////debug: tests if basic buffering works
     ////shouldn't modify the signal AT ALL (beyond roundoff)
@@ -325,8 +324,8 @@ static void dsp_logic(
     //}
 
     //preseve the needed input for the next window's overlap
-    memmove(src, src+u->R,
-        ((u->overlap_size + u->samples_gathered) - u->R)*sizeof(float)
+    memmove(src, src + u->R,
+        u->overlap_size * sizeof(float)
     );
 }
 
@@ -347,11 +346,12 @@ typedef union float_vector {
 //                               *automatically cycled in routine
 //                               */
 //    float * restrict overlap,//The size of the overlap
+//    const float X,//multipliar
 //    const float * restrict H,//The freq. magnitude scalers filter
 //    const float * restrict W,//The windowing function
 //    fftwf_complex * restrict output_window,//The transformed window'd src
 //    struct userdata *u){//Collection of constants
-      //float_vector_t x = {u->X, u->X, u->X, u->X};
+      //float_vector_t x = {X, X, X, X};
 //    const size_t window_size = PA_ROUND_UP(u->window_size,v_size);
 //    const size_t fft_h = PA_ROUND_UP(FILTER_SIZE, v_size / 2);
 //    //const size_t R = PA_ROUND_UP(u->R, v_size);
@@ -430,25 +430,33 @@ typedef union float_vector {
 //    //}
 //
 //    //preseve the needed input for the next window's overlap
-//    memmove(src, src+u->R,
-//        ((u->overlap_size+u->samples_gathered)+-u->R)*sizeof(float)
+//    memmove(src, src + u->R,
+//        u->overlap_size * sizeof(float)
 //    );
 //}
 
 static void process_samples(struct userdata *u, pa_memchunk *tchunk){
     size_t fs=pa_frame_size(&(u->sink->sample_spec));
     float *dst;
+    unsigned a_i;
+    float *H, X;
     pa_assert(u->samples_gathered >= u->R);
     tchunk->index = 0;
     tchunk->length = u->R * fs;
     tchunk->memblock = pa_memblock_new(u->sink->core->mempool, tchunk->length);
     dst = ((float*)pa_memblock_acquire(tchunk->memblock));
+    /* set the H filter */
+    a_i = pa_aupdate_read_begin(u->a_H);
+    X = u->Xs[a_i];
+    H = u->Hs[a_i];
+
     for(size_t c=0;c < u->channels; c++) {
         dsp_logic(
             u->work_buffer,
             u->input[c],
             u->overlap_accum[c],
-            u->H,
+            X,
+            H,
             u->W,
             u->output_window,
             u
@@ -465,6 +473,8 @@ static void process_samples(struct userdata *u, pa_memchunk *tchunk){
     }
     pa_memblock_release(tchunk->memblock);
     u->samples_gathered -= u->R;
+
+    pa_aupdate_read_end(u->a_H);
 }
 
 static void initialize_buffer(struct userdata *u, pa_memchunk *in){
@@ -492,7 +502,7 @@ static void input_buffer(struct userdata *u, pa_memchunk *in){
         pa_assert_se(
             u->input[c]+u->samples_gathered+samples <= u->input[c]+u->window_size
         );
-        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, u->input[c]+u->overlap_size+u->samples_gathered, sizeof(float), src + c, fs, samples);
+        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, u->input[c]+u->samples_gathered, sizeof(float), src + c, fs, samples);
     }
     u->samples_gathered += samples;
     pa_memblock_release(in->memblock);
@@ -503,7 +513,6 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     struct userdata *u;
     size_t fs;
     struct timeval start, end;
-    unsigned a_i;
     pa_memchunk tchunk;
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
@@ -554,15 +563,11 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     pa_assert(u->fft_size >= u->window_size);
     pa_assert(u->R < u->window_size);
     /* set the H filter */
-    a_i = pa_aupdate_read_begin(u->a_H);
-    u->X = u->Xs[a_i];
-    u->H = u->Hs[a_i];
     pa_rtclock_get(&start);
     /* process a block */
     process_samples(u, chunk);
     pa_rtclock_get(&end);
     pa_log_debug("Took %0.6f seconds to process", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
-    pa_aupdate_read_end(u->a_H);
 
     pa_assert(chunk->memblock);
     //pa_log_debug("gave %ld", chunk->length/fs);
@@ -1162,7 +1167,6 @@ enum equalizer_handler_index {
     EQUALIZER_HANDLER_FILTERSAMPLERATE,
     EQUALIZER_HANDLER_N_COEFS,
     EQUALIZER_HANDLER_FILTER,
-    EQUALIZER_HANDLER_PREAMP,
     EQUALIZER_HANDLER_MAX
 };
 

commit b028e4e917441f138197a5c6a7b86b50b26bc35b
Author: Jason Newton <nevion at gmail.com>
Date:   Wed Aug 19 23:22:33 2009 -0700

    module-equalizer-sink: per-channel filtering support + profiles, easier default configuration

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 67a3d74..98b6b89 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -110,15 +110,16 @@ struct userdata {
     fftwf_plan forward_plan, inverse_plan;
     //size_t samplings;
 
-    float Xs[2];
-    float *Hs[2];//thread updatable copies of the freq response filters (magintude based)
-    pa_aupdate *a_H;
+    float **Xs;
+    float ***Hs;//thread updatable copies of the freq response filters (magintude based)
+    pa_aupdate **a_H;
     pa_memchunk conv_buffer;
     pa_memblockq *input_q;
     pa_bool_t first_iteration;
 
     pa_dbus_protocol *dbus_protocol;
     char *dbus_path;
+    pa_bool_t set_default;
 
     pa_database *database;
 };
@@ -129,6 +130,7 @@ static const char* const valid_modargs[] = {
     "master",
     "format",
     "rate",
+    "set_default",
     "channels",
     "channel_map",
     NULL
@@ -138,8 +140,10 @@ static const char* const valid_modargs[] = {
 #define v_size 4
 #define SINKLIST "equalized_sinklist"
 #define EQDB "equalizer_db"
+#define EQ_STATE_DB "equalizer-state"
 #define FILTER_SIZE (u->fft_size / 2 + 1)
-#define PROFILE_SIZE (FILTER_SIZE + 1)
+#define CHANNEL_PROFILE_SIZE (FILTER_SIZE + 1)
+#define STATE_SIZE (CHANNEL_PROFILE_SIZE * u->channels)
 static void dbus_init(struct userdata *u);
 static void dbus_done(struct userdata *u);
 
@@ -445,12 +449,11 @@ static void process_samples(struct userdata *u, pa_memchunk *tchunk){
     tchunk->length = u->R * fs;
     tchunk->memblock = pa_memblock_new(u->sink->core->mempool, tchunk->length);
     dst = ((float*)pa_memblock_acquire(tchunk->memblock));
-    /* set the H filter */
-    a_i = pa_aupdate_read_begin(u->a_H);
-    X = u->Xs[a_i];
-    H = u->Hs[a_i];
 
     for(size_t c=0;c < u->channels; c++) {
+        a_i = pa_aupdate_read_begin(u->a_H[c]);
+        X = u->Xs[c][a_i];
+        H = u->Hs[c][a_i];
         dsp_logic(
             u->work_buffer,
             u->input[c],
@@ -461,6 +464,7 @@ static void process_samples(struct userdata *u, pa_memchunk *tchunk){
             u->output_window,
             u
         );
+        pa_aupdate_read_end(u->a_H[c]);
         if(u->first_iteration){
             /* The windowing function will make the audio ramped in, as a cheap fix we can
              * undo the windowing (for non-zero window values)
@@ -473,8 +477,6 @@ static void process_samples(struct userdata *u, pa_memchunk *tchunk){
     }
     pa_memblock_release(tchunk->memblock);
     u->samples_gathered -= u->R;
-
-    pa_aupdate_read_end(u->a_H);
 }
 
 static void initialize_buffer(struct userdata *u, pa_memchunk *in){
@@ -538,6 +540,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         //pa_sink_render_into(u->sink, buffer);
         while(pa_memblockq_peek(u->input_q, &tchunk) < 0){
             pa_sink_render(u->sink, input_remaining*fs, &tchunk);
+            //pa_sink_render_full(u->sink, input_remaining*fs, &tchunk);
             pa_assert(tchunk.memblock);
             pa_memblockq_push(u->input_q, &tchunk);
             pa_memblock_unref(tchunk.memblock);
@@ -699,6 +702,9 @@ static void sink_input_attach_cb(pa_sink_input *i) {
     //TODO: this guy causes dropouts constantly+rewinds, it's unusable
     //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->master->thread_info.max_latency);
     pa_sink_attach_within_thread(u->sink);
+    if(u->set_default){
+        pa_namereg_set_default_sink(u->module->core, u->sink);
+    }
 }
 
 /* Called from main context */
@@ -739,22 +745,22 @@ static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t s
     }
 }
 
-static void save_profile(struct userdata *u, char *name){
+static void save_profile(struct userdata *u, size_t channel, char *name){
     unsigned a_i;
-    const size_t profile_size = PROFILE_SIZE * sizeof(float);
+    const size_t profile_size = CHANNEL_PROFILE_SIZE * sizeof(float);
     float *H_n, *profile;
     const float *H;
     pa_datum key, data;
     profile = pa_xnew0(float, profile_size);
-    a_i = pa_aupdate_read_begin(u->a_H);
+    a_i = pa_aupdate_read_begin(u->a_H[channel]);
+    profile[0] = u->Xs[a_i][channel];
+    H = u->Hs[channel][a_i];
     H_n = profile + 1;
-    H = u->Hs[a_i];
-    profile[0] = u->Xs[a_i];
     for(size_t i = 0 ; i <= FILTER_SIZE; ++i){
-        //H_n[i] = H[i] * u->fft_size;
-        H_n[i] = H[i];
+        H_n[i] = H[i] * u->fft_size;
+        //H_n[i] = H[i];
     }
-    pa_aupdate_read_end(u->a_H);
+    pa_aupdate_read_end(u->a_H[channel]);
     key.data=name;
     key.size = strlen(key.data);
     data.data = profile;
@@ -764,9 +770,38 @@ static void save_profile(struct userdata *u, char *name){
 }
 
 static void save_state(struct userdata *u){
-    char *state_name = pa_sprintf_malloc("%s-previous-state", u->name);
-    save_profile(u, state_name);
-    pa_xfree(state_name);
+    unsigned a_i;
+    const size_t state_size = STATE_SIZE * sizeof(float);
+    float *H_n, *state;
+    float *H;
+    pa_datum key, data;
+    pa_database *database;
+    char *dbname;
+    char *state_name = u->name;
+    state = pa_xnew0(float, STATE_SIZE);
+
+    for(size_t c = 0; c < u->channels; ++c){
+        a_i = pa_aupdate_read_begin(u->a_H[c]);
+        state[c * CHANNEL_PROFILE_SIZE] = u->Xs[a_i][c];
+        H = u->Hs[c][a_i];
+        H_n = state + c * CHANNEL_PROFILE_SIZE + 1;
+        memcpy(H_n, H, FILTER_SIZE * sizeof(float));
+        pa_aupdate_read_end(u->a_H[c]);
+    }
+
+    key.data = state_name;
+    key.size = strlen(key.data);
+    data.data = state;
+    data.size = state_size;
+    //thread safety for 0.9.17?
+    pa_assert_se(dbname = pa_state_path(EQ_STATE_DB, TRUE));
+    pa_assert_se(database = pa_database_open(dbname, TRUE));
+    pa_xfree(dbname);
+
+    pa_database_set(database, &key, &data, TRUE);
+    pa_database_sync(database);
+    pa_database_close(database);
+    pa_xfree(state);
 }
 
 static void remove_profile(pa_core *c, char *name){
@@ -779,19 +814,20 @@ static void remove_profile(pa_core *c, char *name){
     pa_database_sync(database);
 }
 
-static const char* load_profile(struct userdata *u, char *name){
+static const char* load_profile(struct userdata *u, size_t channel, char *name){
     unsigned a_i;
     pa_datum key, value;
-    const size_t profile_size = PROFILE_SIZE * sizeof(float);
+    const size_t profile_size = CHANNEL_PROFILE_SIZE * sizeof(float);
     key.data = name;
     key.size = strlen(key.data);
     if(pa_database_get(u->database, &key, &value) != NULL){
         if(value.size == profile_size){
-            float *H = (float *) value.data;
-            a_i = pa_aupdate_write_begin(u->a_H);
-            u->Xs[a_i] = H[0];
-            memcpy(u->Hs[a_i], H + 1, (FILTER_SIZE) * sizeof(float));
-            pa_aupdate_write_end(u->a_H);
+            float *profile = (float *) value.data;
+            a_i = pa_aupdate_write_begin(u->a_H[channel]);
+            u->Xs[channel][a_i] = profile[0];
+            memcpy(u->Hs[channel][a_i], profile + 1, CHANNEL_PROFILE_SIZE * sizeof(float));
+            fix_filter(u->Hs[channel][a_i], u->fft_size);
+            pa_aupdate_write_end(u->a_H[channel]);
         }else{
             return "incompatible size";
         }
@@ -800,13 +836,39 @@ static const char* load_profile(struct userdata *u, char *name){
         return "profile doesn't exist";
     }
     return NULL;
-    //fix_filter(u->H, u->fft_size);
 }
 
 static void load_state(struct userdata *u){
-    char *state_name=pa_sprintf_malloc("%s-previous-state", u->name);
-    load_profile(u,state_name);
-    pa_xfree(state_name);
+    unsigned a_i;
+    float *H;
+    pa_datum key, value;
+    pa_database *database;
+    char *dbname;
+    char *state_name = u->name;
+
+    pa_assert_se(dbname = pa_state_path(EQ_STATE_DB, FALSE));
+    database = pa_database_open(dbname, FALSE);
+    pa_xfree(dbname);
+    if(!database){
+        return;
+    }
+
+    key.data = state_name;
+    key.size = strlen(key.data);
+
+    if(pa_database_get(database, &key, &value) != NULL){
+        size_t states = PA_MIN(value.size / (CHANNEL_PROFILE_SIZE * sizeof(float)), u->channels);
+        float *state = (float *) value.data;
+        for(size_t c = 0; c < states; ++c){
+            a_i = pa_aupdate_write_begin(u->a_H[c]);
+            H = state + c * CHANNEL_PROFILE_SIZE + 1;
+            u->Xs[c][a_i] = state[c * CHANNEL_PROFILE_SIZE];
+            memcpy(u->Hs[c][a_i], H, FILTER_SIZE * sizeof(float));
+            pa_aupdate_write_end(u->a_H[c]);
+        }
+        pa_datum_free(&value);
+    }
+    pa_database_close(database);
 }
 
 /* Called from main context */
@@ -865,8 +927,12 @@ int pa__init(pa_module*m) {
     }
 
     if (!(master = pa_namereg_get(m->core, pa_modargs_get_value(ma, "master", NULL), PA_NAMEREG_SINK))) {
-        pa_log("Master sink not found");
-        goto fail;
+        pa_log("Master sink not found, trying default");
+        master = pa_namereg_get_default_sink(m->core);
+        if(!master){
+            pa_log("no default sink found!");
+            goto fail;
+        }
     }
 
     ss = master->sample_spec;
@@ -882,6 +948,9 @@ int pa__init(pa_module*m) {
     u->module = m;
     m->userdata = u;
 
+    u->set_default = TRUE;
+    u->set_default = pa_modargs_get_value_boolean(ma, "set_default", &u->set_default);
+
     u->channels = ss.channels;
     u->fft_size = pow(2, ceil(log(ss.rate)/log(2)));
     pa_log_debug("fft size: %ld", u->fft_size);
@@ -889,10 +958,16 @@ int pa__init(pa_module*m) {
     u->R = (u->window_size + 1) / 2;
     u->overlap_size = u->window_size - u->R;
     u->samples_gathered = 0;
-    u->a_H = pa_aupdate_new();
+    u->a_H = pa_xnew0(pa_aupdate *, u->channels);
     u->latency = u->window_size - u->R;
-    for(size_t i = 0; i < 2; ++i){
-        u->Hs[i] = alloc((FILTER_SIZE), sizeof(float));
+    u->Xs = pa_xnew0(float *, u->channels);
+    u->Hs = pa_xnew0(float **, u->channels);
+    for(size_t c = 0; c < u->channels; ++c){
+        u->Xs[c] = pa_xnew0(float, 2);
+        u->Hs[c] = pa_xnew0(float *, 2);
+        for(size_t i = 0; i < 2; ++i){
+            u->Hs[c][i] = alloc((FILTER_SIZE), sizeof(float));
+        }
     }
     u->W = alloc(u->window_size, sizeof(float));
     u->work_buffer = alloc(u->fft_size, sizeof(float));
@@ -900,6 +975,7 @@ int pa__init(pa_module*m) {
     u->input = pa_xnew0(float *, u->channels);
     u->overlap_accum = pa_xnew0(float *, u->channels);
     for(size_t c = 0; c < u->channels; ++c){
+        u->a_H[c] = pa_aupdate_new();
         u->input[c] = alloc(u->window_size, sizeof(float));
         memset(u->input[c], 0, (u->window_size)*sizeof(float));
         u->overlap_accum[c] = alloc(u->overlap_size, sizeof(float));
@@ -989,14 +1065,16 @@ int pa__init(pa_module*m) {
     dbus_init(u);
 
     //default filter to these
-    a_i = pa_aupdate_write_begin(u->a_H);
-    H = u->Hs[a_i];
-    u->Xs[a_i] = 1.0f;
-    for(size_t i = 0; i < FILTER_SIZE; ++i){
-        H[i] = 1.0 / sqrtf(2.0f);
+    for(size_t c = 0; c< u->channels; ++c){
+        a_i = pa_aupdate_write_begin(u->a_H[c]);
+        H = u->Hs[c][a_i];
+        u->Xs[c][a_i] = 1.0f;
+        for(size_t i = 0; i < FILTER_SIZE; ++i){
+            H[i] = 1.0 / sqrtf(2.0f);
+        }
+        fix_filter(H, u->fft_size);
+        pa_aupdate_write_end(u->a_H[c]);
     }
-    fix_filter(H, u->fft_size);
-    pa_aupdate_write_end(u->a_H);
     //load old parameters
     load_state(u);
 
@@ -1049,23 +1127,30 @@ void pa__done(pa_module*m) {
     if (u->sink)
         pa_sink_unref(u->sink);
 
-    pa_aupdate_free(u->a_H);
     pa_memblockq_free(u->input_q);
 
     fftwf_destroy_plan(u->inverse_plan);
     fftwf_destroy_plan(u->forward_plan);
     pa_xfree(u->output_window);
     for(size_t c=0; c < u->channels; ++c){
+        pa_aupdate_free(u->a_H[c]);
         pa_xfree(u->overlap_accum[c]);
         pa_xfree(u->input[c]);
     }
+    pa_xfree(u->a_H);
     pa_xfree(u->overlap_accum);
     pa_xfree(u->input);
     pa_xfree(u->work_buffer);
     pa_xfree(u->W);
-    for(size_t i = 0; i < 2; ++i){
-        pa_xfree(u->Hs[i]);
+    for(size_t c = 0; c < u->channels; ++c){
+        pa_xfree(u->Xs[c]);
+        for(size_t i = 0; i < 2; ++i){
+            pa_xfree(u->Hs[c][i]);
+        }
+        pa_xfree(u->Hs[c]);
     }
+    pa_xfree(u->Xs);
+    pa_xfree(u->Hs);
 
     pa_xfree(u->name);
 
@@ -1088,11 +1173,12 @@ static void equalizer_get_revision(DBusConnection *conn, DBusMessage *msg, void
 static void equalizer_get_sample_rate(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void equalizer_get_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
-static void equalizer_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_get_n_channels(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_handle_get_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_handle_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
 enum manager_method_index {
@@ -1158,6 +1244,8 @@ enum equalizer_method_index {
     EQUALIZER_METHOD_SEED_FILTER,
     EQUALIZER_METHOD_SAVE_PROFILE,
     EQUALIZER_METHOD_LOAD_PROFILE,
+    EQUALIZER_METHOD_SET_FILTER,
+    EQUALIZER_METHOD_GET_FILTER,
     EQUALIZER_METHOD_MAX
 };
 
@@ -1166,25 +1254,41 @@ enum equalizer_handler_index {
     EQUALIZER_HANDLER_SAMPLERATE,
     EQUALIZER_HANDLER_FILTERSAMPLERATE,
     EQUALIZER_HANDLER_N_COEFS,
-    EQUALIZER_HANDLER_FILTER,
+    EQUALIZER_HANDLER_N_CHANNELS,
     EQUALIZER_HANDLER_MAX
 };
 
 pa_dbus_arg_info filter_points_args[]={
+    {"channel", "u","in"},
     {"xs", "au","in"},
     {"ys", "ad","out"},
-    {"preamp", "d","out"},
+    {"preamp", "d","out"}
 };
 pa_dbus_arg_info seed_filter_args[]={
+    {"channel", "u","in"},
     {"xs", "au","in"},
     {"ys", "ad","in"},
-    {"preamp", "d","in"},
+    {"preamp", "d","in"}
+};
+
+pa_dbus_arg_info set_filter_args[]={
+    {"channel", "u","in"},
+    {"ys", "ad","in"},
+    {"preamp", "d","in"}
+};
+pa_dbus_arg_info get_filter_args[]={
+    {"channel", "u","in"},
+    {"ys", "ad","out"},
+    {"preamp", "d","out"}
 };
+
 pa_dbus_arg_info save_profile_args[]={
-    {"name", "s","in"},
+    {"channel", "u","in"},
+    {"name", "s","in"}
 };
 pa_dbus_arg_info load_profile_args[]={
-    {"name", "s","in"},
+    {"channel", "u","in"},
+    {"name", "s","in"}
 };
 
 static pa_dbus_method_handler equalizer_methods[EQUALIZER_METHOD_MAX]={
@@ -1198,6 +1302,16 @@ static pa_dbus_method_handler equalizer_methods[EQUALIZER_METHOD_MAX]={
         .arguments=filter_points_args,
         .n_arguments=sizeof(filter_points_args)/sizeof(pa_dbus_arg_info),
         .receive_cb=equalizer_handle_get_filter_points},
+    [EQUALIZER_METHOD_SET_FILTER]{
+        .method_name="SetFilter",
+        .arguments=set_filter_args,
+        .n_arguments=sizeof(set_filter_args)/sizeof(pa_dbus_arg_info),
+        .receive_cb=equalizer_handle_set_filter},
+    [EQUALIZER_METHOD_GET_FILTER]{
+        .method_name="GetFilter",
+        .arguments=get_filter_args,
+        .n_arguments=sizeof(get_filter_args)/sizeof(pa_dbus_arg_info),
+        .receive_cb=equalizer_handle_get_filter},
     [EQUALIZER_METHOD_SAVE_PROFILE]{
         .method_name="SaveProfile",
         .arguments=save_profile_args,
@@ -1207,7 +1321,7 @@ static pa_dbus_method_handler equalizer_methods[EQUALIZER_METHOD_MAX]={
         .method_name="LoadProfile",
         .arguments=load_profile_args,
         .n_arguments=sizeof(load_profile_args)/sizeof(pa_dbus_arg_info),
-        .receive_cb=equalizer_handle_load_profile},
+        .receive_cb=equalizer_handle_load_profile}
 };
 
 static pa_dbus_property_handler equalizer_handlers[EQUALIZER_HANDLER_MAX]={
@@ -1215,7 +1329,7 @@ static pa_dbus_property_handler equalizer_handlers[EQUALIZER_HANDLER_MAX]={
     [EQUALIZER_HANDLER_SAMPLERATE]{.property_name="SampleRate",.type="u",.get_cb=equalizer_get_sample_rate,.set_cb=NULL},
     [EQUALIZER_HANDLER_FILTERSAMPLERATE]{.property_name="FilterSampleRate",.type="u",.get_cb=equalizer_get_filter_rate,.set_cb=NULL},
     [EQUALIZER_HANDLER_N_COEFS]{.property_name="NFilterCoefficients",.type="u",.get_cb=equalizer_get_n_coefs,.set_cb=NULL},
-    [EQUALIZER_HANDLER_FILTER]{.property_name="Filter",.type="ad",.get_cb=equalizer_get_filter,.set_cb=equalizer_set_filter}
+    [EQUALIZER_HANDLER_N_CHANNELS]{.property_name="NChannels",.type="u",.get_cb=equalizer_get_n_channels,.set_cb=NULL},
 };
 
 enum equalizer_signal_index{
@@ -1249,15 +1363,15 @@ void dbus_init(struct userdata *u){
 
     pa_dbus_protocol_add_interface(u->dbus_protocol, u->dbus_path, &equalizer_info, u);
     sink_list = pa_shared_get(u->sink->core, SINKLIST);
-    u->database=pa_shared_get(u->sink->core, EQDB);
-    if(sink_list==NULL){
+    u->database = pa_shared_get(u->sink->core, EQDB);
+    if(sink_list == NULL){
         char *dbname;
         sink_list=pa_idxset_new(&pa_idxset_trivial_hash_func, &pa_idxset_trivial_compare_func);
         pa_shared_set(u->sink->core, SINKLIST, sink_list);
-        pa_assert_se(dbname = pa_state_path("equalizers", TRUE));
+        pa_assert_se(dbname = pa_state_path("equalizer-presets", FALSE));
         pa_assert_se(u->database = pa_database_open(dbname, TRUE));
         pa_xfree(dbname);
-        pa_shared_set(u->sink->core,EQDB,u->database);
+        pa_shared_set(u->sink->core, EQDB, u->database);
         pa_dbus_protocol_add_interface(u->dbus_protocol, MANAGER_PATH, &manager_info, u->sink->core);
         pa_dbus_protocol_register_extension(u->dbus_protocol, EXTNAME);
     }
@@ -1448,7 +1562,7 @@ void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *
     DBusError error;
     DBusMessage *signal = NULL;
     float *ys;
-    uint32_t *xs;
+    uint32_t *xs, channel, r_channel;
     double *_ys, preamp;
     unsigned x_npoints, y_npoints, a_i;
     float *H;
@@ -1460,6 +1574,7 @@ void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *
     dbus_error_init(&error);
 
     if(!dbus_message_get_args(msg, &error,
+                DBUS_TYPE_UINT32, &channel,
                 DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &xs, &x_npoints,
                 DBUS_TYPE_ARRAY, DBUS_TYPE_DOUBLE, &_ys, &y_npoints,
                 DBUS_TYPE_DOUBLE, &preamp,
@@ -1468,6 +1583,11 @@ void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *
         dbus_error_free(&error);
         return;
     }
+    if(channel > u->channels){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "invalid channel: %d", channel);
+        dbus_error_free(&error);
+        return;
+    }
     for(size_t i = 0; i < x_npoints; ++i){
         if(xs[i] >= FILTER_SIZE){
             points_good = FALSE;
@@ -1478,7 +1598,6 @@ void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs must be monotonic and 0<=x<=%ld", u->fft_size / 2);
         dbus_error_free(&error);
         return;
-
     }else if(x_npoints != y_npoints || x_npoints < 2 || x_npoints > FILTER_SIZE  ){
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "xs and ys must be the same length and 2<=l<=%ld!", FILTER_SIZE);
         dbus_error_free(&error);
@@ -1493,14 +1612,25 @@ void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *
     for(uint32_t i = 0; i < x_npoints; ++i){
         ys[i] = (float) _ys[i];
     }
-    a_i = pa_aupdate_write_begin(u->a_H);
-    H = u->Hs[a_i];
-    u->Xs[a_i] = preamp;
+    r_channel = channel == u->channels ? 0 : channel;
+    a_i = pa_aupdate_write_begin(u->a_H[r_channel]);
+    H = u->Hs[r_channel][a_i];
+    u->Xs[r_channel][a_i] = preamp;
     interpolate(H, FILTER_SIZE, xs, ys, x_npoints);
     fix_filter(H, u->fft_size);
-    pa_aupdate_write_end(u->a_H);
+    if(channel == u->channels){
+        for(size_t c = 1; c < u->channels; ++c){
+            unsigned b_i = pa_aupdate_write_begin(u->a_H[c]);
+            float *H_p = u->Hs[c][b_i];
+            u->Xs[c][b_i] = preamp;
+            memcpy(H_p, H, FILTER_SIZE * sizeof(float));
+            pa_aupdate_write_end(u->a_H[c]);
+        }
+    }
+    pa_aupdate_write_end(u->a_H[r_channel]);
     pa_xfree(ys);
 
+
     //Stupid for IO reasons?  Add a save signal to dbus instead
     //save_state(u);
 
@@ -1513,28 +1643,34 @@ void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *
 
 void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg, void *_u) {
     struct userdata *u = (struct userdata *) _u;
-    DBusError error;
-    uint32_t *xs;
+    uint32_t *xs, channel, r_channel;
     double *ys, preamp;
     unsigned x_npoints, a_i;
     float *H;
     pa_bool_t points_good=TRUE;
     DBusMessage *reply = NULL;
     DBusMessageIter msg_iter;
+    DBusError error;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(u);
 
     dbus_error_init(&error);
-
     if(!dbus_message_get_args(msg, &error,
+                DBUS_TYPE_UINT32, &channel,
                 DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &xs, &x_npoints,
                 DBUS_TYPE_INVALID)){
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
         dbus_error_free(&error);
         return;
     }
+    if(channel > u->channels){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "invalid channel: %d", channel);
+        dbus_error_free(&error);
+        return;
+    }
+
     for(size_t i = 0; i < x_npoints; ++i){
         if(xs[i] >= FILTER_SIZE){
             points_good=FALSE;
@@ -1548,14 +1684,15 @@ void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg,
         return;
     }
 
+    r_channel = channel == u->channels ? 0 : channel;
     ys = pa_xmalloc(x_npoints * sizeof(double));
-    a_i = pa_aupdate_read_begin(u->a_H);
-    H = u->Hs[a_i];
-    preamp = u->Xs[a_i];
+    a_i = pa_aupdate_read_begin(u->a_H[r_channel]);
+    H = u->Hs[r_channel][a_i];
+    preamp = u->Xs[r_channel][a_i];
     for(uint32_t i = 0; i < x_npoints; ++i){
         ys[i] = H[xs[i]] * u->fft_size;
     }
-    pa_aupdate_read_end(u->a_H);
+    pa_aupdate_read_end(u->a_H[r_channel]);
 
     pa_assert_se((reply = dbus_message_new_method_return(msg)));
     dbus_message_iter_init_append(reply, &msg_iter);
@@ -1568,9 +1705,128 @@ void equalizer_handle_get_filter_points(DBusConnection *conn, DBusMessage *msg,
     pa_xfree(ys);
 }
 
+static void get_filter(struct userdata *u, size_t channel, double **H_, double *preamp){
+    float *H;
+    unsigned a_i;
+    size_t r_channel = channel == u->channels ? 0 : channel;
+    *H_ = pa_xnew0(double, FILTER_SIZE);
+    a_i = pa_aupdate_read_begin(u->a_H[r_channel]);
+    H = u->Hs[r_channel][a_i];
+    for(size_t i = 0;i < FILTER_SIZE; ++i){
+        (*H_)[i] = H[i] * u->fft_size;
+    }
+    *preamp = u->Xs[r_channel][a_i];
+
+    pa_aupdate_read_end(u->a_H[r_channel]);
+}
+
+void equalizer_handle_get_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
+    struct userdata *u;
+    unsigned n_coefs;
+    uint32_t channel;
+    double *H_, preamp;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter;
+    DBusError error;
+    pa_assert_se(u = (struct userdata *) _u);
+    pa_assert(conn);
+    pa_assert(msg);
+
+    dbus_error_init(&error);
+    if(!dbus_message_get_args(msg, &error,
+                DBUS_TYPE_UINT32, &channel,
+                DBUS_TYPE_INVALID)){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
+        dbus_error_free(&error);
+        return;
+    }
+    if(channel > u->channels){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "invalid channel: %d", channel);
+        dbus_error_free(&error);
+        return;
+    }
+
+    n_coefs = CHANNEL_PROFILE_SIZE;
+    pa_assert(conn);
+    pa_assert(msg);
+    get_filter(u, channel, &H_, &preamp);
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+    dbus_message_iter_init_append(reply, &msg_iter);
+
+    pa_dbus_append_basic_array(&msg_iter, DBUS_TYPE_DOUBLE, H_, n_coefs);
+    pa_dbus_append_basic_variant(&msg_iter, DBUS_TYPE_DOUBLE, &preamp);
+
+    pa_assert_se(dbus_connection_send(conn, reply, NULL));
+    dbus_message_unref(reply);
+    pa_xfree(H_);
+}
+
+static void set_filter(struct userdata *u, size_t channel, double *H_, double preamp){
+    unsigned a_i;
+    size_t r_channel = channel == u->channels ? 0 : channel;
+    float *H;
+    //all channels
+    a_i = pa_aupdate_write_begin(u->a_H[r_channel]);
+    u->Xs[r_channel][a_i] = (float) preamp;
+    H = u->Hs[r_channel][a_i];
+    for(size_t i = 0; i < FILTER_SIZE; ++i){
+        H[i] = (float) H_[i];
+    }
+    fix_filter(H, u->fft_size);
+    if(channel == u->channels){
+        for(size_t c = 1; c < u->channels; ++c){
+            unsigned b_i = pa_aupdate_write_begin(u->a_H[c]);
+            u->Xs[c][b_i] = u->Xs[r_channel][a_i];
+            memcpy(u->Hs[c][b_i], u->Hs[r_channel][a_i], FILTER_SIZE * sizeof(float));
+            pa_aupdate_write_end(u->a_H[c]);
+        }
+    }
+    pa_aupdate_write_end(u->a_H[r_channel]);
+}
+
+void equalizer_handle_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
+    struct userdata *u;
+    double *H, preamp;
+    uint32_t channel;
+    unsigned _n_coefs;
+    DBusMessage *signal = NULL;
+    DBusError error;
+    pa_assert_se(u = (struct userdata *) _u);
+    pa_assert(conn);
+    pa_assert(msg);
+
+    dbus_error_init(&error);
+    if(!dbus_message_get_args(msg, &error,
+                DBUS_TYPE_UINT32, &channel,
+                DBUS_TYPE_ARRAY, DBUS_TYPE_DOUBLE, &H, &_n_coefs,
+                DBUS_TYPE_DOUBLE, &preamp,
+                DBUS_TYPE_INVALID)){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
+        dbus_error_free(&error);
+        return;
+    }
+    if(channel > u->channels){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "invalid channel: %d", channel);
+        dbus_error_free(&error);
+        return;
+    }
+    if(_n_coefs != FILTER_SIZE){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "This filter takes exactly %ld coefficients, you gave %d", FILTER_SIZE, _n_coefs);
+        return;
+    }
+    set_filter(u, channel, H, preamp);
+
+    pa_dbus_send_empty_reply(conn, msg);
+
+    pa_assert_se((signal = dbus_message_new_signal(u->dbus_path, EQUALIZER_IFACE, equalizer_signals[EQUALIZER_SIGNAL_FILTER_CHANGED].name)));
+    pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
+    dbus_message_unref(signal);
+}
+
 void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
     struct userdata *u = (struct userdata *) _u;
     char *name;
+    uint32_t channel, r_channel;
     DBusMessage *signal = NULL;
     DBusError error;
     pa_assert(conn);
@@ -1579,13 +1835,20 @@ void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void
     dbus_error_init(&error);
 
     if(!dbus_message_get_args(msg, &error,
-                 DBUS_TYPE_STRING, &name,
+                DBUS_TYPE_UINT32, &channel,
+                DBUS_TYPE_STRING, &name,
                 DBUS_TYPE_INVALID)){
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
         dbus_error_free(&error);
         return;
     }
-    save_profile(u,name);
+    if(channel > u->channels){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "invalid channel: %d", channel);
+        dbus_error_free(&error);
+        return;
+    }
+    r_channel = channel == u->channels ? 0 : channel;
+    save_profile(u, r_channel, name);
     pa_dbus_send_empty_reply(conn, msg);
 
     pa_assert_se((signal = dbus_message_new_signal(MANAGER_PATH, MANAGER_IFACE, manager_signals[MANAGER_SIGNAL_PROFILES_CHANGED].name)));
@@ -1594,9 +1857,10 @@ void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void
 }
 
 void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u) {
-    struct userdata *u=(struct userdata *) _u;
+    struct userdata *u = (struct userdata *) _u;
     char *name;
     DBusError error;
+    uint32_t channel, r_channel;
     const char *err_msg = NULL;
     DBusMessage *signal = NULL;
 
@@ -1606,18 +1870,31 @@ void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void
     dbus_error_init(&error);
 
     if(!dbus_message_get_args(msg, &error,
-                 DBUS_TYPE_STRING, &name,
+                DBUS_TYPE_UINT32, &channel,
+                DBUS_TYPE_STRING, &name,
                 DBUS_TYPE_INVALID)){
         pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
         dbus_error_free(&error);
         return;
     }
-    err_msg = load_profile(u, name);
+    if(channel > u->channels){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "invalid channel: %d", channel);
+        dbus_error_free(&error);
+        return;
+    }
+    r_channel = channel == u->channels ? 0 : channel;
+
+    err_msg = load_profile(u, r_channel, name);
     if(err_msg != NULL){
         pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "error loading profile %s: %s", name, err_msg);
         dbus_error_free(&error);
         return;
     }
+    if(channel == u->channels){
+        for(uint32_t c = 1; c < u->channels; ++c){
+            load_profile(u, c, name);
+        }
+    }
     pa_dbus_send_empty_reply(conn, msg);
 
     pa_assert_se((signal = dbus_message_new_signal(u->dbus_path, EQUALIZER_IFACE, equalizer_signals[EQUALIZER_SIGNAL_FILTER_CHANGED].name)));
@@ -1630,6 +1907,17 @@ void equalizer_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_UINT32, &rev);
 }
 
+void equalizer_get_n_channels(DBusConnection *conn, DBusMessage *msg, void *_u){
+    struct userdata *u;
+    uint32_t channels;
+    pa_assert_se(u = (struct userdata *) _u);
+    pa_assert(conn);
+    pa_assert(msg);
+
+    channels = (uint32_t) u->channels;
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &channels);
+}
+
 void equalizer_get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u){
     struct userdata *u;
     uint32_t n_coefs;
@@ -1637,7 +1925,7 @@ void equalizer_get_n_coefs(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_assert(conn);
     pa_assert(msg);
 
-    n_coefs = (uint32_t) PROFILE_SIZE;
+    n_coefs = (uint32_t) CHANNEL_PROFILE_SIZE;
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &n_coefs);
 }
 
@@ -1663,84 +1951,19 @@ void equalizer_get_filter_rate(DBusConnection *conn, DBusMessage *msg, void *_u)
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &fft_size);
 }
 
-static double * get_filter(struct userdata *u){
-    float *H;
-    double *H_;
-    unsigned a_i;
-    H_ = pa_xnew0(double, PROFILE_SIZE);
-    a_i = pa_aupdate_read_begin(u->a_H);
-    H = u->Hs[a_i];
-    H_[0] = u->Xs[a_i];
-    for(size_t i = 0;i < FILTER_SIZE; ++i){
-        H_[i + 1] = H[i] * u->fft_size;
-    }
-    pa_aupdate_read_end(u->a_H);
-    return H_;
-}
-
-void equalizer_get_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
-    struct userdata *u;
-    unsigned n_coefs;
-    double *H_;
-    pa_assert_se(u = (struct userdata *) _u);
-
-    n_coefs = PROFILE_SIZE;
-    pa_assert(conn);
-    pa_assert(msg);
-    H_ = get_filter(u);
-    pa_dbus_send_basic_array_variant_reply(conn, msg, DBUS_TYPE_DOUBLE, H_, n_coefs);
-    pa_xfree(H_);
-}
-
-static void set_filter(struct userdata *u, double *H_){
-    unsigned a_i= pa_aupdate_write_begin(u->a_H);
-    float *H = u->Hs[a_i];
-    u->Xs[a_i] = H_[0];
-    for(size_t i = 0; i < FILTER_SIZE; ++i){
-        H[i] = (float) H_[i + 1];
-    }
-    fix_filter(H + 1, u->fft_size);
-    pa_aupdate_write_end(u->a_H);
-}
-
-void equalizer_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u){
-    struct userdata *u;
-    double *H;
-    unsigned _n_coefs;
-    DBusMessage *signal = NULL;
-    pa_assert_se(u = (struct userdata *) _u);
-    pa_assert(conn);
-    pa_assert(msg);
-
-    if(pa_dbus_get_fixed_array_set_property_arg(conn, msg, DBUS_TYPE_DOUBLE, &H, &_n_coefs)){
-        return;
-    }
-    if(_n_coefs != PROFILE_SIZE){
-        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "This filter takes exactly %ld coefficients, you gave %d", PROFILE_SIZE, _n_coefs);
-        return;
-    }
-    set_filter(u, H);
-
-    pa_dbus_send_empty_reply(conn, msg);
-
-    pa_assert_se((signal = dbus_message_new_signal(u->dbus_path, EQUALIZER_IFACE, equalizer_signals[EQUALIZER_SIGNAL_FILTER_CHANGED].name)));
-    pa_dbus_protocol_send_signal(u->dbus_protocol, signal);
-    dbus_message_unref(signal);
-}
-
 void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
     struct userdata *u;
     DBusMessage *reply = NULL;
     DBusMessageIter msg_iter, dict_iter;
-    uint32_t rev, n_coefs, rate, fft_size;
-    double *H;
+    uint32_t rev, n_coefs, rate, fft_size, channels;
     pa_assert_se(u = (struct userdata *) _u);
     pa_assert(msg);
 
     rev = 1;
-    n_coefs = (uint32_t) PROFILE_SIZE;
+    n_coefs = (uint32_t) CHANNEL_PROFILE_SIZE;
     rate = (uint32_t) u->sink->sample_spec.rate;
     fft_size = (uint32_t) u->fft_size;
+    channels = (uint32_t) u->channels;
 
     pa_assert_se((reply = dbus_message_new_method_return(msg)));
     dbus_message_iter_init_append(reply, &msg_iter);
@@ -1750,9 +1973,7 @@ void equalizer_get_all(DBusConnection *conn, DBusMessage *msg, void *_u){
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_SAMPLERATE].property_name, DBUS_TYPE_UINT32, &rate);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_FILTERSAMPLERATE].property_name, DBUS_TYPE_UINT32, &fft_size);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_N_COEFS].property_name, DBUS_TYPE_UINT32, &n_coefs);
-    H = get_filter(u);
-    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_FILTER].property_name, DBUS_TYPE_UINT32, &H);
-    pa_xfree(H);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, equalizer_handlers[EQUALIZER_HANDLER_N_CHANNELS].property_name, DBUS_TYPE_UINT32, &channels);
 
     pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
     pa_assert_se(dbus_connection_send(conn, reply, NULL));

commit f5ceed8151214a95ca2192ed1c681eb31cb0bc98
Author: Jason Newton <nevion at gmail.com>
Date:   Thu Aug 20 18:24:19 2009 -0700

    module-equalizer-sink: added server side persistance of profile names

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 98b6b89..c531468 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -122,6 +122,7 @@ struct userdata {
     pa_bool_t set_default;
 
     pa_database *database;
+    char **base_profiles;
 };
 
 static const char* const valid_modargs[] = {
@@ -143,7 +144,7 @@ static const char* const valid_modargs[] = {
 #define EQ_STATE_DB "equalizer-state"
 #define FILTER_SIZE (u->fft_size / 2 + 1)
 #define CHANNEL_PROFILE_SIZE (FILTER_SIZE + 1)
-#define STATE_SIZE (CHANNEL_PROFILE_SIZE * u->channels)
+#define FILTER_STATE_SIZE (CHANNEL_PROFILE_SIZE * u->channels)
 static void dbus_init(struct userdata *u);
 static void dbus_done(struct userdata *u);
 
@@ -199,7 +200,7 @@ static int is_monotonic(const uint32_t *xs,size_t length){
 
 
 /* Called from I/O thread context */
-static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
+static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
     struct userdata *u = PA_SINK(o)->userdata;
 
     switch (code) {
@@ -234,7 +235,7 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
 
 
 /* Called from main context */
-static int sink_set_state(pa_sink *s, pa_sink_state_t state) {
+static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state) {
     struct userdata *u;
 
     pa_sink_assert_ref(s);
@@ -249,7 +250,7 @@ static int sink_set_state(pa_sink *s, pa_sink_state_t state) {
 }
 
 /* Called from I/O thread context */
-static void sink_request_rewind(pa_sink *s) {
+static void sink_request_rewind_cb(pa_sink *s) {
     struct userdata *u;
 
     pa_sink_assert_ref(s);
@@ -264,7 +265,7 @@ static void sink_request_rewind(pa_sink *s) {
 }
 
 /* Called from I/O thread context */
-static void sink_update_requested_latency(pa_sink *s) {
+static void sink_update_requested_latency_cb(pa_sink *s) {
     struct userdata *u;
 
     pa_sink_assert_ref(s);
@@ -280,6 +281,35 @@ static void sink_update_requested_latency(pa_sink *s) {
             pa_sink_get_requested_latency_within_thread(s));
 }
 
+/* Called from main context */
+static void sink_set_volume_cb(pa_sink *s) {
+    struct userdata *u;
+
+    pa_sink_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    if (!PA_SINK_IS_LINKED(pa_sink_get_state(s)) ||
+        !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
+        return;
+
+    pa_sink_input_set_volume(u->sink_input, &s->real_volume, s->save_volume, TRUE);
+}
+
+/* Called from main context */
+static void sink_set_mute_cb(pa_sink *s) {
+    struct userdata *u;
+
+    pa_sink_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    if (!PA_SINK_IS_LINKED(pa_sink_get_state(s)) ||
+        !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
+        return;
+
+    pa_sink_input_set_mute(u->sink_input, s->muted, s->save_muted);
+}
+
+
 //reference implementation
 static void dsp_logic(
     float * restrict dst,//used as a temp array too, needs to be fft_length!
@@ -581,6 +611,26 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     return 0;
 }
 
+/* Called from main context */
+static void sink_input_volume_changed_cb(pa_sink_input *i) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    pa_sink_volume_changed(u->sink, &i->volume);
+}
+
+/* Called from main context */
+static void sink_input_mute_changed_cb(pa_sink_input *i) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    pa_sink_mute_changed(u->sink, i->muted);
+}
+
 static void reset_filter(struct userdata *u){
     u->samples_gathered = 0;
     for(size_t i = 0;i < u->channels; ++i){
@@ -745,6 +795,41 @@ static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t s
     }
 }
 
+static void pack(char **strs, size_t len, char **packed, size_t *length){
+    size_t t_len = 0;
+    size_t headers = (1+len) * sizeof(uint16_t);
+    size_t offset = sizeof(uint16_t);
+    for(size_t i = 0; i < len; ++i){
+        t_len += strlen(strs[i]);
+    }
+    *length = headers + t_len;
+    *packed = pa_xmalloc0(*length);
+    ((uint16_t *) *packed)[0] = (uint16_t) len;
+    for(size_t i = 0; i < len; ++i){
+        uint16_t l = strlen(strs[i]);
+        *((uint16_t *)(*packed + offset)) = l;
+        offset += sizeof(uint16_t);
+        memcpy(*packed + offset, strs[i], l);
+        offset += l;
+    }
+}
+static void unpack(char *str, size_t length, char ***strs, size_t *len){
+    size_t offset = sizeof(uint16_t);
+    *len = ((uint16_t *)str)[0];
+    *strs = pa_xnew(char *, *len);
+    for(size_t i = 0; i < *len; ++i){
+        size_t l = *((uint16_t *)(str+offset));
+        size_t e = PA_MIN(offset + l, length) - offset;
+        offset = PA_MIN(offset + sizeof(uint16_t), length);
+        if(e > 0){
+            (*strs)[i] = pa_xnew(char, e + 1);
+            memcpy((*strs)[i], strs + offset, e);
+            (*strs)[i][e] = '\0';
+        }else{
+            (*strs)[i]=NULL;
+        }
+    }
+}
 static void save_profile(struct userdata *u, size_t channel, char *name){
     unsigned a_i;
     const size_t profile_size = CHANNEL_PROFILE_SIZE * sizeof(float);
@@ -767,18 +852,26 @@ static void save_profile(struct userdata *u, size_t channel, char *name){
     data.size = profile_size;
     pa_database_set(u->database, &key, &data, TRUE);
     pa_database_sync(u->database);
+    if(u->base_profiles[channel]){
+        pa_xfree(u->base_profiles[channel]);
+    }
+    u->base_profiles[channel] = pa_xstrdup(name);
 }
 
 static void save_state(struct userdata *u){
     unsigned a_i;
-    const size_t state_size = STATE_SIZE * sizeof(float);
+    const size_t filter_state_size = FILTER_STATE_SIZE * sizeof(float);
     float *H_n, *state;
     float *H;
     pa_datum key, data;
     pa_database *database;
     char *dbname;
     char *state_name = u->name;
-    state = pa_xnew0(float, STATE_SIZE);
+    char *packed;
+    size_t packed_length;
+
+    pack(u->base_profiles, u->channels, &packed, &packed_length);
+    state = (float *) pa_xmalloc0(filter_state_size + packed_length);
 
     for(size_t c = 0; c < u->channels; ++c){
         a_i = pa_aupdate_read_begin(u->a_H[c]);
@@ -788,11 +881,13 @@ static void save_state(struct userdata *u){
         memcpy(H_n, H, FILTER_SIZE * sizeof(float));
         pa_aupdate_read_end(u->a_H[c]);
     }
+    memcpy(((char *)state) + filter_state_size, packed, packed_length);
+    pa_xfree(packed);
 
     key.data = state_name;
     key.size = strlen(key.data);
     data.data = state;
-    data.size = state_size;
+    data.size = filter_state_size + packed_length;
     //thread safety for 0.9.17?
     pa_assert_se(dbname = pa_state_path(EQ_STATE_DB, TRUE));
     pa_assert_se(database = pa_database_open(dbname, TRUE));
@@ -828,6 +923,10 @@ static const char* load_profile(struct userdata *u, size_t channel, char *name){
             memcpy(u->Hs[channel][a_i], profile + 1, CHANNEL_PROFILE_SIZE * sizeof(float));
             fix_filter(u->Hs[channel][a_i], u->fft_size);
             pa_aupdate_write_end(u->a_H[channel]);
+            if(u->base_profiles[channel]){
+                pa_xfree(u->base_profiles[channel]);
+            }
+            u->base_profiles[channel] = pa_xstrdup(name);
         }else{
             return "incompatible size";
         }
@@ -845,7 +944,6 @@ static void load_state(struct userdata *u){
     pa_database *database;
     char *dbname;
     char *state_name = u->name;
-
     pa_assert_se(dbname = pa_state_path(EQ_STATE_DB, FALSE));
     database = pa_database_open(dbname, FALSE);
     pa_xfree(dbname);
@@ -857,14 +955,26 @@ static void load_state(struct userdata *u){
     key.size = strlen(key.data);
 
     if(pa_database_get(database, &key, &value) != NULL){
-        size_t states = PA_MIN(value.size / (CHANNEL_PROFILE_SIZE * sizeof(float)), u->channels);
-        float *state = (float *) value.data;
-        for(size_t c = 0; c < states; ++c){
-            a_i = pa_aupdate_write_begin(u->a_H[c]);
-            H = state + c * CHANNEL_PROFILE_SIZE + 1;
-            u->Xs[c][a_i] = state[c * CHANNEL_PROFILE_SIZE];
-            memcpy(u->Hs[c][a_i], H, FILTER_SIZE * sizeof(float));
-            pa_aupdate_write_end(u->a_H[c]);
+        if(value.size > FILTER_STATE_SIZE * sizeof(float) + sizeof(uint16_t)){
+            float *state = (float *) value.data;
+            size_t n_profs;
+            char **names;
+            for(size_t c = 0; c < u->channels; ++c){
+                a_i = pa_aupdate_write_begin(u->a_H[c]);
+                H = state + c * CHANNEL_PROFILE_SIZE + 1;
+                u->Xs[c][a_i] = state[c * CHANNEL_PROFILE_SIZE];
+                memcpy(u->Hs[c][a_i], H, FILTER_SIZE * sizeof(float));
+                pa_aupdate_write_end(u->a_H[c]);
+            }
+            unpack(((char *)value.data) + FILTER_STATE_SIZE, value.size - FILTER_STATE_SIZE, &names, &n_profs);
+            n_profs = PA_MIN(n_profs, u->channels);
+            for(size_t c = 0; c < n_profs; ++c){
+                if(u->base_profiles[c]){
+                    pa_xfree(u->base_profiles[c]);
+                }
+                u->base_profiles[c] = names[c];
+            }
+            pa_xfree(names);
         }
         pa_datum_free(&value);
     }
@@ -898,8 +1008,6 @@ static void * alloc(size_t x,size_t s){
     size_t f = PA_ROUND_UP(x*s, sizeof(float)*v_size);
     float *t;
     pa_assert(f >= x*s);
-    //printf("requested %ld floats=%ld bytes, rem=%ld\n", x, x*sizeof(float), x*sizeof(float)%16);
-    //printf("giving %ld floats=%ld bytes, rem=%ld\n", f, f*sizeof(float), f*sizeof(float)%16);
     t = fftwf_malloc(f);
     memset(t, 0, f);
     return t;
@@ -914,7 +1022,6 @@ int pa__init(pa_module*m) {
     pa_sink *master;
     pa_sink_input_new_data sink_input_data;
     pa_sink_new_data sink_data;
-    pa_bool_t *use_default = NULL;
     size_t fs;
     float *H;
     unsigned a_i;
@@ -988,6 +1095,8 @@ int pa__init(pa_module*m) {
     hanning_window(u->W, u->window_size);
     u->first_iteration = TRUE;
 
+    u->base_profiles = pa_xnew0(char *, u->channels);
+
     /* Create sink */
     pa_sink_new_data_init(&sink_data);
     sink_data.driver = __FILE__;
@@ -1007,7 +1116,9 @@ int pa__init(pa_module*m) {
         goto fail;
     }
 
-    u->sink = pa_sink_new(m->core, &sink_data, master->flags & (PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY));
+    u->sink = pa_sink_new(m->core, &sink_data,
+                          PA_SINK_HW_MUTE_CTRL|PA_SINK_HW_VOLUME_CTRL|PA_SINK_DECIBEL_VOLUME|
+                          (master->flags & (PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY)));
     pa_sink_new_data_done(&sink_data);
 
     if (!u->sink) {
@@ -1015,10 +1126,12 @@ int pa__init(pa_module*m) {
         goto fail;
     }
     u->name=pa_xstrdup(u->sink->name);
-    u->sink->parent.process_msg = sink_process_msg;
-    u->sink->set_state = sink_set_state;
-    u->sink->update_requested_latency = sink_update_requested_latency;
-    u->sink->request_rewind = sink_request_rewind;
+    u->sink->parent.process_msg = sink_process_msg_cb;
+    u->sink->set_state = sink_set_state_cb;
+    u->sink->update_requested_latency = sink_update_requested_latency_cb;
+    u->sink->request_rewind = sink_request_rewind_cb;
+    u->sink->set_volume = sink_set_volume_cb;
+    u->sink->set_mute = sink_set_mute_cb;
     u->sink->userdata = u;
     u->input_q = pa_memblockq_new(0,  MEMBLOCKQ_MAXLENGTH, 0, fs, 1, 1, 0, &u->sink->silence);
 
@@ -1053,6 +1166,9 @@ int pa__init(pa_module*m) {
     u->sink_input->state_change = sink_input_state_change_cb;
     u->sink_input->may_move_to = sink_input_may_move_to_cb;
     u->sink_input->moving = sink_input_moving_cb;
+    u->sink_input->volume_changed = sink_input_volume_changed_cb;
+    u->sink_input->mute_changed = sink_input_mute_changed_cb;
+
     u->sink_input->userdata = u;
 
     pa_sink_put(u->sink);
@@ -1060,7 +1176,6 @@ int pa__init(pa_module*m) {
 
     pa_modargs_free(ma);
 
-    pa_xfree(use_default);
 
     dbus_init(u);
 
@@ -1084,7 +1199,6 @@ fail:
     if (ma)
         pa_modargs_free(ma);
 
-    pa_xfree(use_default);
 
     pa__done(m);
 
@@ -1112,6 +1226,13 @@ void pa__done(pa_module*m) {
 
     dbus_done(u);
 
+    for(size_t c = 0; c < u->channels; ++c){
+        if(u->base_profiles[c]){
+            pa_xfree(u->base_profiles[c]);
+        }
+    }
+    pa_xfree(u->base_profiles);
+
     /* See comments in sink_input_kill_cb() above regarding
      * destruction order! */
 
@@ -1181,6 +1302,7 @@ static void equalizer_handle_get_filter(DBusConnection *conn, DBusMessage *msg,
 static void equalizer_handle_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_handle_get_profile_name(DBusConnection *conn, DBusMessage *msg, void *_u);
 enum manager_method_index {
     MANAGER_METHOD_REMOVE_PROFILE,
     MANAGER_METHOD_MAX
@@ -1246,6 +1368,7 @@ enum equalizer_method_index {
     EQUALIZER_METHOD_LOAD_PROFILE,
     EQUALIZER_METHOD_SET_FILTER,
     EQUALIZER_METHOD_GET_FILTER,
+    EQUALIZER_METHOD_GET_PROFILE_NAME,
     EQUALIZER_METHOD_MAX
 };
 
@@ -1290,6 +1413,10 @@ pa_dbus_arg_info load_profile_args[]={
     {"channel", "u","in"},
     {"name", "s","in"}
 };
+pa_dbus_arg_info base_profile_name_args[]={
+    {"channel", "u","in"},
+    {"name", "s","out"}
+};
 
 static pa_dbus_method_handler equalizer_methods[EQUALIZER_METHOD_MAX]={
     [EQUALIZER_METHOD_SEED_FILTER]{
@@ -1321,7 +1448,12 @@ static pa_dbus_method_handler equalizer_methods[EQUALIZER_METHOD_MAX]={
         .method_name="LoadProfile",
         .arguments=load_profile_args,
         .n_arguments=sizeof(load_profile_args)/sizeof(pa_dbus_arg_info),
-        .receive_cb=equalizer_handle_load_profile}
+        .receive_cb=equalizer_handle_load_profile},
+    [EQUALIZER_METHOD_GET_PROFILE_NAME]{
+        .method_name="BaseProfile",
+        .arguments=base_profile_name_args,
+        .n_arguments=sizeof(base_profile_name_args)/sizeof(pa_dbus_arg_info),
+        .receive_cb=equalizer_handle_get_profile_name}
 };
 
 static pa_dbus_property_handler equalizer_handlers[EQUALIZER_HANDLER_MAX]={
@@ -1631,9 +1763,6 @@ void equalizer_handle_seed_filter(DBusConnection *conn, DBusMessage *msg, void *
     pa_xfree(ys);
 
 
-    //Stupid for IO reasons?  Add a save signal to dbus instead
-    //save_state(u);
-
     pa_dbus_send_empty_reply(conn, msg);
 
     pa_assert_se((signal = dbus_message_new_signal(u->dbus_path, EQUALIZER_IFACE, equalizer_signals[EQUALIZER_SIGNAL_FILTER_CHANGED].name)));
@@ -1902,6 +2031,36 @@ void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void
     dbus_message_unref(signal);
 }
 
+void equalizer_handle_get_profile_name(DBusConnection *conn, DBusMessage *msg, void *_u){
+    struct userdata *u = (struct userdata *) _u;
+    DBusError error;
+    uint32_t channel, r_channel;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(u);
+    dbus_error_init(&error);
+
+    if(!dbus_message_get_args(msg, &error,
+                DBUS_TYPE_UINT32, &channel,
+                DBUS_TYPE_INVALID)){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "%s", error.message);
+        dbus_error_free(&error);
+        return;
+    }
+    if(channel > u->channels){
+        pa_dbus_send_error(conn, msg, DBUS_ERROR_INVALID_ARGS, "invalid channel: %d", channel);
+        dbus_error_free(&error);
+        return;
+    }
+    r_channel = channel == u->channels ? 0 : channel;
+    if(u->base_profiles[r_channel]){
+        pa_dbus_send_basic_value_reply(conn,msg, DBUS_TYPE_STRING, &u->base_profiles[r_channel]);
+    }else{
+        pa_dbus_send_empty_reply(conn, msg);
+    }
+}
+
 void equalizer_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){
     uint32_t rev=1;
     pa_dbus_send_basic_value_reply(conn, msg, DBUS_TYPE_UINT32, &rev);

commit 263b683437b9a88722f80fd0abea9ca1998fbd36
Author: Jason Newton <nevion at gmail.com>
Date:   Thu Aug 20 23:55:02 2009 -0700

    module-equalizer-sink: fix improper usage of pa_modargs_get_value_boolean for u->set_default

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index c531468..9a79cb9 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -753,6 +753,7 @@ static void sink_input_attach_cb(pa_sink_input *i) {
     //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->master->thread_info.max_latency);
     pa_sink_attach_within_thread(u->sink);
     if(u->set_default){
+        pa_log("Setting default sink to %s", u->sink->name);
         pa_namereg_set_default_sink(u->module->core, u->sink);
     }
 }
@@ -1056,7 +1057,7 @@ int pa__init(pa_module*m) {
     m->userdata = u;
 
     u->set_default = TRUE;
-    u->set_default = pa_modargs_get_value_boolean(ma, "set_default", &u->set_default);
+    pa_modargs_get_value_boolean(ma, "set_default", &u->set_default);
 
     u->channels = ss.channels;
     u->fft_size = pow(2, ceil(log(ss.rate)/log(2)));

commit 3053badf0684e077fca8e8fddb43b4e9f2a5c30c
Author: Jason Newton <nevion at gmail.com>
Date:   Sun Aug 23 15:49:27 2009 -0700

    module-equalizer-sink: resync with ladspa parent sink

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 9a79cb9..f634d5e 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -998,9 +998,11 @@ static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) {
 
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
-
-    pa_sink_set_asyncmsgq(u->sink, dest->asyncmsgq);
-    pa_sink_update_flags(u->sink, PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY, dest->flags);
+    if (dest) {
+        pa_sink_set_asyncmsgq(u->sink, dest->asyncmsgq);
+        pa_sink_update_flags(u->sink, PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY, dest->flags);
+    } else
+        pa_sink_set_asyncmsgq(u->sink, NULL);
 }
 
 //ensure's memory allocated is a multiple of v_size

commit bc869b5b28a0e0d4d53bc0a56174cda8212da1ca
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sat Jun 27 21:03:37 2009 +0100

    device-manager: Add a new module to keep track of the names and descriptions of various sinks.
    
    This will be used as the basis for a queryable system for past and present devices, initially for use in KDE.
    Currently all this module does is save lists of sinks/sources and their descriptions, so it needs to
    gain a protocol extension to make this queryable.
    
    As things stand it will save the device descriptions of all sinks and restore them if they differ from whats on record.

diff --git a/src/Makefile.am b/src/Makefile.am
index 6544e2a..6e3d79b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -990,7 +990,8 @@ modlibexec_LTLIBRARIES += \
 		module-sine-source.la \
 		module-detect.la \
 		module-volume-restore.la \
-		module-device-restore.la \
+    module-device-manager.la \
+    module-device-restore.la \
 		module-stream-restore.la \
 		module-card-restore.la \
 		module-default-device-restore.la \
@@ -1231,7 +1232,8 @@ SYMDEF_FILES = \
 		modules/jack/module-jack-sink-symdef.h \
 		modules/jack/module-jack-source-symdef.h \
 		modules/module-volume-restore-symdef.h \
-		modules/module-device-restore-symdef.h \
+    modules/module-device-manager-symdef.h \
+    modules/module-device-restore-symdef.h \
 		modules/module-stream-restore-symdef.h \
 		modules/module-card-restore-symdef.h \
 		modules/module-default-device-restore-symdef.h \
@@ -1539,6 +1541,12 @@ module_cork_music_on_phone_la_LDFLAGS = $(MODULE_LDFLAGS)
 module_cork_music_on_phone_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
 module_cork_music_on_phone_la_CFLAGS = $(AM_CFLAGS)
 
+# Device description restore module
+module_device_manager_la_SOURCES = modules/module-device-manager.c
+module_device_manager_la_LDFLAGS = $(MODULE_LDFLAGS)
+module_device_manager_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
+module_device_manager_la_CFLAGS = $(AM_CFLAGS)
+
 # Device volume/muted restore module
 module_device_restore_la_SOURCES = modules/module-device-restore.c
 module_device_restore_la_LDFLAGS = $(MODULE_LDFLAGS)
diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
new file mode 100644
index 0000000..96d4a66
--- /dev/null
+++ b/src/modules/module-device-manager.c
@@ -0,0 +1,352 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2006-2008 Lennart Poettering
+  Copyright 2009 Colin Guthrie
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <pulse/xmalloc.h>
+#include <pulse/volume.h>
+#include <pulse/timeval.h>
+#include <pulse/util.h>
+#include <pulse/rtclock.h>
+
+#include <pulsecore/core-error.h>
+#include <pulsecore/module.h>
+#include <pulsecore/core-util.h>
+#include <pulsecore/modargs.h>
+#include <pulsecore/log.h>
+#include <pulsecore/core-subscribe.h>
+#include <pulsecore/sink-input.h>
+#include <pulsecore/source-output.h>
+#include <pulsecore/namereg.h>
+#include <pulsecore/database.h>
+
+#include "module-device-manager-symdef.h"
+
+PA_MODULE_AUTHOR("Colin Guthrie");
+PA_MODULE_DESCRIPTION("Keep track of devices (and their descriptions) both past and present");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
+PA_MODULE_USAGE("This module does not take any arguments");
+
+#define SAVE_INTERVAL (10 * PA_USEC_PER_SEC)
+
+static const char* const valid_modargs[] = {
+    NULL
+};
+
+struct userdata {
+    pa_core *core;
+    pa_module *module;
+    pa_subscription *subscription;
+    pa_hook_slot
+        *sink_new_hook_slot,
+        *source_new_hook_slot;
+    pa_time_event *save_time_event;
+    pa_database *database;
+};
+
+#define ENTRY_VERSION 1
+
+struct entry {
+    uint8_t version;
+    char description[PA_NAME_MAX];
+} PA_GCC_PACKED;
+
+static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) {
+    struct userdata *u = userdata;
+
+    pa_assert(a);
+    pa_assert(e);
+    pa_assert(u);
+
+    pa_assert(e == u->save_time_event);
+    u->core->mainloop->time_free(u->save_time_event);
+    u->save_time_event = NULL;
+
+    pa_database_sync(u->database);
+    pa_log_info("Synced.");
+}
+
+static struct entry* read_entry(struct userdata *u, const char *name) {
+    pa_datum key, data;
+    struct entry *e;
+
+    pa_assert(u);
+    pa_assert(name);
+
+    key.data = (char*) name;
+    key.size = strlen(name);
+
+    pa_zero(data);
+
+    if (!pa_database_get(u->database, &key, &data))
+        goto fail;
+
+    if (data.size != sizeof(struct entry)) {
+        pa_log_debug("Database contains entry for device %s of wrong size %lu != %lu. Probably due to upgrade, ignoring.", name, (unsigned long) data.size, (unsigned long) sizeof(struct entry));
+        goto fail;
+    }
+
+    e = (struct entry*) data.data;
+
+    if (e->version != ENTRY_VERSION) {
+        pa_log_debug("Version of database entry for device %s doesn't match our version. Probably due to upgrade, ignoring.", name);
+        goto fail;
+    }
+
+    if (!memchr(e->description, 0, sizeof(e->description))) {
+        pa_log_warn("Database contains entry for device %s with missing NUL byte in description", name);
+        goto fail;
+    }
+
+    return e;
+
+fail:
+
+    pa_datum_free(&data);
+    return NULL;
+}
+
+static void trigger_save(struct userdata *u) {
+    if (u->save_time_event)
+        return;
+
+    u->save_time_event = pa_core_rttime_new(u->core, pa_rtclock_now() + SAVE_INTERVAL, save_time_callback, u);
+}
+
+static pa_bool_t entries_equal(const struct entry *a, const struct entry *b) {
+    if (strncmp(a->description, b->description, sizeof(a->description)))
+        return FALSE;
+
+    return TRUE;
+}
+
+static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
+    struct userdata *u = userdata;
+    struct entry entry, *old;
+    char *name;
+    pa_datum key, data;
+
+    pa_assert(c);
+    pa_assert(u);
+
+    if (t != (PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_NEW) &&
+        t != (PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE) &&
+        t != (PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_NEW) &&
+        t != (PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE))
+        return;
+
+    pa_zero(entry);
+    entry.version = ENTRY_VERSION;
+
+    if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SINK) {
+        pa_sink *sink;
+
+        if (!(sink = pa_idxset_get_by_index(c->sinks, idx)))
+            return;
+
+        name = pa_sprintf_malloc("sink:%s", sink->name);
+
+        if ((old = read_entry(u, name)))
+            entry = *old;
+
+        pa_strlcpy(entry.description, pa_strnull(pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description));
+
+    } else {
+        pa_source *source;
+
+        pa_assert((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE);
+
+        if (!(source = pa_idxset_get_by_index(c->sources, idx)))
+            return;
+
+        name = pa_sprintf_malloc("source:%s", source->name);
+
+        if ((old = read_entry(u, name)))
+            entry = *old;
+
+        pa_strlcpy(entry.description, pa_strnull(pa_proplist_gets(source->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description));
+    }
+
+    if (old) {
+
+        if (entries_equal(old, &entry)) {
+            pa_xfree(old);
+            pa_xfree(name);
+            return;
+        }
+
+        pa_xfree(old);
+    }
+
+    key.data = name;
+    key.size = strlen(name);
+
+    data.data = &entry;
+    data.size = sizeof(entry);
+
+    pa_log_info("Storing device description for %s.", name);
+
+    pa_database_set(u->database, &key, &data, TRUE);
+
+    pa_xfree(name);
+
+    trigger_save(u);
+}
+
+static pa_hook_result_t sink_new_hook_callback(pa_core *c, pa_sink_new_data *new_data, struct userdata *u) {
+    char *name;
+    struct entry *e;
+
+    pa_assert(c);
+    pa_assert(new_data);
+    pa_assert(u);
+
+    name = pa_sprintf_malloc("sink:%s", new_data->name);
+
+    if ((e = read_entry(u, name))) {
+        if (strncmp(e->description, pa_proplist_gets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION), sizeof(e->description)) != 0) {
+            pa_log_info("Restoring description for sink %s.", name);
+            pa_proplist_sets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description);
+        }
+
+        pa_xfree(e);
+    }
+
+    pa_xfree(name);
+
+    return PA_HOOK_OK;
+}
+
+static pa_hook_result_t source_new_hook_callback(pa_core *c, pa_source_new_data *new_data, struct userdata *u) {
+    char *name;
+    struct entry *e;
+
+    pa_assert(c);
+    pa_assert(new_data);
+    pa_assert(u);
+
+    name = pa_sprintf_malloc("source:%s", new_data->name);
+
+    if ((e = read_entry(u, name))) {
+
+        if (strncmp(e->description, pa_proplist_gets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION), sizeof(e->description)) != 0) {
+            pa_log_info("Restoring description for sink %s.", name);
+            pa_proplist_sets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description);
+        }
+
+        pa_xfree(e);
+    }
+
+    pa_xfree(name);
+
+    return PA_HOOK_OK;
+}
+
+int pa__init(pa_module*m) {
+    pa_modargs *ma = NULL;
+    struct userdata *u;
+    char *fname;
+    pa_sink *sink;
+    pa_source *source;
+    uint32_t idx;
+
+    pa_assert(m);
+
+    if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
+        pa_log("Failed to parse module arguments");
+        goto fail;
+    }
+
+    m->userdata = u = pa_xnew0(struct userdata, 1);
+    u->core = m->core;
+    u->module = m;
+
+    u->subscription = pa_subscription_new(m->core, PA_SUBSCRIPTION_MASK_SINK|PA_SUBSCRIPTION_MASK_SOURCE, subscribe_callback, u);
+
+    u->sink_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_NEW], PA_HOOK_EARLY, (pa_hook_cb_t) sink_new_hook_callback, u);
+    u->source_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_NEW], PA_HOOK_EARLY, (pa_hook_cb_t) source_new_hook_callback, u);
+
+    if (!(fname = pa_state_path("device-manager", TRUE)))
+        goto fail;
+
+    if (!(u->database = pa_database_open(fname, TRUE))) {
+        pa_log("Failed to open volume database '%s': %s", fname, pa_cstrerror(errno));
+        pa_xfree(fname);
+        goto fail;
+    }
+
+    pa_log_info("Sucessfully opened database file '%s'.", fname);
+    pa_xfree(fname);
+
+    for (sink = pa_idxset_first(m->core->sinks, &idx); sink; sink = pa_idxset_next(m->core->sinks, &idx))
+        subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_NEW, sink->index, u);
+
+    for (source = pa_idxset_first(m->core->sources, &idx); source; source = pa_idxset_next(m->core->sources, &idx))
+        subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_NEW, source->index, u);
+
+    pa_modargs_free(ma);
+    return 0;
+
+fail:
+    pa__done(m);
+
+    if (ma)
+        pa_modargs_free(ma);
+
+    return  -1;
+}
+
+void pa__done(pa_module*m) {
+    struct userdata* u;
+
+    pa_assert(m);
+
+    if (!(u = m->userdata))
+        return;
+
+    if (u->subscription)
+        pa_subscription_free(u->subscription);
+
+    if (u->sink_new_hook_slot)
+        pa_hook_slot_free(u->sink_new_hook_slot);
+    if (u->source_new_hook_slot)
+        pa_hook_slot_free(u->source_new_hook_slot);
+
+    if (u->save_time_event)
+        u->core->mainloop->time_free(u->save_time_event);
+
+    if (u->database)
+        pa_database_close(u->database);
+
+    pa_xfree(u);
+}

commit 37e82cec0ad13923a5db259a88bd00a2840112c6
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sat Jun 27 22:08:07 2009 +0100

    device-manager: Add an untested protocol extension.
    
    This is effectively copied from the stream restore extension.

diff --git a/src/Makefile.am b/src/Makefile.am
index 6e3d79b..b7ebac5 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -689,6 +689,7 @@ pulseinclude_HEADERS = \
 		pulse/context.h \
 		pulse/def.h \
 		pulse/error.h \
+		pulse/ext-device-manager.h \
 		pulse/ext-stream-restore.h \
 		pulse/gccmacro.h \
 		pulse/introspect.h \
@@ -739,6 +740,7 @@ libpulse_la_SOURCES = \
 		pulse/context.c pulse/context.h \
 		pulse/def.h \
 		pulse/error.c pulse/error.h \
+		pulse/ext-device-manager.c pulse/ext-device-manager.h \
 		pulse/ext-stream-restore.c pulse/ext-stream-restore.h \
 		pulse/gccmacro.h \
 		pulse/internal.h \
diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 96d4a66..b41f71c 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -47,6 +47,9 @@
 #include <pulsecore/sink-input.h>
 #include <pulsecore/source-output.h>
 #include <pulsecore/namereg.h>
+#include <pulsecore/protocol-native.h>
+#include <pulsecore/pstream.h>
+#include <pulsecore/pstream-util.h>
 #include <pulsecore/database.h>
 
 #include "module-device-manager-symdef.h"
@@ -69,9 +72,13 @@ struct userdata {
     pa_subscription *subscription;
     pa_hook_slot
         *sink_new_hook_slot,
-        *source_new_hook_slot;
+        *source_new_hook_slot,
+        *connection_unlink_hook_slot;
     pa_time_event *save_time_event;
     pa_database *database;
+
+    pa_native_protocol *protocol;
+    pa_idxset *subscribed;
 };
 
 #define ENTRY_VERSION 1
@@ -81,6 +88,15 @@ struct entry {
     char description[PA_NAME_MAX];
 } PA_GCC_PACKED;
 
+enum {
+    SUBCOMMAND_TEST,
+    SUBCOMMAND_READ,
+    SUBCOMMAND_WRITE,
+    SUBCOMMAND_DELETE,
+    SUBCOMMAND_SUBSCRIBE,
+    SUBCOMMAND_EVENT
+};
+
 static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) {
     struct userdata *u = userdata;
 
@@ -272,6 +288,230 @@ static pa_hook_result_t source_new_hook_callback(pa_core *c, pa_source_new_data
     return PA_HOOK_OK;
 }
 
+static char *get_name(const char *key, const char *prefix) {
+  char *t;
+
+  if (strncmp(key, prefix, sizeof(prefix)))
+    return NULL;
+
+  t = pa_xstrdup(key + sizeof(prefix));
+  return t;
+}
+
+static void apply_entry(struct userdata *u, const char *name, struct entry *e) {
+  pa_sink *sink;
+  pa_source *source;
+  uint32_t idx;
+
+  pa_assert(u);
+  pa_assert(name);
+  pa_assert(e);
+
+  for (sink = pa_idxset_first(u->core->sinks, &idx); sink; sink = pa_idxset_next(u->core->sinks, &idx)) {
+    char *n;
+
+    if (!(n = get_name(name, "sink")))
+      continue;
+
+    if (!pa_streq(sink->name, n)) {
+      pa_xfree(n);
+      continue;
+    }
+    pa_xfree(n);
+
+    pa_log_info("Restoring description for sink %s.", sink->name);
+    pa_proplist_sets(sink->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description);
+  }
+
+  for (source = pa_idxset_first(u->core->sources, &idx); source; source = pa_idxset_next(u->core->sources, &idx)) {
+    char *n;
+
+    if (!(n = get_name(name, "source")))
+      continue;
+
+    if (!pa_streq(source->name, n)) {
+      pa_xfree(n);
+      continue;
+    }
+    pa_xfree(n);
+
+    pa_log_info("Restoring description for source %s.", source->name);
+    pa_proplist_sets(source->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description);
+  }
+}
+
+#define EXT_VERSION 1
+
+static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connection *c, uint32_t tag, pa_tagstruct *t) {
+  struct userdata *u;
+  uint32_t command;
+  pa_tagstruct *reply = NULL;
+
+  pa_assert(p);
+  pa_assert(m);
+  pa_assert(c);
+  pa_assert(t);
+
+  u = m->userdata;
+
+  if (pa_tagstruct_getu32(t, &command) < 0)
+    goto fail;
+
+  reply = pa_tagstruct_new(NULL, 0);
+  pa_tagstruct_putu32(reply, PA_COMMAND_REPLY);
+  pa_tagstruct_putu32(reply, tag);
+
+  switch (command) {
+    case SUBCOMMAND_TEST: {
+      if (!pa_tagstruct_eof(t))
+        goto fail;
+
+      pa_tagstruct_putu32(reply, EXT_VERSION);
+      break;
+    }
+
+    case SUBCOMMAND_READ: {
+      pa_datum key;
+      pa_bool_t done;
+
+      if (!pa_tagstruct_eof(t))
+        goto fail;
+
+      done = !pa_database_first(u->database, &key, NULL);
+
+      while (!done) {
+        pa_datum next_key;
+        struct entry *e;
+        char *name;
+
+        done = !pa_database_next(u->database, &key, &next_key, NULL);
+
+        name = pa_xstrndup(key.data, key.size);
+        pa_datum_free(&key);
+
+        if ((e = read_entry(u, name))) {
+          pa_tagstruct_puts(reply, name);
+          pa_tagstruct_puts(reply, e->description);
+
+          pa_xfree(e);
+        }
+
+        pa_xfree(name);
+
+        key = next_key;
+      }
+
+      break;
+    }
+
+    case SUBCOMMAND_WRITE: {
+      uint32_t mode;
+      pa_bool_t apply_immediately = FALSE;
+
+      if (pa_tagstruct_getu32(t, &mode) < 0 ||
+        pa_tagstruct_get_boolean(t, &apply_immediately) < 0)
+        goto fail;
+
+      if (mode != PA_UPDATE_MERGE &&
+        mode != PA_UPDATE_REPLACE &&
+        mode != PA_UPDATE_SET)
+        goto fail;
+
+      if (mode == PA_UPDATE_SET)
+        pa_database_clear(u->database);
+
+      while (!pa_tagstruct_eof(t)) {
+        const char *name, *description;
+        struct entry entry;
+        pa_datum key, data;
+
+        pa_zero(entry);
+        entry.version = ENTRY_VERSION;
+
+        if (pa_tagstruct_gets(t, &name) < 0 ||
+          pa_tagstruct_gets(reply, &description) < 0)
+          goto fail;
+
+        if (!name || !*name)
+          goto fail;
+
+        pa_strlcpy(entry.description, description, sizeof(entry.description));
+
+        key.data = (char*) name;
+        key.size = strlen(name);
+
+        data.data = &entry;
+        data.size = sizeof(entry);
+
+        if (pa_database_set(u->database, &key, &data, mode == PA_UPDATE_REPLACE) == 0)
+          if (apply_immediately)
+            apply_entry(u, name, &entry);
+      }
+
+      trigger_save(u);
+
+      break;
+    }
+
+    case SUBCOMMAND_DELETE:
+
+      while (!pa_tagstruct_eof(t)) {
+        const char *name;
+        pa_datum key;
+
+        if (pa_tagstruct_gets(t, &name) < 0)
+          goto fail;
+
+        key.data = (char*) name;
+        key.size = strlen(name);
+
+        pa_database_unset(u->database, &key);
+      }
+
+      trigger_save(u);
+
+      break;
+
+    case SUBCOMMAND_SUBSCRIBE: {
+
+      pa_bool_t enabled;
+
+      if (pa_tagstruct_get_boolean(t, &enabled) < 0 ||
+        !pa_tagstruct_eof(t))
+        goto fail;
+
+      if (enabled)
+        pa_idxset_put(u->subscribed, c, NULL);
+      else
+        pa_idxset_remove_by_data(u->subscribed, c, NULL);
+
+      break;
+    }
+
+    default:
+      goto fail;
+  }
+
+  pa_pstream_send_tagstruct(pa_native_connection_get_pstream(c), reply);
+  return 0;
+
+  fail:
+
+  if (reply)
+    pa_tagstruct_free(reply);
+
+  return -1;
+}
+
+static pa_hook_result_t connection_unlink_hook_cb(pa_native_protocol *p, pa_native_connection *c, struct userdata *u) {
+    pa_assert(p);
+    pa_assert(c);
+    pa_assert(u);
+
+    pa_idxset_remove_by_data(u->subscribed, c, NULL);
+    return PA_HOOK_OK;
+}
+
 int pa__init(pa_module*m) {
     pa_modargs *ma = NULL;
     struct userdata *u;
@@ -290,6 +530,12 @@ int pa__init(pa_module*m) {
     m->userdata = u = pa_xnew0(struct userdata, 1);
     u->core = m->core;
     u->module = m;
+    u->subscribed = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+
+    u->protocol = pa_native_protocol_get(m->core);
+    pa_native_protocol_install_ext(u->protocol, m, extension_cb);
+
+    u->connection_unlink_hook_slot = pa_hook_connect(&pa_native_protocol_hooks(u->protocol)[PA_NATIVE_HOOK_CONNECTION_UNLINK], PA_HOOK_NORMAL, (pa_hook_cb_t) connection_unlink_hook_cb, u);
 
     u->subscription = pa_subscription_new(m->core, PA_SUBSCRIPTION_MASK_SINK|PA_SUBSCRIPTION_MASK_SOURCE, subscribe_callback, u);
 
@@ -348,5 +594,13 @@ void pa__done(pa_module*m) {
     if (u->database)
         pa_database_close(u->database);
 
+    if (u->protocol) {
+        pa_native_protocol_remove_ext(u->protocol, m);
+        pa_native_protocol_unref(u->protocol);
+    }
+
+    if (u->subscribed)
+        pa_idxset_free(u->subscribed, NULL, NULL);
+
     pa_xfree(u);
 }
diff --git a/src/pulse/context.c b/src/pulse/context.c
index 23ae30c..7468d0a 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -128,6 +128,9 @@ static void reset_callbacks(pa_context *c) {
     c->event_callback = NULL;
     c->event_userdata = NULL;
 
+    c->ext_device_manager.callback = NULL;
+    c->ext_device_manager.userdata = NULL;
+
     c->ext_stream_restore.callback = NULL;
     c->ext_stream_restore.userdata = NULL;
 }
@@ -1434,6 +1437,8 @@ void pa_command_extension(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_t
 
     if (!strcmp(name, "module-stream-restore"))
         pa_ext_stream_restore_command(c, tag, t);
+    else if (!strcmp(name, "module-device-manager"))
+        pa_ext_device_manager_command(c, tag, t);
     else
         pa_log(_("Received message for unknown extension '%s'"), name);
 
diff --git a/src/pulse/ext-device-manager.c b/src/pulse/ext-device-manager.c
new file mode 100644
index 0000000..1c6eee5
--- /dev/null
+++ b/src/pulse/ext-device-manager.c
@@ -0,0 +1,358 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2008 Lennart Poettering
+  Copyright 2009 Colin Guthrie
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <pulse/context.h>
+#include <pulse/gccmacro.h>
+
+#include <pulsecore/macro.h>
+#include <pulsecore/pstream-util.h>
+
+#include "internal.h"
+#include "operation.h"
+#include "fork-detect.h"
+
+#include "ext-device-manager.h"
+
+enum {
+    SUBCOMMAND_TEST,
+    SUBCOMMAND_READ,
+    SUBCOMMAND_WRITE,
+    SUBCOMMAND_DELETE,
+    SUBCOMMAND_SUBSCRIBE,
+    SUBCOMMAND_EVENT
+};
+
+static void ext_device_manager_test_cb(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
+    pa_operation *o = userdata;
+    uint32_t version = PA_INVALID_INDEX;
+
+    pa_assert(pd);
+    pa_assert(o);
+    pa_assert(PA_REFCNT_VALUE(o) >= 1);
+
+    if (!o->context)
+        goto finish;
+
+    if (command != PA_COMMAND_REPLY) {
+        if (pa_context_handle_error(o->context, command, t, FALSE) < 0)
+            goto finish;
+
+    } else if (pa_tagstruct_getu32(t, &version) < 0 ||
+               !pa_tagstruct_eof(t)) {
+
+        pa_context_fail(o->context, PA_ERR_PROTOCOL);
+        goto finish;
+    }
+
+    if (o->callback) {
+        pa_ext_device_manager_test_cb_t cb = (pa_ext_device_manager_test_cb_t) o->callback;
+        cb(o->context, version, o->userdata);
+    }
+
+finish:
+    pa_operation_done(o);
+    pa_operation_unref(o);
+}
+
+pa_operation *pa_ext_device_manager_test(
+        pa_context *c,
+        pa_ext_device_manager_test_cb_t cb,
+        void *userdata) {
+
+    uint32_t tag;
+    pa_operation *o;
+    pa_tagstruct *t;
+
+    pa_assert(c);
+    pa_assert(PA_REFCNT_VALUE(c) >= 1);
+
+    PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
+    PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
+    PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 14, PA_ERR_NOTSUPPORTED);
+
+    o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
+
+    t = pa_tagstruct_command(c, PA_COMMAND_EXTENSION, &tag);
+    pa_tagstruct_putu32(t, PA_INVALID_INDEX);
+    pa_tagstruct_puts(t, "module-device-manager");
+    pa_tagstruct_putu32(t, SUBCOMMAND_TEST);
+    pa_pstream_send_tagstruct(c->pstream, t);
+    pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, ext_device_manager_test_cb, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
+
+    return o;
+}
+
+static void ext_device_manager_read_cb(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
+    pa_operation *o = userdata;
+    int eol = 1;
+
+    pa_assert(pd);
+    pa_assert(o);
+    pa_assert(PA_REFCNT_VALUE(o) >= 1);
+
+    if (!o->context)
+        goto finish;
+
+    if (command != PA_COMMAND_REPLY) {
+        if (pa_context_handle_error(o->context, command, t, FALSE) < 0)
+            goto finish;
+
+        eol = -1;
+    } else {
+
+        while (!pa_tagstruct_eof(t)) {
+            pa_ext_device_manager_info i;
+
+            memset(&i, 0, sizeof(i));
+
+            if (pa_tagstruct_gets(t, &i.name) < 0 ||
+                pa_tagstruct_gets(t, &i.description) < 0) {
+
+                pa_context_fail(o->context, PA_ERR_PROTOCOL);
+                goto finish;
+            }
+
+            if (o->callback) {
+                pa_ext_device_manager_read_cb_t cb = (pa_ext_device_manager_read_cb_t) o->callback;
+                cb(o->context, &i, 0, o->userdata);
+            }
+        }
+    }
+
+    if (o->callback) {
+        pa_ext_device_manager_read_cb_t cb = (pa_ext_device_manager_read_cb_t) o->callback;
+        cb(o->context, NULL, eol, o->userdata);
+    }
+
+finish:
+    pa_operation_done(o);
+    pa_operation_unref(o);
+}
+
+pa_operation *pa_ext_device_manager_read(
+        pa_context *c,
+        pa_ext_device_manager_read_cb_t cb,
+        void *userdata) {
+
+    uint32_t tag;
+    pa_operation *o;
+    pa_tagstruct *t;
+
+    pa_assert(c);
+    pa_assert(PA_REFCNT_VALUE(c) >= 1);
+
+    PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
+    PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
+    PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 14, PA_ERR_NOTSUPPORTED);
+
+    o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
+
+    t = pa_tagstruct_command(c, PA_COMMAND_EXTENSION, &tag);
+    pa_tagstruct_putu32(t, PA_INVALID_INDEX);
+    pa_tagstruct_puts(t, "module-device-manager");
+    pa_tagstruct_putu32(t, SUBCOMMAND_READ);
+    pa_pstream_send_tagstruct(c->pstream, t);
+    pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, ext_device_manager_read_cb, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
+
+    return o;
+}
+
+pa_operation *pa_ext_device_manager_write(
+        pa_context *c,
+        pa_update_mode_t mode,
+        const pa_ext_device_manager_info data[],
+        unsigned n,
+        int apply_immediately,
+        pa_context_success_cb_t cb,
+        void *userdata) {
+
+    uint32_t tag;
+    pa_operation *o = NULL;
+    pa_tagstruct *t = NULL;
+
+    pa_assert(c);
+    pa_assert(PA_REFCNT_VALUE(c) >= 1);
+    pa_assert(mode == PA_UPDATE_MERGE || mode == PA_UPDATE_REPLACE || mode == PA_UPDATE_SET);
+    pa_assert(data);
+
+    PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
+    PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
+    PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 14, PA_ERR_NOTSUPPORTED);
+
+    o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
+
+    t = pa_tagstruct_command(c, PA_COMMAND_EXTENSION, &tag);
+    pa_tagstruct_putu32(t, PA_INVALID_INDEX);
+    pa_tagstruct_puts(t, "module-device-manager");
+    pa_tagstruct_putu32(t, SUBCOMMAND_WRITE);
+
+    pa_tagstruct_putu32(t, mode);
+    pa_tagstruct_put_boolean(t, apply_immediately);
+
+    for (; n > 0; n--, data++) {
+        if (!data->name || !*data->name)
+            goto fail;
+
+        pa_tagstruct_puts(t, data->name);
+        pa_tagstruct_puts(t, data->description);
+    }
+
+    pa_pstream_send_tagstruct(c->pstream, t);
+    pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
+
+    return o;
+
+fail:
+    if (o) {
+        pa_operation_cancel(o);
+        pa_operation_unref(o);
+    }
+
+    if (t)
+        pa_tagstruct_free(t);
+
+    pa_context_set_error(c, PA_ERR_INVALID);
+    return NULL;
+}
+
+pa_operation *pa_ext_device_manager_delete(
+        pa_context *c,
+        const char *const s[],
+        pa_context_success_cb_t cb,
+        void *userdata) {
+
+    uint32_t tag;
+    pa_operation *o = NULL;
+    pa_tagstruct *t = NULL;
+    const char *const *k;
+
+    pa_assert(c);
+    pa_assert(PA_REFCNT_VALUE(c) >= 1);
+    pa_assert(s);
+
+    PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
+    PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
+    PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 14, PA_ERR_NOTSUPPORTED);
+
+    o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
+
+    t = pa_tagstruct_command(c, PA_COMMAND_EXTENSION, &tag);
+    pa_tagstruct_putu32(t, PA_INVALID_INDEX);
+    pa_tagstruct_puts(t, "module-device-manager");
+    pa_tagstruct_putu32(t, SUBCOMMAND_DELETE);
+
+    for (k = s; *k; k++) {
+        if (!*k || !**k)
+            goto fail;
+
+        pa_tagstruct_puts(t, *k);
+    }
+
+    pa_pstream_send_tagstruct(c->pstream, t);
+    pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
+
+    return o;
+
+fail:
+    if (o) {
+        pa_operation_cancel(o);
+        pa_operation_unref(o);
+    }
+
+    if (t)
+        pa_tagstruct_free(t);
+
+    pa_context_set_error(c, PA_ERR_INVALID);
+    return NULL;
+}
+
+pa_operation *pa_ext_device_manager_subscribe(
+        pa_context *c,
+        int enable,
+        pa_context_success_cb_t cb,
+        void *userdata) {
+
+    uint32_t tag;
+    pa_operation *o;
+    pa_tagstruct *t;
+
+    pa_assert(c);
+    pa_assert(PA_REFCNT_VALUE(c) >= 1);
+
+    PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
+    PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
+    PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 14, PA_ERR_NOTSUPPORTED);
+
+    o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
+
+    t = pa_tagstruct_command(c, PA_COMMAND_EXTENSION, &tag);
+    pa_tagstruct_putu32(t, PA_INVALID_INDEX);
+    pa_tagstruct_puts(t, "module-device-manager");
+    pa_tagstruct_putu32(t, SUBCOMMAND_SUBSCRIBE);
+    pa_tagstruct_put_boolean(t, enable);
+    pa_pstream_send_tagstruct(c->pstream, t);
+    pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
+
+    return o;
+}
+
+void pa_ext_device_manager_set_subscribe_cb(
+        pa_context *c,
+        pa_ext_device_manager_subscribe_cb_t cb,
+        void *userdata) {
+
+    pa_assert(c);
+    pa_assert(PA_REFCNT_VALUE(c) >= 1);
+
+    if (pa_detect_fork())
+        return;
+
+    c->ext_device_manager.callback = cb;
+    c->ext_device_manager.userdata = userdata;
+}
+
+void pa_ext_device_manager_command(pa_context *c, uint32_t tag, pa_tagstruct *t) {
+    uint32_t subcommand;
+
+    pa_assert(c);
+    pa_assert(PA_REFCNT_VALUE(c) >= 1);
+    pa_assert(t);
+
+    if (pa_tagstruct_getu32(t, &subcommand) < 0 ||
+        !pa_tagstruct_eof(t)) {
+
+        pa_context_fail(c, PA_ERR_PROTOCOL);
+        return;
+    }
+
+    if (subcommand != SUBCOMMAND_EVENT) {
+        pa_context_fail(c, PA_ERR_PROTOCOL);
+        return;
+    }
+
+    if (c->ext_device_manager.callback)
+        c->ext_device_manager.callback(c, c->ext_device_manager.userdata);
+}
diff --git a/src/pulse/ext-device-manager.h b/src/pulse/ext-device-manager.h
new file mode 100644
index 0000000..eed0c50
--- /dev/null
+++ b/src/pulse/ext-device-manager.h
@@ -0,0 +1,106 @@
+#ifndef foopulseextdevicemanagerhfoo
+#define foopulseextdevicemanagerhfoo
+
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2008 Lennart Poettering
+  Copyright 2009 Colin Guthrie
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#include <pulse/context.h>
+#include <pulse/version.h>
+
+/** \file
+ *
+ * Routines for controlling module-stream-restore
+ */
+
+PA_C_DECL_BEGIN
+
+/** Stores information about one device in the device database that is
+ * maintained by module-device-manager. \since 0.9.17 */
+typedef struct pa_ext_device_manager_info {
+    const char *name;            /**< Identifier string of the device. A string like "sink:" or similar followed by the name of the device. */
+    const char *description;     /**< The description of the device when it was last seen, if applicable and saved */
+} pa_ext_device_manager_info;
+
+/** Callback prototype for pa_ext_device_manager_test(). \since 0.9.17 */
+typedef void (*pa_ext_device_manager_test_cb_t)(
+        pa_context *c,
+        uint32_t version,
+        void *userdata);
+
+/** Test if this extension module is available in the server. \since 0.9.17 */
+pa_operation *pa_ext_device_manager_test(
+        pa_context *c,
+        pa_ext_device_manager_test_cb_t cb,
+        void *userdata);
+
+/** Callback prototype for pa_ext_device_manager_read(). \since 0.9.17 */
+typedef void (*pa_ext_device_manager_read_cb_t)(
+        pa_context *c,
+        const pa_ext_device_manager_info *info,
+        int eol,
+        void *userdata);
+
+/** Read all entries from the device database. \since 0.9.17 */
+pa_operation *pa_ext_device_manager_read(
+        pa_context *c,
+        pa_ext_device_manager_read_cb_t cb,
+        void *userdata);
+
+/** Store entries in the device database. \since 0.9.17 */
+pa_operation *pa_ext_device_manager_write(
+        pa_context *c,
+        pa_update_mode_t mode,
+        const pa_ext_device_manager_info data[],
+        unsigned n,
+        int apply_immediately,
+        pa_context_success_cb_t cb,
+        void *userdata);
+
+/** Delete entries from the device database. \since 0.9.17 */
+pa_operation *pa_ext_device_manager_delete(
+        pa_context *c,
+        const char *const s[],
+        pa_context_success_cb_t cb,
+        void *userdata);
+
+/** Subscribe to changes in the device database. \since 0.9.17 */
+pa_operation *pa_ext_device_manager_subscribe(
+        pa_context *c,
+        int enable,
+        pa_context_success_cb_t cb,
+        void *userdata);
+
+/** Callback prototype for pa_ext_device_manager_set_subscribe_cb(). \since 0.9.17 */
+typedef void (*pa_ext_device_manager_subscribe_cb_t)(
+        pa_context *c,
+        void *userdata);
+
+/** Set the subscription callback that is called when
+ * pa_ext_device_manager_subscribe() was called. \since 0.9.17 */
+void pa_ext_device_manager_set_subscribe_cb(
+        pa_context *c,
+        pa_ext_device_manager_subscribe_cb_t cb,
+        void *userdata);
+
+PA_C_DECL_END
+
+#endif
diff --git a/src/pulse/internal.h b/src/pulse/internal.h
index e069c9e..b371bfc 100644
--- a/src/pulse/internal.h
+++ b/src/pulse/internal.h
@@ -28,6 +28,7 @@
 #include <pulse/stream.h>
 #include <pulse/operation.h>
 #include <pulse/subscribe.h>
+#include <pulse/ext-device-manager.h>
 #include <pulse/ext-stream-restore.h>
 
 #include <pulsecore/socket-client.h>
@@ -102,6 +103,10 @@ struct pa_context {
 
     /* Extension specific data */
     struct {
+        pa_ext_device_manager_subscribe_cb_t callback;
+        void *userdata;
+    } ext_device_manager;
+    struct {
         pa_ext_stream_restore_subscribe_cb_t callback;
         void *userdata;
     } ext_stream_restore;
@@ -283,6 +288,7 @@ pa_tagstruct *pa_tagstruct_command(pa_context *c, uint32_t command, uint32_t *ta
 #define PA_FAIL_RETURN_NULL(context, error)     \
     PA_FAIL_RETURN_ANY(context, error, NULL)
 
+void pa_ext_device_manager_command(pa_context *c, uint32_t tag, pa_tagstruct *t);
 void pa_ext_stream_restore_command(pa_context *c, uint32_t tag, pa_tagstruct *t);
 
 pa_bool_t pa_mainloop_is_our_api(pa_mainloop_api*m);

commit 93c3c655e436862e2340a9d8a90d6b8a58c9a6e1
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sat Jun 27 22:09:00 2009 +0100

    device-manager: Fix indentation

diff --git a/src/Makefile.am b/src/Makefile.am
index b7ebac5..0a041eb 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -992,8 +992,8 @@ modlibexec_LTLIBRARIES += \
 		module-sine-source.la \
 		module-detect.la \
 		module-volume-restore.la \
-    module-device-manager.la \
-    module-device-restore.la \
+		module-device-manager.la \
+		module-device-restore.la \
 		module-stream-restore.la \
 		module-card-restore.la \
 		module-default-device-restore.la \
@@ -1234,8 +1234,8 @@ SYMDEF_FILES = \
 		modules/jack/module-jack-sink-symdef.h \
 		modules/jack/module-jack-source-symdef.h \
 		modules/module-volume-restore-symdef.h \
-    modules/module-device-manager-symdef.h \
-    modules/module-device-restore-symdef.h \
+		modules/module-device-manager-symdef.h \
+		modules/module-device-restore-symdef.h \
 		modules/module-stream-restore-symdef.h \
 		modules/module-card-restore-symdef.h \
 		modules/module-default-device-restore-symdef.h \

commit 0b3b037e222e076e506bbcbdbeae4cd1dad96c40
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Jun 28 13:08:17 2009 +0100

    device-manager: Export device-manager extension functions

diff --git a/src/map-file b/src/map-file
index 95b2803..cec688f 100644
--- a/src/map-file
+++ b/src/map-file
@@ -144,6 +144,12 @@ pa_cvolume_set_fade;
 pa_cvolume_set_position;
 pa_cvolume_snprint;
 pa_cvolume_valid;
+pa_ext_device_manager_delete;
+pa_ext_device_manager_read;
+pa_ext_device_manager_set_subscribe_cb;
+pa_ext_device_manager_subscribe;
+pa_ext_device_manager_test;
+pa_ext_device_manager_write;
 pa_ext_stream_restore_delete;
 pa_ext_stream_restore_read;
 pa_ext_stream_restore_set_subscribe_cb;

commit 70accbbd61ae1205a009a4bfa6ae7514bc0bd940
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Jun 28 13:21:43 2009 +0100

    device-manager: Link native protocol library.

diff --git a/src/Makefile.am b/src/Makefile.am
index 0a041eb..8ed7482 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1546,7 +1546,7 @@ module_cork_music_on_phone_la_CFLAGS = $(AM_CFLAGS)
 # Device description restore module
 module_device_manager_la_SOURCES = modules/module-device-manager.c
 module_device_manager_la_LDFLAGS = $(MODULE_LDFLAGS)
-module_device_manager_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
+module_device_manager_la_LIBADD = $(AM_LIBADD) libprotocol-native.la libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
 module_device_manager_la_CFLAGS = $(AM_CFLAGS)
 
 # Device volume/muted restore module

commit 40e97eb698e0211045818c73d03d55e985f329d5
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Jun 28 14:40:00 2009 +0100

    device-manager: Fix tagstruct description extraction (copy+paste blunder)

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index b41f71c..68ed951 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -429,7 +429,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         entry.version = ENTRY_VERSION;
 
         if (pa_tagstruct_gets(t, &name) < 0 ||
-          pa_tagstruct_gets(reply, &description) < 0)
+          pa_tagstruct_gets(t, &description) < 0)
           goto fail;
 
         if (!name || !*name)

commit 64979385e09ba0a411669f9feeea56c93bf14d38
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Jun 28 15:33:38 2009 +0100

    device-restore: Fix the application of an entry to allow changing the name of devices.
    
    This fixes a few bugs in the copy+pasted implementation of apply_entry()/get_name().

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 68ed951..3ebdd48 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -289,55 +289,47 @@ static pa_hook_result_t source_new_hook_callback(pa_core *c, pa_source_new_data
 }
 
 static char *get_name(const char *key, const char *prefix) {
-  char *t;
+    char *t;
 
-  if (strncmp(key, prefix, sizeof(prefix)))
-    return NULL;
+    if (strncmp(key, prefix, strlen(prefix)))
+        return NULL;
 
-  t = pa_xstrdup(key + sizeof(prefix));
-  return t;
+    t = pa_xstrdup(key + strlen(prefix));
+    return t;
 }
 
 static void apply_entry(struct userdata *u, const char *name, struct entry *e) {
-  pa_sink *sink;
-  pa_source *source;
-  uint32_t idx;
-
-  pa_assert(u);
-  pa_assert(name);
-  pa_assert(e);
-
-  for (sink = pa_idxset_first(u->core->sinks, &idx); sink; sink = pa_idxset_next(u->core->sinks, &idx)) {
+    pa_sink *sink;
+    pa_source *source;
+    uint32_t idx;
     char *n;
 
-    if (!(n = get_name(name, "sink")))
-      continue;
-
-    if (!pa_streq(sink->name, n)) {
-      pa_xfree(n);
-      continue;
-    }
-    pa_xfree(n);
-
-    pa_log_info("Restoring description for sink %s.", sink->name);
-    pa_proplist_sets(sink->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description);
-  }
-
-  for (source = pa_idxset_first(u->core->sources, &idx); source; source = pa_idxset_next(u->core->sources, &idx)) {
-    char *n;
+    pa_assert(u);
+    pa_assert(name);
+    pa_assert(e);
 
-    if (!(n = get_name(name, "source")))
-      continue;
+    if ((n = get_name(name, "sink:"))) {
+        for (sink = pa_idxset_first(u->core->sinks, &idx); sink; sink = pa_idxset_next(u->core->sinks, &idx)) {
+            if (!pa_streq(sink->name, n)) {
+                continue;
+            }
 
-    if (!pa_streq(source->name, n)) {
-      pa_xfree(n);
-      continue;
+            pa_log_info("Setting description for sink %s.", sink->name);
+            pa_sink_set_description(sink, e->description);
+        }
+        pa_xfree(n);
+    }
+    else if ((n = get_name(name, "source:"))) {
+        for (source = pa_idxset_first(u->core->sources, &idx); source; source = pa_idxset_next(u->core->sources, &idx)) {
+            if (!pa_streq(source->name, n)) {
+                continue;
+            }
+
+            pa_log_info("Setting description for source %s.", source->name);
+            pa_source_set_description(source, e->description);
+        }
+        pa_xfree(n);
     }
-    pa_xfree(n);
-
-    pa_log_info("Restoring description for source %s.", source->name);
-    pa_proplist_sets(source->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description);
-  }
 }
 
 #define EXT_VERSION 1

commit 42b30e1aa2a134ccd90486b3dc73d1b13a7636a6
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Mon Jun 29 19:55:34 2009 +0100

    stream-restore: Preventative initialistion to NULL
    
    There is not technically a bug here due to the early return and the knowledge that one of the if blocks
    will definitely be run, but this makes sure we don't call free on uninitialised data or do
    anything else suitibly daft. Also helps when you copy the code and change it slightly and don't realise
    you've left things open...

diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index 9b6f914..b7b36be 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -281,8 +281,8 @@ static pa_bool_t entries_equal(const struct entry *a, const struct entry *b) {
 
 static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
     struct userdata *u = userdata;
-    struct entry entry, *old;
-    char *name;
+    struct entry entry, *old = NULL;
+    char *name = NULL;
     pa_datum key, data;
 
     pa_assert(c);

commit aa5d56ba752490abb9a8a18081196d9de2f6976b
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Mon Jun 29 20:10:04 2009 +0100

    device-manager: Only store and save details for non-monitor sources

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 3ebdd48..77b6f2f 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -168,8 +168,8 @@ static pa_bool_t entries_equal(const struct entry *a, const struct entry *b) {
 
 static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
     struct userdata *u = userdata;
-    struct entry entry, *old;
-    char *name;
+    struct entry entry, *old = NULL;
+    char *name = NULL;
     pa_datum key, data;
 
     pa_assert(c);
@@ -205,6 +205,9 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3
         if (!(source = pa_idxset_get_by_index(c->sources, idx)))
             return;
 
+        if (source->monitor_of)
+            return;
+
         name = pa_sprintf_malloc("source:%s", source->name);
 
         if ((old = read_entry(u, name)))
@@ -251,7 +254,7 @@ static pa_hook_result_t sink_new_hook_callback(pa_core *c, pa_sink_new_data *new
 
     if ((e = read_entry(u, name))) {
         if (strncmp(e->description, pa_proplist_gets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION), sizeof(e->description)) != 0) {
-            pa_log_info("Restoring description for sink %s.", name);
+            pa_log_info("Restoring description for sink %s.", new_data->name);
             pa_proplist_sets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description);
         }
 
@@ -276,7 +279,8 @@ static pa_hook_result_t source_new_hook_callback(pa_core *c, pa_source_new_data
     if ((e = read_entry(u, name))) {
 
         if (strncmp(e->description, pa_proplist_gets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION), sizeof(e->description)) != 0) {
-            pa_log_info("Restoring description for sink %s.", name);
+            /* NB, We cannot detect if we are a monitor here... this could mess things up a bit... */
+            pa_log_info("Restoring description for sink %s.", new_data->name);
             pa_proplist_sets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description);
         }
 
@@ -325,6 +329,11 @@ static void apply_entry(struct userdata *u, const char *name, struct entry *e) {
                 continue;
             }
 
+            if (source->monitor_of) {
+                pa_log_warn("Cowardly refusing to set the description for monitor source %s.", source->name);
+                continue;
+            }
+
             pa_log_info("Setting description for source %s.", source->name);
             pa_source_set_description(source, e->description);
         }

commit 464e1a89868b7c68927d7c95b4ff7d8fe3dbb0f0
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Jul 5 19:40:06 2009 +0100

    device-manager: Fix copy+paste leftover

diff --git a/src/pulse/ext-device-manager.h b/src/pulse/ext-device-manager.h
index eed0c50..422691f 100644
--- a/src/pulse/ext-device-manager.h
+++ b/src/pulse/ext-device-manager.h
@@ -28,7 +28,7 @@
 
 /** \file
  *
- * Routines for controlling module-stream-restore
+ * Routines for controlling module-device-manager
  */
 
 PA_C_DECL_BEGIN

commit 9357bdf4e7c069e29d2fa403a01a892d80d2d89f
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sat Sep 19 15:32:13 2009 +0100

    device-manager: Update docs version -> 0.9.19 (predicted)

diff --git a/src/pulse/ext-device-manager.h b/src/pulse/ext-device-manager.h
index 422691f..33bcbfa 100644
--- a/src/pulse/ext-device-manager.h
+++ b/src/pulse/ext-device-manager.h
@@ -34,38 +34,38 @@
 PA_C_DECL_BEGIN
 
 /** Stores information about one device in the device database that is
- * maintained by module-device-manager. \since 0.9.17 */
+ * maintained by module-device-manager. \since 0.9.19 */
 typedef struct pa_ext_device_manager_info {
     const char *name;            /**< Identifier string of the device. A string like "sink:" or similar followed by the name of the device. */
     const char *description;     /**< The description of the device when it was last seen, if applicable and saved */
 } pa_ext_device_manager_info;
 
-/** Callback prototype for pa_ext_device_manager_test(). \since 0.9.17 */
+/** Callback prototype for pa_ext_device_manager_test(). \since 0.9.19 */
 typedef void (*pa_ext_device_manager_test_cb_t)(
         pa_context *c,
         uint32_t version,
         void *userdata);
 
-/** Test if this extension module is available in the server. \since 0.9.17 */
+/** Test if this extension module is available in the server. \since 0.9.19 */
 pa_operation *pa_ext_device_manager_test(
         pa_context *c,
         pa_ext_device_manager_test_cb_t cb,
         void *userdata);
 
-/** Callback prototype for pa_ext_device_manager_read(). \since 0.9.17 */
+/** Callback prototype for pa_ext_device_manager_read(). \since 0.9.19 */
 typedef void (*pa_ext_device_manager_read_cb_t)(
         pa_context *c,
         const pa_ext_device_manager_info *info,
         int eol,
         void *userdata);
 
-/** Read all entries from the device database. \since 0.9.17 */
+/** Read all entries from the device database. \since 0.9.19 */
 pa_operation *pa_ext_device_manager_read(
         pa_context *c,
         pa_ext_device_manager_read_cb_t cb,
         void *userdata);
 
-/** Store entries in the device database. \since 0.9.17 */
+/** Store entries in the device database. \since 0.9.19 */
 pa_operation *pa_ext_device_manager_write(
         pa_context *c,
         pa_update_mode_t mode,
@@ -75,27 +75,27 @@ pa_operation *pa_ext_device_manager_write(
         pa_context_success_cb_t cb,
         void *userdata);
 
-/** Delete entries from the device database. \since 0.9.17 */
+/** Delete entries from the device database. \since 0.9.19 */
 pa_operation *pa_ext_device_manager_delete(
         pa_context *c,
         const char *const s[],
         pa_context_success_cb_t cb,
         void *userdata);
 
-/** Subscribe to changes in the device database. \since 0.9.17 */
+/** Subscribe to changes in the device database. \since 0.9.19 */
 pa_operation *pa_ext_device_manager_subscribe(
         pa_context *c,
         int enable,
         pa_context_success_cb_t cb,
         void *userdata);
 
-/** Callback prototype for pa_ext_device_manager_set_subscribe_cb(). \since 0.9.17 */
+/** Callback prototype for pa_ext_device_manager_set_subscribe_cb(). \since 0.9.19 */
 typedef void (*pa_ext_device_manager_subscribe_cb_t)(
         pa_context *c,
         void *userdata);
 
 /** Set the subscription callback that is called when
- * pa_ext_device_manager_subscribe() was called. \since 0.9.17 */
+ * pa_ext_device_manager_subscribe() was called. \since 0.9.19 */
 void pa_ext_device_manager_set_subscribe_cb(
         pa_context *c,
         pa_ext_device_manager_subscribe_cb_t cb,

commit 103897a1e33fe83f6ba0b7d521ccc2e36da43881
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sat Sep 19 16:13:25 2009 +0100

    device-manager: Provide a way for clients to enable/disable role-based device-priority routing.
    
    The routing logic itself does not yet exist, but the command currently will unload/load module-stream-restore as approriate.
    (module-stream-restore would conflict with the role-based priority-routing).

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 77b6f2f..5685dbb 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -79,6 +79,10 @@ struct userdata {
 
     pa_native_protocol *protocol;
     pa_idxset *subscribed;
+
+    pa_bool_t role_device_priority_routing;
+    pa_bool_t stream_restore_used;
+    pa_bool_t checked_stream_restore;
 };
 
 #define ENTRY_VERSION 1
@@ -93,6 +97,7 @@ enum {
     SUBCOMMAND_READ,
     SUBCOMMAND_WRITE,
     SUBCOMMAND_DELETE,
+    SUBCOMMAND_ROLE_DEVICE_PRIORITY_ROUTING,
     SUBCOMMAND_SUBSCRIBE,
     SUBCOMMAND_EVENT
 };
@@ -473,6 +478,57 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
 
       break;
 
+    case SUBCOMMAND_ROLE_DEVICE_PRIORITY_ROUTING:
+
+        while (!pa_tagstruct_eof(t)) {
+            pa_bool_t enable;
+            uint32_t sridx = PA_INVALID_INDEX;
+            uint32_t idx;
+            pa_module *module;
+
+            if (pa_tagstruct_get_boolean(t, &enable) < 0)
+                goto fail;
+
+            /* If this is the first run, check for stream restore module */
+            if (!u->checked_stream_restore) {
+                u->checked_stream_restore = TRUE;
+
+                for (module = pa_idxset_first(u->core->modules, &idx); module; module = pa_idxset_next(u->core->modules, &idx)) {
+                    if (strcmp(module->name, "module-stream-restore") == 0) {
+                        pa_log_debug("Detected module-stream-restore is currently in use");
+                        u->stream_restore_used = TRUE;
+                        sridx = module->index;
+                    }
+                }
+            }
+
+            u->role_device_priority_routing = enable;
+            if (enable) {
+                if (u->stream_restore_used) {
+                    if (PA_INVALID_INDEX == sridx) {
+                        /* As a shortcut on first load, we have sridx filled in, but otherwise we search for it. */
+                        for (module = pa_idxset_first(u->core->modules, &idx); module; module = pa_idxset_next(u->core->modules, &idx)) {
+                            if (strcmp(module->name, "module-stream-restore") == 0) {
+                                sridx = module->index;
+                            }
+                        }
+                    }
+                    if (PA_INVALID_INDEX != sridx) {
+                        pa_log_debug("Unloading module-stream-restore to enable role-based device-priority routing");
+                        pa_module_unload_request_by_index(u->core, sridx, TRUE);
+                    }
+                }
+            } else if (u->stream_restore_used) {
+                /* We want to reload module-stream-restore */
+                if (!pa_module_load(u->core, "module-stream-restore", ""))
+                    pa_log_warn("Failed to load module-stream-restore while disabling role-based device-priority routing");
+            }
+        }
+
+        trigger_save(u);
+
+        break;
+
     case SUBCOMMAND_SUBSCRIBE: {
 
       pa_bool_t enabled;
diff --git a/src/pulse/ext-device-manager.c b/src/pulse/ext-device-manager.c
index 1c6eee5..0603a89 100644
--- a/src/pulse/ext-device-manager.c
+++ b/src/pulse/ext-device-manager.c
@@ -41,6 +41,7 @@ enum {
     SUBCOMMAND_READ,
     SUBCOMMAND_WRITE,
     SUBCOMMAND_DELETE,
+    SUBCOMMAND_ROLE_DEVICE_PRIORITY_ROUTING,
     SUBCOMMAND_SUBSCRIBE,
     SUBCOMMAND_EVENT
 };
@@ -289,6 +290,37 @@ fail:
     return NULL;
 }
 
+pa_operation *pa_ext_device_manager_enable_role_device_priority_routing(
+        pa_context *c,
+        int enable,
+        pa_context_success_cb_t cb,
+        void *userdata) {
+
+    uint32_t tag;
+    pa_operation *o = NULL;
+    pa_tagstruct *t = NULL;
+
+    pa_assert(c);
+    pa_assert(PA_REFCNT_VALUE(c) >= 1);
+
+    PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
+    PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
+    PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 14, PA_ERR_NOTSUPPORTED);
+
+    o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
+
+    t = pa_tagstruct_command(c, PA_COMMAND_EXTENSION, &tag);
+    pa_tagstruct_putu32(t, PA_INVALID_INDEX);
+    pa_tagstruct_puts(t, "module-device-manager");
+    pa_tagstruct_putu32(t, SUBCOMMAND_ROLE_DEVICE_PRIORITY_ROUTING);
+    pa_tagstruct_put_boolean(t, !!enable);
+
+    pa_pstream_send_tagstruct(c->pstream, t);
+    pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
+
+    return o;
+}
+
 pa_operation *pa_ext_device_manager_subscribe(
         pa_context *c,
         int enable,
diff --git a/src/pulse/ext-device-manager.h b/src/pulse/ext-device-manager.h
index 33bcbfa..29d56ba 100644
--- a/src/pulse/ext-device-manager.h
+++ b/src/pulse/ext-device-manager.h
@@ -83,6 +83,13 @@ pa_operation *pa_ext_device_manager_delete(
         void *userdata);
 
 /** Subscribe to changes in the device database. \since 0.9.19 */
+pa_operation *pa_ext_device_manager_enable_role_device_priority_routing(
+        pa_context *c,
+        int enable,
+        pa_context_success_cb_t cb,
+        void *userdata);
+
+/** Subscribe to changes in the device database. \since 0.9.19 */
 pa_operation *pa_ext_device_manager_subscribe(
         pa_context *c,
         int enable,

commit 95f28393ab413c797e2f16d2caf1f8caf0283b71
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sat Sep 19 16:46:18 2009 +0100

    device-manager: Fix copy+paste code that looped over the tagstruct when not necessary

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 5685dbb..b3c407c 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -478,56 +478,53 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
 
       break;
 
-    case SUBCOMMAND_ROLE_DEVICE_PRIORITY_ROUTING:
-
-        while (!pa_tagstruct_eof(t)) {
-            pa_bool_t enable;
-            uint32_t sridx = PA_INVALID_INDEX;
-            uint32_t idx;
-            pa_module *module;
-
-            if (pa_tagstruct_get_boolean(t, &enable) < 0)
-                goto fail;
-
-            /* If this is the first run, check for stream restore module */
-            if (!u->checked_stream_restore) {
-                u->checked_stream_restore = TRUE;
-
-                for (module = pa_idxset_first(u->core->modules, &idx); module; module = pa_idxset_next(u->core->modules, &idx)) {
-                    if (strcmp(module->name, "module-stream-restore") == 0) {
-                        pa_log_debug("Detected module-stream-restore is currently in use");
-                        u->stream_restore_used = TRUE;
-                        sridx = module->index;
-                    }
+    case SUBCOMMAND_ROLE_DEVICE_PRIORITY_ROUTING: {
+
+        pa_bool_t enable;
+        uint32_t sridx = PA_INVALID_INDEX;
+        uint32_t idx;
+        pa_module *module;
+
+        if (pa_tagstruct_get_boolean(t, &enable) < 0)
+            goto fail;
+
+        /* If this is the first run, check for stream restore module */
+        if (!u->checked_stream_restore) {
+            u->checked_stream_restore = TRUE;
+
+            for (module = pa_idxset_first(u->core->modules, &idx); module; module = pa_idxset_next(u->core->modules, &idx)) {
+                if (strcmp(module->name, "module-stream-restore") == 0) {
+                    pa_log_debug("Detected module-stream-restore is currently in use");
+                    u->stream_restore_used = TRUE;
+                    sridx = module->index;
                 }
             }
+        }
 
-            u->role_device_priority_routing = enable;
-            if (enable) {
-                if (u->stream_restore_used) {
-                    if (PA_INVALID_INDEX == sridx) {
-                        /* As a shortcut on first load, we have sridx filled in, but otherwise we search for it. */
-                        for (module = pa_idxset_first(u->core->modules, &idx); module; module = pa_idxset_next(u->core->modules, &idx)) {
-                            if (strcmp(module->name, "module-stream-restore") == 0) {
-                                sridx = module->index;
-                            }
+        u->role_device_priority_routing = enable;
+        if (enable) {
+            if (u->stream_restore_used) {
+                if (PA_INVALID_INDEX == sridx) {
+                    /* As a shortcut on first load, we have sridx filled in, but otherwise we search for it. */
+                    for (module = pa_idxset_first(u->core->modules, &idx); module; module = pa_idxset_next(u->core->modules, &idx)) {
+                        if (strcmp(module->name, "module-stream-restore") == 0) {
+                            sridx = module->index;
                         }
                     }
-                    if (PA_INVALID_INDEX != sridx) {
-                        pa_log_debug("Unloading module-stream-restore to enable role-based device-priority routing");
-                        pa_module_unload_request_by_index(u->core, sridx, TRUE);
-                    }
                 }
-            } else if (u->stream_restore_used) {
-                /* We want to reload module-stream-restore */
-                if (!pa_module_load(u->core, "module-stream-restore", ""))
-                    pa_log_warn("Failed to load module-stream-restore while disabling role-based device-priority routing");
+                if (PA_INVALID_INDEX != sridx) {
+                    pa_log_debug("Unloading module-stream-restore to enable role-based device-priority routing");
+                    pa_module_unload_request_by_index(u->core, sridx, TRUE);
+                }
             }
+        } else if (u->stream_restore_used) {
+            /* We want to reload module-stream-restore */
+            if (!pa_module_load(u->core, "module-stream-restore", ""))
+                pa_log_warn("Failed to load module-stream-restore while disabling role-based device-priority routing");
         }
 
-        trigger_save(u);
-
         break;
+    }
 
     case SUBCOMMAND_SUBSCRIBE: {
 

commit aebe4787f293cc6810c54db751bee7df3a5d1ea2
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sat Sep 19 17:48:10 2009 +0100

    device-manager: Provide a method for prefering/defering a device.
    
    This allows clients to edit the priroity order. What is not yet in place is the initialisation of that priority list
    when new devices are detected or the cleaning (remove holes) when devices are removed.
    
    In order to keep the storage transparent I will likely remove the write functionality and replace it with a
    simple rename method.
    
    I also still need to expose the priority itself when reading the data.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index b3c407c..740b98f 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -87,9 +87,23 @@ struct userdata {
 
 #define ENTRY_VERSION 1
 
+#define NUM_ROLES 9
+enum {
+    ROLE_NONE,
+    ROLE_VIDEO,
+    ROLE_MUSIC,
+    ROLE_GAME,
+    ROLE_EVENT,
+    ROLE_PHONE,
+    ROLE_ANIMATION,
+    ROLE_PRODUCTION,
+    ROLE_A11Y,
+};
+
 struct entry {
     uint8_t version;
     char description[PA_NAME_MAX];
+    uint32_t priority[NUM_ROLES];
 } PA_GCC_PACKED;
 
 enum {
@@ -98,6 +112,8 @@ enum {
     SUBCOMMAND_WRITE,
     SUBCOMMAND_DELETE,
     SUBCOMMAND_ROLE_DEVICE_PRIORITY_ROUTING,
+    SUBCOMMAND_PREFER_DEVICE,
+    SUBCOMMAND_DEFER_DEVICE,
     SUBCOMMAND_SUBSCRIBE,
     SUBCOMMAND_EVENT
 };
@@ -346,6 +362,31 @@ static void apply_entry(struct userdata *u, const char *name, struct entry *e) {
     }
 }
 
+
+static uint32_t get_role_index(const char* role) {
+    pa_assert(role);
+
+    if (strcmp(role, "") == 0)
+        return ROLE_NONE;
+    if (strcmp(role, "video") == 0)
+        return ROLE_VIDEO;
+    if (strcmp(role, "music") == 0)
+        return ROLE_MUSIC;
+    if (strcmp(role, "game") == 0)
+        return ROLE_GAME;
+    if (strcmp(role, "event") == 0)
+        return ROLE_EVENT;
+    if (strcmp(role, "phone") == 0)
+        return ROLE_PHONE;
+    if (strcmp(role, "animation") == 0)
+        return ROLE_ANIMATION;
+    if (strcmp(role, "production") == 0)
+        return ROLE_PRODUCTION;
+    if (strcmp(role, "a11y") == 0)
+        return ROLE_A11Y;
+    return PA_INVALID_INDEX;
+}
+
 #define EXT_VERSION 1
 
 static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connection *c, uint32_t tag, pa_tagstruct *t) {
@@ -526,6 +567,113 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         break;
     }
 
+    case SUBCOMMAND_PREFER_DEVICE:
+    case SUBCOMMAND_DEFER_DEVICE: {
+
+        const char *role, *device;
+        struct entry *e;
+        uint32_t role_index;
+
+        if (pa_tagstruct_gets(t, &role) < 0 ||
+            pa_tagstruct_gets(t, &device) < 0)
+            goto fail;
+
+        if (!role || !device || !*device)
+            goto fail;
+
+        role_index = get_role_index(role);
+        if (PA_INVALID_INDEX == role_index)
+            goto fail;
+
+        if ((e = read_entry(u, device)) && ENTRY_VERSION == e->version) {
+            pa_datum key;
+            pa_datum data;
+            pa_bool_t done;
+            char* prefix;
+            uint32_t priority;
+            pa_bool_t haschanged = FALSE;
+
+            if (strncmp(device, "sink:", 5) == 0)
+                prefix = pa_xstrdup("sink:");
+            else
+                prefix = pa_xstrdup("source:");
+
+            priority = e->priority[role_index];
+
+            /* Now we need to load up all the other entries of this type and shuffle the priroities around */
+
+            done = !pa_database_first(u->database, &key, NULL);
+
+            while (!done && !haschanged) {
+                pa_datum next_key;
+
+                done = !pa_database_next(u->database, &key, &next_key, NULL);
+
+                /* Only read devices with the right prefix */
+                if (key.size > strlen(prefix) && strncmp(key.data, prefix, strlen(prefix)) == 0) {
+                    char *name;
+                    struct entry *e2;
+
+                    name = pa_xstrndup(key.data, key.size);
+                    pa_datum_free(&key);
+
+                    if ((e2 = read_entry(u, name))) {
+                        if (SUBCOMMAND_PREFER_DEVICE == command) {
+                            /* PREFER */
+                            if (e2->priority[role_index] == (priority - 1)) {
+                                e2->priority[role_index]++;
+                                haschanged = TRUE;
+                            }
+                        } else {
+                            /* DEFER */
+                            if (e2->priority[role_index] == (priority + 1)) {
+                                e2->priority[role_index]--;
+                                haschanged = TRUE;
+                            }
+                        }
+
+                        if (haschanged) {
+                            data.data = e2;
+                            data.size = sizeof(*e2);
+
+                            if (pa_database_set(u->database, &key, &data, FALSE))
+                                pa_log_warn("Could not save device");
+                        }
+                        pa_xfree(e2);
+                    }
+
+                    pa_xfree(name);
+                }
+
+                key = next_key;
+            }
+
+            /* Now write out our actual entry */
+            if (haschanged) {
+                if (SUBCOMMAND_PREFER_DEVICE == command)
+                    e->priority[role_index]--;
+                else
+                    e->priority[role_index]++;
+
+                key.data = (char *) device;
+                key.size = strlen(device);
+
+                data.data = e;
+                data.size = sizeof(*e);
+
+                if (pa_database_set(u->database, &key, &data, FALSE))
+                    pa_log_warn("Could not save device");
+
+                trigger_save(u);
+            }
+
+            pa_xfree(e);
+
+            pa_xfree(prefix);
+        }
+        break;
+    }
+
     case SUBCOMMAND_SUBSCRIBE: {
 
       pa_bool_t enabled;
diff --git a/src/pulse/ext-device-manager.c b/src/pulse/ext-device-manager.c
index 0603a89..a634e21 100644
--- a/src/pulse/ext-device-manager.c
+++ b/src/pulse/ext-device-manager.c
@@ -42,6 +42,8 @@ enum {
     SUBCOMMAND_WRITE,
     SUBCOMMAND_DELETE,
     SUBCOMMAND_ROLE_DEVICE_PRIORITY_ROUTING,
+    SUBCOMMAND_PREFER_DEVICE,
+    SUBCOMMAND_DEFER_DEVICE,
     SUBCOMMAND_SUBSCRIBE,
     SUBCOMMAND_EVENT
 };
@@ -321,6 +323,78 @@ pa_operation *pa_ext_device_manager_enable_role_device_priority_routing(
     return o;
 }
 
+pa_operation *pa_ext_device_manager_prefer_device(
+        pa_context *c,
+        const char* role,
+        const char* device,
+        pa_context_success_cb_t cb,
+        void *userdata) {
+
+    uint32_t tag;
+    pa_operation *o = NULL;
+    pa_tagstruct *t = NULL;
+
+    pa_assert(c);
+    pa_assert(PA_REFCNT_VALUE(c) >= 1);
+
+    PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
+    PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
+    PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 14, PA_ERR_NOTSUPPORTED);
+
+    pa_assert(role);
+    pa_assert(device);
+
+    o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
+
+    t = pa_tagstruct_command(c, PA_COMMAND_EXTENSION, &tag);
+    pa_tagstruct_putu32(t, PA_INVALID_INDEX);
+    pa_tagstruct_puts(t, "module-device-manager");
+    pa_tagstruct_putu32(t, SUBCOMMAND_PREFER_DEVICE);
+    pa_tagstruct_puts(t, role);
+    pa_tagstruct_puts(t, device);
+
+    pa_pstream_send_tagstruct(c->pstream, t);
+    pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
+
+    return o;
+}
+
+pa_operation *pa_ext_device_manager_defer_device(
+        pa_context *c,
+        const char* role,
+        const char* device,
+        pa_context_success_cb_t cb,
+        void *userdata) {
+
+    uint32_t tag;
+    pa_operation *o = NULL;
+    pa_tagstruct *t = NULL;
+
+    pa_assert(c);
+    pa_assert(PA_REFCNT_VALUE(c) >= 1);
+
+    PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
+    PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
+    PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 14, PA_ERR_NOTSUPPORTED);
+
+    pa_assert(role);
+    pa_assert(device);
+
+    o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
+
+    t = pa_tagstruct_command(c, PA_COMMAND_EXTENSION, &tag);
+    pa_tagstruct_putu32(t, PA_INVALID_INDEX);
+    pa_tagstruct_puts(t, "module-device-manager");
+    pa_tagstruct_putu32(t, SUBCOMMAND_DEFER_DEVICE);
+    pa_tagstruct_puts(t, role);
+    pa_tagstruct_puts(t, device);
+
+    pa_pstream_send_tagstruct(c->pstream, t);
+    pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
+
+    return o;
+}
+
 pa_operation *pa_ext_device_manager_subscribe(
         pa_context *c,
         int enable,
diff --git a/src/pulse/ext-device-manager.h b/src/pulse/ext-device-manager.h
index 29d56ba..d6de132 100644
--- a/src/pulse/ext-device-manager.h
+++ b/src/pulse/ext-device-manager.h
@@ -90,6 +90,22 @@ pa_operation *pa_ext_device_manager_enable_role_device_priority_routing(
         void *userdata);
 
 /** Subscribe to changes in the device database. \since 0.9.19 */
+pa_operation *pa_ext_device_manager_prefer_device(
+        pa_context *c,
+        const char* role,
+        const char* device,
+        pa_context_success_cb_t cb,
+        void *userdata);
+
+/** Subscribe to changes in the device database. \since 0.9.19 */
+pa_operation *pa_ext_device_manager_defer_device(
+        pa_context *c,
+        const char* role,
+        const char* device,
+        pa_context_success_cb_t cb,
+        void *userdata);
+
+/** Subscribe to changes in the device database. \since 0.9.19 */
 pa_operation *pa_ext_device_manager_subscribe(
         pa_context *c,
         int enable,

commit f8ec8f382ff1e9a05296b5a656195d44e8d05b44
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 12:44:02 2009 +0100

    device-manager: Change the write function to a rename function.
    
    The structure itself will contain various bits of info so exposing this fully to the client is a bad idea.
    By keeping to a rename operation we keep what we do store abstracted from the clients.
    
    Also fix some doxy comments.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 740b98f..0a0c39d 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -109,7 +109,7 @@ struct entry {
 enum {
     SUBCOMMAND_TEST,
     SUBCOMMAND_READ,
-    SUBCOMMAND_WRITE,
+    SUBCOMMAND_RENAME,
     SUBCOMMAND_DELETE,
     SUBCOMMAND_ROLE_DEVICE_PRIORITY_ROUTING,
     SUBCOMMAND_PREFER_DEVICE,
@@ -451,51 +451,41 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
       break;
     }
 
-    case SUBCOMMAND_WRITE: {
-      uint32_t mode;
-      pa_bool_t apply_immediately = FALSE;
+    case SUBCOMMAND_RENAME: {
 
-      if (pa_tagstruct_getu32(t, &mode) < 0 ||
-        pa_tagstruct_get_boolean(t, &apply_immediately) < 0)
-        goto fail;
-
-      if (mode != PA_UPDATE_MERGE &&
-        mode != PA_UPDATE_REPLACE &&
-        mode != PA_UPDATE_SET)
-        goto fail;
-
-      if (mode == PA_UPDATE_SET)
-        pa_database_clear(u->database);
-
-      while (!pa_tagstruct_eof(t)) {
-        const char *name, *description;
-        struct entry entry;
-        pa_datum key, data;
-
-        pa_zero(entry);
-        entry.version = ENTRY_VERSION;
+        struct entry *e;
+        const char *device, *description;
 
-        if (pa_tagstruct_gets(t, &name) < 0 ||
+        if (pa_tagstruct_gets(t, &device) < 0 ||
           pa_tagstruct_gets(t, &description) < 0)
           goto fail;
 
-        if (!name || !*name)
+        if (!device || !*device || !description || !*description)
           goto fail;
 
-        pa_strlcpy(entry.description, description, sizeof(entry.description));
+        if ((e = read_entry(u, device)) && ENTRY_VERSION == e->version) {
+            pa_datum key, data;
 
-        key.data = (char*) name;
-        key.size = strlen(name);
+            pa_strlcpy(e->description, description, sizeof(e->description));
 
-        data.data = &entry;
-        data.size = sizeof(entry);
+            key.data = (char *) device;
+            key.size = strlen(device);
 
-        if (pa_database_set(u->database, &key, &data, mode == PA_UPDATE_REPLACE) == 0)
-          if (apply_immediately)
-            apply_entry(u, name, &entry);
-      }
+            data.data = e;
+            data.size = sizeof(*e);
 
-      trigger_save(u);
+            if (pa_database_set(u->database, &key, &data, FALSE) == 0) {
+                apply_entry(u, device, e);
+
+                trigger_save(u);
+            }
+            else
+                pa_log_warn("Could not save device");
+
+            pa_xfree(e);
+        }
+        else
+            pa_log_warn("Could not rename device %s, no entry in database", device);
 
       break;
     }
@@ -671,6 +661,9 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
 
             pa_xfree(prefix);
         }
+        else
+            pa_log_warn("Could not reorder device %s, no entry in database", device);
+
         break;
     }
 
diff --git a/src/pulse/ext-device-manager.c b/src/pulse/ext-device-manager.c
index a634e21..bc6301c 100644
--- a/src/pulse/ext-device-manager.c
+++ b/src/pulse/ext-device-manager.c
@@ -39,7 +39,7 @@
 enum {
     SUBCOMMAND_TEST,
     SUBCOMMAND_READ,
-    SUBCOMMAND_WRITE,
+    SUBCOMMAND_RENAME,
     SUBCOMMAND_DELETE,
     SUBCOMMAND_ROLE_DEVICE_PRIORITY_ROUTING,
     SUBCOMMAND_PREFER_DEVICE,
@@ -183,12 +183,10 @@ pa_operation *pa_ext_device_manager_read(
     return o;
 }
 
-pa_operation *pa_ext_device_manager_write(
+pa_operation *pa_ext_device_manager_set_device_description(
         pa_context *c,
-        pa_update_mode_t mode,
-        const pa_ext_device_manager_info data[],
-        unsigned n,
-        int apply_immediately,
+        const char* device,
+        const char* description,
         pa_context_success_cb_t cb,
         void *userdata) {
 
@@ -198,8 +196,8 @@ pa_operation *pa_ext_device_manager_write(
 
     pa_assert(c);
     pa_assert(PA_REFCNT_VALUE(c) >= 1);
-    pa_assert(mode == PA_UPDATE_MERGE || mode == PA_UPDATE_REPLACE || mode == PA_UPDATE_SET);
-    pa_assert(data);
+    pa_assert(device);
+    pa_assert(description);
 
     PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
     PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
@@ -210,35 +208,15 @@ pa_operation *pa_ext_device_manager_write(
     t = pa_tagstruct_command(c, PA_COMMAND_EXTENSION, &tag);
     pa_tagstruct_putu32(t, PA_INVALID_INDEX);
     pa_tagstruct_puts(t, "module-device-manager");
-    pa_tagstruct_putu32(t, SUBCOMMAND_WRITE);
-
-    pa_tagstruct_putu32(t, mode);
-    pa_tagstruct_put_boolean(t, apply_immediately);
-
-    for (; n > 0; n--, data++) {
-        if (!data->name || !*data->name)
-            goto fail;
+    pa_tagstruct_putu32(t, SUBCOMMAND_RENAME);
 
-        pa_tagstruct_puts(t, data->name);
-        pa_tagstruct_puts(t, data->description);
-    }
+    pa_tagstruct_puts(t, device);
+    pa_tagstruct_puts(t, description);
 
     pa_pstream_send_tagstruct(c->pstream, t);
     pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
 
     return o;
-
-fail:
-    if (o) {
-        pa_operation_cancel(o);
-        pa_operation_unref(o);
-    }
-
-    if (t)
-        pa_tagstruct_free(t);
-
-    pa_context_set_error(c, PA_ERR_INVALID);
-    return NULL;
 }
 
 pa_operation *pa_ext_device_manager_delete(
diff --git a/src/pulse/ext-device-manager.h b/src/pulse/ext-device-manager.h
index d6de132..686c8d2 100644
--- a/src/pulse/ext-device-manager.h
+++ b/src/pulse/ext-device-manager.h
@@ -65,13 +65,11 @@ pa_operation *pa_ext_device_manager_read(
         pa_ext_device_manager_read_cb_t cb,
         void *userdata);
 
-/** Store entries in the device database. \since 0.9.19 */
-pa_operation *pa_ext_device_manager_write(
+/** Sets the description for a device. \since 0.9.19 */
+pa_operation *pa_ext_device_manager_set_device_description(
         pa_context *c,
-        pa_update_mode_t mode,
-        const pa_ext_device_manager_info data[],
-        unsigned n,
-        int apply_immediately,
+        const char* device,
+        const char* description,
         pa_context_success_cb_t cb,
         void *userdata);
 
@@ -82,14 +80,14 @@ pa_operation *pa_ext_device_manager_delete(
         pa_context_success_cb_t cb,
         void *userdata);
 
-/** Subscribe to changes in the device database. \since 0.9.19 */
+/** Enable the role-based device-priority routing mode. \since 0.9.19 */
 pa_operation *pa_ext_device_manager_enable_role_device_priority_routing(
         pa_context *c,
         int enable,
         pa_context_success_cb_t cb,
         void *userdata);
 
-/** Subscribe to changes in the device database. \since 0.9.19 */
+/** Prefer a given device in the priority list. \since 0.9.19 */
 pa_operation *pa_ext_device_manager_prefer_device(
         pa_context *c,
         const char* role,
@@ -97,7 +95,7 @@ pa_operation *pa_ext_device_manager_prefer_device(
         pa_context_success_cb_t cb,
         void *userdata);
 
-/** Subscribe to changes in the device database. \since 0.9.19 */
+/** Defer a given device in the priority list. \since 0.9.19 */
 pa_operation *pa_ext_device_manager_defer_device(
         pa_context *c,
         const char* role,

commit a64f0f719ff4154cbd3d8f78dbb41c8e816eb672
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 13:57:10 2009 +0100

    device-manager: Let subscribed clients know when something changes.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 0a0c39d..59aedd6 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -174,6 +174,22 @@ fail:
 }
 
 static void trigger_save(struct userdata *u) {
+    pa_native_connection *c;
+    uint32_t idx;
+
+    for (c = pa_idxset_first(u->subscribed, &idx); c; c = pa_idxset_next(u->subscribed, &idx)) {
+        pa_tagstruct *t;
+
+        t = pa_tagstruct_new(NULL, 0);
+        pa_tagstruct_putu32(t, PA_COMMAND_EXTENSION);
+        pa_tagstruct_putu32(t, 0);
+        pa_tagstruct_putu32(t, u->module->index);
+        pa_tagstruct_puts(t, u->module->name);
+        pa_tagstruct_putu32(t, SUBCOMMAND_EVENT);
+
+        pa_pstream_send_tagstruct(pa_native_connection_get_pstream(c), t);
+    }
+
     if (u->save_time_event)
         return;
 

commit 180250096765ccbabfd4194b186c2d00110df70d
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 14:36:20 2009 +0100

    device-manager: When a new device is encountered, initialise the priority list to an appropriate value

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 59aedd6..f759e34 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -203,6 +203,60 @@ static pa_bool_t entries_equal(const struct entry *a, const struct entry *b) {
     return TRUE;
 }
 
+static inline struct entry *load_or_initialize_entry(struct userdata *u, struct entry *entry, const char *name, const char *prefix) {
+    struct entry *old;
+
+    pa_assert(u);
+    pa_assert(entry);
+    pa_assert(name);
+    pa_assert(prefix);
+
+    if ((old = read_entry(u, name)))
+        *entry = *old;
+    else {
+        /* This is a new device, so make sure we write it's priority list correctly */
+        uint32_t max_priority[NUM_ROLES];
+        pa_datum key;
+        pa_bool_t done;
+
+        pa_zero(max_priority);
+        done = !pa_database_first(u->database, &key, NULL);
+
+        /* Find all existing devices with the same prefix so we calculate the current max priority for each role */
+        while (!done) {
+            pa_datum next_key;
+
+            done = !pa_database_next(u->database, &key, &next_key, NULL);
+
+            if (key.size > strlen(prefix) && strncmp(key.data, prefix, strlen(prefix)) == 0) {
+                char *name2;
+                struct entry *e;
+
+                name2 = pa_xstrndup(key.data, key.size);
+
+                if ((e = read_entry(u, name2))) {
+                    for (uint32_t i = 0; i < NUM_ROLES; ++i) {
+                        max_priority[i] = PA_MAX(max_priority[i], e->priority[i]);
+                    }
+
+                    pa_xfree(e);
+                }
+
+                pa_xfree(name2);
+            }
+            pa_datum_free(&key);
+            key = next_key;
+        }
+
+        /* Actually initialise our entry now we've calculated it */
+        for (uint32_t i = 0; i < NUM_ROLES; ++i) {
+            entry->priority[i] = max_priority[i] + 1;
+        }
+    }
+
+    return old;
+}
+
 static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
     struct userdata *u = userdata;
     struct entry entry, *old = NULL;
@@ -229,8 +283,7 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3
 
         name = pa_sprintf_malloc("sink:%s", sink->name);
 
-        if ((old = read_entry(u, name)))
-            entry = *old;
+        old = load_or_initialize_entry(u, &entry, name, "sink:");
 
         pa_strlcpy(entry.description, pa_strnull(pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description));
 
@@ -247,8 +300,7 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3
 
         name = pa_sprintf_malloc("source:%s", source->name);
 
-        if ((old = read_entry(u, name)))
-            entry = *old;
+        old = load_or_initialize_entry(u, &entry, name, "source:");
 
         pa_strlcpy(entry.description, pa_strnull(pa_proplist_gets(source->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description));
     }

commit e589f38e227a53e1ed57491528c1290ddf8c1da7
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 14:39:41 2009 +0100

    device-manager: Fix the freeing of the datum on prefer/defer.
    
    Also fix a log typo

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index f759e34..75059f7 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -366,10 +366,9 @@ static pa_hook_result_t source_new_hook_callback(pa_core *c, pa_source_new_data
     name = pa_sprintf_malloc("source:%s", new_data->name);
 
     if ((e = read_entry(u, name))) {
-
         if (strncmp(e->description, pa_proplist_gets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION), sizeof(e->description)) != 0) {
             /* NB, We cannot detect if we are a monitor here... this could mess things up a bit... */
-            pa_log_info("Restoring description for sink %s.", new_data->name);
+            pa_log_info("Restoring description for source %s.", new_data->name);
             pa_proplist_sets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description);
         }
 
@@ -644,8 +643,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
             goto fail;
 
         if ((e = read_entry(u, device)) && ENTRY_VERSION == e->version) {
-            pa_datum key;
-            pa_datum data;
+            pa_datum key, data;
             pa_bool_t done;
             char* prefix;
             uint32_t priority;
@@ -673,7 +671,6 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
                     struct entry *e2;
 
                     name = pa_xstrndup(key.data, key.size);
-                    pa_datum_free(&key);
 
                     if ((e2 = read_entry(u, name))) {
                         if (SUBCOMMAND_PREFER_DEVICE == command) {
@@ -697,12 +694,14 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
                             if (pa_database_set(u->database, &key, &data, FALSE))
                                 pa_log_warn("Could not save device");
                         }
+
                         pa_xfree(e2);
                     }
 
                     pa_xfree(name);
                 }
 
+                pa_datum_free(&key);
                 key = next_key;
             }
 

commit faae33d808480a34f02bea6e66ba0da0523694cf
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 14:43:53 2009 +0100

    device-manager: debug and comments

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 75059f7..e029c1d 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -322,7 +322,7 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3
     data.data = &entry;
     data.size = sizeof(entry);
 
-    pa_log_info("Storing device description for %s.", name);
+    pa_log_info("Storing device %s.", name);
 
     pa_database_set(u->database, &key, &data, TRUE);
 
@@ -569,6 +569,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         key.data = (char*) name;
         key.size = strlen(name);
 
+        /** @todo: Reindex the priorities */
         pa_database_unset(u->database, &key);
       }
 

commit ed8af7c8fd7bf845a243518357b6b73667d209c0
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 17:29:38 2009 +0100

    device-manager: Rough framework (slots etc.) for handling routing.
    
    This is incomplete, it just adds the slots in question and assigns noops to them.
    Some minor cleanup of types.
    
    Due to the priority of the hooks, it seems we can actually coexist with module-stream restore so
    the code to detect and unload it will be removed shortly.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index e029c1d..4c4e3f0 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -58,11 +58,15 @@ PA_MODULE_AUTHOR("Colin Guthrie");
 PA_MODULE_DESCRIPTION("Keep track of devices (and their descriptions) both past and present");
 PA_MODULE_VERSION(PACKAGE_VERSION);
 PA_MODULE_LOAD_ONCE(TRUE);
-PA_MODULE_USAGE("This module does not take any arguments");
+PA_MODULE_USAGE(
+    "on_hotplug=<When new device becomes available, recheck streams?> "
+    "on_rescue=<When device becomes unavailable, recheck streams?>");
 
 #define SAVE_INTERVAL (10 * PA_USEC_PER_SEC)
 
 static const char* const valid_modargs[] = {
+    "on_hotplug",
+    "on_rescue",
     NULL
 };
 
@@ -73,6 +77,12 @@ struct userdata {
     pa_hook_slot
         *sink_new_hook_slot,
         *source_new_hook_slot,
+        *sink_input_new_hook_slot,
+        *source_output_new_hook_slot,
+        *sink_put_hook_slot,
+        *source_put_hook_slot,
+        *sink_unlink_hook_slot,
+        *source_unlink_hook_slot,
         *connection_unlink_hook_slot;
     pa_time_event *save_time_event;
     pa_database *database;
@@ -80,6 +90,8 @@ struct userdata {
     pa_native_protocol *protocol;
     pa_idxset *subscribed;
 
+    pa_bool_t on_hotplug;
+    pa_bool_t on_rescue;
     pa_bool_t role_device_priority_routing;
     pa_bool_t stream_restore_used;
     pa_bool_t checked_stream_restore;
@@ -100,10 +112,12 @@ enum {
     ROLE_A11Y,
 };
 
+typedef uint32_t role_indexes_t[NUM_ROLES];
+
 struct entry {
     uint8_t version;
     char description[PA_NAME_MAX];
-    uint32_t priority[NUM_ROLES];
+    role_indexes_t priority;
 } PA_GCC_PACKED;
 
 enum {
@@ -215,7 +229,7 @@ static inline struct entry *load_or_initialize_entry(struct userdata *u, struct
         *entry = *old;
     else {
         /* This is a new device, so make sure we write it's priority list correctly */
-        uint32_t max_priority[NUM_ROLES];
+        role_indexes_t max_priority;
         pa_datum key;
         pa_bool_t done;
 
@@ -390,6 +404,138 @@ static char *get_name(const char *key, const char *prefix) {
     return t;
 }
 
+static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_new_data *new_data, struct userdata *u) {
+    char *name;
+    struct entry *e;
+
+    pa_assert(c);
+    pa_assert(new_data);
+    pa_assert(u);
+
+    if (!u->role_device_priority_routing)
+        return PA_HOOK_OK;
+
+    /*if (!(name = get_name(new_data->proplist, "sink-input")))
+        return PA_HOOK_OK;
+
+    if (new_data->sink)
+        pa_log_debug("Not restoring device for stream %s, because already set.", name);
+    else if ((e = read_entry(u, name))) {
+
+        pa_xfree(e);
+    }
+
+    pa_xfree(name);*/
+
+    return PA_HOOK_OK;
+}
+
+static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_output_new_data *new_data, struct userdata *u) {
+    char *name;
+    struct entry *e;
+
+    pa_assert(c);
+    pa_assert(new_data);
+    pa_assert(u);
+
+    if (!u->role_device_priority_routing)
+        return PA_HOOK_OK;
+
+    if (new_data->direct_on_input)
+        return PA_HOOK_OK;
+
+    /*if (!(name = get_name(new_data->proplist, "source-output")))
+        return PA_HOOK_OK;
+
+    if (new_data->source)
+        pa_log_debug("Not restoring device for stream %s, because already set", name);
+    else if ((e = read_entry(u, name))) {
+
+        pa_xfree(e);
+    }
+
+    pa_xfree(name);*/
+
+    return PA_HOOK_OK;
+}
+
+static pa_hook_result_t sink_put_hook_callback(pa_core *c, pa_sink *sink, struct userdata *u) {
+    pa_sink_input *si;
+    uint32_t idx;
+
+    pa_assert(c);
+    pa_assert(sink);
+    pa_assert(u);
+    pa_assert(u->on_hotplug);
+
+    if (!u->role_device_priority_routing)
+        return PA_HOOK_OK;
+
+    /** @todo Ensure redo the routing based on the priorities */
+
+    return PA_HOOK_OK;
+}
+
+static pa_hook_result_t source_put_hook_callback(pa_core *c, pa_source *source, struct userdata *u) {
+    pa_source_output *so;
+    uint32_t idx;
+
+    pa_assert(c);
+    pa_assert(source);
+    pa_assert(u);
+    pa_assert(u->on_hotplug);
+
+    if (!u->role_device_priority_routing)
+        return PA_HOOK_OK;
+
+    /** @todo Ensure redo the routing based on the priorities */
+
+    return PA_HOOK_OK;
+}
+
+static pa_hook_result_t sink_unlink_hook_callback(pa_core *c, pa_sink *sink, struct userdata *u) {
+    pa_sink_input *si;
+    uint32_t idx;
+
+    pa_assert(c);
+    pa_assert(sink);
+    pa_assert(u);
+    pa_assert(u->on_rescue);
+
+    /* There's no point in doing anything if the core is shut down anyway */
+    if (c->state == PA_CORE_SHUTDOWN)
+        return PA_HOOK_OK;
+
+    if (!u->role_device_priority_routing)
+        return PA_HOOK_OK;
+
+    /** @todo Ensure redo the routing based on the priorities */
+
+    return PA_HOOK_OK;
+}
+
+static pa_hook_result_t source_unlink_hook_callback(pa_core *c, pa_source *source, struct userdata *u) {
+    pa_source_output *so;
+    uint32_t idx;
+
+    pa_assert(c);
+    pa_assert(source);
+    pa_assert(u);
+    pa_assert(u->on_rescue);
+
+    /* There's no point in doing anything if the core is shut down anyway */
+    if (c->state == PA_CORE_SHUTDOWN)
+        return PA_HOOK_OK;
+
+    if (!u->role_device_priority_routing)
+        return PA_HOOK_OK;
+
+    /** @todo Ensure redo the routing based on the priorities */
+
+    return PA_HOOK_OK;
+}
+
+
 static void apply_entry(struct userdata *u, const char *name, struct entry *e) {
     pa_sink *sink;
     pa_source *source;
@@ -781,7 +927,10 @@ int pa__init(pa_module*m) {
     char *fname;
     pa_sink *sink;
     pa_source *source;
+    pa_sink_input *si;
+    pa_source_output *so;
     uint32_t idx;
+    pa_bool_t on_hotplug = TRUE, on_rescue = TRUE;
 
     pa_assert(m);
 
@@ -790,9 +939,17 @@ int pa__init(pa_module*m) {
         goto fail;
     }
 
+    if (pa_modargs_get_value_boolean(ma, "on_hotplug", &on_hotplug) < 0 ||
+        pa_modargs_get_value_boolean(ma, "on_rescue", &on_rescue) < 0) {
+        pa_log("on_hotplug= and on_rescue= expect boolean arguments");
+        goto fail;
+    }
+
     m->userdata = u = pa_xnew0(struct userdata, 1);
     u->core = m->core;
     u->module = m;
+    u->on_hotplug = on_hotplug;
+    u->on_rescue = on_rescue;
     u->subscribed = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
 
     u->protocol = pa_native_protocol_get(m->core);
@@ -802,9 +959,27 @@ int pa__init(pa_module*m) {
 
     u->subscription = pa_subscription_new(m->core, PA_SUBSCRIPTION_MASK_SINK|PA_SUBSCRIPTION_MASK_SOURCE, subscribe_callback, u);
 
+    /* Used to handle device description management */
     u->sink_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_NEW], PA_HOOK_EARLY, (pa_hook_cb_t) sink_new_hook_callback, u);
     u->source_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_NEW], PA_HOOK_EARLY, (pa_hook_cb_t) source_new_hook_callback, u);
 
+    /* The following slots are used to deal with routing */
+    /* A little bit later than module-stream-restore, module-intended-roles */
+    u->sink_input_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_NEW], PA_HOOK_EARLY+15, (pa_hook_cb_t) sink_input_new_hook_callback, u);
+    u->source_output_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_NEW], PA_HOOK_EARLY+15, (pa_hook_cb_t) source_output_new_hook_callback, u);
+
+    if (on_hotplug) {
+        /* A little bit later than module-stream-restore, module-intended-roles */
+        u->sink_put_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_LATE+15, (pa_hook_cb_t) sink_put_hook_callback, u);
+        u->source_put_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_PUT], PA_HOOK_LATE+15, (pa_hook_cb_t) source_put_hook_callback, u);
+    }
+
+    if (on_rescue) {
+        /* A little bit later than module-stream-restore, module-intended-roles, a little bit earlier than module-rescue-streams, ... */
+        u->sink_unlink_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_UNLINK], PA_HOOK_LATE+15, (pa_hook_cb_t) sink_unlink_hook_callback, u);
+        u->source_unlink_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_UNLINK], PA_HOOK_LATE+15, (pa_hook_cb_t) source_unlink_hook_callback, u);
+    }
+
     if (!(fname = pa_state_path("device-manager", TRUE)))
         goto fail;
 
@@ -817,12 +992,18 @@ int pa__init(pa_module*m) {
     pa_log_info("Sucessfully opened database file '%s'.", fname);
     pa_xfree(fname);
 
-    for (sink = pa_idxset_first(m->core->sinks, &idx); sink; sink = pa_idxset_next(m->core->sinks, &idx))
+    PA_IDXSET_FOREACH(sink, m->core->sinks, idx)
         subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_NEW, sink->index, u);
 
-    for (source = pa_idxset_first(m->core->sources, &idx); source; source = pa_idxset_next(m->core->sources, &idx))
+    PA_IDXSET_FOREACH(source, m->core->sources, idx)
         subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_NEW, source->index, u);
 
+    PA_IDXSET_FOREACH(si, m->core->sink_inputs, idx)
+        subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_NEW, si->index, u);
+
+    PA_IDXSET_FOREACH(so, m->core->source_outputs, idx)
+        subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_NEW, so->index, u);
+
     pa_modargs_free(ma);
     return 0;
 
@@ -851,6 +1032,21 @@ void pa__done(pa_module*m) {
     if (u->source_new_hook_slot)
         pa_hook_slot_free(u->source_new_hook_slot);
 
+    if (u->sink_input_new_hook_slot)
+        pa_hook_slot_free(u->sink_input_new_hook_slot);
+    if (u->source_output_new_hook_slot)
+        pa_hook_slot_free(u->source_output_new_hook_slot);
+
+    if (u->sink_put_hook_slot)
+        pa_hook_slot_free(u->sink_put_hook_slot);
+    if (u->source_put_hook_slot)
+        pa_hook_slot_free(u->source_put_hook_slot);
+
+    if (u->sink_unlink_hook_slot)
+        pa_hook_slot_free(u->sink_unlink_hook_slot);
+    if (u->source_unlink_hook_slot)
+        pa_hook_slot_free(u->source_unlink_hook_slot);
+
     if (u->save_time_event)
         u->core->mainloop->time_free(u->save_time_event);
 

commit ca68105c8f9920fa18016b24e26ba9365d8f94b6
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 17:33:18 2009 +0100

    device-manager: Remove unneeded logic for checking for and (un)loading module-stream-restore. We can co-exist

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 4c4e3f0..38b4c02 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -93,8 +93,6 @@ struct userdata {
     pa_bool_t on_hotplug;
     pa_bool_t on_rescue;
     pa_bool_t role_device_priority_routing;
-    pa_bool_t stream_restore_used;
-    pa_bool_t checked_stream_restore;
 };
 
 #define ENTRY_VERSION 1
@@ -733,40 +731,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         if (pa_tagstruct_get_boolean(t, &enable) < 0)
             goto fail;
 
-        /* If this is the first run, check for stream restore module */
-        if (!u->checked_stream_restore) {
-            u->checked_stream_restore = TRUE;
-
-            for (module = pa_idxset_first(u->core->modules, &idx); module; module = pa_idxset_next(u->core->modules, &idx)) {
-                if (strcmp(module->name, "module-stream-restore") == 0) {
-                    pa_log_debug("Detected module-stream-restore is currently in use");
-                    u->stream_restore_used = TRUE;
-                    sridx = module->index;
-                }
-            }
-        }
-
         u->role_device_priority_routing = enable;
-        if (enable) {
-            if (u->stream_restore_used) {
-                if (PA_INVALID_INDEX == sridx) {
-                    /* As a shortcut on first load, we have sridx filled in, but otherwise we search for it. */
-                    for (module = pa_idxset_first(u->core->modules, &idx); module; module = pa_idxset_next(u->core->modules, &idx)) {
-                        if (strcmp(module->name, "module-stream-restore") == 0) {
-                            sridx = module->index;
-                        }
-                    }
-                }
-                if (PA_INVALID_INDEX != sridx) {
-                    pa_log_debug("Unloading module-stream-restore to enable role-based device-priority routing");
-                    pa_module_unload_request_by_index(u->core, sridx, TRUE);
-                }
-            }
-        } else if (u->stream_restore_used) {
-            /* We want to reload module-stream-restore */
-            if (!pa_module_load(u->core, "module-stream-restore", ""))
-                pa_log_warn("Failed to load module-stream-restore while disabling role-based device-priority routing");
-        }
 
         break;
     }

commit 678d8e963d7a9ce4ecd27f38ba49112b6b7663d4
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 17:34:17 2009 +0100

    device-manager: Add a function to get a list of the highest priority device indexes for each role.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 38b4c02..f4d00b5 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -402,6 +402,87 @@ static char *get_name(const char *key, const char *prefix) {
     return t;
 }
 
+static role_indexes_t *get_highest_priority_device_indexes(struct userdata *u, const char *prefix) {
+    role_indexes_t *indexes, highest_priority_available;
+    pa_datum key;
+    pa_bool_t done;
+
+    pa_assert(u);
+    pa_assert(prefix);
+
+    indexes = pa_xnew(role_indexes_t, 1);
+    for (uint32_t i = 0; i < NUM_ROLES; ++i) {
+        *indexes[i] = PA_INVALID_INDEX;
+    }
+    pa_zero(highest_priority_available);
+
+    done = !pa_database_first(u->database, &key, NULL);
+
+    /* Find all existing devices with the same prefix so we find the highest priority device for each role */
+    while (!done) {
+        pa_datum next_key;
+
+        done = !pa_database_next(u->database, &key, &next_key, NULL);
+
+        if (key.size > strlen(prefix) && strncmp(key.data, prefix, strlen(prefix)) == 0) {
+            char *name;
+            struct entry *e;
+
+            name = pa_xstrndup(key.data, key.size);
+
+            if ((e = read_entry(u, name))) {
+                for (uint32_t i = 0; i < NUM_ROLES; ++i) {
+                    if (highest_priority_available[i] && e->priority[i] < highest_priority_available[i]) {
+                        /* We've found a device with a higher priority than that we've currently got,
+                           so see if it is currently available or not and update our list */
+                        uint32_t idx;
+                        pa_bool_t found = FALSE;
+                        char *device_name = get_name(name, prefix);
+
+                        if (strcmp(prefix, "sink:") == 0) {
+                            pa_sink *sink;
+
+                            PA_IDXSET_FOREACH(sink, u->core->sinks, idx) {
+                                if (strcmp(sink->name, device_name) == 0) {
+                                    found = TRUE;
+                                    idx = sink->index; /* Is this needed? */
+                                    break;
+                                }
+                            }
+                        } else {
+                            pa_source *source;
+
+                            PA_IDXSET_FOREACH(source, u->core->sources, idx) {
+                                if (strcmp(source->name, device_name) == 0) {
+                                    found = TRUE;
+                                    idx = source->index; /* Is this needed? */
+                                    break;
+                                }
+                            }
+                        }
+                        if (found) {
+                            highest_priority_available[i] = e->priority[i];
+                            *indexes[i] = idx;
+                        }
+
+                        pa_xfree(device_name);
+                    }
+                }
+
+                pa_xfree(e);
+            }
+
+            pa_xfree(name);
+        }
+
+        pa_datum_free(&key);
+        key = next_key;
+    }
+
+    return indexes;
+}
+
+
 static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_new_data *new_data, struct userdata *u) {
     char *name;
     struct entry *e;

commit 74c1c27eaac2e9d40902442f4b3671e12499494b
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 18:08:40 2009 +0100

    device-manager: Add routing functions that are triggered when sinks/soruces are added/removed.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index f4d00b5..87588ae 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -402,6 +402,30 @@ static char *get_name(const char *key, const char *prefix) {
     return t;
 }
 
+static uint32_t get_role_index(const char* role) {
+    pa_assert(role);
+
+    if (strcmp(role, "") == 0)
+        return ROLE_NONE;
+    if (strcmp(role, "video") == 0)
+        return ROLE_VIDEO;
+    if (strcmp(role, "music") == 0)
+        return ROLE_MUSIC;
+    if (strcmp(role, "game") == 0)
+        return ROLE_GAME;
+    if (strcmp(role, "event") == 0)
+        return ROLE_EVENT;
+    if (strcmp(role, "phone") == 0)
+        return ROLE_PHONE;
+    if (strcmp(role, "animation") == 0)
+        return ROLE_ANIMATION;
+    if (strcmp(role, "production") == 0)
+        return ROLE_PRODUCTION;
+    if (strcmp(role, "a11y") == 0)
+        return ROLE_A11Y;
+    return PA_INVALID_INDEX;
+}
+
 static role_indexes_t *get_highest_priority_device_indexes(struct userdata *u, const char *prefix) {
     role_indexes_t *indexes, highest_priority_available;
     pa_datum key;
@@ -484,9 +508,6 @@ static role_indexes_t *get_highest_priority_device_indexes(struct userdata *u, c
 
 
 static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_new_data *new_data, struct userdata *u) {
-    char *name;
-    struct entry *e;
-
     pa_assert(c);
     pa_assert(new_data);
     pa_assert(u);
@@ -510,9 +531,6 @@ static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_n
 }
 
 static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_output_new_data *new_data, struct userdata *u) {
-    char *name;
-    struct entry *e;
-
     pa_assert(c);
     pa_assert(new_data);
     pa_assert(u);
@@ -538,80 +556,161 @@ static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_ou
     return PA_HOOK_OK;
 }
 
-static pa_hook_result_t sink_put_hook_callback(pa_core *c, pa_sink *sink, struct userdata *u) {
+static pa_hook_result_t reroute_sinks(struct userdata *u) {
     pa_sink_input *si;
+    role_indexes_t *indexes;
     uint32_t idx;
 
-    pa_assert(c);
-    pa_assert(sink);
     pa_assert(u);
-    pa_assert(u->on_hotplug);
 
     if (!u->role_device_priority_routing)
         return PA_HOOK_OK;
 
-    /** @todo Ensure redo the routing based on the priorities */
+    pa_assert_se(indexes = get_highest_priority_device_indexes(u, "sink:"));
+
+    PA_IDXSET_FOREACH(si, u->core->sink_inputs, idx) {
+        const char *role;
+        uint32_t role_index, device_index;
+        pa_sink *sink;
+
+        if (si->save_sink)
+            continue;
+
+        /* Skip this if it is already in the process of being moved
+        * anyway */
+        if (!si->sink)
+            continue;
+
+        /* It might happen that a stream and a sink are set up at the
+        same time, in which case we want to make sure we don't
+        interfere with that */
+        if (!PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(si)))
+            continue;
+
+        if (!(role = pa_proplist_gets(si->proplist, PA_PROP_MEDIA_ROLE)))
+            role_index = get_role_index("");
+        else
+            role_index = get_role_index(role);
+
+        if (PA_INVALID_INDEX == role_index)
+            continue;
+
+        device_index = *indexes[role_index];
+        if (PA_INVALID_INDEX == device_index)
+            continue;
+
+        if (!(sink = pa_idxset_get_by_index(u->core->sinks, device_index)))
+            continue;
+
+        if (si->sink != sink)
+            pa_sink_input_move_to(si, sink, TRUE);
+    }
+
+    pa_xfree(indexes);
 
     return PA_HOOK_OK;
 }
 
-static pa_hook_result_t source_put_hook_callback(pa_core *c, pa_source *source, struct userdata *u) {
+static pa_hook_result_t reroute_sources(struct userdata *u) {
     pa_source_output *so;
+    role_indexes_t *indexes;
     uint32_t idx;
 
-    pa_assert(c);
-    pa_assert(source);
     pa_assert(u);
-    pa_assert(u->on_hotplug);
 
     if (!u->role_device_priority_routing)
         return PA_HOOK_OK;
 
-    /** @todo Ensure redo the routing based on the priorities */
+    pa_assert_se(indexes = get_highest_priority_device_indexes(u, "source:"));
+
+    PA_IDXSET_FOREACH(so, u->core->source_outputs, idx) {
+        const char *role;
+        uint32_t role_index, device_index;
+        pa_source *source;
+
+        if (so->save_source)
+            continue;
+
+        if (so->direct_on_input)
+            continue;
+
+        /* Skip this if it is already in the process of being moved
+        * anyway */
+        if (!so->source)
+            continue;
+
+        /* It might happen that a stream and a source are set up at the
+        same time, in which case we want to make sure we don't
+        interfere with that */
+        if (!PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(so)))
+            continue;
+
+        if (!(role = pa_proplist_gets(so->proplist, PA_PROP_MEDIA_ROLE)))
+            role_index = get_role_index("");
+        else
+            role_index = get_role_index(role);
+
+        if (PA_INVALID_INDEX == role_index)
+            continue;
+
+        device_index = *indexes[role_index];
+        if (PA_INVALID_INDEX == device_index)
+            continue;
+
+        if (!(source = pa_idxset_get_by_index(u->core->sources, device_index)))
+            continue;
+
+        if (so->source != source)
+            pa_source_output_move_to(so, source, TRUE);
+    }
+
+    pa_xfree(indexes);
 
     return PA_HOOK_OK;
 }
 
-static pa_hook_result_t sink_unlink_hook_callback(pa_core *c, pa_sink *sink, struct userdata *u) {
-    pa_sink_input *si;
-    uint32_t idx;
+static pa_hook_result_t sink_put_hook_callback(pa_core *c, PA_GCC_UNUSED pa_sink *sink, struct userdata *u) {
+    pa_assert(c);
+    pa_assert(u);
+    pa_assert(u->core == c);
+    pa_assert(u->on_hotplug);
+
+    return reroute_sinks(u);
+}
+
+static pa_hook_result_t source_put_hook_callback(pa_core *c, PA_GCC_UNUSED pa_source *source, struct userdata *u) {
+    pa_assert(c);
+    pa_assert(u);
+    pa_assert(u->core == c);
+    pa_assert(u->on_hotplug);
 
+    return reroute_sources(u);
+}
+
+static pa_hook_result_t sink_unlink_hook_callback(pa_core *c, PA_GCC_UNUSED pa_sink *sink, struct userdata *u) {
     pa_assert(c);
-    pa_assert(sink);
     pa_assert(u);
+    pa_assert(u->core == c);
     pa_assert(u->on_rescue);
 
     /* There's no point in doing anything if the core is shut down anyway */
     if (c->state == PA_CORE_SHUTDOWN)
         return PA_HOOK_OK;
 
-    if (!u->role_device_priority_routing)
-        return PA_HOOK_OK;
-
-    /** @todo Ensure redo the routing based on the priorities */
-
-    return PA_HOOK_OK;
+    return reroute_sinks(u);
 }
 
-static pa_hook_result_t source_unlink_hook_callback(pa_core *c, pa_source *source, struct userdata *u) {
-    pa_source_output *so;
-    uint32_t idx;
-
+static pa_hook_result_t source_unlink_hook_callback(pa_core *c, PA_GCC_UNUSED pa_source *source, struct userdata *u) {
     pa_assert(c);
-    pa_assert(source);
     pa_assert(u);
+    pa_assert(u->core == c);
     pa_assert(u->on_rescue);
 
     /* There's no point in doing anything if the core is shut down anyway */
     if (c->state == PA_CORE_SHUTDOWN)
         return PA_HOOK_OK;
 
-    if (!u->role_device_priority_routing)
-        return PA_HOOK_OK;
-
-    /** @todo Ensure redo the routing based on the priorities */
-
-    return PA_HOOK_OK;
+    return reroute_sinks(u);
 }
 
 
@@ -655,30 +754,6 @@ static void apply_entry(struct userdata *u, const char *name, struct entry *e) {
 }
 
 
-static uint32_t get_role_index(const char* role) {
-    pa_assert(role);
-
-    if (strcmp(role, "") == 0)
-        return ROLE_NONE;
-    if (strcmp(role, "video") == 0)
-        return ROLE_VIDEO;
-    if (strcmp(role, "music") == 0)
-        return ROLE_MUSIC;
-    if (strcmp(role, "game") == 0)
-        return ROLE_GAME;
-    if (strcmp(role, "event") == 0)
-        return ROLE_EVENT;
-    if (strcmp(role, "phone") == 0)
-        return ROLE_PHONE;
-    if (strcmp(role, "animation") == 0)
-        return ROLE_ANIMATION;
-    if (strcmp(role, "production") == 0)
-        return ROLE_PRODUCTION;
-    if (strcmp(role, "a11y") == 0)
-        return ROLE_A11Y;
-    return PA_INVALID_INDEX;
-}
-
 #define EXT_VERSION 1
 
 static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connection *c, uint32_t tag, pa_tagstruct *t) {

commit 1d04c353ea61f47961c2f25aff20b75c602e8c93
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 18:23:52 2009 +0100

    device-manager: Set the most appropriate sink/source when new streams are created

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 87588ae..5c3c395 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -515,17 +515,34 @@ static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_n
     if (!u->role_device_priority_routing)
         return PA_HOOK_OK;
 
-    /*if (!(name = get_name(new_data->proplist, "sink-input")))
-        return PA_HOOK_OK;
-
     if (new_data->sink)
-        pa_log_debug("Not restoring device for stream %s, because already set.", name);
-    else if ((e = read_entry(u, name))) {
+        pa_log_debug("Not restoring device for stream, because already set.");
+    else {
+        const char *role;
+        uint32_t role_index;
 
-        pa_xfree(e);
-    }
+        if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE)))
+            role_index = get_role_index("");
+        else
+            role_index = get_role_index(role);
+
+        if (PA_INVALID_INDEX != role_index) {
+            role_indexes_t *indexes;
+            uint32_t device_index;
+
+            pa_assert_se(indexes = get_highest_priority_device_indexes(u, "sink:"));
+
+            device_index = *indexes[role_index];
+            if (PA_INVALID_INDEX != device_index) {
+                pa_sink *sink;
 
-    pa_xfree(name);*/
+                if ((sink = pa_idxset_get_by_index(u->core->sinks, device_index))) {
+                    new_data->sink = sink;
+                    new_data->save_sink = TRUE;
+                }
+            }
+        }
+    }
 
     return PA_HOOK_OK;
 }
@@ -541,17 +558,34 @@ static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_ou
     if (new_data->direct_on_input)
         return PA_HOOK_OK;
 
-    /*if (!(name = get_name(new_data->proplist, "source-output")))
-        return PA_HOOK_OK;
-
     if (new_data->source)
-        pa_log_debug("Not restoring device for stream %s, because already set", name);
-    else if ((e = read_entry(u, name))) {
+        pa_log_debug("Not restoring device for stream, because already set");
+    else {
+        const char *role;
+        uint32_t role_index;
 
-        pa_xfree(e);
-    }
+        if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE)))
+            role_index = get_role_index("");
+        else
+            role_index = get_role_index(role);
+
+        if (PA_INVALID_INDEX != role_index) {
+            role_indexes_t *indexes;
+            uint32_t device_index;
+
+            pa_assert_se(indexes = get_highest_priority_device_indexes(u, "source:"));
+
+            device_index = *indexes[role_index];
+            if (PA_INVALID_INDEX != device_index) {
+                pa_source *source;
 
-    pa_xfree(name);*/
+                if ((source = pa_idxset_get_by_index(u->core->sources, device_index))) {
+                    new_data->source = source;
+                    new_data->save_source = TRUE;
+                }
+            }
+        }
+    }
 
     return PA_HOOK_OK;
 }

commit 4fb9dafaf8cf844ecf981d243d35a2d57b780275
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 18:24:51 2009 +0100

    device-manager: Remove unused variables

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 5c3c395..ec981bb 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -914,9 +914,6 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
     case SUBCOMMAND_ROLE_DEVICE_PRIORITY_ROUTING: {
 
         pa_bool_t enable;
-        uint32_t sridx = PA_INVALID_INDEX;
-        uint32_t idx;
-        pa_module *module;
 
         if (pa_tagstruct_get_boolean(t, &enable) < 0)
             goto fail;

commit e47f385b09b2bd6e4c5dd2ba4c1b93a213ec1b5c
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 18:31:10 2009 +0100

    device-manager: Allow the routing component to be turned on via a module argument as well as via protocol extn.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index ec981bb..fba4ebe 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -59,12 +59,14 @@ PA_MODULE_DESCRIPTION("Keep track of devices (and their descriptions) both past
 PA_MODULE_VERSION(PACKAGE_VERSION);
 PA_MODULE_LOAD_ONCE(TRUE);
 PA_MODULE_USAGE(
+    "do_routing=<Automatically route streams based on a priority list (unique per-role)?> "
     "on_hotplug=<When new device becomes available, recheck streams?> "
     "on_rescue=<When device becomes unavailable, recheck streams?>");
 
 #define SAVE_INTERVAL (10 * PA_USEC_PER_SEC)
 
 static const char* const valid_modargs[] = {
+    "do_routing",
     "on_hotplug",
     "on_rescue",
     NULL
@@ -92,7 +94,7 @@ struct userdata {
 
     pa_bool_t on_hotplug;
     pa_bool_t on_rescue;
-    pa_bool_t role_device_priority_routing;
+    pa_bool_t do_routing;
 };
 
 #define ENTRY_VERSION 1
@@ -512,7 +514,7 @@ static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_n
     pa_assert(new_data);
     pa_assert(u);
 
-    if (!u->role_device_priority_routing)
+    if (!u->do_routing)
         return PA_HOOK_OK;
 
     if (new_data->sink)
@@ -552,7 +554,7 @@ static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_ou
     pa_assert(new_data);
     pa_assert(u);
 
-    if (!u->role_device_priority_routing)
+    if (!u->do_routing)
         return PA_HOOK_OK;
 
     if (new_data->direct_on_input)
@@ -597,7 +599,7 @@ static pa_hook_result_t reroute_sinks(struct userdata *u) {
 
     pa_assert(u);
 
-    if (!u->role_device_priority_routing)
+    if (!u->do_routing)
         return PA_HOOK_OK;
 
     pa_assert_se(indexes = get_highest_priority_device_indexes(u, "sink:"));
@@ -610,8 +612,7 @@ static pa_hook_result_t reroute_sinks(struct userdata *u) {
         if (si->save_sink)
             continue;
 
-        /* Skip this if it is already in the process of being moved
-        * anyway */
+        /* Skip this if it is already in the process of being moved anyway */
         if (!si->sink)
             continue;
 
@@ -652,7 +653,7 @@ static pa_hook_result_t reroute_sources(struct userdata *u) {
 
     pa_assert(u);
 
-    if (!u->role_device_priority_routing)
+    if (!u->do_routing)
         return PA_HOOK_OK;
 
     pa_assert_se(indexes = get_highest_priority_device_indexes(u, "source:"));
@@ -668,8 +669,7 @@ static pa_hook_result_t reroute_sources(struct userdata *u) {
         if (so->direct_on_input)
             continue;
 
-        /* Skip this if it is already in the process of being moved
-        * anyway */
+        /* Skip this if it is already in the process of being moved anyway */
         if (!so->source)
             continue;
 
@@ -918,7 +918,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         if (pa_tagstruct_get_boolean(t, &enable) < 0)
             goto fail;
 
-        u->role_device_priority_routing = enable;
+        u->do_routing = enable;
 
         break;
     }
@@ -1082,7 +1082,7 @@ int pa__init(pa_module*m) {
     pa_sink_input *si;
     pa_source_output *so;
     uint32_t idx;
-    pa_bool_t on_hotplug = TRUE, on_rescue = TRUE;
+    pa_bool_t do_routing = FALSE, on_hotplug = TRUE, on_rescue = TRUE;
 
     pa_assert(m);
 
@@ -1091,7 +1091,8 @@ int pa__init(pa_module*m) {
         goto fail;
     }
 
-    if (pa_modargs_get_value_boolean(ma, "on_hotplug", &on_hotplug) < 0 ||
+    if (pa_modargs_get_value_boolean(ma, "do_routing", &do_routing) < 0 ||
+        pa_modargs_get_value_boolean(ma, "on_hotplug", &on_hotplug) < 0 ||
         pa_modargs_get_value_boolean(ma, "on_rescue", &on_rescue) < 0) {
         pa_log("on_hotplug= and on_rescue= expect boolean arguments");
         goto fail;
@@ -1100,6 +1101,7 @@ int pa__init(pa_module*m) {
     m->userdata = u = pa_xnew0(struct userdata, 1);
     u->core = m->core;
     u->module = m;
+    u->do_routing = do_routing;
     u->on_hotplug = on_hotplug;
     u->on_rescue = on_rescue;
     u->subscribed = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);

commit 9e447978eb9ed246762a07e52466384580834566
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 18:39:50 2009 +0100

    device-manager: Some efficiency and safety tweaks

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index fba4ebe..5abcc75 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -431,7 +431,7 @@ static uint32_t get_role_index(const char* role) {
 static role_indexes_t *get_highest_priority_device_indexes(struct userdata *u, const char *prefix) {
     role_indexes_t *indexes, highest_priority_available;
     pa_datum key;
-    pa_bool_t done;
+    pa_bool_t done, sink_mode;
 
     pa_assert(u);
     pa_assert(prefix);
@@ -442,6 +442,8 @@ static role_indexes_t *get_highest_priority_device_indexes(struct userdata *u, c
     }
     pa_zero(highest_priority_available);
 
+    sink_mode = (strcmp(prefix, "sink:") == 0);
+
     done = !pa_database_first(u->database, &key, NULL);
 
     /* Find all existing devices with the same prefix so we find the highest priority device for each role */
@@ -465,7 +467,7 @@ static role_indexes_t *get_highest_priority_device_indexes(struct userdata *u, c
                         pa_bool_t found = FALSE;
                         char *device_name = get_name(name, prefix);
 
-                        if (strcmp(prefix, "sink:") == 0) {
+                        if (sink_mode) {
                             pa_sink *sink;
 
                             PA_IDXSET_FOREACH(sink, u->core->sinks, idx) {
@@ -944,15 +946,18 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         if ((e = read_entry(u, device)) && ENTRY_VERSION == e->version) {
             pa_datum key, data;
             pa_bool_t done;
-            char* prefix;
+            char* prefix = NULL;
             uint32_t priority;
             pa_bool_t haschanged = FALSE;
 
             if (strncmp(device, "sink:", 5) == 0)
                 prefix = pa_xstrdup("sink:");
-            else
+            else if (strncmp(device, "source:", 7) == 0)
                 prefix = pa_xstrdup("source:");
 
+            if (!prefix)
+                goto fail;
+
             priority = e->priority[role_index];
 
             /* Now we need to load up all the other entries of this type and shuffle the priroities around */

commit 1e2d236b9984dbc25080b5a97add86043a524ea4
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 19:18:22 2009 +0100

    device-manager: Update exports

diff --git a/src/map-file b/src/map-file
index cec688f..d7b341d 100644
--- a/src/map-file
+++ b/src/map-file
@@ -144,12 +144,15 @@ pa_cvolume_set_fade;
 pa_cvolume_set_position;
 pa_cvolume_snprint;
 pa_cvolume_valid;
+pa_ext_device_manager_defer_device;
 pa_ext_device_manager_delete;
+pa_ext_device_manager_enable_role_device_priority_routing;
+pa_ext_device_manager_prefer_device;
 pa_ext_device_manager_read;
+pa_ext_device_manager_set_device_description;
 pa_ext_device_manager_set_subscribe_cb;
 pa_ext_device_manager_subscribe;
 pa_ext_device_manager_test;
-pa_ext_device_manager_write;
 pa_ext_stream_restore_delete;
 pa_ext_stream_restore_read;
 pa_ext_stream_restore_set_subscribe_cb;

commit ce0b2bdc0718cfaec58d9809bd97a123a9fe07a4
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 19:30:31 2009 +0100

    device-manager: Fix the database write mode

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 5abcc75..3f4418a 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -877,7 +877,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
             data.data = e;
             data.size = sizeof(*e);
 
-            if (pa_database_set(u->database, &key, &data, FALSE) == 0) {
+            if (pa_database_set(u->database, &key, &data, TRUE) == 0) {
                 apply_entry(u, device, e);
 
                 trigger_save(u);
@@ -995,7 +995,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
                             data.data = e2;
                             data.size = sizeof(*e2);
 
-                            if (pa_database_set(u->database, &key, &data, FALSE))
+                            if (pa_database_set(u->database, &key, &data, TRUE))
                                 pa_log_warn("Could not save device");
                         }
 
@@ -1022,7 +1022,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
                 data.data = e;
                 data.size = sizeof(*e);
 
-                if (pa_database_set(u->database, &key, &data, FALSE))
+                if (pa_database_set(u->database, &key, &data, TRUE))
                     pa_log_warn("Could not save device");
 
                 trigger_save(u);

commit 0016b5e2655ec8e5a415d02bf3ccb97c641a60bb
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 20:34:52 2009 +0100

    device-manager: Keep a cache of the highest priority devices for each role.
    
    Rather than querying our database on every new stream, we keep a cache and only update it when a sink/source is added/removed.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 3f4418a..3f3f4a1 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -72,6 +72,21 @@ static const char* const valid_modargs[] = {
     NULL
 };
 
+#define NUM_ROLES 9
+enum {
+    ROLE_NONE,
+    ROLE_VIDEO,
+    ROLE_MUSIC,
+    ROLE_GAME,
+    ROLE_EVENT,
+    ROLE_PHONE,
+    ROLE_ANIMATION,
+    ROLE_PRODUCTION,
+    ROLE_A11Y,
+};
+
+typedef uint32_t role_indexes_t[NUM_ROLES];
+
 struct userdata {
     pa_core *core;
     pa_module *module;
@@ -95,24 +110,12 @@ struct userdata {
     pa_bool_t on_hotplug;
     pa_bool_t on_rescue;
     pa_bool_t do_routing;
-};
 
-#define ENTRY_VERSION 1
-
-#define NUM_ROLES 9
-enum {
-    ROLE_NONE,
-    ROLE_VIDEO,
-    ROLE_MUSIC,
-    ROLE_GAME,
-    ROLE_EVENT,
-    ROLE_PHONE,
-    ROLE_ANIMATION,
-    ROLE_PRODUCTION,
-    ROLE_A11Y,
+    role_indexes_t preferred_sinks;
+    role_indexes_t preferred_sources;
 };
 
-typedef uint32_t role_indexes_t[NUM_ROLES];
+#define ENTRY_VERSION 1
 
 struct entry {
     uint8_t version;
@@ -211,6 +214,7 @@ static void trigger_save(struct userdata *u) {
 }
 
 static pa_bool_t entries_equal(const struct entry *a, const struct entry *b) {
+    /** @todo: Compare the priority lists too */
     if (strncmp(a->description, b->description, sizeof(a->description)))
         return FALSE;
 
@@ -428,7 +432,7 @@ static uint32_t get_role_index(const char* role) {
     return PA_INVALID_INDEX;
 }
 
-static role_indexes_t *get_highest_priority_device_indexes(struct userdata *u, const char *prefix) {
+static void update_highest_priority_device_indexes(struct userdata *u, const char *prefix, void *ignore_device) {
     role_indexes_t *indexes, highest_priority_available;
     pa_datum key;
     pa_bool_t done, sink_mode;
@@ -436,14 +440,18 @@ static role_indexes_t *get_highest_priority_device_indexes(struct userdata *u, c
     pa_assert(u);
     pa_assert(prefix);
 
-    indexes = pa_xnew(role_indexes_t, 1);
+    sink_mode = (strcmp(prefix, "sink:") == 0);
+
+    if (sink_mode)
+        indexes = &u->preferred_sinks;
+    else
+        indexes = &u->preferred_sources;
+
     for (uint32_t i = 0; i < NUM_ROLES; ++i) {
         *indexes[i] = PA_INVALID_INDEX;
     }
     pa_zero(highest_priority_available);
 
-    sink_mode = (strcmp(prefix, "sink:") == 0);
-
     done = !pa_database_first(u->database, &key, NULL);
 
     /* Find all existing devices with the same prefix so we find the highest priority device for each role */
@@ -471,6 +479,8 @@ static role_indexes_t *get_highest_priority_device_indexes(struct userdata *u, c
                             pa_sink *sink;
 
                             PA_IDXSET_FOREACH(sink, u->core->sinks, idx) {
+                                if ((pa_sink*) ignore_device == sink)
+                                    continue;
                                 if (strcmp(sink->name, device_name) == 0) {
                                     found = TRUE;
                                     idx = sink->index; /* Is this needed? */
@@ -481,6 +491,8 @@ static role_indexes_t *get_highest_priority_device_indexes(struct userdata *u, c
                             pa_source *source;
 
                             PA_IDXSET_FOREACH(source, u->core->sources, idx) {
+                                if ((pa_source*) ignore_device == source)
+                                    continue;
                                 if (strcmp(source->name, device_name) == 0) {
                                     found = TRUE;
                                     idx = source->index; /* Is this needed? */
@@ -506,8 +518,6 @@ static role_indexes_t *get_highest_priority_device_indexes(struct userdata *u, c
         pa_datum_free(&key);
         key = next_key;
     }
-
-    return indexes;
 }
 
 
@@ -531,12 +541,9 @@ static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_n
             role_index = get_role_index(role);
 
         if (PA_INVALID_INDEX != role_index) {
-            role_indexes_t *indexes;
             uint32_t device_index;
 
-            pa_assert_se(indexes = get_highest_priority_device_indexes(u, "sink:"));
-
-            device_index = *indexes[role_index];
+            device_index = u->preferred_sinks[role_index];
             if (PA_INVALID_INDEX != device_index) {
                 pa_sink *sink;
 
@@ -574,12 +581,9 @@ static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_ou
             role_index = get_role_index(role);
 
         if (PA_INVALID_INDEX != role_index) {
-            role_indexes_t *indexes;
             uint32_t device_index;
 
-            pa_assert_se(indexes = get_highest_priority_device_indexes(u, "source:"));
-
-            device_index = *indexes[role_index];
+            device_index = u->preferred_sources[role_index];
             if (PA_INVALID_INDEX != device_index) {
                 pa_source *source;
 
@@ -594,9 +598,8 @@ static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_ou
     return PA_HOOK_OK;
 }
 
-static pa_hook_result_t reroute_sinks(struct userdata *u) {
+static pa_hook_result_t reroute_sinks(struct userdata *u, pa_sink *ignore_sink) {
     pa_sink_input *si;
-    role_indexes_t *indexes;
     uint32_t idx;
 
     pa_assert(u);
@@ -604,7 +607,7 @@ static pa_hook_result_t reroute_sinks(struct userdata *u) {
     if (!u->do_routing)
         return PA_HOOK_OK;
 
-    pa_assert_se(indexes = get_highest_priority_device_indexes(u, "sink:"));
+    update_highest_priority_device_indexes(u, "sink:", ignore_sink);
 
     PA_IDXSET_FOREACH(si, u->core->sink_inputs, idx) {
         const char *role;
@@ -632,7 +635,7 @@ static pa_hook_result_t reroute_sinks(struct userdata *u) {
         if (PA_INVALID_INDEX == role_index)
             continue;
 
-        device_index = *indexes[role_index];
+        device_index = u->preferred_sinks[role_index];
         if (PA_INVALID_INDEX == device_index)
             continue;
 
@@ -643,14 +646,11 @@ static pa_hook_result_t reroute_sinks(struct userdata *u) {
             pa_sink_input_move_to(si, sink, TRUE);
     }
 
-    pa_xfree(indexes);
-
     return PA_HOOK_OK;
 }
 
-static pa_hook_result_t reroute_sources(struct userdata *u) {
+static pa_hook_result_t reroute_sources(struct userdata *u, pa_source* ignore_source) {
     pa_source_output *so;
-    role_indexes_t *indexes;
     uint32_t idx;
 
     pa_assert(u);
@@ -658,7 +658,7 @@ static pa_hook_result_t reroute_sources(struct userdata *u) {
     if (!u->do_routing)
         return PA_HOOK_OK;
 
-    pa_assert_se(indexes = get_highest_priority_device_indexes(u, "source:"));
+    update_highest_priority_device_indexes(u, "source:", ignore_source);
 
     PA_IDXSET_FOREACH(so, u->core->source_outputs, idx) {
         const char *role;
@@ -689,7 +689,7 @@ static pa_hook_result_t reroute_sources(struct userdata *u) {
         if (PA_INVALID_INDEX == role_index)
             continue;
 
-        device_index = *indexes[role_index];
+        device_index = u->preferred_sources[role_index];
         if (PA_INVALID_INDEX == device_index)
             continue;
 
@@ -700,8 +700,6 @@ static pa_hook_result_t reroute_sources(struct userdata *u) {
             pa_source_output_move_to(so, source, TRUE);
     }
 
-    pa_xfree(indexes);
-
     return PA_HOOK_OK;
 }
 
@@ -711,7 +709,7 @@ static pa_hook_result_t sink_put_hook_callback(pa_core *c, PA_GCC_UNUSED pa_sink
     pa_assert(u->core == c);
     pa_assert(u->on_hotplug);
 
-    return reroute_sinks(u);
+    return reroute_sinks(u, NULL);
 }
 
 static pa_hook_result_t source_put_hook_callback(pa_core *c, PA_GCC_UNUSED pa_source *source, struct userdata *u) {
@@ -720,11 +718,12 @@ static pa_hook_result_t source_put_hook_callback(pa_core *c, PA_GCC_UNUSED pa_so
     pa_assert(u->core == c);
     pa_assert(u->on_hotplug);
 
-    return reroute_sources(u);
+    return reroute_sources(u, NULL);
 }
 
-static pa_hook_result_t sink_unlink_hook_callback(pa_core *c, PA_GCC_UNUSED pa_sink *sink, struct userdata *u) {
+static pa_hook_result_t sink_unlink_hook_callback(pa_core *c, pa_sink *sink, struct userdata *u) {
     pa_assert(c);
+    pa_assert(sink);
     pa_assert(u);
     pa_assert(u->core == c);
     pa_assert(u->on_rescue);
@@ -733,11 +732,12 @@ static pa_hook_result_t sink_unlink_hook_callback(pa_core *c, PA_GCC_UNUSED pa_s
     if (c->state == PA_CORE_SHUTDOWN)
         return PA_HOOK_OK;
 
-    return reroute_sinks(u);
+    return reroute_sinks(u, sink);
 }
 
-static pa_hook_result_t source_unlink_hook_callback(pa_core *c, PA_GCC_UNUSED pa_source *source, struct userdata *u) {
+static pa_hook_result_t source_unlink_hook_callback(pa_core *c, pa_source *source, struct userdata *u) {
     pa_assert(c);
+    pa_assert(source);
     pa_assert(u);
     pa_assert(u->core == c);
     pa_assert(u->on_rescue);
@@ -746,7 +746,7 @@ static pa_hook_result_t source_unlink_hook_callback(pa_core *c, PA_GCC_UNUSED pa
     if (c->state == PA_CORE_SHUTDOWN)
         return PA_HOOK_OK;
 
-    return reroute_sinks(u);
+    return reroute_sources(u, source);
 }
 
 
@@ -1151,12 +1151,17 @@ int pa__init(pa_module*m) {
     pa_log_info("Sucessfully opened database file '%s'.", fname);
     pa_xfree(fname);
 
+    /* We cycle over all the available sinks so that they are added to our database if they are not in it yet */
     PA_IDXSET_FOREACH(sink, m->core->sinks, idx)
         subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_NEW, sink->index, u);
 
     PA_IDXSET_FOREACH(source, m->core->sources, idx)
         subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_NEW, source->index, u);
 
+    /* Update our caches (all available devices will be present in our database now */
+    update_highest_priority_device_indexes(u, "sink:", NULL);
+    update_highest_priority_device_indexes(u, "source:", NULL);
+
     PA_IDXSET_FOREACH(si, m->core->sink_inputs, idx)
         subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_NEW, si->index, u);
 

commit 25f75342d4e3e2885d751b9625a8eda4c0c1380c
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 20:48:58 2009 +0100

    device-manager: Reroute the streams on startup and update our cache on enable.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 3f3f4a1..745961c 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -920,7 +920,11 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         if (pa_tagstruct_get_boolean(t, &enable) < 0)
             goto fail;
 
-        u->do_routing = enable;
+        if ((u->do_routing = enable)) {
+            /* Update our caches */
+            update_highest_priority_device_indexes(u, "sink:", NULL);
+            update_highest_priority_device_indexes(u, "source:", NULL);
+        }
 
         break;
     }
@@ -1158,15 +1162,9 @@ int pa__init(pa_module*m) {
     PA_IDXSET_FOREACH(source, m->core->sources, idx)
         subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_NEW, source->index, u);
 
-    /* Update our caches (all available devices will be present in our database now */
-    update_highest_priority_device_indexes(u, "sink:", NULL);
-    update_highest_priority_device_indexes(u, "source:", NULL);
-
-    PA_IDXSET_FOREACH(si, m->core->sink_inputs, idx)
-        subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_NEW, si->index, u);
-
-    PA_IDXSET_FOREACH(so, m->core->source_outputs, idx)
-        subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_NEW, so->index, u);
+    /* Perform the routing (if it's enabled) which will update our priority list cache too */
+    reroute_sinks(u, NULL);
+    reroute_sources(u, NULL);
 
     pa_modargs_free(ma);
     return 0;

commit 8d0787c1d5a0552e52ad91c2a6f0630f96216a69
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 20:50:23 2009 +0100

    device-manager: More sensible names for internal functions

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 745961c..c2bc041 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -598,7 +598,7 @@ static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_ou
     return PA_HOOK_OK;
 }
 
-static pa_hook_result_t reroute_sinks(struct userdata *u, pa_sink *ignore_sink) {
+static pa_hook_result_t route_sink_inputs(struct userdata *u, pa_sink *ignore_sink) {
     pa_sink_input *si;
     uint32_t idx;
 
@@ -649,7 +649,7 @@ static pa_hook_result_t reroute_sinks(struct userdata *u, pa_sink *ignore_sink)
     return PA_HOOK_OK;
 }
 
-static pa_hook_result_t reroute_sources(struct userdata *u, pa_source* ignore_source) {
+static pa_hook_result_t route_source_outputs(struct userdata *u, pa_source* ignore_source) {
     pa_source_output *so;
     uint32_t idx;
 
@@ -709,7 +709,7 @@ static pa_hook_result_t sink_put_hook_callback(pa_core *c, PA_GCC_UNUSED pa_sink
     pa_assert(u->core == c);
     pa_assert(u->on_hotplug);
 
-    return reroute_sinks(u, NULL);
+    return route_sink_inputs(u, NULL);
 }
 
 static pa_hook_result_t source_put_hook_callback(pa_core *c, PA_GCC_UNUSED pa_source *source, struct userdata *u) {
@@ -718,7 +718,7 @@ static pa_hook_result_t source_put_hook_callback(pa_core *c, PA_GCC_UNUSED pa_so
     pa_assert(u->core == c);
     pa_assert(u->on_hotplug);
 
-    return reroute_sources(u, NULL);
+    return route_source_outputs(u, NULL);
 }
 
 static pa_hook_result_t sink_unlink_hook_callback(pa_core *c, pa_sink *sink, struct userdata *u) {
@@ -732,7 +732,7 @@ static pa_hook_result_t sink_unlink_hook_callback(pa_core *c, pa_sink *sink, str
     if (c->state == PA_CORE_SHUTDOWN)
         return PA_HOOK_OK;
 
-    return reroute_sinks(u, sink);
+    return route_sink_inputs(u, sink);
 }
 
 static pa_hook_result_t source_unlink_hook_callback(pa_core *c, pa_source *source, struct userdata *u) {
@@ -746,7 +746,7 @@ static pa_hook_result_t source_unlink_hook_callback(pa_core *c, pa_source *sourc
     if (c->state == PA_CORE_SHUTDOWN)
         return PA_HOOK_OK;
 
-    return reroute_sources(u, source);
+    return route_source_outputs(u, source);
 }
 
 
@@ -1088,8 +1088,6 @@ int pa__init(pa_module*m) {
     char *fname;
     pa_sink *sink;
     pa_source *source;
-    pa_sink_input *si;
-    pa_source_output *so;
     uint32_t idx;
     pa_bool_t do_routing = FALSE, on_hotplug = TRUE, on_rescue = TRUE;
 
@@ -1163,8 +1161,8 @@ int pa__init(pa_module*m) {
         subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_NEW, source->index, u);
 
     /* Perform the routing (if it's enabled) which will update our priority list cache too */
-    reroute_sinks(u, NULL);
-    reroute_sources(u, NULL);
+    route_sink_inputs(u, NULL);
+    route_source_outputs(u, NULL);
 
     pa_modargs_free(ma);
     return 0;

commit d3460e349893f6dc75eda1f03ee7690b0911dcc2
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 20:57:34 2009 +0100

    device-manager: Refactor the routing method to allow the routing of a single stream

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index c2bc041..d672197 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -598,6 +598,47 @@ static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_ou
     return PA_HOOK_OK;
 }
 
+
+static void route_sink_input(struct userdata *u, pa_sink_input *si) {
+    const char *role;
+    uint32_t role_index, device_index;
+    pa_sink *sink;
+
+    pa_assert(u);
+    pa_assert(u->do_routing);
+
+    if (si->save_sink)
+        return;
+
+    /* Skip this if it is already in the process of being moved anyway */
+    if (!si->sink)
+        return;
+
+    /* It might happen that a stream and a sink are set up at the
+    same time, in which case we want to make sure we don't
+    interfere with that */
+    if (!PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(si)))
+        return;
+
+    if (!(role = pa_proplist_gets(si->proplist, PA_PROP_MEDIA_ROLE)))
+        role_index = get_role_index("");
+    else
+        role_index = get_role_index(role);
+
+    if (PA_INVALID_INDEX == role_index)
+        return;
+
+    device_index = u->preferred_sinks[role_index];
+    if (PA_INVALID_INDEX == device_index)
+        return;
+
+    if (!(sink = pa_idxset_get_by_index(u->core->sinks, device_index)))
+        return;
+
+    if (si->sink != sink)
+        pa_sink_input_move_to(si, sink, TRUE);
+}
+
 static pa_hook_result_t route_sink_inputs(struct userdata *u, pa_sink *ignore_sink) {
     pa_sink_input *si;
     uint32_t idx;
@@ -610,43 +651,53 @@ static pa_hook_result_t route_sink_inputs(struct userdata *u, pa_sink *ignore_si
     update_highest_priority_device_indexes(u, "sink:", ignore_sink);
 
     PA_IDXSET_FOREACH(si, u->core->sink_inputs, idx) {
-        const char *role;
-        uint32_t role_index, device_index;
-        pa_sink *sink;
+        route_sink_input(u, si);
+    }
 
-        if (si->save_sink)
-            continue;
+    return PA_HOOK_OK;
+}
 
-        /* Skip this if it is already in the process of being moved anyway */
-        if (!si->sink)
-            continue;
+static void route_source_output(struct userdata *u, pa_source_output *so) {
+    const char *role;
+    uint32_t role_index, device_index;
+    pa_source *source;
 
-        /* It might happen that a stream and a sink are set up at the
-        same time, in which case we want to make sure we don't
-        interfere with that */
-        if (!PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(si)))
-            continue;
+    pa_assert(u);
+    pa_assert(u->do_routing);
 
-        if (!(role = pa_proplist_gets(si->proplist, PA_PROP_MEDIA_ROLE)))
-            role_index = get_role_index("");
-        else
-            role_index = get_role_index(role);
+    if (so->save_source)
+        return;
 
-        if (PA_INVALID_INDEX == role_index)
-            continue;
+    if (so->direct_on_input)
+        return;
 
-        device_index = u->preferred_sinks[role_index];
-        if (PA_INVALID_INDEX == device_index)
-            continue;
+    /* Skip this if it is already in the process of being moved anyway */
+    if (!so->source)
+        return;
 
-        if (!(sink = pa_idxset_get_by_index(u->core->sinks, device_index)))
-            continue;
+    /* It might happen that a stream and a source are set up at the
+    same time, in which case we want to make sure we don't
+    interfere with that */
+    if (!PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(so)))
+        return;
 
-        if (si->sink != sink)
-            pa_sink_input_move_to(si, sink, TRUE);
-    }
+    if (!(role = pa_proplist_gets(so->proplist, PA_PROP_MEDIA_ROLE)))
+        role_index = get_role_index("");
+    else
+        role_index = get_role_index(role);
 
-    return PA_HOOK_OK;
+    if (PA_INVALID_INDEX == role_index)
+        return;
+
+    device_index = u->preferred_sources[role_index];
+    if (PA_INVALID_INDEX == device_index)
+        return;
+
+    if (!(source = pa_idxset_get_by_index(u->core->sources, device_index)))
+        return;
+
+    if (so->source != source)
+        pa_source_output_move_to(so, source, TRUE);
 }
 
 static pa_hook_result_t route_source_outputs(struct userdata *u, pa_source* ignore_source) {
@@ -661,43 +712,7 @@ static pa_hook_result_t route_source_outputs(struct userdata *u, pa_source* igno
     update_highest_priority_device_indexes(u, "source:", ignore_source);
 
     PA_IDXSET_FOREACH(so, u->core->source_outputs, idx) {
-        const char *role;
-        uint32_t role_index, device_index;
-        pa_source *source;
-
-        if (so->save_source)
-            continue;
-
-        if (so->direct_on_input)
-            continue;
-
-        /* Skip this if it is already in the process of being moved anyway */
-        if (!so->source)
-            continue;
-
-        /* It might happen that a stream and a source are set up at the
-        same time, in which case we want to make sure we don't
-        interfere with that */
-        if (!PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(so)))
-            continue;
-
-        if (!(role = pa_proplist_gets(so->proplist, PA_PROP_MEDIA_ROLE)))
-            role_index = get_role_index("");
-        else
-            role_index = get_role_index(role);
-
-        if (PA_INVALID_INDEX == role_index)
-            continue;
-
-        device_index = u->preferred_sources[role_index];
-        if (PA_INVALID_INDEX == device_index)
-            continue;
-
-        if (!(source = pa_idxset_get_by_index(u->core->sources, device_index)))
-            continue;
-
-        if (so->source != source)
-            pa_source_output_move_to(so, source, TRUE);
+        route_source_output(u, so);
     }
 
     return PA_HOOK_OK;

commit 1d43230006e639170fbdbfa8797f2ba783ae5ca2
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 20 21:19:41 2009 +0100

    device-manager: Reroute streams when they change allowing the media.role to be updated mid-stream.
    
    We do not handle the _EVENT_NEW subscription here as the PA_CORE_HOOK_SINK_INPUT_NEW/PA_CORE_HOOK_SOURCE_OUTPUT_NEW
    hook should handle the initial routing.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index d672197..72b473c 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -221,6 +221,16 @@ static pa_bool_t entries_equal(const struct entry *a, const struct entry *b) {
     return TRUE;
 }
 
+static char *get_name(const char *key, const char *prefix) {
+    char *t;
+
+    if (strncmp(key, prefix, strlen(prefix)))
+        return NULL;
+
+    t = pa_xstrdup(key + strlen(prefix));
+    return t;
+}
+
 static inline struct entry *load_or_initialize_entry(struct userdata *u, struct entry *entry, const char *name, const char *prefix) {
     struct entry *old;
 
@@ -275,139 +285,6 @@ static inline struct entry *load_or_initialize_entry(struct userdata *u, struct
     return old;
 }
 
-static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
-    struct userdata *u = userdata;
-    struct entry entry, *old = NULL;
-    char *name = NULL;
-    pa_datum key, data;
-
-    pa_assert(c);
-    pa_assert(u);
-
-    if (t != (PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_NEW) &&
-        t != (PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE) &&
-        t != (PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_NEW) &&
-        t != (PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE))
-        return;
-
-    pa_zero(entry);
-    entry.version = ENTRY_VERSION;
-
-    if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SINK) {
-        pa_sink *sink;
-
-        if (!(sink = pa_idxset_get_by_index(c->sinks, idx)))
-            return;
-
-        name = pa_sprintf_malloc("sink:%s", sink->name);
-
-        old = load_or_initialize_entry(u, &entry, name, "sink:");
-
-        pa_strlcpy(entry.description, pa_strnull(pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description));
-
-    } else {
-        pa_source *source;
-
-        pa_assert((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE);
-
-        if (!(source = pa_idxset_get_by_index(c->sources, idx)))
-            return;
-
-        if (source->monitor_of)
-            return;
-
-        name = pa_sprintf_malloc("source:%s", source->name);
-
-        old = load_or_initialize_entry(u, &entry, name, "source:");
-
-        pa_strlcpy(entry.description, pa_strnull(pa_proplist_gets(source->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description));
-    }
-
-    if (old) {
-
-        if (entries_equal(old, &entry)) {
-            pa_xfree(old);
-            pa_xfree(name);
-            return;
-        }
-
-        pa_xfree(old);
-    }
-
-    key.data = name;
-    key.size = strlen(name);
-
-    data.data = &entry;
-    data.size = sizeof(entry);
-
-    pa_log_info("Storing device %s.", name);
-
-    pa_database_set(u->database, &key, &data, TRUE);
-
-    pa_xfree(name);
-
-    trigger_save(u);
-}
-
-static pa_hook_result_t sink_new_hook_callback(pa_core *c, pa_sink_new_data *new_data, struct userdata *u) {
-    char *name;
-    struct entry *e;
-
-    pa_assert(c);
-    pa_assert(new_data);
-    pa_assert(u);
-
-    name = pa_sprintf_malloc("sink:%s", new_data->name);
-
-    if ((e = read_entry(u, name))) {
-        if (strncmp(e->description, pa_proplist_gets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION), sizeof(e->description)) != 0) {
-            pa_log_info("Restoring description for sink %s.", new_data->name);
-            pa_proplist_sets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description);
-        }
-
-        pa_xfree(e);
-    }
-
-    pa_xfree(name);
-
-    return PA_HOOK_OK;
-}
-
-static pa_hook_result_t source_new_hook_callback(pa_core *c, pa_source_new_data *new_data, struct userdata *u) {
-    char *name;
-    struct entry *e;
-
-    pa_assert(c);
-    pa_assert(new_data);
-    pa_assert(u);
-
-    name = pa_sprintf_malloc("source:%s", new_data->name);
-
-    if ((e = read_entry(u, name))) {
-        if (strncmp(e->description, pa_proplist_gets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION), sizeof(e->description)) != 0) {
-            /* NB, We cannot detect if we are a monitor here... this could mess things up a bit... */
-            pa_log_info("Restoring description for source %s.", new_data->name);
-            pa_proplist_sets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description);
-        }
-
-        pa_xfree(e);
-    }
-
-    pa_xfree(name);
-
-    return PA_HOOK_OK;
-}
-
-static char *get_name(const char *key, const char *prefix) {
-    char *t;
-
-    if (strncmp(key, prefix, strlen(prefix)))
-        return NULL;
-
-    t = pa_xstrdup(key + strlen(prefix));
-    return t;
-}
-
 static uint32_t get_role_index(const char* role) {
     pa_assert(role);
 
@@ -521,84 +398,6 @@ static void update_highest_priority_device_indexes(struct userdata *u, const cha
 }
 
 
-static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_new_data *new_data, struct userdata *u) {
-    pa_assert(c);
-    pa_assert(new_data);
-    pa_assert(u);
-
-    if (!u->do_routing)
-        return PA_HOOK_OK;
-
-    if (new_data->sink)
-        pa_log_debug("Not restoring device for stream, because already set.");
-    else {
-        const char *role;
-        uint32_t role_index;
-
-        if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE)))
-            role_index = get_role_index("");
-        else
-            role_index = get_role_index(role);
-
-        if (PA_INVALID_INDEX != role_index) {
-            uint32_t device_index;
-
-            device_index = u->preferred_sinks[role_index];
-            if (PA_INVALID_INDEX != device_index) {
-                pa_sink *sink;
-
-                if ((sink = pa_idxset_get_by_index(u->core->sinks, device_index))) {
-                    new_data->sink = sink;
-                    new_data->save_sink = TRUE;
-                }
-            }
-        }
-    }
-
-    return PA_HOOK_OK;
-}
-
-static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_output_new_data *new_data, struct userdata *u) {
-    pa_assert(c);
-    pa_assert(new_data);
-    pa_assert(u);
-
-    if (!u->do_routing)
-        return PA_HOOK_OK;
-
-    if (new_data->direct_on_input)
-        return PA_HOOK_OK;
-
-    if (new_data->source)
-        pa_log_debug("Not restoring device for stream, because already set");
-    else {
-        const char *role;
-        uint32_t role_index;
-
-        if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE)))
-            role_index = get_role_index("");
-        else
-            role_index = get_role_index(role);
-
-        if (PA_INVALID_INDEX != role_index) {
-            uint32_t device_index;
-
-            device_index = u->preferred_sources[role_index];
-            if (PA_INVALID_INDEX != device_index) {
-                pa_source *source;
-
-                if ((source = pa_idxset_get_by_index(u->core->sources, device_index))) {
-                    new_data->source = source;
-                    new_data->save_source = TRUE;
-                }
-            }
-        }
-    }
-
-    return PA_HOOK_OK;
-}
-
-
 static void route_sink_input(struct userdata *u, pa_sink_input *si) {
     const char *role;
     uint32_t role_index, device_index;
@@ -718,6 +517,238 @@ static pa_hook_result_t route_source_outputs(struct userdata *u, pa_source* igno
     return PA_HOOK_OK;
 }
 
+static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
+    struct userdata *u = userdata;
+    struct entry entry, *old = NULL;
+    char *name = NULL;
+    pa_datum key, data;
+
+    pa_assert(c);
+    pa_assert(u);
+
+    if (t != (PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_NEW) &&
+        t != (PA_SUBSCRIPTION_EVENT_SINK|PA_SUBSCRIPTION_EVENT_CHANGE) &&
+        t != (PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_NEW) &&
+        t != (PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_CHANGE) &&
+
+        /*t != (PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_NEW) &&*/
+        t != (PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE) &&
+        /*t != (PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_NEW) &&*/
+        t != (PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE))
+        return;
+
+    pa_zero(entry);
+    entry.version = ENTRY_VERSION;
+
+    if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SINK_INPUT) {
+        pa_sink_input *si;
+
+        if (!u->do_routing)
+            return;
+        if (!(si = pa_idxset_get_by_index(c->sink_inputs, idx)))
+            return;
+
+        /* The role may change mid-stream, so we reroute */
+        route_sink_input(u, si);
+
+        return;
+    } else if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT) {
+        pa_source_output *so;
+
+        if (!u->do_routing)
+            return;
+        if (!(so = pa_idxset_get_by_index(c->source_outputs, idx)))
+            return;
+
+        /* The role may change mid-stream, so we reroute */
+        route_source_output(u, so);
+
+        return;
+    } else if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SINK) {
+        pa_sink *sink;
+
+        if (!(sink = pa_idxset_get_by_index(c->sinks, idx)))
+            return;
+
+        name = pa_sprintf_malloc("sink:%s", sink->name);
+
+        old = load_or_initialize_entry(u, &entry, name, "sink:");
+
+        pa_strlcpy(entry.description, pa_strnull(pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description));
+
+    } else  if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE) {
+        pa_source *source;
+
+        pa_assert((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE);
+
+        if (!(source = pa_idxset_get_by_index(c->sources, idx)))
+            return;
+
+        if (source->monitor_of)
+            return;
+
+        name = pa_sprintf_malloc("source:%s", source->name);
+
+        old = load_or_initialize_entry(u, &entry, name, "source:");
+
+        pa_strlcpy(entry.description, pa_strnull(pa_proplist_gets(source->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description));
+    }
+
+    pa_assert(name);
+
+    if (old) {
+
+        if (entries_equal(old, &entry)) {
+            pa_xfree(old);
+            pa_xfree(name);
+            return;
+        }
+
+        pa_xfree(old);
+    }
+
+    key.data = name;
+    key.size = strlen(name);
+
+    data.data = &entry;
+    data.size = sizeof(entry);
+
+    pa_log_info("Storing device %s.", name);
+
+    pa_database_set(u->database, &key, &data, TRUE);
+
+    pa_xfree(name);
+
+    trigger_save(u);
+}
+
+static pa_hook_result_t sink_new_hook_callback(pa_core *c, pa_sink_new_data *new_data, struct userdata *u) {
+    char *name;
+    struct entry *e;
+
+    pa_assert(c);
+    pa_assert(new_data);
+    pa_assert(u);
+
+    name = pa_sprintf_malloc("sink:%s", new_data->name);
+
+    if ((e = read_entry(u, name))) {
+        if (strncmp(e->description, pa_proplist_gets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION), sizeof(e->description)) != 0) {
+            pa_log_info("Restoring description for sink %s.", new_data->name);
+            pa_proplist_sets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description);
+        }
+
+        pa_xfree(e);
+    }
+
+    pa_xfree(name);
+
+    return PA_HOOK_OK;
+}
+
+static pa_hook_result_t source_new_hook_callback(pa_core *c, pa_source_new_data *new_data, struct userdata *u) {
+    char *name;
+    struct entry *e;
+
+    pa_assert(c);
+    pa_assert(new_data);
+    pa_assert(u);
+
+    name = pa_sprintf_malloc("source:%s", new_data->name);
+
+    if ((e = read_entry(u, name))) {
+        if (strncmp(e->description, pa_proplist_gets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION), sizeof(e->description)) != 0) {
+            /* NB, We cannot detect if we are a monitor here... this could mess things up a bit... */
+            pa_log_info("Restoring description for source %s.", new_data->name);
+            pa_proplist_sets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description);
+        }
+
+        pa_xfree(e);
+    }
+
+    pa_xfree(name);
+
+    return PA_HOOK_OK;
+}
+
+static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_new_data *new_data, struct userdata *u) {
+    pa_assert(c);
+    pa_assert(new_data);
+    pa_assert(u);
+
+    if (!u->do_routing)
+        return PA_HOOK_OK;
+
+    if (new_data->sink)
+        pa_log_debug("Not restoring device for stream, because already set.");
+    else {
+        const char *role;
+        uint32_t role_index;
+
+        if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE)))
+            role_index = get_role_index("");
+        else
+            role_index = get_role_index(role);
+
+        if (PA_INVALID_INDEX != role_index) {
+            uint32_t device_index;
+
+            device_index = u->preferred_sinks[role_index];
+            if (PA_INVALID_INDEX != device_index) {
+                pa_sink *sink;
+
+                if ((sink = pa_idxset_get_by_index(u->core->sinks, device_index))) {
+                    new_data->sink = sink;
+                    new_data->save_sink = TRUE;
+                }
+            }
+        }
+    }
+
+    return PA_HOOK_OK;
+}
+
+static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_output_new_data *new_data, struct userdata *u) {
+    pa_assert(c);
+    pa_assert(new_data);
+    pa_assert(u);
+
+    if (!u->do_routing)
+        return PA_HOOK_OK;
+
+    if (new_data->direct_on_input)
+        return PA_HOOK_OK;
+
+    if (new_data->source)
+        pa_log_debug("Not restoring device for stream, because already set");
+    else {
+        const char *role;
+        uint32_t role_index;
+
+        if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE)))
+            role_index = get_role_index("");
+        else
+            role_index = get_role_index(role);
+
+        if (PA_INVALID_INDEX != role_index) {
+            uint32_t device_index;
+
+            device_index = u->preferred_sources[role_index];
+            if (PA_INVALID_INDEX != device_index) {
+                pa_source *source;
+
+                if ((source = pa_idxset_get_by_index(u->core->sources, device_index))) {
+                    new_data->source = source;
+                    new_data->save_source = TRUE;
+                }
+            }
+        }
+    }
+
+    return PA_HOOK_OK;
+}
+
+
 static pa_hook_result_t sink_put_hook_callback(pa_core *c, PA_GCC_UNUSED pa_sink *sink, struct userdata *u) {
     pa_assert(c);
     pa_assert(u);
@@ -1133,7 +1164,7 @@ int pa__init(pa_module*m) {
 
     u->connection_unlink_hook_slot = pa_hook_connect(&pa_native_protocol_hooks(u->protocol)[PA_NATIVE_HOOK_CONNECTION_UNLINK], PA_HOOK_NORMAL, (pa_hook_cb_t) connection_unlink_hook_cb, u);
 
-    u->subscription = pa_subscription_new(m->core, PA_SUBSCRIPTION_MASK_SINK|PA_SUBSCRIPTION_MASK_SOURCE, subscribe_callback, u);
+    u->subscription = pa_subscription_new(m->core, PA_SUBSCRIPTION_MASK_SINK|PA_SUBSCRIPTION_MASK_SOURCE|PA_SUBSCRIPTION_MASK_SINK_INPUT|PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT, subscribe_callback, u);
 
     /* Used to handle device description management */
     u->sink_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_NEW], PA_HOOK_EARLY, (pa_hook_cb_t) sink_new_hook_callback, u);

commit 4dedba73a6183fbc9eb51d0577a6dfd402f1e135
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Mon Sep 21 18:50:00 2009 +0100

    device-manager: Add a function to dump the database which we do whenever we save it (and on startup)

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 72b473c..baff560 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -55,7 +55,7 @@
 #include "module-device-manager-symdef.h"
 
 PA_MODULE_AUTHOR("Colin Guthrie");
-PA_MODULE_DESCRIPTION("Keep track of devices (and their descriptions) both past and present");
+PA_MODULE_DESCRIPTION("Keep track of devices (and their descriptions) both past and present and prioritise by role");
 PA_MODULE_VERSION(PACKAGE_VERSION);
 PA_MODULE_LOAD_ONCE(TRUE);
 PA_MODULE_USAGE(
@@ -64,6 +64,7 @@ PA_MODULE_USAGE(
     "on_rescue=<When device becomes unavailable, recheck streams?>");
 
 #define SAVE_INTERVAL (10 * PA_USEC_PER_SEC)
+#define DUMP_DATABASE
 
 static const char* const valid_modargs[] = {
     "do_routing",
@@ -135,20 +136,6 @@ enum {
     SUBCOMMAND_EVENT
 };
 
-static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) {
-    struct userdata *u = userdata;
-
-    pa_assert(a);
-    pa_assert(e);
-    pa_assert(u);
-
-    pa_assert(e == u->save_time_event);
-    u->core->mainloop->time_free(u->save_time_event);
-    u->save_time_event = NULL;
-
-    pa_database_sync(u->database);
-    pa_log_info("Synced.");
-}
 
 static struct entry* read_entry(struct userdata *u, const char *name) {
     pa_datum key, data;
@@ -190,6 +177,107 @@ fail:
     return NULL;
 }
 
+#ifdef DUMP_DATABASE
+static void dump_database_helper(struct userdata *u, uint32_t role_index, const char* human, pa_bool_t sink_mode) {
+    pa_assert(u);
+    pa_assert(human);
+
+    if (sink_mode) {
+        pa_sink *s;
+        if (PA_INVALID_INDEX != u->preferred_sinks[role_index] && (s = pa_idxset_get_by_index(u->core->sinks, u->preferred_sinks[role_index])))
+            pa_log_debug("   %s %s (%s)", human, pa_strnull(pa_proplist_gets(s->proplist, PA_PROP_DEVICE_DESCRIPTION)), s->name);
+        else
+            pa_log_debug("   %s No sink specified", human);
+    } else {
+        pa_source *s;
+        if (PA_INVALID_INDEX != u->preferred_sinks[role_index] && (s = pa_idxset_get_by_index(u->core->sinks, u->preferred_sinks[role_index])))
+            pa_log_debug("   %s %s (%s)", human, pa_strnull(pa_proplist_gets(s->proplist, PA_PROP_DEVICE_DESCRIPTION)), s->name);
+        else
+            pa_log_debug("   %s No source specified", human);
+    }
+}
+
+static void dump_database(struct userdata *u) {
+    pa_datum key;
+    pa_bool_t done;
+
+    pa_assert(u);
+
+    done = !pa_database_first(u->database, &key, NULL);
+
+    pa_log_debug("Dumping database");
+    while (!done) {
+        char *name;
+        struct entry *e;
+        pa_datum next_key;
+
+        done = !pa_database_next(u->database, &key, &next_key, NULL);
+
+        name = pa_xstrndup(key.data, key.size);
+
+        if ((e = read_entry(u, name))) {
+            pa_log_debug(" Got entry: %s", name);
+            pa_log_debug("  Description: %s", e->description);
+            pa_log_debug("  Priorities: None:   %3u, Video: %3u, Music:  %3u, Game: %3u, Event: %3u",
+                         e->priority[ROLE_NONE], e->priority[ROLE_VIDEO], e->priority[ROLE_MUSIC], e->priority[ROLE_GAME], e->priority[ROLE_EVENT]);
+            pa_log_debug("              Phone:  %3u, Anim:  %3u, Prodtn: %3u, A11y: %3u",
+                         e->priority[ROLE_PHONE], e->priority[ROLE_ANIMATION], e->priority[ROLE_PRODUCTION], e->priority[ROLE_A11Y]);
+            pa_xfree(e);
+        }
+
+        pa_xfree(name);
+
+        pa_datum_free(&key);
+        key = next_key;
+    }
+
+    pa_log_debug(" Highest priority devices per-role:");
+
+    pa_log_debug("  Sinks:");
+    dump_database_helper(u, ROLE_NONE, "None:  ", TRUE);
+    dump_database_helper(u, ROLE_NONE, "Video: ", TRUE);
+    dump_database_helper(u, ROLE_NONE, "Music: ", TRUE);
+    dump_database_helper(u, ROLE_NONE, "Game:  ", TRUE);
+    dump_database_helper(u, ROLE_NONE, "Event: ", TRUE);
+    dump_database_helper(u, ROLE_NONE, "Phone: ", TRUE);
+    dump_database_helper(u, ROLE_NONE, "Anim:  ", TRUE);
+    dump_database_helper(u, ROLE_NONE, "Prodtn:", TRUE);
+    dump_database_helper(u, ROLE_NONE, "Ally:  ", TRUE);
+
+    pa_log_debug("  Sources:");
+    dump_database_helper(u, ROLE_NONE, "None:  ", FALSE);
+    dump_database_helper(u, ROLE_NONE, "Video: ", FALSE);
+    dump_database_helper(u, ROLE_NONE, "Music: ", FALSE);
+    dump_database_helper(u, ROLE_NONE, "Game:  ", FALSE);
+    dump_database_helper(u, ROLE_NONE, "Event: ", FALSE);
+    dump_database_helper(u, ROLE_NONE, "Phone: ", FALSE);
+    dump_database_helper(u, ROLE_NONE, "Anim:  ", FALSE);
+    dump_database_helper(u, ROLE_NONE, "Prodtn:", FALSE);
+    dump_database_helper(u, ROLE_NONE, "Ally:  ", FALSE);
+
+    pa_log_debug("Completed database dump");
+}
+#endif
+
+static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) {
+    struct userdata *u = userdata;
+
+    pa_assert(a);
+    pa_assert(e);
+    pa_assert(u);
+
+    pa_assert(e == u->save_time_event);
+    u->core->mainloop->time_free(u->save_time_event);
+    u->save_time_event = NULL;
+
+    pa_database_sync(u->database);
+    pa_log_info("Synced.");
+
+#ifdef DUMP_DATABASE
+    dump_database(u);
+#endif
+}
+
 static void trigger_save(struct userdata *u) {
     pa_native_connection *c;
     uint32_t idx;
@@ -1210,6 +1298,10 @@ int pa__init(pa_module*m) {
     route_sink_inputs(u, NULL);
     route_source_outputs(u, NULL);
 
+#ifdef DUMP_DATABASE
+    dump_database(u);
+#endif
+
     pa_modargs_free(ma);
     return 0;
 

commit 8b2cc4def30327a72d95365c671d2adcae1a77a8
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sat Sep 26 14:36:36 2009 +0100

    device-manager: Expose the priority lists in the protocol extension.
    
    Also leave space for 'icon' and 'available' details too, althought currently this info is dummy.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index baff560..8a3a6f8 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -88,6 +88,18 @@ enum {
 
 typedef uint32_t role_indexes_t[NUM_ROLES];
 
+static const char* role_names[NUM_ROLES] = {
+    "none",
+    "video",
+    "music",
+    "game",
+    "event",
+    "phone",
+    "animation",
+    "production",
+    "a11y",
+};
+
 struct userdata {
     pa_core *core;
     pa_module *module;
@@ -234,26 +246,28 @@ static void dump_database(struct userdata *u) {
     pa_log_debug(" Highest priority devices per-role:");
 
     pa_log_debug("  Sinks:");
-    dump_database_helper(u, ROLE_NONE, "None:  ", TRUE);
-    dump_database_helper(u, ROLE_NONE, "Video: ", TRUE);
-    dump_database_helper(u, ROLE_NONE, "Music: ", TRUE);
-    dump_database_helper(u, ROLE_NONE, "Game:  ", TRUE);
-    dump_database_helper(u, ROLE_NONE, "Event: ", TRUE);
-    dump_database_helper(u, ROLE_NONE, "Phone: ", TRUE);
-    dump_database_helper(u, ROLE_NONE, "Anim:  ", TRUE);
-    dump_database_helper(u, ROLE_NONE, "Prodtn:", TRUE);
-    dump_database_helper(u, ROLE_NONE, "Ally:  ", TRUE);
+    for (uint32_t role = ROLE_NONE; role < NUM_ROLES; ++role) {
+        char name[13];
+        uint32_t len = PA_MAX(12u, strlen(role_names[role]));
+        for (int i = 0; i < 12; ++i) name[i] = ' ';
+        strncpy(name, role_names[role], len);
+        name[len] = ':';
+        name[0] -= 32;
+        name[12] = '\0';
+        dump_database_helper(u, role, name, TRUE);
+    }
 
     pa_log_debug("  Sources:");
-    dump_database_helper(u, ROLE_NONE, "None:  ", FALSE);
-    dump_database_helper(u, ROLE_NONE, "Video: ", FALSE);
-    dump_database_helper(u, ROLE_NONE, "Music: ", FALSE);
-    dump_database_helper(u, ROLE_NONE, "Game:  ", FALSE);
-    dump_database_helper(u, ROLE_NONE, "Event: ", FALSE);
-    dump_database_helper(u, ROLE_NONE, "Phone: ", FALSE);
-    dump_database_helper(u, ROLE_NONE, "Anim:  ", FALSE);
-    dump_database_helper(u, ROLE_NONE, "Prodtn:", FALSE);
-    dump_database_helper(u, ROLE_NONE, "Ally:  ", FALSE);
+    for (uint32_t role = ROLE_NONE; role < NUM_ROLES; ++role) {
+        char name[13];
+        uint32_t len = PA_MAX(12u, strlen(role_names[role]));
+        for (int i = 0; i < 12; ++i) name[i] = ' ';
+        strncpy(name, role_names[role], len);
+        name[len] = ':';
+        name[0] -= 32;
+        name[12] = '\0';
+        dump_database_helper(u, role, name, FALSE);
+    }
 
     pa_log_debug("Completed database dump");
 }
@@ -378,22 +392,10 @@ static uint32_t get_role_index(const char* role) {
 
     if (strcmp(role, "") == 0)
         return ROLE_NONE;
-    if (strcmp(role, "video") == 0)
-        return ROLE_VIDEO;
-    if (strcmp(role, "music") == 0)
-        return ROLE_MUSIC;
-    if (strcmp(role, "game") == 0)
-        return ROLE_GAME;
-    if (strcmp(role, "event") == 0)
-        return ROLE_EVENT;
-    if (strcmp(role, "phone") == 0)
-        return ROLE_PHONE;
-    if (strcmp(role, "animation") == 0)
-        return ROLE_ANIMATION;
-    if (strcmp(role, "production") == 0)
-        return ROLE_PRODUCTION;
-    if (strcmp(role, "a11y") == 0)
-        return ROLE_A11Y;
+    for (uint32_t i = ROLE_NONE; i < NUM_ROLES; ++i)
+        if (strcmp(role, role_names[i]) == 0)
+            return i;
+
     return PA_INVALID_INDEX;
 }
 
@@ -974,10 +976,18 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         pa_datum_free(&key);
 
         if ((e = read_entry(u, name))) {
-          pa_tagstruct_puts(reply, name);
-          pa_tagstruct_puts(reply, e->description);
+            pa_tagstruct_puts(reply, name);
+            pa_tagstruct_puts(reply, e->description);
+            pa_tagstruct_puts(reply, "audio-card"); /** @todo store the icon */
+            pa_tagstruct_put_boolean(reply, TRUE); /** @todo show current available */
+            pa_tagstruct_putu32(reply, NUM_ROLES);
+
+            for (uint32_t i = ROLE_NONE; i < NUM_ROLES; ++i) {
+                pa_tagstruct_puts(reply, role_names[i]);
+                pa_tagstruct_putu32(reply, e->priority[i]);
+            }
 
-          pa_xfree(e);
+            pa_xfree(e);
         }
 
         pa_xfree(name);
diff --git a/src/pulse/ext-device-manager.c b/src/pulse/ext-device-manager.c
index bc6301c..01e4594 100644
--- a/src/pulse/ext-device-manager.c
+++ b/src/pulse/ext-device-manager.c
@@ -26,6 +26,7 @@
 
 #include <pulse/context.h>
 #include <pulse/gccmacro.h>
+#include <pulse/xmalloc.h>
 
 #include <pulsecore/macro.h>
 #include <pulsecore/pstream-util.h>
@@ -128,20 +129,48 @@ static void ext_device_manager_read_cb(pa_pdispatch *pd, uint32_t command, uint3
 
         while (!pa_tagstruct_eof(t)) {
             pa_ext_device_manager_info i;
+            pa_bool_t available;
 
             memset(&i, 0, sizeof(i));
+            available = FALSE;
 
             if (pa_tagstruct_gets(t, &i.name) < 0 ||
-                pa_tagstruct_gets(t, &i.description) < 0) {
+                pa_tagstruct_gets(t, &i.description) < 0 ||
+                pa_tagstruct_gets(t, &i.icon) < 0 ||
+                pa_tagstruct_get_boolean(t, &available) < 0 ||
+                pa_tagstruct_getu32(t, &i.n_role_priorities) < 0) {
 
                 pa_context_fail(o->context, PA_ERR_PROTOCOL);
                 goto finish;
             }
+            i.available = (uint8_t)available;
+
+            if (i.n_role_priorities > 0) {
+                uint32_t j;
+                i.role_priorities = pa_xnew0(pa_ext_device_manager_role_priority_info, i.n_role_priorities+1);
+
+                for (j = 0; j < i.n_role_priorities; j++) {
+
+                    if (pa_tagstruct_gets(t, &i.role_priorities[j].role) < 0 ||
+                        pa_tagstruct_getu32(t, &i.role_priorities[j].priority) < 0) {
+
+                        pa_context_fail(o->context, PA_ERR_PROTOCOL);
+                        pa_xfree(i.role_priorities);
+                        goto finish;
+                    }
+                }
+
+                /* Terminate with an extra NULL entry, just to make sure */
+                i.role_priorities[j].role = NULL;
+                i.role_priorities[j].priority = 0;
+            }
 
             if (o->callback) {
                 pa_ext_device_manager_read_cb_t cb = (pa_ext_device_manager_read_cb_t) o->callback;
                 cb(o->context, &i, 0, o->userdata);
             }
+
+            pa_xfree(i.role_priorities);
         }
     }
 
diff --git a/src/pulse/ext-device-manager.h b/src/pulse/ext-device-manager.h
index 686c8d2..bd52331 100644
--- a/src/pulse/ext-device-manager.h
+++ b/src/pulse/ext-device-manager.h
@@ -33,11 +33,20 @@
 
 PA_C_DECL_BEGIN
 
+typedef struct pa_ext_device_manager_role_priority_info {
+    const char *role;
+    uint32_t priority;
+} pa_ext_device_manager_role_priority_info;
+
 /** Stores information about one device in the device database that is
  * maintained by module-device-manager. \since 0.9.19 */
 typedef struct pa_ext_device_manager_info {
     const char *name;            /**< Identifier string of the device. A string like "sink:" or similar followed by the name of the device. */
     const char *description;     /**< The description of the device when it was last seen, if applicable and saved */
+    const char *icon;            /**< The icon given to the device */
+    uint8_t available;           /**< Is the device currently available? */
+    uint32_t n_role_priorities;  /**< How many role priorities do we have? */
+    pa_ext_device_manager_role_priority_info *role_priorities; /**< An array of role priority structures or NULL */
 } pa_ext_device_manager_info;
 
 /** Callback prototype for pa_ext_device_manager_test(). \since 0.9.19 */

commit bbf67019df9a16fa27594054c0df222acd408b12
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 27 03:11:44 2009 +0100

    device-manager: Save icon and report current availability over protocol.
    
    This also ensures we let clients know whenver a sink changes in some capacity.
    Also correct some debug code.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 8a3a6f8..0764ad0 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -133,6 +133,7 @@ struct userdata {
 struct entry {
     uint8_t version;
     char description[PA_NAME_MAX];
+    char icon[PA_NAME_MAX];
     role_indexes_t priority;
 } PA_GCC_PACKED;
 
@@ -248,24 +249,20 @@ static void dump_database(struct userdata *u) {
     pa_log_debug("  Sinks:");
     for (uint32_t role = ROLE_NONE; role < NUM_ROLES; ++role) {
         char name[13];
-        uint32_t len = PA_MAX(12u, strlen(role_names[role]));
-        for (int i = 0; i < 12; ++i) name[i] = ' ';
+        uint32_t len = PA_MIN(12u, strlen(role_names[role]));
         strncpy(name, role_names[role], len);
-        name[len] = ':';
-        name[0] -= 32;
-        name[12] = '\0';
+        for (int i = len+1; i < 12; ++i) name[i] = ' ';
+        name[len] = ':'; name[0] -= 32; name[12] = '\0';
         dump_database_helper(u, role, name, TRUE);
     }
 
     pa_log_debug("  Sources:");
     for (uint32_t role = ROLE_NONE; role < NUM_ROLES; ++role) {
         char name[13];
-        uint32_t len = PA_MAX(12u, strlen(role_names[role]));
-        for (int i = 0; i < 12; ++i) name[i] = ' ';
+        uint32_t len = PA_MIN(12u, strlen(role_names[role]));
         strncpy(name, role_names[role], len);
-        name[len] = ':';
-        name[0] -= 32;
-        name[12] = '\0';
+        for (int i = len+1; i < 12; ++i) name[i] = ' ';
+        name[len] = ':'; name[0] -= 32; name[12] = '\0';
         dump_database_helper(u, role, name, FALSE);
     }
 
@@ -292,10 +289,13 @@ static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct
 #endif
 }
 
-static void trigger_save(struct userdata *u) {
+static void notify_subscribers(struct userdata *u) {
+
     pa_native_connection *c;
     uint32_t idx;
 
+    pa_assert(u);
+
     for (c = pa_idxset_first(u->subscribed, &idx); c; c = pa_idxset_next(u->subscribed, &idx)) {
         pa_tagstruct *t;
 
@@ -308,6 +308,13 @@ static void trigger_save(struct userdata *u) {
 
         pa_pstream_send_tagstruct(pa_native_connection_get_pstream(c), t);
     }
+}
+
+static void trigger_save(struct userdata *u) {
+
+    pa_assert(u);
+
+    notify_subscribers(u);
 
     if (u->save_time_event)
         return;
@@ -390,8 +397,6 @@ static inline struct entry *load_or_initialize_entry(struct userdata *u, struct
 static uint32_t get_role_index(const char* role) {
     pa_assert(role);
 
-    if (strcmp(role, "") == 0)
-        return ROLE_NONE;
     for (uint32_t i = ROLE_NONE; i < NUM_ROLES; ++i)
         if (strcmp(role, role_names[i]) == 0)
             return i;
@@ -510,7 +515,7 @@ static void route_sink_input(struct userdata *u, pa_sink_input *si) {
         return;
 
     if (!(role = pa_proplist_gets(si->proplist, PA_PROP_MEDIA_ROLE)))
-        role_index = get_role_index("");
+        role_index = get_role_index("none");
     else
         role_index = get_role_index(role);
 
@@ -571,7 +576,7 @@ static void route_source_output(struct userdata *u, pa_source_output *so) {
         return;
 
     if (!(role = pa_proplist_gets(so->proplist, PA_PROP_MEDIA_ROLE)))
-        role_index = get_role_index("");
+        role_index = get_role_index("none");
     else
         role_index = get_role_index(role);
 
@@ -665,6 +670,7 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3
         old = load_or_initialize_entry(u, &entry, name, "sink:");
 
         pa_strlcpy(entry.description, pa_strnull(pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description));
+        pa_strlcpy(entry.icon, pa_strnull(pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_ICON_NAME)), sizeof(entry.icon));
 
     } else  if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE) {
         pa_source *source;
@@ -682,6 +688,7 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3
         old = load_or_initialize_entry(u, &entry, name, "source:");
 
         pa_strlcpy(entry.description, pa_strnull(pa_proplist_gets(source->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description));
+        pa_strlcpy(entry.icon, pa_strnull(pa_proplist_gets(source->proplist, PA_PROP_DEVICE_ICON_NAME)), sizeof(entry.icon));
     }
 
     pa_assert(name);
@@ -691,6 +698,11 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3
         if (entries_equal(old, &entry)) {
             pa_xfree(old);
             pa_xfree(name);
+
+            /* Even if the entries are equal, the availability or otherwise
+               of the sink/source may have changed so we notify clients all the same */
+            notify_subscribers(u);
+
             return;
         }
 
@@ -976,10 +988,34 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         pa_datum_free(&key);
 
         if ((e = read_entry(u, name))) {
+            uint32_t idx;
+            char *devname;
+            pa_bool_t available = FALSE;
+
+            if ((devname = get_name(name, "sink:"))) {
+                pa_sink* s;
+                PA_IDXSET_FOREACH(s, u->core->sinks, idx) {
+                    if (strcmp(s->name, devname) == 0) {
+                        available = TRUE;
+                        break;
+                    }
+                }
+                pa_xfree(devname);
+            } else if ((devname = get_name(name, "source:"))) {
+                pa_source* s;
+                PA_IDXSET_FOREACH(s, u->core->sources, idx) {
+                    if (strcmp(s->name, devname) == 0) {
+                        available = TRUE;
+                        break;
+                    }
+                }
+                pa_xfree(devname);
+            }
+
             pa_tagstruct_puts(reply, name);
             pa_tagstruct_puts(reply, e->description);
-            pa_tagstruct_puts(reply, "audio-card"); /** @todo store the icon */
-            pa_tagstruct_put_boolean(reply, TRUE); /** @todo show current available */
+            pa_tagstruct_puts(reply, e->icon);
+            pa_tagstruct_put_boolean(reply, available);
             pa_tagstruct_putu32(reply, NUM_ROLES);
 
             for (uint32_t i = ROLE_NONE; i < NUM_ROLES; ++i) {

commit 8977abdc840989975d79d041ffcaf48804d7a52b
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sun Sep 27 16:55:31 2009 +0100

    device-manager: Don't notify clients on every subscription (it happens all the time).
    
    Also compare the entries fully before saving.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 0764ad0..89fb460 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -323,10 +323,18 @@ static void trigger_save(struct userdata *u) {
 }
 
 static pa_bool_t entries_equal(const struct entry *a, const struct entry *b) {
-    /** @todo: Compare the priority lists too */
-    if (strncmp(a->description, b->description, sizeof(a->description)))
+
+    pa_assert(a);
+    pa_assert(b);
+
+    if (strncmp(a->description, b->description, sizeof(a->description))
+        || strncmp(a->icon, b->icon, sizeof(a->icon)))
         return FALSE;
 
+    for (int i=0; i < NUM_ROLES; ++i)
+        if (a->priority[i] != b->priority[i])
+            return FALSE;
+
     return TRUE;
 }
 
@@ -699,10 +707,6 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3
             pa_xfree(old);
             pa_xfree(name);
 
-            /* Even if the entries are equal, the availability or otherwise
-               of the sink/source may have changed so we notify clients all the same */
-            notify_subscribers(u);
-
             return;
         }
 
@@ -857,6 +861,8 @@ static pa_hook_result_t sink_put_hook_callback(pa_core *c, PA_GCC_UNUSED pa_sink
     pa_assert(u->core == c);
     pa_assert(u->on_hotplug);
 
+    notify_subscribers(u);
+
     return route_sink_inputs(u, NULL);
 }
 
@@ -866,6 +872,8 @@ static pa_hook_result_t source_put_hook_callback(pa_core *c, PA_GCC_UNUSED pa_so
     pa_assert(u->core == c);
     pa_assert(u->on_hotplug);
 
+    notify_subscribers(u);
+
     return route_source_outputs(u, NULL);
 }
 
@@ -880,6 +888,8 @@ static pa_hook_result_t sink_unlink_hook_callback(pa_core *c, pa_sink *sink, str
     if (c->state == PA_CORE_SHUTDOWN)
         return PA_HOOK_OK;
 
+    notify_subscribers(u);
+
     return route_sink_inputs(u, sink);
 }
 
@@ -894,6 +904,8 @@ static pa_hook_result_t source_unlink_hook_callback(pa_core *c, pa_source *sourc
     if (c->state == PA_CORE_SHUTDOWN)
         return PA_HOOK_OK;
 
+    notify_subscribers(u);
+
     return route_source_outputs(u, source);
 }
 

commit f9b2d6500b75445b66c83ad1d6700e042f2f8d2a
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Thu Oct 1 01:27:02 2009 +0100

    device-manager: Change the prefer/defer options to a single 'reorder' command.
    
    We put in the devices from the wire into a hashmap and then add all like type device in the database
    and then order them based on priority (with the ones specified on the wire always being in that order at
    the top of the list.

diff --git a/src/map-file b/src/map-file
index d7b341d..3fc934c 100644
--- a/src/map-file
+++ b/src/map-file
@@ -144,11 +144,10 @@ pa_cvolume_set_fade;
 pa_cvolume_set_position;
 pa_cvolume_snprint;
 pa_cvolume_valid;
-pa_ext_device_manager_defer_device;
 pa_ext_device_manager_delete;
 pa_ext_device_manager_enable_role_device_priority_routing;
-pa_ext_device_manager_prefer_device;
 pa_ext_device_manager_read;
+pa_ext_device_manager_reorder_devices_for_role;
 pa_ext_device_manager_set_device_description;
 pa_ext_device_manager_set_subscribe_cb;
 pa_ext_device_manager_subscribe;
diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 89fb460..407d76d 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -143,8 +143,7 @@ enum {
     SUBCOMMAND_RENAME,
     SUBCOMMAND_DELETE,
     SUBCOMMAND_ROLE_DEVICE_PRIORITY_ROUTING,
-    SUBCOMMAND_PREFER_DEVICE,
-    SUBCOMMAND_DEFER_DEVICE,
+    SUBCOMMAND_REORDER,
     SUBCOMMAND_SUBSCRIBE,
     SUBCOMMAND_EVENT
 };
@@ -1121,115 +1120,174 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         break;
     }
 
-    case SUBCOMMAND_PREFER_DEVICE:
-    case SUBCOMMAND_DEFER_DEVICE: {
+    case SUBCOMMAND_REORDER: {
 
-        const char *role, *device;
+        const char *role;
         struct entry *e;
-        uint32_t role_index;
+        uint32_t role_index, n_devices;
+        pa_datum key, data;
+        pa_bool_t done, sink_mode = TRUE;
+        struct device_t { uint32_t prio; char *device; };
+        struct device_t *device;
+        struct device_t **devices;
+        uint32_t i, idx, offset;
+        pa_hashmap *h;
+        pa_bool_t first;
 
         if (pa_tagstruct_gets(t, &role) < 0 ||
-            pa_tagstruct_gets(t, &device) < 0)
-            goto fail;
-
-        if (!role || !device || !*device)
-            goto fail;
-
-        role_index = get_role_index(role);
-        if (PA_INVALID_INDEX == role_index)
+            pa_tagstruct_getu32(t, &n_devices) < 0 ||
+            n_devices < 1)
             goto fail;
 
-        if ((e = read_entry(u, device)) && ENTRY_VERSION == e->version) {
-            pa_datum key, data;
-            pa_bool_t done;
-            char* prefix = NULL;
-            uint32_t priority;
-            pa_bool_t haschanged = FALSE;
-
-            if (strncmp(device, "sink:", 5) == 0)
-                prefix = pa_xstrdup("sink:");
-            else if (strncmp(device, "source:", 7) == 0)
-                prefix = pa_xstrdup("source:");
+        if (PA_INVALID_INDEX == (role_index = get_role_index(role)))
+           goto fail;
+
+        /* Cycle through the devices given and make sure they exist */
+        h = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+        first = TRUE;
+        idx = 0;
+        for (i = 0; i < n_devices; ++i) {
+            const char *s;
+            if (pa_tagstruct_gets(t, &s) < 0) {
+                while ((device = pa_hashmap_steal_first(h))) {
+                    pa_xfree(device->device);
+                    pa_xfree(device);
+                }
 
-            if (!prefix)
+                pa_hashmap_free(h, NULL, NULL);
+                pa_log_error("Protocol error on reorder");
                 goto fail;
+            }
 
-            priority = e->priority[role_index];
+            /* Ensure this is a valid entry */
+            if (!(e = read_entry(u, s))) {
+                while ((device = pa_hashmap_steal_first(h))) {
+                    pa_xfree(device->device);
+                    pa_xfree(device);
+                }
 
-            /* Now we need to load up all the other entries of this type and shuffle the priroities around */
+                pa_hashmap_free(h, NULL, NULL);
+                pa_log_error("Client specified an unknown device in it's reorder list.");
+                goto fail;
+            }
+            pa_xfree(e);
 
-            done = !pa_database_first(u->database, &key, NULL);
+            if (first) {
+                first = FALSE;
+                sink_mode = (0 == strncmp("sink:", s, 5));
+            } else if ((sink_mode && 0 != strncmp("sink:", s, 5))
+                       || (!sink_mode && 0 != strncmp("source:", s, 7)))
+            {
+                while ((device = pa_hashmap_steal_first(h))) {
+                    pa_xfree(device->device);
+                    pa_xfree(device);
+                }
 
-            while (!done && !haschanged) {
-                pa_datum next_key;
+                pa_hashmap_free(h, NULL, NULL);
+                pa_log_error("Attempted to reorder mixed devices (sinks and sources)");
+                goto fail;
+            }
 
-                done = !pa_database_next(u->database, &key, &next_key, NULL);
+            /* Add the device to our hashmap. If it's alredy in it, free it now and carry on */
+            device = pa_xnew(struct device_t, 1);
+            device->device = pa_xstrdup(s);
+            if (pa_hashmap_put(h, device->device, device) == 0) {
+                device->prio = idx;
+                idx++;
+            } else {
+                pa_xfree(device->device);
+                pa_xfree(device);
+            }
+        }
 
-                /* Only read devices with the right prefix */
-                if (key.size > strlen(prefix) && strncmp(key.data, prefix, strlen(prefix)) == 0) {
-                    char *name;
-                    struct entry *e2;
+        /* Now cycle through our list and add all the devices.
+           This has the effect of addign in any in our DB,
+           not specified in the device list (and thus will be
+           tacked on at the end) */
+        offset = idx;
+        done = !pa_database_first(u->database, &key, NULL);
 
-                    name = pa_xstrndup(key.data, key.size);
+        while (!done && idx < 256) {
+            pa_datum next_key;
 
-                    if ((e2 = read_entry(u, name))) {
-                        if (SUBCOMMAND_PREFER_DEVICE == command) {
-                            /* PREFER */
-                            if (e2->priority[role_index] == (priority - 1)) {
-                                e2->priority[role_index]++;
-                                haschanged = TRUE;
-                            }
-                        } else {
-                            /* DEFER */
-                            if (e2->priority[role_index] == (priority + 1)) {
-                                e2->priority[role_index]--;
-                                haschanged = TRUE;
-                            }
-                        }
+            done = !pa_database_next(u->database, &key, &next_key, NULL);
 
-                        if (haschanged) {
-                            data.data = e2;
-                            data.size = sizeof(*e2);
+            device = pa_xnew(struct device_t, 1);
+            device->device = pa_xstrndup(key.data, key.size);
+            if ((sink_mode && 0 == strncmp("sink:", device->device, 5))
+                || (!sink_mode && 0 == strncmp("source:", device->device, 7))) {
+
+                /* Add the device to our hashmap. If it's alredy in it, free it now and carry on */
+                if (pa_hashmap_put(h, device->device, device) == 0
+                    && (e = read_entry(u, device->device)) && ENTRY_VERSION == e->version) {
+                    /* We add offset on to the existing priorirty so that when we order, the
+                       existing entries are always lower priority than the new ones. */
+                    device->prio = (offset + e->priority[role_index]);
+                    pa_xfree(e);
+                }
+                else {
+                    pa_xfree(device->device);
+                    pa_xfree(device);
+                }
+            } else {
+                pa_xfree(device->device);
+                pa_xfree(device);
+            }
 
-                            if (pa_database_set(u->database, &key, &data, TRUE))
-                                pa_log_warn("Could not save device");
-                        }
+            pa_datum_free(&key);
 
-                        pa_xfree(e2);
-                    }
+            key = next_key;
+        }
 
-                    pa_xfree(name);
+        /* Now we put all the entries in a simple list for sorting it. */
+        n_devices = pa_hashmap_size(h);
+        devices = pa_xnew(struct device_t *,  n_devices);
+        idx = 0;
+        while ((device = pa_hashmap_steal_first(h))) {
+            devices[idx++] = device;
+        }
+        pa_hashmap_free(h, NULL, NULL);
+
+        /* Simple bubble sort */
+        for (i = 0; i < n_devices; ++i) {
+            for (uint32_t j = i; j < n_devices; ++j) {
+                if (devices[i]->prio > devices[j]->prio) {
+                    struct device_t *tmp;
+                    tmp = devices[i];
+                    devices[i] = devices[j];
+                    devices[j] = tmp;
                 }
-
-                pa_datum_free(&key);
-                key = next_key;
             }
+        }
 
-            /* Now write out our actual entry */
-            if (haschanged) {
-                if (SUBCOMMAND_PREFER_DEVICE == command)
-                    e->priority[role_index]--;
-                else
-                    e->priority[role_index]++;
+        /* Go through in order and write the new entry and cleanup our own list */
+        i = 0; idx = 1;
+        first = TRUE;
+        for (i = 0; i < n_devices; ++i) {
+            if ((e = read_entry(u, devices[i]->device)) && ENTRY_VERSION == e->version) {
+                if (e->priority[role_index] != idx) {
+                    e->priority[role_index] = idx;
 
-                key.data = (char *) device;
-                key.size = strlen(device);
+                    key.data = (char *) devices[i]->device;
+                    key.size = strlen(devices[i]->device);
 
-                data.data = e;
-                data.size = sizeof(*e);
+                    data.data = e;
+                    data.size = sizeof(*e);
 
-                if (pa_database_set(u->database, &key, &data, TRUE))
-                    pa_log_warn("Could not save device");
+                    if (pa_database_set(u->database, &key, &data, TRUE) == 0) {
+                        first = FALSE;
+                        idx++;
+                    }
+                }
 
-                trigger_save(u);
+                pa_xfree(e);
             }
-
-            pa_xfree(e);
-
-            pa_xfree(prefix);
+            pa_xfree(devices[i]->device);
+            pa_xfree(devices[i]);
         }
-        else
-            pa_log_warn("Could not reorder device %s, no entry in database", device);
+
+        if (!first)
+            trigger_save(u);
 
         break;
     }
diff --git a/src/pulse/ext-device-manager.c b/src/pulse/ext-device-manager.c
index 01e4594..138ed83 100644
--- a/src/pulse/ext-device-manager.c
+++ b/src/pulse/ext-device-manager.c
@@ -43,8 +43,7 @@ enum {
     SUBCOMMAND_RENAME,
     SUBCOMMAND_DELETE,
     SUBCOMMAND_ROLE_DEVICE_PRIORITY_ROUTING,
-    SUBCOMMAND_PREFER_DEVICE,
-    SUBCOMMAND_DEFER_DEVICE,
+    SUBCOMMAND_REORDER,
     SUBCOMMAND_SUBSCRIBE,
     SUBCOMMAND_EVENT
 };
@@ -330,14 +329,14 @@ pa_operation *pa_ext_device_manager_enable_role_device_priority_routing(
     return o;
 }
 
-pa_operation *pa_ext_device_manager_prefer_device(
+pa_operation *pa_ext_device_manager_reorder_devices_for_role(
         pa_context *c,
         const char* role,
-        const char* device,
+        const char** devices,
         pa_context_success_cb_t cb,
         void *userdata) {
 
-    uint32_t tag;
+    uint32_t tag, i;
     pa_operation *o = NULL;
     pa_tagstruct *t = NULL;
 
@@ -349,52 +348,22 @@ pa_operation *pa_ext_device_manager_prefer_device(
     PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 14, PA_ERR_NOTSUPPORTED);
 
     pa_assert(role);
-    pa_assert(device);
+    pa_assert(devices);
 
     o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
 
     t = pa_tagstruct_command(c, PA_COMMAND_EXTENSION, &tag);
     pa_tagstruct_putu32(t, PA_INVALID_INDEX);
     pa_tagstruct_puts(t, "module-device-manager");
-    pa_tagstruct_putu32(t, SUBCOMMAND_PREFER_DEVICE);
+    pa_tagstruct_putu32(t, SUBCOMMAND_REORDER);
     pa_tagstruct_puts(t, role);
-    pa_tagstruct_puts(t, device);
-
-    pa_pstream_send_tagstruct(c->pstream, t);
-    pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
-
-    return o;
-}
-
-pa_operation *pa_ext_device_manager_defer_device(
-        pa_context *c,
-        const char* role,
-        const char* device,
-        pa_context_success_cb_t cb,
-        void *userdata) {
-
-    uint32_t tag;
-    pa_operation *o = NULL;
-    pa_tagstruct *t = NULL;
-
-    pa_assert(c);
-    pa_assert(PA_REFCNT_VALUE(c) >= 1);
-
-    PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
-    PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
-    PA_CHECK_VALIDITY_RETURN_NULL(c, c->version >= 14, PA_ERR_NOTSUPPORTED);
 
-    pa_assert(role);
-    pa_assert(device);
+    i = 0; while (devices[i]) i++;
+    pa_tagstruct_putu32(t, i);
 
-    o = pa_operation_new(c, NULL, (pa_operation_cb_t) cb, userdata);
-
-    t = pa_tagstruct_command(c, PA_COMMAND_EXTENSION, &tag);
-    pa_tagstruct_putu32(t, PA_INVALID_INDEX);
-    pa_tagstruct_puts(t, "module-device-manager");
-    pa_tagstruct_putu32(t, SUBCOMMAND_DEFER_DEVICE);
-    pa_tagstruct_puts(t, role);
-    pa_tagstruct_puts(t, device);
+    i = 0;
+    while (devices[i])
+        pa_tagstruct_puts(t, devices[i++]);
 
     pa_pstream_send_tagstruct(c->pstream, t);
     pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, pa_context_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
diff --git a/src/pulse/ext-device-manager.h b/src/pulse/ext-device-manager.h
index bd52331..13538f0 100644
--- a/src/pulse/ext-device-manager.h
+++ b/src/pulse/ext-device-manager.h
@@ -97,18 +97,10 @@ pa_operation *pa_ext_device_manager_enable_role_device_priority_routing(
         void *userdata);
 
 /** Prefer a given device in the priority list. \since 0.9.19 */
-pa_operation *pa_ext_device_manager_prefer_device(
+pa_operation *pa_ext_device_manager_reorder_devices_for_role(
         pa_context *c,
         const char* role,
-        const char* device,
-        pa_context_success_cb_t cb,
-        void *userdata);
-
-/** Defer a given device in the priority list. \since 0.9.19 */
-pa_operation *pa_ext_device_manager_defer_device(
-        pa_context *c,
-        const char* role,
-        const char* device,
+        const char** devices,
         pa_context_success_cb_t cb,
         void *userdata);
 

commit 7633bb8a290f1748d8953ce7558b80aa77084140
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Thu Oct 1 09:07:42 2009 +0100

    device-manager: Add extra debug messages

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 407d76d..00389b6 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -1132,6 +1132,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         struct device_t **devices;
         uint32_t i, idx, offset;
         pa_hashmap *h;
+        void *state;
         pa_bool_t first;
 
         if (pa_tagstruct_gets(t, &role) < 0 ||
@@ -1200,6 +1201,11 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
             }
         }
 
+        pa_log_debug("Hashmap contents (received from client)");
+        PA_HASHMAP_FOREACH(device, h, state) {
+            pa_log_debug("  - %s (%d)", device->device, device->prio);
+        }
+
         /* Now cycle through our list and add all the devices.
            This has the effect of addign in any in our DB,
            not specified in the device list (and thus will be
@@ -1239,6 +1245,11 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
             key = next_key;
         }
 
+        pa_log_debug("Hashmap contents (combined with database)");
+        PA_HASHMAP_FOREACH(device, h, state) {
+            pa_log_debug("  - %s (%d)", device->device, device->prio);
+        }
+
         /* Now we put all the entries in a simple list for sorting it. */
         n_devices = pa_hashmap_size(h);
         devices = pa_xnew(struct device_t *,  n_devices);
@@ -1260,8 +1271,13 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
             }
         }
 
+        pa_log_debug("Sorted device list");
+        for (i = 0; i < n_devices; ++i) {
+            pa_log_debug("  - %s (%d)", devices[i]->device, devices[i]->prio);
+        }
+
         /* Go through in order and write the new entry and cleanup our own list */
-        i = 0; idx = 1;
+        idx = 1;
         first = TRUE;
         for (i = 0; i < n_devices; ++i) {
             if ((e = read_entry(u, devices[i]->device)) && ENTRY_VERSION == e->version) {
@@ -1274,7 +1290,9 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
                     data.data = e;
                     data.size = sizeof(*e);
 
+                    pa_log_debug("Attempting to write record: %d. %s", e->priority[role_index], e->description);
                     if (pa_database_set(u->database, &key, &data, TRUE) == 0) {
+                        pa_log_debug("..... write successfull");
                         first = FALSE;
                         idx++;
                     }

commit b8a6436d4be0c78405b21dbf6ee192a527713388
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Thu Oct 1 20:13:38 2009 +0100

    device-manager: Fix the writing of the database when priority doesn't change.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 00389b6..6b815bd 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -1281,7 +1281,9 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         first = TRUE;
         for (i = 0; i < n_devices; ++i) {
             if ((e = read_entry(u, devices[i]->device)) && ENTRY_VERSION == e->version) {
-                if (e->priority[role_index] != idx) {
+                if (e->priority[role_index] == idx)
+                    idx++;
+                else {
                     e->priority[role_index] = idx;
 
                     key.data = (char *) devices[i]->device;

commit 3a20cf0b9f69e5f9b1012cc46b0918dd5f8173dd
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Thu Oct 1 21:30:24 2009 +0100

    device-manager: Misc fixes.
    
     * Fix a s/sink/source/ copy paste issue when dumping the database.
     * Only show priority list when routing is enabled (as the list is not updated if not)
     * Fix a memory access issue when finding the highest priority sinks/sources
     * key name->device name efficiency fix.
     * Silence noisy debug on reorder - it seems to work :)
     * Reroute after reordering.
     * Initialise preferred lists to PA_INVALID_INDEX

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 6b815bd..5b5b6ca 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -202,7 +202,7 @@ static void dump_database_helper(struct userdata *u, uint32_t role_index, const
             pa_log_debug("   %s No sink specified", human);
     } else {
         pa_source *s;
-        if (PA_INVALID_INDEX != u->preferred_sinks[role_index] && (s = pa_idxset_get_by_index(u->core->sinks, u->preferred_sinks[role_index])))
+        if (PA_INVALID_INDEX != u->preferred_sources[role_index] && (s = pa_idxset_get_by_index(u->core->sources, u->preferred_sources[role_index])))
             pa_log_debug("   %s %s (%s)", human, pa_strnull(pa_proplist_gets(s->proplist, PA_PROP_DEVICE_DESCRIPTION)), s->name);
         else
             pa_log_debug("   %s No source specified", human);
@@ -243,26 +243,28 @@ static void dump_database(struct userdata *u) {
         key = next_key;
     }
 
-    pa_log_debug(" Highest priority devices per-role:");
-
-    pa_log_debug("  Sinks:");
-    for (uint32_t role = ROLE_NONE; role < NUM_ROLES; ++role) {
-        char name[13];
-        uint32_t len = PA_MIN(12u, strlen(role_names[role]));
-        strncpy(name, role_names[role], len);
-        for (int i = len+1; i < 12; ++i) name[i] = ' ';
-        name[len] = ':'; name[0] -= 32; name[12] = '\0';
-        dump_database_helper(u, role, name, TRUE);
-    }
+    if (u->do_routing) {
+        pa_log_debug(" Highest priority devices per-role:");
+
+        pa_log_debug("  Sinks:");
+        for (uint32_t role = ROLE_NONE; role < NUM_ROLES; ++role) {
+            char name[13];
+            uint32_t len = PA_MIN(12u, strlen(role_names[role]));
+            strncpy(name, role_names[role], len);
+            for (int i = len+1; i < 12; ++i) name[i] = ' ';
+            name[len] = ':'; name[0] -= 32; name[12] = '\0';
+            dump_database_helper(u, role, name, TRUE);
+        }
 
-    pa_log_debug("  Sources:");
-    for (uint32_t role = ROLE_NONE; role < NUM_ROLES; ++role) {
-        char name[13];
-        uint32_t len = PA_MIN(12u, strlen(role_names[role]));
-        strncpy(name, role_names[role], len);
-        for (int i = len+1; i < 12; ++i) name[i] = ' ';
-        name[len] = ':'; name[0] -= 32; name[12] = '\0';
-        dump_database_helper(u, role, name, FALSE);
+        pa_log_debug("  Sources:");
+        for (uint32_t role = ROLE_NONE; role < NUM_ROLES; ++role) {
+            char name[13];
+            uint32_t len = PA_MIN(12u, strlen(role_names[role]));
+            strncpy(name, role_names[role], len);
+            for (int i = len+1; i < 12; ++i) name[i] = ' ';
+            name[len] = ':'; name[0] -= 32; name[12] = '\0';
+            dump_database_helper(u, role, name, FALSE);
+        }
     }
 
     pa_log_debug("Completed database dump");
@@ -427,7 +429,7 @@ static void update_highest_priority_device_indexes(struct userdata *u, const cha
         indexes = &u->preferred_sources;
 
     for (uint32_t i = 0; i < NUM_ROLES; ++i) {
-        *indexes[i] = PA_INVALID_INDEX;
+        (*indexes)[i] = PA_INVALID_INDEX;
     }
     pa_zero(highest_priority_available);
 
@@ -440,19 +442,19 @@ static void update_highest_priority_device_indexes(struct userdata *u, const cha
         done = !pa_database_next(u->database, &key, &next_key, NULL);
 
         if (key.size > strlen(prefix) && strncmp(key.data, prefix, strlen(prefix)) == 0) {
-            char *name;
+            char *name, *device_name;
             struct entry *e;
 
             name = pa_xstrndup(key.data, key.size);
+            device_name = get_name(name, prefix);
 
-            if ((e = read_entry(u, name))) {
+            if ((e = read_entry(u, name)) && ENTRY_VERSION == e->version) {
                 for (uint32_t i = 0; i < NUM_ROLES; ++i) {
-                    if (highest_priority_available[i] && e->priority[i] < highest_priority_available[i]) {
+                    if (!highest_priority_available[i] || e->priority[i] < highest_priority_available[i]) {
                         /* We've found a device with a higher priority than that we've currently got,
                            so see if it is currently available or not and update our list */
                         uint32_t idx;
                         pa_bool_t found = FALSE;
-                        char *device_name = get_name(name, prefix);
 
                         if (sink_mode) {
                             pa_sink *sink;
@@ -481,10 +483,9 @@ static void update_highest_priority_device_indexes(struct userdata *u, const cha
                         }
                         if (found) {
                             highest_priority_available[i] = e->priority[i];
-                            *indexes[i] = idx;
+                            (*indexes)[i] = idx;
                         }
 
-                        pa_xfree(device_name);
                     }
                 }
 
@@ -492,6 +493,7 @@ static void update_highest_priority_device_indexes(struct userdata *u, const cha
             }
 
             pa_xfree(name);
+            pa_xfree(device_name);
         }
 
         pa_datum_free(&key);
@@ -1132,7 +1134,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         struct device_t **devices;
         uint32_t i, idx, offset;
         pa_hashmap *h;
-        void *state;
+        /*void *state;*/
         pa_bool_t first;
 
         if (pa_tagstruct_gets(t, &role) < 0 ||
@@ -1201,10 +1203,10 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
             }
         }
 
-        pa_log_debug("Hashmap contents (received from client)");
+        /*pa_log_debug("Hashmap contents (received from client)");
         PA_HASHMAP_FOREACH(device, h, state) {
             pa_log_debug("  - %s (%d)", device->device, device->prio);
-        }
+        }*/
 
         /* Now cycle through our list and add all the devices.
            This has the effect of addign in any in our DB,
@@ -1245,10 +1247,10 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
             key = next_key;
         }
 
-        pa_log_debug("Hashmap contents (combined with database)");
+        /*pa_log_debug("Hashmap contents (combined with database)");
         PA_HASHMAP_FOREACH(device, h, state) {
             pa_log_debug("  - %s (%d)", device->device, device->prio);
-        }
+        }*/
 
         /* Now we put all the entries in a simple list for sorting it. */
         n_devices = pa_hashmap_size(h);
@@ -1271,10 +1273,10 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
             }
         }
 
-        pa_log_debug("Sorted device list");
+        /*pa_log_debug("Sorted device list");
         for (i = 0; i < n_devices; ++i) {
             pa_log_debug("  - %s (%d)", devices[i]->device, devices[i]->prio);
-        }
+        }*/
 
         /* Go through in order and write the new entry and cleanup our own list */
         idx = 1;
@@ -1292,9 +1294,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
                     data.data = e;
                     data.size = sizeof(*e);
 
-                    pa_log_debug("Attempting to write record: %d. %s", e->priority[role_index], e->description);
                     if (pa_database_set(u->database, &key, &data, TRUE) == 0) {
-                        pa_log_debug("..... write successfull");
                         first = FALSE;
                         idx++;
                     }
@@ -1306,9 +1306,15 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
             pa_xfree(devices[i]);
         }
 
-        if (!first)
+        if (!first) {
             trigger_save(u);
 
+            if (sink_mode)
+                route_sink_inputs(u, NULL);
+            else
+                route_source_outputs(u, NULL);
+        }
+
         break;
     }
 
@@ -1431,6 +1437,10 @@ int pa__init(pa_module*m) {
         subscribe_callback(m->core, PA_SUBSCRIPTION_EVENT_SOURCE|PA_SUBSCRIPTION_EVENT_NEW, source->index, u);
 
     /* Perform the routing (if it's enabled) which will update our priority list cache too */
+    for (uint32_t i = 0; i < NUM_ROLES; ++i) {
+        u->preferred_sinks[i] = u->preferred_sources[i] = PA_INVALID_INDEX;
+    }
+
     route_sink_inputs(u, NULL);
     route_source_outputs(u, NULL);
 

commit 20eedb24163884612c0fe81846ccf2983f336b7c
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Thu Oct 1 22:12:16 2009 +0100

    device-manager: Misc fixes to co-exist with other stream management/routing modules.
    
     * Do not read or set the save_sink/save_source flags. This seems to be for module-stream-restore only...
     * Even if a sink is already set by an earlier module, still move it to the sink we dictate.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 5b5b6ca..86ea95d 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -510,9 +510,6 @@ static void route_sink_input(struct userdata *u, pa_sink_input *si) {
     pa_assert(u);
     pa_assert(u->do_routing);
 
-    if (si->save_sink)
-        return;
-
     /* Skip this if it is already in the process of being moved anyway */
     if (!si->sink)
         return;
@@ -568,9 +565,6 @@ static void route_source_output(struct userdata *u, pa_source_output *so) {
     pa_assert(u);
     pa_assert(u->do_routing);
 
-    if (so->save_source)
-        return;
-
     if (so->direct_on_input)
         return;
 
@@ -779,6 +773,9 @@ static pa_hook_result_t source_new_hook_callback(pa_core *c, pa_source_new_data
 }
 
 static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_new_data *new_data, struct userdata *u) {
+    const char *role;
+    uint32_t role_index;
+
     pa_assert(c);
     pa_assert(new_data);
     pa_assert(u);
@@ -787,27 +784,22 @@ static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_n
         return PA_HOOK_OK;
 
     if (new_data->sink)
-        pa_log_debug("Not restoring device for stream, because already set.");
-    else {
-        const char *role;
-        uint32_t role_index;
+        pa_log_debug("Overriding device for stream, even although it is already set. I am evil that way...");
 
-        if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE)))
-            role_index = get_role_index("");
-        else
-            role_index = get_role_index(role);
+    if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE)))
+        role_index = get_role_index("none");
+    else
+        role_index = get_role_index(role);
 
-        if (PA_INVALID_INDEX != role_index) {
-            uint32_t device_index;
+    if (PA_INVALID_INDEX != role_index) {
+        uint32_t device_index;
 
-            device_index = u->preferred_sinks[role_index];
-            if (PA_INVALID_INDEX != device_index) {
-                pa_sink *sink;
+        device_index = u->preferred_sinks[role_index];
+        if (PA_INVALID_INDEX != device_index) {
+            pa_sink *sink;
 
-                if ((sink = pa_idxset_get_by_index(u->core->sinks, device_index))) {
-                    new_data->sink = sink;
-                    new_data->save_sink = TRUE;
-                }
+            if ((sink = pa_idxset_get_by_index(u->core->sinks, device_index))) {
+                new_data->sink = sink;
             }
         }
     }
@@ -816,6 +808,9 @@ static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_n
 }
 
 static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_output_new_data *new_data, struct userdata *u) {
+    const char *role;
+    uint32_t role_index;
+
     pa_assert(c);
     pa_assert(new_data);
     pa_assert(u);
@@ -827,27 +822,22 @@ static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_ou
         return PA_HOOK_OK;
 
     if (new_data->source)
-        pa_log_debug("Not restoring device for stream, because already set");
-    else {
-        const char *role;
-        uint32_t role_index;
+        pa_log_debug("Overriding device for stream, even although it is already set. I am evil that way...");
 
-        if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE)))
-            role_index = get_role_index("");
-        else
-            role_index = get_role_index(role);
+    if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE)))
+        role_index = get_role_index("none");
+    else
+        role_index = get_role_index(role);
 
-        if (PA_INVALID_INDEX != role_index) {
-            uint32_t device_index;
+    if (PA_INVALID_INDEX != role_index) {
+        uint32_t device_index;
 
-            device_index = u->preferred_sources[role_index];
-            if (PA_INVALID_INDEX != device_index) {
-                pa_source *source;
+        device_index = u->preferred_sources[role_index];
+        if (PA_INVALID_INDEX != device_index) {
+            pa_source *source;
 
-                if ((source = pa_idxset_get_by_index(u->core->sources, device_index))) {
-                    new_data->source = source;
-                    new_data->save_source = TRUE;
-                }
+            if ((source = pa_idxset_get_by_index(u->core->sources, device_index))) {
+                new_data->source = source;
             }
         }
     }

commit 42e28ce31c583ae9d431d2f1dd033d82cc63eb36
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Thu Oct 1 22:33:22 2009 +0100

    device-manager: Add some scripts that are only run under KDE to load/initialise module-device-manager with routing turned on.

diff --git a/src/Makefile.am b/src/Makefile.am
index 8ed7482..3f874f7 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -117,9 +117,11 @@ EXTRA_DIST = \
 		depmod.py \
 		daemon/esdcompat.in \
 		daemon/start-pulseaudio-x11.in \
+		daemon/start-pulseaudio-kde.in \
 		utils/padsp \
 		modules/module-defs.h.m4 \
 		daemon/pulseaudio.desktop.in \
+		daemon/pulseaudio-kde.desktop.in \
 		map-file \
 		daemon/pulseaudio-system.conf \
 		modules/alsa/mixer/profile-sets/default.conf \
@@ -153,7 +155,8 @@ dbuspolicy_DATA = \
 
 if HAVE_X11
 xdgautostart_in_files = \
-		daemon/pulseaudio.desktop.in
+		daemon/pulseaudio.desktop.in \
+		daemon/pulseaudio-kde.desktop.in
 endif
 xdgautostart_DATA = $(xdgautostart_in_files:.desktop.in=.desktop)
 @INTLTOOL_DESKTOP_RULE@
@@ -215,7 +218,7 @@ if HAVE_AVAHI
 bin_PROGRAMS += pabrowse
 endif
 
-bin_SCRIPTS = esdcompat start-pulseaudio-x11
+bin_SCRIPTS = esdcompat start-pulseaudio-x11 start-pulseaudio-kde
 
 pacat_SOURCES = utils/pacat.c
 pacat_LDADD = $(AM_LDADD) libpulse.la libpulsecommon- at PA_MAJORMINORMICRO@.la $(LIBSNDFILE_LIBS)
@@ -1711,7 +1714,7 @@ module_rygel_media_server_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS)
 #        Some minor stuff         #
 ###################################
 
-CLEANFILES = esdcompat client.conf default.pa system.pa daemon.conf start-pulseaudio-x11 daemon/pulseaudio.desktop
+CLEANFILES = esdcompat client.conf default.pa system.pa daemon.conf start-pulseaudio-x11 start-pulseaudio-kde daemon/pulseaudio.desktop daemon/pulseaudio-kde.desktop
 
 esdcompat: daemon/esdcompat.in Makefile
 	sed -e 's, at PACKAGE_VERSION\@,$(PACKAGE_VERSION),g' \
@@ -1724,6 +1727,11 @@ start-pulseaudio-x11: daemon/start-pulseaudio-x11.in Makefile
 		-e 's, at PACTL_BINARY\@,$(bindir)/pactl,g' < $< > $@
 	chmod +x start-pulseaudio-x11
 
+start-pulseaudio-kde: daemon/start-pulseaudio-kde.in Makefile
+	sed -e 's, at PA_BINARY\@,$(PA_BINARY),g' \
+		-e 's, at PACTL_BINARY\@,$(bindir)/pactl,g' < $< > $@
+	chmod +x start-pulseaudio-kde
+
 client.conf: pulse/client.conf.in Makefile
 	sed -e 's, at PA_BINARY\@,$(PA_BINARY),g' < $< > $@
 
diff --git a/src/daemon/pulseaudio-kde.desktop.in b/src/daemon/pulseaudio-kde.desktop.in
new file mode 100644
index 0000000..0684642
--- /dev/null
+++ b/src/daemon/pulseaudio-kde.desktop.in
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Encoding=UTF-8
+_Name=PulseAudio Sound System KDE Routing Policy
+_Comment=Start the PulseAudio Sound System with KDE Routing Policy
+Exec=start-pulseaudio-kde
+Terminal=false
+Type=Application
+Categories=
+GenericName=
+OnlyShowIn=KDE;
diff --git a/src/daemon/start-pulseaudio-kde.in b/src/daemon/start-pulseaudio-kde.in
new file mode 100755
index 0000000..a79a50b
--- /dev/null
+++ b/src/daemon/start-pulseaudio-kde.in
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+# 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.
+
+set -e
+
+[ -z "$PULSE_SERVER" ]
+
+ at PA_BINARY@ --start "$@"
+
+if [ x"$DISPLAY" != x ] ; then
+
+    @PACTL_BINARY@ load-module module-module-device-manager "do_routing=1" > /dev/null
+
+fi

commit 50db81c8603e1274b1bfe8836d134bf8ad6fb0a1
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Fri Oct 2 00:49:50 2009 +0100

    device-manager: Fix typo in module loading script.

diff --git a/src/daemon/start-pulseaudio-kde.in b/src/daemon/start-pulseaudio-kde.in
index a79a50b..c319e7d 100755
--- a/src/daemon/start-pulseaudio-kde.in
+++ b/src/daemon/start-pulseaudio-kde.in
@@ -25,6 +25,6 @@ set -e
 
 if [ x"$DISPLAY" != x ] ; then
 
-    @PACTL_BINARY@ load-module module-module-device-manager "do_routing=1" > /dev/null
+    @PACTL_BINARY@ load-module module-device-manager "do_routing=1" > /dev/null
 
 fi

commit a434f4c6af1ba421f8c689fa8bf9e040268205b2
Author: Jason Newton <nevion at gmail.com>
Date:   Wed Aug 26 01:15:49 2009 -0700

    module-equalizer-sink: resyncing with head and fix invalid writes
        * pa_log->debug for default equalizer notification
        * partially fixed infinite rewind bug
        * set max_request to window_size first iteration
        * swap order inside ROUND_UP calls
        * resync pa_sink_input_new changes
        * change pa_sample_clamp parameters to be correct to fix invalid writes
        * reenable proper reset logic + proper request size

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index f634d5e..f556be7 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -99,10 +99,10 @@ struct userdata {
               * the latency of the filter, calculated from window_size
               * based on constraints of COLA and window function
               */
-    size_t latency;//Really just R but made into it's own variable
     //for twiddling with pulseaudio
     size_t overlap_size;//window_size-R
     size_t samples_gathered;
+    size_t input_buffer_max;
     //message
     float *W;//windowing function (time domain)
     float *work_buffer, **input, **overlap_accum;
@@ -198,6 +198,34 @@ static int is_monotonic(const uint32_t *xs,size_t length){
     return 1;
 }
 
+//ensure's memory allocated is a multiple of v_size
+//and aligned
+static void * alloc(size_t x,size_t s){
+    size_t f = PA_ROUND_UP(x*s, sizeof(float)*v_size);
+    float *t;
+    pa_assert(f >= x*s);
+    t = fftwf_malloc(f);
+    memset(t, 0, f);
+    return t;
+}
+
+static void alloc_input_buffers(struct userdata *u, size_t min_buffer_length){
+    if(min_buffer_length <= u->input_buffer_max){
+        return;
+    }
+    pa_assert(min_buffer_length >= u->window_size);
+    for(size_t c = 0; c < u->channels; ++c){
+        float *tmp = alloc(min_buffer_length, sizeof(float));
+        if(u->input[c]){
+            if(!u->first_iteration){
+                memcpy(tmp, u->input[c], u->overlap_size * sizeof(float));
+            }
+            free(u->input[c]);
+        }
+        u->input[c] = tmp;
+    }
+    u->input_buffer_max = min_buffer_length;
+}
 
 /* Called from I/O thread context */
 static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
@@ -359,7 +387,7 @@ static void dsp_logic(
 
     //preseve the needed input for the next window's overlap
     memmove(src, src + u->R,
-        u->overlap_size * sizeof(float)
+        (u->samples_gathered - u->R) * sizeof(float)
     );
 }
 
@@ -470,71 +498,64 @@ typedef union float_vector {
 //}
 
 static void process_samples(struct userdata *u, pa_memchunk *tchunk){
-    size_t fs=pa_frame_size(&(u->sink->sample_spec));
+    size_t fs = pa_frame_size(&(u->sink->sample_spec));
     float *dst;
     unsigned a_i;
     float *H, X;
-    pa_assert(u->samples_gathered >= u->R);
+    size_t iterations, offset;
+    pa_assert(u->samples_gathered >= u->window_size);
+    iterations = (u->samples_gathered - u->overlap_size) / u->R;
     tchunk->index = 0;
-    tchunk->length = u->R * fs;
+    tchunk->length = iterations * u->R * fs;
     tchunk->memblock = pa_memblock_new(u->sink->core->mempool, tchunk->length);
-    dst = ((float*)pa_memblock_acquire(tchunk->memblock));
-
-    for(size_t c=0;c < u->channels; c++) {
-        a_i = pa_aupdate_read_begin(u->a_H[c]);
-        X = u->Xs[c][a_i];
-        H = u->Hs[c][a_i];
-        dsp_logic(
-            u->work_buffer,
-            u->input[c],
-            u->overlap_accum[c],
-            X,
-            H,
-            u->W,
-            u->output_window,
-            u
-        );
-        pa_aupdate_read_end(u->a_H[c]);
-        if(u->first_iteration){
-            /* The windowing function will make the audio ramped in, as a cheap fix we can
-             * undo the windowing (for non-zero window values)
-             */
-            for(size_t i = 0;i < u->overlap_size; ++i){
-                u->work_buffer[i] = u->W[i] <= FLT_EPSILON ? u->work_buffer[i] : u->work_buffer[i] / u->W[i];
+    dst = ((float*) pa_memblock_acquire(tchunk->memblock));
+    for(size_t iter = 0; iter < iterations; ++iter){
+        offset = iter * u->R * fs;
+        for(size_t c = 0;c < u->channels; c++) {
+            a_i = pa_aupdate_read_begin(u->a_H[c]);
+            X = u->Xs[c][a_i];
+            H = u->Hs[c][a_i];
+            dsp_logic(
+                u->work_buffer,
+                u->input[c],
+                u->overlap_accum[c],
+                X,
+                H,
+                u->W,
+                u->output_window,
+                u
+            );
+            pa_aupdate_read_end(u->a_H[c]);
+            if(u->first_iteration){
+                /* The windowing function will make the audio ramped in, as a cheap fix we can
+                 * undo the windowing (for non-zero window values)
+                 */
+                for(size_t i = 0; i < u->overlap_size; ++i){
+                    u->work_buffer[i] = u->W[i] <= FLT_EPSILON ? u->work_buffer[i] : u->work_buffer[i] / u->W[i];
+                }
             }
+            pa_sample_clamp(PA_SAMPLE_FLOAT32NE, (uint8_t *) (dst + c) + offset, fs, u->work_buffer, sizeof(float), u->R);
         }
-        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, dst + c, fs, u->work_buffer, sizeof(float), u->R);
+        if(u->first_iteration){
+            u->first_iteration = FALSE;
+        }
+        u->samples_gathered -= u->R;
     }
     pa_memblock_release(tchunk->memblock);
-    u->samples_gathered -= u->R;
-}
-
-static void initialize_buffer(struct userdata *u, pa_memchunk *in){
-    size_t fs = pa_frame_size(&u->sink->sample_spec);
-    size_t samples = in->length / fs;
-    float *src = (float*) ((uint8_t*) pa_memblock_acquire(in->memblock) + in->index);
-    pa_assert_se(u->samples_gathered + samples <= u->window_size);
-    for(size_t c = 0; c < u->channels; c++) {
-        //buffer with an offset after the overlap from previous
-        //iterations
-        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, u->input[c] + u->samples_gathered, sizeof(float), src + c, fs, samples);
-    }
-    u->samples_gathered += samples;
-    pa_memblock_release(in->memblock);
 }
 
 static void input_buffer(struct userdata *u, pa_memchunk *in){
     size_t fs = pa_frame_size(&(u->sink->sample_spec));
     size_t samples = in->length/fs;
     float *src = (float*) ((uint8_t*) pa_memblock_acquire(in->memblock) + in->index);
-    pa_assert_se(samples <= u->window_size - u->samples_gathered);
+    pa_assert(u->samples_gathered + samples <= u->input_buffer_max);
     for(size_t c = 0; c < u->channels; c++) {
         //buffer with an offset after the overlap from previous
         //iterations
         pa_assert_se(
-            u->input[c]+u->samples_gathered+samples <= u->input[c]+u->window_size
+            u->input[c] + u->samples_gathered + samples <= u->input[c] + u->input_buffer_max
         );
-        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, u->input[c]+u->samples_gathered, sizeof(float), src + c, fs, samples);
+        pa_sample_clamp(PA_SAMPLE_FLOAT32NE, u->input[c] + u->samples_gathered, sizeof(float), src + c, fs, samples);
     }
     u->samples_gathered += samples;
     pa_memblock_release(in->memblock);
@@ -543,7 +564,7 @@ static void input_buffer(struct userdata *u, pa_memchunk *in){
 /* Called from I/O thread context */
 static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) {
     struct userdata *u;
-    size_t fs;
+    size_t fs, target_samples;
     struct timeval start, end;
     pa_memchunk tchunk;
     pa_sink_input_assert_ref(i);
@@ -551,6 +572,16 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     pa_assert(chunk);
     pa_assert(u->sink);
     fs = pa_frame_size(&(u->sink->sample_spec));
+    target_samples = PA_ROUND_UP(nbytes / fs, u->R);
+    if(u->first_iteration){
+        //allocate request_size
+        target_samples = PA_MAX(target_samples, u->window_size);
+    }else{
+        //allocate request_size + overlap
+        target_samples += u->overlap_size;
+        alloc_input_buffers(u, target_samples);
+    }
+    alloc_input_buffers(u, target_samples);
     chunk->memblock = NULL;
 
     /* Hmm, process any rewind request that might be queued up */
@@ -559,18 +590,11 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     //pa_log_debug("start output-buffered %ld, input-buffered %ld, requested %ld",buffered_samples,u->samples_gathered,samples_requested);
     pa_rtclock_get(&start);
     do{
-        size_t input_remaining = u->window_size - u->samples_gathered;
+        size_t input_remaining = target_samples - u->samples_gathered;
         pa_assert(input_remaining > 0);
-        //collect samples
-
-        //buffer = &u->conv_buffer;
-        //buffer->length = input_remaining*fs;
-        //buffer->index = 0;
-        //pa_memblock_ref(buffer->memblock);
-        //pa_sink_render_into(u->sink, buffer);
         while(pa_memblockq_peek(u->input_q, &tchunk) < 0){
-            pa_sink_render(u->sink, input_remaining*fs, &tchunk);
-            //pa_sink_render_full(u->sink, input_remaining*fs, &tchunk);
+            //pa_sink_render(u->sink, input_remaining * fs, &tchunk);
+            pa_sink_render_full(u->sink, input_remaining * fs, &tchunk);
             pa_assert(tchunk.memblock);
             pa_memblockq_push(u->input_q, &tchunk);
             pa_memblock_unref(tchunk.memblock);
@@ -581,15 +605,12 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         //pa_log_debug("asked for %ld input samples, got %ld samples",input_remaining,buffer->length/fs);
         /* copy new input */
         //pa_rtclock_get(start);
-        if(u->first_iteration){
-            initialize_buffer(u, &tchunk);
-        }else{
-            input_buffer(u, &tchunk);
-        }
+        input_buffer(u, &tchunk);
         //pa_rtclock_get(&end);
         //pa_log_debug("Took %0.5f seconds to setup", pa_timeval_diff(end, start) / (double) PA_USEC_PER_SEC);
         pa_memblock_unref(tchunk.memblock);
-    }while(u->samples_gathered < u->window_size);
+    }while(u->samples_gathered < target_samples);
+
     pa_rtclock_get(&end);
     pa_log_debug("Took %0.6f seconds to get data", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
 
@@ -605,9 +626,6 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     pa_assert(chunk->memblock);
     //pa_log_debug("gave %ld", chunk->length/fs);
     //pa_log_debug("end pop");
-    if(u->first_iteration){
-        u->first_iteration = FALSE;
-    }
     return 0;
 }
 
@@ -632,11 +650,17 @@ static void sink_input_mute_changed_cb(pa_sink_input *i) {
 }
 
 static void reset_filter(struct userdata *u){
+    size_t fs = pa_frame_size(&u->sink->sample_spec);
+    size_t max_request;
     u->samples_gathered = 0;
-    for(size_t i = 0;i < u->channels; ++i){
+    for(size_t i = 0; i < u->channels; ++i){
         memset(u->overlap_accum[i], 0, u->overlap_size * sizeof(float));
     }
     u->first_iteration = TRUE;
+    //set buffer size to max request, no overlap copy
+    max_request = PA_ROUND_UP(pa_sink_input_get_max_request(u->sink_input) / fs , u->R);
+    max_request = PA_MAX(max_request, u->window_size);
+    pa_sink_set_max_request_within_thread(u->sink, max_request * fs);
 }
 
 /* Called from I/O thread context */
@@ -658,11 +682,8 @@ static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
         u->sink->thread_info.rewind_nbytes = 0;
 
         if (amount > 0) {
-            //pa_sample_spec *ss = &u->sink->sample_spec;
             //invalidate the output q
             pa_memblockq_seek(u->input_q, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
-            //pa_memblockq_drop(u->input_q, pa_memblockq_get_length(u->input_q));
-            //pa_memblockq_seek(u->input_q, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
             pa_log("Resetting filter");
             reset_filter(u);
         }
@@ -689,11 +710,11 @@ static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) {
     size_t fs;
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
-
+    //if(u->first_iteration){
+    //    return;
+    //}
     fs = pa_frame_size(&(u->sink->sample_spec));
-    //pa_sink_set_max_request_within_thread(u->sink, nbytes);
-    //pa_sink_set_max_request_within_thread(u->sink, u->R*fs);
-    pa_sink_set_max_request_within_thread(u->sink, ((nbytes+u->R*fs-1)/(u->R*fs))*(u->R*fs));
+    pa_sink_set_max_request_within_thread(u->sink, PA_ROUND_UP(nbytes / fs, u->R) * fs);
 }
 
 /* Called from I/O thread context */
@@ -703,8 +724,6 @@ static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) {
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
 
-    //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->latency*fs);
-    //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->latency*fs );
     pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
 }
 
@@ -733,7 +752,7 @@ static void sink_input_detach_cb(pa_sink_input *i) {
 /* Called from I/O thread context */
 static void sink_input_attach_cb(pa_sink_input *i) {
     struct userdata *u;
-    size_t fs;
+    size_t fs, max_request;
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
 
@@ -741,19 +760,15 @@ static void sink_input_attach_cb(pa_sink_input *i) {
     pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
 
     pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
-    fs = pa_frame_size(&(u->sink->sample_spec));
-    pa_sink_set_max_request_within_thread(u->sink, PA_ROUND_UP(pa_sink_input_get_max_request(i), u->R*fs));
-
-    //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->latency*fs);
-    //pa_sink_set_latency_range_within_thread(u->sink, u->latency*fs, u->master->thread_info.max_latency);
-    //TODO: setting this guy minimizes drop outs but doesn't get rid
-    //of them completely, figure out why
-    //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->latency*fs);
-    //TODO: this guy causes dropouts constantly+rewinds, it's unusable
-    //pa_sink_set_latency_range_within_thread(u->sink, u->master->thread_info.min_latency, u->master->thread_info.max_latency);
+    fs = pa_frame_size(&u->sink->sample_spec);
+    //set buffer size to max request, no overlap copy
+    max_request = PA_ROUND_UP(pa_sink_input_get_max_request(u->sink_input) / fs , u->R);
+    max_request = PA_MAX(max_request, u->window_size);
+    pa_sink_set_max_request_within_thread(u->sink, max_request * fs);
+    pa_sink_set_max_rewind_within_thread(u->sink, pa_sink_input_get_max_rewind(i));
     pa_sink_attach_within_thread(u->sink);
     if(u->set_default){
-        pa_log("Setting default sink to %s", u->sink->name);
+        pa_log_debug("Setting default sink to %s", u->sink->name);
         pa_namereg_set_default_sink(u->module->core, u->sink);
     }
 }
@@ -1005,17 +1020,6 @@ static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) {
         pa_sink_set_asyncmsgq(u->sink, NULL);
 }
 
-//ensure's memory allocated is a multiple of v_size
-//and aligned
-static void * alloc(size_t x,size_t s){
-    size_t f = PA_ROUND_UP(x*s, sizeof(float)*v_size);
-    float *t;
-    pa_assert(f >= x*s);
-    t = fftwf_malloc(f);
-    memset(t, 0, f);
-    return t;
-}
-
 int pa__init(pa_module*m) {
     struct userdata *u;
     pa_sample_spec ss;
@@ -1068,15 +1072,15 @@ int pa__init(pa_module*m) {
     u->R = (u->window_size + 1) / 2;
     u->overlap_size = u->window_size - u->R;
     u->samples_gathered = 0;
+    u->input_buffer_max = 0;
     u->a_H = pa_xnew0(pa_aupdate *, u->channels);
-    u->latency = u->window_size - u->R;
     u->Xs = pa_xnew0(float *, u->channels);
     u->Hs = pa_xnew0(float **, u->channels);
     for(size_t c = 0; c < u->channels; ++c){
         u->Xs[c] = pa_xnew0(float, 2);
         u->Hs[c] = pa_xnew0(float *, 2);
         for(size_t i = 0; i < 2; ++i){
-            u->Hs[c][i] = alloc((FILTER_SIZE), sizeof(float));
+            u->Hs[c][i] = alloc(FILTER_SIZE, sizeof(float));
         }
     }
     u->W = alloc(u->window_size, sizeof(float));
@@ -1086,8 +1090,7 @@ int pa__init(pa_module*m) {
     u->overlap_accum = pa_xnew0(float *, u->channels);
     for(size_t c = 0; c < u->channels; ++c){
         u->a_H[c] = pa_aupdate_new();
-        u->input[c] = alloc(u->window_size, sizeof(float));
-        memset(u->input[c], 0, (u->window_size)*sizeof(float));
+        u->input[c] = NULL;
         u->overlap_accum[c] = alloc(u->overlap_size, sizeof(float));
         memset(u->overlap_accum[c], 0, u->overlap_size*sizeof(float));
     }
@@ -1151,7 +1154,7 @@ int pa__init(pa_module*m) {
     pa_sink_input_new_data_set_sample_spec(&sink_input_data, &ss);
     pa_sink_input_new_data_set_channel_map(&sink_input_data, &map);
 
-    pa_sink_input_new(&u->sink_input, m->core, &sink_input_data, 0);
+    pa_sink_input_new(&u->sink_input, m->core, &sink_input_data);
     pa_sink_input_new_data_done(&sink_input_data);
 
     if (!u->sink_input)

commit 97056d2a0e4364fad86f4be5e26625592aef3d55
Author: Jason Newton <nevion at gmail.com>
Date:   Fri Sep 18 05:48:01 2009 -0700

    module-equalizer-sink: *added client initiated sync support for filter state *added note of possible unstable behavior with next-power-of-2 sample rate calculation

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index f556be7..74d7497 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -837,13 +837,10 @@ static void unpack(char *str, size_t length, char ***strs, size_t *len){
         size_t l = *((uint16_t *)(str+offset));
         size_t e = PA_MIN(offset + l, length) - offset;
         offset = PA_MIN(offset + sizeof(uint16_t), length);
-        if(e > 0){
-            (*strs)[i] = pa_xnew(char, e + 1);
-            memcpy((*strs)[i], strs + offset, e);
-            (*strs)[i][e] = '\0';
-        }else{
-            (*strs)[i]=NULL;
-        }
+        (*strs)[i] = pa_xnew(char, e + 1);
+        memcpy((*strs)[i], str + offset, e);
+        (*strs)[i][e] = '\0';
+        offset += l;
     }
 }
 static void save_profile(struct userdata *u, size_t channel, char *name){
@@ -905,7 +902,7 @@ static void save_state(struct userdata *u){
     data.data = state;
     data.size = filter_state_size + packed_length;
     //thread safety for 0.9.17?
-    pa_assert_se(dbname = pa_state_path(EQ_STATE_DB, TRUE));
+    pa_assert_se(dbname = pa_state_path(EQ_STATE_DB, FALSE));
     pa_assert_se(database = pa_database_open(dbname, TRUE));
     pa_xfree(dbname);
 
@@ -936,12 +933,10 @@ static const char* load_profile(struct userdata *u, size_t channel, char *name){
             float *profile = (float *) value.data;
             a_i = pa_aupdate_write_begin(u->a_H[channel]);
             u->Xs[channel][a_i] = profile[0];
-            memcpy(u->Hs[channel][a_i], profile + 1, CHANNEL_PROFILE_SIZE * sizeof(float));
+            memcpy(u->Hs[channel][a_i], profile + 1, FILTER_SIZE * sizeof(float));
             fix_filter(u->Hs[channel][a_i], u->fft_size);
             pa_aupdate_write_end(u->a_H[channel]);
-            if(u->base_profiles[channel]){
-                pa_xfree(u->base_profiles[channel]);
-            }
+            pa_xfree(u->base_profiles[channel]);
             u->base_profiles[channel] = pa_xstrdup(name);
         }else{
             return "incompatible size";
@@ -964,6 +959,7 @@ static void load_state(struct userdata *u){
     database = pa_database_open(dbname, FALSE);
     pa_xfree(dbname);
     if(!database){
+        pa_log("No resume state");
         return;
     }
 
@@ -985,14 +981,14 @@ static void load_state(struct userdata *u){
             unpack(((char *)value.data) + FILTER_STATE_SIZE, value.size - FILTER_STATE_SIZE, &names, &n_profs);
             n_profs = PA_MIN(n_profs, u->channels);
             for(size_t c = 0; c < n_profs; ++c){
-                if(u->base_profiles[c]){
-                    pa_xfree(u->base_profiles[c]);
-                }
+                pa_xfree(u->base_profiles[c]);
                 u->base_profiles[c] = names[c];
             }
             pa_xfree(names);
         }
         pa_datum_free(&value);
+    }else{
+        pa_log("resume state exists but is wrong size!");
     }
     pa_database_close(database);
 }
@@ -1066,7 +1062,7 @@ int pa__init(pa_module*m) {
     pa_modargs_get_value_boolean(ma, "set_default", &u->set_default);
 
     u->channels = ss.channels;
-    u->fft_size = pow(2, ceil(log(ss.rate)/log(2)));
+    u->fft_size = pow(2, ceil(log(ss.rate)/log(2)));//probably unstable near corner cases of powers of 2
     pa_log_debug("fft size: %ld", u->fft_size);
     u->window_size = 15999;
     u->R = (u->window_size + 1) / 2;
@@ -1102,6 +1098,9 @@ int pa__init(pa_module*m) {
     u->first_iteration = TRUE;
 
     u->base_profiles = pa_xnew0(char *, u->channels);
+    for(size_t c = 0; c < u->channels; ++c){
+        u->base_profiles[c] = pa_xstrdup("default");
+    }
 
     /* Create sink */
     pa_sink_new_data_init(&sink_data);
@@ -1233,9 +1232,7 @@ void pa__done(pa_module*m) {
     dbus_done(u);
 
     for(size_t c = 0; c < u->channels; ++c){
-        if(u->base_profiles[c]){
-            pa_xfree(u->base_profiles[c]);
-        }
+        pa_xfree(u->base_profiles[c]);
     }
     pa_xfree(u->base_profiles);
 
@@ -1308,6 +1305,7 @@ static void equalizer_handle_get_filter(DBusConnection *conn, DBusMessage *msg,
 static void equalizer_handle_set_filter(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_handle_save_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void *_u);
+static void equalizer_handle_save_state(DBusConnection *conn, DBusMessage *msg, void *_u);
 static void equalizer_handle_get_profile_name(DBusConnection *conn, DBusMessage *msg, void *_u);
 enum manager_method_index {
     MANAGER_METHOD_REMOVE_PROFILE,
@@ -1374,6 +1372,7 @@ enum equalizer_method_index {
     EQUALIZER_METHOD_LOAD_PROFILE,
     EQUALIZER_METHOD_SET_FILTER,
     EQUALIZER_METHOD_GET_FILTER,
+    EQUALIZER_METHOD_SAVE_STATE,
     EQUALIZER_METHOD_GET_PROFILE_NAME,
     EQUALIZER_METHOD_MAX
 };
@@ -1455,6 +1454,11 @@ static pa_dbus_method_handler equalizer_methods[EQUALIZER_METHOD_MAX]={
         .arguments=load_profile_args,
         .n_arguments=sizeof(load_profile_args)/sizeof(pa_dbus_arg_info),
         .receive_cb=equalizer_handle_load_profile},
+    [EQUALIZER_METHOD_SAVE_STATE]{
+        .method_name="SaveState",
+        .arguments=NULL,
+        .n_arguments=0,
+        .receive_cb=equalizer_handle_save_state},
     [EQUALIZER_METHOD_GET_PROFILE_NAME]{
         .method_name="BaseProfile",
         .arguments=base_profile_name_args,
@@ -2037,6 +2041,16 @@ void equalizer_handle_load_profile(DBusConnection *conn, DBusMessage *msg, void
     dbus_message_unref(signal);
 }
 
+void equalizer_handle_save_state(DBusConnection *conn, DBusMessage *msg, void *_u) {
+    struct userdata *u = (struct userdata *) _u;
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(u);
+
+    save_state(u);
+    pa_dbus_send_empty_reply(conn, msg);
+}
+
 void equalizer_handle_get_profile_name(DBusConnection *conn, DBusMessage *msg, void *_u){
     struct userdata *u = (struct userdata *) _u;
     DBusError error;
@@ -2060,11 +2074,8 @@ void equalizer_handle_get_profile_name(DBusConnection *conn, DBusMessage *msg, v
         return;
     }
     r_channel = channel == u->channels ? 0 : channel;
-    if(u->base_profiles[r_channel]){
-        pa_dbus_send_basic_value_reply(conn,msg, DBUS_TYPE_STRING, &u->base_profiles[r_channel]);
-    }else{
-        pa_dbus_send_empty_reply(conn, msg);
-    }
+    pa_assert(u->base_profiles[r_channel]);
+    pa_dbus_send_basic_value_reply(conn,msg, DBUS_TYPE_STRING, &u->base_profiles[r_channel]);
 }
 
 void equalizer_get_revision(DBusConnection *conn, DBusMessage *msg, void *_u){

commit e8952001699317952318918835252f63c7a899f9
Author: Jason Newton <nevion at gmail.com>
Date:   Sat Sep 19 11:15:05 2009 -0700

    module-equalizer-sink: disable active profile name restoration as something in pack/unpack is funky and I don't have time for a
    proper fix

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 74d7497..3a28b49 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -978,13 +978,13 @@ static void load_state(struct userdata *u){
                 memcpy(u->Hs[c][a_i], H, FILTER_SIZE * sizeof(float));
                 pa_aupdate_write_end(u->a_H[c]);
             }
-            unpack(((char *)value.data) + FILTER_STATE_SIZE, value.size - FILTER_STATE_SIZE, &names, &n_profs);
-            n_profs = PA_MIN(n_profs, u->channels);
-            for(size_t c = 0; c < n_profs; ++c){
-                pa_xfree(u->base_profiles[c]);
-                u->base_profiles[c] = names[c];
-            }
-            pa_xfree(names);
+            //unpack(((char *)value.data) + FILTER_STATE_SIZE, value.size - FILTER_STATE_SIZE, &names, &n_profs);
+            //n_profs = PA_MIN(n_profs, u->channels);
+            //for(size_t c = 0; c < n_profs; ++c){
+            //    pa_xfree(u->base_profiles[c]);
+            //    u->base_profiles[c] = names[c];
+            //}
+            //pa_xfree(names);
         }
         pa_datum_free(&value);
     }else{

commit 019331d25b6af107fb8cacc3ada552e7567a64bf
Merge: 5871319 afd1b6d
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Fri Oct 2 17:24:44 2009 +0300

    Merge branch 'master' into dbus-work
    
    Conflicts:
    	src/daemon/daemon-conf.c

diff --cc src/Makefile.am
index 623cef5,6544e2a..69711ac
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@@ -175,11 -175,10 +175,11 @@@ pulseaudio_SOURCES = 
  		daemon/daemon-conf.c daemon/daemon-conf.h \
  		daemon/dumpmodules.c daemon/dumpmodules.h \
  		daemon/ltdl-bind-now.c daemon/ltdl-bind-now.h \
 -		daemon/main.c
 +		daemon/main.c \
 +		daemon/server-lookup.c daemon/server-lookup.h
  
- pulseaudio_CFLAGS = $(AM_CFLAGS) $(LIBOIL_CFLAGS) $(LIBSAMPLERATE_CFLAGS) $(LIBSPEEX_CFLAGS) $(LIBSNDFILE_CFLAGS) $(CAP_CFLAGS) $(LIBOIL_CFLAGS) $(DBUS_CFLAGS)
- pulseaudio_LDADD = $(AM_LDADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la $(LIBLTDL) $(LIBSAMPLERATE_LIBS) $(LIBSPEEX_LIBS) $(LIBSNDFILE_LIBS) $(CAP_LIBS) $(LIBOIL_LIBS) $(DBUS_LIBS)
+ pulseaudio_CFLAGS = $(AM_CFLAGS) $(LIBSAMPLERATE_CFLAGS) $(LIBSPEEX_CFLAGS) $(LIBSNDFILE_CFLAGS) $(CAP_CFLAGS) $(DBUS_CFLAGS)
+ pulseaudio_LDADD = $(AM_LDADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la $(LIBLTDL) $(LIBSAMPLERATE_LIBS) $(LIBSPEEX_LIBS) $(LIBSNDFILE_LIBS) $(CAP_LIBS) $(DBUS_LIBS)
  # This is needed because automake doesn't properly expand the foreach below
  pulseaudio_DEPENDENCIES = libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la $(PREOPEN_LIBS)
  
diff --cc src/daemon/daemon-conf.c
index 3428f80,6e7926f..571faae
--- a/src/daemon/daemon-conf.c
+++ b/src/daemon/daemon-conf.c
@@@ -83,10 -83,7 +83,10 @@@ static const pa_daemon_conf default_con
      .config_file = NULL,
      .use_pid_file = TRUE,
      .system_instance = FALSE,
 +#ifdef HAVE_DBUS
 +    .local_server_type = PA_SERVER_TYPE_UNSET, /* The actual default is _USER, but we have to detect when the user doesn't specify this option. */
 +#endif
-     .no_cpu_limit = FALSE,
+     .no_cpu_limit = TRUE,
      .disable_shm = FALSE,
      .lock_memory = FALSE,
      .default_n_fragments = 4,

commit 6468dcf9d13c49299eba8c76ee41f4ff5fdba80f
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Fri Oct 2 19:12:10 2009 +0100

    device-manager: No need to check the version after calling read_entry()

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 86ea95d..587def4 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -448,7 +448,7 @@ static void update_highest_priority_device_indexes(struct userdata *u, const cha
             name = pa_xstrndup(key.data, key.size);
             device_name = get_name(name, prefix);
 
-            if ((e = read_entry(u, name)) && ENTRY_VERSION == e->version) {
+            if ((e = read_entry(u, name))) {
                 for (uint32_t i = 0; i < NUM_ROLES; ++i) {
                     if (!highest_priority_available[i] || e->priority[i] < highest_priority_available[i]) {
                         /* We've found a device with a higher priority than that we've currently got,
@@ -1049,7 +1049,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         if (!device || !*device || !description || !*description)
           goto fail;
 
-        if ((e = read_entry(u, device)) && ENTRY_VERSION == e->version) {
+        if ((e = read_entry(u, device))) {
             pa_datum key, data;
 
             pa_strlcpy(e->description, description, sizeof(e->description));
@@ -1217,7 +1217,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
 
                 /* Add the device to our hashmap. If it's alredy in it, free it now and carry on */
                 if (pa_hashmap_put(h, device->device, device) == 0
-                    && (e = read_entry(u, device->device)) && ENTRY_VERSION == e->version) {
+                    && (e = read_entry(u, device->device))) {
                     /* We add offset on to the existing priorirty so that when we order, the
                        existing entries are always lower priority than the new ones. */
                     device->prio = (offset + e->priority[role_index]);
@@ -1272,7 +1272,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         idx = 1;
         first = TRUE;
         for (i = 0; i < n_devices; ++i) {
-            if ((e = read_entry(u, devices[i]->device)) && ENTRY_VERSION == e->version) {
+            if ((e = read_entry(u, devices[i]->device))) {
                 if (e->priority[role_index] == idx)
                     idx++;
                 else {

commit fdbb5500634bbe3481fb60ce373ad4f9c2063f75
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Fri Oct 2 21:01:19 2009 +0100

    device-manager: Keep track as to whether or not the user specifically renamed the device.
    
    If the user has not (via our protocol extension) renamed a device, but it happens to now have
    a different name (e.g. module-combine automatically updating the description for us or udev-db
    getting better etc.) then make sure we update our cache with this updated version.
    
    If the user has set a name, enforce it's use, even if the description is updated by some other
    means (e.g. the user manually editing the proplist or another module doing it for them).

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 587def4..776a687 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -133,6 +133,7 @@ struct userdata {
 struct entry {
     uint8_t version;
     char description[PA_NAME_MAX];
+    pa_bool_t user_set_description;
     char icon[PA_NAME_MAX];
     role_indexes_t priority;
 } PA_GCC_PACKED;
@@ -181,6 +182,11 @@ static struct entry* read_entry(struct userdata *u, const char *name) {
         goto fail;
     }
 
+    if (!memchr(e->icon, 0, sizeof(e->icon))) {
+        pa_log_warn("Database contains entry for device %s with missing NUL byte in icon", name);
+        goto fail;
+    }
+
     return e;
 
 fail:
@@ -329,6 +335,7 @@ static pa_bool_t entries_equal(const struct entry *a, const struct entry *b) {
     pa_assert(b);
 
     if (strncmp(a->description, b->description, sizeof(a->description))
+        || a->user_set_description != b->user_set_description
         || strncmp(a->icon, b->icon, sizeof(a->icon)))
         return FALSE;
 
@@ -398,6 +405,7 @@ static inline struct entry *load_or_initialize_entry(struct userdata *u, struct
         for (uint32_t i = 0; i < NUM_ROLES; ++i) {
             entry->priority[i] = max_priority[i] + 1;
         }
+        entry->user_set_description = FALSE;
     }
 
     return old;
@@ -672,7 +680,16 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3
 
         old = load_or_initialize_entry(u, &entry, name, "sink:");
 
-        pa_strlcpy(entry.description, pa_strnull(pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description));
+        if (!entry.user_set_description)
+            pa_strlcpy(entry.description, pa_strnull(pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description));
+        else if (strncmp(entry.description, pa_strnull(pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description)) != 0) {
+            /* Warning: If two modules fight over the description, this could cause an infinite loop.
+               by changing the description here, we retrigger this subscription callback. The only thing stopping us from
+               looping is the fact that the string comparison will fail on the second iteration. If another module tries to manage
+               the description, this will fail... */
+            pa_sink_set_description(sink, entry.description);
+        }
+
         pa_strlcpy(entry.icon, pa_strnull(pa_proplist_gets(sink->proplist, PA_PROP_DEVICE_ICON_NAME)), sizeof(entry.icon));
 
     } else  if ((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_SOURCE) {
@@ -690,7 +707,16 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3
 
         old = load_or_initialize_entry(u, &entry, name, "source:");
 
-        pa_strlcpy(entry.description, pa_strnull(pa_proplist_gets(source->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description));
+        if (!entry.user_set_description)
+            pa_strlcpy(entry.description, pa_strnull(pa_proplist_gets(source->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description));
+        else if (strncmp(entry.description, pa_strnull(pa_proplist_gets(source->proplist, PA_PROP_DEVICE_DESCRIPTION)), sizeof(entry.description)) != 0) {
+            /* Warning: If two modules fight over the description, this could cause an infinite loop.
+               by changing the description here, we retrigger this subscription callback. The only thing stopping us from
+               looping is the fact that the string comparison will fail on the second iteration. If another module tries to manage
+               the description, this will fail... */
+            pa_source_set_description(source, entry.description);
+        }
+
         pa_strlcpy(entry.icon, pa_strnull(pa_proplist_gets(source->proplist, PA_PROP_DEVICE_ICON_NAME)), sizeof(entry.icon));
     }
 
@@ -716,11 +742,12 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3
 
     pa_log_info("Storing device %s.", name);
 
-    pa_database_set(u->database, &key, &data, TRUE);
+    if (pa_database_set(u->database, &key, &data, TRUE) == 0)
+        trigger_save(u);
+    else
+        pa_log_warn("Could not save device");;
 
     pa_xfree(name);
-
-    trigger_save(u);
 }
 
 static pa_hook_result_t sink_new_hook_callback(pa_core *c, pa_sink_new_data *new_data, struct userdata *u) {
@@ -734,7 +761,7 @@ static pa_hook_result_t sink_new_hook_callback(pa_core *c, pa_sink_new_data *new
     name = pa_sprintf_malloc("sink:%s", new_data->name);
 
     if ((e = read_entry(u, name))) {
-        if (strncmp(e->description, pa_proplist_gets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION), sizeof(e->description)) != 0) {
+        if (e->user_set_description && strncmp(e->description, pa_proplist_gets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION), sizeof(e->description)) != 0) {
             pa_log_info("Restoring description for sink %s.", new_data->name);
             pa_proplist_sets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description);
         }
@@ -758,7 +785,7 @@ static pa_hook_result_t source_new_hook_callback(pa_core *c, pa_source_new_data
     name = pa_sprintf_malloc("source:%s", new_data->name);
 
     if ((e = read_entry(u, name))) {
-        if (strncmp(e->description, pa_proplist_gets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION), sizeof(e->description)) != 0) {
+        if (e->user_set_description && strncmp(e->description, pa_proplist_gets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION), sizeof(e->description)) != 0) {
             /* NB, We cannot detect if we are a monitor here... this could mess things up a bit... */
             pa_log_info("Restoring description for source %s.", new_data->name);
             pa_proplist_sets(new_data->proplist, PA_PROP_DEVICE_DESCRIPTION, e->description);
@@ -911,13 +938,16 @@ static void apply_entry(struct userdata *u, const char *name, struct entry *e) {
     pa_assert(name);
     pa_assert(e);
 
+    if (!e->user_set_description)
+        return;
+
     if ((n = get_name(name, "sink:"))) {
         for (sink = pa_idxset_first(u->core->sinks, &idx); sink; sink = pa_idxset_next(u->core->sinks, &idx)) {
             if (!pa_streq(sink->name, n)) {
                 continue;
             }
 
-            pa_log_info("Setting description for sink %s.", sink->name);
+            pa_log_info("Setting description for sink %s to '%s'", sink->name, e->description);
             pa_sink_set_description(sink, e->description);
         }
         pa_xfree(n);
@@ -933,7 +963,7 @@ static void apply_entry(struct userdata *u, const char *name, struct entry *e) {
                 continue;
             }
 
-            pa_log_info("Setting description for source %s.", source->name);
+            pa_log_info("Setting description for source %s to '%s'", source->name, e->description);
             pa_source_set_description(source, e->description);
         }
         pa_xfree(n);
@@ -1053,6 +1083,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
             pa_datum key, data;
 
             pa_strlcpy(e->description, description, sizeof(e->description));
+            e->user_set_description = TRUE;
 
             key.data = (char *) device;
             key.size = strlen(device);

commit cc31d7c35a509d398494e13a9020513ddf8b667f
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Fri Oct 2 21:04:03 2009 +0100

    device-manager: Make use of PA_IDXSET_FOREACH when applying entries.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 776a687..8d17bb0 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -929,8 +929,6 @@ static pa_hook_result_t source_unlink_hook_callback(pa_core *c, pa_source *sourc
 
 
 static void apply_entry(struct userdata *u, const char *name, struct entry *e) {
-    pa_sink *sink;
-    pa_source *source;
     uint32_t idx;
     char *n;
 
@@ -942,29 +940,31 @@ static void apply_entry(struct userdata *u, const char *name, struct entry *e) {
         return;
 
     if ((n = get_name(name, "sink:"))) {
-        for (sink = pa_idxset_first(u->core->sinks, &idx); sink; sink = pa_idxset_next(u->core->sinks, &idx)) {
-            if (!pa_streq(sink->name, n)) {
+        pa_sink *s;
+        PA_IDXSET_FOREACH(s, u->core->sinks, idx) {
+            if (!pa_streq(s->name, n)) {
                 continue;
             }
 
-            pa_log_info("Setting description for sink %s to '%s'", sink->name, e->description);
-            pa_sink_set_description(sink, e->description);
+            pa_log_info("Setting description for sink %s to '%s'", s->name, e->description);
+            pa_sink_set_description(s, e->description);
         }
         pa_xfree(n);
     }
     else if ((n = get_name(name, "source:"))) {
-        for (source = pa_idxset_first(u->core->sources, &idx); source; source = pa_idxset_next(u->core->sources, &idx)) {
-            if (!pa_streq(source->name, n)) {
+        pa_source *s;
+        PA_IDXSET_FOREACH(s, u->core->sources, idx) {
+            if (!pa_streq(s->name, n)) {
                 continue;
             }
 
-            if (source->monitor_of) {
-                pa_log_warn("Cowardly refusing to set the description for monitor source %s.", source->name);
+            if (s->monitor_of) {
+                pa_log_warn("Cowardly refusing to set the description for monitor source %s.", s->name);
                 continue;
             }
 
-            pa_log_info("Setting description for source %s to '%s'", source->name, e->description);
-            pa_source_set_description(source, e->description);
+            pa_log_info("Setting description for source %s to '%s'", s->name, e->description);
+            pa_source_set_description(s, e->description);
         }
         pa_xfree(n);
     }

commit 9d7a27ec8867ed7907944dbe52ed67bf252c00ee
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Fri Oct 2 22:44:56 2009 +0100

    device-manager: Play nice with module-stream-restore.
    
    If m-s-r sets the device we let it do so. Otherwise we handle the routing. We run before
    module-intended-roles as the priority list will likely be configured appropriately
    to do the same job, albeit with manual setup.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 8d17bb0..bfcbfea 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -518,6 +518,9 @@ static void route_sink_input(struct userdata *u, pa_sink_input *si) {
     pa_assert(u);
     pa_assert(u->do_routing);
 
+    if (si->save_sink)
+        return;
+
     /* Skip this if it is already in the process of being moved anyway */
     if (!si->sink)
         return;
@@ -544,7 +547,7 @@ static void route_sink_input(struct userdata *u, pa_sink_input *si) {
         return;
 
     if (si->sink != sink)
-        pa_sink_input_move_to(si, sink, TRUE);
+        pa_sink_input_move_to(si, sink, FALSE);
 }
 
 static pa_hook_result_t route_sink_inputs(struct userdata *u, pa_sink *ignore_sink) {
@@ -573,6 +576,9 @@ static void route_source_output(struct userdata *u, pa_source_output *so) {
     pa_assert(u);
     pa_assert(u->do_routing);
 
+    if (so->save_source)
+        return;
+
     if (so->direct_on_input)
         return;
 
@@ -602,7 +608,7 @@ static void route_source_output(struct userdata *u, pa_source_output *so) {
         return;
 
     if (so->source != source)
-        pa_source_output_move_to(so, source, TRUE);
+        pa_source_output_move_to(so, source, FALSE);
 }
 
 static pa_hook_result_t route_source_outputs(struct userdata *u, pa_source* ignore_source) {
@@ -811,22 +817,24 @@ static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_n
         return PA_HOOK_OK;
 
     if (new_data->sink)
-        pa_log_debug("Overriding device for stream, even although it is already set. I am evil that way...");
-
-    if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE)))
-        role_index = get_role_index("none");
-    else
-        role_index = get_role_index(role);
+        pa_log_debug("Not restoring device for stream because already set.");
+    else {
+        if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE)))
+            role_index = get_role_index("none");
+        else
+            role_index = get_role_index(role);
 
-    if (PA_INVALID_INDEX != role_index) {
-        uint32_t device_index;
+        if (PA_INVALID_INDEX != role_index) {
+            uint32_t device_index;
 
-        device_index = u->preferred_sinks[role_index];
-        if (PA_INVALID_INDEX != device_index) {
-            pa_sink *sink;
+            device_index = u->preferred_sinks[role_index];
+            if (PA_INVALID_INDEX != device_index) {
+                pa_sink *sink;
 
-            if ((sink = pa_idxset_get_by_index(u->core->sinks, device_index))) {
-                new_data->sink = sink;
+                if ((sink = pa_idxset_get_by_index(u->core->sinks, device_index))) {
+                    new_data->sink = sink;
+                    new_data->save_sink = FALSE;
+                }
             }
         }
     }
@@ -849,22 +857,24 @@ static pa_hook_result_t source_output_new_hook_callback(pa_core *c, pa_source_ou
         return PA_HOOK_OK;
 
     if (new_data->source)
-        pa_log_debug("Overriding device for stream, even although it is already set. I am evil that way...");
-
-    if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE)))
-        role_index = get_role_index("none");
-    else
-        role_index = get_role_index(role);
+        pa_log_debug("Not restoring device for stream because already set.");
+    else {
+        if (!(role = pa_proplist_gets(new_data->proplist, PA_PROP_MEDIA_ROLE)))
+            role_index = get_role_index("none");
+        else
+            role_index = get_role_index(role);
 
-    if (PA_INVALID_INDEX != role_index) {
-        uint32_t device_index;
+        if (PA_INVALID_INDEX != role_index) {
+            uint32_t device_index;
 
-        device_index = u->preferred_sources[role_index];
-        if (PA_INVALID_INDEX != device_index) {
-            pa_source *source;
+            device_index = u->preferred_sources[role_index];
+            if (PA_INVALID_INDEX != device_index) {
+                pa_source *source;
 
-            if ((source = pa_idxset_get_by_index(u->core->sources, device_index))) {
-                new_data->source = source;
+                if ((source = pa_idxset_get_by_index(u->core->sources, device_index))) {
+                    new_data->source = source;
+                    new_data->save_source = FALSE;
+                }
             }
         }
     }
@@ -1422,20 +1432,20 @@ int pa__init(pa_module*m) {
     u->source_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_NEW], PA_HOOK_EARLY, (pa_hook_cb_t) source_new_hook_callback, u);
 
     /* The following slots are used to deal with routing */
-    /* A little bit later than module-stream-restore, module-intended-roles */
-    u->sink_input_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_NEW], PA_HOOK_EARLY+15, (pa_hook_cb_t) sink_input_new_hook_callback, u);
-    u->source_output_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_NEW], PA_HOOK_EARLY+15, (pa_hook_cb_t) source_output_new_hook_callback, u);
+    /* A little bit later than module-stream-restore, but before module-intended-roles */
+    u->sink_input_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_NEW], PA_HOOK_EARLY+5, (pa_hook_cb_t) sink_input_new_hook_callback, u);
+    u->source_output_new_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_NEW], PA_HOOK_EARLY+5, (pa_hook_cb_t) source_output_new_hook_callback, u);
 
     if (on_hotplug) {
-        /* A little bit later than module-stream-restore, module-intended-roles */
-        u->sink_put_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_LATE+15, (pa_hook_cb_t) sink_put_hook_callback, u);
-        u->source_put_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_PUT], PA_HOOK_LATE+15, (pa_hook_cb_t) source_put_hook_callback, u);
+        /* A little bit later than module-stream-restore, but before module-intended-roles */
+        u->sink_put_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_LATE+5, (pa_hook_cb_t) sink_put_hook_callback, u);
+        u->source_put_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_PUT], PA_HOOK_LATE+5, (pa_hook_cb_t) source_put_hook_callback, u);
     }
 
     if (on_rescue) {
-        /* A little bit later than module-stream-restore, module-intended-roles, a little bit earlier than module-rescue-streams, ... */
-        u->sink_unlink_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_UNLINK], PA_HOOK_LATE+15, (pa_hook_cb_t) sink_unlink_hook_callback, u);
-        u->source_unlink_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_UNLINK], PA_HOOK_LATE+15, (pa_hook_cb_t) source_unlink_hook_callback, u);
+        /* A little bit later than module-stream-restore, a little bit earlier than module-intended-roles, module-rescue-streams, ... */
+        u->sink_unlink_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_UNLINK], PA_HOOK_LATE+5, (pa_hook_cb_t) sink_unlink_hook_callback, u);
+        u->source_unlink_hook_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_UNLINK], PA_HOOK_LATE+5, (pa_hook_cb_t) source_unlink_hook_callback, u);
     }
 
     if (!(fname = pa_state_path("device-manager", TRUE)))

commit 40c1ca76c48147c7648e1f1a72cc2c747f3d0c9b
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sun Oct 4 13:00:51 2009 +0200

    bluetooth: don't set auto_connect flag when discovering bt devices

diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 4592fca..0ba1421 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -74,7 +74,8 @@ PA_MODULE_USAGE(
         "profile=<a2dp|hsp> "
         "rate=<sample rate> "
         "channels=<number of channels> "
-        "path=<device object path>");
+        "path=<device object path> "
+        "auto_connect=<automatically connect?>");
 
 /*
 #ifdef NOKIA
@@ -98,6 +99,7 @@ static const char* const valid_modargs[] = {
     "rate",
     "channels",
     "path",
+    "auto_connect",
 #ifdef NOKIA
     "sco_sink",
     "sco_source",
@@ -141,6 +143,7 @@ struct userdata {
     char *address;
     char *path;
     pa_bluetooth_discovery *discovery;
+    pa_bool_t auto_connect;
 
     pa_dbus_connection *connection;
 
@@ -399,7 +402,7 @@ static int get_caps(struct userdata *u, uint8_t seid) {
         pa_assert(u->profile == PROFILE_HSP);
         msg.getcaps_req.transport = BT_CAPABILITIES_TRANSPORT_SCO;
     }
-    msg.getcaps_req.flags = BT_FLAG_AUTOCONNECT;
+    msg.getcaps_req.flags = u->auto_connect ? BT_FLAG_AUTOCONNECT : 0;
 
     if (service_send(u, &msg.getcaps_req.h) < 0)
         return -1;
@@ -2363,6 +2366,12 @@ int pa__init(pa_module* m) {
         goto fail;
     }
 
+    u->auto_connect = TRUE;
+    if (pa_modargs_get_value_boolean(ma, "auto_connect", &u->auto_connect)) {
+        pa_log("Failed to parse auto_connect= argument");
+        goto fail;
+    }
+
     channels = u->sample_spec.channels;
     if (pa_modargs_get_value_u32(ma, "channels", &channels) < 0 ||
         channels <= 0 || channels > PA_CHANNELS_MAX) {
diff --git a/src/modules/bluetooth/module-bluetooth-discover.c b/src/modules/bluetooth/module-bluetooth-discover.c
index 02fd424..0085fa8 100644
--- a/src/modules/bluetooth/module-bluetooth-discover.c
+++ b/src/modules/bluetooth/module-bluetooth-discover.c
@@ -117,7 +117,7 @@ static pa_hook_result_t load_module_for_device(pa_bluetooth_discovery *y, const
 #endif
 
             if (d->audio_source_state >= PA_BT_AUDIO_STATE_CONNECTED)
-                args = pa_sprintf_malloc("%s profile=\"a2dp_source\"", args);
+                args = pa_sprintf_malloc("%s profile=\"a2dp_source\" auto_connect=no", args);
 
             pa_log_debug("Loading module-bluetooth-device %s", args);
             m = pa_module_load(u->module->core, "module-bluetooth-device", args);

commit 7b682c969025845f75cbc74a9f830ad2dec8a415
Author: Tor-Björn Claesson <tclaesson at gmail.com>
Date:   Fri Oct 2 14:13:59 2009 +0200

    loopback: Setting latency of module-loopback
    
    I checked the source code, and latency_msec is missing from the list
    of valid module arguments. Attaching a patch to add it.

diff --git a/src/modules/module-loopback.c b/src/modules/module-loopback.c
index 29c3dda..bb0182b 100644
--- a/src/modules/module-loopback.c
+++ b/src/modules/module-loopback.c
@@ -102,7 +102,7 @@ struct userdata {
 static const char* const valid_modargs[] = {
     "source",
     "sink",
-    "latency",
+    "latency_msec",
     "format",
     "rate",
     "channels",

commit c96d2d1117a7e59b351358c8cdd79ef465ddbd49
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Oct 6 00:17:24 2009 +0200

    alsa: disable period event only with tsched=1

diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
index 22e88b4..37419d9 100644
--- a/src/modules/alsa/alsa-sink.c
+++ b/src/modules/alsa/alsa-sink.c
@@ -927,7 +927,7 @@ static int update_sw_params(struct userdata *u) {
 
     pa_log_debug("setting avail_min=%lu", (unsigned long) avail_min);
 
-    if ((err = pa_alsa_set_sw_params(u->pcm_handle, avail_min)) < 0) {
+    if ((err = pa_alsa_set_sw_params(u->pcm_handle, avail_min, !u->use_tsched)) < 0) {
         pa_log("Failed to set software parameters: %s", pa_alsa_strerror(err));
         return err;
     }
diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
index fa3ac0a..37dd647 100644
--- a/src/modules/alsa/alsa-source.c
+++ b/src/modules/alsa/alsa-source.c
@@ -877,7 +877,7 @@ static int update_sw_params(struct userdata *u) {
 
     pa_log_debug("setting avail_min=%lu", (unsigned long) avail_min);
 
-    if ((err = pa_alsa_set_sw_params(u->pcm_handle, avail_min)) < 0) {
+    if ((err = pa_alsa_set_sw_params(u->pcm_handle, avail_min, !u->use_tsched)) < 0) {
         pa_log("Failed to set software parameters: %s", pa_alsa_strerror(err));
         return err;
     }
diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
index 43a8e82..0e22d17 100644
--- a/src/modules/alsa/alsa-util.c
+++ b/src/modules/alsa/alsa-util.c
@@ -403,7 +403,7 @@ finish:
     return ret;
 }
 
-int pa_alsa_set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t avail_min) {
+int pa_alsa_set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t avail_min, pa_bool_t period_event) {
     snd_pcm_sw_params_t *swparams;
     snd_pcm_uframes_t boundary;
     int err;
@@ -417,7 +417,7 @@ 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_period_event(pcm, swparams, 0)) < 0) {
+    if ((err = snd_pcm_sw_params_set_period_event(pcm, swparams, period_event)) < 0) {
         pa_log_warn("Unable to disable period event: %s\n", pa_alsa_strerror(err));
         return err;
     }
diff --git a/src/modules/alsa/alsa-util.h b/src/modules/alsa/alsa-util.h
index 265cd28..f6206fe 100644
--- a/src/modules/alsa/alsa-util.h
+++ b/src/modules/alsa/alsa-util.h
@@ -51,7 +51,8 @@ int pa_alsa_set_hw_params(
 
 int pa_alsa_set_sw_params(
         snd_pcm_t *pcm,
-        snd_pcm_uframes_t avail_min);
+        snd_pcm_uframes_t avail_min,
+        pa_bool_t period_event);
 
 /* Picks a working mapping from the profile set based on the specified ss/map */
 snd_pcm_t *pa_alsa_open_by_device_id_auto(

commit b3592a160f0d2a28605048a81c0261bf7c45acbb
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Oct 6 23:34:22 2009 +0200

    position-event-sounds: never position test sounds in space

diff --git a/src/modules/module-position-event-sounds.c b/src/modules/module-position-event-sounds.c
index 7221b14..ee4c8c8 100644
--- a/src/modules/module-position-event-sounds.c
+++ b/src/modules/module-position-event-sounds.c
@@ -74,7 +74,7 @@ static int parse_pos(const char *pos, double *f) {
 }
 
 static pa_hook_result_t sink_input_fixate_hook_callback(pa_core *core, pa_sink_input_new_data *data, struct userdata *u) {
-    const char *hpos, *vpos, *role;
+    const char *hpos, *vpos, *role, *id;
     double f;
     char t[PA_CVOLUME_SNPRINT_MAX];
     pa_cvolume v;
@@ -87,6 +87,22 @@ static pa_hook_result_t sink_input_fixate_hook_callback(pa_core *core, pa_sink_i
     if (!pa_streq(role, "event"))
         return PA_HOOK_OK;
 
+    if ((id = pa_proplist_gets(data->proplist, PA_PROP_EVENT_ID))) {
+
+        /* The test sounds should never be positioned in space, since
+         * they might be trigered themselves to configure the speakers
+         * in space, which we don't want to mess up. */
+
+        if (pa_startswith(id, "audio-channel-"))
+            return PA_HOOK_OK;
+
+        if (pa_streq(id, "audio-volume-change"))
+            return PA_HOOK_OK;
+
+        if (pa_streq(id, "audio-test-signal"))
+            return PA_HOOK_OK;
+    }
+
     if (!(hpos = pa_proplist_gets(data->proplist, PA_PROP_EVENT_MOUSE_HPOS)))
         hpos = pa_proplist_gets(data->proplist, PA_PROP_WINDOW_HPOS);
 

commit 692ce73899285c6ed07e93084a5f830a9a8effcc
Merge: b3592a1 019331d
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Oct 7 03:39:30 2009 +0200

    Merge remote branch 'tanuk/dbus-work'


commit 9f226d25d6c088627fbccefab5867b596a7d31f9
Merge: 692ce73 e895200
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Oct 7 03:43:24 2009 +0200

    Merge remote branch 'phish3/master'


commit d0b478e9a6ecb5c6b74180b1845069946d8f6f10
Merge: 9f226d2 9d7a27e
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Oct 7 03:46:06 2009 +0200

    Merge remote branch 'coling/history'

diff --cc src/modules/module-stream-restore.c
index 1e2dc4d,b7b36be..788f458
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@@ -1122,21 -281,10 +1122,21 @@@ static pa_bool_t entries_equal(const st
  
  static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
      struct userdata *u = userdata;
-     struct entry entry, *old;
-     char *name;
+     struct entry entry, *old = NULL;
+     char *name = NULL;
      pa_datum key, data;
  
 +    /* These are only used when D-Bus is enabled, but in order to reduce ifdef
 +     * clutter these are defined here unconditionally. */
 +    pa_bool_t created_new_entry = TRUE;
 +    pa_bool_t device_updated = FALSE;
 +    pa_bool_t volume_updated = FALSE;
 +    pa_bool_t mute_updated = FALSE;
 +
 +#ifdef HAVE_DBUS
 +    struct dbus_entry *de = NULL;
 +#endif
 +
      pa_assert(c);
      pa_assert(u);
  

commit b64b6bbf4c5eda8d4c80dd956987234d1378d055
Author: Diego Elio 'Flameeyes' Pettenò <flameeyes at gmail.com>
Date:   Wed Oct 7 19:29:33 2009 +0200

    Fix out-of-tree builds when dbus module is enabled.

diff --git a/src/Makefile.am b/src/Makefile.am
index 35941a6..b277a9a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -70,6 +70,8 @@ AM_CFLAGS = \
 	-I$(top_builddir)/src/modules/x11 \
 	-I$(top_srcdir)/src/modules/jack \
 	-I$(top_builddir)/src/modules/jack \
+	-I$(top_srcdir)/src/modules/dbus \
+	-I$(top_builddir)/src/modules/dbus \
 	$(PTHREAD_CFLAGS) -D_POSIX_PTHREAD_SEMANTICS \
 	$(LIBSAMPLERATE_CFLAGS) \
 	$(LIBSNDFILE_CFLAGS) \

commit f55357cd0bcbc0a86f4ea9056584885897a8ec6c
Author: Diego Elio 'Flameeyes' Pettenò <flameeyes at gmail.com>
Date:   Wed Oct 7 19:30:11 2009 +0200

    Add check for FFTW, and add option to disable it at build-time.
    
    This way there will be a message at configure if FFTW is not found, and
    this gets in-line with the rest of the modules' dependencies.

diff --git a/configure.ac b/configure.ac
index fd10c83..77ec884 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1273,6 +1273,16 @@ AC_SUBST(OPENSSL_LIBS)
 AC_SUBST(HAVE_OPENSSL)
 AM_CONDITIONAL([HAVE_OPENSSL], [test "x$HAVE_OPENSSL" = x1])
 
+#### FFTW (optional) ####
+AC_ARG_WITH(
+	[fftw],
+	AS_HELP_STRING([--without-fftw], [Omit FFTW-using modules (equalizer)]))
+
+if test "x${with_fftw}" != "xno"; then
+    PKG_CHECK_MODULES([FFTW], [fftw3f], [HAVE_FFTW=1], [HAVE_FFTW=0])
+fi
+AM_CONDITIONAL([HAVE_FFTW], [test "x$HAVE_FFTW" = "x1"])
+
 ### Build and Install man pages ###
 AC_ARG_ENABLE(manpages,
         AS_HELP_STRING([--disable-manpages],[Disable building and installation of man pages]),
diff --git a/src/Makefile.am b/src/Makefile.am
index b277a9a..c5d3ab7 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1017,7 +1017,6 @@ modlibexec_LTLIBRARIES += \
 		module-combine.la \
 		module-remap-sink.la \
 		module-ladspa-sink.la \
-		module-equalizer-sink.la \
 		module-esound-sink.la \
 		module-tunnel-sink.la \
 		module-tunnel-source.la \
@@ -1195,6 +1194,11 @@ modlibexec_LTLIBRARIES += \
 endif
 endif
 
+if HAVE_FFTW
+modlibexec_LTLIBRARIES += \
+		module-equalizer-sink.la
+endif
+
 # These are generated by an M4 script
 SYMDEF_FILES = \
 		modules/module-cli-symdef.h \
@@ -1415,9 +1419,9 @@ module_ladspa_sink_la_LDFLAGS = $(MODULE_LDFLAGS)
 module_ladspa_sink_la_LIBADD = $(AM_LIBADD) $(LIBLTDL) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
 
 module_equalizer_sink_la_SOURCES = modules/module-equalizer-sink.c
-module_equalizer_sink_la_CFLAGS = $(AM_CFLAGS)
+module_equalizer_sink_la_CFLAGS = $(AM_CFLAGS) $(FFTW_CFLAGS)
 module_equalizer_sink_la_LDFLAGS = $(MODULE_LDFLAGS)
-module_equalizer_sink_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) -lfftw3f libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
+module_equalizer_sink_la_LIBADD = $(AM_LIBADD) $(DBUS_LIBS) $(FFTW_LIBS) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
 
 module_match_la_SOURCES = modules/module-match.c
 module_match_la_LDFLAGS = $(MODULE_LDFLAGS)

commit 8ec304d2d1e956cc3f5f35437ac4fe580b36f004
Author: Diego Elio 'Flameeyes' Pettenò <flameeyes at gmail.com>
Date:   Wed Oct 7 19:31:11 2009 +0200

    Fix build when using -fweb, accept both register and memory constraints.
    
    This was reported as Gentoo bug #287391 by Torsten Kaiser, and the fix was
    suggested by Mike Frysinger.

diff --git a/src/pulsecore/svolume_mmx.c b/src/pulsecore/svolume_mmx.c
index 1768eb5..745c7de 100644
--- a/src/pulsecore/svolume_mmx.c
+++ b/src/pulsecore/svolume_mmx.c
@@ -152,7 +152,7 @@ pa_volume_s16ne_mmx (int16_t *samples, int32_t *volumes, unsigned channels, unsi
         " emms                          \n\t"
 
         : "+r" (samples), "+r" (volumes), "+r" (length), "=D" ((pa_reg_x86)channel), "=&r" (temp)
-        : "X" ((pa_reg_x86)channels)
+        : "rm" ((pa_reg_x86)channels)
         : "cc"
     );
 }
@@ -228,7 +228,7 @@ pa_volume_s16re_mmx (int16_t *samples, int32_t *volumes, unsigned channels, unsi
         " emms                          \n\t"
 
         : "+r" (samples), "+r" (volumes), "+r" (length), "=D" ((pa_reg_x86)channel), "=&r" (temp)
-        : "X" ((pa_reg_x86)channels)
+        : "rm" ((pa_reg_x86)channels)
         : "cc"
     );
 }
diff --git a/src/pulsecore/svolume_sse.c b/src/pulsecore/svolume_sse.c
index ab9394f..1cc4e0a 100644
--- a/src/pulsecore/svolume_sse.c
+++ b/src/pulsecore/svolume_sse.c
@@ -149,7 +149,7 @@ pa_volume_s16ne_sse2 (int16_t *samples, int32_t *volumes, unsigned channels, uns
         "8:                             \n\t"
 
         : "+r" (samples), "+r" (volumes), "+r" (length), "=D" (channel), "=&r" (temp)
-        : "X" ((pa_reg_x86)channels)
+        : "rm" ((pa_reg_x86)channels)
         : "cc"
     );
 }
@@ -237,7 +237,7 @@ pa_volume_s16re_sse2 (int16_t *samples, int32_t *volumes, unsigned channels, uns
         "8:                             \n\t"
 
         : "+r" (samples), "+r" (volumes), "+r" (length), "=D" (channel), "=&r" (temp)
-        : "X" ((pa_reg_x86)channels)
+        : "rm" ((pa_reg_x86)channels)
         : "cc"
     );
 }

commit 0b388bff522f689fdb4d98529a39f3701db57c08
Merge: 94aa909 8ec304d
Author: Daniel Mack <daniel at caiaq.de>
Date:   Thu Oct 8 14:19:47 2009 +0800

    Merge branch 'master' of git://0pointer.de/pulseaudio


commit ce033e7f3a0b6073f8f1423deb656656cfe94bbb
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Fri Oct 9 19:44:37 2009 +0300

    dbusiface-client: Fix the destructor (stop leaking stuff).

diff --git a/src/modules/dbus/iface-client.c b/src/modules/dbus/iface-client.c
index 546370f..2b6f0d0 100644
--- a/src/modules/dbus/iface-client.c
+++ b/src/modules/dbus/iface-client.c
@@ -446,7 +446,9 @@ void pa_dbusiface_client_free(pa_dbusiface_client *c) {
 
     pa_assert_se(pa_dbus_protocol_remove_interface(c->dbus_protocol, c->path, client_interface_info.name) >= 0);
 
+    pa_proplist_free(c->proplist);
     pa_dbus_protocol_unref(c->dbus_protocol);
+    pa_subscription_free(c->subscription);
 
     pa_xfree(c->path);
     pa_xfree(c);

commit 0ff2a6b434dec1a694f4cde64469ca19d97d9897
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Sat Oct 10 14:19:39 2009 +0100

    device-manager: Rather than flagging the device as available, just include the sink/source index with PA_INVALID_INDEX meaning unavailable

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index bfcbfea..e315864 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -1033,13 +1033,13 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         if ((e = read_entry(u, name))) {
             uint32_t idx;
             char *devname;
-            pa_bool_t available = FALSE;
+            uint32_t index = PA_INVALID_INDEX;
 
             if ((devname = get_name(name, "sink:"))) {
                 pa_sink* s;
                 PA_IDXSET_FOREACH(s, u->core->sinks, idx) {
                     if (strcmp(s->name, devname) == 0) {
-                        available = TRUE;
+                        index = s->index;
                         break;
                     }
                 }
@@ -1048,7 +1048,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
                 pa_source* s;
                 PA_IDXSET_FOREACH(s, u->core->sources, idx) {
                     if (strcmp(s->name, devname) == 0) {
-                        available = TRUE;
+                        index = s->index;
                         break;
                     }
                 }
@@ -1058,7 +1058,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
             pa_tagstruct_puts(reply, name);
             pa_tagstruct_puts(reply, e->description);
             pa_tagstruct_puts(reply, e->icon);
-            pa_tagstruct_put_boolean(reply, available);
+            pa_tagstruct_putu32(reply, index);
             pa_tagstruct_putu32(reply, NUM_ROLES);
 
             for (uint32_t i = ROLE_NONE; i < NUM_ROLES; ++i) {
diff --git a/src/pulse/ext-device-manager.c b/src/pulse/ext-device-manager.c
index 138ed83..57cb57c 100644
--- a/src/pulse/ext-device-manager.c
+++ b/src/pulse/ext-device-manager.c
@@ -128,21 +128,18 @@ static void ext_device_manager_read_cb(pa_pdispatch *pd, uint32_t command, uint3
 
         while (!pa_tagstruct_eof(t)) {
             pa_ext_device_manager_info i;
-            pa_bool_t available;
 
             memset(&i, 0, sizeof(i));
-            available = FALSE;
 
             if (pa_tagstruct_gets(t, &i.name) < 0 ||
                 pa_tagstruct_gets(t, &i.description) < 0 ||
                 pa_tagstruct_gets(t, &i.icon) < 0 ||
-                pa_tagstruct_get_boolean(t, &available) < 0 ||
+                pa_tagstruct_getu32(t, &i.index) < 0 ||
                 pa_tagstruct_getu32(t, &i.n_role_priorities) < 0) {
 
                 pa_context_fail(o->context, PA_ERR_PROTOCOL);
                 goto finish;
             }
-            i.available = (uint8_t)available;
 
             if (i.n_role_priorities > 0) {
                 uint32_t j;
diff --git a/src/pulse/ext-device-manager.h b/src/pulse/ext-device-manager.h
index 13538f0..1442a1a 100644
--- a/src/pulse/ext-device-manager.h
+++ b/src/pulse/ext-device-manager.h
@@ -44,7 +44,7 @@ typedef struct pa_ext_device_manager_info {
     const char *name;            /**< Identifier string of the device. A string like "sink:" or similar followed by the name of the device. */
     const char *description;     /**< The description of the device when it was last seen, if applicable and saved */
     const char *icon;            /**< The icon given to the device */
-    uint8_t available;           /**< Is the device currently available? */
+    uint32_t index;              /**< The device index if it is currently available or PA_INVALID_INDEX */
     uint32_t n_role_priorities;  /**< How many role priorities do we have? */
     pa_ext_device_manager_role_priority_info *role_priorities; /**< An array of role priority structures or NULL */
 } pa_ext_device_manager_info;

commit e5ac4b5ee738c1e766a250b85854fa3b9c1a70ed
Author: Daniel Mack <daniel at caiaq.de>
Date:   Thu Oct 8 08:45:34 2009 +0200

    buil-sys: fix build w/o DBus
    
    The current git head does not build without DBus libraries installed.
    Does the patch below look suitable?
    
    Thanks,
    Daniel
    
    >From f69145fc603c56cef02134ceeba10e1727fa217e Mon Sep 17 00:00:00 2001
    From: Daniel Mack <daniel at caiaq.de>
    Date: Thu, 8 Oct 2009 14:41:21 +0800
    Subject: [PATCH] Makefile.am: fix builds without DBus
    
    Signed-off-by: Daniel Mack <daniel at caiaq.de>

diff --git a/src/Makefile.am b/src/Makefile.am
index c5d3ab7..98c0468 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -180,14 +180,19 @@ pulseaudio_SOURCES = \
 		daemon/daemon-conf.c daemon/daemon-conf.h \
 		daemon/dumpmodules.c daemon/dumpmodules.h \
 		daemon/ltdl-bind-now.c daemon/ltdl-bind-now.h \
-		daemon/main.c \
-		daemon/server-lookup.c daemon/server-lookup.h
+		daemon/main.c
 
-pulseaudio_CFLAGS = $(AM_CFLAGS) $(LIBSAMPLERATE_CFLAGS) $(LIBSPEEX_CFLAGS) $(LIBSNDFILE_CFLAGS) $(CAP_CFLAGS) $(DBUS_CFLAGS)
-pulseaudio_LDADD = $(AM_LDADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la $(LIBLTDL) $(LIBSAMPLERATE_LIBS) $(LIBSPEEX_LIBS) $(LIBSNDFILE_LIBS) $(CAP_LIBS) $(DBUS_LIBS)
+pulseaudio_CFLAGS = $(AM_CFLAGS) $(LIBSAMPLERATE_CFLAGS) $(LIBSPEEX_CFLAGS) $(LIBSNDFILE_CFLAGS) $(CAP_CFLAGS)
+pulseaudio_LDADD = $(AM_LDADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la $(LIBLTDL) $(LIBSAMPLERATE_LIBS) $(LIBSPEEX_LIBS) $(LIBSNDFILE_LIBS) $(CAP_LIBS)
 # This is needed because automake doesn't properly expand the foreach below
 pulseaudio_DEPENDENCIES = libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la $(PREOPEN_LIBS)
 
+if HAVE_DBUS
+pulseaudio_CFLAGS += $(DBUS_CFLAGS)
+pulseaudio_SOURCES += daemon/server-lookup.c daemon/server-lookup.h
+pulseaudio_LDADD += $(DBUS_LIBS)
+endif
+
 if PREOPEN_MODS
 PREOPEN_LIBS = $(PREOPEN_MODS)
 else

commit c9375aa5e936cf896946f1f7bd80cce9cfe5d9a1
Author: Lennart Poettering <lennart at poettering.net>
Date:   Mon Oct 12 21:20:45 2009 +0200

    libpulse: add missing includes

diff --git a/src/pulse/ext-stream-restore.h b/src/pulse/ext-stream-restore.h
index 0b5d8eb..54516f6 100644
--- a/src/pulse/ext-stream-restore.h
+++ b/src/pulse/ext-stream-restore.h
@@ -24,6 +24,8 @@
 
 #include <pulse/context.h>
 #include <pulse/version.h>
+#include <pulse/volume.h>
+#include <pulse/channelmap.h>
 
 /** \file
  *
diff --git a/src/pulse/stream.h b/src/pulse/stream.h
index 21dd0a8..2e8e71a 100644
--- a/src/pulse/stream.h
+++ b/src/pulse/stream.h
@@ -31,6 +31,8 @@
 #include <pulse/def.h>
 #include <pulse/cdecl.h>
 #include <pulse/operation.h>
+#include <pulse/context.h>
+#include <pulse/proplist.h>
 
 /** \page streams Audio Streams
  *

commit e11cd135aa345dc39db16340702bfc8bc2673983
Merge: 0b388bf c9375aa
Author: Daniel Mack <daniel at caiaq.de>
Date:   Tue Oct 13 08:56:49 2009 +0800

    Merge branch 'master' of git://0pointer.de/pulseaudio


commit e064d270049ba9e6e4e82649eff245470a75c939
Merge: ce033e7 c9375aa
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Tue Oct 13 18:42:47 2009 +0300

    Merge branch 'master' of git://0pointer.de/pulseaudio


commit 781eb594bb77ea814976c6628483b7ba9de2db70
Author: Jason Newton <nevion at gmail.com>
Date:   Thu Oct 8 20:46:52 2009 -0700

    module-equalizer-sink: fixed equalizer state save/restore

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 3a28b49..f5c1fb7 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -814,33 +814,35 @@ static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t s
 static void pack(char **strs, size_t len, char **packed, size_t *length){
     size_t t_len = 0;
     size_t headers = (1+len) * sizeof(uint16_t);
-    size_t offset = sizeof(uint16_t);
+    char *p;
     for(size_t i = 0; i < len; ++i){
         t_len += strlen(strs[i]);
     }
     *length = headers + t_len;
-    *packed = pa_xmalloc0(*length);
-    ((uint16_t *) *packed)[0] = (uint16_t) len;
+    p = *packed = pa_xmalloc0(*length);
+    *((uint16_t *) p) = (uint16_t) len;
+    p += sizeof(uint16_t);
     for(size_t i = 0; i < len; ++i){
         uint16_t l = strlen(strs[i]);
-        *((uint16_t *)(*packed + offset)) = l;
-        offset += sizeof(uint16_t);
-        memcpy(*packed + offset, strs[i], l);
-        offset += l;
+        *((uint16_t *) p) = (uint16_t) l;
+        p += sizeof(uint16_t);
+        memcpy(p, strs[i], l);
+        p += l;
     }
 }
 static void unpack(char *str, size_t length, char ***strs, size_t *len){
-    size_t offset = sizeof(uint16_t);
-    *len = ((uint16_t *)str)[0];
+    char *p = str;
+    *len = *((uint16_t *) p);
+    p += sizeof(uint16_t);
     *strs = pa_xnew(char *, *len);
+
     for(size_t i = 0; i < *len; ++i){
-        size_t l = *((uint16_t *)(str+offset));
-        size_t e = PA_MIN(offset + l, length) - offset;
-        offset = PA_MIN(offset + sizeof(uint16_t), length);
-        (*strs)[i] = pa_xnew(char, e + 1);
-        memcpy((*strs)[i], str + offset, e);
-        (*strs)[i][e] = '\0';
-        offset += l;
+        size_t l = *((uint16_t *) p);
+        p += sizeof(uint16_t);
+        (*strs)[i] = pa_xnew(char, l + 1);
+        memcpy((*strs)[i], p, l);
+        (*strs)[i][l] = '\0';
+        p += l;
     }
 }
 static void save_profile(struct userdata *u, size_t channel, char *name){
@@ -885,17 +887,17 @@ static void save_state(struct userdata *u){
 
     pack(u->base_profiles, u->channels, &packed, &packed_length);
     state = (float *) pa_xmalloc0(filter_state_size + packed_length);
+    memcpy(state + FILTER_STATE_SIZE, packed, packed_length);
+    pa_xfree(packed);
 
     for(size_t c = 0; c < u->channels; ++c){
         a_i = pa_aupdate_read_begin(u->a_H[c]);
-        state[c * CHANNEL_PROFILE_SIZE] = u->Xs[a_i][c];
+        state[c * CHANNEL_PROFILE_SIZE] = u->Xs[c][a_i];
         H = u->Hs[c][a_i];
-        H_n = state + c * CHANNEL_PROFILE_SIZE + 1;
+        H_n = &state[c * CHANNEL_PROFILE_SIZE + 1];
         memcpy(H_n, H, FILTER_SIZE * sizeof(float));
         pa_aupdate_read_end(u->a_H[c]);
     }
-    memcpy(((char *)state) + filter_state_size, packed, packed_length);
-    pa_xfree(packed);
 
     key.data = state_name;
     key.size = strlen(key.data);
@@ -978,13 +980,13 @@ static void load_state(struct userdata *u){
                 memcpy(u->Hs[c][a_i], H, FILTER_SIZE * sizeof(float));
                 pa_aupdate_write_end(u->a_H[c]);
             }
-            //unpack(((char *)value.data) + FILTER_STATE_SIZE, value.size - FILTER_STATE_SIZE, &names, &n_profs);
-            //n_profs = PA_MIN(n_profs, u->channels);
-            //for(size_t c = 0; c < n_profs; ++c){
-            //    pa_xfree(u->base_profiles[c]);
-            //    u->base_profiles[c] = names[c];
-            //}
-            //pa_xfree(names);
+            unpack(((char *)value.data) + FILTER_STATE_SIZE * sizeof(float), value.size - FILTER_STATE_SIZE * sizeof(float), &names, &n_profs);
+            n_profs = PA_MIN(n_profs, u->channels);
+            for(size_t c = 0; c < n_profs; ++c){
+                pa_xfree(u->base_profiles[c]);
+                u->base_profiles[c] = names[c];
+            }
+            pa_xfree(names);
         }
         pa_datum_free(&value);
     }else{

commit 8f2289c563090562d194c6336ccf4ba75a1eacd0
Author: Jason Newton <nevion at gmail.com>
Date:   Sun Oct 18 14:52:32 2009 -0700

    module-equalizer-sink:
        *fixed SSE2 optimized dsp logic (default if available)
        *cleaned up whitespace formatting (again)

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index f5c1fb7..814a00f 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -337,7 +337,7 @@ static void sink_set_mute_cb(pa_sink *s) {
     pa_sink_input_set_mute(u->sink_input, s->muted, s->save_muted);
 }
 
-
+#ifndef __SSE2__
 //reference implementation
 static void dsp_logic(
     float * restrict dst,//used as a temp array too, needs to be fft_length!
@@ -351,12 +351,12 @@ static void dsp_logic(
     fftwf_complex * restrict output_window,//The transformed window'd src
     struct userdata *u){
     //use a linear-phase sliding STFT and overlap-add method (for each channel)
-    //zero padd the data
-    memset(dst + u->window_size, 0, (u->fft_size - u->window_size) * sizeof(float));
     //window the data
     for(size_t j = 0; j < u->window_size; ++j){
         dst[j] = X * W[j] * src[j];
     }
+    //zero padd the the remaining fft window
+    memset(dst + u->window_size, 0, (u->fft_size - u->window_size) * sizeof(float));
     //Processing is done here!
     //do fft
     fftwf_execute_dft_r2c(u->forward_plan, dst, output_window);
@@ -390,112 +390,104 @@ static void dsp_logic(
         (u->samples_gathered - u->R) * sizeof(float)
     );
 }
-
+#else
 typedef float v4sf __attribute__ ((__aligned__(v_size * sizeof(float))));
 typedef union float_vector {
     float f[v_size];
     v4sf v;
-#ifdef __SSE2__
     __m128 m;
-#endif
 } float_vector_t;
 
-////regardless of sse enabled, the loops in here assume
-////16 byte aligned addresses and memory allocations divisible by v_size
-//void dsp_logic(
-//    float * restrict dst,//used as a temp array too, needs to be fft_length!
-//    float * restrict src,/*input data w/ overlap at start,
-//                               *automatically cycled in routine
-//                               */
-//    float * restrict overlap,//The size of the overlap
-//    const float X,//multipliar
-//    const float * restrict H,//The freq. magnitude scalers filter
-//    const float * restrict W,//The windowing function
-//    fftwf_complex * restrict output_window,//The transformed window'd src
-//    struct userdata *u){//Collection of constants
-      //float_vector_t x = {X, X, X, X};
-//    const size_t window_size = PA_ROUND_UP(u->window_size,v_size);
-//    const size_t fft_h = PA_ROUND_UP(FILTER_SIZE, v_size / 2);
-//    //const size_t R = PA_ROUND_UP(u->R, v_size);
-//    const size_t overlap_size = PA_ROUND_UP(u->overlap_size, v_size);
-//     overlap_size = PA_ROUND_UP(u->overlap_size, v_size);
-//
-//    //assert(u->samples_gathered >= u->R);
-//    //zero out the bit beyond the real overlap so we don't add garbage
-//    for(size_t j = overlap_size; j > u->overlap_size; --j){
-//       overlap[j-1] = 0;
-//    }
-//    //use a linear-phase sliding STFT and overlap-add method
-//    //zero padd the data
-//    memset(dst + u->window_size, 0, (u->fft_size - u->window_size)*sizeof(float));
-//    //window the data
-//    for(size_t j = 0; j < window_size; j += v_size){
-//        //dst[j] = W[j]*src[j];
-//        float_vector_t *d = (float_vector_t*) (dst+j);
-//        float_vector_t *w = (float_vector_t*) (W+j);
-//        float_vector_t *s = (float_vector_t*) (src+j);
+//regardless of sse enabled, the loops in here assume
+//16 byte aligned addresses and memory allocations divisible by v_size
+static void dsp_logic(
+    float * restrict dst,//used as a temp array too, needs to be fft_length!
+    float * restrict src,/*input data w/ overlap at start,
+                               *automatically cycled in routine
+                               */
+    float * restrict overlap,//The size of the overlap
+    const float X,//multipliar
+    const float * restrict H,//The freq. magnitude scalers filter
+    const float * restrict W,//The windowing function
+    fftwf_complex * restrict output_window,//The transformed window'd src
+    struct userdata *u){//Collection of constants
+    const size_t overlap_size = PA_ROUND_UP(u->overlap_size, v_size);
+
+
+    //assert(u->samples_gathered >= u->R);
+    //use a linear-phase sliding STFT and overlap-add method
+    for(size_t j = 0; j < u->window_size; j += v_size){
+        //dst[j] = W[j] * src[j];
+        float_vector_t *d = (float_vector_t*) (dst + j);
+        float_vector_t *w = (float_vector_t*) (W + j);
+        float_vector_t *s = (float_vector_t*) (src + j);
 //#if __SSE2__
-//        d->m = _mm_mul_ps(x->m, _mm_mul_ps(w->m, s->m));
+        d->m = _mm_mul_ps(w->m, s->m);
 //#else
-//        d->v = x->v * w->v * s->v;
+//        d->v = w->v * s->v;
 //#endif
-//    }
-//    //Processing is done here!
-//    //do fft
-//    fftwf_execute_dft_r2c(u->forward_plan, dst, output_window);
-//
-//
-//    //perform filtering - purely magnitude based
-//    for(size_t j = 0;j < fft_h; j+=v_size/2){
-//        //output_window[j][0]*=H[j];
-//        //output_window[j][1]*=H[j];
-//        float_vector_t *d = (float_vector_t*)(output_window+j);
-//        float_vector_t h;
-//        h.f[0] = h.f[1] = H[j];
-//        h.f[2] = h.f[3] = H[j+1];
+    }
+    //zero padd the the remaining fft window
+    memset(dst + u->window_size, 0, (u->fft_size - u->window_size) * sizeof(float));
+
+    //Processing is done here!
+    //do fft
+    fftwf_execute_dft_r2c(u->forward_plan, dst, output_window);
+    //perform filtering - purely magnitude based
+    for(size_t j = 0; j < FILTER_SIZE; j += v_size / 2){
+        //output_window[j][0]*=H[j];
+        //output_window[j][1]*=H[j];
+        float_vector_t *d = (float_vector_t*)( ((float *) output_window) + 2 * j);
+        float_vector_t h;
+        h.f[0] = h.f[1] = H[j];
+        h.f[2] = h.f[3] = H[j + 1];
 //#if __SSE2__
-//        d->m = _mm_mul_ps(d->m, h.m);
+        d->m = _mm_mul_ps(d->m, h.m);
 //#else
-//        d->v = d->v*h->v;
+//        d->v = d->v * h.v;
 //#endif
-//    }
-//    //inverse fft
-//    fftwf_execute_dft_c2r(u->inverse_plan, output_window, dst);
-//
-//    ////debug: tests overlaping add
-//    ////and negates ALL PREVIOUS processing
-//    ////yields a perfect reconstruction if COLA is held
-//    //for(size_t j = 0; j < u->window_size; ++j){
-//    //    dst[j] = W[j]*src[j];
-//    //}
-//
-//    //overlap add and preserve overlap component from this window (linear phase)
-//    for(size_t j = 0; j < overlap_size; j+=v_size){
-//        //dst[j]+=overlap[j];
-//        //overlap[j]+=dst[j+R];
-//        float_vector_t *d = (float_vector_t*)(dst+j);
-//        float_vector_t *o = (float_vector_t*)(overlap+j);
+    }
+
+    //inverse fft
+    fftwf_execute_dft_c2r(u->inverse_plan, output_window, dst);
+
+    ////debug: tests overlaping add
+    ////and negates ALL PREVIOUS processing
+    ////yields a perfect reconstruction if COLA is held
+    //for(size_t j = 0; j < u->window_size; ++j){
+    //    dst[j] = W[j] * src[j];
+    //}
+
+    //overlap add and preserve overlap component from this window (linear phase)
+    for(size_t j = 0; j < overlap_size; j += v_size){
+        //dst[j]+=overlap[j];
+        //overlap[j]+=dst[j+R];
+        float_vector_t *d = (float_vector_t*)(dst + j);
+        float_vector_t *o = (float_vector_t*)(overlap + j);
 //#if __SSE2__
-//        d->m = _mm_add_ps(d->m, o->m);
-//        o->m = ((float_vector_t*)(dst+u->R+j))->m;
+        d->m = _mm_add_ps(d->m, o->m);
+        o->m = ((float_vector_t*)(dst + u->R + j))->m;
 //#else
-//        d->v = d->v+o->v;
-//        o->v = ((float_vector_t*)(dst+u->R+j))->v;
+//        d->v = d->v + o->v;
+//        o->v = ((float_vector_t*)(dst + u->R + j))->v;
 //#endif
-//    }
-//    //memcpy(overlap, dst+u->R, u->overlap_size*sizeof(float));
-//
-//    //////debug: tests if basic buffering works
-//    //////shouldn't modify the signal AT ALL (beyond roundoff)
-//    //for(size_t j = 0; j < u->window_size; ++j){
-//    //    dst[j] = src[j];
-//    //}
-//
-//    //preseve the needed input for the next window's overlap
-//    memmove(src, src + u->R,
-//        u->overlap_size * sizeof(float)
-//    );
-//}
+    }
+    //memcpy(overlap, dst+u->R, u->overlap_size * sizeof(float)); //overlap preserve (debug)
+    //zero out the bit beyond the real overlap so we don't add garbage next iteration
+    memset(overlap + u->overlap_size, 0, overlap_size - u->overlap_size);
+
+    ////debug: tests if basic buffering works
+    ////shouldn't modify the signal AT ALL (beyond roundoff)
+    //for(size_t j = 0; j < u->window_size; ++j){
+    //    dst[j] = src[j];
+    //}
+
+    //preseve the needed input for the next window's overlap
+    memmove(src, src + u->R,
+        (u->samples_gathered - u->R) * sizeof(float)
+    );
+}
+#endif
 
 static void process_samples(struct userdata *u, pa_memchunk *tchunk){
     size_t fs = pa_frame_size(&(u->sink->sample_spec));
@@ -685,7 +677,7 @@ static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
             //invalidate the output q
             pa_memblockq_seek(u->input_q, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
             pa_log("Resetting filter");
-            reset_filter(u);
+            //reset_filter(u); //this is the "proper" thing to do...
         }
     }
 
@@ -1064,9 +1056,12 @@ int pa__init(pa_module*m) {
     pa_modargs_get_value_boolean(ma, "set_default", &u->set_default);
 
     u->channels = ss.channels;
-    u->fft_size = pow(2, ceil(log(ss.rate)/log(2)));//probably unstable near corner cases of powers of 2
+    u->fft_size = pow(2, ceil(log(ss.rate) / log(2)));//probably unstable near corner cases of powers of 2
     pa_log_debug("fft size: %ld", u->fft_size);
     u->window_size = 15999;
+    if(u->window_size % 2 == 0){
+        u->window_size--;
+    }
     u->R = (u->window_size + 1) / 2;
     u->overlap_size = u->window_size - u->R;
     u->samples_gathered = 0;
@@ -1090,7 +1085,6 @@ int pa__init(pa_module*m) {
         u->a_H[c] = pa_aupdate_new();
         u->input[c] = NULL;
         u->overlap_accum[c] = alloc(u->overlap_size, sizeof(float));
-        memset(u->overlap_accum[c], 0, u->overlap_size*sizeof(float));
     }
     u->output_window = alloc((FILTER_SIZE), sizeof(fftwf_complex));
     u->forward_plan = fftwf_plan_dft_r2c_1d(u->fft_size, u->work_buffer, u->output_window, FFTW_ESTIMATE);

commit bec67cd75f10643ca20cbf512531f05c3338ee8e
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Mon Oct 19 21:50:03 2009 +0100

    device-manager: Fix compiler warning.
    
    Do not use a variable called 'index' as it clashes with string.h

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index e315864..3991043 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -1033,13 +1033,13 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
         if ((e = read_entry(u, name))) {
             uint32_t idx;
             char *devname;
-            uint32_t index = PA_INVALID_INDEX;
+            uint32_t found_index = PA_INVALID_INDEX;
 
             if ((devname = get_name(name, "sink:"))) {
                 pa_sink* s;
                 PA_IDXSET_FOREACH(s, u->core->sinks, idx) {
                     if (strcmp(s->name, devname) == 0) {
-                        index = s->index;
+                        found_index = s->index;
                         break;
                     }
                 }
@@ -1048,7 +1048,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
                 pa_source* s;
                 PA_IDXSET_FOREACH(s, u->core->sources, idx) {
                     if (strcmp(s->name, devname) == 0) {
-                        index = s->index;
+                        found_index = s->index;
                         break;
                     }
                 }
@@ -1058,7 +1058,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
             pa_tagstruct_puts(reply, name);
             pa_tagstruct_puts(reply, e->description);
             pa_tagstruct_puts(reply, e->icon);
-            pa_tagstruct_putu32(reply, index);
+            pa_tagstruct_putu32(reply, found_index);
             pa_tagstruct_putu32(reply, NUM_ROLES);
 
             for (uint32_t i = ROLE_NONE; i < NUM_ROLES; ++i) {

commit d25b9eab0fff1040713cf297f40450e0f7641870
Author: Jason Newton <jason at archer.wyred.org>
Date:   Mon Oct 19 18:28:25 2009 -0700

    module-equalizer-sink: drop source executable permissions configure.ac: add enable/disable + summary line for fftw

diff --git a/configure.ac b/configure.ac
index 77ec884..b34821a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1513,6 +1513,11 @@ if test "x${HAVE_SIMPLEDB}" = "x1" ; then
     ENABLE_SIMPLEDB=yes
 fi
 
+ENABLE_FFTW=no
+if test "x${HAVE_FFTW}" = "x1" ; then
+   ENABLE_FFTW=yes
+fi
+
 ENABLE_OPENSSL=no
 if test "x${HAVE_OPENSSL}" = "x1" ; then
    ENABLE_OPENSSL=yes
@@ -1563,6 +1568,7 @@ echo "
     Enable tdb:                    ${ENABLE_TDB}
     Enable gdbm:                   ${ENABLE_GDBM}
     Enable simple database:        ${ENABLE_SIMPLEDB}
+    Enable fftw:                   ${ENABLE_FFTW}
 
     System User:                   ${PA_SYSTEM_USER}
     System Group:                  ${PA_SYSTEM_GROUP}
diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
old mode 100755
new mode 100644

commit ff903ef542375e9b87ed920a7165379d5d754f96
Author: Jason Newton <nevion at gmail.com>
Date:   Thu Oct 8 20:46:52 2009 -0700

    module-equalizer-sink: fixed equalizer state save/restore

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 3a28b49..f5c1fb7 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -814,33 +814,35 @@ static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t s
 static void pack(char **strs, size_t len, char **packed, size_t *length){
     size_t t_len = 0;
     size_t headers = (1+len) * sizeof(uint16_t);
-    size_t offset = sizeof(uint16_t);
+    char *p;
     for(size_t i = 0; i < len; ++i){
         t_len += strlen(strs[i]);
     }
     *length = headers + t_len;
-    *packed = pa_xmalloc0(*length);
-    ((uint16_t *) *packed)[0] = (uint16_t) len;
+    p = *packed = pa_xmalloc0(*length);
+    *((uint16_t *) p) = (uint16_t) len;
+    p += sizeof(uint16_t);
     for(size_t i = 0; i < len; ++i){
         uint16_t l = strlen(strs[i]);
-        *((uint16_t *)(*packed + offset)) = l;
-        offset += sizeof(uint16_t);
-        memcpy(*packed + offset, strs[i], l);
-        offset += l;
+        *((uint16_t *) p) = (uint16_t) l;
+        p += sizeof(uint16_t);
+        memcpy(p, strs[i], l);
+        p += l;
     }
 }
 static void unpack(char *str, size_t length, char ***strs, size_t *len){
-    size_t offset = sizeof(uint16_t);
-    *len = ((uint16_t *)str)[0];
+    char *p = str;
+    *len = *((uint16_t *) p);
+    p += sizeof(uint16_t);
     *strs = pa_xnew(char *, *len);
+
     for(size_t i = 0; i < *len; ++i){
-        size_t l = *((uint16_t *)(str+offset));
-        size_t e = PA_MIN(offset + l, length) - offset;
-        offset = PA_MIN(offset + sizeof(uint16_t), length);
-        (*strs)[i] = pa_xnew(char, e + 1);
-        memcpy((*strs)[i], str + offset, e);
-        (*strs)[i][e] = '\0';
-        offset += l;
+        size_t l = *((uint16_t *) p);
+        p += sizeof(uint16_t);
+        (*strs)[i] = pa_xnew(char, l + 1);
+        memcpy((*strs)[i], p, l);
+        (*strs)[i][l] = '\0';
+        p += l;
     }
 }
 static void save_profile(struct userdata *u, size_t channel, char *name){
@@ -885,17 +887,17 @@ static void save_state(struct userdata *u){
 
     pack(u->base_profiles, u->channels, &packed, &packed_length);
     state = (float *) pa_xmalloc0(filter_state_size + packed_length);
+    memcpy(state + FILTER_STATE_SIZE, packed, packed_length);
+    pa_xfree(packed);
 
     for(size_t c = 0; c < u->channels; ++c){
         a_i = pa_aupdate_read_begin(u->a_H[c]);
-        state[c * CHANNEL_PROFILE_SIZE] = u->Xs[a_i][c];
+        state[c * CHANNEL_PROFILE_SIZE] = u->Xs[c][a_i];
         H = u->Hs[c][a_i];
-        H_n = state + c * CHANNEL_PROFILE_SIZE + 1;
+        H_n = &state[c * CHANNEL_PROFILE_SIZE + 1];
         memcpy(H_n, H, FILTER_SIZE * sizeof(float));
         pa_aupdate_read_end(u->a_H[c]);
     }
-    memcpy(((char *)state) + filter_state_size, packed, packed_length);
-    pa_xfree(packed);
 
     key.data = state_name;
     key.size = strlen(key.data);
@@ -978,13 +980,13 @@ static void load_state(struct userdata *u){
                 memcpy(u->Hs[c][a_i], H, FILTER_SIZE * sizeof(float));
                 pa_aupdate_write_end(u->a_H[c]);
             }
-            //unpack(((char *)value.data) + FILTER_STATE_SIZE, value.size - FILTER_STATE_SIZE, &names, &n_profs);
-            //n_profs = PA_MIN(n_profs, u->channels);
-            //for(size_t c = 0; c < n_profs; ++c){
-            //    pa_xfree(u->base_profiles[c]);
-            //    u->base_profiles[c] = names[c];
-            //}
-            //pa_xfree(names);
+            unpack(((char *)value.data) + FILTER_STATE_SIZE * sizeof(float), value.size - FILTER_STATE_SIZE * sizeof(float), &names, &n_profs);
+            n_profs = PA_MIN(n_profs, u->channels);
+            for(size_t c = 0; c < n_profs; ++c){
+                pa_xfree(u->base_profiles[c]);
+                u->base_profiles[c] = names[c];
+            }
+            pa_xfree(names);
         }
         pa_datum_free(&value);
     }else{

commit 16e77f3ab2bd3e180f4a16432845bbe64db8aa48
Author: Jason Newton <nevion at gmail.com>
Date:   Sun Oct 18 14:52:32 2009 -0700

    module-equalizer-sink:
        *fixed SSE2 optimized dsp logic (default if available)
        *cleaned up whitespace formatting (again)

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index f5c1fb7..814a00f 100755
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -337,7 +337,7 @@ static void sink_set_mute_cb(pa_sink *s) {
     pa_sink_input_set_mute(u->sink_input, s->muted, s->save_muted);
 }
 
-
+#ifndef __SSE2__
 //reference implementation
 static void dsp_logic(
     float * restrict dst,//used as a temp array too, needs to be fft_length!
@@ -351,12 +351,12 @@ static void dsp_logic(
     fftwf_complex * restrict output_window,//The transformed window'd src
     struct userdata *u){
     //use a linear-phase sliding STFT and overlap-add method (for each channel)
-    //zero padd the data
-    memset(dst + u->window_size, 0, (u->fft_size - u->window_size) * sizeof(float));
     //window the data
     for(size_t j = 0; j < u->window_size; ++j){
         dst[j] = X * W[j] * src[j];
     }
+    //zero padd the the remaining fft window
+    memset(dst + u->window_size, 0, (u->fft_size - u->window_size) * sizeof(float));
     //Processing is done here!
     //do fft
     fftwf_execute_dft_r2c(u->forward_plan, dst, output_window);
@@ -390,112 +390,104 @@ static void dsp_logic(
         (u->samples_gathered - u->R) * sizeof(float)
     );
 }
-
+#else
 typedef float v4sf __attribute__ ((__aligned__(v_size * sizeof(float))));
 typedef union float_vector {
     float f[v_size];
     v4sf v;
-#ifdef __SSE2__
     __m128 m;
-#endif
 } float_vector_t;
 
-////regardless of sse enabled, the loops in here assume
-////16 byte aligned addresses and memory allocations divisible by v_size
-//void dsp_logic(
-//    float * restrict dst,//used as a temp array too, needs to be fft_length!
-//    float * restrict src,/*input data w/ overlap at start,
-//                               *automatically cycled in routine
-//                               */
-//    float * restrict overlap,//The size of the overlap
-//    const float X,//multipliar
-//    const float * restrict H,//The freq. magnitude scalers filter
-//    const float * restrict W,//The windowing function
-//    fftwf_complex * restrict output_window,//The transformed window'd src
-//    struct userdata *u){//Collection of constants
-      //float_vector_t x = {X, X, X, X};
-//    const size_t window_size = PA_ROUND_UP(u->window_size,v_size);
-//    const size_t fft_h = PA_ROUND_UP(FILTER_SIZE, v_size / 2);
-//    //const size_t R = PA_ROUND_UP(u->R, v_size);
-//    const size_t overlap_size = PA_ROUND_UP(u->overlap_size, v_size);
-//     overlap_size = PA_ROUND_UP(u->overlap_size, v_size);
-//
-//    //assert(u->samples_gathered >= u->R);
-//    //zero out the bit beyond the real overlap so we don't add garbage
-//    for(size_t j = overlap_size; j > u->overlap_size; --j){
-//       overlap[j-1] = 0;
-//    }
-//    //use a linear-phase sliding STFT and overlap-add method
-//    //zero padd the data
-//    memset(dst + u->window_size, 0, (u->fft_size - u->window_size)*sizeof(float));
-//    //window the data
-//    for(size_t j = 0; j < window_size; j += v_size){
-//        //dst[j] = W[j]*src[j];
-//        float_vector_t *d = (float_vector_t*) (dst+j);
-//        float_vector_t *w = (float_vector_t*) (W+j);
-//        float_vector_t *s = (float_vector_t*) (src+j);
+//regardless of sse enabled, the loops in here assume
+//16 byte aligned addresses and memory allocations divisible by v_size
+static void dsp_logic(
+    float * restrict dst,//used as a temp array too, needs to be fft_length!
+    float * restrict src,/*input data w/ overlap at start,
+                               *automatically cycled in routine
+                               */
+    float * restrict overlap,//The size of the overlap
+    const float X,//multipliar
+    const float * restrict H,//The freq. magnitude scalers filter
+    const float * restrict W,//The windowing function
+    fftwf_complex * restrict output_window,//The transformed window'd src
+    struct userdata *u){//Collection of constants
+    const size_t overlap_size = PA_ROUND_UP(u->overlap_size, v_size);
+
+
+    //assert(u->samples_gathered >= u->R);
+    //use a linear-phase sliding STFT and overlap-add method
+    for(size_t j = 0; j < u->window_size; j += v_size){
+        //dst[j] = W[j] * src[j];
+        float_vector_t *d = (float_vector_t*) (dst + j);
+        float_vector_t *w = (float_vector_t*) (W + j);
+        float_vector_t *s = (float_vector_t*) (src + j);
 //#if __SSE2__
-//        d->m = _mm_mul_ps(x->m, _mm_mul_ps(w->m, s->m));
+        d->m = _mm_mul_ps(w->m, s->m);
 //#else
-//        d->v = x->v * w->v * s->v;
+//        d->v = w->v * s->v;
 //#endif
-//    }
-//    //Processing is done here!
-//    //do fft
-//    fftwf_execute_dft_r2c(u->forward_plan, dst, output_window);
-//
-//
-//    //perform filtering - purely magnitude based
-//    for(size_t j = 0;j < fft_h; j+=v_size/2){
-//        //output_window[j][0]*=H[j];
-//        //output_window[j][1]*=H[j];
-//        float_vector_t *d = (float_vector_t*)(output_window+j);
-//        float_vector_t h;
-//        h.f[0] = h.f[1] = H[j];
-//        h.f[2] = h.f[3] = H[j+1];
+    }
+    //zero padd the the remaining fft window
+    memset(dst + u->window_size, 0, (u->fft_size - u->window_size) * sizeof(float));
+
+    //Processing is done here!
+    //do fft
+    fftwf_execute_dft_r2c(u->forward_plan, dst, output_window);
+    //perform filtering - purely magnitude based
+    for(size_t j = 0; j < FILTER_SIZE; j += v_size / 2){
+        //output_window[j][0]*=H[j];
+        //output_window[j][1]*=H[j];
+        float_vector_t *d = (float_vector_t*)( ((float *) output_window) + 2 * j);
+        float_vector_t h;
+        h.f[0] = h.f[1] = H[j];
+        h.f[2] = h.f[3] = H[j + 1];
 //#if __SSE2__
-//        d->m = _mm_mul_ps(d->m, h.m);
+        d->m = _mm_mul_ps(d->m, h.m);
 //#else
-//        d->v = d->v*h->v;
+//        d->v = d->v * h.v;
 //#endif
-//    }
-//    //inverse fft
-//    fftwf_execute_dft_c2r(u->inverse_plan, output_window, dst);
-//
-//    ////debug: tests overlaping add
-//    ////and negates ALL PREVIOUS processing
-//    ////yields a perfect reconstruction if COLA is held
-//    //for(size_t j = 0; j < u->window_size; ++j){
-//    //    dst[j] = W[j]*src[j];
-//    //}
-//
-//    //overlap add and preserve overlap component from this window (linear phase)
-//    for(size_t j = 0; j < overlap_size; j+=v_size){
-//        //dst[j]+=overlap[j];
-//        //overlap[j]+=dst[j+R];
-//        float_vector_t *d = (float_vector_t*)(dst+j);
-//        float_vector_t *o = (float_vector_t*)(overlap+j);
+    }
+
+    //inverse fft
+    fftwf_execute_dft_c2r(u->inverse_plan, output_window, dst);
+
+    ////debug: tests overlaping add
+    ////and negates ALL PREVIOUS processing
+    ////yields a perfect reconstruction if COLA is held
+    //for(size_t j = 0; j < u->window_size; ++j){
+    //    dst[j] = W[j] * src[j];
+    //}
+
+    //overlap add and preserve overlap component from this window (linear phase)
+    for(size_t j = 0; j < overlap_size; j += v_size){
+        //dst[j]+=overlap[j];
+        //overlap[j]+=dst[j+R];
+        float_vector_t *d = (float_vector_t*)(dst + j);
+        float_vector_t *o = (float_vector_t*)(overlap + j);
 //#if __SSE2__
-//        d->m = _mm_add_ps(d->m, o->m);
-//        o->m = ((float_vector_t*)(dst+u->R+j))->m;
+        d->m = _mm_add_ps(d->m, o->m);
+        o->m = ((float_vector_t*)(dst + u->R + j))->m;
 //#else
-//        d->v = d->v+o->v;
-//        o->v = ((float_vector_t*)(dst+u->R+j))->v;
+//        d->v = d->v + o->v;
+//        o->v = ((float_vector_t*)(dst + u->R + j))->v;
 //#endif
-//    }
-//    //memcpy(overlap, dst+u->R, u->overlap_size*sizeof(float));
-//
-//    //////debug: tests if basic buffering works
-//    //////shouldn't modify the signal AT ALL (beyond roundoff)
-//    //for(size_t j = 0; j < u->window_size; ++j){
-//    //    dst[j] = src[j];
-//    //}
-//
-//    //preseve the needed input for the next window's overlap
-//    memmove(src, src + u->R,
-//        u->overlap_size * sizeof(float)
-//    );
-//}
+    }
+    //memcpy(overlap, dst+u->R, u->overlap_size * sizeof(float)); //overlap preserve (debug)
+    //zero out the bit beyond the real overlap so we don't add garbage next iteration
+    memset(overlap + u->overlap_size, 0, overlap_size - u->overlap_size);
+
+    ////debug: tests if basic buffering works
+    ////shouldn't modify the signal AT ALL (beyond roundoff)
+    //for(size_t j = 0; j < u->window_size; ++j){
+    //    dst[j] = src[j];
+    //}
+
+    //preseve the needed input for the next window's overlap
+    memmove(src, src + u->R,
+        (u->samples_gathered - u->R) * sizeof(float)
+    );
+}
+#endif
 
 static void process_samples(struct userdata *u, pa_memchunk *tchunk){
     size_t fs = pa_frame_size(&(u->sink->sample_spec));
@@ -685,7 +677,7 @@ static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
             //invalidate the output q
             pa_memblockq_seek(u->input_q, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
             pa_log("Resetting filter");
-            reset_filter(u);
+            //reset_filter(u); //this is the "proper" thing to do...
         }
     }
 
@@ -1064,9 +1056,12 @@ int pa__init(pa_module*m) {
     pa_modargs_get_value_boolean(ma, "set_default", &u->set_default);
 
     u->channels = ss.channels;
-    u->fft_size = pow(2, ceil(log(ss.rate)/log(2)));//probably unstable near corner cases of powers of 2
+    u->fft_size = pow(2, ceil(log(ss.rate) / log(2)));//probably unstable near corner cases of powers of 2
     pa_log_debug("fft size: %ld", u->fft_size);
     u->window_size = 15999;
+    if(u->window_size % 2 == 0){
+        u->window_size--;
+    }
     u->R = (u->window_size + 1) / 2;
     u->overlap_size = u->window_size - u->R;
     u->samples_gathered = 0;
@@ -1090,7 +1085,6 @@ int pa__init(pa_module*m) {
         u->a_H[c] = pa_aupdate_new();
         u->input[c] = NULL;
         u->overlap_accum[c] = alloc(u->overlap_size, sizeof(float));
-        memset(u->overlap_accum[c], 0, u->overlap_size*sizeof(float));
     }
     u->output_window = alloc((FILTER_SIZE), sizeof(fftwf_complex));
     u->forward_plan = fftwf_plan_dft_r2c_1d(u->fft_size, u->work_buffer, u->output_window, FFTW_ESTIMATE);

commit e9ccc61a2f561c37939e34a192bd7bd953eb8cbc
Author: Jason Newton <jason at archer.wyred.org>
Date:   Mon Oct 19 18:28:25 2009 -0700

    module-equalizer-sink: drop source executable permissions configure.ac: add enable/disable + summary line for fftw

diff --git a/configure.ac b/configure.ac
index 77ec884..b34821a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1513,6 +1513,11 @@ if test "x${HAVE_SIMPLEDB}" = "x1" ; then
     ENABLE_SIMPLEDB=yes
 fi
 
+ENABLE_FFTW=no
+if test "x${HAVE_FFTW}" = "x1" ; then
+   ENABLE_FFTW=yes
+fi
+
 ENABLE_OPENSSL=no
 if test "x${HAVE_OPENSSL}" = "x1" ; then
    ENABLE_OPENSSL=yes
@@ -1563,6 +1568,7 @@ echo "
     Enable tdb:                    ${ENABLE_TDB}
     Enable gdbm:                   ${ENABLE_GDBM}
     Enable simple database:        ${ENABLE_SIMPLEDB}
+    Enable fftw:                   ${ENABLE_FFTW}
 
     System User:                   ${PA_SYSTEM_USER}
     System Group:                  ${PA_SYSTEM_GROUP}
diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
old mode 100755
new mode 100644

commit 9c61465c796f3369c7cc57c094489fb383216a1b
Merge: e11cd13 e9ccc61
Author: Daniel Mack <daniel at caiaq.de>
Date:   Tue Oct 27 13:00:08 2009 +0100

    Merge branch 'master' of git://0pointer.de/pulseaudio


commit 744490a681be7356efba4160bfb29a3e76e85888
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Oct 28 21:29:01 2009 +0100

    memblock: decrease tile size to 64k again

diff --git a/src/pulsecore/memblock.c b/src/pulsecore/memblock.c
index eac4a59..f38b17c 100644
--- a/src/pulsecore/memblock.c
+++ b/src/pulsecore/memblock.c
@@ -54,7 +54,7 @@
  * stored in SHM and our OS does not commit the memory before we use
  * it for the first time. */
 #define PA_MEMPOOL_SLOTS_MAX 1024
-#define PA_MEMPOOL_SLOT_SIZE (128*1024)
+#define PA_MEMPOOL_SLOT_SIZE (64*1024)
 
 #define PA_MEMEXPORT_SLOTS_MAX 128
 

commit 4538523a2999ee36e19f3f09a8ca5328185f9a67
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Oct 28 23:26:48 2009 +0100

    libpulse: introduce pa_context_get_tile_size() call

diff --git a/src/map-file b/src/map-file
index 6f7bdac..5011122 100644
--- a/src/map-file
+++ b/src/map-file
@@ -66,6 +66,7 @@ pa_context_get_source_info_list;
 pa_context_get_source_output_info;
 pa_context_get_source_output_info_list;
 pa_context_get_state;
+pa_context_get_tile_size;
 pa_context_is_local;
 pa_context_is_pending;
 pa_context_kill_client;
diff --git a/src/pulse/context.c b/src/pulse/context.c
index 7468d0a..e33143d 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -1488,6 +1488,7 @@ pa_time_event* pa_context_rttime_new(pa_context *c, pa_usec_t usec, pa_time_even
     struct timeval tv;
 
     pa_assert(c);
+    pa_assert(PA_REFCNT_VALUE(c) >= 1);
     pa_assert(c->mainloop);
 
     if (usec == PA_USEC_INVALID)
@@ -1502,8 +1503,10 @@ void pa_context_rttime_restart(pa_context *c, pa_time_event *e, pa_usec_t usec)
     struct timeval tv;
 
     pa_assert(c);
+    pa_assert(PA_REFCNT_VALUE(c) >= 1);
     pa_assert(c->mainloop);
 
+
     if (usec == PA_USEC_INVALID)
         c->mainloop->time_restart(e, NULL);
     else {
@@ -1511,3 +1514,17 @@ void pa_context_rttime_restart(pa_context *c, pa_time_event *e, pa_usec_t usec)
         c->mainloop->time_restart(e, &tv);
     }
 }
+
+size_t pa_context_get_tile_size(pa_context *c, const pa_sample_spec *ss) {
+    size_t fs, mbs;
+
+    pa_assert(c);
+    pa_assert(PA_REFCNT_VALUE(c) >= 1);
+
+    PA_CHECK_VALIDITY_RETURN_ANY(c, !pa_detect_fork(), PA_ERR_FORKED, (size_t) -1);
+    PA_CHECK_VALIDITY_RETURN_ANY(c, !ss || pa_sample_spec_valid(ss), PA_ERR_INVALID, (size_t) -1);
+
+    fs = ss ? pa_frame_size(ss) : 1;
+    mbs = PA_ROUND_DOWN(pa_mempool_block_size_max(c->mempool), fs);
+    return PA_MAX(mbs, fs);
+}
diff --git a/src/pulse/context.h b/src/pulse/context.h
index ecff58d..6ac8ee5 100644
--- a/src/pulse/context.h
+++ b/src/pulse/context.h
@@ -255,12 +255,28 @@ pa_operation *pa_context_proplist_remove(pa_context *c, const char *const keys[]
 uint32_t pa_context_get_index(pa_context *s);
 
 /** Create a new timer event source for the specified time (wrapper
-    for mainloop->time_new). \since 0.9.16 */
+ * for mainloop->time_new). \since 0.9.16 */
 pa_time_event* pa_context_rttime_new(pa_context *c, pa_usec_t usec, pa_time_event_cb_t cb, void *userdata);
-/** Restart a running or expired timer event source (wrapper
-    for mainloop->time_restart). \since 0.9.16 */
+
+/** Restart a running or expired timer event source (wrapper for
+ * mainloop->time_restart). \since 0.9.16 */
 void pa_context_rttime_restart(pa_context *c, pa_time_event *e, pa_usec_t usec);
 
+/* Return the optimal block size for passing around audio buffers. It
+ * is recommended to allocate buffers of the size returned here when
+ * writing audio data to playback streams, if the latency constraints
+ * permit this. It is not recommended writing larger blocks than this
+ * because usually they will then be split up internally into chunks
+ * of this size. It is not recommended writing smaller blocks than
+ * this (unless required due to latency demands) because this
+ * increases CPU usage. If ss is NULL you will be returned the
+ * byte-exact tile size. If you pass a valid ss, then the tile size
+ * will be rounded down to multiple of the frame size. This is
+ * supposed to be used in a construct such as
+ * pa_context_get_tile_size(pa_stream_get_context(s),
+ * pa_stream_get_sample_spec(ss)); \since 0.9.20 */
+size_t pa_context_get_tile_size(pa_context *c, const pa_sample_spec *ss);
+
 PA_C_DECL_END
 
 #endif

commit 7c55d6e91d21971e187bf9602dce38cb49666cc4
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Oct 28 23:27:14 2009 +0100

    clients: drop definition of BUFSIZE which is unused

diff --git a/src/utils/pactl.c b/src/utils/pactl.c
index 141ab5b..51de120 100644
--- a/src/utils/pactl.c
+++ b/src/utils/pactl.c
@@ -44,8 +44,6 @@
 #include <pulsecore/log.h>
 #include <pulsecore/sndfile-util.h>
 
-#define BUFSIZE (16*1024)
-
 static pa_context *context = NULL;
 static pa_mainloop_api *mainloop_api = NULL;
 
diff --git a/src/utils/pasuspender.c b/src/utils/pasuspender.c
index c327ee4..534b77b 100644
--- a/src/utils/pasuspender.c
+++ b/src/utils/pasuspender.c
@@ -45,8 +45,6 @@
 #include <pulse/pulseaudio.h>
 #include <pulsecore/macro.h>
 
-#define BUFSIZE 1024
-
 static pa_context *context = NULL;
 static pa_mainloop_api *mainloop_api = NULL;
 static char **child_argv = NULL;

commit 8678f565322ccc1bfbaa0f21024f7255ed58b933
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Oct 28 23:27:50 2009 +0100

    pactl: include information about client context in pactl stat output

diff --git a/src/utils/pactl.c b/src/utils/pactl.c
index 51de120..7ef02ec 100644
--- a/src/utils/pactl.c
+++ b/src/utils/pactl.c
@@ -156,10 +156,23 @@ static void get_server_info_callback(pa_context *c, const pa_server_info *i, voi
         return;
     }
 
+    printf(_("Server String: %s\n"
+             "Library Protocol Version: %u\n"
+             "Server Protocol Version: %u\n"
+             "Is Local: %s\n"
+             "Client Index: %u\n"
+             "Tile Size: %zu\n"),
+             pa_context_get_server(c),
+             pa_context_get_protocol_version(c),
+             pa_context_get_server_protocol_version(c),
+             pa_yes_no(pa_context_is_local(c)),
+             pa_context_get_index(c),
+             pa_context_get_tile_size(c, NULL));
+
     pa_sample_spec_snprint(ss, sizeof(ss), &i->sample_spec);
     pa_channel_map_snprint(cm, sizeof(cm), &i->channel_map);
 
-    printf(_("User name: %s\n"
+    printf(_("User Name: %s\n"
              "Host Name: %s\n"
              "Server Name: %s\n"
              "Server Version: %s\n"

commit 78984e439553f5e6eeb97c90ec1df9141fbe91d8
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Oct 28 23:28:12 2009 +0100

    pactl: format cookie a little bit nicer

diff --git a/src/utils/pactl.c b/src/utils/pactl.c
index 7ef02ec..ee67c42 100644
--- a/src/utils/pactl.c
+++ b/src/utils/pactl.c
@@ -180,7 +180,7 @@ static void get_server_info_callback(pa_context *c, const pa_server_info *i, voi
              "Default Channel Map: %s\n"
              "Default Sink: %s\n"
              "Default Source: %s\n"
-             "Cookie: %08x\n"),
+             "Cookie: %04x:%04x\n"),
            i->user_name,
            i->host_name,
            i->server_name,
@@ -189,7 +189,8 @@ static void get_server_info_callback(pa_context *c, const pa_server_info *i, voi
            cm,
            i->default_sink_name,
            i->default_source_name,
-           i->cookie);
+           i->cookie >> 16,
+           i->cookie & 0xFFFFU);
 
     complete_action();
 }

commit 27c6a80ccb9ccfdd00524360938599cf2d14d4b6
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Oct 28 23:47:21 2009 +0100

    protocol-native: declare that user configured volumes are always absolute

diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index d06dd4e..b7471c0 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -1047,8 +1047,10 @@ static playback_stream* playback_stream_new(
     data.sink = sink;
     pa_sink_input_new_data_set_sample_spec(&data, ss);
     pa_sink_input_new_data_set_channel_map(&data, map);
-    if (volume)
+    if (volume) {
         pa_sink_input_new_data_set_volume(&data, volume);
+        data.volume_is_absolute = TRUE;
+    }
     if (muted_set)
         pa_sink_input_new_data_set_muted(&data, muted);
     data.sync_base = ssync ? ssync->sink_input : NULL;

commit 2501687579e359d5032a4d165b2ffc8f5b1b8ba6
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Oct 28 23:47:50 2009 +0100

    libpulse: explain semantics of pa_stream_connect_playback() in more detail

diff --git a/src/pulse/stream.h b/src/pulse/stream.h
index 2e8e71a..bc54a11 100644
--- a/src/pulse/stream.h
+++ b/src/pulse/stream.h
@@ -401,7 +401,22 @@ int pa_stream_is_suspended(pa_stream *s);
  * not, and negative on error. \since 0.9.11 */
 int pa_stream_is_corked(pa_stream *s);
 
-/** Connect the stream to a sink */
+/** Connect the stream to a sink. It is strongly recommended to pass
+ * NULL in both dev and volume and not to set either
+ * PA_STREAM_START_MUTED nor PA_STREAM_START_UNMUTED -- unless these
+ * options are directly dependant on user input or configuration. If
+ * you follow this rule then the sound server will have the full
+ * flexibility to choose the device, volume and mute status
+ * automatically, based on server-side policies, heuristics and stored
+ * information from previous uses. Also the server may choose to
+ * reconfigure audio devices to make other sinks/sources or
+ * capabilities available to be able to accept the stream. Before
+ * 0.9.20 it was not defined whether the 'volume' parameter was
+ * interpreted relative to the sink's current volume or treated as
+ * absolute device volume. Since 0.9.20 it is an absolute volume when
+ * the sink is in flat volume mode, and relative otherwise, thus
+ * making sure the volume passed here has always the same semantics as
+ * the volume passed to pa_context_set_sink_input_volume(). */
 int pa_stream_connect_playback(
         pa_stream *s                  /**< The stream to connect to a sink */,
         const char *dev               /**< Name of the sink to connect to, or NULL for default */ ,

commit 546bcf3f2f9711f0d08c21c3b775994844e7e2a2
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Oct 28 23:50:42 2009 +0100

    protocol-native: if a client set volume/mute/device store it since it is user input

diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index b7471c0..010420e 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -1044,15 +1044,21 @@ static playback_stream* playback_stream_new(
     data.driver = __FILE__;
     data.module = c->options->module;
     data.client = c->client;
-    data.sink = sink;
+    if (sink) {
+        data.sink = sink;
+        data.save_sink = TRUE;
+    }
     pa_sink_input_new_data_set_sample_spec(&data, ss);
     pa_sink_input_new_data_set_channel_map(&data, map);
     if (volume) {
         pa_sink_input_new_data_set_volume(&data, volume);
         data.volume_is_absolute = TRUE;
+        data.save_volume = TRUE;
     }
-    if (muted_set)
+    if (muted_set) {
         pa_sink_input_new_data_set_muted(&data, muted);
+        data.save_muted = TRUE;
+    }
     data.sync_base = ssync ? ssync->sink_input : NULL;
     data.flags = flags;
 

commit f27a50691c8fe45bac7dd6b21fac91a359def3a1
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Oct 29 00:46:22 2009 +0100

    libpulse: introduce PA_STREAM_RELATIVE_VOLUME

diff --git a/PROTOCOL b/PROTOCOL
index 92cc283..883b8bb 100644
--- a/PROTOCOL
+++ b/PROTOCOL
@@ -188,3 +188,9 @@ new messages:
 
   PA_COMMAND_SET_SINK_PORT
   PA_COMMAND_SET_SOURCE_PORT
+
+## v17, implemented by >= 0.9.20
+
+new flag at end of CREATE_PLAYBACK_STREAM:
+
+    bool relative_volume
diff --git a/configure.ac b/configure.ac
index b34821a..d7f55ac 100644
--- a/configure.ac
+++ b/configure.ac
@@ -40,7 +40,7 @@ AC_SUBST(PA_MAJORMINORMICRO, pa_major.pa_minor.pa_micro)
 AC_SUBST(PACKAGE_URL, [http://pulseaudio.org/])
 
 AC_SUBST(PA_API_VERSION, 12)
-AC_SUBST(PA_PROTOCOL_VERSION, 16)
+AC_SUBST(PA_PROTOCOL_VERSION, 17)
 
 # The stable ABI for client applications, for the version info x:y:z
 # always will hold y=z
diff --git a/src/pulse/def.h b/src/pulse/def.h
index 5d0a0b4..30a076d 100644
--- a/src/pulse/def.h
+++ b/src/pulse/def.h
@@ -276,11 +276,18 @@ typedef enum pa_stream_flags {
      * whether to create the stream in muted or in unmuted
      * state. \since 0.9.15 */
 
-    PA_STREAM_FAIL_ON_SUSPEND = 0x20000U
+    PA_STREAM_FAIL_ON_SUSPEND = 0x20000U,
     /**< If the sink/source this stream is connected to is suspended
      * during the creation of this stream, cause it to fail. If the
      * sink/source is being suspended during creation of this stream,
      * make sure this stream is terminated. \since 0.9.15 */
+
+    PA_STREAM_RELATIVE_VOLUME = 0x40000U,
+    /**< If a volume is passed when this stream is created, consider
+     * it relative to the sink's current volume, never as absolute
+     * device volume. If this is not specified the volume will be
+     * consider absolute when the sink is in flat volume mode,
+     * relative otherwise. \since 0.9.20 */
 } pa_stream_flags_t;
 
 /** \cond fulldocs */
@@ -307,6 +314,7 @@ typedef enum pa_stream_flags {
 #define PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND
 #define PA_STREAM_START_UNMUTED PA_STREAM_START_UNMUTED
 #define PA_STREAM_FAIL_ON_SUSPEND PA_STREAM_FAIL_ON_SUSPEND
+#define PA_STREAM_RELATIVE_VOLUME PA_STREAM_RELATIVE_VOLUME
 
 /** \endcond */
 
diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index 2bc2b1e..2997962 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -1025,7 +1025,8 @@ static int create_stream(
                                               PA_STREAM_EARLY_REQUESTS|
                                               PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND|
                                               PA_STREAM_START_UNMUTED|
-                                              PA_STREAM_FAIL_ON_SUSPEND)), PA_ERR_INVALID);
+                                              PA_STREAM_FAIL_ON_SUSPEND|
+                                              PA_STREAM_RELATIVE_VOLUME)), PA_ERR_INVALID);
 
     PA_CHECK_VALIDITY(s->context, s->context->version >= 12 || !(flags & PA_STREAM_VARIABLE_RATE), PA_ERR_NOTSUPPORTED);
     PA_CHECK_VALIDITY(s->context, s->context->version >= 13 || !(flags & PA_STREAM_PEAK_DETECT), PA_ERR_NOTSUPPORTED);
@@ -1158,6 +1159,13 @@ static int create_stream(
         pa_tagstruct_put_boolean(t, flags & PA_STREAM_FAIL_ON_SUSPEND);
     }
 
+    if (s->context->version >= 17) {
+
+        if (s->direction == PA_STREAM_PLAYBACK)
+            pa_tagstruct_put_boolean(t, flags & PA_STREAM_RELATIVE_VOLUME);
+
+    }
+
     pa_pstream_send_tagstruct(s->context->pstream, t);
     pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_create_stream_callback, s, NULL);
 
diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index 010420e..bb29a19 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -1002,6 +1002,7 @@ static playback_stream* playback_stream_new(
         pa_proplist *p,
         pa_bool_t adjust_latency,
         pa_bool_t early_requests,
+        pa_bool_t relative_volume,
         int *ret) {
 
     playback_stream *s, *ssync;
@@ -1052,7 +1053,7 @@ static playback_stream* playback_stream_new(
     pa_sink_input_new_data_set_channel_map(&data, map);
     if (volume) {
         pa_sink_input_new_data_set_volume(&data, volume);
-        data.volume_is_absolute = TRUE;
+        data.volume_is_absolute = !relative_volume;
         data.save_volume = TRUE;
     }
     if (muted_set) {
@@ -1846,7 +1847,8 @@ static void command_create_playback_stream(pa_pdispatch *pd, uint32_t command, u
         early_requests = FALSE,
         dont_inhibit_auto_suspend = FALSE,
         muted_set = FALSE,
-        fail_on_suspend = FALSE;
+        fail_on_suspend = FALSE,
+        relative_volume = FALSE;
     pa_sink_input_flags_t flags = 0;
     pa_proplist *p;
     pa_bool_t volume_set = TRUE;
@@ -1939,6 +1941,15 @@ static void command_create_playback_stream(pa_pdispatch *pd, uint32_t command, u
         }
     }
 
+    if (c->version >= 17) {
+
+        if (pa_tagstruct_get_boolean(t, &relative_volume) < 0) {
+            protocol_error(c);
+            pa_proplist_free(p);
+            return;
+        }
+    }
+
     if (!pa_tagstruct_eof(t)) {
         protocol_error(c);
         pa_proplist_free(p);
@@ -1978,7 +1989,7 @@ static void command_create_playback_stream(pa_pdispatch *pd, uint32_t command, u
      * flag. For older versions we synthesize it here */
     muted_set = muted_set || muted;
 
-    s = playback_stream_new(c, sink, &ss, &map, &attr, volume_set ? &volume : NULL, muted, muted_set, syncid, &missing, flags, p, adjust_latency, early_requests, &ret);
+    s = playback_stream_new(c, sink, &ss, &map, &attr, volume_set ? &volume : NULL, muted, muted_set, syncid, &missing, flags, p, adjust_latency, early_requests, relative_volume, &ret);
     pa_proplist_free(p);
 
     CHECK_VALIDITY(c->pstream, s, tag, ret);

commit 2edb4df175ee69e386ec3923e69af6899f55e2eb
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Oct 29 01:49:40 2009 +0100

    smoother: add comments about optimization recommendations from Jason Newton

diff --git a/src/pulsecore/time-smoother.c b/src/pulsecore/time-smoother.c
index d6c3787..1371ad5 100644
--- a/src/pulsecore/time-smoother.c
+++ b/src/pulsecore/time-smoother.c
@@ -196,6 +196,13 @@ static double avg_gradient(pa_smoother *s, pa_usec_t x) {
     int64_t ax = 0, ay = 0, k, t;
     double r;
 
+    /* FIXME: Optimization: Jason Newton suggested that instead of
+     * going through the history on each iteration we could calculated
+     * avg_gradient() as we go.
+     *
+     * Second idea: it might make sense to weight history entries:
+     * more recent entries should matter more than old ones. */
+
     /* Too few measurements, assume gradient of 1 */
     if (s->n_history < s->min_history)
         return 1;

commit e7e4e4459e6dad888d1f9a01d0b185221e1a120e
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Oct 29 01:52:39 2009 +0100

    simd: update test cases

diff --git a/src/pulsecore/svolume_mmx.c b/src/pulsecore/svolume_mmx.c
index 745c7de..5bf72ed 100644
--- a/src/pulsecore/svolume_mmx.c
+++ b/src/pulsecore/svolume_mmx.c
@@ -25,6 +25,8 @@
 #endif
 
 #include <pulse/timeval.h>
+#include <pulse/rtclock.h>
+
 #include <pulsecore/random.h>
 #include <pulsecore/macro.h>
 #include <pulsecore/g711.h>
@@ -287,6 +289,8 @@ static void run_test (void) {
     }
     stop = pa_rtclock_now();
     pa_log_info("ref: %llu usec.", (long long unsigned int)(stop - start));
+
+    pa_assert_se(memcmp(samples_ref, samples, sizeof(samples)) == 0);
 }
 #endif
 
diff --git a/src/pulsecore/svolume_sse.c b/src/pulsecore/svolume_sse.c
index 1cc4e0a..620524f 100644
--- a/src/pulsecore/svolume_sse.c
+++ b/src/pulsecore/svolume_sse.c
@@ -25,6 +25,8 @@
 #endif
 
 #include <pulse/timeval.h>
+#include <pulse/rtclock.h>
+
 #include <pulsecore/random.h>
 #include <pulsecore/macro.h>
 #include <pulsecore/g711.h>
@@ -261,7 +263,7 @@ static void run_test (void) {
 
     func = pa_get_volume_func (PA_SAMPLE_S16NE);
 
-    printf ("checking SSE %zd\n", sizeof (samples));
+    printf ("checking SSE2 %zd\n", sizeof (samples));
 
     pa_random (samples, sizeof (samples));
     memcpy (samples_ref, samples, sizeof (samples));
@@ -273,7 +275,7 @@ static void run_test (void) {
         volumes[i] = volumes[padding];
 
     func (samples_ref, volumes, CHANNELS, sizeof (samples));
-    pa_volume_s16ne_sse (samples, volumes, CHANNELS, sizeof (samples));
+    pa_volume_s16ne_sse2 (samples, volumes, CHANNELS, sizeof (samples));
     for (i = 0; i < SAMPLES; i++) {
         if (samples[i] != samples_ref[i]) {
             printf ("%d: %04x != %04x (%04x * %04x)\n", i, samples[i], samples_ref[i],
@@ -284,7 +286,7 @@ static void run_test (void) {
     start = pa_rtclock_now();
     for (j = 0; j < TIMES; j++) {
         memcpy (samples, samples_orig, sizeof (samples));
-        pa_volume_s16ne_sse (samples, volumes, CHANNELS, sizeof (samples));
+        pa_volume_s16ne_sse2 (samples, volumes, CHANNELS, sizeof (samples));
     }
     stop = pa_rtclock_now();
     pa_log_info("SSE: %llu usec.", (long long unsigned int)(stop - start));
@@ -296,6 +298,8 @@ static void run_test (void) {
     }
     stop = pa_rtclock_now();
     pa_log_info("ref: %llu usec.", (long long unsigned int)(stop - start));
+
+    pa_assert_se(memcmp(samples_ref, samples, sizeof(samples)) == 0);
 }
 #endif
 #endif /* defined (__i386__) || defined (__amd64__) */

commit 754644fa6e1ec83dba85bf586a2b09c2283aa096
Merge: e7e4e44 e9ccc61
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Oct 29 01:54:45 2009 +0100

    Merge remote branch 'origin/master'


commit 5c82dd67d05ab12cd74e8d034b89a9bc326f0548
Author: Jason Newton <nevion at gmail.com>
Date:   Fri Oct 23 17:06:30 2009 -0700

    drop redundant alloc call

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 814a00f..6c060d3 100644
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -571,7 +571,6 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     }else{
         //allocate request_size + overlap
         target_samples += u->overlap_size;
-        alloc_input_buffers(u, target_samples);
     }
     alloc_input_buffers(u, target_samples);
     chunk->memblock = NULL;

commit ebaca56a752f599e10c1a60852c8988c6f2f866c
Author: Jason Newton <nevion at gmail.com>
Date:   Mon Oct 26 14:55:11 2009 -0700

    module-equalizer-sink: try to limit buffering to mempool's max_block_size and disable debug output

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 6c060d3..ec36160 100644
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -556,15 +556,22 @@ static void input_buffer(struct userdata *u, pa_memchunk *in){
 /* Called from I/O thread context */
 static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) {
     struct userdata *u;
-    size_t fs, target_samples;
-    struct timeval start, end;
+    size_t fs, target_samples, mbs;
+    //struct timeval start, end;
     pa_memchunk tchunk;
     pa_sink_input_assert_ref(i);
     pa_assert_se(u = i->userdata);
     pa_assert(chunk);
     pa_assert(u->sink);
     fs = pa_frame_size(&(u->sink->sample_spec));
+    nbytes = PA_MIN(nbytes, pa_mempool_block_size_max(u->sink->core->mempool));
     target_samples = PA_ROUND_UP(nbytes / fs, u->R);
+    mbs = pa_mempool_block_size_max(u->sink->core->mempool);
+    //pa_log_debug("vanilla mbs = %ld",mbs);
+    mbs = PA_ROUND_DOWN(mbs / fs, u->R);
+    mbs = PA_MAX(mbs, u->R);
+    target_samples = PA_MAX(target_samples, mbs);
+    //pa_log_debug("target samples: %ld", target_samples);
     if(u->first_iteration){
         //allocate request_size
         target_samples = PA_MAX(target_samples, u->window_size);
@@ -573,15 +580,17 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         target_samples += u->overlap_size;
     }
     alloc_input_buffers(u, target_samples);
+    //pa_log_debug("post target samples: %ld", target_samples);
     chunk->memblock = NULL;
 
     /* Hmm, process any rewind request that might be queued up */
     pa_sink_process_rewind(u->sink, 0);
 
     //pa_log_debug("start output-buffered %ld, input-buffered %ld, requested %ld",buffered_samples,u->samples_gathered,samples_requested);
-    pa_rtclock_get(&start);
+    //pa_rtclock_get(&start);
     do{
         size_t input_remaining = target_samples - u->samples_gathered;
+       // pa_log_debug("input remaining %ld samples", input_remaining);
         pa_assert(input_remaining > 0);
         while(pa_memblockq_peek(u->input_q, &tchunk) < 0){
             //pa_sink_render(u->sink, input_remaining * fs, &tchunk);
@@ -596,23 +605,23 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         //pa_log_debug("asked for %ld input samples, got %ld samples",input_remaining,buffer->length/fs);
         /* copy new input */
         //pa_rtclock_get(start);
+       // pa_log_debug("buffering %ld bytes", tchunk.length);
         input_buffer(u, &tchunk);
         //pa_rtclock_get(&end);
         //pa_log_debug("Took %0.5f seconds to setup", pa_timeval_diff(end, start) / (double) PA_USEC_PER_SEC);
         pa_memblock_unref(tchunk.memblock);
     }while(u->samples_gathered < target_samples);
 
-    pa_rtclock_get(&end);
-    pa_log_debug("Took %0.6f seconds to get data", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
+    //pa_rtclock_get(&end);
+    //pa_log_debug("Took %0.6f seconds to get data", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
 
     pa_assert(u->fft_size >= u->window_size);
     pa_assert(u->R < u->window_size);
-    /* set the H filter */
-    pa_rtclock_get(&start);
+    //pa_rtclock_get(&start);
     /* process a block */
     process_samples(u, chunk);
-    pa_rtclock_get(&end);
-    pa_log_debug("Took %0.6f seconds to process", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
+    //pa_rtclock_get(&end);
+    //pa_log_debug("Took %0.6f seconds to process", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
 
     pa_assert(chunk->memblock);
     //pa_log_debug("gave %ld", chunk->length/fs);

commit d83dd5ba13bae800750a408f7f0e8654d7f27bd0
Author: Jason Newton <nevion at gmail.com>
Date:   Thu Oct 29 19:10:16 2009 -0700

    module-equalizer-sink:
        add premultipliar to sse2 dsp_logic implementation

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index ec36160..7c0ccd3 100644
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -412,7 +412,8 @@ static void dsp_logic(
     fftwf_complex * restrict output_window,//The transformed window'd src
     struct userdata *u){//Collection of constants
     const size_t overlap_size = PA_ROUND_UP(u->overlap_size, v_size);
-
+    float_vector_t x;
+    x.f[0] = x.f[1] = x.f[2] = x.f[3] = X;
 
     //assert(u->samples_gathered >= u->R);
     //use a linear-phase sliding STFT and overlap-add method
@@ -422,9 +423,8 @@ static void dsp_logic(
         float_vector_t *w = (float_vector_t*) (W + j);
         float_vector_t *s = (float_vector_t*) (src + j);
 //#if __SSE2__
-        d->m = _mm_mul_ps(w->m, s->m);
-//#else
-//        d->v = w->v * s->v;
+        d->m = _mm_mul_ps(x.m, _mm_mul_ps(w->m, s->m));
+//        d->v = x->v * w->v * s->v;
 //#endif
     }
     //zero padd the the remaining fft window

commit 9c1a98953f25aff7f11af80a073c9c46dee2438c
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Oct 30 03:30:42 2009 +0100

    core-util: introduce FD_CLOEXEC wrappers for open/socket/pipe/accept

diff --git a/configure.ac b/configure.ac
index d7f55ac..1022a6e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -445,7 +445,7 @@ AC_CHECK_FUNCS_ONCE([lstat])
 
 # Non-standard
 
-AC_CHECK_FUNCS_ONCE([setresuid setresgid setreuid setregid seteuid setegid ppoll strsignal sig2str strtof_l])
+AC_CHECK_FUNCS_ONCE([setresuid setresgid setreuid setregid seteuid setegid ppoll strsignal sig2str strtof_l pipe2 accept4])
 
 AC_FUNC_ALLOCA
 
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 27e09cb..34516ee 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -2889,3 +2889,82 @@ const char *pa_get_temp_dir(void) {
 
     return "/tmp";
 }
+
+int pa_open_cloexec(const char *fn, int flags, mode_t mode) {
+    int fd;
+
+#ifdef O_NOCTTY
+    flags |= O_NOCTTY;
+#endif
+
+#ifdef O_CLOEXEC
+    if ((fd = open(fn, flags|O_CLOEXEC, mode)) >= 0)
+        return fd;
+
+    if (errno != EINVAL)
+        return fd;
+#endif
+
+    if ((fd = open(fn, flags, mode)) < 0)
+        return fd;
+
+    pa_make_fd_cloexec(fd);
+    return fd;
+}
+
+int pa_socket_cloexec(int domain, int type, int protocol) {
+    int fd;
+
+#ifdef SOCK_CLOEXEC
+    if ((fd = socket(domain, type | SOCK_CLOEXEC, protocol)) >= 0)
+        return fd;
+
+    if (errno != EINVAL)
+        return fd;
+#endif
+
+    if ((fd = socket(domain, type, protocol)) < 0)
+        return fd;
+
+    pa_make_fd_cloexec(fd);
+    return fd;
+}
+
+int pa_pipe_cloexec(int pipefd[2]) {
+    int r;
+
+#ifdef HAVE_PIPE2
+    if ((r = pipe2(pipefd, O_CLOEXEC)) >= 0)
+        return r;
+
+    if (errno != EINVAL && errno != ENOSYS)
+        return r;
+#endif
+
+    if ((r = pipe(pipefd)) < 0)
+        return r;
+
+    pa_make_fd_cloexec(pipefd[0]);
+    pa_make_fd_cloexec(pipefd[1]);
+
+    return 0;
+}
+
+int pa_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen) {
+    int fd;
+
+#ifdef HAVE_ACCEPT4
+    if ((fd = accept4(sockfd, addr, addrlen, SOCK_CLOEXEC)) >= 0)
+        return fd;
+
+    if (errno != EINVAL && errno != ENOSYS)
+        return fd;
+#endif
+
+    if ((fd = accept(sockfd, addr, addrlen)) < 0)
+        return fd;
+
+    pa_make_fd_cloexec(fd);
+
+    return 0;
+}
diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h
index 9986b14..323fdcb 100644
--- a/src/pulsecore/core-util.h
+++ b/src/pulsecore/core-util.h
@@ -28,6 +28,7 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include <string.h>
+#include <sys/socket.h>
 
 #ifdef HAVE_SYS_RESOURCE_H
 #include <sys/resource.h>
@@ -258,4 +259,9 @@ pa_bool_t pa_run_from_build_tree(void);
 
 const char *pa_get_temp_dir(void);
 
+int pa_open_cloexec(const char *fn, int flags, mode_t mode);
+int pa_socket_cloexec(int domain, int type, int protocol);
+int pa_pipe_cloexec(int pipefd[2]);
+int pa_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
+
 #endif

commit 65e7bc18a9a7b89e55b87a74ae47d45269b51847
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Oct 30 03:32:38 2009 +0100

    use cloexec wrappers wherever applicable

diff --git a/src/daemon/cpulimit.c b/src/daemon/cpulimit.c
index c2877ec..f5042a7 100644
--- a/src/daemon/cpulimit.c
+++ b/src/daemon/cpulimit.c
@@ -188,15 +188,13 @@ int pa_cpu_limit_init(pa_mainloop_api *m) {
     last_time = pa_rtclock_now();
 
     /* Prepare the main loop pipe */
-    if (pipe(the_pipe) < 0) {
+    if (pa_pipe_cloexec(the_pipe) < 0) {
         pa_log("pipe() failed: %s", pa_cstrerror(errno));
         return -1;
     }
 
     pa_make_fd_nonblock(the_pipe[0]);
     pa_make_fd_nonblock(the_pipe[1]);
-    pa_make_fd_cloexec(the_pipe[0]);
-    pa_make_fd_cloexec(the_pipe[1]);
 
     api = m;
     io_event = api->io_new(m, the_pipe[0], PA_IO_EVENT_INPUT, callback, NULL);
diff --git a/src/modules/module-mmkbd-evdev.c b/src/modules/module-mmkbd-evdev.c
index 516bf41..14a9dd3 100644
--- a/src/modules/module-mmkbd-evdev.c
+++ b/src/modules/module-mmkbd-evdev.c
@@ -175,7 +175,7 @@ int pa__init(pa_module*m) {
     u->fd = -1;
     u->fd_type = 0;
 
-    if ((u->fd = open(pa_modargs_get_value(ma, "device", DEFAULT_DEVICE), O_RDONLY|O_NOCTTY)) < 0) {
+    if ((u->fd = pa_open_cloexec(pa_modargs_get_value(ma, "device", DEFAULT_DEVICE), O_RDONLY, 0)) < 0) {
         pa_log("Failed to open evdev device: %s", pa_cstrerror(errno));
         goto fail;
     }
diff --git a/src/modules/module-pipe-sink.c b/src/modules/module-pipe-sink.c
index 9c16932..10cc341 100644
--- a/src/modules/module-pipe-sink.c
+++ b/src/modules/module-pipe-sink.c
@@ -253,12 +253,11 @@ int pa__init(pa_module*m) {
     u->filename = pa_runtime_path(pa_modargs_get_value(ma, "file", DEFAULT_FILE_NAME));
 
     mkfifo(u->filename, 0666);
-    if ((u->fd = open(u->filename, O_RDWR|O_NOCTTY)) < 0) {
+    if ((u->fd = pa_open_cloexec(u->filename, O_RDWR, 0)) < 0) {
         pa_log("open('%s'): %s", u->filename, pa_cstrerror(errno));
         goto fail;
     }
 
-    pa_make_fd_cloexec(u->fd);
     pa_make_fd_nonblock(u->fd);
 
     if (fstat(u->fd, &st) < 0) {
diff --git a/src/modules/module-pipe-source.c b/src/modules/module-pipe-source.c
index 49104f8..de68093 100644
--- a/src/modules/module-pipe-source.c
+++ b/src/modules/module-pipe-source.c
@@ -238,12 +238,11 @@ int pa__init(pa_module*m) {
     u->filename = pa_runtime_path(pa_modargs_get_value(ma, "file", DEFAULT_FILE_NAME));
 
     mkfifo(u->filename, 0666);
-    if ((u->fd = open(u->filename, O_RDWR|O_NOCTTY)) < 0) {
+    if ((u->fd = pa_open_cloexec(u->filename, O_RDWR, 0)) < 0) {
         pa_log("open('%s'): %s", u->filename, pa_cstrerror(errno));
         goto fail;
     }
 
-    pa_make_fd_cloexec(u->fd);
     pa_make_fd_nonblock(u->fd);
 
     if (fstat(u->fd, &st) < 0) {
diff --git a/src/modules/module-solaris.c b/src/modules/module-solaris.c
index b0d4db4..955997b 100644
--- a/src/modules/module-solaris.c
+++ b/src/modules/module-solaris.c
@@ -327,7 +327,7 @@ static int open_audio_device(struct userdata *u, pa_sample_spec *ss) {
     pa_assert(u);
     pa_assert(ss);
 
-    if ((u->fd = open(u->device_name, u->mode | O_NONBLOCK)) < 0) {
+    if ((u->fd = pa_open_cloexec(u->device_name, u->mode | O_NONBLOCK)) < 0) {
         pa_log_warn("open %s failed (%s)", u->device_name, pa_cstrerror(errno));
         return -1;
     }
diff --git a/src/modules/oss/oss-util.c b/src/modules/oss/oss-util.c
index 5a109ae..41af3ba 100644
--- a/src/modules/oss/oss-util.c
+++ b/src/modules/oss/oss-util.c
@@ -55,7 +55,7 @@ int pa_oss_open(const char *device, int *mode, int* pcaps) {
         pcaps = &caps;
 
     if (*mode == O_RDWR) {
-        if ((fd = open(device, O_RDWR|O_NDELAY|O_NOCTTY)) >= 0) {
+        if ((fd = pa_open_cloexec(device, O_RDWR|O_NDELAY, 0)) >= 0) {
             ioctl(fd, SNDCTL_DSP_SETDUPLEX, 0);
 
             if (ioctl(fd, SNDCTL_DSP_GETCAPS, pcaps) < 0) {
@@ -71,14 +71,14 @@ int pa_oss_open(const char *device, int *mode, int* pcaps) {
             pa_close(fd);
         }
 
-        if ((fd = open(device, (*mode = O_WRONLY)|O_NDELAY|O_NOCTTY)) < 0) {
-            if ((fd = open(device, (*mode = O_RDONLY)|O_NDELAY|O_NOCTTY)) < 0) {
+        if ((fd = pa_open_cloexec(device, (*mode = O_WRONLY)|O_NDELAY, 0)) < 0) {
+            if ((fd = pa_open_cloexec(device, (*mode = O_RDONLY)|O_NDELAY, 0)) < 0) {
                 pa_log("open('%s'): %s", device, pa_cstrerror(errno));
                 goto fail;
             }
         }
     } else {
-        if ((fd = open(device, *mode|O_NDELAY|O_NOCTTY)) < 0) {
+        if ((fd = pa_open_cloexec(device, *mode|O_NDELAY, 0)) < 0) {
             pa_log("open('%s'): %s", device, pa_cstrerror(errno));
             goto fail;
         }
@@ -145,8 +145,6 @@ success:
     pa_log_debug("capabilities:%s", t);
     pa_xfree(t);
 
-    pa_make_fd_cloexec(fd);
-
     return fd;
 
 fail:
@@ -403,7 +401,7 @@ int pa_oss_get_hw_description(const char *dev, char *name, size_t l) {
 static int open_mixer(const char *mixer) {
     int fd;
 
-    if ((fd = open(mixer, O_RDWR|O_NDELAY|O_NOCTTY)) >= 0)
+    if ((fd = pa_open_cloexec(mixer, O_RDWR|O_NDELAY, 0)) >= 0)
         return fd;
 
     return -1;
diff --git a/src/modules/rtp/module-rtp-recv.c b/src/modules/rtp/module-rtp-recv.c
index 1a05f57..7dbb1ef 100644
--- a/src/modules/rtp/module-rtp-recv.c
+++ b/src/modules/rtp/module-rtp-recv.c
@@ -390,7 +390,7 @@ static int mcast_socket(const struct sockaddr* sa, socklen_t salen) {
     pa_assert(salen > 0);
 
     af = sa->sa_family;
-    if ((fd = socket(af, SOCK_DGRAM, 0)) < 0) {
+    if ((fd = pa_socket_cloexec(af, SOCK_DGRAM, 0)) < 0) {
         pa_log("Failed to create socket: %s", pa_cstrerror(errno));
         goto fail;
     }
diff --git a/src/modules/rtp/module-rtp-send.c b/src/modules/rtp/module-rtp-send.c
index 8e1cfe3..ab81522 100644
--- a/src/modules/rtp/module-rtp-send.c
+++ b/src/modules/rtp/module-rtp-send.c
@@ -262,7 +262,7 @@ int pa__init(pa_module*m) {
         goto fail;
     }
 
-    if ((fd = socket(af, SOCK_DGRAM, 0)) < 0) {
+    if ((fd = pa_socket_cloexec(af, SOCK_DGRAM, 0)) < 0) {
         pa_log("socket() failed: %s", pa_cstrerror(errno));
         goto fail;
     }
@@ -277,7 +277,7 @@ int pa__init(pa_module*m) {
 #endif
     }
 
-    if ((sap_fd = socket(af, SOCK_DGRAM, 0)) < 0) {
+    if ((sap_fd = pa_socket_cloexec(af, SOCK_DGRAM, 0)) < 0) {
         pa_log("socket() failed: %s", pa_cstrerror(errno));
         goto fail;
     }
@@ -316,8 +316,6 @@ int pa__init(pa_module*m) {
     /* If the socket queue is full, let's drop packets */
     pa_make_fd_nonblock(fd);
     pa_make_udp_socket_low_delay(fd);
-    pa_make_fd_cloexec(fd);
-    pa_make_fd_cloexec(sap_fd);
 
     pa_source_output_new_data_init(&data);
     pa_proplist_sets(data.proplist, PA_PROP_MEDIA_NAME, "RTP Monitor Stream");
diff --git a/src/pulse/mainloop-signal.c b/src/pulse/mainloop-signal.c
index 3dc7439..70c0122 100644
--- a/src/pulse/mainloop-signal.c
+++ b/src/pulse/mainloop-signal.c
@@ -124,15 +124,13 @@ int pa_signal_init(pa_mainloop_api *a) {
     pa_assert(signal_pipe[1] == -1);
     pa_assert(!io_event);
 
-    if (pipe(signal_pipe) < 0) {
+    if (pa_pipe_cloexec(signal_pipe) < 0) {
         pa_log("pipe(): %s", pa_cstrerror(errno));
         return -1;
     }
 
     pa_make_fd_nonblock(signal_pipe[0]);
     pa_make_fd_nonblock(signal_pipe[1]);
-    pa_make_fd_cloexec(signal_pipe[0]);
-    pa_make_fd_cloexec(signal_pipe[1]);
 
     api = a;
 
diff --git a/src/pulse/mainloop.c b/src/pulse/mainloop.c
index 090ac8c..6cd089e 100644
--- a/src/pulse/mainloop.c
+++ b/src/pulse/mainloop.c
@@ -482,7 +482,7 @@ pa_mainloop *pa_mainloop_new(void) {
 
     m = pa_xnew0(pa_mainloop, 1);
 
-    if (pipe(m->wakeup_pipe) < 0) {
+    if (pa_pipe_cloexec(m->wakeup_pipe) < 0) {
         pa_log_error("ERROR: cannot create wakeup pipe");
         pa_xfree(m);
         return NULL;
@@ -490,8 +490,6 @@ pa_mainloop *pa_mainloop_new(void) {
 
     pa_make_fd_nonblock(m->wakeup_pipe[0]);
     pa_make_fd_nonblock(m->wakeup_pipe[1]);
-    pa_make_fd_cloexec(m->wakeup_pipe[0]);
-    pa_make_fd_cloexec(m->wakeup_pipe[1]);
 
     m->rebuild_pollfds = TRUE;
 
diff --git a/src/pulsecore/authkey.c b/src/pulsecore/authkey.c
index 15613e2..d671e36 100644
--- a/src/pulsecore/authkey.c
+++ b/src/pulsecore/authkey.c
@@ -70,10 +70,6 @@ static int generate(int fd, void *ret_data, size_t length) {
 #define O_BINARY 0
 #endif
 
-#ifndef O_NOCTTY
-#define O_NOCTTY 0
-#endif
-
 /* Load an euthorization cookie from file fn and store it in data. If
  * the cookie file doesn't exist, create it */
 static int load(const char *fn, void *data, size_t length) {
@@ -86,9 +82,9 @@ static int load(const char *fn, void *data, size_t length) {
     pa_assert(data);
     pa_assert(length > 0);
 
-    if ((fd = open(fn, O_RDWR|O_CREAT|O_BINARY|O_NOCTTY, S_IRUSR|S_IWUSR)) < 0) {
+    if ((fd = pa_open_cloexec(fn, O_RDWR|O_CREAT|O_BINARY, S_IRUSR|S_IWUSR)) < 0) {
 
-        if (errno != EACCES || (fd = open(fn, O_RDONLY|O_BINARY|O_NOCTTY)) < 0) {
+        if (errno != EACCES || (fd = open(fn, O_RDONLY|O_BINARY)) < 0) {
             pa_log_warn("Failed to open cookie file '%s': %s", fn, pa_cstrerror(errno));
             goto finish;
         } else
@@ -204,7 +200,7 @@ int pa_authkey_save(const char *fn, const void *data, size_t length) {
     if (!(p = normalize_path(fn)))
         return -2;
 
-    if ((fd = open(p, O_RDWR|O_CREAT|O_NOCTTY, S_IRUSR|S_IWUSR)) < 0) {
+    if ((fd = pa_open_cloexec(p, O_RDWR|O_CREAT, S_IRUSR|S_IWUSR)) < 0) {
         pa_log_warn("Failed to open cookie file '%s': %s", fn, pa_cstrerror(errno));
         goto finish;
     }
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 34516ee..19e1296 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -1200,10 +1200,7 @@ int pa_lock_lockfile(const char *fn) {
     for (;;) {
         struct stat st;
 
-        if ((fd = open(fn, O_CREAT|O_RDWR
-#ifdef O_NOCTTY
-                       |O_NOCTTY
-#endif
+        if ((fd = pa_open_cloexec(fn, O_CREAT|O_RDWR
 #ifdef O_NOFOLLOW
                        |O_NOFOLLOW
 #endif
diff --git a/src/pulsecore/cpu-arm.c b/src/pulsecore/cpu-arm.c
index 453b784..6bb2ead 100644
--- a/src/pulsecore/cpu-arm.c
+++ b/src/pulsecore/cpu-arm.c
@@ -62,7 +62,7 @@ static char *get_cpuinfo(void) {
 
     cpuinfo = pa_xmalloc(MAX_BUFFER);
 
-    if ((fd = open("/proc/cpuinfo", O_RDONLY)) < 0) {
+    if ((fd = pa_open_cloexec("/proc/cpuinfo", O_RDONLY, 0)) < 0) {
         pa_xfree(cpuinfo);
         return NULL;
     }
diff --git a/src/pulsecore/fdsem.c b/src/pulsecore/fdsem.c
index 380f34f..ea14e8a 100644
--- a/src/pulsecore/fdsem.c
+++ b/src/pulsecore/fdsem.c
@@ -62,19 +62,15 @@ pa_fdsem *pa_fdsem_new(void) {
     f = pa_xmalloc(PA_ALIGN(sizeof(pa_fdsem)) + PA_ALIGN(sizeof(pa_fdsem_data)));
 
 #ifdef HAVE_SYS_EVENTFD_H
-    if ((f->efd = eventfd(0, 0)) >= 0) {
-        pa_make_fd_cloexec(f->efd);
+    if ((f->efd = eventfd(0, EFD_CLOEXEC)) >= 0)
         f->fds[0] = f->fds[1] = -1;
-    } else
+    else
 #endif
     {
-        if (pipe(f->fds) < 0) {
+        if (pa_pipe_cloexec(f->fds) < 0) {
             pa_xfree(f);
             return NULL;
         }
-
-        pa_make_fd_cloexec(f->fds[0]);
-        pa_make_fd_cloexec(f->fds[1]);
     }
 
     f->data = (pa_fdsem_data*) ((uint8_t*) f + PA_ALIGN(sizeof(pa_fdsem)));
@@ -114,12 +110,11 @@ pa_fdsem *pa_fdsem_new_shm(pa_fdsem_data *data, int* event_fd) {
 
     f = pa_xnew(pa_fdsem, 1);
 
-    if ((f->efd = eventfd(0, 0)) < 0) {
+    if ((f->efd = eventfd(0, EFD_CLOEXEC)) < 0) {
         pa_xfree(f);
         return NULL;
     }
 
-    pa_make_fd_cloexec(f->efd);
     f->fds[0] = f->fds[1] = -1;
     f->data = data;
 
diff --git a/src/pulsecore/lock-autospawn.c b/src/pulsecore/lock-autospawn.c
index c0df793..65e3563 100644
--- a/src/pulsecore/lock-autospawn.c
+++ b/src/pulsecore/lock-autospawn.c
@@ -87,12 +87,9 @@ static int ref(void) {
     pa_assert(pipe_fd[0] < 0);
     pa_assert(pipe_fd[1] < 0);
 
-    if (pipe(pipe_fd) < 0)
+    if (pa_pipe_cloexec(pipe_fd) < 0)
         return -1;
 
-    pa_make_fd_cloexec(pipe_fd[0]);
-    pa_make_fd_cloexec(pipe_fd[1]);
-
     pa_make_fd_nonblock(pipe_fd[1]);
     pa_make_fd_nonblock(pipe_fd[0]);
 
diff --git a/src/pulsecore/pid.c b/src/pulsecore/pid.c
index 996946c..c92e831 100644
--- a/src/pulsecore/pid.c
+++ b/src/pulsecore/pid.c
@@ -88,10 +88,7 @@ static int open_pid_file(const char *fn, int mode) {
     for (;;) {
         struct stat st;
 
-        if ((fd = open(fn, mode
-#ifdef O_NOCTTY
-                       |O_NOCTTY
-#endif
+        if ((fd = pa_open_cloexec(fn, mode
 #ifdef O_NOFOLLOW
                        |O_NOFOLLOW
 #endif
diff --git a/src/pulsecore/random.c b/src/pulsecore/random.c
index 518c281..a87d24e 100644
--- a/src/pulsecore/random.c
+++ b/src/pulsecore/random.c
@@ -62,11 +62,7 @@ static int random_proper(void *ret_data, size_t length) {
     while (*device) {
         ret = 0;
 
-        if ((fd = open(*device, O_RDONLY
-#ifdef O_NOCTTY
-                       | O_NOCTTY
-#endif
-             )) >= 0) {
+        if ((fd = pa_open_cloexec(*device, O_RDONLY, 0)) >= 0) {
 
             if ((r = pa_loop_read(fd, ret_data, length, NULL)) < 0 || (size_t) r != length)
                 ret = -1;
diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index bda92fc..221b569 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -1342,7 +1342,7 @@ static void propagate_reference_volume(pa_sink *s) {
 void pa_sink_set_volume(
         pa_sink *s,
         const pa_cvolume *volume,
-        pa_bool_t sendmsg,
+        pa_bool_t send_msg,
         pa_bool_t save) {
 
     pa_cvolume old_reference_volume;
@@ -1411,7 +1411,7 @@ void pa_sink_set_volume(
         s->soft_volume = s->real_volume;
 
     /* This tells the sink that soft and/or virtual volume changed */
-    if (sendmsg)
+    if (send_msg)
         pa_assert_se(pa_asyncmsgq_send(s->asyncmsgq, PA_MSGOBJECT(s), PA_SINK_MESSAGE_SET_VOLUME, NULL, 0, NULL) == 0);
 
     if (reference_changed)
diff --git a/src/pulsecore/socket-client.c b/src/pulsecore/socket-client.c
index b9d6950..ef3c29e 100644
--- a/src/pulsecore/socket-client.c
+++ b/src/pulsecore/socket-client.c
@@ -257,13 +257,11 @@ static int sockaddr_prepare(pa_socket_client *c, const struct sockaddr *sa, size
 
     c->local = pa_socket_address_is_local(sa);
 
-    if ((c->fd = socket(sa->sa_family, SOCK_STREAM, 0)) < 0) {
+    if ((c->fd = pa_socket_cloexec(sa->sa_family, SOCK_STREAM, 0)) < 0) {
         pa_log("socket(): %s", pa_cstrerror(errno));
         return -1;
     }
 
-    pa_make_fd_cloexec(c->fd);
-
 #ifdef HAVE_IPV6
     if (sa->sa_family == AF_INET || sa->sa_family == AF_INET6)
 #else
diff --git a/src/pulsecore/socket-server.c b/src/pulsecore/socket-server.c
index e660700..5d55de3 100644
--- a/src/pulsecore/socket-server.c
+++ b/src/pulsecore/socket-server.c
@@ -104,13 +104,11 @@ static void callback(pa_mainloop_api *mainloop, pa_io_event *e, int fd, pa_io_ev
 
     pa_socket_server_ref(s);
 
-    if ((nfd = accept(fd, NULL, NULL)) < 0) {
+    if ((nfd = pa_accept_cloexec(fd, NULL, NULL)) < 0) {
         pa_log("accept(): %s", pa_cstrerror(errno));
         goto finish;
     }
 
-    pa_make_fd_cloexec(nfd);
-
     if (!s->on_connection) {
         pa_close(nfd);
         goto finish;
@@ -186,13 +184,11 @@ pa_socket_server* pa_socket_server_new_unix(pa_mainloop_api *m, const char *file
     pa_assert(m);
     pa_assert(filename);
 
-    if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
+    if ((fd = pa_socket_cloexec(PF_UNIX, SOCK_STREAM, 0)) < 0) {
         pa_log("socket(): %s", pa_cstrerror(errno));
         goto fail;
     }
 
-    pa_make_fd_cloexec(fd);
-
     memset(&sa, 0, sizeof(sa));
     sa.sun_family = AF_UNIX;
     pa_strlcpy(sa.sun_path, filename, sizeof(sa.sun_path));
@@ -246,13 +242,11 @@ pa_socket_server* pa_socket_server_new_ipv4(pa_mainloop_api *m, uint32_t address
     pa_assert(m);
     pa_assert(port);
 
-    if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
+    if ((fd = pa_socket_cloexec(PF_INET, SOCK_STREAM, 0)) < 0) {
         pa_log("socket(PF_INET): %s", pa_cstrerror(errno));
         goto fail;
     }
 
-    pa_make_fd_cloexec(fd);
-
 #ifdef SO_REUSEADDR
     if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
         pa_log("setsockopt(): %s", pa_cstrerror(errno));
@@ -299,13 +293,11 @@ pa_socket_server* pa_socket_server_new_ipv6(pa_mainloop_api *m, const uint8_t ad
     pa_assert(m);
     pa_assert(port > 0);
 
-    if ((fd = socket(PF_INET6, SOCK_STREAM, 0)) < 0) {
+    if ((fd = pa_socket_cloexec(PF_INET6, SOCK_STREAM, 0)) < 0) {
         pa_log("socket(PF_INET6): %s", pa_cstrerror(errno));
         goto fail;
     }
 
-    pa_make_fd_cloexec(fd);
-
 #ifdef IPV6_V6ONLY
     on = 1;
     if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on)) < 0)
diff --git a/src/pulsecore/socket-util.c b/src/pulsecore/socket-util.c
index 5fd5dd6..651779f 100644
--- a/src/pulsecore/socket-util.c
+++ b/src/pulsecore/socket-util.c
@@ -239,7 +239,7 @@ int pa_unix_socket_is_stale(const char *fn) {
 
     pa_assert(fn);
 
-    if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
+    if ((fd = pa_socket_cloexec(PF_UNIX, SOCK_STREAM, 0)) < 0) {
         pa_log("socket(): %s", pa_cstrerror(errno));
         goto finish;
     }
diff --git a/src/pulsecore/sound-file-stream.c b/src/pulsecore/sound-file-stream.c
index 16de492..53674ba 100644
--- a/src/pulsecore/sound-file-stream.c
+++ b/src/pulsecore/sound-file-stream.c
@@ -252,11 +252,7 @@ int pa_play_file(
     u->readf_function = NULL;
     u->memblockq = NULL;
 
-    if ((fd = open(fname, O_RDONLY
-#ifdef O_NOCTTY
-                   |O_NOCTTY
-#endif
-                   )) < 0) {
+    if ((fd = pa_open_cloexec(fname, O_RDONLY, 0)) < 0) {
         pa_log("Failed to open file %s: %s", fname, pa_cstrerror(errno));
         goto fail;
     }
diff --git a/src/pulsecore/sound-file.c b/src/pulsecore/sound-file.c
index 2d9b76a..d8c10b1 100644
--- a/src/pulsecore/sound-file.c
+++ b/src/pulsecore/sound-file.c
@@ -62,11 +62,7 @@ int pa_sound_file_load(
 
     pa_memchunk_reset(chunk);
 
-    if ((fd = open(fname, O_RDONLY
-#ifdef O_NOCTTY
-                   |O_NOCTTY
-#endif
-                   )) < 0) {
+    if ((fd = pa_open_cloexec(fname, O_RDONLY, 0)) < 0) {
         pa_log("Failed to open file %s: %s", fname, pa_cstrerror(errno));
         goto finish;
     }
diff --git a/src/utils/pacat.c b/src/utils/pacat.c
index 5f29ba3..d348c16 100644
--- a/src/utils/pacat.c
+++ b/src/utils/pacat.c
@@ -906,7 +906,7 @@ int main(int argc, char *argv[]) {
 
         filename = argv[optind];
 
-        if ((fd = open(argv[optind], mode == PLAYBACK ? O_RDONLY : O_WRONLY|O_TRUNC|O_CREAT, 0666)) < 0) {
+        if ((fd = pa_open_cloexec(argv[optind], mode == PLAYBACK ? O_RDONLY : O_WRONLY|O_TRUNC|O_CREAT, 0666)) < 0) {
             pa_log(_("open(): %s"), strerror(errno));
             goto quit;
         }
diff --git a/src/utils/pacmd.c b/src/utils/pacmd.c
index 5ef57e3..ef58e9c 100644
--- a/src/utils/pacmd.c
+++ b/src/utils/pacmd.c
@@ -70,7 +70,7 @@ int main(int argc, char*argv[]) {
         goto fail;
     }
 
-    if ((fd = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) {
+    if ((fd = pa_socket_cloexec(PF_UNIX, SOCK_STREAM, 0)) < 0) {
         pa_log(_("socket(PF_UNIX, SOCK_STREAM, 0): %s"), strerror(errno));
         goto fail;
     }

commit a698ee3f52e9d61b378cb0dad2cfb1bcc31c708a
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Oct 30 04:16:59 2009 +0100

    core-util: make sure to enable FD_CLOEXEC unconditionally to cope with kernels that silently accept but ignore O_CLOEXEC

diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 19e1296..a199daa 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -2896,7 +2896,7 @@ int pa_open_cloexec(const char *fn, int flags, mode_t mode) {
 
 #ifdef O_CLOEXEC
     if ((fd = open(fn, flags|O_CLOEXEC, mode)) >= 0)
-        return fd;
+        goto finish;
 
     if (errno != EINVAL)
         return fd;
@@ -2905,6 +2905,10 @@ int pa_open_cloexec(const char *fn, int flags, mode_t mode) {
     if ((fd = open(fn, flags, mode)) < 0)
         return fd;
 
+finish:
+    /* Some implementations might simply ignore O_CLOEXEC if it is not
+     * understood, make sure FD_CLOEXEC is enabled anyway */
+
     pa_make_fd_cloexec(fd);
     return fd;
 }
@@ -2914,7 +2918,7 @@ int pa_socket_cloexec(int domain, int type, int protocol) {
 
 #ifdef SOCK_CLOEXEC
     if ((fd = socket(domain, type | SOCK_CLOEXEC, protocol)) >= 0)
-        return fd;
+        goto finish;
 
     if (errno != EINVAL)
         return fd;
@@ -2923,6 +2927,10 @@ int pa_socket_cloexec(int domain, int type, int protocol) {
     if ((fd = socket(domain, type, protocol)) < 0)
         return fd;
 
+finish:
+    /* Some implementations might simply ignore SOCK_CLOEXEC if it is
+     * not understood, make sure FD_CLOEXEC is enabled anyway */
+
     pa_make_fd_cloexec(fd);
     return fd;
 }
@@ -2932,7 +2940,7 @@ int pa_pipe_cloexec(int pipefd[2]) {
 
 #ifdef HAVE_PIPE2
     if ((r = pipe2(pipefd, O_CLOEXEC)) >= 0)
-        return r;
+        goto finish;
 
     if (errno != EINVAL && errno != ENOSYS)
         return r;
@@ -2941,6 +2949,7 @@ int pa_pipe_cloexec(int pipefd[2]) {
     if ((r = pipe(pipefd)) < 0)
         return r;
 
+finish:
     pa_make_fd_cloexec(pipefd[0]);
     pa_make_fd_cloexec(pipefd[1]);
 

commit 752727a13d2d55439aefe618677f7e932acc9862
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Oct 30 04:20:24 2009 +0100

    core-util: introduce pa_fopen_cloexec()

diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index a199daa..40da8f4 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -2961,7 +2961,7 @@ int pa_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen) {
 
 #ifdef HAVE_ACCEPT4
     if ((fd = accept4(sockfd, addr, addrlen, SOCK_CLOEXEC)) >= 0)
-        return fd;
+        goto finish;
 
     if (errno != EINVAL && errno != ENOSYS)
         return fd;
@@ -2970,7 +2970,32 @@ int pa_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen) {
     if ((fd = accept(sockfd, addr, addrlen)) < 0)
         return fd;
 
+finish:
     pa_make_fd_cloexec(fd);
+    return fd;
+}
 
-    return 0;
+FILE* pa_fopen_cloexec(const char *path, const char *mode) {
+    FILE *f;
+    char *m;
+
+    m = pa_sprintf_malloc("%se", mode);
+
+    errno = 0;
+    if ((f = fopen(path, m))) {
+        pa_xfree(m);
+        goto finish;
+    }
+
+    pa_xfree(m);
+
+    if (errno != EINVAL)
+        return NULL;
+
+    if (!(f = fopen(path, mode)))
+        return NULL;
+
+finish:
+    pa_make_fd_cloexec(fileno(f));
+    return f;
 }
diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h
index 323fdcb..d50f79a 100644
--- a/src/pulsecore/core-util.h
+++ b/src/pulsecore/core-util.h
@@ -263,5 +263,6 @@ int pa_open_cloexec(const char *fn, int flags, mode_t mode);
 int pa_socket_cloexec(int domain, int type, int protocol);
 int pa_pipe_cloexec(int pipefd[2]);
 int pa_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
+FILE* pa_fopen_cloexec(const char *path, const char *mode);
 
 #endif

commit 88b72958bebd1770e45a4af2dc9fec75aaf1f2de
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Oct 30 04:53:15 2009 +0100

    tdb: use O_CLOEXEC if available

diff --git a/src/pulsecore/database-tdb.c b/src/pulsecore/database-tdb.c
index b79d283..4e782d6 100644
--- a/src/pulsecore/database-tdb.c
+++ b/src/pulsecore/database-tdb.c
@@ -66,6 +66,39 @@ void pa_datum_free(pa_datum *d) {
     pa_zero(d);
 }
 
+static struct tdb_context *tdb_open_cloexec(
+        const char *name,
+        int hash_size,
+        int tdb_flags,
+        int open_flags,
+        mode_t mode) {
+
+    /* Mimics pa_open_cloexec() */
+
+    struct tdb_context *c;
+
+#ifdef O_NOCTTY
+    open_flags |= O_NOCTTY;
+#endif
+
+#ifdef O_CLOEXEC
+    errno = 0;
+    if ((c = tdb_open(name, hash_size, tdb_flags, open_flags | O_CLOEXEC, mode)))
+        goto finish;
+
+    if (errno != EINVAL)
+        return NULL;
+#endif
+
+    errno = 0;
+    if (!(c = tdb_open(name, hash_size, tdb_flags, open_flags, mode)))
+        return NULL;
+
+finish:
+    pa_make_fd_cloexec(tdb_fd(c));
+    return c;
+}
+
 pa_database* pa_database_open(const char *fn, pa_bool_t for_write) {
     struct tdb_context *c;
     char *path;
@@ -73,15 +106,7 @@ pa_database* pa_database_open(const char *fn, pa_bool_t for_write) {
     pa_assert(fn);
 
     path = pa_sprintf_malloc("%s.tdb", fn);
-    errno = 0;
-    c = tdb_open(path, 0, TDB_NOSYNC|TDB_NOLOCK,
-                 (for_write ? O_RDWR|O_CREAT : O_RDONLY)|O_NOCTTY
-#ifdef O_CLOEXEC
-                 |O_CLOEXEC
-#endif
-                 , 0644);
-
-    if (c)
+    if ((c = tdb_open_cloexec(path, 0, TDB_NOSYNC|TDB_NOLOCK, (for_write ? O_RDWR|O_CREAT : O_RDONLY), 0644)))
         pa_log_debug("Opened TDB database '%s'", path);
 
     pa_xfree(path);

commit 168be3830ae291dd819abebec813f76151487bb3
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Oct 30 04:54:19 2009 +0100

    use pa_fopen_cloexec() where applicable

diff --git a/src/daemon/daemon-conf.c b/src/daemon/daemon-conf.c
index 571faae..bfd5c11 100644
--- a/src/daemon/daemon-conf.c
+++ b/src/daemon/daemon-conf.c
@@ -577,7 +577,7 @@ int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) {
     c->config_file = NULL;
 
     f = filename ?
-        fopen(c->config_file = pa_xstrdup(filename), "r") :
+        pa_fopen_cloexec(c->config_file = pa_xstrdup(filename), "r") :
         pa_open_config_file(DEFAULT_CONFIG_FILE, DEFAULT_CONFIG_FILE_USER, ENV_CONFIG_FILE, &c->config_file);
 
     if (!f && errno != ENOENT) {
@@ -652,7 +652,7 @@ FILE *pa_daemon_conf_open_default_script_file(pa_daemon_conf *c) {
         else
             f = pa_open_config_file(DEFAULT_SCRIPT_FILE, DEFAULT_SCRIPT_FILE_USER, ENV_SCRIPT_FILE, &c->default_script_file);
     } else
-        f = fopen(c->default_script_file, "r");
+        f = pa_fopen_cloexec(c->default_script_file, "r");
 
     return f;
 }
diff --git a/src/modules/module-cli.c b/src/modules/module-cli.c
index 6bd0f4f..c5ff456 100644
--- a/src/modules/module-cli.c
+++ b/src/modules/module-cli.c
@@ -105,7 +105,7 @@ int pa__init(pa_module*m) {
      * of log messages, particularly because if stdout and stderr are
      * dup'ed they share the same O_NDELAY, too. */
 
-    if ((fd = open("/dev/tty", O_RDWR|O_CLOEXEC|O_NONBLOCK)) >= 0) {
+    if ((fd = pa_open_cloexec("/dev/tty", O_RDWR|O_NONBLOCK, 0)) >= 0) {
         io = pa_iochannel_new(m->core->mainloop, fd, fd);
         pa_log_debug("Managed to open /dev/tty.");
     } else {
diff --git a/src/modules/module-default-device-restore.c b/src/modules/module-default-device-restore.c
index 27ae60e..94f589e 100644
--- a/src/modules/module-default-device-restore.c
+++ b/src/modules/module-default-device-restore.c
@@ -60,7 +60,7 @@ static void load(struct userdata *u) {
 
     if (u->core->default_sink)
         pa_log_info("Manually configured default sink, not overwriting.");
-    else if ((f = fopen(u->sink_filename, "r"))) {
+    else if ((f = pa_fopen_cloexec(u->sink_filename, "r"))) {
         char ln[256] = "";
         pa_sink *s;
 
@@ -81,7 +81,7 @@ static void load(struct userdata *u) {
 
     if (u->core->default_source)
         pa_log_info("Manually configured default source, not overwriting.");
-    else if ((f = fopen(u->source_filename, "r"))) {
+    else if ((f = pa_fopen_cloexec(u->source_filename, "r"))) {
         char ln[256] = "";
         pa_source *s;
 
@@ -108,7 +108,7 @@ static void save(struct userdata *u) {
         return;
 
     if (u->sink_filename) {
-        if ((f = fopen(u->sink_filename, "w"))) {
+        if ((f = pa_fopen_cloexec(u->sink_filename, "w"))) {
             pa_sink *s = pa_namereg_get_default_sink(u->core);
             fprintf(f, "%s\n", s ? s->name : "");
             fclose(f);
@@ -117,7 +117,7 @@ static void save(struct userdata *u) {
     }
 
     if (u->source_filename) {
-        if ((f = fopen(u->source_filename, "w"))) {
+        if ((f = pa_fopen_cloexec(u->source_filename, "w"))) {
             pa_source *s = pa_namereg_get_default_source(u->core);
             fprintf(f, "%s\n", s ? s->name : "");
             fclose(f);
diff --git a/src/modules/module-detect.c b/src/modules/module-detect.c
index b1f24e1..1fe8eb8 100644
--- a/src/modules/module-detect.c
+++ b/src/modules/module-detect.c
@@ -63,7 +63,7 @@ static int detect_alsa(pa_core *c, int just_one) {
     FILE *f;
     int n = 0, n_sink = 0, n_source = 0;
 
-    if (!(f = fopen("/proc/asound/devices", "r"))) {
+    if (!(f = pa_fopen_cloexec("/proc/asound/devices", "r"))) {
 
         if (errno != ENOENT)
             pa_log_error("open(\"/proc/asound/devices\") failed: %s", pa_cstrerror(errno));
@@ -124,9 +124,9 @@ static int detect_oss(pa_core *c, int just_one) {
     FILE *f;
     int n = 0, b = 0;
 
-    if (!(f = fopen("/dev/sndstat", "r")) &&
-        !(f = fopen("/proc/sndstat", "r")) &&
-        !(f = fopen("/proc/asound/oss/sndstat", "r"))) {
+    if (!(f = pa_fopen_cloexec("/dev/sndstat", "r")) &&
+        !(f = pa_fopen_cloexec("/proc/sndstat", "r")) &&
+        !(f = pa_fopen_cloexec("/proc/asound/oss/sndstat", "r"))) {
 
         if (errno != ENOENT)
             pa_log_error("failed to open OSS sndstat device: %s", pa_cstrerror(errno));
diff --git a/src/modules/module-match.c b/src/modules/module-match.c
index 0bd781d..b1693f1 100644
--- a/src/modules/module-match.c
+++ b/src/modules/module-match.c
@@ -85,7 +85,7 @@ static int load_rules(struct userdata *u, const char *filename) {
     pa_assert(u);
 
     if (filename)
-        f = fopen(fn = pa_xstrdup(filename), "r");
+        f = pa_fopen_cloexec(fn = pa_xstrdup(filename), "r");
     else
         f = pa_open_config_file(DEFAULT_MATCH_TABLE_FILE, DEFAULT_MATCH_TABLE_FILE_USER, NULL, &fn);
 
diff --git a/src/modules/module-udev-detect.c b/src/modules/module-udev-detect.c
index 1b1e9c1..a12f7c9 100644
--- a/src/modules/module-udev-detect.c
+++ b/src/modules/module-udev-detect.c
@@ -172,7 +172,7 @@ static pa_bool_t is_card_busy(const char *id) {
             if (status_file)
                 fclose(status_file);
 
-            if (!(status_file = fopen(sub_status, "r"))) {
+            if (!(status_file = pa_fopen_cloexec(sub_status, "r"))) {
                 pa_log_warn("Failed to open %s: %s", sub_status, pa_cstrerror(errno));
                 continue;
             }
diff --git a/src/modules/oss/oss-util.c b/src/modules/oss/oss-util.c
index 41af3ba..b95023c 100644
--- a/src/modules/oss/oss-util.c
+++ b/src/modules/oss/oss-util.c
@@ -349,9 +349,9 @@ int pa_oss_get_hw_description(const char *dev, char *name, size_t l) {
     if ((n = get_device_number(dev)) < 0)
         return -1;
 
-    if (!(f = fopen("/dev/sndstat", "r")) &&
-        !(f = fopen("/proc/sndstat", "r")) &&
-        !(f = fopen("/proc/asound/oss/sndstat", "r"))) {
+    if (!(f = pa_fopen_cloexec("/dev/sndstat", "r")) &&
+        !(f = pa_fopen_cloexec("/proc/sndstat", "r")) &&
+        !(f = pa_fopen_cloexec("/proc/asound/oss/sndstat", "r"))) {
 
         if (errno != ENOENT)
             pa_log_warn("failed to open OSS sndstat device: %s", pa_cstrerror(errno));
diff --git a/src/pulse/client-conf.c b/src/pulse/client-conf.c
index 62c06f6..3eaca4d 100644
--- a/src/pulse/client-conf.c
+++ b/src/pulse/client-conf.c
@@ -110,7 +110,7 @@ int pa_client_conf_load(pa_client_conf *c, const char *filename) {
 
     if (filename) {
 
-        if (!(f = fopen(filename, "r"))) {
+        if (!(f = pa_fopen_cloexec(filename, "r"))) {
             pa_log(_("Failed to open configuration file '%s': %s"), fn, pa_cstrerror(errno));
             goto finish;
         }
diff --git a/src/pulsecore/cli-command.c b/src/pulsecore/cli-command.c
index b57919a..82a44d8 100644
--- a/src/pulsecore/cli-command.c
+++ b/src/pulsecore/cli-command.c
@@ -1804,7 +1804,7 @@ int pa_cli_command_execute_file(pa_core *c, const char *fn, pa_strbuf *buf, pa_b
     if (!fail)
         fail = &_fail;
 
-    if (!(f = fopen(fn, "r"))) {
+    if (!(f = pa_fopen_cloexec(fn, "r"))) {
         pa_strbuf_printf(buf, "open('%s') failed: %s\n", fn, pa_cstrerror(errno));
         if (!*fail)
             ret = 0;
diff --git a/src/pulsecore/conf-parser.c b/src/pulsecore/conf-parser.c
index dd4a99e..34b4d6f 100644
--- a/src/pulsecore/conf-parser.c
+++ b/src/pulsecore/conf-parser.c
@@ -168,7 +168,7 @@ int pa_config_parse(const char *filename, FILE *f, const pa_config_item *t, void
     pa_assert(filename);
     pa_assert(t);
 
-    if (!f && !(f = fopen(filename, "r"))) {
+    if (!f && !(f = pa_fopen_cloexec(filename, "r"))) {
         if (errno == ENOENT) {
             pa_log_debug("Failed to open configuration file '%s': %s", filename, pa_cstrerror(errno));
             r = 0;
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 40da8f4..738bf06 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -1600,7 +1600,7 @@ FILE *pa_open_config_file(const char *global, const char *local, const char *env
         fn = buf;
 #endif
 
-        if ((f = fopen(fn, "r"))) {
+        if ((f = pa_fopen_cloexec(fn, "r"))) {
             if (result)
                 *result = pa_xstrdup(fn);
 
@@ -1634,7 +1634,7 @@ FILE *pa_open_config_file(const char *global, const char *local, const char *env
         fn = buf;
 #endif
 
-        if ((f = fopen(fn, "r"))) {
+        if ((f = pa_fopen_cloexec(fn, "r"))) {
             if (result)
                 *result = pa_xstrdup(fn);
 
@@ -1661,7 +1661,7 @@ FILE *pa_open_config_file(const char *global, const char *local, const char *env
         global = buf;
 #endif
 
-        if ((f = fopen(global, "r"))) {
+        if ((f = pa_fopen_cloexec(global, "r"))) {
 
             if (result)
                 *result = pa_xstrdup(global);
@@ -2560,7 +2560,7 @@ char *pa_machine_id(void) {
      * since it fits perfectly our needs and is not as volatile as the
      * hostname which might be set from dhcp. */
 
-    if ((f = fopen(PA_MACHINE_ID, "r"))) {
+    if ((f = pa_fopen_cloexec(PA_MACHINE_ID, "r"))) {
         char ln[34] = "", *r;
 
         r = fgets(ln, sizeof(ln)-1, f);
diff --git a/src/pulsecore/database-simple.c b/src/pulsecore/database-simple.c
index 1f4caf7..754930d 100644
--- a/src/pulsecore/database-simple.c
+++ b/src/pulsecore/database-simple.c
@@ -237,7 +237,7 @@ pa_database* pa_database_open(const char *fn, pa_bool_t for_write) {
     path = pa_sprintf_malloc("%s."CANONICAL_HOST".simple", fn);
     errno = 0;
 
-    f = fopen(path, "r");
+    f = pa_fopen_cloexec(path, "r");
 
     if (f || errno == ENOENT) { /* file not found is ok */
         db = pa_xnew0(simple_data, 1);
@@ -480,7 +480,7 @@ int pa_database_sync(pa_database *database) {
 
     errno = 0;
 
-    f = fopen(db->tmp_filename, "w");
+    f = pa_fopen_cloexec(db->tmp_filename, "w");
 
     if (!f)
         goto fail;
diff --git a/src/pulsecore/pid.c b/src/pulsecore/pid.c
index c92e831..213e798 100644
--- a/src/pulsecore/pid.c
+++ b/src/pulsecore/pid.c
@@ -143,7 +143,7 @@ static int proc_name_ours(pid_t pid, const char *procname) {
 
     pa_snprintf(bn, sizeof(bn), "/proc/%lu/stat", (unsigned long) pid);
 
-    if (!(f = fopen(bn, "r"))) {
+    if (!(f = pa_fopen_cloexec(bn, "r"))) {
         pa_log_info("Failed to open %s: %s", bn, pa_cstrerror(errno));
         return -1;
     } else {
diff --git a/src/pulsecore/sample-util.c b/src/pulsecore/sample-util.c
index a26dc87..74600de 100644
--- a/src/pulsecore/sample-util.c
+++ b/src/pulsecore/sample-util.c
@@ -1007,7 +1007,7 @@ void pa_memchunk_dump_to_file(pa_memchunk *c, const char *fn) {
 
     /* Only for debugging purposes */
 
-    f = fopen(fn, "a");
+    f = pa_fopen_cloexec(fn, "a");
 
     if (!f) {
         pa_log_warn("Failed to open '%s': %s", fn, pa_cstrerror(errno));

commit 75f7a971db587d554fffc15801a2d8f7497a2124
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Oct 30 04:54:55 2009 +0100

    socket-util: allocate at least sizeof(sockaddr_storage) space

diff --git a/src/pulsecore/socket-util.c b/src/pulsecore/socket-util.c
index 651779f..0d0762d 100644
--- a/src/pulsecore/socket-util.c
+++ b/src/pulsecore/socket-util.c
@@ -85,12 +85,11 @@ void pa_socket_peer_to_string(int fd, char *c, size_t l) {
 
 #ifndef OS_IS_WIN32
     pa_assert_se(fstat(fd, &st) == 0);
-#endif
 
-#ifndef OS_IS_WIN32
     if (S_ISSOCK(st.st_mode)) {
 #endif
         union {
+            struct sockaddr_storage storage;
             struct sockaddr sa;
             struct sockaddr_in in;
 #ifdef HAVE_IPV6
@@ -315,6 +314,7 @@ pa_bool_t pa_socket_address_is_local(const struct sockaddr *sa) {
 pa_bool_t pa_socket_is_local(int fd) {
 
     union {
+        struct sockaddr_storage storage;
         struct sockaddr sa;
         struct sockaddr_in in;
 #ifdef HAVE_IPV6

commit a82c6b0cd5fa075b5a750e6416b7a7f0cd2508c7
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Oct 30 04:55:13 2009 +0100

    socket-util: drop redundant casts

diff --git a/src/pulsecore/socket-util.c b/src/pulsecore/socket-util.c
index 0d0762d..2cc9882 100644
--- a/src/pulsecore/socket-util.c
+++ b/src/pulsecore/socket-util.c
@@ -151,7 +151,7 @@ void pa_make_socket_low_delay(int fd) {
     pa_assert(fd >= 0);
 
     priority = 6;
-    if (setsockopt(fd, SOL_SOCKET, SO_PRIORITY, (void*)&priority, sizeof(priority)) < 0)
+    if (setsockopt(fd, SOL_SOCKET, SO_PRIORITY, &priority, sizeof(priority)) < 0)
         pa_log_warn("SO_PRIORITY failed: %s", pa_cstrerror(errno));
 #endif
 }
@@ -165,9 +165,9 @@ void pa_make_tcp_socket_low_delay(int fd) {
     {
         int on = 1;
 #if defined(SOL_TCP)
-        if (setsockopt(fd, SOL_TCP, TCP_NODELAY, (void*)&on, sizeof(on)) < 0)
+        if (setsockopt(fd, SOL_TCP, TCP_NODELAY, &on, sizeof(on)) < 0)
 #else
-        if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (void*)&on, sizeof(on)) < 0)
+        if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on)) < 0)
 #endif
             pa_log_warn("TCP_NODELAY failed: %s", pa_cstrerror(errno));
     }
@@ -177,9 +177,9 @@ void pa_make_tcp_socket_low_delay(int fd) {
     {
         int tos = IPTOS_LOWDELAY;
 #ifdef SOL_IP
-        if (setsockopt(fd, SOL_IP, IP_TOS, (void*)&tos, sizeof(tos)) < 0)
+        if (setsockopt(fd, SOL_IP, IP_TOS, &tos, sizeof(tos)) < 0)
 #else
-        if (setsockopt(fd, IPPROTO_IP, IP_TOS, (void*)&tos, sizeof(tos)) < 0)
+        if (setsockopt(fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) < 0)
 #endif
             pa_log_warn("IP_TOS failed: %s", pa_cstrerror(errno));
     }
@@ -195,9 +195,9 @@ void pa_make_udp_socket_low_delay(int fd) {
     {
         int tos = IPTOS_LOWDELAY;
 #ifdef SOL_IP
-        if (setsockopt(fd, SOL_IP, IP_TOS, (void*)&tos, sizeof(tos)) < 0)
+        if (setsockopt(fd, SOL_IP, IP_TOS, &tos, sizeof(tos)) < 0)
 #else
-        if (setsockopt(fd, IPPROTO_IP, IP_TOS, (void*)&tos, sizeof(tos)) < 0)
+        if (setsockopt(fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) < 0)
 #endif
             pa_log_warn("IP_TOS failed: %s", pa_cstrerror(errno));
     }
@@ -205,11 +205,11 @@ void pa_make_udp_socket_low_delay(int fd) {
 }
 
 int pa_socket_set_rcvbuf(int fd, size_t l) {
-    int bufsz = (int)l;
+    int bufsz = (int) l;
 
     pa_assert(fd >= 0);
 
-    if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, (void*)&bufsz, sizeof(bufsz)) < 0) {
+    if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &bufsz, sizeof(bufsz)) < 0) {
         pa_log_warn("SO_RCVBUF: %s", pa_cstrerror(errno));
         return -1;
     }
@@ -218,12 +218,12 @@ int pa_socket_set_rcvbuf(int fd, size_t l) {
 }
 
 int pa_socket_set_sndbuf(int fd, size_t l) {
-    int bufsz = (int)l;
+    int bufsz = (int) l;
 
     pa_assert(fd >= 0);
 
-    if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (void*)&bufsz, sizeof(bufsz)) < 0) {
-        pa_log("SO_SNDBUF: %s", pa_cstrerror(errno));
+    if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &bufsz, sizeof(bufsz)) < 0) {
+        pa_log_warn("SO_SNDBUF: %s", pa_cstrerror(errno));
         return -1;
     }
 

commit aa8ce5bb9b159abb2ffb0f43996340566fc2e9c6
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Oct 30 05:08:48 2009 +0100

    daemon: don't crash if pa_realpath() fails

diff --git a/src/daemon/main.c b/src/daemon/main.c
index 9e5647a..576fc3e 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -425,21 +425,24 @@ int main(int argc, char *argv[]) {
 
         pa_set_env("LD_BIND_NOW", "1");
 
-        canonical_rp = pa_realpath(PA_BINARY);
+        if (!(canonical_rp = pa_realpath(PA_BINARY))) {
 
-        if ((rp = pa_readlink("/proc/self/exe"))) {
+            if ((rp = pa_readlink("/proc/self/exe"))) {
 
-            if (pa_streq(rp, canonical_rp))
-                pa_assert_se(execv(rp, argv) == 0);
-            else
-                pa_log_warn("/proc/self/exe does not point to %s, cannot self execute. Are you playing games?", canonical_rp);
+                if (pa_streq(rp, canonical_rp))
+                    pa_assert_se(execv(rp, argv) == 0);
+                else
+                    pa_log_warn("/proc/self/exe does not point to %s, cannot self execute. Are you playing games?", canonical_rp);
 
-            pa_xfree(rp);
+                pa_xfree(rp);
 
-        } else
-            pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
+            } else
+                pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
 
-        pa_xfree(canonical_rp);
+            pa_xfree(canonical_rp);
+
+        } else
+            pa_log_warn("Couldn't canonicalize binary path, cannot self execute.");
     }
 #endif
 

commit 8a49514f74cacd523117aabcd4514543db63a4ed
Author: Wim Taymans <wim.taymans at collabora.co.uk>
Date:   Thu Oct 29 12:47:42 2009 +0100

    sink: simplify silence checks

diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index 221b569..971436d 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -926,18 +926,16 @@ void pa_sink_render(pa_sink*s, size_t length, pa_memchunk *result) {
 
         pa_sw_cvolume_multiply(&volume, &s->thread_info.soft_volume, &info[0].volume);
 
-        if (s->thread_info.soft_muted || !pa_cvolume_is_norm(&volume)) {
-            if (s->thread_info.soft_muted || pa_cvolume_is_muted(&volume)) {
-                pa_memblock_unref(result->memblock);
-                pa_silence_memchunk_get(&s->core->silence_cache,
-                                        s->core->mempool,
-                                        result,
-                                        &s->sample_spec,
-                                        result->length);
-            } else {
-                pa_memchunk_make_writable(result, 0);
-                pa_volume_memchunk(result, &s->sample_spec, &volume);
-            }
+        if (s->thread_info.soft_muted || pa_cvolume_is_muted(&volume)) {
+            pa_memblock_unref(result->memblock);
+            pa_silence_memchunk_get(&s->core->silence_cache,
+                                    s->core->mempool,
+                                    result,
+                                    &s->sample_spec,
+                                    result->length);
+        } else if (!pa_cvolume_is_norm(&volume)) {
+            pa_memchunk_make_writable(result, 0);
+            pa_volume_memchunk(result, &s->sample_spec, &volume);
         }
     } else {
         void *ptr;

commit 056930cbcde117036cdb707ed3e111b7833724ea
Author: Wim Taymans <wim.taymans at collabora.co.uk>
Date:   Thu Oct 29 14:49:52 2009 +0100

    svolume: fix MMX error
    
    We need to sign extend the lower part of the multiplication before adding it to
    the higher part. Makes -1 * 0xffff work again.

diff --git a/src/pulsecore/svolume_mmx.c b/src/pulsecore/svolume_mmx.c
index 5bf72ed..a011789 100644
--- a/src/pulsecore/svolume_mmx.c
+++ b/src/pulsecore/svolume_mmx.c
@@ -62,7 +62,9 @@
       " movq "#s", %%mm5             \n\t"                                              \
       " pmulhw "#v", "#s"            \n\t" /* .. |    0  | vl*p0 | */                   \
       " paddw %%mm4, "#s"            \n\t" /* .. |    0  | vl*p0 | + sign correct */    \
+      " pslld $16, "#s"              \n\t" /* .. | vl*p0 |   0   | */                   \
       " psrld $16, "#v"              \n\t" /* .. |    0  |   vh  | */                   \
+      " psrad $16, "#s"              \n\t" /* .. |     vl*p0     | sign extend */       \
       " pmaddwd %%mm5, "#v"          \n\t" /* .. |    p0 * vh    | */                   \
       " paddd "#s", "#v"             \n\t" /* .. |    p0 * v0    | */                   \
       " packssdw "#v", "#v"          \n\t" /* .. | p1*v1 | p0*v0 | */
@@ -257,11 +259,14 @@ static void run_test (void) {
     printf ("checking MMX %zd\n", sizeof (samples));
 
     pa_random (samples, sizeof (samples));
+    /* for (i = 0; i < SAMPLES; i++)
+       samples[i] = -1; */
     memcpy (samples_ref, samples, sizeof (samples));
     memcpy (samples_orig, samples, sizeof (samples));
 
     for (i = 0; i < CHANNELS; i++)
         volumes[i] = rand() >> 1;
+        /* volumes[i] = 0x0000ffff; */
     for (padding = 0; padding < PADDING; padding++, i++)
         volumes[i] = volumes[padding];
 
@@ -269,7 +274,7 @@ static void run_test (void) {
     pa_volume_s16ne_mmx (samples, volumes, CHANNELS, sizeof (samples));
     for (i = 0; i < SAMPLES; i++) {
         if (samples[i] != samples_ref[i]) {
-            printf ("%d: %04x != %04x (%04x * %04x)\n", i, samples[i], samples_ref[i],
+            printf ("%d: %04x != %04x (%04x * %08x)\n", i, samples[i], samples_ref[i],
                   samples_orig[i], volumes[i % CHANNELS]);
         }
     }

commit 366ab9633be76c920738dc806607d7656dda5191
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Oct 30 05:20:00 2009 +0100

    git: ignore kde related files

diff --git a/src/.gitignore b/src/.gitignore
index 6cd173c..64ab297 100644
--- a/src/.gitignore
+++ b/src/.gitignore
@@ -63,4 +63,5 @@ thread-test
 utf8-test
 voltest
 start-pulseaudio-x11
+start-pulseaudio-kde
 vector-test
diff --git a/src/daemon/.gitignore b/src/daemon/.gitignore
index 0efa55b..54e4299 100644
--- a/src/daemon/.gitignore
+++ b/src/daemon/.gitignore
@@ -1,2 +1,3 @@
 org.pulseaudio.policy
 pulseaudio.desktop
+pulseaudio-kde.desktop

commit 65e8078a3bba6360f7918b2a721510d78826eece
Author: Leszek Koltunski <leszek at koltunski.pl>
Date:   Tue Oct 27 19:57:43 2009 +0800

    X11: attach X11 properties to Screen, not Display

diff --git a/src/pulsecore/x11prop.c b/src/pulsecore/x11prop.c
index 873a76e..dc8ec29 100644
--- a/src/pulsecore/x11prop.c
+++ b/src/pulsecore/x11prop.c
@@ -32,12 +32,12 @@
 
 void pa_x11_set_prop(Display *d, const char *name, const char *data) {
     Atom a = XInternAtom(d, name, False);
-    XChangeProperty(d, RootWindow(d, 0), a, XA_STRING, 8, PropModeReplace, (const unsigned char*) data, (int) (strlen(data)+1));
+    XChangeProperty(d, DefaultRootWindow(d), a, XA_STRING, 8, PropModeReplace, (const unsigned char*) data, (int) (strlen(data)+1));
 }
 
 void pa_x11_del_prop(Display *d, const char *name) {
     Atom a = XInternAtom(d, name, False);
-    XDeleteProperty(d, RootWindow(d, 0), a);
+    XDeleteProperty(d, DefaultRootWindow(d), a);
 }
 
 char* pa_x11_get_prop(Display *d, const char *name, char *p, size_t l) {
@@ -47,13 +47,21 @@ char* pa_x11_get_prop(Display *d, const char *name, char *p, size_t l) {
     unsigned long nbytes_after;
     unsigned char *prop = NULL;
     char *ret = NULL;
+    int window_ret;
 
     Atom a = XInternAtom(d, name, False);
-    if (XGetWindowProperty(d, RootWindow(d, 0), a, 0, (long) ((l+2)/4), False, XA_STRING, &actual_type, &actual_format, &nitems, &nbytes_after, &prop) != Success)
-        goto finish;
 
-    if (actual_type != XA_STRING)
-        goto finish;
+    window_ret = XGetWindowProperty(d, DefaultRootWindow(d), a, 0, (long) ((l+2)/4), False, XA_STRING, &actual_type, &actual_format, &nitems, &nbytes_after, &prop);
+
+    if (window_ret != Success || actual_type != XA_STRING) {
+        if (DefaultScreen(d) != 0) {
+            window_ret = XGetWindowProperty(d, RootWindow(d, 0), a, 0, (long) ((l+2)/4), False, XA_STRING, &actual_type, &actual_format, &nitems, &nbytes_after, &prop);
+
+            if (window_ret != Success || actual_type != XA_STRING)
+                goto finish;
+        } else
+            goto finish;
+    }
 
     memcpy(p, prop, nitems);
     p[nitems] = 0;

commit b04fe9b516160f92d016a8bb81a431c74cac2ecd
Author: Daniel Mack <daniel at caiaq.de>
Date:   Mon Oct 19 12:45:30 2009 +0200

    Wrap clock_gettime and friends
    
    On Wed, Sep 16, 2009 at 11:48:58PM +0200, Lennart Poettering wrote:
    > On Wed, 16.09.09 15:15, Daniel Mack (daniel at caiaq.de) wrote:
    >
    > > From: Kim Lester <kim at dfusion.com.au>
    > >
    > > OS X does not define clockid_t or clock_gettime() and friends.
    > > Add a wrapper to fix this.
    >
    > Hmpf. I am not particularly happy with this. This adds a lot of
    > unnecessary compat code. We don't actually need implementations of
    > clock_getres(). All we need is some kind of check whether system
    > timers are accurate or whether they are rounded up to scheduling
    > slices. On Linux we do that check with clock_getres(), but all the
    > information it returns is actually not intertesting at all. We just
    > check if this is below some trheshold, that's all.
    >
    > clock_settime() we don't use at all! We shouldn't carry compat code
    > for that.
    >
    > And clock_gettime we don't really need either. We need some kind of
    > accurate system timers (preferably monotonic), and on Linux we use
    > clock_gettime() for that. But we already have a fallback there for
    > gettimeofday().
    >
    > Or in other words, the current APIs pa_rtclock_get(),
    > pa_rtclock_hrtimer() is supposed to be the abstract API that has
    > different backends on different systems. I'd very much prefer if any
    > MacOS specific code would simply be plugged in there instead of
    > creating various new abstraction interfaces!
    
    Ok - what about the version below? I don't particularily like the
    
    Daniel
    
    >From 9f0a051953ec354ccdb8aa44a9845c408b26ae0b Mon Sep 17 00:00:00 2001
    From: Kim Lester <kim at dfusion.com.au>
    Date: Wed, 16 Sep 2009 14:40:01 +0800
    Subject: [PATCH] Implement pa_rtclock_get() and pa_rtclock_hrtimer() for Darwin
    
    OS X does not define clockid_t or clock_gettime() and friends.
    Add wrappers to fix this. Based on a patch from Kim Lester
    <kim at dfusion.com.au>.

diff --git a/src/pulsecore/core-rtclock.c b/src/pulsecore/core-rtclock.c
index 1420470..4fe0a47 100644
--- a/src/pulsecore/core-rtclock.c
+++ b/src/pulsecore/core-rtclock.c
@@ -33,6 +33,12 @@
 #include <sys/prctl.h>
 #endif
 
+#ifdef OS_IS_DARWIN
+#include <CoreServices/CoreServices.h>
+#include <mach/mach.h>
+#include <mach/mach_time.h>
+#endif
+
 #include <pulse/timeval.h>
 #include <pulsecore/macro.h>
 #include <pulsecore/core-error.h>
@@ -47,7 +53,8 @@ pa_usec_t pa_rtclock_age(const struct timeval *tv) {
 }
 
 struct timeval *pa_rtclock_get(struct timeval *tv) {
-#ifdef HAVE_CLOCK_GETTIME
+
+#if defined(HAVE_CLOCK_GETTIME)
     struct timespec ts;
 
 #ifdef CLOCK_MONOTONIC
@@ -59,7 +66,7 @@ struct timeval *pa_rtclock_get(struct timeval *tv) {
             no_monotonic = TRUE;
 
     if (no_monotonic)
-#endif
+#endif /* CLOCK_MONOTONIC */
         pa_assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0);
 
     pa_assert(tv);
@@ -69,7 +76,30 @@ struct timeval *pa_rtclock_get(struct timeval *tv) {
 
     return tv;
 
-#else /* HAVE_CLOCK_GETTIME */
+#elif defined(OS_IS_DARWIN)
+    static mach_timebase_info_data_t   tbi;
+    uint64_t nticks;
+    uint64_t time_nsec;
+
+    /* Refer Apple ADC QA1398
+       Also: http://devworld.apple.com/documentation/Darwin/Conceptual/KernelProgramming/services/services.html
+
+       Note: argument is timespec NOT timeval (timespec uses nsec, timeval uses usec)
+    */
+
+    /* try and be a mite efficient - maybe I should keep the N/D as a float !? */
+    if (tbi.denom == 0)
+        mach_timebase_info(&tbi);
+
+    nticks = mach_absolute_time();
+    time_nsec = nticks * tbi.numer / tbi.denom; // see above
+
+    tv->tv_sec = time_nsec / PA_NSEC_PER_SEC;
+    tv->tv_usec = time_nsec / PA_NSEC_PER_USEC;
+
+    return tv;
+
+#else /* OS_IS_DARWIN */
 
     return pa_gettimeofday(tv);
 
@@ -77,19 +107,30 @@ struct timeval *pa_rtclock_get(struct timeval *tv) {
 }
 
 pa_bool_t pa_rtclock_hrtimer(void) {
-#ifdef HAVE_CLOCK_GETTIME
+
+#if defined(HAVE_CLOCK_GETTIME)
     struct timespec ts;
 
 #ifdef CLOCK_MONOTONIC
+
     if (clock_getres(CLOCK_MONOTONIC, &ts) >= 0)
         return ts.tv_sec == 0 && ts.tv_nsec <= (long) (PA_HRTIMER_THRESHOLD_USEC*PA_NSEC_PER_USEC);
-#endif
+#endif /* CLOCK_MONOTONIC */
 
     pa_assert_se(clock_getres(CLOCK_REALTIME, &ts) == 0);
     return ts.tv_sec == 0 && ts.tv_nsec <= (long) (PA_HRTIMER_THRESHOLD_USEC*PA_NSEC_PER_USEC);
 
-#else /* HAVE_CLOCK_GETTIME */
+#elif defined (OS_IS_DARWIN)
+    mach_timebase_info_data_t tbi;
+    uint64_t time_nsec;
+
+    mach_timebase_info(&tbi);
 
+    /* nsec = nticks * (N/D) - we want 1 tick == resolution !? */
+    time_nsec = tbi.numer / tbi.denom;
+    return time_nsec <= (long) (PA_HRTIMER_THRESHOLD_USEC*PA_NSEC_PER_USEC);
+
+#else /* OS_IS_DARWIN */
     return FALSE;
 
 #endif
@@ -98,6 +139,7 @@ pa_bool_t pa_rtclock_hrtimer(void) {
 #define TIMER_SLACK_NS (int) ((500 * PA_NSEC_PER_USEC))
 
 void pa_rtclock_hrtimer_enable(void) {
+
 #ifdef PR_SET_TIMERSLACK
     int slack_ns;
 

commit 542fa468c26c5035485dc73392c57c222183b510
Author: Daniel Mack <daniel at caiaq.de>
Date:   Mon Oct 19 12:48:00 2009 +0200

    Mac OS X: add semaphore implementation
    
    On Wed, Sep 16, 2009 at 11:57:04PM +0200, Lennart Poettering wrote:
    > On Wed, 16.09.09 15:15, Daniel Mack (daniel at caiaq.de) wrote:
    >
    > > +    s = pa_xnew(pa_semaphore, 1);
    > > +    MPCreateSemaphore(UINT_MAX, value, &(s->sema));
    > > +    pa_assert(s->sema != 0);
    >
    > Hmm, I'd prefer if the ret val of MPCreateSemaphore() would be checked
    > here.
    >
    > Also I find it a bit weird checking for s->sema, though not
    > initializing it to 0 in the beginning. If the call actually failed,
    > then the assert will check uninitialized memory. Also, comparing
    > pointers with 0 sucks. That should be NULL.
    >
    > Given that this can not realisitically fail, only in OOM or OOM-like
    > situations in which case we abort anyway it mght be enough just writing:
    >
    > pa_assert_se(MPCreateSemaphore(UINT_MAX, value, &s->sema) == 0);
    >
    > (Assuming that success is signalled by retval == 0 on MacOSX)
    >
    > > +void pa_semaphore_free(pa_semaphore *s) {
    > > +    pa_assert(s);
    > > +    MPDeleteSemaphore(s->sema);
    >
    > Same here.
    >
    > > +    pa_xfree(s);
    > > +}
    > > +
    > > +void pa_semaphore_post(pa_semaphore *s) {
    > > +    pa_assert(s);
    > > +    MPSignalSemaphore(s->sema);
    >
    > And here.
    >
    > > +}
    > > +
    > > +void pa_semaphore_wait(pa_semaphore *s) {
    > > +    pa_assert(s);
    > > +    /* should probably check return value (-ve is error), noErr is ok. */
    > > +    MPWaitOnSemaphore(s->sema, kDurationForever);
    >
    > And here.
    
    Ok, done. See the patch below.
    
    Daniel
    
    >From 26df2fbae6d9215a3ae084876fb5f79e4d9cf4f0 Mon Sep 17 00:00:00 2001
    From: Kim Lester <kim at dfusion.com.au>
    Date: Wed, 16 Sep 2009 09:23:39 +0800
    Subject: [PATCH] Mac OS X: add semaphore implementation

diff --git a/src/pulsecore/semaphore-osx.c b/src/pulsecore/semaphore-osx.c
new file mode 100644
index 0000000..73f4355
--- /dev/null
+++ b/src/pulsecore/semaphore-osx.c
@@ -0,0 +1,63 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Kim Lester <kim at dfusion.com.au>
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <Multiprocessing.h>
+
+#include <pulse/xmalloc.h>
+#include <pulsecore/macro.h>
+
+#include "semaphore.h"
+
+struct pa_semaphore
+{
+    MPSemaphoreID sema;
+};
+
+pa_semaphore* pa_semaphore_new(unsigned int value) {
+    /* NOTE: Can't assume boolean - ie value = 0,1, so use UINT_MAX (boolean more efficient ?) */
+    pa_semaphore *s;
+
+    s = pa_xnew(pa_semaphore, 1);
+    pa_assert_se(MPCreateSemaphore(UINT_MAX, value, &s->sema) == 0);
+
+    return s;
+}
+
+void pa_semaphore_free(pa_semaphore *s) {
+    pa_assert(s);
+    pa_assert_se(MPDeleteSemaphore(s->sema) == 0);
+    pa_xfree(s);
+}
+
+void pa_semaphore_post(pa_semaphore *s) {
+    pa_assert(s);
+    pa_assert_se(MPSignalSemaphore(s->sema) == 0);
+}
+
+void pa_semaphore_wait(pa_semaphore *s) {
+    pa_assert(s);
+    /* should probably check return value (-ve is error), noErr is ok. */
+    pa_assert_se(MPWaitOnSemaphore(s->sema, kDurationForever) == 0);
+}

commit 5c576507693c1d7c4aa8c51656b37c91bcf1289b
Author: David Yoder <davidmyoder at gmail.com>
Date:   Fri Oct 30 09:54:08 2009 -0500

    daemon: realpath segfault fix
    
    Lennart,
    
    Apparently I was debugging this at the same time as you. I can't figure out
    why my Fedora 11 install with glibc-2.10 has a glibc realpath that doesn't
    match the gnu documentation and returns null. But it does.
    
    Your commit aa8ce5bb9b159abb2ffb0f43996340566fc2e9c6 almost fixed my
    problem, but it needs a tweak.
    
    Thanks,
    David Yoder

diff --git a/src/daemon/main.c b/src/daemon/main.c
index 576fc3e..c73e9af 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -425,7 +425,7 @@ int main(int argc, char *argv[]) {
 
         pa_set_env("LD_BIND_NOW", "1");
 
-        if (!(canonical_rp = pa_realpath(PA_BINARY))) {
+        if ((canonical_rp = pa_realpath(PA_BINARY))) {
 
             if ((rp = pa_readlink("/proc/self/exe"))) {
 

commit b83d7a27cee4a436e4d692a9bba1b426090f4d12
Author: Daniel Mack <daniel at caiaq.de>
Date:   Sat Oct 31 01:58:26 2009 +0100

    configure.ac: enable check for CoreAudio

diff --git a/configure.ac b/configure.ac
index 1022a6e..2bc068e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -742,6 +742,28 @@ AC_SUBST(HAVE_OSS)
 AM_CONDITIONAL([HAVE_OSS_OUTPUT], [test "x$HAVE_OSS" = x1 && test "x${oss_output}" != "xno"])
 AM_CONDITIONAL([HAVE_OSS_WRAPPER], [test "x$HAVE_OSS" = x1 && test "x${oss_wrapper}" != "xno"])
 
+#### CoreAudio support (optional) ####
+
+AC_ARG_ENABLE([coreaudio-output],
+    AS_HELP_STRING([--disable-coreaudio-output],[Disable optional CoreAudio output support]),
+        [
+            case "${enableval}" in
+                yes) coreaudio_enabled=yes ;;
+                no) coreaudio_enabled=no ;;
+                *) AC_MSG_ERROR(bad value ${enableval} for --disable-coreaudio-output) ;;
+            esac
+        ],
+        [coreaudio_enabled=auto])
+
+if test "x${coreaudio_enabled}" != xno ; then
+    AC_CHECK_HEADERS([CoreAudio/CoreAudio.h], HAVE_COREAUDIO=1)
+else
+    HAVE_COREAUDIO=0
+fi
+
+AC_SUBST(HAVE_COREAUDIO)
+AM_CONDITIONAL([HAVE_COREAUDIO], [test "x$HAVE_COREAUDIO" = x1 && test "x${coreaudio_enabled}" != "xno"])
+
 #### ALSA support (optional) ####
 
 AC_ARG_ENABLE([alsa],
@@ -1423,6 +1445,11 @@ if test "x$HAVE_OSS" = "x1" ; then
    fi
 fi
 
+ENABLE_COREAUDIO=no
+if test "x$HAVE_COREAUDIO" = "x1" ; then
+   ENABLE_COREAUDIO=yes
+fi
+
 ENABLE_ALSA=no
 if test "x$HAVE_ALSA" = "x1" ; then
    ENABLE_ALSA=yes
@@ -1548,6 +1575,7 @@ echo "
     Have X11:                      ${ENABLE_X11}
     Enable OSS Output:             ${ENABLE_OSS_OUTPUT}
     Enable OSS Wrapper:            ${ENABLE_OSS_WRAPPER}
+    Enable CoreAudio:              ${ENABLE_COREAUDIO}
     Enable Alsa:                   ${ENABLE_ALSA}
     Enable Solaris:                ${ENABLE_SOLARIS}
     Enable GLib 2.0:               ${ENABLE_GLIB20}

commit 2dc37e1214f20aab528ae680e9a85fc8ea143313
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sat Oct 31 02:05:54 2009 +0100

    bluetooth: do not hand out access to devices that are not fully configured yet

diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
index f8c5b77..47d6200 100644
--- a/src/modules/bluetooth/bluetooth-util.c
+++ b/src/modules/bluetooth/bluetooth-util.c
@@ -723,12 +723,14 @@ const pa_bluetooth_device* pa_bluetooth_discovery_get_by_address(pa_bluetooth_di
 
     while ((d = pa_hashmap_iterate(y->devices, &state, NULL)))
         if (pa_streq(d->address, address))
-            return d;
+            return device_is_audio(d) ? d : NULL;
 
     return NULL;
 }
 
 const pa_bluetooth_device* pa_bluetooth_discovery_get_by_path(pa_bluetooth_discovery *y, const char* path) {
+    pa_bluetooth_device *d;
+
     pa_assert(y);
     pa_assert(PA_REFCNT_VALUE(y) > 0);
     pa_assert(path);
@@ -736,7 +738,11 @@ const pa_bluetooth_device* pa_bluetooth_discovery_get_by_path(pa_bluetooth_disco
     if (!pa_hook_is_firing(&y->hook))
         pa_bluetooth_discovery_sync(y);
 
-    return pa_hashmap_get(y->devices, path);
+    if ((d = pa_hashmap_get(y->devices, path)))
+        if (device_is_audio(d))
+            return d;
+
+    return NULL;
 }
 
 static int setup_dbus(pa_bluetooth_discovery *y) {

commit c4e276edbd84cbb8c5b594c9f427b0a25a7fb2ab
Merge: 9c61465 2dc37e1
Author: Daniel Mack <daniel at caiaq.de>
Date:   Sat Oct 31 02:16:14 2009 +0100

    Merge branch 'master' of git://0pointer.de/pulseaudio


commit 8e94f653489a0b3d549e61840a5cec711d466ab7
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sat Oct 31 02:43:47 2009 +0100

    daemon: make sure pa has its own session and process group, but is not its leader so that we cannot acquire a tty ever

diff --git a/src/daemon/main.c b/src/daemon/main.c
index c73e9af..cc6f24b 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -657,7 +657,7 @@ int main(int argc, char *argv[]) {
 
 #ifdef HAVE_FORK
         if (pipe(daemon_pipe) < 0) {
-            pa_log(_("pipe failed: %s"), pa_cstrerror(errno));
+            pa_log(_("pipe() failed: %s"), pa_cstrerror(errno));
             goto finish;
         }
 
@@ -708,22 +708,27 @@ int main(int argc, char *argv[]) {
             pa_log_set_target(PA_LOG_SYSLOG);
 
 #ifdef HAVE_SETSID
-        setsid();
-#endif
-#ifdef HAVE_SETPGID
-        setpgid(0,0);
+        if (setsid() < 0) {
+            pa_log(_("setsid() failed: %s"), pa_cstrerror(errno));
+            goto finish;
+        }
 #endif
 
-#ifndef OS_IS_WIN32
-        pa_close(0);
-        pa_close(1);
-        pa_close(2);
+        /* We now are a session and process group leader. Let's fork
+         * again and let the father die, so that we'll become a
+         * process that can never acquire a TTY again, in a session and
+         * process group without leader */
 
-        pa_assert_se(open("/dev/null", O_RDONLY) == 0);
-        pa_assert_se(open("/dev/null", O_WRONLY) == 1);
-        pa_assert_se(open("/dev/null", O_WRONLY) == 2);
-#else
-        FreeConsole();
+#ifdef HAVE_FORK
+        if ((child = fork()) < 0) {
+            pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
+            goto finish;
+        }
+
+        if (child != 0) {
+            retval = 0;
+            goto finish;
+        }
 #endif
 
 #ifdef SIGTTOU
@@ -736,12 +741,7 @@ int main(int argc, char *argv[]) {
         signal(SIGTSTP, SIG_IGN);
 #endif
 
-#ifdef TIOCNOTTY
-        if ((tty_fd = open("/dev/tty", O_RDWR)) >= 0) {
-            ioctl(tty_fd, TIOCNOTTY, (char*) 0);
-            pa_assert_se(pa_close(tty_fd) == 0);
-        }
-#endif
+        pa_nullify_stdfds();
     }
 
     pa_set_env_and_record("PULSE_INTERNAL", "1");
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 738bf06..2b0a60a 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -2999,3 +2999,19 @@ finish:
     pa_make_fd_cloexec(fileno(f));
     return f;
 }
+
+void pa_nullify_stdfds(void) {
+
+#ifndef OS_IS_WIN32
+        pa_close(STDIN_FILENO);
+        pa_close(STDOUT_FILENO);
+        pa_close(STDERR_FILENO);
+
+        pa_assert_se(open("/dev/null", O_RDONLY) == STDIN_FILENO);
+        pa_assert_se(open("/dev/null", O_WRONLY) == STDOUT_FILENO);
+        pa_assert_se(open("/dev/null", O_WRONLY) == STDERR_FILENO);
+#else
+        FreeConsole();
+#endif
+
+}
diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h
index d50f79a..9c9cf78 100644
--- a/src/pulsecore/core-util.h
+++ b/src/pulsecore/core-util.h
@@ -265,4 +265,6 @@ int pa_pipe_cloexec(int pipefd[2]);
 int pa_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
 FILE* pa_fopen_cloexec(const char *path, const char *mode);
 
+void pa_nullify_stdfds(void);
+
 #endif

commit 3e115a96b050bb7b74cc10aaa35c6673a6b8cc84
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sat Oct 31 02:49:44 2009 +0100

    alsa: cover Mic Jack Mode element
    
    As used by some HDA chips:
    
    https://bugzilla.redhat.com/attachment.cgi?id=366816

diff --git a/src/modules/alsa/mixer/paths/analog-input.conf.common b/src/modules/alsa/mixer/paths/analog-input.conf.common
index 87af38b..d883b32 100644
--- a/src/modules/alsa/mixer/paths/analog-input.conf.common
+++ b/src/modules/alsa/mixer/paths/analog-input.conf.common
@@ -98,7 +98,7 @@ priority = 18
 name = input-docking
 priority = 17
 
-;;; ' Capture Source'
+;;; 'Capture Source'
 
 [Element Capture Source]
 enumeration = select
@@ -244,6 +244,17 @@ name = input-docking
 [Option Capture Source:Dock Mic]
 name = input-docking-microphone
 
+;;; 'Mic Jack Mode'
+
+[Element Mic Jack Mode]
+enumeration = select
+
+[Option Mic Jack Mode:Mic In]
+name = input-microphone
+
+[Option Mic Jack Mode:Line In]
+name = input-linein
+
 ;;; Various Boosts
 
 [Element Capture Boost]

commit 430e8e2ee52235f59b015e8e4a3aff9b4abd28b8
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sat Oct 31 02:56:57 2009 +0100

    alsa: cover 'Digital Input Source' element
    
    As used by some HDA devices:
    
    https://bugzilla.redhat.com/attachment.cgi?id=365290

diff --git a/src/modules/alsa/mixer/paths/analog-input.conf.common b/src/modules/alsa/mixer/paths/analog-input.conf.common
index d883b32..007bb21 100644
--- a/src/modules/alsa/mixer/paths/analog-input.conf.common
+++ b/src/modules/alsa/mixer/paths/analog-input.conf.common
@@ -255,6 +255,20 @@ name = input-microphone
 [Option Mic Jack Mode:Line In]
 name = input-linein
 
+;;; 'Digital Input Source'
+
+[Element Digital Input Source]
+enumeration = select
+
+[Option Digital Input Source:Analog Inputs]
+name = input
+
+[Option Digital Input Source:Digital Mic 1]
+name = input-microphone
+
+[Option Digital Input Source:Digital Mic 2]
+name = input-microphone
+
 ;;; Various Boosts
 
 [Element Capture Boost]

commit 220ac0a61a1f3b310a9c49153c56a395ac701e89
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sat Oct 31 03:10:00 2009 +0100

    alsa: cover Headphone2 mixer element
    
    As seen on some drivers:
    
    https://bugzilla.redhat.com/show_bug.cgi?id=498612

diff --git a/src/Makefile.am b/src/Makefile.am
index 98c0468..aa71d91 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -143,6 +143,7 @@ EXTRA_DIST = \
 		modules/alsa/mixer/paths/analog-output.conf \
 		modules/alsa/mixer/paths/analog-output.conf.common \
 		modules/alsa/mixer/paths/analog-output-headphones.conf \
+		modules/alsa/mixer/paths/analog-output-headphones-2.conf \
 		modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf \
 		modules/alsa/mixer/paths/analog-output-mono.conf
 
diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones.conf b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
similarity index 94%
copy from src/modules/alsa/mixer/paths/analog-output-headphones.conf
copy to src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
index 61d2e29..8b2968e 100644
--- a/src/modules/alsa/mixer/paths/analog-output-headphones.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
@@ -14,7 +14,7 @@
 # along with PulseAudio; if not, write to the Free Software Foundation,
 # Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 
-; Path for mixers that have a 'Headphone' control
+; Path for mixers that have a 'Headphone2' control
 ;
 ; See analog-output.conf.common for an explanation on the directives
 
@@ -38,6 +38,10 @@ switch = off
 volume = off
 
 [Element Headphone]
+switch = off
+volume = off
+
+[Element Headphone2]
 required = any
 switch = mute
 volume = merge
diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones.conf b/src/modules/alsa/mixer/paths/analog-output-headphones.conf
index 61d2e29..6e79a78 100644
--- a/src/modules/alsa/mixer/paths/analog-output-headphones.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-headphones.conf
@@ -44,6 +44,10 @@ volume = merge
 override-map.1 = all
 override-map.2 = all-left,all-right
 
+[Element Headphone2]
+switch = off
+volume = off
+
 [Element Speaker]
 switch = off
 volume = off
diff --git a/src/modules/alsa/mixer/profile-sets/default.conf b/src/modules/alsa/mixer/profile-sets/default.conf
index ac41a8d..ffa1a4f 100644
--- a/src/modules/alsa/mixer/profile-sets/default.conf
+++ b/src/modules/alsa/mixer/profile-sets/default.conf
@@ -62,14 +62,14 @@ auto-profiles = yes
 [Mapping analog-mono]
 device-strings = hw:%f
 channel-map = mono
-paths-output = analog-output analog-output-headphones analog-output-mono analog-output-lfe-on-mono
+paths-output = analog-output analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono
 paths-input = analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line
 priority = 1
 
 [Mapping analog-stereo]
 device-strings = front:%f hw:%f
 channel-map = left,right
-paths-output = analog-output analog-output-headphones analog-output-mono analog-output-lfe-on-mono
+paths-output = analog-output analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono
 paths-input = analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line
 priority = 10
 

commit 73d9d317b2d74aa81ec3df7b83c48cb175e18c59
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sat Oct 31 03:25:32 2009 +0100

    alsa: cover Input Source:AUX IN
    
    As seen on some HDA chips:
    
    https://bugzilla.redhat.com/attachment.cgi?id=359804

diff --git a/src/modules/alsa/mixer/paths/analog-input.conf.common b/src/modules/alsa/mixer/paths/analog-input.conf.common
index 007bb21..951e11f 100644
--- a/src/modules/alsa/mixer/paths/analog-input.conf.common
+++ b/src/modules/alsa/mixer/paths/analog-input.conf.common
@@ -98,6 +98,10 @@ priority = 18
 name = input-docking
 priority = 17
 
+[Option Input Source:AUX IN]
+name = input
+priority = 10
+
 ;;; 'Capture Source'
 
 [Element Capture Source]

commit 591ade1aca2a444f5a6ba8198535d75290ee267f
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sat Oct 31 03:41:21 2009 +0100

    alsa: lower priority for Headphone2 path

diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
index 8b2968e..d1c3b22 100644
--- a/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
@@ -19,7 +19,7 @@
 ; See analog-output.conf.common for an explanation on the directives
 
 [General]
-priority = 90
+priority = 89
 
 [Element Hardware Master]
 switch = mute

commit 73a4f4fdbcb97e42479ec8498c305449e32f8b89
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sat Oct 31 03:42:42 2009 +0100

    alsa: leave other headphone control enabled if possible

diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
index d1c3b22..f2fd31c 100644
--- a/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
@@ -37,9 +37,12 @@ override-map.2 = all-left,all-right
 switch = off
 volume = off
 
+; This profile path is intended to control the second headphones, not
+; the first headphones. But it should not hurt if we leave the
+; headphone jack enabled nonetheless.
 [Element Headphone]
-switch = off
-volume = off
+switch = mute
+volume = zero
 
 [Element Headphone2]
 required = any
diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones.conf b/src/modules/alsa/mixer/paths/analog-output-headphones.conf
index 6e79a78..2131cfe 100644
--- a/src/modules/alsa/mixer/paths/analog-output-headphones.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-headphones.conf
@@ -44,9 +44,12 @@ volume = merge
 override-map.1 = all
 override-map.2 = all-left,all-right
 
+; This profile path is intended to control the first headphones, not
+; the second headphones. But it should not hurt if we leave the second
+; headphone jack enabled nonetheless.
 [Element Headphone2]
-switch = off
-volume = off
+switch = mute
+volume = zero
 
 [Element Speaker]
 switch = off
diff --git a/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf b/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf
index 911361d..0a43e27 100644
--- a/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf
@@ -48,6 +48,10 @@ override-map.2 = lfe,lfe
 switch = mute
 volume = zero
 
+[Element Headphone2]
+switch = mute
+volume = zero
+
 [Element Speaker]
 switch = mute
 volume = merge
diff --git a/src/modules/alsa/mixer/paths/analog-output-mono.conf b/src/modules/alsa/mixer/paths/analog-output-mono.conf
index 2fbc60b..542edc4 100644
--- a/src/modules/alsa/mixer/paths/analog-output-mono.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-mono.conf
@@ -45,6 +45,10 @@ override-map.2 = all-left,all-right
 switch = mute
 volume = zero
 
+[Element Headphone2]
+switch = mute
+volume = zero
+
 [Element Speaker]
 switch = mute
 volume = merge
diff --git a/src/modules/alsa/mixer/paths/analog-output.conf b/src/modules/alsa/mixer/paths/analog-output.conf
index f71a05a..b10efc2 100644
--- a/src/modules/alsa/mixer/paths/analog-output.conf
+++ b/src/modules/alsa/mixer/paths/analog-output.conf
@@ -44,6 +44,10 @@ volume = off
 switch = mute
 volume = zero
 
+[Element Headphone2]
+switch = mute
+volume = zero
+
 [Element Speaker]
 switch = mute
 volume = merge

commit 6839ef687410bcf6ef74163688676c518e8e0660
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sat Oct 31 03:43:42 2009 +0100

    alsa: create a seperate mixer path for Speaker elements
    
    On some cards line-out is independant of Sepaker and it is a good idea
    to cover that so that they can independantly be activated.
    
    https://bugzilla.redhat.com/show_bug.cgi?id=520884

diff --git a/src/Makefile.am b/src/Makefile.am
index aa71d91..f0d5a5e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -141,6 +141,7 @@ EXTRA_DIST = \
 		modules/alsa/mixer/paths/analog-input-tvtuner.conf \
 		modules/alsa/mixer/paths/analog-input-video.conf \
 		modules/alsa/mixer/paths/analog-output.conf \
+		modules/alsa/mixer/paths/analog-output-speaker.conf \
 		modules/alsa/mixer/paths/analog-output.conf.common \
 		modules/alsa/mixer/paths/analog-output-headphones.conf \
 		modules/alsa/mixer/paths/analog-output-headphones-2.conf \
diff --git a/src/modules/alsa/mixer/paths/analog-output.conf b/src/modules/alsa/mixer/paths/analog-output-speaker.conf
similarity index 97%
copy from src/modules/alsa/mixer/paths/analog-output.conf
copy to src/modules/alsa/mixer/paths/analog-output-speaker.conf
index b10efc2..aea7853 100644
--- a/src/modules/alsa/mixer/paths/analog-output.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-speaker.conf
@@ -14,7 +14,7 @@
 # along with PulseAudio; if not, write to the Free Software Foundation,
 # Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 
-; Intended for the 'default' output
+; Path for mixers that have a 'Speaker' control
 ;
 ; See analog-output.conf.common for an explanation on the directives
 
@@ -49,6 +49,7 @@ switch = mute
 volume = zero
 
 [Element Speaker]
+required = any
 switch = mute
 volume = merge
 override-map.1 = all
diff --git a/src/modules/alsa/mixer/paths/analog-output.conf b/src/modules/alsa/mixer/paths/analog-output.conf
index b10efc2..d7c1223 100644
--- a/src/modules/alsa/mixer/paths/analog-output.conf
+++ b/src/modules/alsa/mixer/paths/analog-output.conf
@@ -14,12 +14,13 @@
 # along with PulseAudio; if not, write to the Free Software Foundation,
 # Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 
-; Intended for the 'default' output
+; Intended for the 'default' output. Note that a-o-speaker.conf has a
+; higher priority than this
 ;
 ; See analog-output.conf.common for an explanation on the directives
 
 [General]
-priority = 100
+priority = 99
 
 [Element Hardware Master]
 switch = mute
@@ -37,7 +38,7 @@ override-map.2 = all-left,all-right
 switch = off
 volume = off
 
-; This profile path is intended to control the speaker, not the
+; This profile path is intended to control the default output, not the
 ; headphones. But it should not hurt if we leave the headphone jack
 ; enabled nonetheless.
 [Element Headphone]
@@ -50,9 +51,7 @@ volume = zero
 
 [Element Speaker]
 switch = mute
-volume = merge
-override-map.1 = all
-override-map.2 = all-left,all-right
+volume = off
 
 [Element Front]
 switch = mute
diff --git a/src/modules/alsa/mixer/profile-sets/default.conf b/src/modules/alsa/mixer/profile-sets/default.conf
index ffa1a4f..046938f 100644
--- a/src/modules/alsa/mixer/profile-sets/default.conf
+++ b/src/modules/alsa/mixer/profile-sets/default.conf
@@ -62,42 +62,42 @@ auto-profiles = yes
 [Mapping analog-mono]
 device-strings = hw:%f
 channel-map = mono
-paths-output = analog-output analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono
 paths-input = analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line
 priority = 1
 
 [Mapping analog-stereo]
 device-strings = front:%f hw:%f
 channel-map = left,right
-paths-output = analog-output analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono
 paths-input = analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line
 priority = 10
 
 [Mapping analog-surround-40]
 device-strings = surround40:%f
 channel-map = front-left,front-right,rear-left,rear-right
-paths-output = analog-output analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
 priority = 7
 direction = output
 
 [Mapping analog-surround-41]
 device-strings = surround41:%f
 channel-map = front-left,front-right,rear-left,rear-right,lfe
-paths-output = analog-output analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
 priority = 8
 direction = output
 
 [Mapping analog-surround-50]
 device-strings = surround50:%f
 channel-map = front-left,front-right,rear-left,rear-right,front-center
-paths-output = analog-output analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
 priority = 7
 direction = output
 
 [Mapping analog-surround-51]
 device-strings = surround51:%f
 channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
-paths-output = analog-output analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
 priority = 8
 direction = output
 
@@ -105,7 +105,7 @@ direction = output
 device-strings = surround71:%f
 channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
 description = Analog Surround 7.1
-paths-output = analog-output analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
 priority = 7
 direction = output
 

commit 7938442f77fafbc6c14d5072d14b773b289dc809
Merge: 6839ef6 d83dd5b
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sat Oct 31 03:49:02 2009 +0100

    Merge remote branch 'phish3/master'


commit 21ffcd55a5a425870f8f4c3b4933bc7cb352e339
Merge: c4e276e 7938442
Author: Daniel Mack <daniel at caiaq.de>
Date:   Mon Nov 2 18:09:57 2009 +0100

    Merge branch 'master' of git://0pointer.de/pulseaudio


commit 83b181f92af6a06ad5f127fea36323d7277ad6cf
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Nov 4 00:15:47 2009 +0100

    alsa: cover 'Analog Output' control
    
    http://pulseaudio.org/ticket/702

diff --git a/src/modules/alsa/mixer/paths/analog-output.conf.common b/src/modules/alsa/mixer/paths/analog-output.conf.common
index 3c6ce80..fd7f0cf 100644
--- a/src/modules/alsa/mixer/paths/analog-output.conf.common
+++ b/src/modules/alsa/mixer/paths/analog-output.conf.common
@@ -109,3 +109,20 @@ priority = 10
 [Option External Amplifier:off]
 name = output-amplifier-off
 priority = 0
+
+;;; 'Analog Output'
+
+[Element Analog Output]
+enumeration = select
+
+[Option Analog Output:Speakers]
+name = output-speaker
+priority = 10
+
+[Option Analog Output:Headphones]
+name = output-headphones
+priority = 9
+
+[Option Analog Output:FP Headphones]
+name = output-headphones
+priority = 8

commit 19516d4e7f4b6db205681931ad1c4bc1b6bef363
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Nov 5 03:21:10 2009 +0100

    alsa: introduce more standard path names

diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index f3ce681..8b13239 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -1712,7 +1712,9 @@ static int option_verify(pa_alsa_option *o) {
         { "input-boost-on",            N_("Boost") },
         { "input-boost-off",           N_("No Boost") },
         { "output-amplifier-on",       N_("Amplifier") },
-        { "output-amplifier-off",      N_("No Amplifier") }
+        { "output-amplifier-off",      N_("No Amplifier") },
+        { "output-speaker",            N_("Speaker") },
+        { "output-headphones",         N_("Headphones") }
     };
 
     pa_assert(o);
@@ -1770,15 +1772,17 @@ static int element_verify(pa_alsa_element *e) {
 
 static int path_verify(pa_alsa_path *p) {
     static const struct description_map well_known_descriptions[] = {
-        { "analog-input",              N_("Analog Input") },
-        { "analog-input-microphone",   N_("Analog Microphone") },
-        { "analog-input-linein",       N_("Analog Line-In") },
-        { "analog-input-radio",        N_("Analog Radio") },
-        { "analog-input-video",        N_("Analog Video") },
-        { "analog-output",             N_("Analog Output") },
-        { "analog-output-headphones",  N_("Analog Headphones") },
-        { "analog-output-lfe-on-mono", N_("Analog Output (LFE)") },
-        { "analog-output-mono",        N_("Analog Mono Output") }
+        { "analog-input",               N_("Analog Input") },
+        { "analog-input-microphone",    N_("Analog Microphone") },
+        { "analog-input-linein",        N_("Analog Line-In") },
+        { "analog-input-radio",         N_("Analog Radio") },
+        { "analog-input-video",         N_("Analog Video") },
+        { "analog-output",              N_("Analog Output") },
+        { "analog-output-headphones",   N_("Analog Headphones") },
+        { "analog-output-lfe-on-mono",  N_("Analog Output (LFE)") },
+        { "analog-output-mono",         N_("Analog Mono Output") },
+        { "analog-output-headphones-2", N_("Analog Headphones 2") },
+        { "analog-output-speaker",      N_("Analog Speaker") }
     };
 
     pa_alsa_element *e;

commit 642c69bed85ce7c0be57bd08af0cf7243228f08b
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Nov 5 03:22:15 2009 +0100

    core-util: add call to detect if we are called from within a VM

diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 2b0a60a..93ddf30 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -2944,6 +2944,7 @@ int pa_pipe_cloexec(int pipefd[2]) {
 
     if (errno != EINVAL && errno != ENOSYS)
         return r;
+
 #endif
 
     if ((r = pipe(pipefd)) < 0)
@@ -2965,6 +2966,7 @@ int pa_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen) {
 
     if (errno != EINVAL && errno != ENOSYS)
         return fd;
+
 #endif
 
     if ((fd = accept(sockfd, addr, addrlen)) < 0)
@@ -3015,3 +3017,90 @@ void pa_nullify_stdfds(void) {
 #endif
 
 }
+
+char *pa_read_line_from_file(const char *fn) {
+    FILE *f;
+    char ln[256] = "", *r;
+
+    if (!(f = pa_fopen_cloexec(fn, "r")))
+        return NULL;
+
+    r = fgets(ln, sizeof(ln)-1, f);
+    fclose(f);
+
+    if (!r) {
+        errno = EIO;
+        return NULL;
+    }
+
+    pa_strip_nl(ln);
+    return pa_xstrdup(ln);
+}
+
+pa_bool_t pa_running_in_vm(void) {
+
+#if defined(__i386__) || defined(__x86_64__)
+
+    /* Both CPUID and DMI are x86 specific interfaces... */
+
+    uint32_t eax = 0x40000000;
+    union {
+        uint32_t sig32[3];
+        char text[13];
+    } sig;
+
+#ifdef __linux__
+    const char *const dmi_vendors[] = {
+        "/sys/class/dmi/id/sys_vendor",
+        "/sys/class/dmi/id/board_vendor",
+        "/sys/class/dmi/id/bios_vendor"
+    };
+
+    unsigned i;
+
+    for (i = 0; i < PA_ELEMENTSOF(dmi_vendors); i++) {
+        char *s;
+
+        if ((s = pa_read_line_from_file(dmi_vendors[i]))) {
+
+            if (pa_startswith(s, "QEMU") ||
+                /* http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1009458 */
+                pa_startswith(s, "VMware") ||
+                pa_startswith(s, "VMW") ||
+                pa_startswith(s, "Microsoft Corporation") ||
+                pa_startswith(s, "innotek GmbH") ||
+                pa_startswith(s, "Xen")) {
+
+                pa_xfree(s);
+                return TRUE;
+            }
+
+            pa_xfree(s);
+        }
+    }
+
+#endif
+
+    /* http://lwn.net/Articles/301888/ */
+    pa_zero(sig);
+
+    __asm__ __volatile__ (
+        "  xor %%ebx, %%ebx          \n\t"
+        "  cpuid                     \n\t"
+
+        : "=a" (eax), "=b" (sig.sig32[0]), "=c" (sig.sig32[1]), "=d" (sig.sig32[2])
+        : "0" (eax)
+    );
+
+    if (pa_streq(sig.text, "XenVMMXenVMM") ||
+        pa_streq(sig.text, "KVMKVMKVM") ||
+        /* http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1009458 */
+        pa_streq(sig.text, "VMwareVMware") ||
+        /* http://msdn.microsoft.com/en-us/library/bb969719.aspx */
+        pa_streq(sig.text, "Microsoft Hv"))
+        return TRUE;
+
+#endif
+
+    return FALSE;
+}
diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h
index 9c9cf78..31a83bc 100644
--- a/src/pulsecore/core-util.h
+++ b/src/pulsecore/core-util.h
@@ -267,4 +267,7 @@ FILE* pa_fopen_cloexec(const char *path, const char *mode);
 
 void pa_nullify_stdfds(void);
 
+char *pa_read_line_from_file(const char *fn);
+pa_bool_t pa_running_in_vm(void);
+
 #endif

commit c079ceeba00c77a93c613ecf4a3f2cb516db0753
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Nov 5 03:22:48 2009 +0100

    daemon: during startup say whether we run in a VM

diff --git a/src/daemon/main.c b/src/daemon/main.c
index cc6f24b..4891182 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -648,7 +648,6 @@ int main(int argc, char *argv[]) {
 
     if (conf->daemonize) {
         pid_t child;
-        int tty_fd;
 
         if (pa_stdio_acquire() < 0) {
             pa_log(_("Failed to acquire stdio."));
@@ -781,6 +780,8 @@ int main(int argc, char *argv[]) {
 
     pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
 
+    pa_log_debug(_("Running in VM: %s"), pa_yes_no(pa_running_in_vm()));
+
 #ifdef __OPTIMIZE__
     pa_log_debug(_("Optimized build: yes"));
 #else

commit 53b046d5c9593d848270e85017c2999a61256e0e
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Nov 5 03:23:08 2009 +0100

    alsa: disable timer-based scheduling inside a VM
    
    In virtual machines sound card clocks and OS scheduling tend to become
    unreliable, adding various 'uneven' latencies. The adaptive algorithm
    that handles drop-outs does not handle it this well: in contrast to
    drop-outs on real machines that are evenly distributed, small and can
    easily be encountered via the adpative algorithms, drop-outs in VMs tend
    to happen abruptly, and massively, which is not easy to counter.
    
    This patch simply disables timer based scheduling in VMs reverting to
    classic IO based scheduling. This should help make PA perform better in
    VMs.
    
    https://bugzilla.redhat.com/show_bug.cgi?id=532775

diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
index 37419d9..856adb1 100644
--- a/src/modules/alsa/alsa-sink.c
+++ b/src/modules/alsa/alsa-sink.c
@@ -1698,10 +1698,7 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
         goto fail;
     }
 
-    if (use_tsched && !pa_rtclock_hrtimer()) {
-        pa_log_notice("Disabling timer-based scheduling because high-resolution timers are not available from the kernel.");
-        use_tsched = FALSE;
-    }
+    use_tsched = pa_alsa_may_tsched(use_tsched);
 
     u = pa_xnew0(struct userdata, 1);
     u->core = m->core;
diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
index 37dd647..e775b20 100644
--- a/src/modules/alsa/alsa-source.c
+++ b/src/modules/alsa/alsa-source.c
@@ -1541,10 +1541,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
         goto fail;
     }
 
-    if (use_tsched && !pa_rtclock_hrtimer()) {
-        pa_log_notice("Disabling timer-based scheduling because high-resolution timers are not available from the kernel.");
-        use_tsched = FALSE;
-    }
+    use_tsched = pa_alsa_may_tsched(use_tsched);
 
     u = pa_xnew0(struct userdata, 1);
     u->core = m->core;
diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
index 0e22d17..b8d1357 100644
--- a/src/modules/alsa/alsa-util.c
+++ b/src/modules/alsa/alsa-util.c
@@ -43,6 +43,7 @@
 #include <pulsecore/once.h>
 #include <pulsecore/thread.h>
 #include <pulsecore/conf-parser.h>
+#include <pulsecore/core-rtclock.h>
 
 #include "alsa-util.h"
 #include "alsa-mixer.h"
@@ -1308,3 +1309,26 @@ const char* pa_alsa_strerror(int errnum) {
 
     return translated;
 }
+
+pa_bool_t pa_alsa_may_tsched(pa_bool_t want) {
+
+    if (!want)
+        return FALSE;
+
+    if (!pa_rtclock_hrtimer()) {
+        /* We cannot depend on being woken up in time when the timers
+        are inaccurate, so let's fallback to classic IO based playback
+        then. */
+        pa_log_notice("Disabling timer-based scheduling because high-resolution timers are not available from the kernel.");
+        return FALSE; }
+
+    if (pa_running_in_vm()) {
+        /* We cannot depend on being woken up when we ask for in a VM,
+         * so let's fallback to classic IO based playback then. */
+        pa_log_notice("Disabling timer-based scheduling because running inside a VM.");
+        return FALSE;
+    }
+
+
+    return TRUE;
+}
diff --git a/src/modules/alsa/alsa-util.h b/src/modules/alsa/alsa-util.h
index f6206fe..1d1256b 100644
--- a/src/modules/alsa/alsa-util.h
+++ b/src/modules/alsa/alsa-util.h
@@ -142,4 +142,6 @@ pa_bool_t pa_alsa_pcm_is_modem(snd_pcm_t *pcm);
 
 const char* pa_alsa_strerror(int errnum);
 
+pa_bool_t pa_alsa_may_tsched(pa_bool_t want);
+
 #endif

commit d2c59354d554f136739be7bbcd326f1d254f778e
Author: Vladimir Kokarev <matrix47 at gmail.com>
Date:   Sat Sep 19 19:43:24 2009 +0400

    volume: add pa_cvolume_inc_clamp function
    
    added function to increase volume not exceeding specified limit
    simply changed PA_VOLUME_MAX to 'limit' in pa_cvolume_inc
    pa_cvolume_inc now calls pa_cvolume_inc_clamp with PA_VOLUME_MAX limit

diff --git a/src/map-file b/src/map-file
index 5011122..1fffaff 100644
--- a/src/map-file
+++ b/src/map-file
@@ -130,6 +130,7 @@ pa_cvolume_get_balance;
 pa_cvolume_get_fade;
 pa_cvolume_get_position;
 pa_cvolume_inc;
+pa_cvolume_inc_clamp;
 pa_cvolume_init;
 pa_cvolume_max;
 pa_cvolume_max_mask;
diff --git a/src/pulse/volume.c b/src/pulse/volume.c
index 2d2bba2..59e9a18 100644
--- a/src/pulse/volume.c
+++ b/src/pulse/volume.c
@@ -885,7 +885,7 @@ pa_cvolume* pa_cvolume_merge(pa_cvolume *dest, const pa_cvolume *a, const pa_cvo
     return dest;
 }
 
-pa_cvolume* pa_cvolume_inc(pa_cvolume *v, pa_volume_t inc) {
+pa_cvolume* pa_cvolume_inc_clamp(pa_cvolume *v, pa_volume_t inc, pa_volume_t limit) {
     pa_volume_t m;
 
     pa_assert(v);
@@ -895,14 +895,18 @@ pa_cvolume* pa_cvolume_inc(pa_cvolume *v, pa_volume_t inc) {
 
     m = pa_cvolume_max(v);
 
-    if (m >= PA_VOLUME_MAX - inc)
-        m = PA_VOLUME_MAX;
+    if (m >= limit - inc)
+        m = limit;
     else
         m += inc;
 
     return pa_cvolume_scale(v, m);
 }
 
+pa_cvolume* pa_cvolume_inc(pa_cvolume *v, pa_volume_t inc){
+    return pa_cvolume_inc_clamp(v, inc, PA_VOLUME_MAX);
+}
+
 pa_cvolume* pa_cvolume_dec(pa_cvolume *v, pa_volume_t dec) {
     pa_volume_t m;
 
diff --git a/src/pulse/volume.h b/src/pulse/volume.h
index c964020..ded4422 100644
--- a/src/pulse/volume.h
+++ b/src/pulse/volume.h
@@ -348,6 +348,10 @@ pa_volume_t pa_cvolume_get_position(pa_cvolume *cv, const pa_channel_map *map, p
  * and dest may point to the same structure. \since 0.9.16 */
 pa_cvolume* pa_cvolume_merge(pa_cvolume *dest, const pa_cvolume *a, const pa_cvolume *b);
 
+/** Increase the volume passed in by 'inc', but not exceeding 'limit'.
+ * The proportions between the channels are kept. \since 0.9.19 */
+pa_cvolume* pa_cvolume_inc_clamp(pa_cvolume *v, pa_volume_t inc, pa_volume_t limit);
+
 /** Increase the volume passed in by 'inc'. The proportions between
  * the channels are kept. \since 0.9.16 */
 pa_cvolume* pa_cvolume_inc(pa_cvolume *v, pa_volume_t inc);

commit 7793da371bbf70e23c0b45de1e188f5dd58f3324
Author: Vladimir Kokarev <matrix47 at gmail.com>
Date:   Thu Nov 5 04:55:21 2009 +0100

    lirc,mmkvd: added module parameters volume_limit, volume_step
    
    volume_limit sets maximum volume that can be set from the module
    default is PA_VOLUME_NORM*3/2 (150%)
    volume_step sets step in volume changing
    default is PA_VOLUME_NORM/20
    values are of raw pa_volume_t type

diff --git a/src/modules/module-lirc.c b/src/modules/module-lirc.c
index d0e902f..e977862 100644
--- a/src/modules/module-lirc.c
+++ b/src/modules/module-lirc.c
@@ -45,12 +45,14 @@ PA_MODULE_AUTHOR("Lennart Poettering");
 PA_MODULE_DESCRIPTION("LIRC volume control");
 PA_MODULE_VERSION(PACKAGE_VERSION);
 PA_MODULE_LOAD_ONCE(TRUE);
-PA_MODULE_USAGE("config=<config file> sink=<sink name> appname=<lirc application name>");
+PA_MODULE_USAGE("config=<config file> sink=<sink name> appname=<lirc application name> volume_limit=<volume limit> volume_step=<volume change step>");
 
 static const char* const valid_modargs[] = {
     "config",
     "sink",
     "appname",
+    "volume_limit",
+    "volume_step",
     NULL,
 };
 
@@ -61,10 +63,10 @@ struct userdata {
     char *sink_name;
     pa_module *module;
     float mute_toggle_save;
+    pa_volume_t volume_limit;
+    pa_volume_t volume_step;
 };
 
-#define DELTA (PA_VOLUME_NORM/20)
-
 static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event_flags_t events, void*userdata) {
     struct userdata *u = userdata;
     char *name = NULL, *code = NULL;
@@ -125,12 +127,12 @@ static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event
 
                     switch (volchange) {
                         case UP:
-                            pa_cvolume_inc(&cv, DELTA);
+                            pa_cvolume_inc_clamp(&cv, u->volume_step, u->volume_limit);
                             pa_sink_set_volume(s, &cv, TRUE, TRUE);
                             break;
 
                         case DOWN:
-                            pa_cvolume_dec(&cv, DELTA);
+                            pa_cvolume_dec(&cv, u->volume_step);
                             pa_sink_set_volume(s, &cv, TRUE, TRUE);
                             break;
 
@@ -170,6 +172,8 @@ fail:
 int pa__init(pa_module*m) {
     pa_modargs *ma = NULL;
     struct userdata *u;
+    pa_volume_t volume_limit = PA_VOLUME_NORM*3/2;
+    pa_volume_t volume_step = PA_VOLUME_NORM/20;
 
     pa_assert(m);
 
@@ -178,6 +182,16 @@ int pa__init(pa_module*m) {
         goto fail;
     }
 
+    if (pa_modargs_get_value_u32(ma, "volume_limit", &volume_limit) < 0) {
+        pa_log("Failed to parse volume limit");
+        goto fail;
+    }
+
+    if (pa_modargs_get_value_u32(ma, "volume_step", &volume_step) < 0) {
+        pa_log("Failed to parse volume step");
+        goto fail;
+    }
+
     m->userdata = u = pa_xnew(struct userdata, 1);
     u->module = m;
     u->io = NULL;
@@ -185,6 +199,8 @@ int pa__init(pa_module*m) {
     u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL));
     u->lirc_fd = -1;
     u->mute_toggle_save = 0;
+    u->volume_limit = volume_limit;
+    u->volume_step = volume_step;
 
     if ((u->lirc_fd = lirc_init((char*) pa_modargs_get_value(ma, "appname", "pulseaudio"), 1)) < 0) {
         pa_log("lirc_init() failed.");
diff --git a/src/modules/module-mmkbd-evdev.c b/src/modules/module-mmkbd-evdev.c
index 14a9dd3..193c1f4 100644
--- a/src/modules/module-mmkbd-evdev.c
+++ b/src/modules/module-mmkbd-evdev.c
@@ -48,13 +48,15 @@ PA_MODULE_AUTHOR("Lennart Poettering");
 PA_MODULE_DESCRIPTION("Multimedia keyboard support via Linux evdev");
 PA_MODULE_VERSION(PACKAGE_VERSION);
 PA_MODULE_LOAD_ONCE(FALSE);
-PA_MODULE_USAGE("device=<evdev device> sink=<sink name>");
+PA_MODULE_USAGE("device=<evdev device> sink=<sink name> volume_limit=<volume limit> volume_step=<volume change step>");
 
 #define DEFAULT_DEVICE "/dev/input/event0"
 
 static const char* const valid_modargs[] = {
     "device",
     "sink",
+    "volume_limit",
+    "volume_step",
     NULL,
 };
 
@@ -63,10 +65,10 @@ struct userdata {
     pa_io_event *io;
     char *sink_name;
     pa_module *module;
+    pa_volume_t volume_limit;
+    pa_volume_t volume_step;
 };
 
-#define DELTA (PA_VOLUME_NORM/20)
-
 static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event_flags_t events, void*userdata) {
     struct userdata *u = userdata;
 
@@ -120,12 +122,12 @@ static void io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event
 
                     switch (volchange) {
                         case UP:
-                            pa_cvolume_inc(&cv, DELTA);
+                            pa_cvolume_inc_clamp(&cv, u->volume_step, u->volume_limit);
                             pa_sink_set_volume(s, &cv, TRUE, TRUE);
                             break;
 
                         case DOWN:
-                            pa_cvolume_dec(&cv, DELTA);
+                            pa_cvolume_dec(&cv, u->volume_step);
                             pa_sink_set_volume(s, &cv, TRUE, TRUE);
                             break;
 
@@ -160,6 +162,8 @@ int pa__init(pa_module*m) {
     struct input_id input_id;
     char name[256];
     uint8_t evtype_bitmask[EV_MAX/8 + 1];
+    pa_volume_t volume_limit = PA_VOLUME_NORM*3/2;
+    pa_volume_t volume_step = PA_VOLUME_NORM/20;
 
     pa_assert(m);
 
@@ -168,12 +172,24 @@ int pa__init(pa_module*m) {
         goto fail;
     }
 
+    if (pa_modargs_get_value_u32(ma, "volume_limit", &volume_limit) < 0) {
+        pa_log("Failed to parse volume limit");
+        goto fail;
+    }
+
+    if (pa_modargs_get_value_u32(ma, "volume_step", &volume_step) < 0) {
+        pa_log("Failed to parse volume step");
+        goto fail;
+    }
+
     m->userdata = u = pa_xnew(struct userdata, 1);
     u->module = m;
     u->io = NULL;
     u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL));
     u->fd = -1;
     u->fd_type = 0;
+    u->volume_limit = volume_limit;
+    u->volume_step = volume_step;
 
     if ((u->fd = pa_open_cloexec(pa_modargs_get_value(ma, "device", DEFAULT_DEVICE), O_RDONLY, 0)) < 0) {
         pa_log("Failed to open evdev device: %s", pa_cstrerror(errno));

commit 38a03c1e4f14ad6edfd0b7d95c8d7440c3a950e2
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Nov 5 05:08:50 2009 +0100

    man: fix build with --disable-manpages
    
    http://pulseaudio.org/ticket/698

diff --git a/man/Makefile.am b/man/Makefile.am
index 9b229f5..7793fe7 100644
--- a/man/Makefile.am
+++ b/man/Makefile.am
@@ -20,21 +20,6 @@ pulseconfdir=$(sysconfdir)/pulse
 CLEANFILES = \
 	$(noinst_DATA)
 
-dist_man_MANS = \
-	pulseaudio.1 \
-	esdcompat.1 \
-	pax11publish.1 \
-	paplay.1 \
-	pacat.1 \
-	pacmd.1 \
-	pactl.1 \
-	pasuspender.1 \
-	padsp.1 \
-	pabrowse.1 \
-	pulse-daemon.conf.5 \
-	pulse-client.conf.5 \
-	default.pa.5
-
 noinst_DATA = \
 	pulseaudio.1.xml \
 	esdcompat.1.xml \
@@ -50,24 +35,39 @@ noinst_DATA = \
 	pulse-client.conf.5.xml \
 	default.pa.5.xml
 
-if BUILD_MANPAGES
-
-CLEANFILES += \
-	$(dist_man_MANS)
-
 %.xml: %.xml.in Makefile
 	sed -e 's, at pulseconfdir\@,$(pulseconfdir),g' \
 	    -e 's, at PACKAGE_BUGREPORT\@,$(PACKAGE_BUGREPORT),g' \
             -e 's, at PACKAGE_URL\@,$(PACKAGE_URL),g' $< > $@
 
-%: %.xml Makefile
-	perl $(srcdir)/xmltoman $< > $@ || rm -f $@
-
 xmllint: $(noinst_DATA)
 	for f in $(noinst_DATA) ; do \
 			xmllint --noout --valid "$$f" || exit 1 ; \
 	done
 
+if BUILD_MANPAGES
+
+dist_man_MANS = \
+	pulseaudio.1 \
+	esdcompat.1 \
+	pax11publish.1 \
+	paplay.1 \
+	pacat.1 \
+	pacmd.1 \
+	pactl.1 \
+	pasuspender.1 \
+	padsp.1 \
+	pabrowse.1 \
+	pulse-daemon.conf.5 \
+	pulse-client.conf.5 \
+	default.pa.5
+
+CLEANFILES += \
+	$(dist_man_MANS)
+
+%: %.xml Makefile
+	perl $(srcdir)/xmltoman $< > $@ || rm -f $@
+
 endif
 
 EXTRA_DIST = \

commit 721e32b473ca821d5551a3d93ac04f84c5988c8f
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Nov 5 05:18:10 2009 +0100

    jack: never try to autoconnect to MIDI ports
    
    Original patch supplied by 'adi'
    
    http://pulseaudio.org/ticket/669

diff --git a/src/modules/jack/module-jack-sink.c b/src/modules/jack/module-jack-sink.c
index fc976fa..9f3e071 100644
--- a/src/modules/jack/module-jack-sink.c
+++ b/src/modules/jack/module-jack-sink.c
@@ -334,7 +334,7 @@ int pa__init(pa_module*m) {
         goto fail;
     }
 
-    ports = jack_get_ports(u->client, NULL, NULL, JackPortIsPhysical|JackPortIsInput);
+    ports = jack_get_ports(u->client, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortIsPhysical|JackPortIsInput);
 
     channels = 0;
     for (p = ports; *p; p++)
diff --git a/src/modules/jack/module-jack-source.c b/src/modules/jack/module-jack-source.c
index a898e0e..6c68527 100644
--- a/src/modules/jack/module-jack-source.c
+++ b/src/modules/jack/module-jack-source.c
@@ -286,7 +286,7 @@ int pa__init(pa_module*m) {
         goto fail;
     }
 
-    ports = jack_get_ports(u->client, NULL, NULL, JackPortIsPhysical|JackPortIsOutput);
+    ports = jack_get_ports(u->client, NULL, JACK_DEFAULT_AUDIO_TYPE, JackPortIsPhysical|JackPortIsOutput);
 
     channels = 0;
     for (p = ports; *p; p++)

commit 4d62f159a74c6e5b46be5823483a7dedd5691b45
Merge: 721e32b 897ef86
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Nov 5 22:54:42 2009 +0100

    Merge remote branch 'origin/merge-queue'
    
    Conflicts:
    	src/pulsecore/sink-input.c
    	src/pulsecore/sink.c

diff --cc src/pulsecore/sink-input.c
index 1af2823,2acaa08..216edd4
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@@ -44,10 -45,14 +45,15 @@@
  #define MEMBLOCKQ_MAXLENGTH (32*1024*1024)
  #define CONVERT_BUFFER_LENGTH (PA_PAGE_SIZE)
  
 -static PA_DEFINE_CHECK_TYPE(pa_sink_input, pa_msgobject);
 +PA_DEFINE_PUBLIC_CLASS(pa_sink_input, pa_msgobject);
  
  static void sink_input_free(pa_object *o);
 +static void set_real_ratio(pa_sink_input *i, const pa_cvolume *v);
+ static void sink_input_set_ramping_info(pa_sink_input* i, pa_volume_t  pre_virtual_volume, pa_volume_t target_virtual_volume, pa_usec_t t);
+ static void sink_input_set_ramping_info_for_mute(pa_sink_input* i, pa_bool_t mute, pa_usec_t t);
+ static void sink_input_volume_ramping(pa_sink_input* i, pa_memchunk* chunk);
+ static void sink_input_rewind_ramp_info(pa_sink_input *i, size_t nbytes);
+ static void sink_input_release_envelope(pa_sink_input *i);
  
  pa_sink_input_new_data* pa_sink_input_new_data_init(pa_sink_input_new_data *data) {
      pa_assert(data);
@@@ -505,11 -494,14 +521,17 @@@ static void sink_input_free(pa_object *
  
      pa_log_info("Freeing input %u \"%s\"", i->index, pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_MEDIA_NAME)));
  
 -    pa_assert(!i->thread_info.attached);
 +    /* Side note: this function must be able to destruct properly any
 +     * kind of sink input in any state, even those which are
 +     * "half-moved" or are connected to sinks that have no asyncmsgq
 +     * and are hence half-destructed themselves! */
  
+     if (i->thread_info.ramp_info.envelope) {
+         pa_log_debug ("Freeing envelope\n");
+         pa_envelope_free(i->thread_info.ramp_info.envelope);
+         i->thread_info.ramp_info.envelope = NULL;
+     }
+ 
      if (i->thread_info.render_memblockq)
          pa_memblockq_free(i->thread_info.render_memblockq);
  
@@@ -595,8 -585,9 +617,9 @@@ pa_usec_t pa_sink_input_get_latency(pa_
  
  /* Called from thread context */
  void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink frames */, pa_memchunk *chunk, pa_cvolume *volume) {
 -    pa_bool_t do_volume_adj_here;
 +    pa_bool_t do_volume_adj_here, need_volume_factor_sink;
      pa_bool_t volume_is_norm;
+     pa_bool_t ramping;
      size_t block_size_max_sink, block_size_max_sink_input;
      size_t ilength;
  
@@@ -641,9 -631,8 +664,9 @@@
       * to adjust the volume *before* we resample. Otherwise we can do
       * it after and leave it for the sink code */
  
-     do_volume_adj_here = !pa_channel_map_equal(&i->channel_map, &i->sink->channel_map);
+     do_volume_adj_here = !pa_channel_map_equal(&i->channel_map, &i->sink->channel_map) || i->thread_info.ramp_info.is_ramping;
      volume_is_norm = pa_cvolume_is_norm(&i->thread_info.soft_volume) && !i->thread_info.muted;
 +    need_volume_factor_sink = !pa_cvolume_is_norm(&i->volume_factor_sink);
  
      while (!pa_memblockq_is_readable(i->thread_info.render_memblockq)) {
          pa_memchunk tchunk;
@@@ -684,24 -672,12 +707,24 @@@
                  wchunk.length = block_size_max_sink_input;
  
              /* It might be necessary to adjust the volume here */
-             if (do_volume_adj_here && !volume_is_norm) {
+             if (do_volume_adj_here && !volume_is_norm && !i->thread_info.ramp_info.is_ramping) {
                  pa_memchunk_make_writable(&wchunk, 0);
  
 -                if (i->thread_info.muted)
 +                if (i->thread_info.muted) {
                      pa_silence_memchunk(&wchunk, &i->thread_info.sample_spec);
 -                else
 +                    nvfs = FALSE;
 +
 +                } else if (!i->thread_info.resampler && nvfs) {
 +                    pa_cvolume v;
 +
 +                    /* If we don't need a resampler we can merge the
 +                     * post and the pre volume adjustment into one */
 +
 +                    pa_sw_cvolume_multiply(&v, &i->thread_info.soft_volume, &i->volume_factor_sink);
 +                    pa_volume_memchunk(&wchunk, &i->thread_info.sample_spec, &v);
 +                    nvfs = FALSE;
 +
 +                } else
                      pa_volume_memchunk(&wchunk, &i->thread_info.sample_spec, &i->thread_info.soft_volume);
              }
  
@@@ -977,60 -934,22 +1018,9 @@@ static void set_real_ratio(pa_sink_inpu
  }
  
  /* Called from main context */
 -pa_cvolume *pa_sink_input_get_relative_volume(pa_sink_input *i, pa_cvolume *v) {
 -    unsigned c;
 -
 -    pa_sink_input_assert_ref(i);
 -    pa_assert(v);
 -    pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
 -
 -    /* This always returns the relative volume. Converts the float
 -     * version into a pa_cvolume */
 -
 -    v->channels = i->sample_spec.channels;
 -
 -    for (c = 0; c < v->channels; c++)
 -        v->values[c] = pa_sw_volume_from_linear(i->relative_volume[c]);
 -
 -    return v;
 +void pa_sink_input_set_volume(pa_sink_input *i, const pa_cvolume *volume, pa_bool_t save, pa_bool_t absolute) {
-     pa_cvolume v;
- 
-     pa_sink_input_assert_ref(i);
-     pa_assert_ctl_context();
-     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
-     pa_assert(volume);
-     pa_assert(pa_cvolume_valid(volume));
-     pa_assert(volume->channels == 1 || pa_cvolume_compatible(volume, &i->sample_spec));
- 
-     if ((i->sink->flags & PA_SINK_FLAT_VOLUME) && !absolute) {
-         v = i->sink->reference_volume;
-         pa_cvolume_remap(&v, &i->sink->channel_map, &i->channel_map);
- 
-         if (pa_cvolume_compatible(volume, &i->sample_spec))
-             volume = pa_sw_cvolume_multiply(&v, &v, volume);
-         else
-             volume = pa_sw_cvolume_multiply_scalar(&v, &v, pa_cvolume_max(volume));
-     } else {
- 
-         if (!pa_cvolume_compatible(volume, &i->sample_spec)) {
-             v = i->volume;
-             volume = pa_cvolume_scale(&v, pa_cvolume_max(volume));
-         }
-     }
- 
-     if (pa_cvolume_equal(volume, &i->volume)) {
-         i->save_volume = i->save_volume || save;
-         return;
-     }
- 
-     i->volume = *volume;
-     i->save_volume = save;
- 
-     if (i->sink->flags & PA_SINK_FLAT_VOLUME)
-         /* We are in flat volume mode, so let's update all sink input
-          * volumes and update the flat volume of the sink */
- 
-         pa_sink_set_volume(i->sink, NULL, TRUE, save);
- 
-     else {
-         /* OK, we are in normal volume mode. The volume only affects
-          * ourselves */
-         set_real_ratio(i, volume);
- 
-         /* Copy the new soft_volume to the thread_info struct */
-         pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME, NULL, 0, NULL) == 0);
-     }
- 
-     /* The volume changed, let's tell people so */
-     if (i->volume_changed)
-         i->volume_changed(i);
- 
-     pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
++    /* test ramping -> return pa_sink_input_set_volume_with_ramping(i, volume, save, absolute, 2000 * PA_USEC_PER_MSEC); */
++    return pa_sink_input_set_volume_with_ramping(i, volume, save, absolute, 0);
  }
  
  /* Called from main context */
@@@ -1659,3 -1567,217 +1662,227 @@@ finish
      if (pl)
          pa_proplist_free(pl);
  }
+ 
+ /* Called from IO context */
+ static void sink_input_volume_ramping(pa_sink_input* i, pa_memchunk* chunk) {
+     pa_assert(i);
+     pa_assert(chunk);
+     pa_assert(chunk->memblock);
+     pa_assert(i->thread_info.ramp_info.is_ramping);
+ 
+     /* Volume is adjusted with ramping effect here */
+     pa_envelope_apply(i->thread_info.ramp_info.envelope, chunk);
+ 
+     if (pa_envelope_is_finished(i->thread_info.ramp_info.envelope)) {
+         i->thread_info.ramp_info.is_ramping = FALSE;
+         if (pa_atomic_load(&i->before_ramping_v)) {
+             i->thread_info.soft_volume = i->thread_info.future_soft_volume;
+             pa_atomic_store(&i->before_ramping_v, 0);
+         }
+         else if (pa_atomic_load(&i->before_ramping_m)) {
+             i->thread_info.muted = i->thread_info.future_muted;
+             pa_atomic_store(&i->before_ramping_m, 0);
+         }
+     }
+ }
+ 
+ /*
+  * Called from main context
+  * This function should be called inside pa_sink_input_set_volume_with_ramping
+  * should be called after soft_volume of sink_input and sink are all adjusted
+  */
+ static void sink_input_set_ramping_info(pa_sink_input* i, pa_volume_t  pre_virtual_volume, pa_volume_t target_virtual_volume, pa_usec_t t) {
+ 
+     int32_t target_abs_vol, target_apply_vol, pre_apply_vol;
+     pa_assert(i);
+ 
+     pa_log_debug("Sink input's soft volume is %d= %f ", pa_cvolume_avg(&i->soft_volume), pa_sw_volume_to_linear(pa_cvolume_avg(&i->soft_volume)));
+ 
+     /* Calculation formula are target_abs_vol := i->soft_volume
+      *                                   target_apply_vol := lrint(pa_sw_volume_to_linear(target_abs_vol) * 0x10000)
+      *                                   pre_apply_vol := ( previous_virtual_volume / target_virtual_volume ) * target_apply_vol
+      *
+      * Will do volume adjustment inside pa_sink_input_peek
+      */
+     target_abs_vol = pa_cvolume_avg(&i->soft_volume);
+     target_apply_vol = (int32_t) lrint(pa_sw_volume_to_linear(target_abs_vol) * 0x10000);
+     pre_apply_vol = (int32_t) ((pa_sw_volume_to_linear(pre_virtual_volume) / pa_sw_volume_to_linear(target_virtual_volume)) * target_apply_vol);
+ 
+     i->using_def.n_points = 2;
+     i->using_def.points_x[0] = 0;
+     i->using_def.points_x[1] = t;
+     i->using_def.points_y.i[0] = pre_apply_vol;
+     i->using_def.points_y.i[1] = target_apply_vol;
+     i->using_def.points_y.f[0] = ((float) i->using_def.points_y.i[0]) /0x10000;
+     i->using_def.points_y.f[1] = ((float) i->using_def.points_y.i[1]) /0x10000;
+ 
+     pa_log_debug("Volume Ramping: Point 1 is %d=%f, Point 2 is %d=%f\n", i->using_def.points_y.i[0], i->using_def.points_y.f[0],
+                                    i->using_def.points_y.i[1], i->using_def.points_y.f[1]);
+ 
+     pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_ENVELOPE, NULL, 0, NULL) == 0);
+ }
+ 
+ /* Called from main context */
+ static void sink_input_set_ramping_info_for_mute(pa_sink_input* i, pa_bool_t mute, pa_usec_t t) {
+ 
+     int32_t cur_vol;
+     pa_assert(i);
+ 
+     i->using_def.n_points = 2;
+     i->using_def.points_x[0] = 0;
+     i->using_def.points_x[1] = t;
+     cur_vol = (int32_t) lrint( pa_sw_volume_to_linear(pa_cvolume_avg(&i->soft_volume)) * 0x10000);
+ 
+     if (mute) {
+         i->using_def.points_y.i[0] = cur_vol;
+         i->using_def.points_y.i[1] = 0;
+     } else {
+         i->using_def.points_y.i[0] = 0;
+         i->using_def.points_y.i[1] = cur_vol;
+     }
+ 
+     i->using_def.points_y.f[0] = ((float) i->using_def.points_y.i[0]) /0x10000;
+     i->using_def.points_y.f[1] = ((float) i->using_def.points_y.i[1]) /0x10000;
+ 
+     pa_log_debug("Mute Ramping: Point 1 is %d=%f, Point 2 is %d=%f\n", i->using_def.points_y.i[0], i->using_def.points_y.f[0],
+                    i->using_def.points_y.i[1], i->using_def.points_y.f[1]);
+ 
+     pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_ENVELOPE, NULL, 0, NULL) == 0);
+ }
+ 
+ /* Called from IO context */
+ static void sink_input_release_envelope(pa_sink_input *i) {
+     pa_assert(i);
+     pa_assert(!i->thread_info.ramp_info.is_ramping);
+     pa_assert(i->thread_info.ramp_info.envelope_dead);
+ 
+     pa_envelope_free(i->thread_info.ramp_info.envelope);
+     i->thread_info.ramp_info.envelope = NULL;
+     i->thread_info.ramp_info.item = NULL;
+ }
+ 
+ /* Called from IO context */
+ static void sink_input_rewind_ramp_info(pa_sink_input *i, size_t nbytes) {
+     pa_assert(i);
+ 
+     if (!i->thread_info.ramp_info.envelope_dead) {
+         pa_assert(i->thread_info.ramp_info.envelope);
+ 
+         int32_t envelope_length = pa_envelope_length(i->thread_info.ramp_info.envelope);
+ 
+         if (i->thread_info.ramp_info.envelope_dying > envelope_length) {
+             if ((i->thread_info.ramp_info.envelope_dying - nbytes) < envelope_length) {
+                 pa_log_debug("Envelope Become Alive");
+                 pa_envelope_rewind(i->thread_info.ramp_info.envelope, envelope_length - (i->thread_info.ramp_info.envelope_dying - nbytes));
+                 i->thread_info.ramp_info.is_ramping = TRUE;
+             }
+         } else if (i->thread_info.ramp_info.envelope_dying < envelope_length) {
+             if ((i->thread_info.ramp_info.envelope_dying - nbytes) <= 0) {
+                 pa_log_debug("Envelope Restart");
+                 pa_envelope_restart(i->thread_info.ramp_info.envelope);
+             }
+             else {
+                 pa_log_debug("Envelope Simple Rewind");
+                 pa_envelope_rewind(i->thread_info.ramp_info.envelope, nbytes);
+             }
+         }
+ 
+         i->thread_info.ramp_info.envelope_dying -= nbytes;
+         if (i->thread_info.ramp_info.envelope_dying <= 0)
+             i->thread_info.ramp_info.envelope_dying = 0;
+     }
+ }
+ 
+ void pa_sink_input_set_volume_with_ramping(pa_sink_input *i, const pa_cvolume *volume, pa_bool_t save, pa_bool_t absolute, pa_usec_t t){
+     pa_cvolume v;
+     pa_volume_t previous_virtual_volume, target_virtual_volume;
 -    pa_sink_input_assert_ref(i);
+ 
++    pa_sink_input_assert_ref(i);
++    pa_assert_ctl_context();
+     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
+     pa_assert(volume);
+     pa_assert(pa_cvolume_valid(volume));
 -    pa_assert(pa_cvolume_compatible(volume, &i->sample_spec));
++    pa_assert(volume->channels == 1 || pa_cvolume_compatible(volume, &i->sample_spec));
+ 
+     if ((i->sink->flags & PA_SINK_FLAT_VOLUME) && !absolute) {
+         v = i->sink->reference_volume;
+         pa_cvolume_remap(&v, &i->sink->channel_map, &i->channel_map);
 -        volume = pa_sw_cvolume_multiply(&v, &v, volume);
++
++        if (pa_cvolume_compatible(volume, &i->sample_spec))
++            volume = pa_sw_cvolume_multiply(&v, &v, volume);
++        else
++            volume = pa_sw_cvolume_multiply_scalar(&v, &v, pa_cvolume_max(volume));
++    } else {
++        if (!pa_cvolume_compatible(volume, &i->sample_spec)) {
++            v = i->volume;
++            volume = pa_cvolume_scale(&v, pa_cvolume_max(volume));
++        }
+     }
+ 
 -    if (pa_cvolume_equal(volume, &i->virtual_volume))
++    if (pa_cvolume_equal(volume, &i->volume)) {
++        i->save_volume = i->save_volume || save;
+         return;
++    }
+ 
 -    previous_virtual_volume = pa_cvolume_avg(&i->virtual_volume);
++    previous_virtual_volume = pa_cvolume_avg(&i->volume);
+     target_virtual_volume = pa_cvolume_avg(volume);
++
+     if (t > 0 && target_virtual_volume > 0)
+         pa_log_debug("SetVolumeWithRamping: Virtual Volume From %u=%f to %u=%f\n", previous_virtual_volume, pa_sw_volume_to_linear(previous_virtual_volume),
+                                              target_virtual_volume, pa_sw_volume_to_linear(target_virtual_volume));
+ 
 -    i->virtual_volume = *volume;
++    i->volume = *volume;
+     i->save_volume = save;
+ 
+     /* Set this flag before the following code modify i->thread_info.soft_volume */
+     if (t > 0 && target_virtual_volume > 0)
+         pa_atomic_store(&i->before_ramping_v, 1);
+ 
+     if (i->sink->flags & PA_SINK_FLAT_VOLUME) {
 -        pa_cvolume new_volume;
 -
+         /* We are in flat volume mode, so let's update all sink input
+          * volumes and update the flat volume of the sink */
+ 
 -        pa_sink_update_flat_volume(i->sink, &new_volume);
 -        pa_sink_set_volume(i->sink, &new_volume, FALSE, TRUE, FALSE, FALSE);
++        pa_sink_set_volume(i->sink, NULL, TRUE, save);
+ 
+     } else {
 -
+         /* OK, we are in normal volume mode. The volume only affects
+          * ourselves */
 -        pa_sink_input_set_relative_volume(i, volume);
 -
 -        /* Hooks have the ability to play games with i->soft_volume */
 -        pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_SET_VOLUME], i);
++        set_real_ratio(i, volume);
+ 
+         /* Copy the new soft_volume to the thread_info struct */
+         pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_VOLUME, NULL, 0, NULL) == 0);
+     }
+ 
+     if (t > 0 && target_virtual_volume > 0)
+         sink_input_set_ramping_info(i, previous_virtual_volume, target_virtual_volume, t);
+ 
++    /* The volume changed, let's tell people so */
++    if (i->volume_changed)
++        i->volume_changed(i);
++
+     /* The virtual volume changed, let's tell people so */
+     pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
+ }
+ 
+ void pa_sink_input_set_mute_with_ramping(pa_sink_input *i, pa_bool_t mute, pa_bool_t save, pa_usec_t t){
+ 
+     pa_assert(i);
+     pa_sink_input_assert_ref(i);
+     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
+ 
+     if (!i->muted == !mute)
+         return;
+ 
+     i->muted = mute;
+     i->save_muted = save;
+     /* Set this flag before the following code modify i->thread_info.muted, otherwise distortion will be heard */
+     if (t > 0)
+         pa_atomic_store(&i->before_ramping_m, 1);
+ 
+     pa_assert_se(pa_asyncmsgq_send(i->sink->asyncmsgq, PA_MSGOBJECT(i), PA_SINK_INPUT_MESSAGE_SET_SOFT_MUTE, NULL, 0, NULL) == 0);
+ 
+     if (t > 0)
+         sink_input_set_ramping_info_for_mute(i, mute, t);
+ 
+     pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
+ }
diff --cc src/pulsecore/sink-input.h
index 415a801,036806f..56ac3d6
--- a/src/pulsecore/sink-input.h
+++ b/src/pulsecore/sink-input.h
@@@ -381,7 -373,11 +398,11 @@@ pa_bool_t pa_sink_input_safe_to_remove(
  
  pa_memchunk* pa_sink_input_get_silence(pa_sink_input *i, pa_memchunk *ret);
  
 -/* To be used by sink.c only */
 -void pa_sink_input_set_relative_volume(pa_sink_input *i, const pa_cvolume *v);
 +#define pa_sink_input_assert_io_context(s) \
 +    pa_assert(pa_thread_mq_get() || !PA_SINK_INPUT_IS_LINKED((s)->state))
  
+ /* Volume ramping*/
+ void pa_sink_input_set_volume_with_ramping(pa_sink_input *i, const pa_cvolume *volume, pa_bool_t save, pa_bool_t absolute, pa_usec_t t);
+ void pa_sink_input_set_mute_with_ramping(pa_sink_input *i, pa_bool_t mute, pa_bool_t save, pa_usec_t t);
+ 
  #endif
diff --cc src/pulsecore/sink.c
index 971436d,2950071..24fad34
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@@ -1728,9 -1597,11 +1728,12 @@@ static void sync_input_volumes_within_t
      void *state = NULL;
  
      pa_sink_assert_ref(s);
 +    pa_sink_assert_io_context(s);
  
 -    while ((i = PA_SINK_INPUT(pa_hashmap_iterate(s->thread_info.inputs, &state, NULL)))) {
 +    PA_HASHMAP_FOREACH(i, s->thread_info.inputs, state) {
+         if (pa_atomic_load(&i->before_ramping_v))
+             i->thread_info.future_soft_volume = i->soft_volume;
+ 
          if (pa_cvolume_equal(&i->thread_info.soft_volume, &i->soft_volume))
              continue;
  

commit f202af17b717f5b383ac072f80a6c1327bc3143b
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Nov 5 22:55:14 2009 +0100

    ramping: minor cleanups

diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index 216edd4..177d330 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -1813,6 +1813,7 @@ void pa_sink_input_set_volume_with_ramping(pa_sink_input *i, const pa_cvolume *v
         else
             volume = pa_sw_cvolume_multiply_scalar(&v, &v, pa_cvolume_max(volume));
     } else {
+
         if (!pa_cvolume_compatible(volume, &i->sample_spec)) {
             v = i->volume;
             volume = pa_cvolume_scale(&v, pa_cvolume_max(volume));
@@ -1866,15 +1867,18 @@ void pa_sink_input_set_volume_with_ramping(pa_sink_input *i, const pa_cvolume *v
 
 void pa_sink_input_set_mute_with_ramping(pa_sink_input *i, pa_bool_t mute, pa_bool_t save, pa_usec_t t){
 
-    pa_assert(i);
     pa_sink_input_assert_ref(i);
+    pa_assert_ctl_context();
     pa_assert(PA_SINK_INPUT_IS_LINKED(i->state));
 
-    if (!i->muted == !mute)
+    if (!i->muted == !mute) {
+        i->save_muted = i->save_muted || mute;
         return;
+    }
 
     i->muted = mute;
     i->save_muted = save;
+
     /* Set this flag before the following code modify i->thread_info.muted, otherwise distortion will be heard */
     if (t > 0)
         pa_atomic_store(&i->before_ramping_m, 1);
@@ -1884,5 +1888,9 @@ void pa_sink_input_set_mute_with_ramping(pa_sink_input *i, pa_bool_t mute, pa_bo
     if (t > 0)
         sink_input_set_ramping_info_for_mute(i, mute, t);
 
+    /* The mute status changed, let's tell people so */
+    if (i->mute_changed)
+        i->mute_changed(i);
+
     pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
 }

commit 9e45f198d00591714f100431c5e7832b46ff4abd
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Mon Nov 9 21:56:33 2009 +0000

    device-manager: Update docs version -> 0.9.20

diff --git a/src/pulse/ext-device-manager.h b/src/pulse/ext-device-manager.h
index 1442a1a..8264b8f 100644
--- a/src/pulse/ext-device-manager.h
+++ b/src/pulse/ext-device-manager.h
@@ -39,7 +39,7 @@ typedef struct pa_ext_device_manager_role_priority_info {
 } pa_ext_device_manager_role_priority_info;
 
 /** Stores information about one device in the device database that is
- * maintained by module-device-manager. \since 0.9.19 */
+ * maintained by module-device-manager. \since 0.9.20 */
 typedef struct pa_ext_device_manager_info {
     const char *name;            /**< Identifier string of the device. A string like "sink:" or similar followed by the name of the device. */
     const char *description;     /**< The description of the device when it was last seen, if applicable and saved */
@@ -49,32 +49,32 @@ typedef struct pa_ext_device_manager_info {
     pa_ext_device_manager_role_priority_info *role_priorities; /**< An array of role priority structures or NULL */
 } pa_ext_device_manager_info;
 
-/** Callback prototype for pa_ext_device_manager_test(). \since 0.9.19 */
+/** Callback prototype for pa_ext_device_manager_test(). \since 0.9.20 */
 typedef void (*pa_ext_device_manager_test_cb_t)(
         pa_context *c,
         uint32_t version,
         void *userdata);
 
-/** Test if this extension module is available in the server. \since 0.9.19 */
+/** Test if this extension module is available in the server. \since 0.9.20 */
 pa_operation *pa_ext_device_manager_test(
         pa_context *c,
         pa_ext_device_manager_test_cb_t cb,
         void *userdata);
 
-/** Callback prototype for pa_ext_device_manager_read(). \since 0.9.19 */
+/** Callback prototype for pa_ext_device_manager_read(). \since 0.9.20 */
 typedef void (*pa_ext_device_manager_read_cb_t)(
         pa_context *c,
         const pa_ext_device_manager_info *info,
         int eol,
         void *userdata);
 
-/** Read all entries from the device database. \since 0.9.19 */
+/** Read all entries from the device database. \since 0.9.20 */
 pa_operation *pa_ext_device_manager_read(
         pa_context *c,
         pa_ext_device_manager_read_cb_t cb,
         void *userdata);
 
-/** Sets the description for a device. \since 0.9.19 */
+/** Sets the description for a device. \since 0.9.20 */
 pa_operation *pa_ext_device_manager_set_device_description(
         pa_context *c,
         const char* device,
@@ -82,21 +82,21 @@ pa_operation *pa_ext_device_manager_set_device_description(
         pa_context_success_cb_t cb,
         void *userdata);
 
-/** Delete entries from the device database. \since 0.9.19 */
+/** Delete entries from the device database. \since 0.9.20 */
 pa_operation *pa_ext_device_manager_delete(
         pa_context *c,
         const char *const s[],
         pa_context_success_cb_t cb,
         void *userdata);
 
-/** Enable the role-based device-priority routing mode. \since 0.9.19 */
+/** Enable the role-based device-priority routing mode. \since 0.9.20 */
 pa_operation *pa_ext_device_manager_enable_role_device_priority_routing(
         pa_context *c,
         int enable,
         pa_context_success_cb_t cb,
         void *userdata);
 
-/** Prefer a given device in the priority list. \since 0.9.19 */
+/** Prefer a given device in the priority list. \since 0.9.20 */
 pa_operation *pa_ext_device_manager_reorder_devices_for_role(
         pa_context *c,
         const char* role,
@@ -104,20 +104,20 @@ pa_operation *pa_ext_device_manager_reorder_devices_for_role(
         pa_context_success_cb_t cb,
         void *userdata);
 
-/** Subscribe to changes in the device database. \since 0.9.19 */
+/** Subscribe to changes in the device database. \since 0.9.20 */
 pa_operation *pa_ext_device_manager_subscribe(
         pa_context *c,
         int enable,
         pa_context_success_cb_t cb,
         void *userdata);
 
-/** Callback prototype for pa_ext_device_manager_set_subscribe_cb(). \since 0.9.19 */
+/** Callback prototype for pa_ext_device_manager_set_subscribe_cb(). \since 0.9.20 */
 typedef void (*pa_ext_device_manager_subscribe_cb_t)(
         pa_context *c,
         void *userdata);
 
 /** Set the subscription callback that is called when
- * pa_ext_device_manager_subscribe() was called. \since 0.9.19 */
+ * pa_ext_device_manager_subscribe() was called. \since 0.9.20 */
 void pa_ext_device_manager_set_subscribe_cb(
         pa_context *c,
         pa_ext_device_manager_subscribe_cb_t cb,

commit f3866f263539578517ef36a670e04ca48fa2d1d3
Author: Wim Taymans <wim.taymans at collabora.co.uk>
Date:   Tue Nov 10 13:21:55 2009 +0100

    protocol: use the right sample rate for sources
    
    Use the correct sample rate for reporting about the timing.

diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index bb29a19..d49a78e 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -2631,7 +2631,7 @@ static void command_get_record_latency(pa_pdispatch *pd, uint32_t command, uint3
     pa_tagstruct_put_usec(reply, s->current_monitor_latency);
     pa_tagstruct_put_usec(reply,
                           s->current_source_latency +
-                          pa_bytes_to_usec(s->on_the_fly_snapshot, &s->source_output->sample_spec));
+                          pa_bytes_to_usec(s->on_the_fly_snapshot, &s->source_output->source->sample_spec));
     pa_tagstruct_put_boolean(reply,
                              pa_source_get_state(s->source_output->source) == PA_SOURCE_RUNNING &&
                              pa_source_output_get_state(s->source_output) == PA_SOURCE_OUTPUT_RUNNING);

commit d9b5bbca017a8e578434e62ab6daeec24f2c11e1
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Nov 11 04:18:10 2009 +0100

    core: adjust volume only when there is actually a memory block
    
    Fixes an assert that is hit in somne niche cases:
    
    https://bugzilla.redhat.com/show_bug.cgi?id=533482

diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index 1af2823..aa84ccb 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -717,14 +717,15 @@ void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink frames */, p
                 pa_memchunk rchunk;
                 pa_resampler_run(i->thread_info.resampler, &wchunk, &rchunk);
 
-                if (nvfs) {
-                    pa_memchunk_make_writable(&rchunk, 0);
-                    pa_volume_memchunk(&rchunk, &i->sink->sample_spec, &i->volume_factor_sink);
-                }
-
 /*                 pa_log_debug("pushing %lu", (unsigned long) rchunk.length); */
 
                 if (rchunk.memblock) {
+
+                    if (nvfs) {
+                        pa_memchunk_make_writable(&rchunk, 0);
+                        pa_volume_memchunk(&rchunk, &i->sink->sample_spec, &i->volume_factor_sink);
+                    }
+
                     pa_memblockq_push_align(i->thread_info.render_memblockq, &rchunk);
                     pa_memblock_unref(rchunk.memblock);
                 }

commit 22946427624afde1d53973fa5a2e9e2041ffc5b7
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Nov 11 04:50:32 2009 +0100

    core: make cpuid code compile cleanly with 32bit PIC

diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 93ddf30..d596c48 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -117,6 +117,7 @@
 #include <pulsecore/strbuf.h>
 #include <pulsecore/usergroup.h>
 #include <pulsecore/strlist.h>
+#include <pulsecore/cpu-x86.h>
 
 #include "core-util.h"
 
@@ -3085,10 +3086,13 @@ pa_bool_t pa_running_in_vm(void) {
     pa_zero(sig);
 
     __asm__ __volatile__ (
-        "  xor %%ebx, %%ebx          \n\t"
+        /* ebx/rbx is being used for PIC! */
+        "  push %%"PA_REG_b"         \n\t"
         "  cpuid                     \n\t"
+        "  mov %%ebx, %1             \n\t"
+        "  pop %%"PA_REG_b"          \n\t"
 
-        : "=a" (eax), "=b" (sig.sig32[0]), "=c" (sig.sig32[1]), "=d" (sig.sig32[2])
+        : "=a" (eax), "=r" (sig.sig32[0]), "=c" (sig.sig32[1]), "=d" (sig.sig32[2])
         : "0" (eax)
     );
 

commit ed7642ebac32bde8d9c47f3a1d8eabf75c3ea986
Merge: 21ffcd5 2294642
Author: Daniel Mack <daniel at caiaq.de>
Date:   Wed Nov 11 10:48:39 2009 +0100

    Merge branch 'master' of git://0pointer.de/pulseaudio


commit dad36acea34f91cc1d4a7f8e4909369d2225525b
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Wed Nov 11 17:24:57 2009 +0000

    device-manager: Update docs version -> 0.9.20
    
    Third time is a charm... maybe.

diff --git a/src/pulse/ext-device-manager.h b/src/pulse/ext-device-manager.h
index 8264b8f..df0ab92 100644
--- a/src/pulse/ext-device-manager.h
+++ b/src/pulse/ext-device-manager.h
@@ -39,7 +39,7 @@ typedef struct pa_ext_device_manager_role_priority_info {
 } pa_ext_device_manager_role_priority_info;
 
 /** Stores information about one device in the device database that is
- * maintained by module-device-manager. \since 0.9.20 */
+ * maintained by module-device-manager. \since 0.9.21 */
 typedef struct pa_ext_device_manager_info {
     const char *name;            /**< Identifier string of the device. A string like "sink:" or similar followed by the name of the device. */
     const char *description;     /**< The description of the device when it was last seen, if applicable and saved */
@@ -49,32 +49,32 @@ typedef struct pa_ext_device_manager_info {
     pa_ext_device_manager_role_priority_info *role_priorities; /**< An array of role priority structures or NULL */
 } pa_ext_device_manager_info;
 
-/** Callback prototype for pa_ext_device_manager_test(). \since 0.9.20 */
+/** Callback prototype for pa_ext_device_manager_test(). \since 0.9.21 */
 typedef void (*pa_ext_device_manager_test_cb_t)(
         pa_context *c,
         uint32_t version,
         void *userdata);
 
-/** Test if this extension module is available in the server. \since 0.9.20 */
+/** Test if this extension module is available in the server. \since 0.9.21 */
 pa_operation *pa_ext_device_manager_test(
         pa_context *c,
         pa_ext_device_manager_test_cb_t cb,
         void *userdata);
 
-/** Callback prototype for pa_ext_device_manager_read(). \since 0.9.20 */
+/** Callback prototype for pa_ext_device_manager_read(). \since 0.9.21 */
 typedef void (*pa_ext_device_manager_read_cb_t)(
         pa_context *c,
         const pa_ext_device_manager_info *info,
         int eol,
         void *userdata);
 
-/** Read all entries from the device database. \since 0.9.20 */
+/** Read all entries from the device database. \since 0.9.21 */
 pa_operation *pa_ext_device_manager_read(
         pa_context *c,
         pa_ext_device_manager_read_cb_t cb,
         void *userdata);
 
-/** Sets the description for a device. \since 0.9.20 */
+/** Sets the description for a device. \since 0.9.21 */
 pa_operation *pa_ext_device_manager_set_device_description(
         pa_context *c,
         const char* device,
@@ -82,21 +82,21 @@ pa_operation *pa_ext_device_manager_set_device_description(
         pa_context_success_cb_t cb,
         void *userdata);
 
-/** Delete entries from the device database. \since 0.9.20 */
+/** Delete entries from the device database. \since 0.9.21 */
 pa_operation *pa_ext_device_manager_delete(
         pa_context *c,
         const char *const s[],
         pa_context_success_cb_t cb,
         void *userdata);
 
-/** Enable the role-based device-priority routing mode. \since 0.9.20 */
+/** Enable the role-based device-priority routing mode. \since 0.9.21 */
 pa_operation *pa_ext_device_manager_enable_role_device_priority_routing(
         pa_context *c,
         int enable,
         pa_context_success_cb_t cb,
         void *userdata);
 
-/** Prefer a given device in the priority list. \since 0.9.20 */
+/** Prefer a given device in the priority list. \since 0.9.21 */
 pa_operation *pa_ext_device_manager_reorder_devices_for_role(
         pa_context *c,
         const char* role,
@@ -104,20 +104,20 @@ pa_operation *pa_ext_device_manager_reorder_devices_for_role(
         pa_context_success_cb_t cb,
         void *userdata);
 
-/** Subscribe to changes in the device database. \since 0.9.20 */
+/** Subscribe to changes in the device database. \since 0.9.21 */
 pa_operation *pa_ext_device_manager_subscribe(
         pa_context *c,
         int enable,
         pa_context_success_cb_t cb,
         void *userdata);
 
-/** Callback prototype for pa_ext_device_manager_set_subscribe_cb(). \since 0.9.20 */
+/** Callback prototype for pa_ext_device_manager_set_subscribe_cb(). \since 0.9.21 */
 typedef void (*pa_ext_device_manager_subscribe_cb_t)(
         pa_context *c,
         void *userdata);
 
 /** Set the subscription callback that is called when
- * pa_ext_device_manager_subscribe() was called. \since 0.9.20 */
+ * pa_ext_device_manager_subscribe() was called. \since 0.9.21 */
 void pa_ext_device_manager_set_subscribe_cb(
         pa_context *c,
         pa_ext_device_manager_subscribe_cb_t cb,

commit 14eaf245c63de8b4ec0f0b6845284e52d5f8bcd4
Author: Sjoerd Simons <sjoerd.simons at collabora.co.uk>
Date:   Sat Nov 14 22:23:10 2009 +0000

    build-sys: Make sure all alsa path config files are installed
    
    While all alsa path configuration files were in EXTRA_DIST not all of them were
    in in alsapaths_DATA. Fixed by only defining the list in one place

diff --git a/src/Makefile.am b/src/Makefile.am
index f0d5a5e..9860bbe 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -109,27 +109,12 @@ MODULE_LDFLAGS = -module -disable-static -avoid-version $(LDFLAGS_NOUNDEFINED)
 #          Extra files            #
 ###################################
 
-EXTRA_DIST = \
-		pulse/client.conf.in \
-		pulse/version.h.in \
-		daemon/daemon.conf.in \
-		daemon/default.pa.in \
-		daemon/system.pa.in \
-		daemon/default.pa.win32 \
-		depmod.py \
-		daemon/esdcompat.in \
-		daemon/start-pulseaudio-x11.in \
-		daemon/start-pulseaudio-kde.in \
-		utils/padsp \
-		modules/module-defs.h.m4 \
-		daemon/pulseaudio.desktop.in \
-		daemon/pulseaudio-kde.desktop.in \
-		map-file \
-		daemon/pulseaudio-system.conf \
+ALSA_PROFILES = \
 		modules/alsa/mixer/profile-sets/default.conf \
 		modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf \
-		modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf \
-		modules/alsa/mixer/profile-sets/90-pulseaudio.rules \
+		modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf
+
+ALSA_PATHS = \
 		modules/alsa/mixer/paths/analog-input-aux.conf \
 		modules/alsa/mixer/paths/analog-input.conf \
 		modules/alsa/mixer/paths/analog-input.conf.common \
@@ -148,6 +133,27 @@ EXTRA_DIST = \
 		modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf \
 		modules/alsa/mixer/paths/analog-output-mono.conf
 
+EXTRA_DIST = \
+		pulse/client.conf.in \
+		pulse/version.h.in \
+		daemon/daemon.conf.in \
+		daemon/default.pa.in \
+		daemon/system.pa.in \
+		daemon/default.pa.win32 \
+		depmod.py \
+		daemon/esdcompat.in \
+		daemon/start-pulseaudio-x11.in \
+		daemon/start-pulseaudio-kde.in \
+		utils/padsp \
+		modules/module-defs.h.m4 \
+		daemon/pulseaudio.desktop.in \
+		daemon/pulseaudio-kde.desktop.in \
+		map-file \
+		daemon/pulseaudio-system.conf \
+		modules/alsa/mixer/profile-sets/90-pulseaudio.rules
+		${ALSA_PROFILES} \
+		${ALSA_PATHS}
+
 pulseconf_DATA = \
 		default.pa \
 		system.pa \
@@ -1088,32 +1094,14 @@ modlibexec_LTLIBRARIES += \
 		module-alsa-source.la \
 		module-alsa-card.la
 
-alsaprofilesets_DATA = \
-		modules/alsa/mixer/profile-sets/default.conf \
-		modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf \
-		modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf
+alsaprofilesets_DATA = ${ALSA_PROFILES}
 
 if HAVE_UDEV
 udevrules_DATA = \
 		modules/alsa/mixer/profile-sets/90-pulseaudio.rules
 endif
 
-alsapaths_DATA = \
-		modules/alsa/mixer/paths/analog-input-aux.conf \
-		modules/alsa/mixer/paths/analog-input.conf \
-		modules/alsa/mixer/paths/analog-input.conf.common \
-		modules/alsa/mixer/paths/analog-input-fm.conf \
-		modules/alsa/mixer/paths/analog-input-linein.conf \
-		modules/alsa/mixer/paths/analog-input-mic.conf \
-		modules/alsa/mixer/paths/analog-input-mic.conf.common \
-		modules/alsa/mixer/paths/analog-input-mic-line.conf \
-		modules/alsa/mixer/paths/analog-input-tvtuner.conf \
-		modules/alsa/mixer/paths/analog-input-video.conf \
-		modules/alsa/mixer/paths/analog-output.conf \
-		modules/alsa/mixer/paths/analog-output.conf.common \
-		modules/alsa/mixer/paths/analog-output-headphones.conf \
-		modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf \
-		modules/alsa/mixer/paths/analog-output-mono.conf
+alsapaths_DATA = ${ALSA_PATHS}
 
 endif
 

commit eb5562637beab22f3f906a116775cb98c752320f
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Mon Nov 16 23:36:44 2009 +0000

    build-sys: Fix missing trailing slash in 14eaf2

diff --git a/src/Makefile.am b/src/Makefile.am
index 9860bbe..b45908b 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -150,7 +150,7 @@ EXTRA_DIST = \
 		daemon/pulseaudio-kde.desktop.in \
 		map-file \
 		daemon/pulseaudio-system.conf \
-		modules/alsa/mixer/profile-sets/90-pulseaudio.rules
+		modules/alsa/mixer/profile-sets/90-pulseaudio.rules \
 		${ALSA_PROFILES} \
 		${ALSA_PATHS}
 

commit 9033140f18db820f3be9a6acae88a118d9154cf6
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Nov 18 21:41:38 2009 +0100

    rygel: fix itemCount property for sources
    
    Fixes http://pulseaudio.org/ticket/721

diff --git a/src/modules/module-rygel-media-server.c b/src/modules/module-rygel-media-server.c
index 4c02e95..82bcd14 100644
--- a/src/modules/module-rygel-media-server.c
+++ b/src/modules/module-rygel-media-server.c
@@ -464,8 +464,18 @@ static char **child_array(struct userdata *u, const char *path, unsigned *n) {
 
     if (pa_streq(path, OBJECT_SINKS))
         m = pa_idxset_size(u->core->sinks);
-    else
+    else {
+        unsigned k;
+
         m = pa_idxset_size(u->core->sources);
+        k = pa_idxset_size(u->core->sinks);
+
+        pa_assert(m >= k);
+
+        /* Subtract the monitor sources from the numbers of
+         * sources. There is one monitor source for each sink */
+        m -= k;
+    }
 
     array = pa_xnew(char*, m);
     *n = 0;
@@ -473,14 +483,20 @@ static char **child_array(struct userdata *u, const char *path, unsigned *n) {
     if (pa_streq(path, OBJECT_SINKS)) {
         pa_sink *sink;
 
-        PA_IDXSET_FOREACH(sink, u->core->sinks, idx)
+        PA_IDXSET_FOREACH(sink, u->core->sinks, idx) {
+            pa_assert((*n) < m);
             array[(*n)++] = pa_sprintf_malloc(OBJECT_SINKS "/%u", sink->index);
+        }
     } else {
         pa_source *source;
 
-        PA_IDXSET_FOREACH(source, u->core->sources, idx)
-            if (!source->monitor_of)
+        PA_IDXSET_FOREACH(source, u->core->sources, idx) {
+
+            if (!source->monitor_of) {
+                pa_assert((*n) < m);
                 array[(*n)++] = pa_sprintf_malloc(OBJECT_SOURCES "/%u", source->index);
+            }
+        }
     }
 
     pa_assert((*n) <= m);
@@ -529,16 +545,20 @@ static DBusHandlerResult sinks_and_sources_handler(DBusConnection *c, DBusMessag
             free_child_array(array, n);
 
         } else if (message_is_property_get(m, "org.gnome.UPnP.MediaContainer1", "ItemCount")) {
+            unsigned n, k;
+
+            n = pa_idxset_size(u->core->sinks);
+            k = pa_idxset_size(u->core->sources);
+            pa_assert(k >= n);
+
             pa_assert_se(r = dbus_message_new_method_return(m));
             append_variant_unsigned(r, NULL,
-                                    pa_streq(path, OBJECT_SINKS) ?
-                                    pa_idxset_size(u->core->sinks) :
-                                    pa_idxset_size(u->core->sources));
+                                    pa_streq(path, OBJECT_SINKS) ? n : k - n);
 
         } else if (message_is_property_get_all(m, "org.gnome.UPnP.MediaContainer1")) {
             DBusMessageIter iter, sub;
             char **array;
-            unsigned n;
+            unsigned n, k;
 
             pa_assert_se(r = dbus_message_new_method_return(m));
             dbus_message_iter_init_append(r, &iter);
@@ -550,10 +570,13 @@ static DBusHandlerResult sinks_and_sources_handler(DBusConnection *c, DBusMessag
             array = child_array(u, path, &n);
             append_property_dict_entry_object_array(r, &sub, "Items", (const char**) array, n);
             free_child_array(array, n);
+
+            n = pa_idxset_size(u->core->sinks);
+            k = pa_idxset_size(u->core->sources);
+            pa_assert(k >= n);
+
             append_property_dict_entry_unsigned(r, &sub, "ItemCount",
-                                                pa_streq(path, OBJECT_SINKS) ?
-                                                pa_idxset_size(u->core->sinks) :
-                                                pa_idxset_size(u->core->sources));
+                                                pa_streq(path, OBJECT_SINKS) ? n : k - n);
 
             pa_assert_se(dbus_message_iter_close_container(&iter, &sub));
 

commit 9708ecd6483ac9037c82a2a2a935e97d027f6b1b
Merge: f202af1 9033140
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Nov 20 01:02:01 2009 +0100

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


commit c6c933b4ec9eadc361471d4022f8833a930c241c
Author: Jason Newton <nevion at gmail.com>
Date:   Thu Oct 29 18:44:04 2009 -0700

    module-equalizer-sink: (re)added output memblockq commented out timing debug statements

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index 7c0ccd3..c2dcbe3 100644
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -113,8 +113,11 @@ struct userdata {
     float **Xs;
     float ***Hs;//thread updatable copies of the freq response filters (magintude based)
     pa_aupdate **a_H;
-    pa_memchunk conv_buffer;
     pa_memblockq *input_q;
+    char *output_buffer;
+    size_t output_buffer_length;
+    size_t output_buffer_max_length;
+    pa_memblockq *output_q;
     pa_bool_t first_iteration;
 
     pa_dbus_protocol *dbus_protocol;
@@ -489,18 +492,42 @@ static void dsp_logic(
 }
 #endif
 
-static void process_samples(struct userdata *u, pa_memchunk *tchunk){
+static void flatten_to_memblockq(struct userdata *u){
+    size_t mbs = pa_mempool_block_size_max(u->sink->core->mempool);
+    pa_memchunk tchunk;
+    char *dst;
+    size_t i = 0;
+    while(i < u->output_buffer_length){
+        tchunk.index = 0;
+        tchunk.length = PA_MIN((u->output_buffer_length - i), mbs);
+        tchunk.memblock = pa_memblock_new(u->sink->core->mempool, tchunk.length);
+        //pa_log_debug("pushing %ld into the q", tchunk.length);
+        dst = pa_memblock_acquire(tchunk.memblock);
+        memcpy(dst, u->output_buffer + i, tchunk.length);
+        pa_memblock_release(tchunk.memblock);
+        pa_memblockq_push(u->output_q, &tchunk);
+        pa_memblock_unref(tchunk.memblock);
+        i += tchunk.length;
+    }
+}
+
+static void process_samples(struct userdata *u){
     size_t fs = pa_frame_size(&(u->sink->sample_spec));
-    float *dst;
     unsigned a_i;
     float *H, X;
     size_t iterations, offset;
     pa_assert(u->samples_gathered >= u->window_size);
     iterations = (u->samples_gathered - u->overlap_size) / u->R;
-    tchunk->index = 0;
-    tchunk->length = iterations * u->R * fs;
-    tchunk->memblock = pa_memblock_new(u->sink->core->mempool, tchunk->length);
-    dst = ((float*) pa_memblock_acquire(tchunk->memblock));
+    //make sure there is enough buffer memory allocated
+    if(iterations * u->R * fs > u->output_buffer_max_length){
+        u->output_buffer_max_length = iterations * u->R * fs;
+        if(u->output_buffer){
+            pa_xfree(u->output_buffer);
+        }
+        u->output_buffer = pa_xmalloc(u->output_buffer_max_length);
+    }
+    u->output_buffer_length = iterations * u->R * fs;
+
     for(size_t iter = 0; iter < iterations; ++iter){
         offset = iter * u->R * fs;
         for(size_t c = 0;c < u->channels; c++) {
@@ -526,14 +553,14 @@ static void process_samples(struct userdata *u, pa_memchunk *tchunk){
                     u->work_buffer[i] = u->W[i] <= FLT_EPSILON ? u->work_buffer[i] : u->work_buffer[i] / u->W[i];
                 }
             }
-            pa_sample_clamp(PA_SAMPLE_FLOAT32NE, (uint8_t *) (dst + c) + offset, fs, u->work_buffer, sizeof(float), u->R);
+            pa_sample_clamp(PA_SAMPLE_FLOAT32NE, (uint8_t *) (((float *)u->output_buffer) + c) + offset, fs, u->work_buffer, sizeof(float), u->R);
         }
         if(u->first_iteration){
             u->first_iteration = FALSE;
         }
         u->samples_gathered -= u->R;
     }
-    pa_memblock_release(tchunk->memblock);
+    flatten_to_memblockq(u);
 }
 
 static void input_buffer(struct userdata *u, pa_memchunk *in){
@@ -556,7 +583,8 @@ static void input_buffer(struct userdata *u, pa_memchunk *in){
 /* Called from I/O thread context */
 static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) {
     struct userdata *u;
-    size_t fs, target_samples, mbs;
+    size_t fs, target_samples;
+    size_t mbs;
     //struct timeval start, end;
     pa_memchunk tchunk;
     pa_sink_input_assert_ref(i);
@@ -564,13 +592,17 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     pa_assert(chunk);
     pa_assert(u->sink);
     fs = pa_frame_size(&(u->sink->sample_spec));
-    nbytes = PA_MIN(nbytes, pa_mempool_block_size_max(u->sink->core->mempool));
-    target_samples = PA_ROUND_UP(nbytes / fs, u->R);
     mbs = pa_mempool_block_size_max(u->sink->core->mempool);
-    //pa_log_debug("vanilla mbs = %ld",mbs);
-    mbs = PA_ROUND_DOWN(mbs / fs, u->R);
-    mbs = PA_MAX(mbs, u->R);
-    target_samples = PA_MAX(target_samples, mbs);
+    if(pa_memblockq_get_length(u->output_q) > 0){
+        //pa_log_debug("qsize is %ld", pa_memblockq_get_length(u->output_q));
+        goto END;
+    }
+    //nbytes = PA_MIN(nbytes, pa_mempool_block_size_max(u->sink->core->mempool));
+    target_samples = PA_ROUND_UP(nbytes / fs, u->R);
+    ////pa_log_debug("vanilla mbs = %ld",mbs);
+    //mbs = PA_ROUND_DOWN(mbs / fs, u->R);
+    //mbs = PA_MAX(mbs, u->R);
+    //target_samples = PA_MAX(target_samples, mbs);
     //pa_log_debug("target samples: %ld", target_samples);
     if(u->first_iteration){
         //allocate request_size
@@ -594,7 +626,7 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
         pa_assert(input_remaining > 0);
         while(pa_memblockq_peek(u->input_q, &tchunk) < 0){
             //pa_sink_render(u->sink, input_remaining * fs, &tchunk);
-            pa_sink_render_full(u->sink, input_remaining * fs, &tchunk);
+            pa_sink_render_full(u->sink, PA_MIN(input_remaining * fs, mbs), &tchunk);
             pa_assert(tchunk.memblock);
             pa_memblockq_push(u->input_q, &tchunk);
             pa_memblock_unref(tchunk.memblock);
@@ -619,11 +651,13 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk
     pa_assert(u->R < u->window_size);
     //pa_rtclock_get(&start);
     /* process a block */
-    process_samples(u, chunk);
+    process_samples(u);
     //pa_rtclock_get(&end);
     //pa_log_debug("Took %0.6f seconds to process", (double) pa_timeval_diff(&end, &start) / PA_USEC_PER_SEC);
-
+END:
+    pa_assert_se(pa_memblockq_peek(u->output_q, chunk) >= 0);
     pa_assert(chunk->memblock);
+    pa_memblockq_drop(u->output_q, chunk->length);
     //pa_log_debug("gave %ld", chunk->length/fs);
     //pa_log_debug("end pop");
     return 0;
@@ -1143,6 +1177,10 @@ int pa__init(pa_module*m) {
     u->sink->set_mute = sink_set_mute_cb;
     u->sink->userdata = u;
     u->input_q = pa_memblockq_new(0,  MEMBLOCKQ_MAXLENGTH, 0, fs, 1, 1, 0, &u->sink->silence);
+    u->output_q = pa_memblockq_new(0,  MEMBLOCKQ_MAXLENGTH, 0, fs, 1, 1, 0, NULL);
+    u->output_buffer = NULL;
+    u->output_buffer_length = 0;
+    u->output_buffer_max_length = 0;
 
     pa_sink_set_asyncmsgq(u->sink, master->asyncmsgq);
     //pa_sink_set_fixed_latency(u->sink, pa_bytes_to_usec(u->R*fs, &ss));
@@ -1255,6 +1293,10 @@ void pa__done(pa_module*m) {
     if (u->sink)
         pa_sink_unref(u->sink);
 
+    if(u->output_buffer){
+        pa_xfree(u->output_buffer);
+    }
+    pa_memblockq_free(u->output_q);
     pa_memblockq_free(u->input_q);
 
     fftwf_destroy_plan(u->inverse_plan);

commit 1178f61280227a399708ea8e5cff9b4204181612
Author: Jason Newton <nevion at gmail.com>
Date:   Wed Nov 11 23:16:14 2009 -0800

    module-equalizer-sink: switch back to reference dsp implementation - cpu usage doesn't really change and there may be
    a bug in the vectorized version

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index c2dcbe3..bbbeb06 100644
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -340,7 +340,7 @@ static void sink_set_mute_cb(pa_sink *s) {
     pa_sink_input_set_mute(u->sink_input, s->muted, s->save_muted);
 }
 
-#ifndef __SSE2__
+#if 1
 //reference implementation
 static void dsp_logic(
     float * restrict dst,//used as a temp array too, needs to be fft_length!

commit 493d8b2fb7915786578daeb9dba9c55b581fcce1
Author: Jason Newton <nevion at gmail.com>
Date:   Wed Nov 11 22:52:52 2009 -0800

    module-equalizer-sink: add latency of output_q and input_q to get latency calculation

diff --git a/src/modules/module-equalizer-sink.c b/src/modules/module-equalizer-sink.c
index bbbeb06..0a2860b 100644
--- a/src/modules/module-equalizer-sink.c
+++ b/src/modules/module-equalizer-sink.c
@@ -253,10 +253,11 @@ static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t of
                 pa_sink_get_latency_within_thread(u->sink_input->sink) +
 
                 /* Add the latency internal to our sink input on top */
-                pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec);
+                pa_bytes_to_usec(pa_memblockq_get_length(u->output_q), &u->sink_input->sink->sample_spec) +
+                pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec) +
+                pa_bytes_to_usec(pa_memblockq_get_length(u->input_q), &u->sink_input->sink->sample_spec);
             //    pa_bytes_to_usec(u->samples_gathered * fs, &u->sink->sample_spec);
             //+ pa_bytes_to_usec(u->latency * fs, ss)
-            //+ pa_bytes_to_usec(pa_memblockq_get_length(u->input_q), ss);
             return 0;
         }
     }

commit b8acf5586f3f8e2af61b81569a53749f4afd090b
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Nov 20 17:48:04 2009 +0100

    daemon: complain if user passes too many arguments

diff --git a/src/daemon/main.c b/src/daemon/main.c
index 4891182..e656836 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -537,6 +537,12 @@ int main(int argc, char *argv[]) {
             goto finish;
 
         case PA_CMD_DUMP_CONF: {
+
+            if (d < argc) {
+                pa_log("Too many arguments.\n");
+                goto finish;
+            }
+
             s = pa_daemon_conf_dump(conf);
             fputs(s, stdout);
             pa_xfree(s);
@@ -547,6 +553,11 @@ int main(int argc, char *argv[]) {
         case PA_CMD_DUMP_RESAMPLE_METHODS: {
             int i;
 
+            if (d < argc) {
+                pa_log("Too many arguments.\n");
+                goto finish;
+            }
+
             for (i = 0; i < PA_RESAMPLER_MAX; i++)
                 if (pa_resample_method_supported(i))
                     printf("%s\n", pa_resample_method_to_string(i));
@@ -561,6 +572,12 @@ int main(int argc, char *argv[]) {
             goto finish;
 
         case PA_CMD_VERSION :
+
+            if (d < argc) {
+                pa_log("Too many arguments.\n");
+                goto finish;
+            }
+
             printf(PACKAGE_NAME" "PACKAGE_VERSION"\n");
             retval = 0;
             goto finish;
@@ -568,6 +585,11 @@ int main(int argc, char *argv[]) {
         case PA_CMD_CHECK: {
             pid_t pid;
 
+            if (d < argc) {
+                pa_log("Too many arguments.\n");
+                goto finish;
+            }
+
             if (pa_pid_file_check_running(&pid, "pulseaudio") < 0)
                 pa_log_info(_("Daemon not running"));
             else {
@@ -580,6 +602,11 @@ int main(int argc, char *argv[]) {
         }
         case PA_CMD_KILL:
 
+            if (d < argc) {
+                pa_log("Too many arguments.\n");
+                goto finish;
+            }
+
             if (pa_pid_file_kill(SIGINT, NULL, "pulseaudio") < 0)
                 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno));
             else
@@ -589,6 +616,11 @@ int main(int argc, char *argv[]) {
 
         case PA_CMD_CLEANUP_SHM:
 
+            if (d < argc) {
+                pa_log("Too many arguments.\n");
+                goto finish;
+            }
+
             if (pa_shm_cleanup() >= 0)
                 retval = 0;
 
@@ -598,6 +630,11 @@ int main(int argc, char *argv[]) {
             pa_assert(conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START);
     }
 
+    if (d < argc) {
+        pa_log("Too many arguments.\n");
+        goto finish;
+    }
+
     if (getuid() == 0 && !conf->system_instance)
         pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
 #ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */

commit a3b5a944885ff92233aa02e390312fbc04671686
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Nov 20 17:49:30 2009 +0100

    pulse: try to fix inaccuracy with uncork timing for streams that are created in corked state

diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index 2997962..04a4242 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -376,6 +376,22 @@ static void check_smoother_status(pa_stream *s, pa_bool_t aposteriori, pa_bool_t
     if (!s->smoother)
         return;
 
+    if (!s->timing_info_valid &&
+        !aposteriori &&
+        !force_start &&
+        !force_stop &&
+        s->context->version >= 13) {
+
+        /* If the server supports STARTED and UNDERFLOW events we take
+         * them as indications when audio really starts/stops playing,
+         * if we don't have any timing info yet -- instead of trying
+         * to be smart and guessing the server time. Otherwise the
+         * unknown transport delay we don't know might add too much
+         * noise to our time calculations. */
+
+        return;
+    }
+
     x = pa_rtclock_now();
 
     if (s->timing_info_valid) {
@@ -390,7 +406,6 @@ static void check_smoother_status(pa_stream *s, pa_bool_t aposteriori, pa_bool_t
     else if (force_start || s->buffer_attr.prebuf == 0)
         pa_smoother_resume(s->smoother, x, TRUE);
 
-
     /* Please note that we have no idea if playback actually started
      * if prebuf is non-zero! */
 }

commit f05ae357b6dee91b4d80c1c09bcf2bbf1a8802fa
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Nov 20 19:48:08 2009 +0100

    pulse: delay smoother update only when unpausing, not when pausing, since we don't want the timer to advance when we are supposedly already paused

diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index 04a4242..4a44c31 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -376,22 +376,6 @@ static void check_smoother_status(pa_stream *s, pa_bool_t aposteriori, pa_bool_t
     if (!s->smoother)
         return;
 
-    if (!s->timing_info_valid &&
-        !aposteriori &&
-        !force_start &&
-        !force_stop &&
-        s->context->version >= 13) {
-
-        /* If the server supports STARTED and UNDERFLOW events we take
-         * them as indications when audio really starts/stops playing,
-         * if we don't have any timing info yet -- instead of trying
-         * to be smart and guessing the server time. Otherwise the
-         * unknown transport delay we don't know might add too much
-         * noise to our time calculations. */
-
-        return;
-    }
-
     x = pa_rtclock_now();
 
     if (s->timing_info_valid) {
@@ -403,8 +387,26 @@ static void check_smoother_status(pa_stream *s, pa_bool_t aposteriori, pa_bool_t
 
     if (s->suspended || s->corked || force_stop)
         pa_smoother_pause(s->smoother, x);
-    else if (force_start || s->buffer_attr.prebuf == 0)
+    else if (force_start || s->buffer_attr.prebuf == 0) {
+
+        if (!s->timing_info_valid &&
+            !aposteriori &&
+            !force_start &&
+            !force_stop &&
+            s->context->version >= 13) {
+
+            /* If the server supports STARTED events we take them as
+             * indications when audio really starts/stops playing, if
+             * we don't have any timing info yet -- instead of trying
+             * to be smart and guessing the server time. Otherwise the
+             * unknown transport delay add too much noise to our time
+             * calculations. */
+
+            return;
+        }
+
         pa_smoother_resume(s->smoother, x, TRUE);
+    }
 
     /* Please note that we have no idea if playback actually started
      * if prebuf is non-zero! */

commit ba95b1939d581bc6f647616bd12bd673370f3be5
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Nov 20 19:55:47 2009 +0100

    pulse: ask for timing updates both *before* and *after* triggering a stream state change so that in the STARTED/UNDERFLOW callbacks we accurate transport latency information

diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index 4a44c31..4dea567 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -1482,6 +1482,11 @@ pa_operation * pa_stream_drain(pa_stream *s, pa_stream_success_cb_t cb, void *us
     PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE);
     PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE);
 
+    /* Ask for a timing update before we cork/uncork to get the best
+     * accuracy for the transport latency suitable for the
+     * check_smoother_status() call in the started callback */
+    request_auto_timing_update(s, TRUE);
+
     o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata);
 
     t = pa_tagstruct_command(s->context, PA_COMMAND_DRAIN_PLAYBACK_STREAM, &tag);
@@ -1489,6 +1494,10 @@ pa_operation * pa_stream_drain(pa_stream *s, pa_stream_success_cb_t cb, void *us
     pa_pstream_send_tagstruct(s->context->pstream, t);
     pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref);
 
+    /* This might cause the read index to conitnue again, hence
+     * let's request a timing update */
+    request_auto_timing_update(s, TRUE);
+
     return o;
 }
 
@@ -2037,6 +2046,11 @@ pa_operation* pa_stream_cork(pa_stream *s, int b, pa_stream_success_cb_t cb, voi
     PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE);
     PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE);
 
+    /* Ask for a timing update before we cork/uncork to get the best
+     * accuracy for the transport latency suitable for the
+     * check_smoother_status() call in the started callback */
+    request_auto_timing_update(s, TRUE);
+
     s->corked = b;
 
     o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata);
@@ -2052,8 +2066,8 @@ pa_operation* pa_stream_cork(pa_stream *s, int b, pa_stream_success_cb_t cb, voi
 
     check_smoother_status(s, FALSE, FALSE, FALSE);
 
-    /* This might cause the indexes to hang/start again, hence
-     * let's request a timing update */
+    /* This might cause the indexes to hang/start again, hence let's
+     * request a timing update, after the cork/uncork, too */
     request_auto_timing_update(s, TRUE);
 
     return o;
@@ -2090,6 +2104,11 @@ pa_operation* pa_stream_flush(pa_stream *s, pa_stream_success_cb_t cb, void *use
     PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE);
     PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE);
 
+    /* Ask for a timing update *before* the flush, so that the
+     * transport usec is as up to date as possible when we get the
+     * underflow message and update the smoother status*/
+    request_auto_timing_update(s, TRUE);
+
     if (!(o = stream_send_simple_command(s, (uint32_t) (s->direction == PA_STREAM_PLAYBACK ? PA_COMMAND_FLUSH_PLAYBACK_STREAM : PA_COMMAND_FLUSH_RECORD_STREAM), cb, userdata)))
         return NULL;
 
@@ -2124,6 +2143,11 @@ pa_operation* pa_stream_prebuf(pa_stream *s, pa_stream_success_cb_t cb, void *us
     PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE);
     PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->buffer_attr.prebuf > 0, PA_ERR_BADSTATE);
 
+    /* Ask for a timing update before we cork/uncork to get the best
+     * accuracy for the transport latency suitable for the
+     * check_smoother_status() call in the started callback */
+    request_auto_timing_update(s, TRUE);
+
     if (!(o = stream_send_simple_command(s, PA_COMMAND_PREBUF_PLAYBACK_STREAM, cb, userdata)))
         return NULL;
 
@@ -2145,6 +2169,11 @@ pa_operation* pa_stream_trigger(pa_stream *s, pa_stream_success_cb_t cb, void *u
     PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE);
     PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->buffer_attr.prebuf > 0, PA_ERR_BADSTATE);
 
+    /* Ask for a timing update before we cork/uncork to get the best
+     * accuracy for the transport latency suitable for the
+     * check_smoother_status() call in the started callback */
+    request_auto_timing_update(s, TRUE);
+
     if (!(o = stream_send_simple_command(s, PA_COMMAND_TRIGGER_PLAYBACK_STREAM, cb, userdata)))
         return NULL;
 
@@ -2396,6 +2425,11 @@ pa_operation* pa_stream_set_buffer_attr(pa_stream *s, const pa_buffer_attr *attr
     PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE);
     PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->context->version >= 12, PA_ERR_NOTSUPPORTED);
 
+    /* Ask for a timing update before we cork/uncork to get the best
+     * accuracy for the transport latency suitable for the
+     * check_smoother_status() call in the started callback */
+    request_auto_timing_update(s, TRUE);
+
     o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata);
 
     t = pa_tagstruct_command(

commit bd3467ff2f982c87db4618cc6ac98780bef407cc
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Nov 20 20:00:26 2009 +0100

    alsa: fix log output when the audio device refuses to give us again the same period settings we had before

diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
index 856adb1..ed16c83 100644
--- a/src/modules/alsa/alsa-sink.c
+++ b/src/modules/alsa/alsa-sink.c
@@ -983,7 +983,7 @@ static int unsuspend(struct userdata *u) {
         buffer_size*u->frame_size != u->hwbuf_size) {
         pa_log_warn("Resume failed, couldn't restore original fragment settings. (Old: %lu/%lu, New %lu/%lu)",
                     (unsigned long) u->hwbuf_size, (unsigned long) u->fragment_size,
-                    (unsigned long) (buffer_size*u->fragment_size), (unsigned long) (period_size*u->frame_size));
+                    (unsigned long) (buffer_size*u->frame_size), (unsigned long) (period_size*u->frame_size));
         goto fail;
     }
 
diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
index e775b20..157698e 100644
--- a/src/modules/alsa/alsa-source.c
+++ b/src/modules/alsa/alsa-source.c
@@ -930,7 +930,7 @@ static int unsuspend(struct userdata *u) {
         buffer_size*u->frame_size != u->hwbuf_size) {
         pa_log_warn("Resume failed, couldn't restore original fragment settings. (Old: %lu/%lu, New %lu/%lu)",
                     (unsigned long) u->hwbuf_size, (unsigned long) u->fragment_size,
-                    (unsigned long) (buffer_size*u->fragment_size), (unsigned long) (period_size*u->frame_size));
+                    (unsigned long) (buffer_size*u->frame_size), (unsigned long) (period_size*u->frame_size));
         goto fail;
     }
 

commit 6daf112ce0116e7edacd83c538e5c3099c90a774
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Nov 20 20:27:03 2009 +0100

    alsa: fix minor sampling rate deviations before adjusting the buffer size

diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
index b8d1357..52f1259 100644
--- a/src/modules/alsa/alsa-util.c
+++ b/src/modules/alsa/alsa-util.c
@@ -259,6 +259,10 @@ int pa_alsa_set_hw_params(
         goto finish;
     }
 
+    /* We ignore very small sampling rate deviations */
+    if (_ss.rate >= ss->rate*.95 && _ss.rate <= ss->rate*1.05)
+        _ss.rate = ss->rate;
+
     if (require_exact_channel_number) {
         if ((ret = snd_pcm_hw_params_set_channels(pcm_handle, hwparams, _ss.channels)) < 0) {
             pa_log_debug("snd_pcm_hw_params_set_channels(%u) failed: %s", _ss.channels, pa_alsa_strerror(ret));
@@ -303,7 +307,7 @@ int pa_alsa_set_hw_params(
             if (set_buffer_size(pcm_handle, hwparams_copy, _buffer_size) >= 0 &&
                 set_period_size(pcm_handle, hwparams_copy, _period_size) >= 0 &&
                 snd_pcm_hw_params(pcm_handle, hwparams_copy) >= 0) {
-                pa_log_debug("Set buffer size first, period size second.");
+                pa_log_debug("Set buffer size first (to %lu samples), period size second (to %lu samples).", (unsigned long) _buffer_size, (unsigned long) _period_size);
                 goto success;
             }
 
@@ -311,7 +315,7 @@ int pa_alsa_set_hw_params(
             if (set_period_size(pcm_handle, hwparams_copy, _period_size) >= 0 &&
                 set_buffer_size(pcm_handle, hwparams_copy, _buffer_size) >= 0 &&
                 snd_pcm_hw_params(pcm_handle, hwparams_copy) >= 0) {
-                pa_log_debug("Set period size first, buffer size second.");
+                pa_log_debug("Set period size first (to %lu samples), buffer size second (to %lu samples).", (unsigned long) _period_size, (unsigned long) _buffer_size);
                 goto success;
             }
         }
@@ -322,7 +326,7 @@ int pa_alsa_set_hw_params(
             /* Third try: set only buffer size */
             if (set_buffer_size(pcm_handle, hwparams_copy, _buffer_size) >= 0 &&
                 snd_pcm_hw_params(pcm_handle, hwparams_copy) >= 0) {
-                pa_log_debug("Set only buffer size second.");
+                pa_log_debug("Set only buffer size (to %lu samples).", (unsigned long) _buffer_size);
                 goto success;
             }
         }
@@ -333,7 +337,7 @@ int pa_alsa_set_hw_params(
             /* Fourth try: set only period size */
             if (set_period_size(pcm_handle, hwparams_copy, _period_size) >= 0 &&
                 snd_pcm_hw_params(pcm_handle, hwparams_copy) >= 0) {
-                pa_log_debug("Set only period size second.");
+                pa_log_debug("Set only period size (to %lu samples).", (unsigned long) _period_size);
                 goto success;
             }
         }
@@ -374,9 +378,7 @@ success:
         goto finish;
     }
 
-    /* If the sample rate deviates too much, we need to resample */
-    if (_ss.rate < ss->rate*.95 || _ss.rate > ss->rate*1.05)
-        ss->rate = _ss.rate;
+    ss->rate = _ss.rate;
     ss->channels = _ss.channels;
     ss->format = _ss.format;
 

commit 70ba21e78a90b60f38ce524c49907b1f5daa2fba
Author: Diego Elio 'Flameeyes' Pettenò <flameeyes at gmail.com>
Date:   Fri Nov 20 21:08:05 2009 +0100

    Move the platform-specific defines after the compiler has been found.
    
    Without this change, on OpenSolaris, it's possible that the compiler will
    be reported, by default, as failing to produce executables, since
    _XOPEN_SOURCE=600 requires a C99 compiler to compile even the simples of
    the programs.

diff --git a/configure.ac b/configure.ac
index 2bc068e..a3a97a6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -66,19 +66,6 @@ if type -p stow > /dev/null && test -d /usr/local/stow ; then
    ac_default_prefix="/usr/local/stow/${PACKAGE_NAME}-${PACKAGE_VERSION}"
 fi
 
-#### Platform hacks ####
-
-case $host in
-   *-*-solaris* )
-      AC_DEFINE(_XOPEN_SOURCE,        600, Needed to get declarations for msg_control and msg_controllen on Solaris)
-      AC_DEFINE(__EXTENSIONS__,         1, Needed to get declarations for msg_control and msg_controllen on Solaris)
-      ;;
-   *-*-darwin* )
-      AC_DEFINE([_POSIX_C_SOURCE], [200112L], [Needed to get clock_gettime on Mac OS X])
-      AC_DEFINE([_DARWIN_C_SOURCE], [200112L], [Needed to get NSIG on Mac OS X])
-      ;;
-esac
-
 AM_SILENT_RULES([yes])
 
 #### Checks for programs. ####
@@ -95,6 +82,19 @@ AM_PROG_CC_C_O
 AC_PROG_GCC_TRADITIONAL
 AC_USE_SYSTEM_EXTENSIONS
 
+#### Platform hacks ####
+
+case $host in
+   *-*-solaris* )
+      AC_DEFINE(_XOPEN_SOURCE,        600, Needed to get declarations for msg_control and msg_controllen on Solaris)
+      AC_DEFINE(__EXTENSIONS__,         1, Needed to get declarations for msg_control and msg_controllen on Solaris)
+      ;;
+   *-*-darwin* )
+      AC_DEFINE([_POSIX_C_SOURCE], [200112L], [Needed to get clock_gettime on Mac OS X])
+      AC_DEFINE([_DARWIN_C_SOURCE], [200112L], [Needed to get NSIG on Mac OS X])
+      ;;
+esac
+
 # M4
 
 AC_CHECK_PROGS([M4], gm4 m4, no)

commit 71ebbfb6ef0a8c368b9c424c3be4fda2519a5770
Author: Diego Elio 'Flameeyes' Pettenò <flameeyes at gmail.com>
Date:   Fri Nov 20 21:22:24 2009 +0100

    Fix build on Solaris: pass the third parameter to pa_cloexec_open.

diff --git a/src/modules/module-solaris.c b/src/modules/module-solaris.c
index 955997b..396094c 100644
--- a/src/modules/module-solaris.c
+++ b/src/modules/module-solaris.c
@@ -327,7 +327,7 @@ static int open_audio_device(struct userdata *u, pa_sample_spec *ss) {
     pa_assert(u);
     pa_assert(ss);
 
-    if ((u->fd = pa_open_cloexec(u->device_name, u->mode | O_NONBLOCK)) < 0) {
+    if ((u->fd = pa_open_cloexec(u->device_name, u->mode | O_NONBLOCK, 0)) < 0) {
         pa_log_warn("open %s failed (%s)", u->device_name, pa_cstrerror(errno));
         return -1;
     }

commit 09a58b6813c078a64cf61be4d2ba98e26b4c88b3
Author: Diego Elio 'Flameeyes' Pettenò <flameeyes at gmail.com>
Date:   Fri Nov 20 21:24:46 2009 +0100

    Don't declare the variable l if FIONREAD is not defined.
    
    This avoids two warnings due to FIONREAD not being defined.

diff --git a/src/modules/module-pipe-sink.c b/src/modules/module-pipe-sink.c
index 10cc341..f06d1ee 100644
--- a/src/modules/module-pipe-sink.c
+++ b/src/modules/module-pipe-sink.c
@@ -101,9 +101,10 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
 
         case PA_SINK_MESSAGE_GET_LATENCY: {
             size_t n = 0;
-            int l;
 
 #ifdef FIONREAD
+            int l;
+
             if (ioctl(u->fd, FIONREAD, &l) >= 0 && l > 0)
                 n = (size_t) l;
 #endif
diff --git a/src/modules/module-pipe-source.c b/src/modules/module-pipe-source.c
index de68093..c5eba43 100644
--- a/src/modules/module-pipe-source.c
+++ b/src/modules/module-pipe-source.c
@@ -105,9 +105,10 @@ static int source_process_msg(
 
         case PA_SOURCE_MESSAGE_GET_LATENCY: {
             size_t n = 0;
-            int l;
 
 #ifdef FIONREAD
+            int l;
+
             if (ioctl(u->fd, FIONREAD, &l) >= 0 && l > 0)
                 n = (size_t) l;
 #endif

commit 4923f3ca773662b2d147bc374995571b5dacdc7f
Author: Diego Elio 'Flameeyes' Pettenò <flameeyes at gmail.com>
Date:   Fri Nov 20 21:25:33 2009 +0100

    Include sys/filio.h if present; this makes use of FIONREAD on Solaris.
    
    FIONREAD on OpenSolaris is declared in sys/filio.h. The RTP modules already
    rely on the presence of FIONREAD, and check for the header, so this brings
    the pipe source and sink modules on par with them.

diff --git a/src/modules/module-pipe-sink.c b/src/modules/module-pipe-sink.c
index f06d1ee..7a4e730 100644
--- a/src/modules/module-pipe-sink.c
+++ b/src/modules/module-pipe-sink.c
@@ -34,6 +34,10 @@
 #include <sys/ioctl.h>
 #include <poll.h>
 
+#ifdef HAVE_SYS_FILIO_H
+#include <sys/filio.h>
+#endif
+
 #include <pulse/xmalloc.h>
 
 #include <pulsecore/core-error.h>
diff --git a/src/modules/module-pipe-source.c b/src/modules/module-pipe-source.c
index c5eba43..933f029 100644
--- a/src/modules/module-pipe-source.c
+++ b/src/modules/module-pipe-source.c
@@ -34,6 +34,10 @@
 #include <sys/ioctl.h>
 #include <sys/poll.h>
 
+#ifdef HAVE_SYS_FILIO_H
+#include <sys/filio.h>
+#endif
+
 #include <pulse/xmalloc.h>
 
 #include <pulsecore/core-error.h>

commit 5150a101efbf46d5235813e4bb6651a3a108bb78
Author: Diego Elio 'Flameeyes' Pettenò <flameeyes at gmail.com>
Date:   Fri Nov 20 21:37:16 2009 +0100

    Check for stow using AC_CHECK_PROG rather than type -p.
    
    The type -p check is not compatible with POSIX shells, and indeed fails
    when used with the FreeBSD 8 default shell. Instead the AC_CHECK_PROG macro
    is written properly to look for the command.

diff --git a/configure.ac b/configure.ac
index a3a97a6..fdc6662 100644
--- a/configure.ac
+++ b/configure.ac
@@ -61,10 +61,12 @@ AC_SUBST(LIBPULSE_MAINLOOP_GLIB_VERSION_INFO, [0:4:0])
 AC_CANONICAL_HOST
 AC_DEFINE_UNQUOTED([CANONICAL_HOST], "$host", [Canonical host string.])
 
-if type -p stow > /dev/null && test -d /usr/local/stow ; then
+AC_CHECK_PROG([STOW], [stow], [yes], [no])
+
+AS_IF([test "x$STOW" = "xyes" && test -d /usr/local/stow], [
    AC_MSG_NOTICE([*** Found /usr/local/stow: default install prefix set to /usr/local/stow/${PACKAGE_NAME}-${PACKAGE_VERSION} ***])
    ac_default_prefix="/usr/local/stow/${PACKAGE_NAME}-${PACKAGE_VERSION}"
-fi
+])
 
 AM_SILENT_RULES([yes])
 

commit 41853cc7c01d3b400e781bb9db8c09befd04685b
Author: Jason Newton <nevion at gmail.com>
Date:   Fri Nov 20 14:56:07 2009 -0800

    added qpaeq script for GUI equalizer control to src/util

diff --git a/src/utils/qpaeq.py b/src/utils/qpaeq.py
new file mode 100755
index 0000000..dca0701
--- /dev/null
+++ b/src/utils/qpaeq.py
@@ -0,0 +1,546 @@
+#!/usr/bin/env python
+#    qpaeq is a equalizer interface for pulseaudio's equalizer sinks
+#    Copyright (C) 2009  Jason Newton <nevion at gmail.com
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU Affero General Public License as
+#    published by the Free Software Foundation, either version 3 of the
+#    License, or (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU Affero General Public License for more details.
+#
+#    You should have received a copy of the GNU Affero General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+import os,math,sys
+import PyQt4,sip
+from PyQt4 import QtGui,QtCore
+from functools import partial
+
+import dbus.mainloop.qt
+import dbus
+
+import signal
+signal.signal(signal.SIGINT, signal.SIG_DFL)
+SYNC_TIMEOUT = 4*1000
+
+CORE_PATH = "/org/pulseaudio/core1"
+CORE_IFACE = "org.PulseAudio.Core1"
+def connect():
+    if 'PULSE_DBUS_SERVER' in os.environ:
+        address = os.environ['PULSE_DBUS_SERVER']
+    else:
+        bus = dbus.SessionBus() # Should be UserBus, but D-Bus doesn't implement that yet.
+        server_lookup = bus.get_object('org.PulseAudio1', '/org/pulseaudio/server_lookup1')
+        address = server_lookup.Get('org.PulseAudio.ServerLookup1', 'Address', dbus_interface='org.freedesktop.DBus.Properties')
+    return dbus.connection.Connection(address)
+
+
+#TODO: signals: sink Filter changed, sink reconfigured (window size) (sink iface)
+#TODO: manager signals: new sink, removed sink, new profile, removed profile
+#TODO: add support for changing of window_size 1000-fft_size (adv option)
+#TODO: reconnect support loop 1 second trying to reconnect
+#TODO: just resample the filters for profiles when loading to different sizes
+#TODO: add preamp
+prop_iface='org.freedesktop.DBus.Properties'
+eq_iface='org.PulseAudio.Ext.Equalizing1.Equalizer'
+device_iface='org.PulseAudio.Core1.Device'
+class QPaeq(QtGui.QWidget):
+    manager_path='/org/pulseaudio/equalizing1'
+    manager_iface='org.PulseAudio.Ext.Equalizing1.Manager'
+    core_iface='org.PulseAudio.Core1'
+    core_path='/org/pulseaudio/core1'
+    def __init__(self):
+        QtGui.QWidget.__init__(self)
+        self.setWindowTitle('qpaeq')
+        self.slider_widget=None
+        self.sink_name=None
+        self.filter_state=None
+
+        self.create_layout()
+
+        self.set_connection()
+        self.connect_to_sink(self.sinks[0])
+        self.set_callbacks()
+        self.setMinimumSize(self.sizeHint())
+
+    def create_layout(self):
+        self.main_layout=QtGui.QVBoxLayout()
+        self.setLayout(self.main_layout)
+        toprow_layout=QtGui.QHBoxLayout()
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        #sizePolicy.setHeightForWidth(self.profile_box.sizePolicy().hasHeightForWidth())
+
+        toprow_layout.addWidget(QtGui.QLabel('Sink'))
+        self.sink_box = QtGui.QComboBox()
+        self.sink_box.setSizePolicy(sizePolicy)
+        self.sink_box.setDuplicatesEnabled(False)
+        self.sink_box.setInsertPolicy(QtGui.QComboBox.InsertAlphabetically)
+        #self.sink_box.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
+        toprow_layout.addWidget(self.sink_box)
+
+        toprow_layout.addWidget(QtGui.QLabel('Channel'))
+        self.channel_box = QtGui.QComboBox()
+        self.channel_box.setSizePolicy(sizePolicy)
+        toprow_layout.addWidget(self.channel_box)
+
+        toprow_layout.addWidget(QtGui.QLabel('Preset'))
+        self.profile_box = QtGui.QComboBox()
+        self.profile_box.setSizePolicy(sizePolicy)
+        self.profile_box.setInsertPolicy(QtGui.QComboBox.InsertAlphabetically)
+        #self.profile_box.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
+        toprow_layout.addWidget(self.profile_box)
+
+        large_icon_size=self.style().pixelMetric(QtGui.QStyle.PM_LargeIconSize)
+        large_icon_size=QtCore.QSize(large_icon_size,large_icon_size)
+        save_profile=QtGui.QToolButton()
+        save_profile.setIcon(self.style().standardIcon(QtGui.QStyle.SP_DriveFDIcon))
+        save_profile.setIconSize(large_icon_size)
+        save_profile.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
+        save_profile.clicked.connect(self.save_profile)
+        remove_profile=QtGui.QToolButton()
+        remove_profile.setIcon(self.style().standardIcon(QtGui.QStyle.SP_TrashIcon))
+        remove_profile.setIconSize(large_icon_size)
+        remove_profile.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
+        remove_profile.clicked.connect(self.remove_profile)
+        toprow_layout.addWidget(save_profile)
+        toprow_layout.addWidget(remove_profile)
+
+        reset_button = QtGui.QPushButton('Reset')
+        reset_button.clicked.connect(self.reset)
+        toprow_layout.addStretch()
+        toprow_layout.addWidget(reset_button)
+        self.layout().addLayout(toprow_layout)
+
+        self.profile_box.activated.connect(self.load_profile)
+        self.channel_box.activated.connect(self.select_channel)
+    def connect_to_sink(self,name):
+        #TODO: clear slots for profile buttons
+
+        #flush any pending saves for other sinks
+        if self.filter_state is not None:
+            self.filter_state.flush_state()
+        sink=self.connection.get_object(object_path=name)
+        self.sink_props=dbus.Interface(sink,dbus_interface=prop_iface)
+        self.sink=dbus.Interface(sink,dbus_interface=eq_iface)
+        self.filter_state=FilterState(sink)
+        #sample_rate,filter_rate,channels,channel)
+
+        self.channel_box.clear()
+        self.channel_box.addItem('All',self.filter_state.channels)
+        for i in xrange(self.filter_state.channels):
+            self.channel_box.addItem('%d' %(i+1,),i)
+        self.setMinimumSize(self.sizeHint())
+
+        self.set_slider_widget(SliderArray(self.filter_state))
+
+        self.sink_name=name
+        #set the signal listener for this sink
+        core=self._get_core()
+        #temporary hack until signal filtering works properly
+        core.ListenForSignal('',[dbus.ObjectPath(self.sink_name),dbus.ObjectPath(self.manager_path)])
+        #for x in ['FilterChanged']:
+        #    core.ListenForSignal("%s.%s" %(self.eq_iface,x),[dbus.ObjectPath(self.sink_name)])
+        #core.ListenForSignal(self.eq_iface,[dbus.ObjectPath(self.sink_name)])
+        self.sink.connect_to_signal('FilterChanged',self.read_filter)
+
+    def set_slider_widget(self,widget):
+        layout=self.layout()
+        if self.slider_widget is not None:
+            i=layout.indexOf(self.slider_widget)
+            layout.removeWidget(self.slider_widget)
+            self.slider_widget.deleteLater()
+            layout.insertWidget(i,self.slider_widget)
+        else:
+            layout.addWidget(widget)
+        self.slider_widget=widget
+        self.read_filter()
+    def _get_core(self):
+        core_obj=self.connection.get_object(object_path=self.core_path)
+        core=dbus.Interface(core_obj,dbus_interface=self.core_iface)
+        return core
+    def sink_added(self,sink):
+        #TODO: preserve selected sink
+        self.update_sinks()
+    def sink_removed(self,sink):
+        #TODO: preserve selected sink, try connecting to backup otherwise
+        if sink==self.sink_name:
+            #connect to new sink?
+            pass
+        self.update_sinks()
+    def save_profile(self):
+        #popup dialog box for name
+        current=self.profile_box.currentIndex()
+        profile,ok=QtGui.QInputDialog.getItem(self,'Preset Name','Preset',self.profiles,current)
+        if not ok or profile=='':
+            return
+        if profile in self.profiles:
+            mbox=QtGui.QMessageBox(self)
+            mbox.setText('%s preset already exists'%(profile,))
+            mbox.setInformativeText('Do you want to save over it?')
+            mbox.setStandardButtons(mbox.Save|mbox.Discard|mbox.Cancel)
+            mbox.setDefaultButton(mbox.Save)
+            ret=mbox.exec_()
+            if ret!=mbox.Save:
+                return
+        self.sink.SaveProfile(self.filter_state.channel,dbus.String(profile))
+        if self.filter_state.channel==self.filter_state.channels:
+            for x in range(1,self.filter_state.channels):
+                self.sink.LoadProfile(x,dbus.String(profile))
+    def remove_profile(self):
+        #find active profile name, remove it
+        profile=self.profile_box.currentText()
+        manager=dbus.Interface(self.manager_obj,dbus_interface=self.manager_iface)
+        manager.RemoveProfile(dbus.String(profile))
+    def load_profile(self,x):
+        profile=self.profile_box.itemText(x)
+        self.filter_state.load_profile(profile)
+    def select_channel(self,x):
+        self.filter_state.channel = self.channel_box.itemData(x).toPyObject()
+        self._set_profile_name()
+        self.filter_state.readback()
+
+    #TODO: add back in preamp!
+    #print frequencies
+    #main_layout.addLayout(self.create_slider(partial(self.update_coefficient,0),
+    #    'Preamp')[0]
+    #)
+    def set_connection(self):
+        self.connection=connect()
+        self.manager_obj=self.connection.get_object(object_path=self.manager_path)
+        manager_props=dbus.Interface(self.manager_obj,dbus_interface=prop_iface)
+        self.sinks=manager_props.Get(self.manager_iface,'EqualizedSinks')
+    def set_callbacks(self):
+        manager=dbus.Interface(self.manager_obj,dbus_interface=self.manager_iface)
+        manager.connect_to_signal('ProfilesChanged',self.update_profiles)
+        manager.connect_to_signal('SinkAdded',self.sink_added)
+        manager.connect_to_signal('SinkRemoved',self.sink_removed)
+        #self._get_core().ListenForSignal(self.manager_iface,[])
+        #self._get_core().ListenForSignal(self.manager_iface,[dbus.ObjectPath(self.manager_path)])
+        #core=self._get_core()
+        #for x in ['ProfilesChanged','SinkAdded','SinkRemoved']:
+        #    core.ListenForSignal("%s.%s" %(self.manager_iface,x),[dbus.ObjectPath(self.manager_path)])
+        self.update_profiles()
+        self.update_sinks()
+    def update_profiles(self):
+        #print 'update profiles called!'
+        manager_props=dbus.Interface(self.manager_obj,dbus_interface=prop_iface)
+        self.profiles=manager_props.Get(self.manager_iface,'Profiles')
+        self.profile_box.blockSignals(True)
+        self.profile_box.clear()
+        self.profile_box.addItems(self.profiles)
+        self.profile_box.blockSignals(False)
+        self._set_profile_name()
+    def update_sinks(self):
+        self.sink_box.blockSignals(True)
+        self.sink_box.clear()
+        for x in self.sinks:
+            sink=self.connection.get_object(object_path=x)
+            sink_props=dbus.Interface(sink,dbus_interface=prop_iface)
+            simple_name=sink_props.Get(device_iface,'Name')
+            self.sink_box.addItem(simple_name,x)
+        self.sink_box.blockSignals(False)
+        self.sink_box.setMinimumSize(self.sink_box.sizeHint())
+    def read_filter(self):
+        #print self.filter_frequencies
+        self.filter_state.readback()
+    def reset(self):
+        coefs=dbus.Array([1/math.sqrt(2.0)]*(self.filter_state.filter_rate//2+1))
+        preamp=1.0
+        self.filter_state.set_filter(preamp,coefs)
+    def _set_profile_name(self):
+        self.profile_box.blockSignals(True)
+        profile_name=self.sink.BaseProfile(self.filter_state.channel)
+        if profile_name is not None:
+            i=self.profile_box.findText(profile_name)
+            if i>=0:
+                self.profile_box.setCurrentIndex(i)
+        self.profile_box.blockSignals(False)
+
+
+class SliderArray(QtGui.QWidget):
+    def __init__(self,filter_state,parent=None):
+        super(SliderArray,self).__init__(parent)
+        #self.setStyleSheet('padding: 0px; border-width: 0px; margin: 0px;')
+        #self.setStyleSheet('font-size: 7pt; font-family: monospace;'+outline%('blue'))
+        self.filter_state=filter_state
+        self.setLayout(QtGui.QHBoxLayout())
+        self.sub_array=None
+        self.set_sub_array(SliderArraySub(self.filter_state))
+        self.inhibit_resize=0
+    def set_sub_array(self,widget):
+        if self.sub_array is not None:
+            self.layout().removeWidget(self.sub_array)
+            self.sub_array.disconnect_signals()
+            self.sub_array.deleteLater()
+        self.sub_array=widget
+        self.layout().addWidget(self.sub_array)
+        self.sub_array.connect_signals()
+        self.filter_state.readback()
+    def resizeEvent(self,event):
+        super(SliderArray,self).resizeEvent(event)
+        if self.inhibit_resize==0:
+            self.inhibit_resize+=1
+            #self.add_sliders_to_fit()
+            t=QtCore.QTimer(self)
+            t.setSingleShot(True)
+            t.setInterval(0)
+            t.timeout.connect(partial(self.add_sliders_to_fit,event))
+            t.start()
+    def add_sliders_to_fit(self,event):
+        if event.oldSize().width()>0 and event.size().width()>0:
+            i=len(self.filter_state.frequencies)*int(round(float(event.size().width())/event.oldSize().width()))
+        else:
+            i=len(self.filter_state.frequencies)
+
+        t_w=self.size().width()
+        def evaluate(filter_state, target, variable):
+            base_freqs=self.filter_state.freq_proper(self.filter_state.DEFAULT_FREQUENCIES)
+            filter_state._set_frequency_values(subdivide(base_freqs,variable))
+            new_widget=SliderArraySub(filter_state)
+            w=new_widget.sizeHint().width()
+            return w-target
+        def searcher(initial,evaluator):
+            i=initial
+            def d(e): return 1 if e>=0 else -1
+            error=evaluator(i)
+            old_direction=d(error)
+            i-=old_direction
+            while True:
+                error=evaluator(i)
+                direction=d(error)
+                if direction!=old_direction:
+                    k=i-1
+                    #while direction<0 and error!=0:
+                    #    k-=1
+                    #    error=evaluator(i)
+                    #    direction=d(error)
+                    return k, evaluator(k)
+                i-=direction
+                old_direction=direction
+        searcher(i,partial(evaluate,self.filter_state,t_w))
+        self.set_sub_array(SliderArraySub(self.filter_state))
+        self.inhibit_resize-=1
+
+class SliderArraySub(QtGui.QWidget):
+    def __init__(self,filter_state,parent=None):
+        super(SliderArraySub,self).__init__(parent)
+        self.filter_state=filter_state
+        self.setLayout(QtGui.QGridLayout())
+        self.slider=[None]*len(self.filter_state.frequencies)
+        self.label=[None]*len(self.slider)
+        #self.setStyleSheet('padding: 0px; border-width: 0px; margin: 0px;')
+        #self.setStyleSheet('font-size: 7pt; font-family: monospace;'+outline%('blue'))
+        qt=QtCore.Qt
+        #self.layout().setHorizontalSpacing(1)
+        def add_slider(slider,label, c):
+            self.layout().addWidget(slider,0,c,qt.AlignHCenter)
+            self.layout().addWidget(label,1,c,qt.AlignHCenter)
+            self.layout().setColumnMinimumWidth(c,max(label.sizeHint().width(),slider.sizeHint().width()))
+        def create_slider(slider_label):
+            slider=QtGui.QSlider(QtCore.Qt.Vertical,self)
+            label=SliderLabel(slider_label,filter_state,self)
+            slider.setRange(-1000,2000)
+            slider.setSingleStep(1)
+            return (slider,label)
+        self.preamp_slider,self.preamp_label=create_slider('Preamp')
+        add_slider(self.preamp_slider,self.preamp_label,0)
+        for i,hz in enumerate(self.filter_state.frequencies):
+            slider,label=create_slider(self.hz2label(hz))
+            self.slider[i]=slider
+            #slider.setStyleSheet('font-size: 7pt; font-family: monospace;'+outline%('red',))
+            self.label[i]=label
+            c=i+1
+            add_slider(slider,label,i+1)
+    def hz2label(self, hz):
+        if hz==0:
+            label_text='DC'
+        elif hz==self.filter_state.sample_rate//2:
+            label_text='Coda'
+        else:
+            label_text=hz2str(hz)
+        return label_text
+
+    def connect_signals(self):
+        def connect(writer,reader,slider,label):
+            slider.valueChanged.connect(writer)
+            self.filter_state.readFilter.connect(reader)
+            label_cb=partial(slider.setValue,0)
+            label.clicked.connect(label_cb)
+            return label_cb
+
+        self.preamp_writer_cb=self.write_preamp
+        self.preamp_reader_cb=self.sync_preamp
+        self.preamp_label_cb=connect(self.preamp_writer_cb,
+                self.preamp_reader_cb,
+                self.preamp_slider,
+                self.preamp_label)
+        self.writer_callbacks=[None]*len(self.slider)
+        self.reader_callbacks=[None]*len(self.slider)
+        self.label_callbacks=[None]*len(self.label)
+        for i in range(len(self.slider)):
+            self.writer_callbacks[i]=partial(self.write_coefficient,i)
+            self.reader_callbacks[i]=partial(self.sync_coefficient,i)
+            self.label_callbacks[i]=connect(self.writer_callbacks[i],
+                    self.reader_callbacks[i],
+                    self.slider[i],
+                    self.label[i])
+    def disconnect_signals(self):
+        def disconnect(writer,reader,label_cb,slider,label):
+            slider.valueChanged.disconnect(writer)
+            self.filter_state.readFilter.disconnect(reader)
+            label.clicked.disconnect(label_cb)
+        disconnect(self.preamp_writer_cb, self.preamp_reader_cb,
+                self.preamp_label_cb, self.preamp_slider, self.preamp_label)
+        for i in range(len(self.slider)):
+            disconnect(self.writer_callbacks[i],
+                    self.reader_callbacks[i],
+                    self.label_callbacks[i],
+                    self.slider[i],
+                    self.label[i])
+
+    def write_preamp(self, v):
+        self.filter_state.preamp=self.slider2coef(v)
+        self.filter_state.seed()
+    def sync_preamp(self):
+        self.preamp_slider.blockSignals(True)
+        self.preamp_slider.setValue(self.coef2slider(self.filter_state.preamp))
+        self.preamp_slider.blockSignals(False)
+
+
+    def write_coefficient(self,i,v):
+        self.filter_state.coefficients[i]=self.slider2coef(v)/math.sqrt(2.0)
+        self.filter_state.seed()
+    def sync_coefficient(self,i):
+        slider=self.slider[i]
+        slider.blockSignals(True)
+        slider.setValue(self.coef2slider(math.sqrt(2.0)*self.filter_state.coefficients[i]))
+        slider.blockSignals(False)
+    @staticmethod
+    def slider2coef(x):
+        return (1.0+(x/1000.0))
+    @staticmethod
+    def coef2slider(x):
+        return int((x-1.0)*1000)
+outline='border-width: 1px; border-style: solid; border-color: %s;'
+
+class SliderLabel(QtGui.QLabel):
+    clicked=QtCore.pyqtSignal()
+    def __init__(self,label_text,filter_state,parent=None):
+        super(SliderLabel,self).__init__(parent)
+        self.setStyleSheet('font-size: 7pt; font-family: monospace;')
+        self.setText(label_text)
+        self.setMinimumSize(self.sizeHint())
+    def mouseDoubleClickEvent(self, event):
+        self.clicked.emit()
+        super(SliderLabel,self).mouseDoubleClickEvent(event)
+
+#until there are server side state savings, do it in the client but try and avoid
+#simulaneous broadcasting situations
+class FilterState(QtCore.QObject):
+    #DEFAULT_FREQUENCIES=map(float,[25,50,75,100,150,200,300,400,500,800,1e3,1.5e3,3e3,5e3,7e3,10e3,15e3,20e3])
+    DEFAULT_FREQUENCIES=[31.75,63.5,125,250,500,1e3,2e3,4e3,8e3,16e3]
+    readFilter=QtCore.pyqtSignal()
+    def __init__(self,sink):
+        super(FilterState,self).__init__()
+        self.sink_props=dbus.Interface(sink,dbus_interface=prop_iface)
+        self.sink=dbus.Interface(sink,dbus_interface=eq_iface)
+        self.sample_rate=self.get_eq_attr('SampleRate')
+        self.filter_rate=self.get_eq_attr('FilterSampleRate')
+        self.channels=self.get_eq_attr('NChannels')
+        self.channel=self.channels
+        self.set_frequency_values(self.DEFAULT_FREQUENCIES)
+        self.sync_timer=QtCore.QTimer()
+        self.sync_timer.setSingleShot(True)
+        self.sync_timer.timeout.connect(self.save_state)
+
+    def get_eq_attr(self,attr):
+        return self.sink_props.Get(eq_iface,attr)
+    def freq_proper(self,xs):
+        return [0]+xs+[self.sample_rate//2]
+    def _set_frequency_values(self,freqs):
+        self.frequencies=freqs
+        #print 'base',self.frequencies
+        self.filter_frequencies=map(lambda x: int(round(x)), \
+                self.translate_rates(self.filter_rate,self.sample_rate,
+                    self.frequencies) \
+                )
+        self.coefficients=[0.0]*len(self.frequencies)
+        self.preamp=1.0
+    def set_frequency_values(self,freqs):
+        self._set_frequency_values(self.freq_proper(freqs))
+    @staticmethod
+    def translate_rates(dst,src,rates):
+        return list(map(lambda x: x*dst/src,rates))
+    def seed(self):
+        self.sink.SeedFilter(self.channel,self.filter_frequencies,self.coefficients,self.preamp)
+        self.sync_timer.start(SYNC_TIMEOUT)
+    def readback(self):
+        coefs,preamp=self.sink.FilterAtPoints(self.channel,self.filter_frequencies)
+        self.coefficients=coefs
+        self.preamp=preamp
+        self.readFilter.emit()
+    def set_filter(self,preamp,coefs):
+        self.sink.SetFilter(self.channel,dbus.Array(coefs),self.preamp)
+        self.sync_timer.start(SYNC_TIMEOUT)
+    def save_state(self):
+        print 'saving state'
+        self.sink.SaveState()
+    def load_profile(self,profile):
+        self.sink.LoadProfile(self.channel,dbus.String(profile))
+        self.sync_timer.start(SYNC_TIMEOUT)
+    def flush_state(self):
+        if self.sync_timer.isActive():
+            self.sync_timer.stop()
+            self.save_state()
+
+
+def safe_log(k,b):
+    i=0
+    while k//b!=0:
+        i+=1
+        k=k//b
+    return i
+def hz2str(hz):
+    p=safe_log(hz,10.0)
+    if p<3:
+        return '%dHz' %(hz,)
+    elif hz%1000==0:
+        return '%dKHz' %(hz/(10.0**3),)
+    else:
+        return '%.1fKHz' %(hz/(10.0**3),)
+
+def subdivide(xs, t_points):
+    while len(xs)<t_points:
+        m=[0]*(2*len(xs)-1)
+        m[0:len(m):2]=xs
+        for i in range(1,len(m),2):
+            m[i]=(m[i-1]+m[i+1])//2
+        xs=m
+    p_drop=len(xs)-t_points
+    p_drop_left=p_drop//2
+    p_drop_right=p_drop-p_drop_left
+    #print 'xs',xs
+    #print 'dropping %d, %d left, %d right' %(p_drop,p_drop_left,p_drop_right)
+    c=len(xs)//2
+    left=xs[0:p_drop_left*2:2]+xs[p_drop_left*2:c]
+    right=list(reversed(xs[c:]))
+    right=right[0:p_drop_right*2:2]+right[p_drop_right*2:]
+    right=list(reversed(right))
+    return left+right
+
+def main():
+    dbus.mainloop.qt.DBusQtMainLoop(set_as_default=True)
+    app=QtGui.QApplication(sys.argv)
+    qpaeq_main=QPaeq()
+    qpaeq_main.show()
+    sys.exit(app.exec_())
+
+if __name__=='__main__':
+    main()

commit f5d8aef0ac5716ccddce2467efb517abf6d4335a
Author: Joe Marcus Clarke <marcus at FreeBSD.org>
Date:   Sat Nov 21 00:02:33 2009 +0100

    freebsd: fix atomic ops implementations
    
    Stole from
    
    http://www.freebsd.org/cgi/cvsweb.cgi/ports/audio/pulseaudio/files/patch-src_pulsecore_atomic.h?rev=1.6

diff --git a/src/pulsecore/atomic.h b/src/pulsecore/atomic.h
index 119c445..51d0821 100644
--- a/src/pulsecore/atomic.h
+++ b/src/pulsecore/atomic.h
@@ -180,6 +180,110 @@ static inline pa_bool_t pa_atomic_ptr_cmpxchg(pa_atomic_ptr_t *a, void *old_p, v
     return r == old_p;
 }
 
+#elif defined(__FreeBSD__)
+
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <machine/atomic.h>
+
+#if __FreeBSD_version < 600000
+#if defined(__i386__) || defined(__amd64__)
+#if defined(__amd64__)
+#define atomic_load_acq_64      atomic_load_acq_long
+#endif
+static inline u_int atomic_fetchadd_int(volatile u_int *p, u_int v) {
+    __asm __volatile(
+            "   " __XSTRING(MPLOCKED) "         "
+            "   xaddl   %0, %1 ;        "
+            "# atomic_fetchadd_int"
+            : "+r" (v),
+            "=m" (*p)
+            : "m" (*p));
+
+    return (v);
+}
+#elif defined(__sparc64__)
+#define atomic_load_acq_64      atomic_load_acq_long
+#define atomic_fetchadd_int     atomic_add_int
+#elif defined(__ia64__)
+#define atomic_load_acq_64      atomic_load_acq_long
+static inline uint32_t
+atomic_fetchadd_int(volatile uint32_t *p, uint32_t v) {
+    uint32_t value;
+
+    do {
+        value = *p;
+    } while (!atomic_cmpset_32(p, value, value + v));
+    return (value);
+}
+#endif
+#endif
+
+typedef struct pa_atomic {
+    volatile unsigned long value;
+} pa_atomic_t;
+
+#define PA_ATOMIC_INIT(v) { .value = (v) }
+
+static inline int pa_atomic_load(const pa_atomic_t *a) {
+    return (int) atomic_load_acq_int((unsigned int *) &a->value);
+}
+
+static inline void pa_atomic_store(pa_atomic_t *a, int i) {
+    atomic_store_rel_int((unsigned int *) &a->value, i);
+}
+
+static inline int pa_atomic_add(pa_atomic_t *a, int i) {
+    return atomic_fetchadd_int((unsigned int *) &a->value, i);
+}
+
+static inline int pa_atomic_sub(pa_atomic_t *a, int i) {
+    return atomic_fetchadd_int((unsigned int *) &a->value, -(i));
+}
+
+static inline int pa_atomic_inc(pa_atomic_t *a) {
+    return atomic_fetchadd_int((unsigned int *) &a->value, 1);
+}
+
+static inline int pa_atomic_dec(pa_atomic_t *a) {
+    return atomic_fetchadd_int((unsigned int *) &a->value, -1);
+}
+
+static inline int pa_atomic_cmpxchg(pa_atomic_t *a, int old_i, int new_i) {
+    return atomic_cmpset_int((unsigned int *) &a->value, old_i, new_i);
+}
+
+typedef struct pa_atomic_ptr {
+    volatile unsigned long value;
+} pa_atomic_ptr_t;
+
+#define PA_ATOMIC_PTR_INIT(v) { .value = (unsigned long) (v) }
+
+static inline void* pa_atomic_ptr_load(const pa_atomic_ptr_t *a) {
+#ifdef atomic_load_acq_64
+    return (void*) atomic_load_acq_ptr((unsigned long *) &a->value);
+#else
+    return (void*) atomic_load_acq_ptr((unsigned int *) &a->value);
+#endif
+}
+
+static inline void pa_atomic_ptr_store(pa_atomic_ptr_t *a, void *p) {
+#ifdef atomic_load_acq_64
+    atomic_store_rel_ptr(&a->value, (unsigned long) p);
+#else
+    atomic_store_rel_ptr((unsigned int *) &a->value, (unsigned int) p);
+#endif
+}
+
+static inline int pa_atomic_ptr_cmpxchg(pa_atomic_ptr_t *a, void *old_p, void* new_p) {
+#ifdef atomic_load_acq_64
+    return atomic_cmpset_ptr(&a->value, (unsigned long) old_p, (unsigned long) new_p);
+#else
+    return atomic_cmpset_ptr((unsigned int *) &a->value, (unsigned int) old_p, (unsigned int) new_p);
+#endif
+}
+
 #elif defined(__GNUC__) && (defined(__amd64__) || defined(__x86_64__))
 
 #warn "The native atomic operations implementation for AMD64 has not been tested thoroughly. libatomic_ops is known to not work properly on AMD64 and your gcc version is too old for the gcc-builtin atomic ops support. You have three options now: test the native atomic operations implementation for AMD64, fix libatomic_ops, or upgrade your GCC."

commit fc4cf275696c05345ae2e609eac1ad3b05570ca1
Merge: f5d8aef 41853cc
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sat Nov 21 00:05:02 2009 +0100

    Merge remote branch 'phish3/master'


commit 77c6b696560f460e74af85d069863e8337e99d33
Author: Jason Newton <nevion at gmail.com>
Date:   Fri Nov 20 15:07:47 2009 -0800

    remove .py extension from qpaeq

diff --git a/src/utils/qpaeq.py b/src/utils/qpaeq
similarity index 100%
rename from src/utils/qpaeq.py
rename to src/utils/qpaeq

commit 40aee60bfaed1875cd5f1a1d03c5babac3999b14
Merge: 5150a10 fc4cf27
Author: Diego Elio 'Flameeyes' Pettenò <flameeyes at gmail.com>
Date:   Sat Nov 21 00:10:37 2009 +0100

    Merge branch 'master' of git://git.0pointer.de/pulseaudio


commit ca637e5ba42b7f667ade252cc8b21085e6e13967
Author: Diego Elio 'Flameeyes' Pettenò <flameeyes at gmail.com>
Date:   Sat Nov 21 00:17:33 2009 +0100

    Simplify handling of NetBSD atomic ops discovery.
    
    Instead of having a parameter to enable/disable them (which was also
    ignored by the source code side), simply identify NetBSD 5 (when the atomic
    ops were implemented the first time) in a $host switch and ignore checking
    for libatomic_ops.

diff --git a/configure.ac b/configure.ac
index fdc6662..7c52766 100644
--- a/configure.ac
+++ b/configure.ac
@@ -166,27 +166,12 @@ AC_ARG_ENABLE([atomic-arm-memory-barrier],
             esac
         ],)
 
-AC_ARG_ENABLE([netbsd-atomic-ops],
-    AS_HELP_STRING([--enable-netbsd-atomic-ops],[Use the native NetBSD atomic_ops implementation]),
-        [
-            case "${enableval}" in
-                yes) atomic_netbsd_helpers=yes ;;
-                no) atomic_netbsd_helpers=no ;;
-                *) AC_MSG_ERROR(bad value ${enableval} for --enable-netbsd-atomic-ops) ;;
-            esac
-        ],
-        [atomic_netbsd_helpers=auto])
-
 AC_MSG_CHECKING([target operating system])
 case $host in
         *-*-linux*)
             AC_MSG_RESULT([linux])
             pulse_target_os=linux
         ;;
-        *-*-netbsd*)
-            AC_MSG_RESULT([netbsd])
-            pulse_target_os=netbsd
-        ;;
         *)
             AC_MSG_RESULT([unknown])
             pulse_target_os=unknown
@@ -210,7 +195,7 @@ if test "$pulseaudio_cv_sync_bool_compare_and_swap" = "yes" ; then
 else
     # HW specific atomic ops stuff
     AC_MSG_CHECKING([architecture for native atomic operations])
-    case $host_cpu in
+    case $host in
         arm*)
             AC_MSG_RESULT([arm])
             AC_MSG_CHECKING([whether we can use Linux kernel helpers])
@@ -246,14 +231,12 @@ else
                  ])
            fi
         ;;
+	*-netbsdelf5*)
+            AC_MSG_RESULT([yes])
+            need_libatomic_ops=no
+	;;
         *)
-            if test "x$pulse_target_os" = "xnetbsd" && test "x$atomic_netbsd_helpers" = "xyes"; then
-                AC_MSG_RESULT([yes])
-                AC_DEFINE_UNQUOTED(NETBSD_ATOMIC_OPS, 1, [netbsd implementation])
-                need_libatomic_ops=no
-            else
-                AC_MSG_RESULT([unknown])
-            fi
+            AC_MSG_RESULT([unknown])
         ;;
     esac
 fi

commit 2caf59d49f9879831f93a181dc9c03841287cdd2
Author: Diego Elio 'Flameeyes' Pettenò <flameeyes at gmail.com>
Date:   Sat Nov 21 00:27:35 2009 +0100

    Since now we have FreeBSD atomic operations, don't require libatomic_ops.
    
    This lets the original configure script to pass on FreeBSD.

diff --git a/configure.ac b/configure.ac
index 7c52766..dfbd9bc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -235,6 +235,10 @@ else
             AC_MSG_RESULT([yes])
             need_libatomic_ops=no
 	;;
+	*-freebsd*)
+            AC_MSG_RESULT([yes])
+            need_libatomic_ops=no
+	;;
         *)
             AC_MSG_RESULT([unknown])
         ;;

commit d963998676397e14cfd0fa04e98cdca21abed4ef
Author: Diego Elio 'Flameeyes' Pettenò <flameeyes at gmail.com>
Date:   Sat Nov 21 00:30:46 2009 +0100

    Rename all the signal parameters and variables to something more explicit.
    
    Without this change, on FreeBSD you'll be bothered by tons of warnings
    about overshadowing signal(2).

diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card.c
index 1714df3..d99c8b9 100644
--- a/src/modules/dbus/iface-card.c
+++ b/src/modules/dbus/iface-card.c
@@ -452,7 +452,7 @@ static void handle_get_profile_by_name(DBusConnection *conn, DBusMessage *msg, v
 
 static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
     pa_dbusiface_card *c = userdata;
-    DBusMessage *signal = NULL;
+    DBusMessage *signal_msg = NULL;
 
     pa_assert(core);
     pa_assert((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_CARD);
@@ -472,14 +472,14 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
         c->active_profile = c->card->active_profile;
         object_path = pa_dbusiface_card_profile_get_path(pa_hashmap_get(c->profiles, c->active_profile->name));
 
-        pa_assert_se(signal = dbus_message_new_signal(c->path,
-                                                      PA_DBUSIFACE_CARD_INTERFACE,
-                                                      signals[SIGNAL_ACTIVE_PROFILE_UPDATED].name));
-        pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+        pa_assert_se(signal_msg = dbus_message_new_signal(c->path,
+							  PA_DBUSIFACE_CARD_INTERFACE,
+							  signals[SIGNAL_ACTIVE_PROFILE_UPDATED].name));
+        pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
-        pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
-        dbus_message_unref(signal);
-        signal = NULL;
+        pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg);
+        dbus_message_unref(signal_msg);
+        signal_msg = NULL;
     }
 
     if (!pa_proplist_equal(c->proplist, c->card->proplist)) {
@@ -487,15 +487,15 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
         pa_proplist_update(c->proplist, PA_UPDATE_SET, c->card->proplist);
 
-        pa_assert_se(signal = dbus_message_new_signal(c->path,
-                                                      PA_DBUSIFACE_CARD_INTERFACE,
-                                                      signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
-        dbus_message_iter_init_append(signal, &msg_iter);
+        pa_assert_se(signal_msg = dbus_message_new_signal(c->path,
+							  PA_DBUSIFACE_CARD_INTERFACE,
+							  signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+        dbus_message_iter_init_append(signal_msg, &msg_iter);
         pa_dbus_append_proplist(&msg_iter, c->proplist);
 
-        pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
-        dbus_message_unref(signal);
-        signal = NULL;
+        pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg);
+        dbus_message_unref(signal_msg);
+        signal_msg = NULL;
     }
 }
 
diff --git a/src/modules/dbus/iface-client.c b/src/modules/dbus/iface-client.c
index 546370f..3192448 100644
--- a/src/modules/dbus/iface-client.c
+++ b/src/modules/dbus/iface-client.c
@@ -391,7 +391,7 @@ static void handle_remove_properties(DBusConnection *conn, DBusMessage *msg, voi
 
 static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
     pa_dbusiface_client *c = userdata;
-    DBusMessage *signal = NULL;
+    DBusMessage *signal_msg = NULL;
 
     pa_assert(core);
     pa_assert((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_CLIENT);
@@ -410,15 +410,15 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
         pa_proplist_update(c->proplist, PA_UPDATE_SET, c->client->proplist);
 
-        pa_assert_se(signal = dbus_message_new_signal(c->path,
-                                                      PA_DBUSIFACE_CLIENT_INTERFACE,
-                                                      signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
-        dbus_message_iter_init_append(signal, &msg_iter);
+        pa_assert_se(signal_msg = dbus_message_new_signal(c->path,
+							  PA_DBUSIFACE_CLIENT_INTERFACE,
+							  signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+        dbus_message_iter_init_append(signal_msg, &msg_iter);
         pa_dbus_append_proplist(&msg_iter, c->proplist);
 
-        pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
-        dbus_message_unref(signal);
-        signal = NULL;
+        pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg);
+        dbus_message_unref(signal_msg);
+        signal_msg = NULL;
     }
 }
 
diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index 169e8e5..497b59b 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -1488,7 +1488,7 @@ static void handle_exit(DBusConnection *conn, DBusMessage *msg, void *userdata)
 
 static void handle_listen_for_signal(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_dbusiface_core *c = userdata;
-    const char *signal;
+    const char *signal_str;
     char **objects = NULL;
     int n_objects;
 
@@ -1497,11 +1497,11 @@ static void handle_listen_for_signal(DBusConnection *conn, DBusMessage *msg, voi
     pa_assert(c);
 
     pa_assert_se(dbus_message_get_args(msg, NULL,
-                                       DBUS_TYPE_STRING, &signal,
+                                       DBUS_TYPE_STRING, &signal_str,
                                        DBUS_TYPE_ARRAY, DBUS_TYPE_OBJECT_PATH, &objects, &n_objects,
                                        DBUS_TYPE_INVALID));
 
-    pa_dbus_protocol_add_signal_listener(c->dbus_protocol, conn, *signal ? signal : NULL, objects, n_objects);
+    pa_dbus_protocol_add_signal_listener(c->dbus_protocol, conn, *signal_str ? signal_str : NULL, objects, n_objects);
 
     pa_dbus_send_empty_reply(conn, msg);
 
@@ -1510,15 +1510,15 @@ static void handle_listen_for_signal(DBusConnection *conn, DBusMessage *msg, voi
 
 static void handle_stop_listening_for_signal(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_dbusiface_core *c = userdata;
-    const char *signal;
+    const char *signal_str;
 
     pa_assert(conn);
     pa_assert(msg);
     pa_assert(c);
 
-    pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &signal, DBUS_TYPE_INVALID));
+    pa_assert_se(dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &signal_str, DBUS_TYPE_INVALID));
 
-    pa_dbus_protocol_remove_signal_listener(c->dbus_protocol, conn, *signal ? signal : NULL);
+    pa_dbus_protocol_remove_signal_listener(c->dbus_protocol, conn, *signal_str ? signal_str : NULL);
 
     pa_dbus_send_empty_reply(conn, msg);
 }
@@ -1531,7 +1531,7 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
     pa_dbusiface_sample *sample_iface = NULL;
     pa_dbusiface_module *module_iface = NULL;
     pa_dbusiface_client *client_iface = NULL;
-    DBusMessage *signal = NULL;
+    DBusMessage *signal_msg = NULL;
     const char *object_path = NULL;
     pa_sink *new_fallback_sink = NULL;
     pa_source *new_fallback_source = NULL;
@@ -1552,21 +1552,21 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                     && (device_iface = pa_hashmap_get(c->sinks_by_index, PA_UINT32_TO_PTR(new_fallback_sink->index)))) {
                     object_path = pa_dbusiface_device_get_path(device_iface);
 
-                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                                   PA_DBUS_CORE_INTERFACE,
-                                                                   signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
-                    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
-                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
-                    dbus_message_unref(signal);
-                    signal = NULL;
+                    pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								       PA_DBUS_CORE_INTERFACE,
+								       signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
+                    pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg);
+                    dbus_message_unref(signal_msg);
+                    signal_msg = NULL;
 
                 } else if (!new_fallback_sink) {
-                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                                   PA_DBUS_CORE_INTERFACE,
-                                                                   signals[SIGNAL_FALLBACK_SINK_UNSET].name)));
-                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
-                    dbus_message_unref(signal);
-                    signal = NULL;
+                    pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								       PA_DBUS_CORE_INTERFACE,
+								       signals[SIGNAL_FALLBACK_SINK_UNSET].name)));
+                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg);
+                    dbus_message_unref(signal_msg);
+                    signal_msg = NULL;
                 }
             }
 
@@ -1579,21 +1579,21 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                     && (device_iface = pa_hashmap_get(c->sources_by_index, PA_UINT32_TO_PTR(new_fallback_source->index)))) {
                     object_path = pa_dbusiface_device_get_path(device_iface);
 
-                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                                   PA_DBUS_CORE_INTERFACE,
-                                                                   signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
-                    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
-                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
-                    dbus_message_unref(signal);
-                    signal = NULL;
+                    pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								       PA_DBUS_CORE_INTERFACE,
+								       signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
+                    pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg);
+                    dbus_message_unref(signal_msg);
+                    signal_msg = NULL;
 
                 } else if (!new_fallback_source) {
-                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                                   PA_DBUS_CORE_INTERFACE,
-                                                                   signals[SIGNAL_FALLBACK_SOURCE_UNSET].name)));
-                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
-                    dbus_message_unref(signal);
-                    signal = NULL;
+                    pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								       PA_DBUS_CORE_INTERFACE,
+								       signals[SIGNAL_FALLBACK_SOURCE_UNSET].name)));
+                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg);
+                    dbus_message_unref(signal_msg);
+                    signal_msg = NULL;
                 }
             }
             break;
@@ -1612,10 +1612,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_card_get_path(card_iface);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                               PA_DBUS_CORE_INTERFACE,
-                                                               signals[SIGNAL_NEW_CARD].name)));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								   PA_DBUS_CORE_INTERFACE,
+								   signals[SIGNAL_NEW_CARD].name)));
+                pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
                 if (!(card_iface = pa_hashmap_remove(c->cards, PA_UINT32_TO_PTR(idx))))
@@ -1623,10 +1623,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_card_get_path(card_iface);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                               PA_DBUS_CORE_INTERFACE,
-                                                               signals[SIGNAL_CARD_REMOVED].name)));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								   PA_DBUS_CORE_INTERFACE,
+								   signals[SIGNAL_CARD_REMOVED].name)));
+                pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_card_free(card_iface);
             }
@@ -1647,28 +1647,28 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_device_get_path(device_iface);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                               PA_DBUS_CORE_INTERFACE,
-                                                               signals[SIGNAL_NEW_SINK].name)));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								   PA_DBUS_CORE_INTERFACE,
+								   signals[SIGNAL_NEW_SINK].name)));
+                pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
-                pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
-                dbus_message_unref(signal);
-                signal = NULL;
+                pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg);
+                dbus_message_unref(signal_msg);
+                signal_msg = NULL;
 
                 if (c->fallback_sink && pa_streq(c->fallback_sink->name, sink->name)) {
                     /* We have got default sink change event, but at that point
                      * the D-Bus sink object wasn't created yet. Now that the
                      * object is created, let's send the fallback sink change
                      * signal. */
-                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                                   PA_DBUS_CORE_INTERFACE,
-                                                                   signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
-                    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
-
-                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
-                    dbus_message_unref(signal);
-                    signal = NULL;
+                    pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								       PA_DBUS_CORE_INTERFACE,
+								       signals[SIGNAL_FALLBACK_SINK_UPDATED].name)));
+                    pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg);
+                    dbus_message_unref(signal_msg);
+                    signal_msg = NULL;
                 }
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1678,10 +1678,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 object_path = pa_dbusiface_device_get_path(device_iface);
                 pa_assert_se(pa_hashmap_remove(c->sinks_by_path, object_path));
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                               PA_DBUS_CORE_INTERFACE,
-                                                               signals[SIGNAL_SINK_REMOVED].name)));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								   PA_DBUS_CORE_INTERFACE,
+								   signals[SIGNAL_SINK_REMOVED].name)));
+                pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_device_free(device_iface);
             }
@@ -1702,28 +1702,28 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_device_get_path(device_iface);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                               PA_DBUS_CORE_INTERFACE,
-                                                               signals[SIGNAL_NEW_SOURCE].name)));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								   PA_DBUS_CORE_INTERFACE,
+								   signals[SIGNAL_NEW_SOURCE].name)));
+                pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
-                pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
-                dbus_message_unref(signal);
-                signal = NULL;
+                pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg);
+                dbus_message_unref(signal_msg);
+                signal_msg = NULL;
 
                 if (c->fallback_source && pa_streq(c->fallback_source->name, source->name)) {
                     /* We have got default source change event, but at that
                      * point the D-Bus source object wasn't created yet. Now
                      * that the object is created, let's send the fallback
                      * source change signal. */
-                    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                                   PA_DBUS_CORE_INTERFACE,
-                                                                   signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
-                    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
-
-                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
-                    dbus_message_unref(signal);
-                    signal = NULL;
+                    pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								       PA_DBUS_CORE_INTERFACE,
+								       signals[SIGNAL_FALLBACK_SOURCE_UPDATED].name)));
+                    pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+
+                    pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg);
+                    dbus_message_unref(signal_msg);
+                    signal_msg = NULL;
                 }
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
@@ -1733,10 +1733,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
                 object_path = pa_dbusiface_device_get_path(device_iface);
                 pa_assert_se(pa_hashmap_remove(c->sources_by_path, object_path));
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                               PA_DBUS_CORE_INTERFACE,
-                                                               signals[SIGNAL_SOURCE_REMOVED].name)));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								   PA_DBUS_CORE_INTERFACE,
+								   signals[SIGNAL_SOURCE_REMOVED].name)));
+                pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_device_free(device_iface);
             }
@@ -1756,10 +1756,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_stream_get_path(stream_iface);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                               PA_DBUS_CORE_INTERFACE,
-                                                               signals[SIGNAL_NEW_PLAYBACK_STREAM].name)));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								   PA_DBUS_CORE_INTERFACE,
+								   signals[SIGNAL_NEW_PLAYBACK_STREAM].name)));
+                pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
                 if (!(stream_iface = pa_hashmap_remove(c->playback_streams, PA_UINT32_TO_PTR(idx))))
@@ -1767,10 +1767,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_stream_get_path(stream_iface);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                               PA_DBUS_CORE_INTERFACE,
-                                                               signals[SIGNAL_PLAYBACK_STREAM_REMOVED].name)));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								   PA_DBUS_CORE_INTERFACE,
+								   signals[SIGNAL_PLAYBACK_STREAM_REMOVED].name)));
+                pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_stream_free(stream_iface);
             }
@@ -1790,10 +1790,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_stream_get_path(stream_iface);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                               PA_DBUS_CORE_INTERFACE,
-                                                               signals[SIGNAL_NEW_RECORD_STREAM].name)));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								   PA_DBUS_CORE_INTERFACE,
+								   signals[SIGNAL_NEW_RECORD_STREAM].name)));
+                pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
                 if (!(stream_iface = pa_hashmap_remove(c->record_streams, PA_UINT32_TO_PTR(idx))))
@@ -1801,10 +1801,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_stream_get_path(stream_iface);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                               PA_DBUS_CORE_INTERFACE,
-                                                               signals[SIGNAL_RECORD_STREAM_REMOVED].name)));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								   PA_DBUS_CORE_INTERFACE,
+								   signals[SIGNAL_RECORD_STREAM_REMOVED].name)));
+                pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_stream_free(stream_iface);
             }
@@ -1824,10 +1824,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_sample_get_path(sample_iface);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                               PA_DBUS_CORE_INTERFACE,
-                                                               signals[SIGNAL_NEW_SAMPLE].name)));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								   PA_DBUS_CORE_INTERFACE,
+								   signals[SIGNAL_NEW_SAMPLE].name)));
+                pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
                 if (!(sample_iface = pa_hashmap_remove(c->samples, PA_UINT32_TO_PTR(idx))))
@@ -1835,10 +1835,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_sample_get_path(sample_iface);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                               PA_DBUS_CORE_INTERFACE,
-                                                               signals[SIGNAL_SAMPLE_REMOVED].name)));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								   PA_DBUS_CORE_INTERFACE,
+								   signals[SIGNAL_SAMPLE_REMOVED].name)));
+                pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_sample_free(sample_iface);
             }
@@ -1858,10 +1858,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_module_get_path(module_iface);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                               PA_DBUS_CORE_INTERFACE,
-                                                               signals[SIGNAL_NEW_MODULE].name)));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								   PA_DBUS_CORE_INTERFACE,
+								   signals[SIGNAL_NEW_MODULE].name)));
+                pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
                 if (!(module_iface = pa_hashmap_remove(c->modules, PA_UINT32_TO_PTR(idx))))
@@ -1869,10 +1869,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_module_get_path(module_iface);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                               PA_DBUS_CORE_INTERFACE,
-                                                               signals[SIGNAL_MODULE_REMOVED].name)));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								   PA_DBUS_CORE_INTERFACE,
+								   signals[SIGNAL_MODULE_REMOVED].name)));
+                pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_module_free(module_iface);
             }
@@ -1892,10 +1892,10 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_client_get_path(client_iface);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                               PA_DBUS_CORE_INTERFACE,
-                                                               signals[SIGNAL_NEW_CLIENT].name)));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								   PA_DBUS_CORE_INTERFACE,
+								   signals[SIGNAL_NEW_CLIENT].name)));
+                pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
             } else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_REMOVE) {
                 if (!(client_iface = pa_hashmap_remove(c->clients, PA_UINT32_TO_PTR(idx))))
@@ -1903,37 +1903,37 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
                 object_path = pa_dbusiface_client_get_path(client_iface);
 
-                pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                               PA_DBUS_CORE_INTERFACE,
-                                                               signals[SIGNAL_CLIENT_REMOVED].name)));
-                pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+                pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+								   PA_DBUS_CORE_INTERFACE,
+								   signals[SIGNAL_CLIENT_REMOVED].name)));
+                pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
                 pa_dbusiface_client_free(client_iface);
             }
             break;
     }
 
-    if (signal) {
-        pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
-        dbus_message_unref(signal);
+    if (signal_msg) {
+        pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg);
+        dbus_message_unref(signal_msg);
     }
 }
 
 static pa_hook_result_t extension_registered_cb(void *hook_data, void *call_data, void *slot_data) {
     pa_dbusiface_core *c = slot_data;
     const char *ext_name = call_data;
-    DBusMessage *signal = NULL;
+    DBusMessage *signal_msg = NULL;
 
     pa_assert(c);
     pa_assert(ext_name);
 
-    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                   PA_DBUS_CORE_INTERFACE,
-                                                   signals[SIGNAL_NEW_EXTENSION].name)));
-    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_STRING, &ext_name, DBUS_TYPE_INVALID));
+    pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+						       PA_DBUS_CORE_INTERFACE,
+						       signals[SIGNAL_NEW_EXTENSION].name)));
+    pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_STRING, &ext_name, DBUS_TYPE_INVALID));
 
-    pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
-    dbus_message_unref(signal);
+    pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg);
+    dbus_message_unref(signal_msg);
 
     return PA_HOOK_OK;
 }
@@ -1941,18 +1941,18 @@ static pa_hook_result_t extension_registered_cb(void *hook_data, void *call_data
 static pa_hook_result_t extension_unregistered_cb(void *hook_data, void *call_data, void *slot_data) {
     pa_dbusiface_core *c = slot_data;
     const char *ext_name = call_data;
-    DBusMessage *signal = NULL;
+    DBusMessage *signal_msg = NULL;
 
     pa_assert(c);
     pa_assert(ext_name);
 
-    pa_assert_se((signal = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
-                                                   PA_DBUS_CORE_INTERFACE,
-                                                   signals[SIGNAL_EXTENSION_REMOVED].name)));
-    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_STRING, &ext_name, DBUS_TYPE_INVALID));
+    pa_assert_se((signal_msg = dbus_message_new_signal(PA_DBUS_CORE_OBJECT_PATH,
+						       PA_DBUS_CORE_INTERFACE,
+						       signals[SIGNAL_EXTENSION_REMOVED].name)));
+    pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_STRING, &ext_name, DBUS_TYPE_INVALID));
 
-    pa_dbus_protocol_send_signal(c->dbus_protocol, signal);
-    dbus_message_unref(signal);
+    pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg);
+    dbus_message_unref(signal_msg);
 
     return PA_HOOK_OK;
 }
diff --git a/src/modules/dbus/iface-device.c b/src/modules/dbus/iface-device.c
index 3a747a4..bb91d71 100644
--- a/src/modules/dbus/iface-device.c
+++ b/src/modules/dbus/iface-device.c
@@ -1063,7 +1063,7 @@ static void handle_source_get_all(DBusConnection *conn, DBusMessage *msg, void *
 
 static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
     pa_dbusiface_device *d = userdata;
-    DBusMessage *signal = NULL;
+    DBusMessage *signal_msg = NULL;
     const pa_cvolume *new_volume = NULL;
     pa_bool_t new_mute = FALSE;
     pa_sink_state_t new_sink_state = 0;
@@ -1099,16 +1099,16 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
         for (i = 0; i < d->volume.channels; ++i)
             volume[i] = d->volume.values[i];
 
-        pa_assert_se(signal = dbus_message_new_signal(d->path,
-                                                      PA_DBUSIFACE_DEVICE_INTERFACE,
-                                                      signals[SIGNAL_VOLUME_UPDATED].name));
-        pa_assert_se(dbus_message_append_args(signal,
+        pa_assert_se(signal_msg = dbus_message_new_signal(d->path,
+							  PA_DBUSIFACE_DEVICE_INTERFACE,
+							  signals[SIGNAL_VOLUME_UPDATED].name));
+        pa_assert_se(dbus_message_append_args(signal_msg,
                                               DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &volume_ptr, d->volume.channels,
                                               DBUS_TYPE_INVALID));
 
-        pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
-        dbus_message_unref(signal);
-        signal = NULL;
+        pa_dbus_protocol_send_signal(d->dbus_protocol, signal_msg);
+        dbus_message_unref(signal_msg);
+        signal_msg = NULL;
     }
 
     new_mute = (d->type == DEVICE_TYPE_SINK) ? pa_sink_get_mute(d->sink, FALSE) : pa_source_get_mute(d->source, FALSE);
@@ -1116,14 +1116,14 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
     if (d->mute != new_mute) {
         d->mute = new_mute;
 
-        pa_assert_se(signal = dbus_message_new_signal(d->path,
-                                                      PA_DBUSIFACE_DEVICE_INTERFACE,
-                                                      signals[SIGNAL_MUTE_UPDATED].name));
-        pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_BOOLEAN, &d->mute, DBUS_TYPE_INVALID));
+        pa_assert_se(signal_msg = dbus_message_new_signal(d->path,
+							  PA_DBUSIFACE_DEVICE_INTERFACE,
+							  signals[SIGNAL_MUTE_UPDATED].name));
+        pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_BOOLEAN, &d->mute, DBUS_TYPE_INVALID));
 
-        pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
-        dbus_message_unref(signal);
-        signal = NULL;
+        pa_dbus_protocol_send_signal(d->dbus_protocol, signal_msg);
+        dbus_message_unref(signal_msg);
+        signal_msg = NULL;
     }
 
     if (d->type == DEVICE_TYPE_SINK)
@@ -1142,14 +1142,14 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
 
         state = (d->type == DEVICE_TYPE_SINK) ? d->sink_state : d->source_state;
 
-        pa_assert_se(signal = dbus_message_new_signal(d->path,
-                                                      PA_DBUSIFACE_DEVICE_INTERFACE,
-                                                      signals[SIGNAL_STATE_UPDATED].name));
-        pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_UINT32, &state, DBUS_TYPE_INVALID));
+        pa_assert_se(signal_msg = dbus_message_new_signal(d->path,
+							  PA_DBUSIFACE_DEVICE_INTERFACE,
+							  signals[SIGNAL_STATE_UPDATED].name));
+        pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_UINT32, &state, DBUS_TYPE_INVALID));
 
-        pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
-        dbus_message_unref(signal);
-        signal = NULL;
+        pa_dbus_protocol_send_signal(d->dbus_protocol, signal_msg);
+        dbus_message_unref(signal_msg);
+        signal_msg = NULL;
     }
 
     new_active_port = (d->type == DEVICE_TYPE_SINK) ? d->sink->active_port : d->source->active_port;
@@ -1160,14 +1160,14 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
         d->active_port = new_active_port;
         object_path = pa_dbusiface_device_port_get_path(pa_hashmap_get(d->ports, d->active_port->name));
 
-        pa_assert_se(signal = dbus_message_new_signal(d->path,
-                                                      PA_DBUSIFACE_DEVICE_INTERFACE,
-                                                      signals[SIGNAL_ACTIVE_PORT_UPDATED].name));
-        pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
+        pa_assert_se(signal_msg = dbus_message_new_signal(d->path,
+							  PA_DBUSIFACE_DEVICE_INTERFACE,
+							  signals[SIGNAL_ACTIVE_PORT_UPDATED].name));
+        pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path, DBUS_TYPE_INVALID));
 
-        pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
-        dbus_message_unref(signal);
-        signal = NULL;
+        pa_dbus_protocol_send_signal(d->dbus_protocol, signal_msg);
+        dbus_message_unref(signal_msg);
+        signal_msg = NULL;
     }
 
     new_proplist = (d->type == DEVICE_TYPE_SINK) ? d->sink->proplist : d->source->proplist;
@@ -1177,15 +1177,15 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
 
         pa_proplist_update(d->proplist, PA_UPDATE_SET, new_proplist);
 
-        pa_assert_se(signal = dbus_message_new_signal(d->path,
-                                                      PA_DBUSIFACE_DEVICE_INTERFACE,
-                                                      signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
-        dbus_message_iter_init_append(signal, &msg_iter);
+        pa_assert_se(signal_msg = dbus_message_new_signal(d->path,
+							  PA_DBUSIFACE_DEVICE_INTERFACE,
+							  signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+        dbus_message_iter_init_append(signal_msg, &msg_iter);
         pa_dbus_append_proplist(&msg_iter, d->proplist);
 
-        pa_dbus_protocol_send_signal(d->dbus_protocol, signal);
-        dbus_message_unref(signal);
-        signal = NULL;
+        pa_dbus_protocol_send_signal(d->dbus_protocol, signal_msg);
+        dbus_message_unref(signal_msg);
+        signal_msg = NULL;
     }
 }
 
diff --git a/src/modules/dbus/iface-module.c b/src/modules/dbus/iface-module.c
index e8aea50..9973166 100644
--- a/src/modules/dbus/iface-module.c
+++ b/src/modules/dbus/iface-module.c
@@ -268,7 +268,7 @@ static void handle_unload(DBusConnection *conn, DBusMessage *msg, void *userdata
 
 static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
     pa_dbusiface_module *m = userdata;
-    DBusMessage *signal = NULL;
+    DBusMessage *signal_msg = NULL;
 
     pa_assert(core);
     pa_assert((t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) == PA_SUBSCRIPTION_EVENT_MODULE);
@@ -287,15 +287,15 @@ static void subscription_cb(pa_core *core, pa_subscription_event_type_t t, uint3
 
         pa_proplist_update(m->proplist, PA_UPDATE_SET, m->module->proplist);
 
-        pa_assert_se(signal = dbus_message_new_signal(m->path,
-                                                      PA_DBUSIFACE_MODULE_INTERFACE,
-                                                      signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
-        dbus_message_iter_init_append(signal, &msg_iter);
+        pa_assert_se(signal_msg = dbus_message_new_signal(m->path,
+							  PA_DBUSIFACE_MODULE_INTERFACE,
+							  signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+        dbus_message_iter_init_append(signal_msg, &msg_iter);
         pa_dbus_append_proplist(&msg_iter, m->proplist);
 
-        pa_dbus_protocol_send_signal(m->dbus_protocol, signal);
-        dbus_message_unref(signal);
-        signal = NULL;
+        pa_dbus_protocol_send_signal(m->dbus_protocol, signal_msg);
+        dbus_message_unref(signal_msg);
+        signal_msg = NULL;
     }
 }
 
diff --git a/src/modules/dbus/iface-sample.c b/src/modules/dbus/iface-sample.c
index b0542a6..c1fa193 100644
--- a/src/modules/dbus/iface-sample.c
+++ b/src/modules/dbus/iface-sample.c
@@ -450,7 +450,7 @@ static void handle_remove(DBusConnection *conn, DBusMessage *msg, void *userdata
 
 static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
     pa_dbusiface_sample *s = userdata;
-    DBusMessage *signal = NULL;
+    DBusMessage *signal_msg = NULL;
 
     pa_assert(c);
     pa_assert(s);
@@ -468,15 +468,15 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
 
         pa_proplist_update(s->proplist, PA_UPDATE_SET, s->sample->proplist);
 
-        pa_assert_se(signal = dbus_message_new_signal(s->path,
-                                                      PA_DBUSIFACE_SAMPLE_INTERFACE,
-                                                      signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
-        dbus_message_iter_init_append(signal, &msg_iter);
+        pa_assert_se(signal_msg = dbus_message_new_signal(s->path,
+							  PA_DBUSIFACE_SAMPLE_INTERFACE,
+							  signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+        dbus_message_iter_init_append(signal_msg, &msg_iter);
         pa_dbus_append_proplist(&msg_iter, s->proplist);
 
-        pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
-        dbus_message_unref(signal);
-        signal = NULL;
+        pa_dbus_protocol_send_signal(s->dbus_protocol, signal_msg);
+        dbus_message_unref(signal_msg);
+        signal_msg = NULL;
     }
 }
 
diff --git a/src/modules/dbus/iface-stream.c b/src/modules/dbus/iface-stream.c
index 04a45e6..0255be4 100644
--- a/src/modules/dbus/iface-stream.c
+++ b/src/modules/dbus/iface-stream.c
@@ -632,7 +632,7 @@ static void handle_kill(DBusConnection *conn, DBusMessage *msg, void *userdata)
 
 static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
     pa_dbusiface_stream *s = userdata;
-    DBusMessage *signal = NULL;
+    DBusMessage *signal_msg = NULL;
     const char *new_device_path = NULL;
     uint32_t new_sample_rate = 0;
     pa_proplist *new_proplist = NULL;
@@ -662,14 +662,14 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
 
             new_device_path = pa_dbusiface_core_get_sink_path(s->core, new_sink);
 
-            pa_assert_se(signal = dbus_message_new_signal(s->path,
-                                                          PA_DBUSIFACE_STREAM_INTERFACE,
-                                                          signals[SIGNAL_DEVICE_UPDATED].name));
-            pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &new_device_path, DBUS_TYPE_INVALID));
+            pa_assert_se(signal_msg = dbus_message_new_signal(s->path,
+							      PA_DBUSIFACE_STREAM_INTERFACE,
+							      signals[SIGNAL_DEVICE_UPDATED].name));
+            pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &new_device_path, DBUS_TYPE_INVALID));
 
-            pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
-            dbus_message_unref(signal);
-            signal = NULL;
+            pa_dbus_protocol_send_signal(s->dbus_protocol, signal_msg);
+            dbus_message_unref(signal_msg);
+            signal_msg = NULL;
         }
     } else {
         pa_source *new_source = s->source_output->source;
@@ -680,14 +680,14 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
 
             new_device_path = pa_dbusiface_core_get_source_path(s->core, new_source);
 
-            pa_assert_se(signal = dbus_message_new_signal(s->path,
-                                                          PA_DBUSIFACE_STREAM_INTERFACE,
-                                                          signals[SIGNAL_DEVICE_UPDATED].name));
-            pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &new_device_path, DBUS_TYPE_INVALID));
+            pa_assert_se(signal_msg = dbus_message_new_signal(s->path,
+							      PA_DBUSIFACE_STREAM_INTERFACE,
+							      signals[SIGNAL_DEVICE_UPDATED].name));
+            pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &new_device_path, DBUS_TYPE_INVALID));
 
-            pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
-            dbus_message_unref(signal);
-            signal = NULL;
+            pa_dbus_protocol_send_signal(s->dbus_protocol, signal_msg);
+            dbus_message_unref(signal_msg);
+            signal_msg = NULL;
         }
     }
 
@@ -696,14 +696,14 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
     if (s->sample_rate != new_sample_rate) {
         s->sample_rate = new_sample_rate;
 
-        pa_assert_se(signal = dbus_message_new_signal(s->path,
-                                                      PA_DBUSIFACE_STREAM_INTERFACE,
-                                                      signals[SIGNAL_SAMPLE_RATE_UPDATED].name));
-        pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_UINT32, &s->sample_rate, DBUS_TYPE_INVALID));
+        pa_assert_se(signal_msg = dbus_message_new_signal(s->path,
+							  PA_DBUSIFACE_STREAM_INTERFACE,
+							  signals[SIGNAL_SAMPLE_RATE_UPDATED].name));
+        pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_UINT32, &s->sample_rate, DBUS_TYPE_INVALID));
 
-        pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
-        dbus_message_unref(signal);
-        signal = NULL;
+        pa_dbus_protocol_send_signal(s->dbus_protocol, signal_msg);
+        dbus_message_unref(signal_msg);
+        signal_msg = NULL;
     }
 
     if (s->type == STREAM_TYPE_PLAYBACK) {
@@ -721,16 +721,16 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
             for (i = 0; i < s->volume.channels; ++i)
                 volume[i] = s->volume.values[i];
 
-            pa_assert_se(signal = dbus_message_new_signal(s->path,
-                                                          PA_DBUSIFACE_STREAM_INTERFACE,
-                                                          signals[SIGNAL_VOLUME_UPDATED].name));
-            pa_assert_se(dbus_message_append_args(signal,
+            pa_assert_se(signal_msg = dbus_message_new_signal(s->path,
+							      PA_DBUSIFACE_STREAM_INTERFACE,
+							      signals[SIGNAL_VOLUME_UPDATED].name));
+            pa_assert_se(dbus_message_append_args(signal_msg,
                                                   DBUS_TYPE_ARRAY, DBUS_TYPE_UINT32, &volume_ptr, s->volume.channels,
                                                   DBUS_TYPE_INVALID));
 
-            pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
-            dbus_message_unref(signal);
-            signal = NULL;
+            pa_dbus_protocol_send_signal(s->dbus_protocol, signal_msg);
+            dbus_message_unref(signal_msg);
+            signal_msg = NULL;
         }
 
         new_mute = pa_sink_input_get_mute(s->sink_input);
@@ -738,14 +738,14 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
         if (s->mute != new_mute) {
             s->mute = new_mute;
 
-            pa_assert_se(signal = dbus_message_new_signal(s->path,
-                                                          PA_DBUSIFACE_STREAM_INTERFACE,
-                                                          signals[SIGNAL_MUTE_UPDATED].name));
-            pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_BOOLEAN, &s->mute, DBUS_TYPE_INVALID));
+            pa_assert_se(signal_msg = dbus_message_new_signal(s->path,
+							      PA_DBUSIFACE_STREAM_INTERFACE,
+							      signals[SIGNAL_MUTE_UPDATED].name));
+            pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_BOOLEAN, &s->mute, DBUS_TYPE_INVALID));
 
-            pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
-            dbus_message_unref(signal);
-            signal = NULL;
+            pa_dbus_protocol_send_signal(s->dbus_protocol, signal_msg);
+            dbus_message_unref(signal_msg);
+            signal_msg = NULL;
         }
     }
 
@@ -756,21 +756,21 @@ static void subscription_cb(pa_core *c, pa_subscription_event_type_t t, uint32_t
 
         pa_proplist_update(s->proplist, PA_UPDATE_SET, new_proplist);
 
-        pa_assert_se(signal = dbus_message_new_signal(s->path,
-                                                      PA_DBUSIFACE_STREAM_INTERFACE,
-                                                      signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
-        dbus_message_iter_init_append(signal, &msg_iter);
+        pa_assert_se(signal_msg = dbus_message_new_signal(s->path,
+							  PA_DBUSIFACE_STREAM_INTERFACE,
+							  signals[SIGNAL_PROPERTY_LIST_UPDATED].name));
+        dbus_message_iter_init_append(signal_msg, &msg_iter);
         pa_dbus_append_proplist(&msg_iter, s->proplist);
 
-        pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
-        dbus_message_unref(signal);
-        signal = NULL;
+        pa_dbus_protocol_send_signal(s->dbus_protocol, signal_msg);
+        dbus_message_unref(signal_msg);
+        signal_msg = NULL;
     }
 }
 
 static pa_hook_result_t send_event_cb(void *hook_data, void *call_data, void *slot_data) {
     pa_dbusiface_stream *s = slot_data;
-    DBusMessage *signal = NULL;
+    DBusMessage *signal_msg = NULL;
     DBusMessageIter msg_iter;
     const char *name = NULL;
     pa_proplist *property_list = NULL;
@@ -796,15 +796,15 @@ static pa_hook_result_t send_event_cb(void *hook_data, void *call_data, void *sl
         property_list = data->data;
     }
 
-    pa_assert_se(signal = dbus_message_new_signal(s->path,
-                                                  PA_DBUSIFACE_STREAM_INTERFACE,
-                                                  signals[SIGNAL_STREAM_EVENT].name));
-    dbus_message_iter_init_append(signal, &msg_iter);
+    pa_assert_se(signal_msg = dbus_message_new_signal(s->path,
+						      PA_DBUSIFACE_STREAM_INTERFACE,
+						      signals[SIGNAL_STREAM_EVENT].name));
+    dbus_message_iter_init_append(signal_msg, &msg_iter);
     pa_assert_se(dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_STRING, &name));
     pa_dbus_append_proplist(&msg_iter, property_list);
 
-    pa_dbus_protocol_send_signal(s->dbus_protocol, signal);
-    dbus_message_unref(signal);
+    pa_dbus_protocol_send_signal(s->dbus_protocol, signal_msg);
+    dbus_message_unref(signal_msg);
 
     return PA_HOOK_OK;
 }
diff --git a/src/modules/dbus/module-dbus-protocol.c b/src/modules/dbus/module-dbus-protocol.c
index 11064c3..acc6ca0 100644
--- a/src/modules/dbus/module-dbus-protocol.c
+++ b/src/modules/dbus/module-dbus-protocol.c
@@ -126,7 +126,7 @@ static void client_kill_cb(pa_client *c) {
 /* Called from pa_client_send_event(). */
 static void client_send_event_cb(pa_client *c, const char *name, pa_proplist *data) {
     struct connection *conn = NULL;
-    DBusMessage *signal = NULL;
+    DBusMessage *signal_msg = NULL;
     DBusMessageIter msg_iter;
 
     pa_assert(c);
@@ -136,15 +136,15 @@ static void client_send_event_cb(pa_client *c, const char *name, pa_proplist *da
 
     conn = c->userdata;
 
-    pa_assert_se(signal = dbus_message_new_signal(pa_dbusiface_core_get_client_path(conn->server->userdata->core_iface, c),
-                                                  PA_DBUSIFACE_CLIENT_INTERFACE,
-                                                  "ClientEvent"));
-    dbus_message_iter_init_append(signal, &msg_iter);
+    pa_assert_se(signal_msg = dbus_message_new_signal(pa_dbusiface_core_get_client_path(conn->server->userdata->core_iface, c),
+						      PA_DBUSIFACE_CLIENT_INTERFACE,
+						      "ClientEvent"));
+    dbus_message_iter_init_append(signal_msg, &msg_iter);
     pa_assert_se(dbus_message_iter_append_basic(&msg_iter, DBUS_TYPE_STRING, &name));
     pa_dbus_append_proplist(&msg_iter, data);
 
-    pa_assert_se(dbus_connection_send(pa_dbus_wrap_connection_get(conn->wrap_conn), signal, NULL));
-    dbus_message_unref(signal);
+    pa_assert_se(dbus_connection_send(pa_dbus_wrap_connection_get(conn->wrap_conn), signal_msg, NULL));
+    dbus_message_unref(signal_msg);
 }
 
 /* Called by D-Bus at the authentication phase. */
diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index 788f458..02c312e 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -433,29 +433,29 @@ static void append_volume_variant(DBusMessageIter *iter, struct entry *e) {
 }
 
 static void send_new_entry_signal(struct dbus_entry *entry) {
-    DBusMessage *signal;
+    DBusMessage *signal_msg;
 
     pa_assert(entry);
 
-    pa_assert_se(signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_STREAM_RESTORE, signals[SIGNAL_NEW_ENTRY].name));
-    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &entry->object_path, DBUS_TYPE_INVALID));
-    pa_dbus_protocol_send_signal(entry->userdata->dbus_protocol, signal);
-    dbus_message_unref(signal);
+    pa_assert_se(signal_msg = dbus_message_new_signal(OBJECT_PATH, INTERFACE_STREAM_RESTORE, signals[SIGNAL_NEW_ENTRY].name));
+    pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &entry->object_path, DBUS_TYPE_INVALID));
+    pa_dbus_protocol_send_signal(entry->userdata->dbus_protocol, signal_msg);
+    dbus_message_unref(signal_msg);
 }
 
 static void send_entry_removed_signal(struct dbus_entry *entry) {
-    DBusMessage *signal;
+    DBusMessage *signal_msg;
 
     pa_assert(entry);
 
-    pa_assert_se(signal = dbus_message_new_signal(OBJECT_PATH, INTERFACE_STREAM_RESTORE, signals[SIGNAL_ENTRY_REMOVED].name));
-    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_OBJECT_PATH, &entry->object_path, DBUS_TYPE_INVALID));
-    pa_dbus_protocol_send_signal(entry->userdata->dbus_protocol, signal);
-    dbus_message_unref(signal);
+    pa_assert_se(signal_msg = dbus_message_new_signal(OBJECT_PATH, INTERFACE_STREAM_RESTORE, signals[SIGNAL_ENTRY_REMOVED].name));
+    pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &entry->object_path, DBUS_TYPE_INVALID));
+    pa_dbus_protocol_send_signal(entry->userdata->dbus_protocol, signal_msg);
+    dbus_message_unref(signal_msg);
 }
 
 static void send_device_updated_signal(struct dbus_entry *de, struct entry *e) {
-    DBusMessage *signal;
+    DBusMessage *signal_msg;
     const char *device;
 
     pa_assert(de);
@@ -463,28 +463,28 @@ static void send_device_updated_signal(struct dbus_entry *de, struct entry *e) {
 
     device = e->device_valid ? e->device : "";
 
-    pa_assert_se(signal = dbus_message_new_signal(de->object_path, INTERFACE_ENTRY, entry_signals[ENTRY_SIGNAL_DEVICE_UPDATED].name));
-    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_STRING, &device, DBUS_TYPE_INVALID));
-    pa_dbus_protocol_send_signal(de->userdata->dbus_protocol, signal);
-    dbus_message_unref(signal);
+    pa_assert_se(signal_msg = dbus_message_new_signal(de->object_path, INTERFACE_ENTRY, entry_signals[ENTRY_SIGNAL_DEVICE_UPDATED].name));
+    pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_STRING, &device, DBUS_TYPE_INVALID));
+    pa_dbus_protocol_send_signal(de->userdata->dbus_protocol, signal_msg);
+    dbus_message_unref(signal_msg);
 }
 
 static void send_volume_updated_signal(struct dbus_entry *de, struct entry *e) {
-    DBusMessage *signal;
+    DBusMessage *signal_msg;
     DBusMessageIter msg_iter;
 
     pa_assert(de);
     pa_assert(e);
 
-    pa_assert_se(signal = dbus_message_new_signal(de->object_path, INTERFACE_ENTRY, entry_signals[ENTRY_SIGNAL_VOLUME_UPDATED].name));
-    dbus_message_iter_init_append(signal, &msg_iter);
+    pa_assert_se(signal_msg = dbus_message_new_signal(de->object_path, INTERFACE_ENTRY, entry_signals[ENTRY_SIGNAL_VOLUME_UPDATED].name));
+    dbus_message_iter_init_append(signal_msg, &msg_iter);
     append_volume(&msg_iter, e);
-    pa_dbus_protocol_send_signal(de->userdata->dbus_protocol, signal);
-    dbus_message_unref(signal);
+    pa_dbus_protocol_send_signal(de->userdata->dbus_protocol, signal_msg);
+    dbus_message_unref(signal_msg);
 }
 
 static void send_mute_updated_signal(struct dbus_entry *de, struct entry *e) {
-    DBusMessage *signal;
+    DBusMessage *signal_msg;
     dbus_bool_t muted;
 
     pa_assert(de);
@@ -494,10 +494,10 @@ static void send_mute_updated_signal(struct dbus_entry *de, struct entry *e) {
 
     muted = e->muted;
 
-    pa_assert_se(signal = dbus_message_new_signal(de->object_path, INTERFACE_ENTRY, entry_signals[ENTRY_SIGNAL_MUTE_UPDATED].name));
-    pa_assert_se(dbus_message_append_args(signal, DBUS_TYPE_BOOLEAN, &muted, DBUS_TYPE_INVALID));
-    pa_dbus_protocol_send_signal(de->userdata->dbus_protocol, signal);
-    dbus_message_unref(signal);
+    pa_assert_se(signal_msg = dbus_message_new_signal(de->object_path, INTERFACE_ENTRY, entry_signals[ENTRY_SIGNAL_MUTE_UPDATED].name));
+    pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_BOOLEAN, &muted, DBUS_TYPE_INVALID));
+    pa_dbus_protocol_send_signal(de->userdata->dbus_protocol, signal_msg);
+    dbus_message_unref(signal_msg);
 }
 
 static void handle_get_interface_revision(DBusConnection *conn, DBusMessage *msg, void *userdata) {
diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index 5c1127b..e427bb1 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -958,7 +958,7 @@ pa_client *pa_dbus_protocol_get_client(pa_dbus_protocol *p, DBusConnection *conn
 void pa_dbus_protocol_add_signal_listener(
         pa_dbus_protocol *p,
         DBusConnection *conn,
-        const char *signal,
+        const char *signal_name,
         char **objects,
         unsigned n_objects) {
     struct connection_entry *conn_entry;
@@ -978,18 +978,18 @@ void pa_dbus_protocol_add_signal_listener(
     while ((object_path = pa_idxset_steal_first(conn_entry->all_signals_objects, NULL)))
         pa_xfree(object_path);
 
-    if (signal) {
+    if (signal_name) {
         conn_entry->listening_for_all_signals = FALSE;
 
         /* Replace the old object list with a new one. */
-        if ((object_set = pa_hashmap_remove(conn_entry->listening_signals, signal)))
+        if ((object_set = pa_hashmap_remove(conn_entry->listening_signals, signal_name)))
             pa_idxset_free(object_set, free_listened_object_name_cb, NULL);
         object_set = pa_idxset_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
 
         for (i = 0; i < n_objects; ++i)
             pa_idxset_put(object_set, pa_xstrdup(objects[i]), NULL);
 
-        pa_hashmap_put(conn_entry->listening_signals, signal, object_set);
+        pa_hashmap_put(conn_entry->listening_signals, signal_name, object_set);
 
     } else {
         conn_entry->listening_for_all_signals = TRUE;
@@ -1004,7 +1004,7 @@ void pa_dbus_protocol_add_signal_listener(
     }
 }
 
-void pa_dbus_protocol_remove_signal_listener(pa_dbus_protocol *p, DBusConnection *conn, const char *signal) {
+void pa_dbus_protocol_remove_signal_listener(pa_dbus_protocol *p, DBusConnection *conn, const char *signal_name) {
     struct connection_entry *conn_entry;
     pa_idxset *object_set;
 
@@ -1013,8 +1013,8 @@ void pa_dbus_protocol_remove_signal_listener(pa_dbus_protocol *p, DBusConnection
 
     pa_assert_se((conn_entry = pa_hashmap_get(p->connections, conn)));
 
-    if (signal) {
-        if ((object_set = pa_hashmap_get(conn_entry->listening_signals, signal)))
+    if (signal_name) {
+        if ((object_set = pa_hashmap_get(conn_entry->listening_signals, signal_name)))
             pa_idxset_free(object_set, free_listened_object_name_cb, NULL);
 
     } else {
@@ -1030,7 +1030,7 @@ void pa_dbus_protocol_remove_signal_listener(pa_dbus_protocol *p, DBusConnection
     }
 }
 
-void pa_dbus_protocol_send_signal(pa_dbus_protocol *p, DBusMessage *signal) {
+void pa_dbus_protocol_send_signal(pa_dbus_protocol *p, DBusMessage *signal_name) {
     struct connection_entry *conn_entry;
     void *state = NULL;
     pa_idxset *object_set;
@@ -1038,24 +1038,24 @@ void pa_dbus_protocol_send_signal(pa_dbus_protocol *p, DBusMessage *signal) {
     char *signal_string;
 
     pa_assert(p);
-    pa_assert(signal);
-    pa_assert(dbus_message_get_type(signal) == DBUS_MESSAGE_TYPE_SIGNAL);
-    pa_assert_se(dbus_message_get_interface(signal));
-    pa_assert_se(dbus_message_get_member(signal));
+    pa_assert(signal_name);
+    pa_assert(dbus_message_get_type(signal_name) == DBUS_MESSAGE_TYPE_SIGNAL);
+    pa_assert_se(dbus_message_get_interface(signal_name));
+    pa_assert_se(dbus_message_get_member(signal_name));
 
-    signal_string = pa_sprintf_malloc("%s.%s", dbus_message_get_interface(signal), dbus_message_get_member(signal));
+    signal_string = pa_sprintf_malloc("%s.%s", dbus_message_get_interface(signal_name), dbus_message_get_member(signal_name));
 
     PA_HASHMAP_FOREACH(conn_entry, p->connections, state) {
         if ((conn_entry->listening_for_all_signals /* Case 1: listening for all signals */
-             && (pa_idxset_get_by_data(conn_entry->all_signals_objects, dbus_message_get_path(signal), NULL)
+             && (pa_idxset_get_by_data(conn_entry->all_signals_objects, dbus_message_get_path(signal_name), NULL)
                  || pa_idxset_isempty(conn_entry->all_signals_objects)))
 
             || (!conn_entry->listening_for_all_signals /* Case 2: not listening for all signals */
                 && (object_set = pa_hashmap_get(conn_entry->listening_signals, signal_string))
-                && (pa_idxset_get_by_data(object_set, dbus_message_get_path(signal), NULL)
+                && (pa_idxset_get_by_data(object_set, dbus_message_get_path(signal_name), NULL)
                     || pa_idxset_isempty(object_set)))) {
 
-            pa_assert_se(signal_copy = dbus_message_copy(signal));
+            pa_assert_se(signal_copy = dbus_message_copy(signal_name));
             pa_assert_se(dbus_connection_send(conn_entry->connection, signal_copy, NULL));
             dbus_message_unref(signal_copy);
         }

commit 62278b4b94212c5ab2f3041cac8b68e6c2bd35fe
Author: Diego Elio 'Flameeyes' Pettenò <flameeyes at gmail.com>
Date:   Sat Nov 21 00:47:44 2009 +0100

    Avoid using devname as a variable name.
    
    On FreeBSD, devname() is a system function, and was overshadowed.

diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index 3991043..8d61ff4 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -1032,27 +1032,27 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
 
         if ((e = read_entry(u, name))) {
             uint32_t idx;
-            char *devname;
+            char *device_name;
             uint32_t found_index = PA_INVALID_INDEX;
 
-            if ((devname = get_name(name, "sink:"))) {
+            if ((device_name = get_name(name, "sink:"))) {
                 pa_sink* s;
                 PA_IDXSET_FOREACH(s, u->core->sinks, idx) {
-                    if (strcmp(s->name, devname) == 0) {
+                    if (strcmp(s->name, device_name) == 0) {
                         found_index = s->index;
                         break;
                     }
                 }
-                pa_xfree(devname);
-            } else if ((devname = get_name(name, "source:"))) {
+                pa_xfree(device_name);
+            } else if ((device_name = get_name(name, "source:"))) {
                 pa_source* s;
                 PA_IDXSET_FOREACH(s, u->core->sources, idx) {
-                    if (strcmp(s->name, devname) == 0) {
+                    if (strcmp(s->name, device_name) == 0) {
                         found_index = s->index;
                         break;
                     }
                 }
-                pa_xfree(devname);
+                pa_xfree(device_name);
             }
 
             pa_tagstruct_puts(reply, name);

commit fe0b393f7ac2f50131d187cc31a74ced52c15bd1
Author: Diego Elio 'Flameeyes' Pettenò <flameeyes at gmail.com>
Date:   Sat Nov 21 00:53:00 2009 +0100

    Simplify Makefile.am handling of ALSA-related files.
    
    Instead of declaring extra variables for the ALSA profiles and PATHS, and
    using EXTRA_DIST for the udev rule, use the dist_ prefix when declaring
    them for conditional installation.
    
    This relies on the fact that automake *is* smart enough to know that there
    exist *no* conditional dist, and will always distribute all of them.

diff --git a/src/Makefile.am b/src/Makefile.am
index b45908b..5db6b39 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -109,30 +109,6 @@ MODULE_LDFLAGS = -module -disable-static -avoid-version $(LDFLAGS_NOUNDEFINED)
 #          Extra files            #
 ###################################
 
-ALSA_PROFILES = \
-		modules/alsa/mixer/profile-sets/default.conf \
-		modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf \
-		modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf
-
-ALSA_PATHS = \
-		modules/alsa/mixer/paths/analog-input-aux.conf \
-		modules/alsa/mixer/paths/analog-input.conf \
-		modules/alsa/mixer/paths/analog-input.conf.common \
-		modules/alsa/mixer/paths/analog-input-fm.conf \
-		modules/alsa/mixer/paths/analog-input-linein.conf \
-		modules/alsa/mixer/paths/analog-input-mic.conf \
-		modules/alsa/mixer/paths/analog-input-mic.conf.common \
-		modules/alsa/mixer/paths/analog-input-mic-line.conf \
-		modules/alsa/mixer/paths/analog-input-tvtuner.conf \
-		modules/alsa/mixer/paths/analog-input-video.conf \
-		modules/alsa/mixer/paths/analog-output.conf \
-		modules/alsa/mixer/paths/analog-output-speaker.conf \
-		modules/alsa/mixer/paths/analog-output.conf.common \
-		modules/alsa/mixer/paths/analog-output-headphones.conf \
-		modules/alsa/mixer/paths/analog-output-headphones-2.conf \
-		modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf \
-		modules/alsa/mixer/paths/analog-output-mono.conf
-
 EXTRA_DIST = \
 		pulse/client.conf.in \
 		pulse/version.h.in \
@@ -149,10 +125,7 @@ EXTRA_DIST = \
 		daemon/pulseaudio.desktop.in \
 		daemon/pulseaudio-kde.desktop.in \
 		map-file \
-		daemon/pulseaudio-system.conf \
-		modules/alsa/mixer/profile-sets/90-pulseaudio.rules \
-		${ALSA_PROFILES} \
-		${ALSA_PATHS}
+		daemon/pulseaudio-system.conf
 
 pulseconf_DATA = \
 		default.pa \
@@ -1094,14 +1067,34 @@ modlibexec_LTLIBRARIES += \
 		module-alsa-source.la \
 		module-alsa-card.la
 
-alsaprofilesets_DATA = ${ALSA_PROFILES}
+dist_alsaprofilesets_DATA = \
+		modules/alsa/mixer/profile-sets/default.conf \
+		modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf \
+		modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf
 
 if HAVE_UDEV
-udevrules_DATA = \
+dist_udevrules_DATA = \
 		modules/alsa/mixer/profile-sets/90-pulseaudio.rules
 endif
 
-alsapaths_DATA = ${ALSA_PATHS}
+dist_alsapaths_DATA = \
+		modules/alsa/mixer/paths/analog-input-aux.conf \
+		modules/alsa/mixer/paths/analog-input.conf \
+		modules/alsa/mixer/paths/analog-input.conf.common \
+		modules/alsa/mixer/paths/analog-input-fm.conf \
+		modules/alsa/mixer/paths/analog-input-linein.conf \
+		modules/alsa/mixer/paths/analog-input-mic.conf \
+		modules/alsa/mixer/paths/analog-input-mic.conf.common \
+		modules/alsa/mixer/paths/analog-input-mic-line.conf \
+		modules/alsa/mixer/paths/analog-input-tvtuner.conf \
+		modules/alsa/mixer/paths/analog-input-video.conf \
+		modules/alsa/mixer/paths/analog-output.conf \
+		modules/alsa/mixer/paths/analog-output-speaker.conf \
+		modules/alsa/mixer/paths/analog-output.conf.common \
+		modules/alsa/mixer/paths/analog-output-headphones.conf \
+		modules/alsa/mixer/paths/analog-output-headphones-2.conf \
+		modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf \
+		modules/alsa/mixer/paths/analog-output-mono.conf
 
 endif
 

commit f69e81f226e1f165bfe7d792b3c7895a55d43983
Author: Jason Newton <nevion at gmail.com>
Date:   Fri Nov 20 15:34:02 2009 -0800

    Makefile.am: added qpaeq to installed scripts

diff --git a/src/Makefile.am b/src/Makefile.am
index b45908b..fc8803c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1192,6 +1192,7 @@ endif
 if HAVE_FFTW
 modlibexec_LTLIBRARIES += \
 		module-equalizer-sink.la
+bin_SCRIPTS += utils/qpaeq
 endif
 
 # These are generated by an M4 script

commit 4eb65a0a46bd880faf620db3dff94f82f966bd61
Author: Jason Newton <nevion at gmail.com>
Date:   Fri Nov 20 15:18:59 2009 -0800

    src/utils/qpaeq: added more friendly error messages to common errors

diff --git a/src/utils/qpaeq b/src/utils/qpaeq
index dca0701..a8a9fda 100755
--- a/src/utils/qpaeq
+++ b/src/utils/qpaeq
@@ -17,12 +17,20 @@
 
 
 import os,math,sys
-import PyQt4,sip
-from PyQt4 import QtGui,QtCore
-from functools import partial
+try:
+    import PyQt4,sip
+    from PyQt4 import QtGui,QtCore
+    import dbus.mainloop.qt
+    import dbus
+except ImportError,e:
+    print 'There was an error importing need libraries'
+    print 'Make sure you haveqt4 and dbus forthon installed'
+    print 'The error that occured was'
+    print '\t%s' %(str(e))
+    import sys
+    sys.exit(-1)
 
-import dbus.mainloop.qt
-import dbus
+from functools import partial
 
 import signal
 signal.signal(signal.SIGINT, signal.SIG_DFL)
@@ -31,13 +39,19 @@ SYNC_TIMEOUT = 4*1000
 CORE_PATH = "/org/pulseaudio/core1"
 CORE_IFACE = "org.PulseAudio.Core1"
 def connect():
-    if 'PULSE_DBUS_SERVER' in os.environ:
-        address = os.environ['PULSE_DBUS_SERVER']
-    else:
-        bus = dbus.SessionBus() # Should be UserBus, but D-Bus doesn't implement that yet.
-        server_lookup = bus.get_object('org.PulseAudio1', '/org/pulseaudio/server_lookup1')
-        address = server_lookup.Get('org.PulseAudio.ServerLookup1', 'Address', dbus_interface='org.freedesktop.DBus.Properties')
-    return dbus.connection.Connection(address)
+    try:
+        if 'PULSE_DBUS_SERVER' in os.environ:
+            address = os.environ['PULSE_DBUS_SERVER']
+        else:
+            bus = dbus.SessionBus() # Should be UserBus, but D-Bus doesn't implement that yet.
+            server_lookup = bus.get_object('org.PulseAudio1', '/org/pulseaudio/server_lookup1')
+            address = server_lookup.Get('org.PulseAudio.ServerLookup1', 'Address', dbus_interface='org.freedesktop.DBus.Properties')
+        return dbus.connection.Connection(address)
+    except Exception,e:
+        print 'There was an error connecting to pulseaudio, please make sure you have the pulseaudio dbus'
+        print 'and equalizer modules loaded, exiting...'
+        import sys
+        sys.exit(-1)
 
 
 #TODO: signals: sink Filter changed, sink reconfigured (window size) (sink iface)

commit 5aa5c6c196b23acabca3e2c8a6724cb08485acdc
Author: Joe Marcus Clarke <marcus at FreeBSD.org>
Date:   Sat Nov 21 01:13:35 2009 +0100

    freebsd: implement pa_get_binary_name
    
    Stolen from
    http://www.freebsd.org/cgi/cvsweb.cgi/ports/audio/pulseaudio/files/patch-src_pulse_util.c?rev=1.1
    and fixed for indentation.

diff --git a/src/pulse/util.c b/src/pulse/util.c
index 9440f5d..ca766da 100644
--- a/src/pulse/util.c
+++ b/src/pulse/util.c
@@ -189,7 +189,18 @@ char *pa_get_binary_name(char *s, size_t l) {
             return s;
         }
     }
+#endif
 
+#ifdef __FreeBSD__
+    {
+        char *rp;
+
+	if ((rp = pa_readlink("/proc/curproc/file"))) {
+	    pa_strlcpy(s, pa_path_get_filename(rp), l);
+	    pa_xfree(rp);
+	    return s;
+	}
+    }
 #endif
 
 #if defined(HAVE_SYS_PRCTL_H) && defined(PR_GET_NAME)

commit 675957b9e41d5a92d8cbff3d4fcbcec4965806da
Merge: 9708ecd 5aa5c6c
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sun Nov 22 21:40:15 2009 +0100

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


commit c815441ba19e92f88395de8763df4a1e57950f7b
Merge: 5aa5c6c 4eb65a0
Author: Lennart Poettering <lennart at poettering.net>
Date:   Mon Nov 23 04:48:31 2009 +0100

    Merge remote branch 'phish3/master'


commit 0fcdc3d15d759e576ba3d71cc874c1036dcd36a0
Merge: 675957b c815441
Author: Lennart Poettering <lennart at poettering.net>
Date:   Mon Nov 23 05:45:33 2009 +0100

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


commit d5d488e33d85549c81d007497c8301c920d0a6e4
Merge: ed7642e 0fcdc3d
Author: Daniel Mack <daniel at caiaq.de>
Date:   Tue Nov 24 17:38:25 2009 +0100

    Merge branch 'master' of git://0pointer.de/pulseaudio


commit 118466638aa651eac0d20513d348ddcc446bb5e6
Merge: 0fcdc3d e064d27
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Mon Nov 30 14:55:57 2009 +0000

    Merge remote branch 'tanuk/master'


commit 1b2cbe92dbffc1d8be12c64fdc647e3cb5e5c58c
Merge: d5d488e 1184666
Author: Daniel Mack <daniel at caiaq.de>
Date:   Tue Dec 1 02:22:39 2009 +0100

    Merge branch 'master' of git://0pointer.de/pulseaudio


commit 4c793cfc76360676b3881d7943b49adf892594d2
Author: Tanu Kaskinen <ext-tanu.kaskinen at nokia.com>
Date:   Thu Dec 3 13:22:05 2009 +0200

    libpulse: Store pa_stream pointers to hashmaps instead of dynarrays.
    
    Since the stream identifiers (channels) are monotonically growing integer, it
    isn't a good idea to use them as index to a dynamic array, because the array
    will grow all the time. This is not a problem with client connections that
    don't create many streams, but, for example, long-running clients that use
    libcanberra for playing event sounds, this means that the client connection
    effectively leaks memory.

diff --git a/src/pulse/context.c b/src/pulse/context.c
index e33143d..0018492 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -63,7 +63,7 @@
 #include <pulsecore/native-common.h>
 #include <pulsecore/pdispatch.h>
 #include <pulsecore/pstream.h>
-#include <pulsecore/dynarray.h>
+#include <pulsecore/hashmap.h>
 #include <pulsecore/socket-client.h>
 #include <pulsecore/pstream-util.h>
 #include <pulsecore/core-rtclock.h>
@@ -160,8 +160,8 @@ pa_context *pa_context_new_with_proplist(pa_mainloop_api *mainloop, const char *
     c->client = NULL;
     c->pstream = NULL;
     c->pdispatch = NULL;
-    c->playback_streams = pa_dynarray_new();
-    c->record_streams = pa_dynarray_new();
+    c->playback_streams = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+    c->record_streams = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
     c->client_index = PA_INVALID_INDEX;
     c->use_rtclock = pa_mainloop_is_our_api(mainloop);
 
@@ -266,9 +266,9 @@ static void context_free(pa_context *c) {
 #endif
 
     if (c->record_streams)
-        pa_dynarray_free(c->record_streams, NULL, NULL);
+        pa_hashmap_free(c->record_streams, NULL, NULL);
     if (c->playback_streams)
-        pa_dynarray_free(c->playback_streams, NULL, NULL);
+        pa_hashmap_free(c->playback_streams, NULL, NULL);
 
     if (c->mempool)
         pa_mempool_free(c->mempool);
@@ -375,7 +375,7 @@ static void pstream_memblock_callback(pa_pstream *p, uint32_t channel, int64_t o
 
     pa_context_ref(c);
 
-    if ((s = pa_dynarray_get(c->record_streams, channel))) {
+    if ((s = pa_hashmap_get(c->record_streams, PA_UINT32_TO_PTR(channel)))) {
 
         if (chunk->memblock) {
             pa_memblockq_seek(s->record_memblockq, offset, seek, TRUE);
diff --git a/src/pulse/internal.h b/src/pulse/internal.h
index b371bfc..9545d50 100644
--- a/src/pulse/internal.h
+++ b/src/pulse/internal.h
@@ -34,7 +34,6 @@
 #include <pulsecore/socket-client.h>
 #include <pulsecore/pstream.h>
 #include <pulsecore/pdispatch.h>
-#include <pulsecore/dynarray.h>
 #include <pulsecore/llist.h>
 #include <pulsecore/native-common.h>
 #include <pulsecore/strlist.h>
@@ -66,7 +65,7 @@ struct pa_context {
     pa_pstream *pstream;
     pa_pdispatch *pdispatch;
 
-    pa_dynarray *record_streams, *playback_streams;
+    pa_hashmap *record_streams, *playback_streams;
     PA_LLIST_HEAD(pa_stream, streams);
     PA_LLIST_HEAD(pa_operation, operations);
 
diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index 4dea567..4081256 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -199,7 +199,7 @@ static void stream_unlink(pa_stream *s) {
         pa_pdispatch_unregister_reply(s->context->pdispatch, s);
 
     if (s->channel_valid) {
-        pa_dynarray_put((s->direction == PA_STREAM_PLAYBACK) ? s->context->playback_streams : s->context->record_streams, s->channel, NULL);
+        pa_hashmap_remove((s->direction == PA_STREAM_PLAYBACK) ? s->context->playback_streams : s->context->record_streams, PA_UINT32_TO_PTR(s->channel));
         s->channel = 0;
         s->channel_valid = FALSE;
     }
@@ -354,7 +354,7 @@ void pa_command_stream_killed(pa_pdispatch *pd, uint32_t command, uint32_t tag,
         goto finish;
     }
 
-    if (!(s = pa_dynarray_get(command == PA_COMMAND_PLAYBACK_STREAM_KILLED ? c->playback_streams : c->record_streams, channel)))
+    if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_STREAM_KILLED ? c->playback_streams : c->record_streams, PA_UINT32_TO_PTR(channel))))
         goto finish;
 
     if (s->state != PA_STREAM_READY)
@@ -474,7 +474,7 @@ void pa_command_stream_moved(pa_pdispatch *pd, uint32_t command, uint32_t tag, p
         goto finish;
     }
 
-    if (!(s = pa_dynarray_get(command == PA_COMMAND_PLAYBACK_STREAM_MOVED ? c->playback_streams : c->record_streams, channel)))
+    if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_STREAM_MOVED ? c->playback_streams : c->record_streams, PA_UINT32_TO_PTR(channel))))
         goto finish;
 
     if (s->state != PA_STREAM_READY)
@@ -557,7 +557,7 @@ void pa_command_stream_buffer_attr(pa_pdispatch *pd, uint32_t command, uint32_t
         goto finish;
     }
 
-    if (!(s = pa_dynarray_get(command == PA_COMMAND_PLAYBACK_BUFFER_ATTR_CHANGED ? c->playback_streams : c->record_streams, channel)))
+    if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_BUFFER_ATTR_CHANGED ? c->playback_streams : c->record_streams, PA_UINT32_TO_PTR(channel))))
         goto finish;
 
     if (s->state != PA_STREAM_READY)
@@ -609,7 +609,7 @@ void pa_command_stream_suspended(pa_pdispatch *pd, uint32_t command, uint32_t ta
         goto finish;
     }
 
-    if (!(s = pa_dynarray_get(command == PA_COMMAND_PLAYBACK_STREAM_SUSPENDED ? c->playback_streams : c->record_streams, channel)))
+    if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_STREAM_SUSPENDED ? c->playback_streams : c->record_streams, PA_UINT32_TO_PTR(channel))))
         goto finish;
 
     if (s->state != PA_STREAM_READY)
@@ -651,7 +651,7 @@ void pa_command_stream_started(pa_pdispatch *pd, uint32_t command, uint32_t tag,
         goto finish;
     }
 
-    if (!(s = pa_dynarray_get(c->playback_streams, channel)))
+    if (!(s = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(channel))))
         goto finish;
 
     if (s->state != PA_STREAM_READY)
@@ -697,7 +697,7 @@ void pa_command_stream_event(pa_pdispatch *pd, uint32_t command, uint32_t tag, p
         goto finish;
     }
 
-    if (!(s = pa_dynarray_get(command == PA_COMMAND_PLAYBACK_STREAM_EVENT ? c->playback_streams : c->record_streams, channel)))
+    if (!(s = pa_hashmap_get(command == PA_COMMAND_PLAYBACK_STREAM_EVENT ? c->playback_streams : c->record_streams, PA_UINT32_TO_PTR(channel))))
         goto finish;
 
     if (s->state != PA_STREAM_READY)
@@ -733,7 +733,7 @@ void pa_command_request(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tag
         goto finish;
     }
 
-    if (!(s = pa_dynarray_get(c->playback_streams, channel)))
+    if (!(s = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(channel))))
         goto finish;
 
     if (s->state != PA_STREAM_READY)
@@ -767,7 +767,7 @@ void pa_command_overflow_or_underflow(pa_pdispatch *pd, uint32_t command, uint32
         goto finish;
     }
 
-    if (!(s = pa_dynarray_get(c->playback_streams, channel)))
+    if (!(s = pa_hashmap_get(c->playback_streams, PA_UINT32_TO_PTR(channel))))
         goto finish;
 
     if (s->state != PA_STREAM_READY)
@@ -997,7 +997,7 @@ void pa_create_stream_callback(pa_pdispatch *pd, uint32_t command, uint32_t tag,
     }
 
     s->channel_valid = TRUE;
-    pa_dynarray_put((s->direction == PA_STREAM_RECORD) ? s->context->record_streams : s->context->playback_streams, s->channel, s);
+    pa_hashmap_put((s->direction == PA_STREAM_RECORD) ? s->context->record_streams : s->context->playback_streams, PA_UINT32_TO_PTR(s->channel), s);
 
     create_stream_complete(s);
 

commit 7b1b68ce2cfbc735065f1af45811f33a8a6bf6ea
Author: Tanu Kaskinen <ext-tanu.kaskinen at nokia.com>
Date:   Thu Dec 3 15:28:36 2009 +0200

    dbus: Handle the cases when a non-existing interface is detected in an incoming message.

diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index e427bb1..95518a1 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -552,10 +552,18 @@ static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessa
             pa_dbus_send_error(connection, message, DBUS_ERROR_UNKNOWN_METHOD, "No such method: %s", call_info.method);
             break;
 
+        case NO_SUCH_INTERFACE:
+            pa_dbus_send_error(connection, message, PA_DBUS_ERROR_NO_SUCH_INTERFACE, "No such interface: %s", call_info.interface);
+            break;
+
         case NO_SUCH_PROPERTY:
             pa_dbus_send_error(connection, message, PA_DBUS_ERROR_NO_SUCH_PROPERTY, "No such property: %s", call_info.property);
             break;
 
+        case NO_SUCH_PROPERTY_INTERFACE:
+            pa_dbus_send_error(connection, message, PA_DBUS_ERROR_NO_SUCH_INTERFACE, "No such property interface: %s", call_info.property_interface);
+            break;
+
         case INVALID_METHOD_SIG:
             pa_dbus_send_error(connection, message, DBUS_ERROR_INVALID_ARGS,
                                "Invalid signature for method %s: '%s'. Expected '%s'.",
diff --git a/src/pulsecore/protocol-dbus.h b/src/pulsecore/protocol-dbus.h
index 6d100f7..8999933 100644
--- a/src/pulsecore/protocol-dbus.h
+++ b/src/pulsecore/protocol-dbus.h
@@ -35,6 +35,7 @@
 #define PA_DBUS_CORE_INTERFACE "org.PulseAudio.Core1"
 #define PA_DBUS_CORE_OBJECT_PATH "/org/pulseaudio/core1"
 
+#define PA_DBUS_ERROR_NO_SUCH_INTERFACE PA_DBUS_CORE_INTERFACE ".NoSuchInterfaceError"
 #define PA_DBUS_ERROR_NO_SUCH_PROPERTY PA_DBUS_CORE_INTERFACE ".NoSuchPropertyError"
 #define PA_DBUS_ERROR_NOT_FOUND PA_DBUS_CORE_INTERFACE ".NotFoundError"
 

commit e785f728a54b5dc4ad25373b262d35babe8221f6
Author: Tanu Kaskinen <ext-tanu.kaskinen at nokia.com>
Date:   Thu Dec 3 15:30:01 2009 +0200

    dbus: Add a missing break statement in handle_message_cb().

diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index 95518a1..582bc65 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -574,6 +574,7 @@ static DBusHandlerResult handle_message_cb(DBusConnection *connection, DBusMessa
             pa_dbus_send_error(connection, message, DBUS_ERROR_INVALID_ARGS,
                                "Invalid signature for property %s: '%s'. Expected '%s'.",
                                call_info.property, call_info.property_sig, call_info.expected_property_sig);
+            break;
 
         default:
             pa_assert_not_reached();

commit a6b7ac68268e55ec8b4ee7fa9e930b86e17fae85
Author: Tanu Kaskinen <ext-tanu.kaskinen at nokia.com>
Date:   Thu Dec 3 15:31:11 2009 +0200

    stream-restore: Fix a few assertion misuses with the D-Bus code.

diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index 02c312e..ce92362 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -647,7 +647,7 @@ static void handle_add_entry(DBusConnection *conn, DBusMessage *msg, void *userd
 
     } else {
         dbus_entry = dbus_entry_new(u, name);
-        pa_assert(pa_hashmap_put(u->dbus_entries, dbus_entry->entry_name, dbus_entry) >= 0);
+        pa_assert_se(pa_hashmap_put(u->dbus_entries, dbus_entry->entry_name, dbus_entry) == 0);
 
         e->muted_valid = TRUE;
         e->volume_valid = !!map.channels;
@@ -1245,10 +1245,10 @@ static void subscribe_callback(pa_core *c, pa_subscription_event_type_t t, uint3
 #ifdef HAVE_DBUS
     if (created_new_entry) {
         de = dbus_entry_new(u, name);
-        pa_hashmap_put(u->dbus_entries, de->entry_name, de);
+        pa_assert_se(pa_hashmap_put(u->dbus_entries, de->entry_name, de) == 0);
         send_new_entry_signal(de);
     } else {
-        pa_assert((de = pa_hashmap_get(u->dbus_entries, name)));
+        pa_assert_se(de = pa_hashmap_get(u->dbus_entries, name));
 
         if (device_updated)
             send_device_updated_signal(de, &entry);
@@ -1859,7 +1859,7 @@ static int extension_cb(pa_native_protocol *p, pa_module *m, pa_native_connectio
 
                     } else {
                         de = dbus_entry_new(u, name);
-                        pa_assert_se(pa_hashmap_put(u->dbus_entries, de->entry_name, de));
+                        pa_assert_se(pa_hashmap_put(u->dbus_entries, de->entry_name, de) == 0);
                         send_new_entry_signal(de);
                     }
 #endif
@@ -2050,7 +2050,7 @@ int pa__init(pa_module*m) {
         pa_datum_free(&key);
 
         de = dbus_entry_new(u, name);
-        pa_assert_se(pa_hashmap_put(u->dbus_entries, de->entry_name, de) >= 0);
+        pa_assert_se(pa_hashmap_put(u->dbus_entries, de->entry_name, de) == 0);
 
         pa_xfree(name);
 

commit 00debf42437402dadbe5f0a5ff284582c4399aec
Author: Tanu Kaskinen <ext-tanu.kaskinen at nokia.com>
Date:   Thu Dec 3 15:32:23 2009 +0200

    stream-restore: Add a missing pa_xnew0() call in handle_add_entry().

diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index ce92362..a1273fe 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -649,6 +649,7 @@ static void handle_add_entry(DBusConnection *conn, DBusMessage *msg, void *userd
         dbus_entry = dbus_entry_new(u, name);
         pa_assert_se(pa_hashmap_put(u->dbus_entries, dbus_entry->entry_name, dbus_entry) == 0);
 
+        e = pa_xnew0(struct entry, 1);
         e->muted_valid = TRUE;
         e->volume_valid = !!map.channels;
         e->device_valid = !!device[0];

commit f42022a7d3157a3f3346b49c749d2262abea34c4
Author: Tanu Kaskinen <ext-tanu.kaskinen at nokia.com>
Date:   Thu Dec 3 15:34:26 2009 +0200

    stream-restore: At startup, create dbus entries only for valid database entries.

diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index a1273fe..becdb54 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -2044,14 +2044,19 @@ int pa__init(pa_module*m) {
         pa_datum next_key;
         char *name;
         struct dbus_entry *de;
+        struct entry *e;
 
         done = !pa_database_next(u->database, &key, &next_key, NULL);
 
         name = pa_xstrndup(key.data, key.size);
         pa_datum_free(&key);
 
-        de = dbus_entry_new(u, name);
-        pa_assert_se(pa_hashmap_put(u->dbus_entries, de->entry_name, de) == 0);
+        /* Use read_entry() for checking that the entry is valid. */
+        if ((e = read_entry(u, name))) {
+            de = dbus_entry_new(u, name);
+            pa_assert_se(pa_hashmap_put(u->dbus_entries, de->entry_name, de) == 0);
+            pa_xfree(e);
+        }
 
         pa_xfree(name);
 

commit 978d33b609969c3b9bbbd759e0f11aaf856c80cf
Author: Arun Raghavan <arun.raghavan at collabora.co.uk>
Date:   Sun Dec 6 12:20:53 2009 +0530

    Mark shared variables as volatile
    
    'n_waiting' and 'n_waiting_for_accept' may be accessed from mulitple
    threads, and thus need to be marked as volatile to suppres certain
    compiler optimisations. All uses are protected by a mutex, so we don't
    need to worry about cache issues (added documentation for this as well).
    
    This addresses bug #738.

diff --git a/src/pulse/thread-mainloop.c b/src/pulse/thread-mainloop.c
index a2b98ce..14ed926 100644
--- a/src/pulse/thread-mainloop.c
+++ b/src/pulse/thread-mainloop.c
@@ -51,7 +51,7 @@
 
 struct pa_threaded_mainloop {
     pa_mainloop *real_mainloop;
-    int n_waiting, n_waiting_for_accept;
+    volatile int n_waiting, n_waiting_for_accept;
 
     pa_thread* thread;
     pa_mutex* mutex;
@@ -185,6 +185,7 @@ void pa_threaded_mainloop_unlock(pa_threaded_mainloop *m) {
     pa_mutex_unlock(m->mutex);
 }
 
+/* Called with the lock taken */
 void pa_threaded_mainloop_signal(pa_threaded_mainloop *m, int wait_for_accept) {
     pa_assert(m);
 
@@ -198,6 +199,7 @@ void pa_threaded_mainloop_signal(pa_threaded_mainloop *m, int wait_for_accept) {
     }
 }
 
+/* Called with the lock taken */
 void pa_threaded_mainloop_wait(pa_threaded_mainloop *m) {
     pa_assert(m);
 
@@ -212,6 +214,7 @@ void pa_threaded_mainloop_wait(pa_threaded_mainloop *m) {
     m->n_waiting --;
 }
 
+/* Called with the lock taken */
 void pa_threaded_mainloop_accept(pa_threaded_mainloop *m) {
     pa_assert(m);
 

commit e8a5746f2fcae59bfd18d39b621509b3ef130453
Author: Arun Raghavan <arun.raghavan at collabora.co.uk>
Date:   Sun Dec 6 12:31:25 2009 +0530

    Add a configure option to change 'udevrulesdir'
    
    This patch serves two purposes:
    
      1) Allows something other than the de-facto standard udev rules dir or
         /lib/udev/rules.d to be used (the udev build system allows you to
         customise this)
    
      2) Allows a prefixed, non-root install (right now, the /lib/... path
         is hard-coded into the build system

diff --git a/configure.ac b/configure.ac
index dfbd9bc..af60fff 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1395,6 +1395,13 @@ AC_ARG_WITH(
 
 AC_SUBST(modlibexecdir)
 
+AC_ARG_WITH(
+        [udev-rules-dir],
+        AS_HELP_STRING([--with-udev-rules-dir],[Directory where to install udev rules to (defaults to /lib/udev/rules.d)]),
+        [udevrulesdir=$withval], [udevrulesdir="/lib/udev/rules.d"])
+
+AC_SUBST(udevrulesdir)
+
 AC_ARG_ENABLE(
         [force-preopen],
         AS_HELP_STRING([--enable-force-preopen],[Preopen modules, even when dlopen() is supported.]),
diff --git a/src/Makefile.am b/src/Makefile.am
index 3be2869..11826a4 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -31,7 +31,6 @@ pulselibexecdir=$(libexecdir)/pulse
 xdgautostartdir=$(sysconfdir)/xdg/autostart
 alsaprofilesetsdir=$(datadir)/pulseaudio/alsa-mixer/profile-sets
 alsapathsdir=$(datadir)/pulseaudio/alsa-mixer/paths
-udevrulesdir=/lib/udev/rules.d
 dbuspolicydir=$(sysconfdir)/dbus-1/system.d
 
 ###################################

commit f9b03d3a44e905d50dfac1483dbf1818d2b84ffa
Merge: 1b2cbe9 e8a5746
Author: Daniel Mack <daniel at caiaq.de>
Date:   Sun Dec 6 15:53:36 2009 +0100

    Merge branch 'master' of git://0pointer.de/pulseaudio


commit 76acaa964e01d119c39ff617691179d54805b412
Author: Kim Lester <kim at dfusion.com.au>
Date:   Wed Sep 16 09:07:50 2009 +0800

    configure.ac: add DARWIN_OS variable
    
    Signed-off-by: Kim Lester <kim at dfusion.com.au>
    Signed-off-by: Daniel Mack <daniel at caiaq.de>

diff --git a/configure.ac b/configure.ac
index af60fff..11af89b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -172,6 +172,10 @@ case $host in
             AC_MSG_RESULT([linux])
             pulse_target_os=linux
         ;;
+        *-*-darwin*)
+            AC_MSG_RESULT([darwin])
+            pulse_target_os=darwin
+        ;;
         *)
             AC_MSG_RESULT([unknown])
             pulse_target_os=unknown
@@ -291,15 +295,21 @@ AC_SUBST([LIBLTDL])
 #### Determine build environment ####
 
 os_is_win32=0
+os_is_darwin=0
 
 case "$host_os" in
         mingw*)
         AC_DEFINE([OS_IS_WIN32], 1, [Build target is Windows.])
         os_is_win32=1
                 ;;
+        darwin*)
+        AC_DEFINE([OS_IS_DARWIN], 1, [Build target is Darwin.])
+        os_is_darwin=1
+                ;;
         esac
 
 AM_CONDITIONAL(OS_IS_WIN32, test "x$os_is_win32" = "x1")
+AM_CONDITIONAL(OS_IS_DARWIN, test "x$os_is_darwin" = "x1")
 
 ###################################
 #   Basic environment checks      #
@@ -403,6 +413,18 @@ AC_SEARCH_LIBS([backtrace], [execinfo])
 # build, disabling its ability to make dlls.
 AC_CHECK_FUNCS([getopt_long], [], [AC_CHECK_LIB([iberty], [getopt_long])])
 
+# Darwin/OS X
+if test "x$os_is_darwin" = "x1" ; then
+    AC_MSG_CHECKING([looking for Apple CoreService Framework])
+    # How do I check a framework "library" - AC_CHECK_LIB prob. won't work??, just assign LIBS & hope
+    AC_CHECK_HEADER([/Developer/Headers/FlatCarbon/CoreServices.h],
+    [LIBS="$LIBS -framework CoreServices"],
+    [AC_MSG_ERROR([CoreServices.h header file not found]) ])
+
+    AC_MSG_RESULT([ok])
+    AC_DEFINE([HAVE_CLOCK_GETTIME], 1, [Using clock_gettime() replacement])
+fi
+
 #### Check for functions ####
 
 # ISO

commit a46ddfebb592852ff791bc90b3953880c49073dd
Author: Daniel Mack <daniel at caiaq.de>
Date:   Sun Nov 1 20:06:08 2009 +0100

    core-rtclock.c: tweak OS_IS_DARWIN constraints
    
    Move the code for OS_IS_DARWIN to the top as on Darwin,
    HAVE_CLOCK_GETTIME is also defined.

diff --git a/src/pulsecore/core-rtclock.c b/src/pulsecore/core-rtclock.c
index 4fe0a47..110158b 100644
--- a/src/pulsecore/core-rtclock.c
+++ b/src/pulsecore/core-rtclock.c
@@ -37,6 +37,7 @@
 #include <CoreServices/CoreServices.h>
 #include <mach/mach.h>
 #include <mach/mach_time.h>
+#include <unistd.h>
 #endif
 
 #include <pulse/timeval.h>
@@ -54,7 +55,19 @@ pa_usec_t pa_rtclock_age(const struct timeval *tv) {
 
 struct timeval *pa_rtclock_get(struct timeval *tv) {
 
-#if defined(HAVE_CLOCK_GETTIME)
+#if defined(OS_IS_DARWIN)
+    uint64_t val, abs_time = mach_absolute_time();
+    Nanoseconds nanos;
+
+    nanos = AbsoluteToNanoseconds(*(AbsoluteTime *) &abs_time);
+    val = *(uint64_t *) &nanos;
+
+    tv->tv_sec = val / PA_NSEC_PER_SEC;
+    tv->tv_usec = (val % PA_NSEC_PER_SEC) / PA_NSEC_PER_USEC;
+
+    return tv;
+
+#elif defined(HAVE_CLOCK_GETTIME)
     struct timespec ts;
 
 #ifdef CLOCK_MONOTONIC
@@ -75,65 +88,39 @@ struct timeval *pa_rtclock_get(struct timeval *tv) {
     tv->tv_usec = ts.tv_nsec / PA_NSEC_PER_USEC;
 
     return tv;
-
-#elif defined(OS_IS_DARWIN)
-    static mach_timebase_info_data_t   tbi;
-    uint64_t nticks;
-    uint64_t time_nsec;
-
-    /* Refer Apple ADC QA1398
-       Also: http://devworld.apple.com/documentation/Darwin/Conceptual/KernelProgramming/services/services.html
-
-       Note: argument is timespec NOT timeval (timespec uses nsec, timeval uses usec)
-    */
-
-    /* try and be a mite efficient - maybe I should keep the N/D as a float !? */
-    if (tbi.denom == 0)
-        mach_timebase_info(&tbi);
-
-    nticks = mach_absolute_time();
-    time_nsec = nticks * tbi.numer / tbi.denom; // see above
-
-    tv->tv_sec = time_nsec / PA_NSEC_PER_SEC;
-    tv->tv_usec = time_nsec / PA_NSEC_PER_USEC;
-
-    return tv;
-
-#else /* OS_IS_DARWIN */
+#endif /* HAVE_CLOCK_GETTIME */
 
     return pa_gettimeofday(tv);
-
-#endif
 }
 
 pa_bool_t pa_rtclock_hrtimer(void) {
 
-#if defined(HAVE_CLOCK_GETTIME)
+#if defined (OS_IS_DARWIN)
+    mach_timebase_info_data_t tbi;
+    uint64_t time_nsec;
+
+    mach_timebase_info(&tbi);
+
+    /* nsec = nticks * (N/D) - we want 1 tick == resolution !? */
+    time_nsec = tbi.numer / tbi.denom;
+    return time_nsec <= (long) (PA_HRTIMER_THRESHOLD_USEC*PA_NSEC_PER_USEC);
+
+#elif defined(HAVE_CLOCK_GETTIME)
     struct timespec ts;
 
 #ifdef CLOCK_MONOTONIC
 
     if (clock_getres(CLOCK_MONOTONIC, &ts) >= 0)
         return ts.tv_sec == 0 && ts.tv_nsec <= (long) (PA_HRTIMER_THRESHOLD_USEC*PA_NSEC_PER_USEC);
+
 #endif /* CLOCK_MONOTONIC */
 
     pa_assert_se(clock_getres(CLOCK_REALTIME, &ts) == 0);
     return ts.tv_sec == 0 && ts.tv_nsec <= (long) (PA_HRTIMER_THRESHOLD_USEC*PA_NSEC_PER_USEC);
 
-#elif defined (OS_IS_DARWIN)
-    mach_timebase_info_data_t tbi;
-    uint64_t time_nsec;
-
-    mach_timebase_info(&tbi);
+#endif /* HAVE_CLOCK_GETTIME */
 
-    /* nsec = nticks * (N/D) - we want 1 tick == resolution !? */
-    time_nsec = tbi.numer / tbi.denom;
-    return time_nsec <= (long) (PA_HRTIMER_THRESHOLD_USEC*PA_NSEC_PER_USEC);
-
-#else /* OS_IS_DARWIN */
     return FALSE;
-
-#endif
 }
 
 #define TIMER_SLACK_NS (int) ((500 * PA_NSEC_PER_USEC))

commit 962164a3b7f17f8a981862d7913a420636241a41
Author: Kim Lester <kim at dfusion.com.au>
Date:   Wed Sep 16 09:24:27 2009 +0800

    src/Makefile.am: add specific OS_IS_DARWIN files
    
    Signed-off-by: Kim Lester <kim at dfusion.com.au>
    Signed-off-by: Daniel Mack <daniel at caiaq.de>

diff --git a/src/Makefile.am b/src/Makefile.am
index 11826a4..90160d1 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -640,12 +640,21 @@ libpulsecommon_ at PA_MAJORMINORMICRO@_la_SOURCES += \
 		pulsecore/mutex-win32.c pulsecore/mutex.h \
 		pulsecore/thread-win32.c pulsecore/thread.h \
 		pulsecore/semaphore-win32.c pulsecore/semaphore.h
-else
+else !OS_IS_WIN32
+if OS_IS_DARWIN
+libpulsecommon_ at PA_MAJORMINORMICRO@_la_SOURCES += \
+		pulsecore/mutex-posix.c pulsecore/mutex.h \
+		pulsecore/thread-posix.c pulsecore/thread.h \
+		pulsecore/semaphore-osx.c pulsecore/semaphore.h
+libpulsecommon_ at PA_MAJORMINORMICRO@_la_CFLAGS += "-I/Developer/Headers/FlatCarbon/"
+#libpulsecommon_ at PA_MAJORMINORMICRO@_la_LDFLAGS += "-framework CoreServices"
+else !OS_IS_DARWIN
 libpulsecommon_ at PA_MAJORMINORMICRO@_la_SOURCES += \
 		pulsecore/mutex-posix.c pulsecore/mutex.h \
 		pulsecore/thread-posix.c pulsecore/thread.h \
 		pulsecore/semaphore-posix.c pulsecore/semaphore.h
-endif
+endif !OS_IS_DARWIN
+endif !OS_IS_WIN32
 
 if HAVE_X11
 libpulsecommon_ at PA_MAJORMINORMICRO@_la_SOURCES += pulsecore/x11prop.c pulsecore/x11prop.h

commit 17d34462eace417075efa2314999a77e41a3849b
Author: Daniel Mack <daniel at caiaq.de>
Date:   Mon Nov 23 00:12:18 2009 +0100

    poll() is totally broken on Mac OS X
    
    Even on 10.5.8, poll() does not do the right thing. Haven't checked on
    newer versions. Hence, wrap all occurences of poll() to pa_poll and
    emulate that call with select() on OSX. This is totally embarassing.

diff --git a/src/modules/module-sine-source.c b/src/modules/module-sine-source.c
index 9826e5f..53f5335 100644
--- a/src/modules/module-sine-source.c
+++ b/src/modules/module-sine-source.c
@@ -32,7 +32,6 @@
 #include <unistd.h>
 #include <limits.h>
 #include <sys/ioctl.h>
-#include <sys/poll.h>
 
 #include <pulse/rtclock.h>
 #include <pulse/timeval.h>
@@ -48,6 +47,7 @@
 #include <pulsecore/thread.h>
 #include <pulsecore/thread-mq.h>
 #include <pulsecore/rtpoll.h>
+#include <pulsecore/poll.h>
 
 #include "module-sine-source-symdef.h"
 
diff --git a/src/modules/raop/module-raop-sink.c b/src/modules/raop/module-raop-sink.c
index ac48ab1..ce534ce 100644
--- a/src/modules/raop/module-raop-sink.c
+++ b/src/modules/raop/module-raop-sink.c
@@ -32,7 +32,6 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <limits.h>
-#include <poll.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <netinet/tcp.h>
@@ -60,6 +59,7 @@
 #include <pulsecore/thread.h>
 #include <pulsecore/time-smoother.h>
 #include <pulsecore/socket-util.h>
+#include <pulsecore/poll.h>
 
 #include "module-raop-sink-symdef.h"
 #include "rtp.h"
diff --git a/src/modules/raop/raop_client.c b/src/modules/raop/raop_client.c
index c4b0237..e3152dd 100644
--- a/src/modules/raop/raop_client.c
+++ b/src/modules/raop/raop_client.c
@@ -51,12 +51,7 @@
 #include <pulsecore/macro.h>
 #include <pulsecore/strbuf.h>
 #include <pulsecore/random.h>
-
-#ifdef HAVE_POLL_H
-#include <poll.h>
-#else
 #include <pulsecore/poll.h>
-#endif
 
 #include "raop_client.h"
 #include "rtsp_client.h"
diff --git a/src/modules/rtp/rtsp_client.c b/src/modules/rtp/rtsp_client.c
index 5961806..6094eb8 100644
--- a/src/modules/rtp/rtsp_client.c
+++ b/src/modules/rtp/rtsp_client.c
@@ -45,12 +45,7 @@
 #include <pulsecore/macro.h>
 #include <pulsecore/strbuf.h>
 #include <pulsecore/ioline.h>
-
-#ifdef HAVE_POLL_H
-#include <poll.h>
-#else
 #include <pulsecore/poll.h>
-#endif
 
 #include "rtsp_client.h"
 
diff --git a/src/pulse/mainloop.c b/src/pulse/mainloop.c
index 6cd089e..8f743ec 100644
--- a/src/pulse/mainloop.c
+++ b/src/pulse/mainloop.c
@@ -32,12 +32,6 @@
 #include <fcntl.h>
 #include <errno.h>
 
-#ifdef HAVE_POLL_H
-#include <poll.h>
-#else
-#include <pulsecore/poll.h>
-#endif
-
 #ifndef HAVE_PIPE
 #include <pulsecore/pipe.h>
 #endif
@@ -47,6 +41,7 @@
 #include <pulse/timeval.h>
 #include <pulse/xmalloc.h>
 
+#include <pulsecore/poll.h>
 #include <pulsecore/core-rtclock.h>
 #include <pulsecore/core-util.h>
 #include <pulsecore/llist.h>
@@ -887,7 +882,7 @@ int pa_mainloop_poll(pa_mainloop *m) {
                     m->prepared_timeout == PA_USEC_INVALID ? NULL : pa_timespec_store(&ts, m->prepared_timeout),
                     NULL);
 #else
-            m->poll_func_ret = poll(
+            m->poll_func_ret = pa_poll(
                     m->pollfds, m->n_pollfds,
                     usec_to_timeout(m->prepared_timeout));
 #endif
diff --git a/src/pulsecore/lock-autospawn.c b/src/pulsecore/lock-autospawn.c
index 65e3563..95ca04a 100644
--- a/src/pulsecore/lock-autospawn.c
+++ b/src/pulsecore/lock-autospawn.c
@@ -33,6 +33,7 @@
 #include <pulse/i18n.h>
 #include <pulse/xmalloc.h>
 
+#include <pulsecore/poll.h>
 #include <pulsecore/mutex.h>
 #include <pulsecore/thread.h>
 #include <pulsecore/core-util.h>
@@ -182,7 +183,7 @@ static void wait_for_ping(void) {
     pfd.fd = pipe_fd[0];
     pfd.events = POLLIN;
 
-    if ((k = poll(&pfd, 1, -1)) != 1) {
+    if ((k = pa_poll(&pfd, 1, -1)) != 1) {
         pa_assert(k < 0);
         pa_assert(errno == EINTR);
     } else if ((s = read(pipe_fd[0], &x, 1)) != 1) {
diff --git a/src/pulsecore/poll.c b/src/pulsecore/poll.c
index 46a69c5..1dcace8 100644
--- a/src/pulsecore/poll.c
+++ b/src/pulsecore/poll.c
@@ -43,13 +43,18 @@
 
 #include "winsock.h"
 
-#ifndef HAVE_POLL_H
-
 #include <pulsecore/core-util.h>
+#include <pulse/util.h>
 
 #include "poll.h"
 
-int poll (struct pollfd *fds, unsigned long int nfds, int timeout) {
+/* Mac OSX fails to implement poll() in a working way since 10.4. IOW, for
+ * several years. We need to enable a dirty workaround and emulate that call
+ * with select(), just like for Windows. sic! */
+
+#if !defined(HAVE_POLL_H) || defined(OS_IS_DARWIN)
+
+int pa_poll (struct pollfd *fds, unsigned long int nfds, int timeout) {
     struct timeval tv;
     fd_set rset, wset, xset;
     struct pollfd *f;
diff --git a/src/pulsecore/poll.h b/src/pulsecore/poll.h
index fe0c6af..a137d97 100644
--- a/src/pulsecore/poll.h
+++ b/src/pulsecore/poll.h
@@ -24,6 +24,10 @@
    Copyright (C) 1994,96,97,98,99,2000,2001,2004 Free Software Foundation, Inc.
 ***/
 
+#if defined(HAVE_POLL_H)
+#include <poll.h>
+#else
+
 /* Event types that can be polled for.  These bits may be set in `events'
    to indicate the interesting event types; they will appear in `revents'
    to indicate the status of the file descriptor.  */
@@ -38,10 +42,6 @@
 #define POLLHUP         0x010           /* Hung up.  */
 #define POLLNVAL        0x020           /* Invalid polling request.  */
 
-
-/* Type used for the number of file descriptors.  */
-typedef unsigned long int nfds_t;
-
 /* Data structure describing a polling request.  */
 struct pollfd
   {
@@ -50,9 +50,17 @@ struct pollfd
     short int revents;          /* Types of events that actually occurred.  */
   };
 
+
 /* Poll the file descriptors described by the NFDS structures starting at
    FDS.  If TIMEOUT is nonzero and not -1, allow TIMEOUT milliseconds for
    an event to occur; if TIMEOUT is -1, block until an event occurs.
    Returns the number of file descriptors with events, zero if timed out,
    or -1 for errors.  */
-extern int poll (struct pollfd *__fds, nfds_t __nfds, int __timeout);
+
+#endif /* HAVE_POLL_H */
+
+#if defined(HAVE_POLL_H) && !defined(OS_IS_DARWIN)
+#define pa_poll(fds,nfds,timeout) poll((fds),(nfds),(timeout))
+#else
+int pa_poll (struct pollfd *fds, unsigned long nfds, int timeout);
+#endif
diff --git a/src/pulsecore/rtpoll.c b/src/pulsecore/rtpoll.c
index 666cbc9..83993f0 100644
--- a/src/pulsecore/rtpoll.c
+++ b/src/pulsecore/rtpoll.c
@@ -30,15 +30,10 @@
 #include <string.h>
 #include <errno.h>
 
-#ifdef HAVE_POLL_H
-#include <poll.h>
-#else
-#include <pulsecore/poll.h>
-#endif
-
 #include <pulse/xmalloc.h>
 #include <pulse/timeval.h>
 
+#include <pulsecore/poll.h>
 #include <pulsecore/core-error.h>
 #include <pulsecore/core-rtclock.h>
 #include <pulsecore/macro.h>
@@ -304,7 +299,7 @@ int pa_rtpoll_run(pa_rtpoll *p, pa_bool_t wait_op) {
         r = ppoll(p->pollfd, p->n_pollfd_used, (!wait_op || p->quit || p->timer_enabled) ? &ts : NULL, NULL);
     }
 #else
-    r = poll(p->pollfd, p->n_pollfd_used, (!wait_op || p->quit || p->timer_enabled) ? (int) ((timeout.tv_sec*1000) + (timeout.tv_usec / 1000)) : -1);
+    r = pa_poll(p->pollfd, p->n_pollfd_used, (!wait_op || p->quit || p->timer_enabled) ? (int) ((timeout.tv_sec*1000) + (timeout.tv_usec / 1000)) : -1);
 #endif
 
     p->timer_elapsed = r == 0;
diff --git a/src/tests/lock-autospawn-test.c b/src/tests/lock-autospawn-test.c
index c754e23..6f7156d 100644
--- a/src/tests/lock-autospawn-test.c
+++ b/src/tests/lock-autospawn-test.c
@@ -23,9 +23,9 @@
 #include <config.h>
 #endif
 
-#include <sys/poll.h>
 #include <string.h>
 
+#include <pulsecore/poll.h>
 #include <pulsecore/macro.h>
 #include <pulsecore/thread.h>
 #include <pulsecore/lock-autospawn.h>
@@ -69,7 +69,7 @@ static void thread_func2(void *k) {
         pollfd.fd = fd;
         pollfd.events = POLLIN;
 
-        pa_assert_se(poll(&pollfd, 1, -1) == 1);
+        pa_assert_se(pa_poll(&pollfd, 1, -1) == 1);
 
         pa_log("%i, woke up", PA_PTR_TO_INT(k));
     }
diff --git a/src/tests/rtpoll-test.c b/src/tests/rtpoll-test.c
index 1706cdf..6a6b73a 100644
--- a/src/tests/rtpoll-test.c
+++ b/src/tests/rtpoll-test.c
@@ -22,8 +22,8 @@
 #endif
 
 #include <signal.h>
-#include <poll.h>
 
+#include <pulsecore/poll.h>
 #include <pulsecore/log.h>
 #include <pulsecore/rtpoll.h>
 
diff --git a/src/utils/pacmd.c b/src/utils/pacmd.c
index ef58e9c..6ffe94f 100644
--- a/src/utils/pacmd.c
+++ b/src/utils/pacmd.c
@@ -25,7 +25,6 @@
 
 #include <assert.h>
 #include <signal.h>
-#include <sys/poll.h>
 #include <sys/socket.h>
 #include <unistd.h>
 #include <errno.h>
@@ -38,6 +37,7 @@
 #include <pulse/xmalloc.h>
 #include <pulse/i18n.h>
 
+#include <pulsecore/poll.h>
 #include <pulsecore/macro.h>
 #include <pulsecore/core-util.h>
 #include <pulsecore/log.h>
@@ -153,7 +153,7 @@ int main(int argc, char*argv[]) {
         else if (!ibuf_eof)
             pollfd[WATCH_STDIN].events |= POLLIN;
 
-        if (poll(pollfd, N_WATCH, -1) < 0) {
+        if (pa_poll(pollfd, N_WATCH, -1) < 0) {
 
             if (errno == EINTR)
                 continue;

commit 28a73ad1203efc6f6dc33629ce653f45081210fa
Author: Daniel Mack <daniel at caiaq.de>
Date:   Mon Dec 7 00:40:03 2009 +0100

    hack around another OS X bug: recv() with MSG_PEEK does not work
    
    At least for pipes, recv() with MSG_PEEK does actually eat up data from
    file descriptors. Hence, this can't be used for PULLHUP emulation.
    
    Use another ioctl hack for that.

diff --git a/src/pulsecore/poll.c b/src/pulsecore/poll.c
index 1dcace8..b98fb16 100644
--- a/src/pulsecore/poll.c
+++ b/src/pulsecore/poll.c
@@ -35,6 +35,10 @@
 #include <config.h>
 #endif
 
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+
 #include <errno.h>
 
 #ifdef HAVE_SYS_SELECT_H
@@ -60,7 +64,9 @@ int pa_poll (struct pollfd *fds, unsigned long int nfds, int timeout) {
     struct pollfd *f;
     int ready;
     int maxfd = 0;
+#ifdef OS_IS_WIN32
     char data[64];
+#endif
 
     FD_ZERO (&rset);
     FD_ZERO (&wset);
@@ -103,6 +109,7 @@ int pa_poll (struct pollfd *fds, unsigned long int nfds, int timeout) {
     ready = select ((SELECT_TYPE_ARG1) maxfd + 1, SELECT_TYPE_ARG234 &rset,
                     SELECT_TYPE_ARG234 &wset, SELECT_TYPE_ARG234 &xset,
                     SELECT_TYPE_ARG5 (timeout == -1 ? NULL : &tv));
+
     if ((ready == -1) && (errno == EBADF)) {
         ready = 0;
 
@@ -165,6 +172,8 @@ int pa_poll (struct pollfd *fds, unsigned long int nfds, int timeout) {
 #endif
 
     if (ready > 0) {
+        int r;
+
         ready = 0;
         for (f = fds; f < &fds[nfds]; ++f) {
             f->revents = 0;
@@ -172,6 +181,18 @@ int pa_poll (struct pollfd *fds, unsigned long int nfds, int timeout) {
                 if (FD_ISSET (f->fd, &rset)) {
                     /* support for POLLHUP.  An hung up descriptor does not
                        increase the return value! */
+#ifdef OS_IS_DARWIN
+                    /* There is a bug in Mac OS X that causes it to ignore MSG_PEEK
+                     * for some kinds of descriptors.  Detect if this descriptor is a
+                     * connected socket, a server socket, or something else using a
+                     * 0-byte recv, and use ioctl(2) to detect POLLHUP.  */
+                    r = recv(f->fd, NULL, 0, MSG_PEEK);
+		    if (r == 0 || (r < 0 && errno == ENOTSOCK))
+		        ioctl(f->fd, FIONREAD, &r);
+
+		    if (r == 0)
+		        f->revents |= POLLHUP;
+#else /* !OS_IS_DARWIN */
                     if (recv (f->fd, data, 64, MSG_PEEK) == -1) {
                         if (errno == ESHUTDOWN || errno == ECONNRESET ||
                             errno == ECONNABORTED || errno == ENETRESET) {
@@ -179,6 +200,7 @@ int pa_poll (struct pollfd *fds, unsigned long int nfds, int timeout) {
                             f->revents |= POLLHUP;
                         }
                     }
+#endif
 
                     if (f->revents == 0)
                         f->revents |= POLLIN;

commit a23f5cf33d21461bdb6e7bb19dd3426041ca5bc1
Author: Daniel Mack <daniel at caiaq.de>
Date:   Tue Sep 22 11:10:26 2009 +0800

    CoreAudio: add device detection module
    
    This adds a new module for CoreAudio device detection. It registers a
    callback to detect hotplugged devices and creates/destroys modules named
    'module-coreaudio-device'. Devices are identified via a system-wide
    unique AudioDeviceID.

diff --git a/src/Makefile.am b/src/Makefile.am
index 90160d1..70ab5b0 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1066,6 +1066,11 @@ modlibexec_LTLIBRARIES += \
 		module-oss.la
 endif
 
+if HAVE_COREAUDIO
+modlibexec_LTLIBRARIES += \
+		module-coreaudio-detect.la
+endif
+
 pulselibexec_PROGRAMS =
 
 if HAVE_ALSA
@@ -1238,6 +1243,7 @@ SYMDEF_FILES = \
 		modules/alsa/module-alsa-sink-symdef.h \
 		modules/alsa/module-alsa-source-symdef.h \
 		modules/alsa/module-alsa-card-symdef.h \
+		modules/coreaudio/module-coreaudio-detect-symdef.h \
 		modules/module-solaris-symdef.h \
 		modules/module-waveout-symdef.h \
 		modules/module-detect-symdef.h \
@@ -1469,6 +1475,14 @@ module_oss_la_SOURCES = modules/oss/module-oss.c
 module_oss_la_LDFLAGS = $(MODULE_LDFLAGS)
 module_oss_la_LIBADD = $(AM_LIBADD) liboss-util.la libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
 
+# COREAUDIO
+
+module_coreaudio_detect_la_SOURCES = modules/coreaudio/module-coreaudio-detect.c
+module_coreaudio_detect_la_LDFLAGS = $(MODULE_LDFLAGS) \
+			-Wl,-framework -Wl,Cocoa -framework CoreAudio \
+			-Wl,-framework -Wl,AudioUnit -framework AudioUnit
+module_coreaudio_detect_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
+
 # ALSA
 
 libalsa_util_la_SOURCES = modules/alsa/alsa-util.c modules/alsa/alsa-util.h modules/alsa/alsa-mixer.c modules/alsa/alsa-mixer.h modules/alsa/alsa-sink.c modules/alsa/alsa-sink.h modules/alsa/alsa-source.c modules/alsa/alsa-source.h modules/reserve-wrap.c modules/reserve-wrap.h
diff --git a/src/modules/coreaudio/module-coreaudio-detect.c b/src/modules/coreaudio/module-coreaudio-detect.c
new file mode 100644
index 0000000..872678e
--- /dev/null
+++ b/src/modules/coreaudio/module-coreaudio-detect.c
@@ -0,0 +1,229 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Daniel Mack <daniel at caiaq.de>
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <pulse/xmalloc.h>
+
+#include <pulsecore/module.h>
+#include <pulsecore/core-util.h>
+#include <pulsecore/modargs.h>
+#include <pulsecore/log.h>
+#include <pulsecore/llist.h>
+
+#include <CoreAudio/CoreAudio.h>
+
+#include "module-coreaudio-detect-symdef.h"
+
+#define DEVICE_MODULE_NAME "module-coreaudio-device"
+
+PA_MODULE_AUTHOR("Daniel Mack");
+PA_MODULE_DESCRIPTION("CoreAudio device detection");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
+PA_MODULE_USAGE("");
+
+typedef struct ca_device ca_device;
+
+struct ca_device {
+    AudioDeviceID id;
+    unsigned int  module_index;
+    PA_LLIST_FIELDS(ca_device);
+};
+
+struct userdata {
+    int detect_fds[2];
+    pa_io_event *detect_io;
+
+    PA_LLIST_HEAD(ca_device, devices);
+};
+
+static int ca_device_added(struct pa_module *m, AudioDeviceID id) {
+    pa_module *mod;
+    struct userdata *u = m->userdata;
+    struct ca_device *dev;
+    char *args;
+
+    pa_assert(u);
+
+    args = pa_sprintf_malloc("device_id=%d", (int) id);
+    pa_log_debug("Loading %s with arguments '%s'", DEVICE_MODULE_NAME, args);
+    mod = pa_module_load(m->core, DEVICE_MODULE_NAME, args);
+    pa_xfree(args);
+
+    if (!mod) {
+        pa_log_info("Failed to load module %s with arguments '%s'", DEVICE_MODULE_NAME, args);
+        return -1;
+    }
+
+    dev = pa_xnew0(ca_device, 1);
+    dev->module_index = mod->index;
+    dev->id = id;
+
+    PA_LLIST_INIT(ca_device, dev);
+    PA_LLIST_PREPEND(ca_device, u->devices, dev);
+
+    return 0;
+}
+
+static int ca_update_device_list(struct pa_module *m) {
+    OSStatus err;
+    UInt32 i, size, num_devices;
+    Boolean writable;
+    AudioDeviceID *device_id;
+    struct ca_device *dev;
+    struct userdata *u = m->userdata;
+
+    pa_assert(u);
+
+    /* get the number of currently available audio devices */
+    err = AudioHardwareGetPropertyInfo(kAudioHardwarePropertyDevices, &size, &writable);
+    if (err) {
+        pa_log("Unable to get info for kAudioHardwarePropertyDevices.");
+        return -1;
+    }
+
+    num_devices = size / sizeof(AudioDeviceID);
+    device_id = pa_xnew(AudioDeviceID, num_devices);
+
+    err = AudioHardwareGetProperty(kAudioHardwarePropertyDevices, &size, device_id);
+    if (err) {
+        pa_log("Unable to get kAudioHardwarePropertyDevices.");
+        pa_xfree(device_id);
+        return -1;
+    }
+
+    /* scan for devices which are reported but not in our cached list */
+    for (i = 0; i < num_devices; i++) {
+        bool found = FALSE;
+
+        PA_LLIST_FOREACH(dev, u->devices)
+            if (dev->id == device_id[i]) {
+                found = TRUE;
+                break;
+            }
+
+        if (!found)
+            ca_device_added(m, device_id[i]);
+    }
+
+    /* scan for devices which are in our cached list but are not reported */
+scan_removed:
+
+    PA_LLIST_FOREACH(dev, u->devices) {
+        bool found = FALSE;
+
+        for (i = 0; i < num_devices; i++)
+            if (dev->id == device_id[i]) {
+                found = TRUE;
+                break;
+            }
+
+        if (!found) {
+            pa_log_debug("device id %d has been removed (module index %d)  %p", (unsigned int) dev->id, dev->module_index, dev);
+            pa_module_unload_request_by_index(m->core, dev->module_index, TRUE);
+            PA_LLIST_REMOVE(ca_device, u->devices, dev);
+            pa_xfree(dev);
+            /* the current list item pointer is not valid anymore, so start over. */
+            goto scan_removed;
+        }
+    }
+
+    pa_xfree(device_id);
+    return 0;
+}
+
+static OSStatus property_listener_proc(AudioHardwarePropertyID property, void *data) {
+    struct userdata *u = data;
+    char dummy = 1;
+
+    pa_assert(u);
+
+    /* dispatch module load/unload operations in main thread */
+    if (property == kAudioHardwarePropertyDevices)
+        write(u->detect_fds[1], &dummy, 1);
+
+    return 0;
+}
+
+static void detect_handle(pa_mainloop_api *a, pa_io_event *e, int fd, pa_io_event_flags_t events, void *userdata) {
+    pa_module *m = userdata;
+    char dummy;
+
+    pa_assert(m);
+
+    read(fd, &dummy, 1);
+    ca_update_device_list(m);
+}
+
+int pa__init(pa_module *m) {
+    struct userdata *u = pa_xnew0(struct userdata, 1);
+
+    m->userdata = u;
+
+    if (AudioHardwareAddPropertyListener(kAudioHardwarePropertyDevices, property_listener_proc, u)) {
+        pa_log("AudioHardwareAddPropertyListener() failed.");
+        goto fail;
+    }
+
+    if (ca_update_device_list(m))
+       goto fail;
+
+    pa_assert_se(pipe(u->detect_fds) == 0);
+    pa_assert_se(u->detect_io = m->core->mainloop->io_new(m->core->mainloop, u->detect_fds[0], PA_IO_EVENT_INPUT, detect_handle, m));
+
+    return 0;
+
+fail:
+    pa_xfree(u);
+    return -1;
+}
+
+void pa__done(pa_module *m) {
+    struct userdata *u = m->userdata;
+    struct ca_device *dev = u->devices;
+
+    pa_assert(u);
+
+    AudioHardwareRemovePropertyListener(kAudioHardwarePropertyDevices, property_listener_proc);
+
+    while (dev) {
+        struct ca_device *next = dev->next;
+
+        pa_module_unload_request_by_index(m->core, dev->module_index, TRUE);
+        pa_xfree(dev);
+
+        dev = next;
+    }
+
+    if (u->detect_fds[0] >= 0)
+        close(u->detect_fds[0]);
+
+    if (u->detect_fds[1] >= 0)
+        close(u->detect_fds[1]);
+
+    if (u->detect_io)
+        m->core->mainloop->io_free(u->detect_io);
+
+    pa_xfree(u);
+}

commit 7732421a27870a832d7121bc8342503f2fbf3c2a
Author: Daniel Mack <daniel at caiaq.de>
Date:   Tue Sep 22 11:27:57 2009 +0800

    CoreAudio: add audio device module
    
    This patch adds support for CoreAudio driven devices under Mac OS X. It
    is typically instanciated by the CoreAudio device detection module and
    handles all available streams on a specific device.
    
    Sinks are created according to the reported stream configuration.
    Float32 is used as default audio sample format at it is the only format
    CoreAudio speaks natively.
    
    Hardware volume control is not implemented yet.

diff --git a/src/Makefile.am b/src/Makefile.am
index 70ab5b0..fa5d170 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1068,7 +1068,8 @@ endif
 
 if HAVE_COREAUDIO
 modlibexec_LTLIBRARIES += \
-		module-coreaudio-detect.la
+		module-coreaudio-detect.la \
+		module-coreaudio-device.la
 endif
 
 pulselibexec_PROGRAMS =
@@ -1244,6 +1245,7 @@ SYMDEF_FILES = \
 		modules/alsa/module-alsa-source-symdef.h \
 		modules/alsa/module-alsa-card-symdef.h \
 		modules/coreaudio/module-coreaudio-detect-symdef.h \
+		modules/coreaudio/module-coreaudio-device-symdef.h \
 		modules/module-solaris-symdef.h \
 		modules/module-waveout-symdef.h \
 		modules/module-detect-symdef.h \
@@ -1483,6 +1485,11 @@ module_coreaudio_detect_la_LDFLAGS = $(MODULE_LDFLAGS) \
 			-Wl,-framework -Wl,AudioUnit -framework AudioUnit
 module_coreaudio_detect_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
 
+module_coreaudio_device_la_SOURCES = modules/coreaudio/module-coreaudio-device.c
+module_coreaudio_device_la_LDFLAGS = $(MODULE_LDFLAGS) \
+			-Wl,-framework -Wl,Cocoa -framework CoreAudio \
+			-Wl,-framework -Wl,AudioUnit -framework AudioUnit
+module_coreaudio_device_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
 # ALSA
 
 libalsa_util_la_SOURCES = modules/alsa/alsa-util.c modules/alsa/alsa-util.h modules/alsa/alsa-mixer.c modules/alsa/alsa-mixer.h modules/alsa/alsa-sink.c modules/alsa/alsa-sink.h modules/alsa/alsa-source.c modules/alsa/alsa-source.h modules/reserve-wrap.c modules/reserve-wrap.h
diff --git a/src/modules/coreaudio/module-coreaudio-device.c b/src/modules/coreaudio/module-coreaudio-device.c
new file mode 100644
index 0000000..a3699e6
--- /dev/null
+++ b/src/modules/coreaudio/module-coreaudio-device.c
@@ -0,0 +1,820 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Daniel Mack <daniel at caiaq.de>
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+/* TODO:
+    - implement hardware volume controls
+    - handle audio device stream format changes (will require changes to the core)
+*/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <pulse/xmalloc.h>
+#include <pulse/util.h>
+
+#include <pulsecore/core-error.h>
+#include <pulsecore/sink.h>
+#include <pulsecore/source.h>
+#include <pulsecore/module.h>
+#include <pulsecore/sample-util.h>
+#include <pulsecore/core-util.h>
+#include <pulsecore/modargs.h>
+#include <pulsecore/log.h>
+#include <pulsecore/macro.h>
+#include <pulsecore/llist.h>
+#include <pulsecore/card.h>
+#include <pulsecore/strbuf.h>
+#include <pulsecore/thread.h>
+#include <pulsecore/thread-mq.h>
+
+#include <CoreAudio/CoreAudio.h>
+#include <CoreAudio/CoreAudioTypes.h>
+#include <CoreAudio/AudioHardware.h>
+
+#include "module-coreaudio-device-symdef.h"
+
+#define DEFAULT_FRAMES_PER_IOPROC 512
+
+PA_MODULE_AUTHOR("Daniel Mack");
+PA_MODULE_DESCRIPTION("CoreAudio device");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
+PA_MODULE_USAGE("device_id=<the CoreAudio device id> "
+                "ioproc_frames=<audio frames per IOProc call> ");
+
+static const char* const valid_modargs[] = {
+    "device_id",
+    "ioproc_frames",
+    NULL
+};
+
+enum {
+    CA_MESSAGE_RENDER = PA_SINK_MESSAGE_MAX,
+};
+
+typedef struct coreaudio_sink coreaudio_sink;
+typedef struct coreaudio_source coreaudio_source;
+
+struct userdata {
+    AudioDeviceID device_id;
+    AudioDeviceIOProcID proc_id;
+
+    pa_thread_mq thread_mq;
+    pa_asyncmsgq *async_msgq;
+
+    pa_rtpoll *rtpoll;
+    pa_thread *thread;
+
+    pa_module *module;
+    pa_card *card;
+    pa_bool_t running;
+
+    char *device_name, *vendor_name;
+
+    const AudioBufferList *render_input_data;
+    AudioBufferList       *render_output_data;
+
+    AudioStreamBasicDescription stream_description;
+
+    PA_LLIST_HEAD(coreaudio_sink, sinks);
+    PA_LLIST_HEAD(coreaudio_source, sources);
+};
+
+struct coreaudio_sink {
+    pa_sink *pa_sink;
+    struct userdata *userdata;
+
+    char *name;
+    unsigned int channel_idx;
+    pa_bool_t active;
+
+    pa_channel_map map;
+    pa_sample_spec ss;
+
+    PA_LLIST_FIELDS(coreaudio_sink);
+};
+
+struct coreaudio_source {
+    pa_source *pa_source;
+    struct userdata *userdata;
+
+    char *name;
+    unsigned int channel_idx;
+    pa_bool_t active;
+
+    pa_channel_map map;
+    pa_sample_spec ss;
+
+    PA_LLIST_FIELDS(coreaudio_source);
+};
+
+static OSStatus io_render_proc (AudioDeviceID          device,
+                                const AudioTimeStamp  *now,
+                                const AudioBufferList *inputData,
+                                const AudioTimeStamp  *inputTime,
+                                AudioBufferList       *outputData,
+                                const AudioTimeStamp  *outputTime,
+                                void                  *clientData)
+{
+    struct userdata *u = clientData;
+
+    pa_assert(u);
+    pa_assert(device == u->device_id);
+
+    u->render_input_data = inputData;
+    u->render_output_data = outputData;
+
+    if (u->sinks)
+        pa_assert_se(pa_asyncmsgq_send(u->async_msgq, PA_MSGOBJECT(u->sinks->pa_sink),
+                                        CA_MESSAGE_RENDER, NULL, 0, NULL) == 0);
+
+    if (u->sources)
+        pa_assert_se(pa_asyncmsgq_send(u->async_msgq, PA_MSGOBJECT(u->sources->pa_source),
+                                        CA_MESSAGE_RENDER, NULL, 0, NULL) == 0);
+
+    return 0;
+}
+
+static OSStatus ca_stream_format_changed(AudioDeviceID inDevice,
+                                         UInt32 inChannel,
+                                         Boolean isInput,
+                                         AudioDevicePropertyID inPropertyID,
+                                         void *inClientData)
+{
+    struct userdata *u = inClientData;
+
+    pa_assert(u);
+
+    /* REVISIT: PA can't currently handle external format change requests.
+     * Hence, we set the original format back in this callback to avoid horrible audio artefacts.
+     * The device settings will appear to be 'locked' for any application as long as the PA daemon is running.
+     * Once we're able to propagate such events up in the core, this needs to be changed. */
+
+    return AudioDeviceSetProperty(inDevice, NULL, inChannel, isInput,
+                                  kAudioDevicePropertyStreamFormat, sizeof(u->stream_description), &u->stream_description);
+}
+
+static pa_usec_t get_latency_us(pa_object *o) {
+    struct userdata *u;
+    pa_sample_spec *ss;
+    bool is_source;
+    UInt32 v, total = 0;
+    UInt32 err, size = sizeof(v);
+
+    if (pa_sink_isinstance(o)) {
+        coreaudio_sink *sink = PA_SINK(o)->userdata;
+
+        u = sink->userdata;
+        ss = &sink->ss;
+        is_source = FALSE;
+    } else if (pa_source_isinstance(o)) {
+        coreaudio_source *source = PA_SOURCE(o)->userdata;
+
+        u = source->userdata;
+        ss = &source->ss;
+        is_source = TRUE;
+    } else
+        pa_assert_not_reached();
+
+    pa_assert(u);
+
+    /* get the device latency */
+    size = sizeof(total);
+    AudioDeviceGetProperty(u->device_id, 0, is_source, kAudioDevicePropertyLatency, &size, &v);
+    total += v;
+
+    /* the the IOProc buffer size */
+    size = sizeof(v);
+    AudioDeviceGetProperty(u->device_id, 0, is_source, kAudioDevicePropertyBufferFrameSize, &size, &v);
+    total += v;
+
+    /* IOProc safety offset - this value is the same for both directions, hence we divide it by 2 */
+    size = sizeof(v);
+    AudioDeviceGetProperty(u->device_id, 0, is_source, kAudioDevicePropertySafetyOffset, &size, &v);
+    total += v / 2;
+
+    /* get the stream latency.
+     * FIXME: this assumes the stream latency is the same for all streams */
+    err = AudioStreamGetProperty(0, is_source, kAudioStreamPropertyLatency, &size, &v);
+    if (!err)
+        total += v;
+
+    return pa_bytes_to_usec(total * pa_frame_size(ss), ss);
+}
+
+static void ca_device_check_device_state(struct userdata *u) {
+    coreaudio_sink *ca_sink;
+    coreaudio_source *ca_source;
+    pa_bool_t active = FALSE;
+
+    pa_assert(u);
+
+    for (ca_sink = u->sinks; ca_sink; ca_sink = ca_sink->next)
+        if (ca_sink->active)
+            active = TRUE;
+
+    for (ca_source = u->sources; ca_source; ca_source = ca_source->next)
+        if (ca_source->active)
+            active = TRUE;
+
+    if (active && !u->running)
+        AudioDeviceStart(u->device_id, u->proc_id);
+    else if (!active && u->running)
+        AudioDeviceStop(u->device_id, u->proc_id);
+
+    u->running = active;
+}
+
+static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
+    coreaudio_sink *sink = PA_SINK(o)->userdata;
+    struct userdata *u = sink->userdata;
+    unsigned int i;
+    pa_memchunk audio_chunk;
+
+    switch (code) {
+        case CA_MESSAGE_RENDER: {
+            /* audio out */
+            for (i = 0; i < u->render_output_data->mNumberBuffers; i++) {
+                AudioBuffer *buf = u->render_output_data->mBuffers + i;
+
+                pa_assert(sink);
+
+                if (PA_SINK_IS_OPENED(sink->pa_sink->thread_info.state)) {
+                    if (sink->pa_sink->thread_info.rewind_requested)
+                        pa_sink_process_rewind(sink->pa_sink, 0);
+
+                    audio_chunk.memblock = pa_memblock_new_fixed(u->module->core->mempool, buf->mData, buf->mDataByteSize, FALSE);
+                    audio_chunk.length = buf->mDataByteSize;
+                    audio_chunk.index = 0;
+
+                    pa_sink_render_into_full(sink->pa_sink, &audio_chunk);
+                    pa_memblock_unref_fixed(audio_chunk.memblock);
+                }
+
+                sink = sink->next;
+            }
+
+            return 0;
+        }
+
+        case PA_SINK_MESSAGE_GET_LATENCY: {
+            *((pa_usec_t *) data) = get_latency_us(PA_OBJECT(o));
+            return 0;
+        }
+
+        case PA_SINK_MESSAGE_SET_STATE:
+            switch ((pa_sink_state_t) PA_PTR_TO_UINT(data)) {
+                case PA_SINK_SUSPENDED:
+                case PA_SINK_IDLE:
+                    sink->active = FALSE;
+                    break;
+
+                case PA_SINK_RUNNING:
+                    sink->active = TRUE;
+                    break;
+
+                case PA_SINK_UNLINKED:
+                case PA_SINK_INIT:
+                case PA_SINK_INVALID_STATE:
+                    ;
+            }
+
+            ca_device_check_device_state(sink->userdata);
+            break;
+    }
+
+    return pa_sink_process_msg(o, code, data, offset, chunk);
+}
+
+static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
+    coreaudio_source *source = PA_SOURCE(o)->userdata;
+    struct userdata *u = source->userdata;
+    unsigned int i;
+    pa_memchunk audio_chunk;
+
+    switch (code) {
+        case CA_MESSAGE_RENDER: {
+            /* audio in */
+            for (i = 0; i < u->render_input_data->mNumberBuffers; i++) {
+                const AudioBuffer *buf = u->render_input_data->mBuffers + i;
+
+                pa_assert(source);
+
+                if (PA_SOURCE_IS_OPENED(source->pa_source->thread_info.state)) {
+                    audio_chunk.memblock = pa_memblock_new_fixed(u->module->core->mempool, buf->mData, buf->mDataByteSize, TRUE);
+                    audio_chunk.length = buf->mDataByteSize;
+                    audio_chunk.index = 0;
+
+                    pa_source_post(source->pa_source, &audio_chunk);
+                    pa_memblock_unref_fixed(audio_chunk.memblock);
+                }
+
+                source = source->next;
+            }
+
+            return 0;
+        }
+
+        case PA_SOURCE_MESSAGE_GET_LATENCY: {
+            *((pa_usec_t *) data) = get_latency_us(PA_OBJECT(o));
+            return 0;
+        }
+
+        case PA_SOURCE_MESSAGE_SET_STATE:
+            switch ((pa_source_state_t) PA_PTR_TO_UINT(data)) {
+                case PA_SOURCE_SUSPENDED:
+                case PA_SOURCE_IDLE:
+                    source->active = FALSE;
+                    break;
+
+                case PA_SOURCE_RUNNING:
+                    source->active = TRUE;
+                    break;
+
+                case PA_SOURCE_UNLINKED:
+                case PA_SOURCE_INIT:
+                case PA_SOURCE_INVALID_STATE:
+                    ;
+            }
+
+            ca_device_check_device_state(source->userdata);
+            break;
+    }
+
+    return pa_source_process_msg(o, code, data, offset, chunk);
+}
+
+static int ca_device_create_sink(pa_module *m, AudioBuffer *buf, int channel_idx) {
+    OSStatus err;
+    UInt32 size;
+    struct userdata *u = m->userdata;
+    pa_sink_new_data new_data;
+    pa_sink_flags_t flags = PA_SINK_LATENCY | PA_SINK_HARDWARE;
+    coreaudio_sink *ca_sink;
+    pa_sink *sink;
+    unsigned int i;
+    char tmp[255];
+    pa_strbuf *strbuf;
+
+    ca_sink = pa_xnew0(coreaudio_sink, 1);
+    ca_sink->map.channels = buf->mNumberChannels;
+    ca_sink->ss.channels = buf->mNumberChannels;
+    ca_sink->channel_idx = channel_idx;
+
+    /* build a name for this stream */
+    strbuf = pa_strbuf_new();
+
+    for (i = 0; i < buf->mNumberChannels; i++) {
+        size = sizeof(tmp);
+        err = AudioDeviceGetProperty(u->device_id, channel_idx + i + 1, 0, kAudioObjectPropertyElementName, &size, tmp);
+        if (err || !strlen(tmp))
+            snprintf(tmp, sizeof(tmp), "Channel %d", channel_idx + i + 1);
+
+        if (i > 0)
+            pa_strbuf_puts(strbuf, ", ");
+
+        pa_strbuf_puts(strbuf, tmp);
+    }
+
+    ca_sink->name = pa_strbuf_tostring_free(strbuf);
+
+    pa_log_debug("Stream name is >%s<", ca_sink->name);
+
+    /* default to mono streams */
+    for (i = 0; i < ca_sink->map.channels; i++)
+        ca_sink->map.map[i] = PA_CHANNEL_POSITION_MONO;
+
+    if (buf->mNumberChannels == 2) {
+        ca_sink->map.map[0] = PA_CHANNEL_POSITION_LEFT;
+        ca_sink->map.map[1] = PA_CHANNEL_POSITION_RIGHT;
+    }
+
+    ca_sink->ss.rate = u->stream_description.mSampleRate;
+    ca_sink->ss.format = PA_SAMPLE_FLOAT32LE;
+
+    pa_sink_new_data_init(&new_data);
+    new_data.card = u->card;
+    new_data.driver = __FILE__;
+    new_data.module = u->module;
+    new_data.namereg_fail = FALSE;
+    pa_sink_new_data_set_name(&new_data, ca_sink->name);
+    pa_sink_new_data_set_channel_map(&new_data, &ca_sink->map);
+    pa_sink_new_data_set_sample_spec(&new_data, &ca_sink->ss);
+    pa_proplist_sets(new_data.proplist, PA_PROP_DEVICE_STRING, u->device_name);
+    pa_proplist_sets(new_data.proplist, PA_PROP_DEVICE_PRODUCT_NAME, u->device_name);
+    pa_proplist_sets(new_data.proplist, PA_PROP_DEVICE_DESCRIPTION, u->device_name);
+    pa_proplist_sets(new_data.proplist, PA_PROP_DEVICE_ACCESS_MODE, "mmap");
+    pa_proplist_sets(new_data.proplist, PA_PROP_DEVICE_CLASS, "sound");
+    pa_proplist_sets(new_data.proplist, PA_PROP_DEVICE_API, "CoreAudio");
+    pa_proplist_setf(new_data.proplist, PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE, "%lu", (unsigned long) buf->mDataByteSize);
+
+    if (u->vendor_name)
+        pa_proplist_sets(new_data.proplist, PA_PROP_DEVICE_VENDOR_NAME, u->vendor_name);
+
+    sink = pa_sink_new(m->core, &new_data, flags);
+    pa_sink_new_data_done(&new_data);
+
+    if (!sink) {
+        pa_log("unable to create sink.");
+        return -1;
+    }
+
+    sink->parent.process_msg = sink_process_msg;
+    sink->userdata = ca_sink;
+
+    pa_sink_set_asyncmsgq(sink, u->thread_mq.inq);
+    pa_sink_set_rtpoll(sink, u->rtpoll);
+
+    ca_sink->pa_sink = sink;
+    ca_sink->userdata = u;
+
+    PA_LLIST_PREPEND(coreaudio_sink, u->sinks, ca_sink);
+
+    return 0;
+}
+
+static int ca_device_create_source(pa_module *m, AudioBuffer *buf, int channel_idx) {
+    OSStatus err;
+    UInt32 size;
+    struct userdata *u = m->userdata;
+    pa_source_new_data new_data;
+    pa_source_flags_t flags = PA_SOURCE_LATENCY | PA_SOURCE_HARDWARE;
+    coreaudio_source *ca_source;
+    pa_source *source;
+    unsigned int i;
+    char tmp[255];
+    pa_strbuf *strbuf;
+
+    ca_source = pa_xnew0(coreaudio_source, 1);
+    ca_source->map.channels = buf->mNumberChannels;
+    ca_source->ss.channels = buf->mNumberChannels;
+    ca_source->channel_idx = channel_idx;
+
+    /* build a name for this stream */
+    strbuf = pa_strbuf_new();
+
+    for (i = 0; i < buf->mNumberChannels; i++) {
+        size = sizeof(tmp);
+        err = AudioDeviceGetProperty(u->device_id, channel_idx + i + 1, 0, kAudioObjectPropertyElementName, &size, tmp);
+        if (err || !strlen(tmp))
+            snprintf(tmp, sizeof(tmp), "Channel %d", channel_idx + i + 1);
+
+        if (i > 0)
+            pa_strbuf_puts(strbuf, ", ");
+
+        pa_strbuf_puts(strbuf, tmp);
+    }
+
+    ca_source->name = pa_strbuf_tostring_free(strbuf);
+
+    pa_log_debug("Stream name is >%s<", ca_source->name);
+
+    /* default to mono streams */
+    for (i = 0; i < ca_source->map.channels; i++)
+        ca_source->map.map[i] = PA_CHANNEL_POSITION_MONO;
+
+    if (buf->mNumberChannels == 2) {
+        ca_source->map.map[0] = PA_CHANNEL_POSITION_LEFT;
+        ca_source->map.map[1] = PA_CHANNEL_POSITION_RIGHT;
+    }
+
+    ca_source->ss.rate = u->stream_description.mSampleRate;
+    ca_source->ss.format = PA_SAMPLE_FLOAT32LE;
+
+    pa_source_new_data_init(&new_data);
+    new_data.card = u->card;
+    new_data.driver = __FILE__;
+    new_data.module = u->module;
+    new_data.namereg_fail = FALSE;
+    pa_source_new_data_set_name(&new_data, ca_source->name);
+    pa_source_new_data_set_channel_map(&new_data, &ca_source->map);
+    pa_source_new_data_set_sample_spec(&new_data, &ca_source->ss);
+    pa_proplist_sets(new_data.proplist, PA_PROP_DEVICE_STRING, u->device_name);
+    pa_proplist_sets(new_data.proplist, PA_PROP_DEVICE_PRODUCT_NAME, u->device_name);
+    pa_proplist_sets(new_data.proplist, PA_PROP_DEVICE_DESCRIPTION, u->device_name);
+    pa_proplist_sets(new_data.proplist, PA_PROP_DEVICE_ACCESS_MODE, "mmap");
+    pa_proplist_sets(new_data.proplist, PA_PROP_DEVICE_CLASS, "sound");
+    pa_proplist_sets(new_data.proplist, PA_PROP_DEVICE_API, "CoreAudio");
+    pa_proplist_setf(new_data.proplist, PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE, "%lu", (unsigned long) buf->mDataByteSize);
+
+    if (u->vendor_name)
+        pa_proplist_sets(new_data.proplist, PA_PROP_DEVICE_VENDOR_NAME, u->vendor_name);
+
+    source = pa_source_new(m->core, &new_data, flags);
+    pa_source_new_data_done(&new_data);
+
+    if (!source) {
+        pa_log("unable to create source.");
+        return -1;
+    }
+
+    source->parent.process_msg = source_process_msg;
+    source->userdata = ca_source;
+
+    pa_source_set_asyncmsgq(source, u->thread_mq.inq);
+    pa_source_set_rtpoll(source, u->rtpoll);
+
+    ca_source->pa_source = source;
+    ca_source->userdata = u;
+
+    PA_LLIST_PREPEND(coreaudio_source, u->sources, ca_source);
+
+    return 0;
+}
+
+static int ca_device_create_streams(pa_module *m, bool direction_in) {
+    OSStatus err;
+    UInt32 size, i, channel_idx;
+    struct userdata *u = m->userdata;
+    int section = direction_in ? 1 : 0;
+    AudioBufferList *buffer_list;
+
+    /* get current stream format */
+    size = sizeof(AudioStreamBasicDescription);
+    err = AudioDeviceGetProperty(u->device_id, 0, section, kAudioDevicePropertyStreamFormat, &size, &u->stream_description);
+    if (err) {
+        /* no appropriate streams found - silently bail. */
+        return -1;
+    }
+
+    if (u->stream_description.mFormatID != kAudioFormatLinearPCM) {
+        pa_log("Unsupported audio format '%c%c%c%c'",
+            (char) (u->stream_description.mFormatID >> 24),
+            (char) (u->stream_description.mFormatID >> 16) & 0xff,
+            (char) (u->stream_description.mFormatID >> 8) & 0xff,
+            (char) (u->stream_description.mFormatID & 0xff));
+        return -1;
+    }
+
+    /* get stream configuration */
+    size = 0;
+    err = AudioDeviceGetPropertyInfo(u->device_id, 0, section, kAudioDevicePropertyStreamConfiguration, &size, NULL);
+    if (err) {
+        pa_log("Failed to get kAudioDevicePropertyStreamConfiguration (%s).", direction_in ? "input" : "output");
+        return -1;
+    }
+
+    if (!size)
+        return 0;
+
+    buffer_list = (AudioBufferList *) pa_xmalloc(size);
+    err = AudioDeviceGetProperty(u->device_id, 0, section, kAudioDevicePropertyStreamConfiguration, &size, buffer_list);
+
+    if (!err) {
+        pa_log_debug("Sample rate: %f", u->stream_description.mSampleRate);
+        pa_log_debug("%d bytes per packet",   (unsigned int) u->stream_description.mBytesPerPacket);
+        pa_log_debug("%d frames per packet",  (unsigned int) u->stream_description.mFramesPerPacket);
+        pa_log_debug("%d bytes per frame",    (unsigned int) u->stream_description.mBytesPerFrame);
+        pa_log_debug("%d channels per frame", (unsigned int) u->stream_description.mChannelsPerFrame);
+        pa_log_debug("%d bits per channel",   (unsigned int) u->stream_description.mBitsPerChannel);
+
+        for (channel_idx = 0, i = 0; i < buffer_list->mNumberBuffers; i++) {
+            AudioBuffer *buf = buffer_list->mBuffers + i;
+
+            if (direction_in)
+                ca_device_create_source(m, buf, channel_idx);
+            else
+                ca_device_create_sink(m, buf, channel_idx);
+
+            channel_idx += buf->mNumberChannels;
+        }
+    }
+
+    pa_xfree(buffer_list);
+    return 0;
+}
+
+static void thread_func(void *userdata) {
+    struct userdata *u = userdata;
+
+    pa_assert(u);
+    pa_assert(u->module);
+    pa_assert(u->module->core);
+
+    pa_log_debug("Thread starting up");
+
+    if (u->module->core->realtime_scheduling)
+        pa_make_realtime(u->module->core->realtime_priority);
+
+    pa_thread_mq_install(&u->thread_mq);
+
+    for (;;) {
+        int ret;
+
+        ret = pa_rtpoll_run(u->rtpoll, TRUE);
+
+        if (ret < 0)
+            goto fail;
+
+        if (ret == 0)
+            goto finish;
+    }
+
+fail:
+    /* If this was no regular exit from the loop we have to continue
+     * processing messages until we received PA_MESSAGE_SHUTDOWN */
+    pa_asyncmsgq_post(u->thread_mq.outq, PA_MSGOBJECT(u->module->core), PA_CORE_MESSAGE_UNLOAD_MODULE, u->module, 0, NULL, NULL);
+    pa_asyncmsgq_wait_for(u->thread_mq.inq, PA_MESSAGE_SHUTDOWN);
+
+finish:
+    pa_log_debug("Thread shutting down");
+}
+
+int pa__init(pa_module *m) {
+    OSStatus err;
+    UInt32 size, frames;
+    struct userdata *u = NULL;
+    pa_modargs *ma = NULL;
+    char tmp[64];
+    pa_card_new_data card_new_data;
+    coreaudio_sink *ca_sink;
+    coreaudio_source *ca_source;
+
+    pa_assert(m);
+
+    if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
+        pa_log("Failed to parse module arguments.");
+        goto fail;
+    }
+
+    u = pa_xnew0(struct userdata, 1);
+    u->module = m;
+    m->userdata = u;
+
+    if (pa_modargs_get_value_u32(ma, "device_id", (unsigned int *) &u->device_id) != 0) {
+        pa_log("Failed to parse device_id argument.");
+        goto fail;
+    }
+
+    /* get device product name */
+    size = sizeof(tmp);
+    err = AudioDeviceGetProperty(u->device_id, 0, 0, kAudioDevicePropertyDeviceName, &size, &tmp);
+    if (err) {
+        pa_log("Failed to get kAudioDevicePropertyDeviceName (err = %08x).", (int) err);
+        goto fail;
+    }
+
+    u->device_name = pa_xstrdup(tmp);
+
+    pa_card_new_data_init(&card_new_data);
+    pa_proplist_sets(card_new_data.proplist, PA_PROP_DEVICE_STRING, tmp);
+    card_new_data.driver = __FILE__;
+    pa_card_new_data_set_name(&card_new_data, tmp);
+    pa_log_info("Initializing module for CoreAudio device '%s' (id %d)", tmp, (unsigned int) u->device_id);
+
+    /* get device vendor name (may fail) */
+    size = sizeof(tmp);
+    err = AudioDeviceGetProperty(u->device_id, 0, 0, kAudioDevicePropertyDeviceManufacturer, &size, &tmp);
+    if (!err)
+        u->vendor_name = pa_xstrdup(tmp);
+
+    /* create the card object */
+    u->card = pa_card_new(m->core, &card_new_data);
+    if (!u->card) {
+        pa_log("Unable to create card.\n");
+        goto fail;
+    }
+
+    pa_card_new_data_done(&card_new_data);
+    u->card->userdata = u;
+
+    u->rtpoll = pa_rtpoll_new();
+    pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll);
+    u->async_msgq = pa_asyncmsgq_new(0);
+    pa_rtpoll_item_new_asyncmsgq_read(u->rtpoll, PA_RTPOLL_EARLY-1, u->async_msgq);
+
+    PA_LLIST_HEAD_INIT(coreaudio_sink, u->sinks);
+
+    /* create sinks */
+    ca_device_create_streams(m, FALSE);
+
+    /* create sources */
+    ca_device_create_streams(m, TRUE);
+
+    /* create the message thread */
+    if (!(u->thread = pa_thread_new(thread_func, u))) {
+        pa_log("Failed to create thread.");
+        goto fail;
+    }
+
+    /* register notification callback for stream format changes */
+    AudioDeviceAddPropertyListener(u->device_id, 0, 0, kAudioDevicePropertyStreamFormat, ca_stream_format_changed, u);
+
+    /* set number of frames in IOProc */
+    frames = DEFAULT_FRAMES_PER_IOPROC;
+    pa_modargs_get_value_u32(ma, "ioproc_frames", (unsigned int *) &frames);
+
+    AudioDeviceSetProperty(u->device_id, NULL, 0, 0, kAudioDevicePropertyBufferFrameSize, sizeof(frames), &frames);
+    pa_log_debug("%u frames per IOProc\n", (unsigned int) frames);
+
+    /* create one ioproc for both directions */
+    err = AudioDeviceCreateIOProcID(u->device_id, io_render_proc, u, &u->proc_id);
+    if (err) {
+        pa_log("AudioDeviceCreateIOProcID() failed (err = %08x\n).", (int) err);
+        goto fail;
+    }
+
+    for (ca_sink = u->sinks; ca_sink; ca_sink = ca_sink->next)
+        pa_sink_put(ca_sink->pa_sink);
+
+    for (ca_source = u->sources; ca_source; ca_source = ca_source->next)
+        pa_source_put(ca_source->pa_source);
+
+    pa_modargs_free(ma);
+
+    return 0;
+
+fail:
+    if (u)
+        pa__done(m);
+
+    if (ma)
+        pa_modargs_free(ma);
+
+    return -1;
+}
+
+void pa__done(pa_module *m) {
+    struct userdata *u;
+    coreaudio_sink *ca_sink;
+    coreaudio_source *ca_source;
+
+    pa_assert(m);
+
+    u = m->userdata;
+    pa_assert(u);
+
+    /* unlink sinks */
+    for (ca_sink = u->sinks; ca_sink; ca_sink = ca_sink->next)
+        if (ca_sink->pa_sink)
+            pa_sink_unlink(ca_sink->pa_sink);
+
+    /* unlink sources */
+    for (ca_source = u->sources; ca_source; ca_source = ca_source->next)
+        if (ca_source->pa_source)
+            pa_source_unlink(ca_source->pa_source);
+
+    if (u->thread) {
+        pa_asyncmsgq_send(u->thread_mq.inq, NULL, PA_MESSAGE_SHUTDOWN, NULL, 0, NULL);
+        pa_thread_free(u->thread);
+        pa_thread_mq_done(&u->thread_mq);
+        pa_asyncmsgq_unref(u->async_msgq);
+    }
+
+    /* free sinks */
+    for (ca_sink = u->sinks; ca_sink;) {
+        coreaudio_sink *next = ca_sink->next;
+
+        if (ca_sink->pa_sink)
+            pa_sink_unref(ca_sink->pa_sink);
+
+        pa_xfree(ca_sink->name);
+        pa_xfree(ca_sink);
+        ca_sink = next;
+    }
+
+    /* free sources */
+    for (ca_source = u->sources; ca_source;) {
+        coreaudio_source *next = ca_source->next;
+
+        if (ca_source->pa_source)
+            pa_source_unref(ca_source->pa_source);
+
+        pa_xfree(ca_source->name);
+        pa_xfree(ca_source);
+        ca_source = next;
+    }
+
+    if (u->proc_id) {
+        AudioDeviceStop(u->device_id, u->proc_id);
+        AudioDeviceDestroyIOProcID(u->device_id, u->proc_id);
+    }
+
+    AudioDeviceRemovePropertyListener(u->device_id, 0, 0, kAudioDevicePropertyStreamFormat, ca_stream_format_changed);
+
+    pa_xfree(u->device_name);
+    pa_xfree(u->vendor_name);
+    pa_rtpoll_free(u->rtpoll);
+    pa_card_free(u->card);
+
+    pa_xfree(u);
+}

commit 0ccc7afcd8cf77346568ffbf9a8b2e0b3ce2ea0e
Author: Daniel Mack <daniel at caiaq.de>
Date:   Thu Dec 10 10:32:57 2009 +0800

    osx: add native zeroconf implementation via Bonjour
    
    Avahi and dbus is too heavy for OSX just for the sake of publishing our
    services via mDNS/Zeroconf. Apple has its own Zeroconf implementation
    called Bonjour, and this patch adds a module that implements service
    announcement with that API.
    
    All data gathering is copied from module-zeroconf-publish.c, but
    unfortunately the code there is too specifically made for avahi, so I
    couldn't factor it out to reuse it.

diff --git a/configure.ac b/configure.ac
index 11af89b..6b540e4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -423,8 +423,12 @@ if test "x$os_is_darwin" = "x1" ; then
 
     AC_MSG_RESULT([ok])
     AC_DEFINE([HAVE_CLOCK_GETTIME], 1, [Using clock_gettime() replacement])
+    HAVE_BONJOUR=1
 fi
 
+AC_SUBST(HAVE_BONJOUR)
+AM_CONDITIONAL([HAVE_BONJOUR], [test "x$HAVE_BONJOUR" = x1])
+
 #### Check for functions ####
 
 # ISO
diff --git a/src/Makefile.am b/src/Makefile.am
index fa5d170..0224cb3 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1123,6 +1123,11 @@ modlibexec_LTLIBRARIES += \
 		module-zeroconf-discover.la
 endif
 
+if HAVE_BONJOUR
+modlibexec_LTLIBRARIES += \
+		module-bonjour-publish.la
+endif
+
 if HAVE_LIRC
 modlibexec_LTLIBRARIES += \
 		module-lirc.la
@@ -1231,6 +1236,7 @@ SYMDEF_FILES = \
 		modules/module-esound-sink-symdef.h \
 		modules/module-zeroconf-publish-symdef.h \
 		modules/module-zeroconf-discover-symdef.h \
+		modules/module-bonjour-publish-symdef.h \
 		modules/module-lirc-symdef.h \
 		modules/module-mmkbd-evdev-symdef.h \
 		modules/module-http-protocol-tcp-symdef.h \
@@ -1548,6 +1554,13 @@ module_zeroconf_discover_la_LDFLAGS = $(MODULE_LDFLAGS)
 module_zeroconf_discover_la_LIBADD = $(AM_LIBADD) $(AVAHI_LIBS) libavahi-wrap.la libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
 module_zeroconf_discover_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS)
 
+# Bonjour
+
+module_bonjour_publish_la_SOURCES = modules/module-bonjour-publish.c
+module_bonjour_publish_la_LDFLAGS = $(MODULE_LDFLAGS) \
+			-Wl,-framework -Wl,CoreFoundation -framework CoreFoundation
+module_bonjour_publish_la_LIBADD = libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
+
 # LIRC
 
 module_lirc_la_SOURCES = modules/module-lirc.c
diff --git a/src/modules/module-bonjour-publish.c b/src/modules/module-bonjour-publish.c
new file mode 100644
index 0000000..81b5976
--- /dev/null
+++ b/src/modules/module-bonjour-publish.c
@@ -0,0 +1,516 @@
+/***
+  This file is part of PulseAudio.
+
+  Copyright 2009 Daniel Mack
+  based on module-zeroconf-publish.c
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as
+  published by the Free Software Foundation; either version 2.1 of the
+  License, or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with PulseAudio; if not, 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 <dns_sd.h>
+
+#include <CoreFoundation/CoreFoundation.h>
+
+#include <pulse/xmalloc.h>
+#include <pulse/util.h>
+
+#include <pulsecore/parseaddr.h>
+#include <pulsecore/sink.h>
+#include <pulsecore/source.h>
+#include <pulsecore/native-common.h>
+#include <pulsecore/core-util.h>
+#include <pulsecore/log.h>
+#include <pulsecore/core-subscribe.h>
+#include <pulsecore/dynarray.h>
+#include <pulsecore/modargs.h>
+#include <pulsecore/avahi-wrap.h>
+#include <pulsecore/endianmacros.h>
+#include <pulsecore/protocol-native.h>
+
+#include "module-bonjour-publish-symdef.h"
+
+PA_MODULE_AUTHOR("Daniel Mack");
+PA_MODULE_DESCRIPTION("Mac OS X Bonjour Service Publisher");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(TRUE);
+
+#define SERVICE_TYPE_SINK "_pulse-sink._tcp"
+#define SERVICE_TYPE_SOURCE "_pulse-source._tcp"
+#define SERVICE_TYPE_SERVER "_pulse-server._tcp"
+
+static const char* const valid_modargs[] = {
+    NULL
+};
+
+enum service_subtype {
+    SUBTYPE_HARDWARE,
+    SUBTYPE_VIRTUAL,
+    SUBTYPE_MONITOR
+};
+
+struct service {
+    struct userdata *userdata;
+    DNSServiceRef service;
+    DNSRecordRef rec, rec2;
+    char *service_name;
+    pa_object *device;
+    enum service_subtype subtype;
+};
+
+struct userdata {
+    pa_core *core;
+    pa_module *module;
+
+    pa_hashmap *services;
+    char *service_name;
+
+    pa_hook_slot *sink_new_slot, *source_new_slot, *sink_unlink_slot, *source_unlink_slot, *sink_changed_slot, *source_changed_slot;
+
+    pa_native_protocol *native;
+    DNSServiceRef main_service;
+};
+
+static void get_service_data(struct service *s, pa_sample_spec *ret_ss, pa_channel_map *ret_map, const char **ret_name, pa_proplist **ret_proplist, enum service_subtype *ret_subtype) {
+    pa_assert(s);
+    pa_assert(ret_ss);
+    pa_assert(ret_proplist);
+    pa_assert(ret_subtype);
+
+    if (pa_sink_isinstance(s->device)) {
+        pa_sink *sink = PA_SINK(s->device);
+
+        *ret_ss = sink->sample_spec;
+        *ret_map = sink->channel_map;
+        *ret_name = sink->name;
+        *ret_proplist = sink->proplist;
+        *ret_subtype = sink->flags & PA_SINK_HARDWARE ? SUBTYPE_HARDWARE : SUBTYPE_VIRTUAL;
+
+    } else if (pa_source_isinstance(s->device)) {
+        pa_source *source = PA_SOURCE(s->device);
+
+        *ret_ss = source->sample_spec;
+        *ret_map = source->channel_map;
+        *ret_name = source->name;
+        *ret_proplist = source->proplist;
+        *ret_subtype = source->monitor_of ? SUBTYPE_MONITOR : (source->flags & PA_SOURCE_HARDWARE ? SUBTYPE_HARDWARE : SUBTYPE_VIRTUAL);
+
+    } else
+        pa_assert_not_reached();
+}
+
+static void txt_record_server_data(pa_core *c, TXTRecordRef *txt) {
+    char s[128];
+    char *t;
+
+    pa_assert(c);
+
+    TXTRecordSetValue(txt, "server-version", strlen(PACKAGE_NAME" "PACKAGE_VERSION), PACKAGE_NAME" "PACKAGE_VERSION);
+
+    t = pa_get_user_name_malloc();
+    TXTRecordSetValue(txt, "user-name", strlen(t), t);
+    pa_xfree(t);
+
+    t = pa_machine_id();
+    TXTRecordSetValue(txt, "machine-id", strlen(t), t);
+    pa_xfree(t);
+
+    t = pa_uname_string();
+    TXTRecordSetValue(txt, "uname", strlen(t), t);
+    pa_xfree(t);
+
+    t = pa_get_fqdn(s, sizeof(s));
+    TXTRecordSetValue(txt, "fqdn", strlen(t), t);
+
+    snprintf(s, sizeof(s), "0x%08x", c->cookie);
+    TXTRecordSetValue(txt, "cookie", strlen(s), s);
+}
+
+static void service_free(struct service *s);
+
+static void dns_service_register_reply(DNSServiceRef sdRef,
+                                       DNSServiceFlags flags,
+                                       DNSServiceErrorType errorCode,
+                                       const char *name,
+                                       const char *regtype,
+                                       const char *domain,
+                                       void *context) {
+    struct service *s = context;
+
+    pa_assert(s);
+
+    switch (errorCode) {
+    case kDNSServiceErr_NameConflict:
+        pa_log("DNS service reported kDNSServiceErr_NameConflict\n");
+        service_free(s);
+        break;
+
+    case kDNSServiceErr_NoError:
+    default:
+        break;
+    }
+}
+
+static uint16_t compute_port(struct userdata *u) {
+    pa_strlist *i;
+
+    pa_assert(u);
+
+    for (i = pa_native_protocol_servers(u->native); i; i = pa_strlist_next(i)) {
+        pa_parsed_address a;
+
+        if (pa_parse_address(pa_strlist_data(i), &a) >= 0 &&
+            (a.type == PA_PARSED_ADDRESS_TCP4 ||
+             a.type == PA_PARSED_ADDRESS_TCP6 ||
+             a.type == PA_PARSED_ADDRESS_TCP_AUTO) &&
+            a.port > 0) {
+
+            pa_xfree(a.path_or_host);
+            return a.port;
+        }
+
+        pa_xfree(a.path_or_host);
+    }
+
+    return PA_NATIVE_DEFAULT_PORT;
+}
+
+static int publish_service(struct service *s) {
+    int r = -1;
+    TXTRecordRef txt;
+    DNSServiceErrorType err;
+    const char *name = NULL, *t;
+    pa_proplist *proplist = NULL;
+    pa_sample_spec ss;
+    pa_channel_map map;
+    char cm[PA_CHANNEL_MAP_SNPRINT_MAX], tmp[64];
+    enum service_subtype subtype;
+
+    const char * const subtype_text[] = {
+        [SUBTYPE_HARDWARE] = "hardware",
+        [SUBTYPE_VIRTUAL] = "virtual",
+        [SUBTYPE_MONITOR] = "monitor"
+    };
+
+    pa_assert(s);
+
+    if (s->service) {
+        DNSServiceRefDeallocate(s->service);
+        s->service = NULL;
+    }
+
+    TXTRecordCreate(&txt, 0, NULL);
+
+    txt_record_server_data(s->userdata->core, &txt);
+
+    get_service_data(s, &ss, &map, &name, &proplist, &subtype);
+    TXTRecordSetValue(&txt, "device", strlen(name), name);
+
+    snprintf(tmp, sizeof(tmp), "%u", ss.rate);
+    TXTRecordSetValue(&txt, "rate", strlen(tmp), tmp);
+
+    snprintf(tmp, sizeof(tmp), "%u", ss.channels);
+    TXTRecordSetValue(&txt, "channels", strlen(tmp), tmp);
+
+    t = pa_sample_format_to_string(ss.format);
+    TXTRecordSetValue(&txt, "format", strlen(t), t);
+
+    t = pa_channel_map_snprint(cm, sizeof(cm), &map);
+    TXTRecordSetValue(&txt, "channel_map", strlen(t), t);
+
+    t = subtype_text[subtype];
+    TXTRecordSetValue(&txt, "subtype", strlen(t), t);
+
+    if ((t = pa_proplist_gets(proplist, PA_PROP_DEVICE_DESCRIPTION)))
+        TXTRecordSetValue(&txt, "description", strlen(t), t);
+    if ((t = pa_proplist_gets(proplist, PA_PROP_DEVICE_ICON_NAME)))
+        TXTRecordSetValue(&txt, "icon-name", strlen(t), t);
+    if ((t = pa_proplist_gets(proplist, PA_PROP_DEVICE_VENDOR_NAME)))
+        TXTRecordSetValue(&txt, "vendor-name", strlen(t), t);
+    if ((t = pa_proplist_gets(proplist, PA_PROP_DEVICE_PRODUCT_NAME)))
+        TXTRecordSetValue(&txt, "product-name", strlen(t), t);
+    if ((t = pa_proplist_gets(proplist, PA_PROP_DEVICE_CLASS)))
+        TXTRecordSetValue(&txt, "class", strlen(t), t);
+    if ((t = pa_proplist_gets(proplist, PA_PROP_DEVICE_FORM_FACTOR)))
+        TXTRecordSetValue(&txt, "form-factor", strlen(t), t);
+
+    err = DNSServiceRegister(&s->service,
+                             0,         /* flags */
+                             kDNSServiceInterfaceIndexAny,
+                             s->service_name,
+                             pa_sink_isinstance(s->device) ? SERVICE_TYPE_SINK : SERVICE_TYPE_SOURCE,
+                             NULL,      /* domain */
+                             NULL,      /* host */
+                             compute_port(s->userdata),
+                             TXTRecordGetLength(&txt),
+                             TXTRecordGetBytesPtr(&txt),
+                             dns_service_register_reply, s);
+
+    if (err != kDNSServiceErr_NoError) {
+        pa_log("DNSServiceRegister() returned err %d", err);
+        goto finish;
+    }
+
+    pa_log_debug("Successfully registered Bonjour services for >%s<.", s->service_name);
+    return 0;
+
+finish:
+
+    /* Remove this service */
+    if (r < 0)
+        service_free(s);
+
+    TXTRecordDeallocate(&txt);
+
+    return r;
+}
+
+static struct service *get_service(struct userdata *u, pa_object *device) {
+    struct service *s;
+    char *hn, *un;
+    const char *n;
+
+    pa_assert(u);
+    pa_object_assert_ref(device);
+
+    if ((s = pa_hashmap_get(u->services, device)))
+        return s;
+
+    s = pa_xnew0(struct service, 1);
+    s->userdata = u;
+    s->device = device;
+
+    if (pa_sink_isinstance(device)) {
+        if (!(n = pa_proplist_gets(PA_SINK(device)->proplist, PA_PROP_DEVICE_DESCRIPTION)))
+            n = PA_SINK(device)->name;
+    } else {
+        if (!(n = pa_proplist_gets(PA_SOURCE(device)->proplist, PA_PROP_DEVICE_DESCRIPTION)))
+            n = PA_SOURCE(device)->name;
+    }
+
+    hn = pa_get_host_name_malloc();
+    un = pa_get_user_name_malloc();
+
+    s->service_name = pa_truncate_utf8(pa_sprintf_malloc("%s@%s: %s", un, hn, n), kDNSServiceMaxDomainName-1);
+
+    pa_xfree(un);
+    pa_xfree(hn);
+
+    pa_hashmap_put(u->services, s->device, s);
+
+    return s;
+}
+
+static void service_free(struct service *s) {
+    pa_assert(s);
+
+    pa_hashmap_remove(s->userdata->services, s->device);
+
+    if (s->service)
+        DNSServiceRefDeallocate(s->service);
+
+    pa_xfree(s->service_name);
+    pa_xfree(s);
+}
+
+static pa_bool_t shall_ignore(pa_object *o) {
+    pa_object_assert_ref(o);
+
+    if (pa_sink_isinstance(o))
+        return !!(PA_SINK(o)->flags & PA_SINK_NETWORK);
+
+    if (pa_source_isinstance(o))
+        return PA_SOURCE(o)->monitor_of || (PA_SOURCE(o)->flags & PA_SOURCE_NETWORK);
+
+    pa_assert_not_reached();
+}
+
+static pa_hook_result_t device_new_or_changed_cb(pa_core *c, pa_object *o, struct userdata *u) {
+    pa_assert(c);
+    pa_object_assert_ref(o);
+
+    if (!shall_ignore(o))
+        publish_service(get_service(u, o));
+
+    return PA_HOOK_OK;
+}
+
+static pa_hook_result_t device_unlink_cb(pa_core *c, pa_object *o, struct userdata *u) {
+    struct service *s;
+
+    pa_assert(c);
+    pa_object_assert_ref(o);
+
+    if ((s = pa_hashmap_get(u->services, o)))
+        service_free(s);
+
+    return PA_HOOK_OK;
+}
+
+static int publish_main_service(struct userdata *u) {
+    DNSServiceErrorType err;
+    TXTRecordRef txt;
+
+    pa_assert(u);
+
+    if (u->main_service) {
+        DNSServiceRefDeallocate(u->main_service);
+        u->main_service = NULL;
+    }
+
+    TXTRecordCreate(&txt, 0, NULL);
+    txt_record_server_data(u->core, &txt);
+
+    err = DNSServiceRegister(&u->main_service,
+                             0, /* flags */
+                             kDNSServiceInterfaceIndexAny,
+                             u->service_name,
+                             SERVICE_TYPE_SERVER,
+                             NULL, /* domain */
+                             NULL, /* host */
+                             compute_port(u),
+                             TXTRecordGetLength(&txt),
+                             TXTRecordGetBytesPtr(&txt),
+                             NULL, NULL);
+
+    if (err != kDNSServiceErr_NoError) {
+        pa_log("%s(): DNSServiceRegister() returned err %d", __func__, err);
+        return err;
+    }
+
+    TXTRecordDeallocate(&txt);
+
+    return 0;
+}
+
+static int publish_all_services(struct userdata *u) {
+    pa_sink *sink;
+    pa_source *source;
+    uint32_t idx;
+
+    pa_assert(u);
+
+    pa_log_debug("Publishing services in Bonjour");
+
+    for (sink = PA_SINK(pa_idxset_first(u->core->sinks, &idx)); sink; sink = PA_SINK(pa_idxset_next(u->core->sinks, &idx)))
+        if (!shall_ignore(PA_OBJECT(sink)))
+            publish_service(get_service(u, PA_OBJECT(sink)));
+
+    for (source = PA_SOURCE(pa_idxset_first(u->core->sources, &idx)); source; source = PA_SOURCE(pa_idxset_next(u->core->sources, &idx)))
+        if (!shall_ignore(PA_OBJECT(source)))
+            publish_service(get_service(u, PA_OBJECT(source)));
+
+    return publish_main_service(u);
+}
+
+static void unpublish_all_services(struct userdata *u) {
+    void *state = NULL;
+    struct service *s;
+
+    pa_assert(u);
+
+    pa_log_debug("Unpublishing services in Bonjour");
+
+    while ((s = pa_hashmap_iterate(u->services, &state, NULL)))
+        service_free(s);
+
+    if (u->main_service)
+        DNSServiceRefDeallocate(u->main_service);
+}
+
+int pa__init(pa_module*m) {
+
+    struct userdata *u;
+    pa_modargs *ma = NULL;
+    char *hn, *un;
+
+    if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
+        pa_log("Failed to parse module arguments.");
+        goto fail;
+    }
+
+    m->userdata = u = pa_xnew0(struct userdata, 1);
+    u->core = m->core;
+    u->module = m;
+    u->native = pa_native_protocol_get(u->core);
+
+    u->services = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+
+    u->sink_new_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_LATE, (pa_hook_cb_t) device_new_or_changed_cb, u);
+    u->sink_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PROPLIST_CHANGED], PA_HOOK_LATE, (pa_hook_cb_t) device_new_or_changed_cb, u);
+    u->sink_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_UNLINK], PA_HOOK_LATE, (pa_hook_cb_t) device_unlink_cb, u);
+    u->source_new_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_PUT], PA_HOOK_LATE, (pa_hook_cb_t) device_new_or_changed_cb, u);
+    u->source_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_PROPLIST_CHANGED], PA_HOOK_LATE, (pa_hook_cb_t) device_new_or_changed_cb, u);
+    u->source_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SOURCE_UNLINK], PA_HOOK_LATE, (pa_hook_cb_t) device_unlink_cb, u);
+
+    un = pa_get_user_name_malloc();
+    hn = pa_get_host_name_malloc();
+    u->service_name = pa_truncate_utf8(pa_sprintf_malloc("%s@%s", un, hn), kDNSServiceMaxDomainName-1);
+    pa_xfree(un);
+    pa_xfree(hn);
+
+    publish_all_services(u);
+    pa_modargs_free(ma);
+
+    return 0;
+
+fail:
+    pa__done(m);
+
+    if (ma)
+        pa_modargs_free(ma);
+
+    return -1;
+}
+
+void pa__done(pa_module*m) {
+    struct userdata*u;
+    pa_assert(m);
+
+    if (!(u = m->userdata))
+        return;
+
+    unpublish_all_services(u);
+
+    if (u->services)
+        pa_hashmap_free(u->services, NULL, NULL);
+
+    if (u->sink_new_slot)
+        pa_hook_slot_free(u->sink_new_slot);
+    if (u->source_new_slot)
+        pa_hook_slot_free(u->source_new_slot);
+    if (u->sink_changed_slot)
+        pa_hook_slot_free(u->sink_changed_slot);
+    if (u->source_changed_slot)
+        pa_hook_slot_free(u->source_changed_slot);
+    if (u->sink_unlink_slot)
+        pa_hook_slot_free(u->sink_unlink_slot);
+    if (u->source_unlink_slot)
+        pa_hook_slot_free(u->source_unlink_slot);
+
+    if (u->native)
+        pa_native_protocol_unref(u->native);
+
+    pa_xfree(u->service_name);
+    pa_xfree(u);
+}

commit f452c6cdd9e5717340807478d759ef5a03b55f1f
Author: Daniel Mack <daniel at caiaq.de>
Date:   Thu Dec 10 15:42:40 2009 +0800

    fix a number of warnings
    
    most of them were due to missing #ifdefs or wrong printf format type for
    [s]size_t.

diff --git a/src/daemon/daemon-conf.c b/src/daemon/daemon-conf.c
index bfd5c11..79dd49a 100644
--- a/src/daemon/daemon-conf.c
+++ b/src/daemon/daemon-conf.c
@@ -466,6 +466,7 @@ static int parse_rtprio(const char *filename, unsigned line, const char *section
     return 0;
 }
 
+#ifdef HAVE_DBUS
 static int parse_server_type(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata) {
     pa_daemon_conf *c = data;
 
@@ -481,6 +482,7 @@ static int parse_server_type(const char *filename, unsigned line, const char *se
 
     return 0;
 }
+#endif
 
 int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) {
     int r = -1;
@@ -666,12 +668,14 @@ char *pa_daemon_conf_dump(pa_daemon_conf *c) {
         [PA_LOG_ERROR] = "error"
     };
 
+#ifdef HAVE_DBUS
     static const char* const server_type_to_string[] = {
         [PA_SERVER_TYPE_UNSET] = "!!UNSET!!",
         [PA_SERVER_TYPE_USER] = "user",
         [PA_SERVER_TYPE_SYSTEM] = "system",
         [PA_SERVER_TYPE_NONE] = "none"
     };
+#endif
 
     pa_strbuf *s;
     char cm[PA_CHANNEL_MAP_SNPRINT_MAX];
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index d596c48..b64c51e 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -580,8 +580,8 @@ char *pa_strlcpy(char *b, const char *s, size_t l) {
 
 static int set_scheduler(int rtprio) {
     struct sched_param sp;
-    int r;
 #ifdef HAVE_DBUS
+    int r;
     DBusError error;
     DBusConnection *bus;
 
@@ -628,7 +628,7 @@ static int set_scheduler(int rtprio) {
 
     errno = -r;
 #else
-    errno = r;
+    errno = 0;
 #endif
 
     return -1;
diff --git a/src/pulsecore/envelope.c b/src/pulsecore/envelope.c
index 0eca811..75e189c 100644
--- a/src/pulsecore/envelope.c
+++ b/src/pulsecore/envelope.c
@@ -597,7 +597,7 @@ void pa_envelope_apply(pa_envelope *e, pa_memchunk *chunk) {
         fs = pa_frame_size(&e->sample_spec);
         n = chunk->length;
 
-        pa_log_debug("Envelop position %d applying factor %d=%f, sample spec is %d, chunk's length is %d, fs is %d\n", e->x, linear_get_int(e, v), ((float) linear_get_int(e,v))/0x10000, e->sample_spec.format, n, fs);
+        pa_log_debug("Envelop position %zu applying factor %d=%f, sample spec is %d, chunk's length is %zu, fs is %zu\n", e->x, linear_get_int(e, v), ((float) linear_get_int(e,v))/0x10000, e->sample_spec.format, n, fs);
 
         switch (e->sample_spec.format) {
 
@@ -965,11 +965,10 @@ void pa_envelope_restart(pa_envelope* e) {
 }
 
 pa_bool_t pa_envelope_is_finished(pa_envelope* e) {
-    pa_assert(e);
-
     int v;
     pa_bool_t finished;
 
+    pa_assert(e);
     envelope_begin_read(e, &v);
     finished = (e->x >=  e->points[v].x[e->points[v].n_points-1]);
     envelope_commit_read(e, v);
@@ -978,11 +977,10 @@ pa_bool_t pa_envelope_is_finished(pa_envelope* e) {
 }
 
 int32_t pa_envelope_length(pa_envelope *e) {
-    pa_assert(e);
-
     int v;
     size_t size;
 
+    pa_assert(e);
     envelope_begin_read(e, &v);
     size = e->points[v].x[e->points[v].n_points-1] - e->points[v].x[0];
     envelope_commit_read(e, v);
diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index 35e3d4a..9b4edeb 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -779,11 +779,11 @@ void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink frames */, p
 
     if (!i->thread_info.ramp_info.envelope_dead) {
         i->thread_info.ramp_info.envelope_dying += chunk->length;
-        pa_log_debug("Envelope dying is %d, chunk length is %d, dead thresholder is %d\n", i->thread_info.ramp_info.envelope_dying,
+        pa_log_debug("Envelope dying is %d, chunk length is %zu, dead thresholder is %lu\n", i->thread_info.ramp_info.envelope_dying,
                 chunk->length,
                 i->sink->thread_info.max_rewind + pa_envelope_length(i->thread_info.ramp_info.envelope));
 
-        if (i->thread_info.ramp_info.envelope_dying >= (i->sink->thread_info.max_rewind + pa_envelope_length(i->thread_info.ramp_info.envelope))) {
+        if (i->thread_info.ramp_info.envelope_dying >= (int32_t) (i->sink->thread_info.max_rewind + pa_envelope_length(i->thread_info.ramp_info.envelope))) {
             pa_log_debug("RELEASE Envelop");
             i->thread_info.ramp_info.envelope_dead = TRUE;
             sink_input_release_envelope(i);
@@ -1767,12 +1767,14 @@ static void sink_input_rewind_ramp_info(pa_sink_input *i, size_t nbytes) {
     pa_assert(i);
 
     if (!i->thread_info.ramp_info.envelope_dead) {
-        pa_assert(i->thread_info.ramp_info.envelope);
+        int32_t envelope_length;
 
-        int32_t envelope_length = pa_envelope_length(i->thread_info.ramp_info.envelope);
+	pa_assert(i->thread_info.ramp_info.envelope);
+
+        envelope_length = pa_envelope_length(i->thread_info.ramp_info.envelope);
 
         if (i->thread_info.ramp_info.envelope_dying > envelope_length) {
-            if ((i->thread_info.ramp_info.envelope_dying - nbytes) < envelope_length) {
+            if ((int32_t) (i->thread_info.ramp_info.envelope_dying - nbytes) < envelope_length) {
                 pa_log_debug("Envelope Become Alive");
                 pa_envelope_rewind(i->thread_info.ramp_info.envelope, envelope_length - (i->thread_info.ramp_info.envelope_dying - nbytes));
                 i->thread_info.ramp_info.is_ramping = TRUE;

commit e5e432fe0aabc8fc21e987001de5cf7b69303a63
Author: Daniel T Chen <crimsun at ubuntu.com>
Date:   Wed Dec 16 22:53:18 2009 -0500

    Fix the following warnings (which now cause buildd failures in Ubuntu 10.04):
    
    pulsecore/cpu-arm.c: In function 'get_cpuinfo':
    pulsecore/cpu-arm.c:70: warning: implicit declaration of function 'pa_read' [-Wimplicit-function-declaration]
    pulsecore/cpu-arm.c:72: warning: implicit declaration of function 'pa_close' [-Wimplicit-function-declaration]
    pulsecore/cpu-arm.c: In function 'pa_cpu_init_arm':
    pulsecore/cpu-arm.c:110: warning: implicit declaration of function 'pa_split_spaces' [-Wimplicit-function-declaration]
    pulsecore/cpu-arm.c:110: warning: assignment makes pointer from integer without a cast
    Function `pa_split_spaces' implicitly converted to pointer at pulsecore/cpu-arm.c:110
    
    Signed-off-by: Daniel T Chen <crimsun at ubuntu.com>

diff --git a/src/pulsecore/cpu-arm.c b/src/pulsecore/cpu-arm.c
index 6bb2ead..6e4bfaa 100644
--- a/src/pulsecore/cpu-arm.c
+++ b/src/pulsecore/cpu-arm.c
@@ -30,6 +30,7 @@
 #include <fcntl.h>
 
 #include <pulse/xmalloc.h>
+#include <pulsecore/core-util.h>
 #include <pulsecore/log.h>
 
 #include "cpu-arm.h"

commit a63cf050b0be91310ae6b0b4fa3fa2b0f95e3efa
Author: Daniel T Chen <crimsun at ubuntu.com>
Date:   Wed Dec 16 23:55:05 2009 -0500

    More src/pulsecore/cpu-arm.c FTBFS fixes
    
    Fix missing argument to pa_read(), and be consistent with declaration of
    state variable in pa_cpu_init_arm().
    
    Signed-off-by: Daniel T Chen <crimsun at ubuntu.com>

diff --git a/src/pulsecore/cpu-arm.c b/src/pulsecore/cpu-arm.c
index 6e4bfaa..bf632f7 100644
--- a/src/pulsecore/cpu-arm.c
+++ b/src/pulsecore/cpu-arm.c
@@ -68,7 +68,7 @@ static char *get_cpuinfo(void) {
         return NULL;
     }
 
-    if ((n = pa_read(fd, cpuinfo, MAX_BUFFER-1)) < 0) {
+    if ((n = pa_read(fd, cpuinfo, MAX_BUFFER-1, NULL)) < 0) {
         pa_xfree(cpuinfo);
         pa_close(fd);
         return NULL;
@@ -106,7 +106,8 @@ void pa_cpu_init_arm (void) {
     }
     /* get the CPU features */
     if ((line = get_cpuinfo_line (cpuinfo, "Features"))) {
-        char *state = NULL, *current;
+        const char *state = NULL;
+        char *current;
 
         while ((current = pa_split_spaces (line, &state))) {
             if (!strcmp (current, "vfp"))

commit c5fdbeab85dfe69ebaec92969ec2ce77b105f1df
Author: Daniel T Chen <crimsun at ubuntu.com>
Date:   Mon Jan 4 21:44:37 2010 -0500

    threaded-mainloop: Properly initialise m->n_waiting_for_accept to prevent deadlock
    
    Compiler optimisations have been seen to initialise
    m->n_waiting_for_accept to a positive non-zero value, so the while() in
    pa_threaded_mainloop_signal() never proceeds. Fix this by properly
    initializing m->n_waiting_for_accept in pa_threaded_mainloop_new().
    
    Patch from Iain Bucław.
    
    https://bugs.launchpad.net/bugs/502992

diff --git a/src/pulse/thread-mainloop.c b/src/pulse/thread-mainloop.c
index 14ed926..1693404 100644
--- a/src/pulse/thread-mainloop.c
+++ b/src/pulse/thread-mainloop.c
@@ -116,6 +116,7 @@ pa_threaded_mainloop *pa_threaded_mainloop_new(void) {
     pa_mainloop_set_poll_func(m->real_mainloop, poll_func, m->mutex);
 
     m->n_waiting = 0;
+    m->n_waiting_for_accept = 0;
 
     return m;
 }

commit d3c71c92ceef143b60a211f4c9b340f5f7beb245
Author: Daniel T Chen <crimsun at ubuntu.com>
Date:   Mon Jan 4 21:53:36 2010 -0500

    udev: Use SOUND_CLASS instead of SOUND_FORM_FACTOR when checking for modem
    
    The fact whether an ALSA card is a modem is stored in the SOUND_CLASS,
    not the SOUND_FORM_FACTOR property. So read it from there.
    
    Patch from Whoopie.

diff --git a/src/modules/module-udev-detect.c b/src/modules/module-udev-detect.c
index a12f7c9..f17695b 100644
--- a/src/modules/module-udev-detect.c
+++ b/src/modules/module-udev-detect.c
@@ -366,7 +366,7 @@ static void process_device(struct userdata *u, struct udev_device *dev) {
         return;
     }
 
-    if ((ff = udev_device_get_property_value(dev, "SOUND_FORM_FACTOR")) &&
+    if ((ff = udev_device_get_property_value(dev, "SOUND_CLASS")) &&
         pa_streq(ff, "modem")) {
         pa_log_debug("Ignoring %s, because it is a modem.", udev_device_get_devpath(dev));
         return;

commit cb38d4eba185e9a1895aab914be6ebd5a86db74f
Author: David KÃ¥gedal <davidk at lysator.liu.se>
Date:   Tue Jan 5 20:14:11 2010 +0100

    alsa: add profile set for M-Audio FastTrack Pro USB

diff --git a/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules b/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules
index ea1a2fe..b8e88d0 100644
--- a/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules
+++ b/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules
@@ -22,5 +22,6 @@ KERNEL!="card*", GOTO="pulseaudio_end"
 
 SUBSYSTEMS=="usb", ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="1978", ENV{PULSE_PROFILE_SET}="native-instruments-audio8dj.conf"
 SUBSYSTEMS=="usb", ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="0839", ENV{PULSE_PROFILE_SET}="native-instruments-audio4dj.conf"
+SUBSYSTEMS=="usb", ATTRS{idVendor}=="0763", ATTRS{idProduct}=="2012", ENV{PULSE_PROFILE_SET}="maudio-fasttrack-pro.conf"
 
 LABEL="pulseaudio_end"
diff --git a/src/modules/alsa/mixer/profile-sets/maudio-fasttrack-pro.conf b/src/modules/alsa/mixer/profile-sets/maudio-fasttrack-pro.conf
new file mode 100644
index 0000000..75f5112
--- /dev/null
+++ b/src/modules/alsa/mixer/profile-sets/maudio-fasttrack-pro.conf
@@ -0,0 +1,85 @@
+# 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.1 of the
+# License, or (at your option) any later version.
+#
+# PulseAudio is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with PulseAudio; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+
+; M-Audio FastTrack Pro
+;
+; This card has one duplex stereo channel called A and an additional
+; stereo output channel called B.
+;
+; We knowingly only define a subset of the theoretically possible
+; mapping combinations as profiles here.
+;
+; See default.conf for an explanation on the directives used here.
+
+[General]
+auto-profiles = no
+
+[Mapping analog-stereo-a-output]
+description = Analog Stereo Channel A
+device-strings = hw:%f,0,0
+channel-map = left,right
+direction = output
+
+[Mapping analog-stereo-a-input]
+description = Analog Stereo Channel A
+device-strings = hw:%f,0,0
+channel-map = left,right
+direction = input
+
+[Mapping analog-stereo-b-output]
+description = Analog Stereo Channel B
+device-strings = hw:%f,1,0
+channel-map = left,right
+direction = output
+
+[Profile output:analog-stereo-all+input:analog-stereo-all]
+description = Analog Stereo Duplex Channel A, Analog Stereo output Channel B
+output-mappings = analog-stereo-a-output  analog-stereo-b-output
+input-mappings = analog-stereo-a-input
+priority = 100
+skip-probe = yes
+
+[Profile output:analog-stereo-a-output+input:analog-stereo-a-input]
+description = Analog Stereo Duplex Channel A
+output-mappings = analog-stereo-a-output
+input-mappings = analog-stereo-a-input
+priority = 40
+skip-probe = yes
+
+[Profile output:analog-stereo-b+input:analog-stereo-b]
+description = Analog Stereo Output Channel B
+output-mappings = analog-stereo-b-output
+input-mappings =
+priority = 50
+skip-probe = yes
+
+[Profile output:analog-stereo-a]
+description = Analog Stereo Output Channel A
+output-mappings = analog-stereo-a-output
+priority = 5
+skip-probe = yes
+
+[Profile output:analog-stereo-b]
+description = Analog Stereo Output Channel B
+output-mappings = analog-stereo-b-output
+priority = 6
+skip-probe = yes
+
+[Profile input:analog-stereo-a]
+description = Analog Stereo Input Channel A
+input-mappings = analog-stereo-a-input
+priority = 2
+skip-probe = yes

commit a282eadb88f26cea183399dba267d619bbdcd6df
Author: chocolateboy <chocolate at cpan.org>
Date:   Sat Dec 26 01:46:32 2009 +0000

    Fix typo in log message: s/may no be/may not be/
    
    Hi, Lennart.
    
    Spotted another typo. Patch attached.
    
    Best wishes,
    chocolateboy.

diff --git a/src/modules/x11/module-x11-xsmp.c b/src/modules/x11/module-x11-xsmp.c
index 28fd373..47a4e93 100644
--- a/src/modules/x11/module-x11-xsmp.c
+++ b/src/modules/x11/module-x11-xsmp.c
@@ -129,7 +129,7 @@ int pa__init(pa_module*m) {
     pa_assert(m);
 
     if (ice_in_use) {
-        pa_log("module-x11-xsmp may no be loaded twice.");
+        pa_log("module-x11-xsmp may not be loaded twice.");
         return -1;
     }
 

commit 0e47065fe5a410bcb7c367c23fc4d99b71fd82b2
Author: Pierre-Louis Bossart <pierre-louis.bossart at intel.com>
Date:   Wed Dec 23 13:57:03 2009 -0600

    Subject: rtpoll: better support for DEBUG_TIMING logs
    
    On all the platforms I tested, PulseAudio is frequently awaken and
    doesn't sleep for the duration specified for the poll timeout.
    Sometimes wake-ups occur within milliseconds of the poll call for no
    good reason; this seems to be related to ALSA issues (see my posts on
    the ALSA mailing list on null poll events).
    This patch enables a better log of requested sleep times v. actual
    sleep times. Enable DEBUG_TIMING to see actual messages. Please let me
    know if you see odd behaviors like the one below
    - Pierre
    
    E: rtpoll.c: rtpoll_run
    E: rtpoll.c: poll timeout: 188 ms
    E: rtpoll.c: Process time 0 ms; sleep time 48 ms
    E: rtpoll.c: rtpoll_run
    E: rtpoll.c: rtpoll finish
    E: rtpoll.c: rtpoll_run
    E: rtpoll.c: poll timeout: 139 ms
    E: rtpoll.c: Process time 0 ms; sleep time 49 ms
    E: rtpoll.c: rtpoll_run
    E: rtpoll.c: rtpoll finish
    E: rtpoll.c: rtpoll_run
    E: rtpoll.c: poll timeout: 189 ms
    E: rtpoll.c: Process time 0 ms; sleep time 0 ms
    E: rtpoll.c: rtpoll_run
    E: rtpoll.c: rtpoll finish
    E: rtpoll.c: rtpoll_run
    E: rtpoll.c: poll timeout: 189 ms
    E: rtpoll.c: Process time 0 ms; sleep time 49 ms

diff --git a/src/pulsecore/rtpoll.c b/src/pulsecore/rtpoll.c
index 666cbc9..e2f8262 100644
--- a/src/pulsecore/rtpoll.c
+++ b/src/pulsecore/rtpoll.c
@@ -47,6 +47,7 @@
 #include <pulsecore/core-util.h>
 #include <pulsecore/winsock.h>
 #include <pulsecore/ratelimit.h>
+#include <pulse/rtclock.h>
 
 #include "rtpoll.h"
 
@@ -217,6 +218,10 @@ int pa_rtpoll_run(pa_rtpoll *p, pa_bool_t wait_op) {
     pa_assert(p);
     pa_assert(!p->running);
 
+#ifdef DEBUG_TIMING
+    pa_log("rtpoll_run");
+#endif
+
     p->running = TRUE;
     p->timer_elapsed = FALSE;
 
@@ -230,13 +235,19 @@ int pa_rtpoll_run(pa_rtpoll *p, pa_bool_t wait_op) {
         if (!i->work_cb)
             continue;
 
-        if (p->quit)
+        if (p->quit) {
+#ifdef DEBUG_TIMING
+            pa_log("rtpoll finish");
+#endif
             goto finish;
+        }
 
         if ((k = i->work_cb(i)) != 0) {
             if (k < 0)
                 r = k;
-
+#ifdef DEBUG_TIMING
+            pa_log("rtpoll finish");
+#endif
             goto finish;
         }
     }
@@ -268,7 +279,9 @@ int pa_rtpoll_run(pa_rtpoll *p, pa_bool_t wait_op) {
 
             if (k < 0)
                 r = k;
-
+#ifdef DEBUG_TIMING
+            pa_log("rtpoll finish");
+#endif
             goto finish;
         }
     }
@@ -292,6 +305,10 @@ int pa_rtpoll_run(pa_rtpoll *p, pa_bool_t wait_op) {
         pa_usec_t now = pa_rtclock_now();
         p->awake = now - p->timestamp;
         p->timestamp = now;
+        if (!wait_op || p->quit || p->timer_enabled)
+            pa_log("poll timeout: %d ms ",(int) ((timeout.tv_sec*1000) + (timeout.tv_usec / 1000)));
+        else
+            pa_log("poll timeout is ZERO");
     }
 #endif
 

commit 6faf38313e5f313cbcfe5c78af1dd310131798d2
Author: Mads Kiilerich <mads at kiilerich.com>
Date:   Fri Dec 11 16:20:31 2009 +0100

    headers: Some trivial fixes for some documentation typos
    
    Note also the willneed/will_need inconsistency. I guess it could be nice to ASAP
    choose one of them and introduce a backward compatibility hack for the other.
    
    The issues was mostly found with:
    for a in $(grep -r '^[ /]\*.*()' $(
    	find -name '*.[ch]') |
    	sed 's,^.* \([^ ]*\)().*$,\1,g' |
    	sort |
    	uniq |
    	grep ^pa_)
    do
    	grep -rq "^.[^*].*\<$a(" $(find * -name '*.h') || echo $a
    done

diff --git a/src/pulse/def.h b/src/pulse/def.h
index 30a076d..82106ef 100644
--- a/src/pulse/def.h
+++ b/src/pulse/def.h
@@ -63,6 +63,7 @@ static inline int PA_CONTEXT_IS_GOOD(pa_context_state_t x) {
 #define PA_CONTEXT_SETTING_NAME PA_CONTEXT_SETTING_NAME
 #define PA_CONTEXT_READY PA_CONTEXT_READY
 #define PA_CONTEXT_FAILED PA_CONTEXT_FAILED
+#define PA_CONTEXT_TERMINATED PA_CONTEXT_TERMINATED
 #define PA_CONTEXT_IS_GOOD PA_CONTEXT_IS_GOOD
 /** \endcond */
 
@@ -351,7 +352,7 @@ typedef struct pa_buffer_attr {
      * that may be. Initialize to 0 to enable manual start/stop
      * control of the stream. This means that playback will not stop
      * on underrun and playback will not start automatically. Instead
-     * pa_stream_corked() needs to be called explicitly. If you set
+     * pa_stream_cork() needs to be called explicitly. If you set
      * this value to 0 you should also set PA_STREAM_START_CORKED. */
 
     uint32_t minreq;
diff --git a/src/pulse/introspect.h b/src/pulse/introspect.h
index 68cfc87..f9d22b2 100644
--- a/src/pulse/introspect.h
+++ b/src/pulse/introspect.h
@@ -460,7 +460,7 @@ typedef struct pa_card_info {
     pa_proplist *proplist;               /**< Property list */
 } pa_card_info;
 
-/** Callback prototype for pa_context_get_card_info() and friends \since 0.9.15 */
+/** Callback prototype for pa_context_get_card_info_...() \since 0.9.15 */
 typedef void (*pa_card_info_cb_t) (pa_context *c, const pa_card_info*i, int eol, void *userdata);
 
 /** Get information about a card by its index \since 0.9.15 */
diff --git a/src/pulse/proplist.h b/src/pulse/proplist.h
index aae0534..e3f0af0 100644
--- a/src/pulse/proplist.h
+++ b/src/pulse/proplist.h
@@ -325,7 +325,7 @@ void pa_proplist_update(pa_proplist *p, pa_update_mode_t mode, pa_proplist *othe
  * specified key name. \since 0.9.11 */
 int pa_proplist_unset(pa_proplist *p, const char *key);
 
-/** Similar to pa_proplist_remove() but takes an array of keys to
+/** Similar to pa_proplist_unset() but takes an array of keys to
  * remove. The array should be terminated by a NULL pointer. Return -1
  * on failure, otherwise the number of entries actually removed (which
  * might even be 0, if there where no matching entries to
diff --git a/src/pulse/simple.h b/src/pulse/simple.h
index 6f1ba41..b1f6537 100644
--- a/src/pulse/simple.h
+++ b/src/pulse/simple.h
@@ -82,8 +82,8 @@
  *
  * \li pa_simple_drain() - Will wait for all sent data to finish playing.
  * \li pa_simple_flush() - Will throw away all data currently in buffers.
- * \li pa_simple_get_playback_latency() - Will return the total latency of
- *                                        the playback pipeline.
+ * \li pa_simple_get_latency() - Will return the total latency of
+ *                               the playback pipeline.
  *
  * \section cleanup_sec Cleanup
  *
diff --git a/src/pulse/stream.h b/src/pulse/stream.h
index bc54a11..b905788 100644
--- a/src/pulse/stream.h
+++ b/src/pulse/stream.h
@@ -289,7 +289,7 @@
  * issued on the others.
  *
  * To synchronize a stream to another, just pass the "master" stream
- * as last argument to pa_stream_connect_playack(). To make sure that
+ * as last argument to pa_stream_connect_playback(). To make sure that
  * the freshly created stream doesn't start playback right-away, make
  * sure to pass PA_STREAM_START_CORKED and - after all streams have
  * been created - uncork them all with a single call to
@@ -716,7 +716,7 @@ pa_operation *pa_stream_set_buffer_attr(pa_stream *s, const pa_buffer_attr *attr
 
 /** Change the stream sampling rate during playback. You need to pass
  * PA_STREAM_VARIABLE_RATE in the flags parameter of
- * pa_stream_connect() if you plan to use this function. Only valid
+ * pa_stream_connect_...() if you plan to use this function. Only valid
  * after the stream has been connected successfully and if the server
  * is at least PulseAudio 0.9.8. \since 0.9.8 */
 pa_operation *pa_stream_update_sample_rate(pa_stream *s, uint32_t rate, pa_stream_success_cb_t cb, void *userdata);
diff --git a/src/pulse/volume.h b/src/pulse/volume.h
index ded4422..185c341 100644
--- a/src/pulse/volume.h
+++ b/src/pulse/volume.h
@@ -149,7 +149,7 @@ pa_cvolume* pa_cvolume_set(pa_cvolume *a, unsigned channels, pa_volume_t v);
 char *pa_cvolume_snprint(char *s, size_t l, const pa_cvolume *c);
 
 /** Maximum length of the strings returned by
- * pa_cvolume_snprint_dB(). Please note that this value can change with
+ * pa_sw_cvolume_snprint_dB(). Please note that this value can change with
  * any release without warning and without being considered API or ABI
  * breakage. You should not use this definition anywhere where it
  * might become part of an ABI. \since 0.9.13 */
@@ -169,7 +169,7 @@ char *pa_sw_cvolume_snprint_dB(char *s, size_t l, const pa_cvolume *c);
 char *pa_volume_snprint(char *s, size_t l, pa_volume_t v);
 
 /** Maximum length of the strings returned by
- * pa_volume_snprint_dB(). Please note that this value can change with
+ * pa_sw_volume_snprint_dB(). Please note that this value can change with
  * any release without warning and without being considered API or ABI
  * breakage. You should not use this definition anywhere where it
  * might become part of an ABI. \since 0.9.15 */
@@ -268,7 +268,7 @@ double pa_sw_volume_to_linear(pa_volume_t v) PA_GCC_CONST;
 #ifdef INFINITY
 #define PA_DECIBEL_MININFTY ((double) -INFINITY)
 #else
-/** This floor value is used as minus infinity when using pa_volume_{to,from}_dB(). */
+/** This floor value is used as minus infinity when using pa_sw_volume_to_dB() / pa_sw_volume_from_dB(). */
 #define PA_DECIBEL_MININFTY ((double) -200.0)
 #endif
 
diff --git a/src/pulsecore/asyncq.h b/src/pulsecore/asyncq.h
index e6847ab..47ccbf0 100644
--- a/src/pulsecore/asyncq.h
+++ b/src/pulsecore/asyncq.h
@@ -48,8 +48,9 @@ void pa_asyncq_free(pa_asyncq* q, pa_free_cb_t free_cb);
 void* pa_asyncq_pop(pa_asyncq *q, pa_bool_t wait);
 int pa_asyncq_push(pa_asyncq *q, void *p, pa_bool_t wait);
 
-/* Similar to pa_asyncq_push(), but if the queue is full, postpone it
- * locally and delay until pa_asyncq_before_poll_post() */
+/* Similar to pa_asyncq_push(), but if the queue is full, postpone the
+ * appending of the item locally and delay until
+ * pa_asyncq_before_poll_post() is called. */
 void pa_asyncq_post(pa_asyncq*l, void *p);
 
 /* For the reading side */
diff --git a/src/pulsecore/aupdate.h b/src/pulsecore/aupdate.h
index fb38ffa..4887112 100644
--- a/src/pulsecore/aupdate.h
+++ b/src/pulsecore/aupdate.h
@@ -39,7 +39,7 @@ void pa_aupdate_write_end(pa_aupdate *a);
 
 /* Will return 0, or 1, depending which copy of the data the caller
  * should modify. Each time called this will return the opposite of
- * the previous pa_aupdate_write_begin()/pa_aupdate_write_swap()
+ * the previous pa_aupdate_write_begin() / pa_aupdate_write_swap()
  * call. Should only be called between pa_aupdate_write_begin() and
  * pa_aupdate_write_end() */
 unsigned pa_aupdate_write_swap(pa_aupdate *a);
diff --git a/src/pulsecore/memblockq.h b/src/pulsecore/memblockq.h
index 587c364..b756549 100644
--- a/src/pulsecore/memblockq.h
+++ b/src/pulsecore/memblockq.h
@@ -165,7 +165,7 @@ void pa_memblockq_set_silence(pa_memblockq *memblockq, pa_memchunk *silence);
 void pa_memblockq_apply_attr(pa_memblockq *memblockq, const pa_buffer_attr *a);
 void pa_memblockq_get_attr(pa_memblockq *bq, pa_buffer_attr *a);
 
-/* Call pa_memchunk_willneed() for every chunk in the queue from the current read pointer to the end */
+/* Call pa_memchunk_will_need() for every chunk in the queue from the current read pointer to the end */
 void pa_memblockq_willneed(pa_memblockq *bq);
 
 /* Check whether the memblockq is completely empty, i.e. no data

commit 937c587e7720ee27b36fe736a2aa1cfd233270ec
Author: Daniel Mack <daniel at caiaq.de>
Date:   Thu Dec 10 15:43:58 2009 +0800

    fix a number of warnings
    
    most of them were due to missing #ifdefs or wrong printf format type for
    [s]size_t.

diff --git a/src/daemon/daemon-conf.c b/src/daemon/daemon-conf.c
index bfd5c11..79dd49a 100644
--- a/src/daemon/daemon-conf.c
+++ b/src/daemon/daemon-conf.c
@@ -466,6 +466,7 @@ static int parse_rtprio(const char *filename, unsigned line, const char *section
     return 0;
 }
 
+#ifdef HAVE_DBUS
 static int parse_server_type(const char *filename, unsigned line, const char *section, const char *lvalue, const char *rvalue, void *data, void *userdata) {
     pa_daemon_conf *c = data;
 
@@ -481,6 +482,7 @@ static int parse_server_type(const char *filename, unsigned line, const char *se
 
     return 0;
 }
+#endif
 
 int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) {
     int r = -1;
@@ -666,12 +668,14 @@ char *pa_daemon_conf_dump(pa_daemon_conf *c) {
         [PA_LOG_ERROR] = "error"
     };
 
+#ifdef HAVE_DBUS
     static const char* const server_type_to_string[] = {
         [PA_SERVER_TYPE_UNSET] = "!!UNSET!!",
         [PA_SERVER_TYPE_USER] = "user",
         [PA_SERVER_TYPE_SYSTEM] = "system",
         [PA_SERVER_TYPE_NONE] = "none"
     };
+#endif
 
     pa_strbuf *s;
     char cm[PA_CHANNEL_MAP_SNPRINT_MAX];
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index d596c48..b64c51e 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -580,8 +580,8 @@ char *pa_strlcpy(char *b, const char *s, size_t l) {
 
 static int set_scheduler(int rtprio) {
     struct sched_param sp;
-    int r;
 #ifdef HAVE_DBUS
+    int r;
     DBusError error;
     DBusConnection *bus;
 
@@ -628,7 +628,7 @@ static int set_scheduler(int rtprio) {
 
     errno = -r;
 #else
-    errno = r;
+    errno = 0;
 #endif
 
     return -1;
diff --git a/src/pulsecore/envelope.c b/src/pulsecore/envelope.c
index 0eca811..75e189c 100644
--- a/src/pulsecore/envelope.c
+++ b/src/pulsecore/envelope.c
@@ -597,7 +597,7 @@ void pa_envelope_apply(pa_envelope *e, pa_memchunk *chunk) {
         fs = pa_frame_size(&e->sample_spec);
         n = chunk->length;
 
-        pa_log_debug("Envelop position %d applying factor %d=%f, sample spec is %d, chunk's length is %d, fs is %d\n", e->x, linear_get_int(e, v), ((float) linear_get_int(e,v))/0x10000, e->sample_spec.format, n, fs);
+        pa_log_debug("Envelop position %zu applying factor %d=%f, sample spec is %d, chunk's length is %zu, fs is %zu\n", e->x, linear_get_int(e, v), ((float) linear_get_int(e,v))/0x10000, e->sample_spec.format, n, fs);
 
         switch (e->sample_spec.format) {
 
@@ -965,11 +965,10 @@ void pa_envelope_restart(pa_envelope* e) {
 }
 
 pa_bool_t pa_envelope_is_finished(pa_envelope* e) {
-    pa_assert(e);
-
     int v;
     pa_bool_t finished;
 
+    pa_assert(e);
     envelope_begin_read(e, &v);
     finished = (e->x >=  e->points[v].x[e->points[v].n_points-1]);
     envelope_commit_read(e, v);
@@ -978,11 +977,10 @@ pa_bool_t pa_envelope_is_finished(pa_envelope* e) {
 }
 
 int32_t pa_envelope_length(pa_envelope *e) {
-    pa_assert(e);
-
     int v;
     size_t size;
 
+    pa_assert(e);
     envelope_begin_read(e, &v);
     size = e->points[v].x[e->points[v].n_points-1] - e->points[v].x[0];
     envelope_commit_read(e, v);
diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index 35e3d4a..9b4edeb 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -779,11 +779,11 @@ void pa_sink_input_peek(pa_sink_input *i, size_t slength /* in sink frames */, p
 
     if (!i->thread_info.ramp_info.envelope_dead) {
         i->thread_info.ramp_info.envelope_dying += chunk->length;
-        pa_log_debug("Envelope dying is %d, chunk length is %d, dead thresholder is %d\n", i->thread_info.ramp_info.envelope_dying,
+        pa_log_debug("Envelope dying is %d, chunk length is %zu, dead thresholder is %lu\n", i->thread_info.ramp_info.envelope_dying,
                 chunk->length,
                 i->sink->thread_info.max_rewind + pa_envelope_length(i->thread_info.ramp_info.envelope));
 
-        if (i->thread_info.ramp_info.envelope_dying >= (i->sink->thread_info.max_rewind + pa_envelope_length(i->thread_info.ramp_info.envelope))) {
+        if (i->thread_info.ramp_info.envelope_dying >= (int32_t) (i->sink->thread_info.max_rewind + pa_envelope_length(i->thread_info.ramp_info.envelope))) {
             pa_log_debug("RELEASE Envelop");
             i->thread_info.ramp_info.envelope_dead = TRUE;
             sink_input_release_envelope(i);
@@ -1767,12 +1767,14 @@ static void sink_input_rewind_ramp_info(pa_sink_input *i, size_t nbytes) {
     pa_assert(i);
 
     if (!i->thread_info.ramp_info.envelope_dead) {
-        pa_assert(i->thread_info.ramp_info.envelope);
+        int32_t envelope_length;
 
-        int32_t envelope_length = pa_envelope_length(i->thread_info.ramp_info.envelope);
+	pa_assert(i->thread_info.ramp_info.envelope);
+
+        envelope_length = pa_envelope_length(i->thread_info.ramp_info.envelope);
 
         if (i->thread_info.ramp_info.envelope_dying > envelope_length) {
-            if ((i->thread_info.ramp_info.envelope_dying - nbytes) < envelope_length) {
+            if ((int32_t) (i->thread_info.ramp_info.envelope_dying - nbytes) < envelope_length) {
                 pa_log_debug("Envelope Become Alive");
                 pa_envelope_rewind(i->thread_info.ramp_info.envelope, envelope_length - (i->thread_info.ramp_info.envelope_dying - nbytes));
                 i->thread_info.ramp_info.is_ramping = TRUE;

commit 6dfb1ee27e031528891696c83230d4513c55b554
Merge: 937c587 f452c6c
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jan 5 22:52:57 2010 +0100

    Merge remote branch 'zonque/topic/osx'


commit aa9348441db34b787784711f19882d6c42fa315d
Author: huan zheng <huan.zheng.zbt at gmail.com>
Date:   Wed Jan 6 00:21:07 2010 +0100

    core: volume ramping fix
    
    Hi,
    I found that volume ramping is inside PA now.
    there's a minor fix here, it is a bug i found after the patch is submitted:
    
    line 1781 of sink-input.c :
    if ((i->thread_info.ramp_info.envelope_dying - nbytes) <= 0) {
    need to be changed to
    if ((i->thread_info.ramp_info.envelope_dying - (ssize_t) nbytes) <= 0) {
    
    otherwise this argument will never be negative since nbytes is of type
    size_t which is unsigned.
    Please change it when you have time, sorry if bring any inconvenience.  :)

diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index 9b4edeb..a490290 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -1780,7 +1780,7 @@ static void sink_input_rewind_ramp_info(pa_sink_input *i, size_t nbytes) {
                 i->thread_info.ramp_info.is_ramping = TRUE;
             }
         } else if (i->thread_info.ramp_info.envelope_dying < envelope_length) {
-            if ((i->thread_info.ramp_info.envelope_dying - nbytes) <= 0) {
+            if ((i->thread_info.ramp_info.envelope_dying - (ssize_t) nbytes) <= 0) {
                 pa_log_debug("Envelope Restart");
                 pa_envelope_restart(i->thread_info.ramp_info.envelope);
             }

commit cc82553d7e5ce3602806127fef8090f89d573238
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Wed May 27 16:57:06 2009 +0300

    idxset: Fix _get_by_data() comment.

diff --git a/src/pulsecore/idxset.h b/src/pulsecore/idxset.h
index d1e68c5..2d01fb4 100644
--- a/src/pulsecore/idxset.h
+++ b/src/pulsecore/idxset.h
@@ -65,7 +65,7 @@ int pa_idxset_put(pa_idxset*s, void *p, uint32_t *idx);
 /* Get the entry by its idx */
 void* pa_idxset_get_by_index(pa_idxset*s, uint32_t idx);
 
-/* Get the entry by its data. The idx is returned in *index */
+/* Get the entry by its data. The index is returned in *idx */
 void* pa_idxset_get_by_data(pa_idxset*s, const void *p, uint32_t *idx);
 
 /* Similar to pa_idxset_get_by_index(), but removes the entry from the idxset. */

commit 25435bf373cd928dbf269e86810eb23b0ac0d7ee
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Wed Jan 6 10:41:55 2010 +0200

    sink-input: Replace a tab indentation with spaces.

diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index a490290..c75d417 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -1769,7 +1769,7 @@ static void sink_input_rewind_ramp_info(pa_sink_input *i, size_t nbytes) {
     if (!i->thread_info.ramp_info.envelope_dead) {
         int32_t envelope_length;
 
-	pa_assert(i->thread_info.ramp_info.envelope);
+        pa_assert(i->thread_info.ramp_info.envelope);
 
         envelope_length = pa_envelope_length(i->thread_info.ramp_info.envelope);
 

commit f1d1447e104c4f609c0e8c528b56ea6afa540b95
Author: Tanu Kaskinen <tanuk at iki.fi>
Date:   Sat Jan 9 11:55:15 2010 +0200

    daemon: Don't autospawn if a server address is explicitly configured.

diff --git a/src/Makefile.am b/src/Makefile.am
index 0224cb3..1e488bd 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -627,6 +627,12 @@ 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) $(LIBSNDFILE_LIBS)
 
+if HAVE_X11
+libpulsecommon_ at PA_MAJORMINORMICRO@_la_SOURCES += pulse/client-conf-x11.c pulse/client-conf-x11.h
+libpulsecommon_ at PA_MAJORMINORMICRO@_la_CFLAGS += $(X11_CFLAGS)
+libpulsecommon_ at PA_MAJORMINORMICRO@_la_LDFLAGS += $(X11_LIBS)
+endif
+
 # proplist-util.h uses these header files, but not the library itself!
 libpulsecommon_ at PA_MAJORMINORMICRO@_la_CFLAGS += $(GLIB20_CFLAGS) $(GTK20_CFLAGS)
 
@@ -767,12 +773,6 @@ libpulse_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS)
 libpulse_la_LIBADD = $(AM_LIBADD) $(WINSOCK_LIBS) $(LTLIBICONV) libpulsecommon- at PA_MAJORMINORMICRO@.la
 libpulse_la_LDFLAGS = $(AM_LDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_VERSION_INFO)
 
-if HAVE_X11
-libpulse_la_SOURCES += pulse/client-conf-x11.c pulse/client-conf-x11.h
-libpulse_la_CFLAGS += $(X11_CFLAGS)
-libpulse_la_LDFLAGS += $(X11_LIBS)
-endif
-
 libpulse_simple_la_SOURCES = pulse/simple.c pulse/simple.h
 libpulse_simple_la_CFLAGS = $(AM_CFLAGS)
 libpulse_simple_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon- at PA_MAJORMINORMICRO@.la
diff --git a/src/daemon/main.c b/src/daemon/main.c
index e656836..5ccda77 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -63,6 +63,10 @@
 #include <dbus/dbus.h>
 #endif
 
+#include <pulse/client-conf.h>
+#ifdef HAVE_X11
+#include <pulse/client-conf-x11.h>
+#endif
 #include <pulse/mainloop.h>
 #include <pulse/mainloop-signal.h>
 #include <pulse/timeval.h>
@@ -343,6 +347,24 @@ static void set_all_rlimits(const pa_daemon_conf *conf) {
 }
 #endif
 
+static char *check_configured_address(void) {
+    char *default_server = NULL;
+    pa_client_conf *c = pa_client_conf_new();
+
+    pa_client_conf_load(c, NULL);
+#ifdef HAVE_X11
+    pa_client_conf_from_x11(c, NULL);
+#endif
+    pa_client_conf_env(c);
+
+    if (c->default_server && *c->default_server)
+        default_server = pa_xstrdup(c->default_server);
+
+    pa_client_conf_free(c);
+
+    return default_server;
+}
+
 #ifdef HAVE_DBUS
 static pa_dbus_connection *register_dbus_name(pa_core *c, DBusBusType bus, const char* name) {
     DBusError error;
@@ -383,6 +405,7 @@ int main(int argc, char *argv[]) {
     pa_daemon_conf *conf = NULL;
     pa_mainloop *mainloop = NULL;
     char *s;
+    char *configured_address;
     int r = 0, retval = 1, d = 0;
     pa_bool_t valid_pid_file = FALSE;
     pa_bool_t ltdl_init = FALSE;
@@ -649,6 +672,13 @@ int main(int argc, char *argv[]) {
         goto finish;
     }
 
+    if (conf->cmd == PA_CMD_START && (configured_address = check_configured_address())) {
+        pa_log_notice(_("User-configured server at %s, not autospawning."), configured_address);
+        pa_xfree(configured_address);
+        retval = 0;
+        goto finish;
+    }
+
     if (conf->system_instance && !conf->disallow_exit)
         pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
 

commit ba255bfc42c4637b5a541b419112b30cf21e8fb5
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Jan 13 17:40:31 2010 +0100

    tests: add pa_once_xxx() test

diff --git a/src/.gitignore b/src/.gitignore
index 64ab297..c93974b 100644
--- a/src/.gitignore
+++ b/src/.gitignore
@@ -1,3 +1,4 @@
+once-test
 usergroup-test
 sigbus-test
 TAGS
diff --git a/src/Makefile.am b/src/Makefile.am
index 0224cb3..9ff06ec 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -294,6 +294,7 @@ TESTS_BINARIES = \
 		hook-list-test \
 		memblock-test \
 		thread-test \
+		once-test \
 		flist-test \
 		asyncq-test \
 		asyncmsgq-test \
@@ -385,6 +386,11 @@ thread_test_CFLAGS = $(AM_CFLAGS)
 thread_test_LDADD = $(AM_LDADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la
 thread_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS)
 
+once_test_SOURCES = tests/once-test.c
+once_test_CFLAGS = $(AM_CFLAGS)
+once_test_LDADD = $(AM_LDADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la
+once_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS)
+
 flist_test_SOURCES = tests/flist-test.c
 flist_test_CFLAGS = $(AM_CFLAGS)
 flist_test_LDADD = $(AM_LDADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la
diff --git a/src/tests/once-test.c b/src/tests/once-test.c
new file mode 100644
index 0000000..5b55532
--- /dev/null
+++ b/src/tests/once-test.c
@@ -0,0 +1,103 @@
+/***
+  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.1 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, 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 <pthread.h>
+
+#include <pulsecore/thread.h>
+#include <pulsecore/mutex.h>
+#include <pulsecore/once.h>
+#include <pulsecore/log.h>
+#include <pulsecore/core-util.h>
+#include <pulsecore/core-error.h>
+#include <pulsecore/atomic.h>
+#include <pulse/xmalloc.h>
+
+static pa_once once = PA_ONCE_INIT;
+static volatile unsigned n_run = 0;
+static const char * volatile ran_by = NULL;
+static pthread_barrier_t barrier;
+static pa_atomic_t i_cpu = PA_ATOMIC_INIT(0);
+static unsigned n_cpu;
+
+#define N_ITERATIONS 500
+#define N_THREADS 100
+
+static void once_func(void) {
+    n_run++;
+    ran_by = (const char*) pa_thread_get_data(pa_thread_self());
+}
+
+static void thread_func(void *data) {
+    int r;
+
+#ifdef HAVE_PTHREAD_SETAFFINITY_NP
+    cpu_set_t mask;
+
+    CPU_ZERO(&mask);
+    CPU_SET((size_t) (pa_atomic_inc(&i_cpu) % n_cpu), &mask);
+    pa_assert_se(pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) == 0);
+#endif
+
+    /* pa_log("started up: %s", data); */
+
+    r = pthread_barrier_wait(&barrier);
+    pa_assert(r == 0 || r == PTHREAD_BARRIER_SERIAL_THREAD);
+
+    pa_run_once(&once, once_func);
+}
+
+int main(int argc, char *argv[]) {
+    unsigned n, i;
+
+    n_cpu = pa_ncpus();
+
+    for (n = 0; n < N_ITERATIONS; n++) {
+        pa_thread* threads[N_THREADS];
+
+        pa_assert_se(pthread_barrier_init(&barrier, NULL, N_THREADS) == 0);
+
+        /* Yes, kinda ugly */
+        pa_zero(once);
+
+        for (i = 0; i < N_THREADS; i++)
+            threads[i] = pa_thread_new(thread_func, pa_sprintf_malloc("Thread #%i", i+1));
+
+        for (i = 0; i < N_THREADS; i++)
+            pa_thread_join(threads[i]);
+
+        pa_assert(n_run == 1);
+        pa_log("ran by %s", ran_by);
+
+        for (i = 0; i < N_THREADS; i++) {
+            pa_xfree(pa_thread_get_data(threads[i]));
+            pa_thread_free(threads[i]);
+        }
+
+        n_run = 0;
+        ran_by = NULL;
+
+        pa_assert_se(pthread_barrier_destroy(&barrier) == 0);
+    }
+
+    return 0;
+}

commit 4b1679e06d3b4ed98ed8e934db8c0fe99877a56c
Merge: ba255bf f1d1447
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Jan 13 21:33:11 2010 +0100

    Merge remote branch 'tanuk/fixes'


commit 3d6cc026e25ea3015ea989273ba69336a26ab686
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Jan 13 22:08:59 2010 +0100

    client: introduce auto-connect-localhost= option in client.conf
    
    Partly fixes:
    
    http://pulseaudio.org/ticket/773
    
    Also fixes a security hole since listening on the default port is not
    access controlled right now.

diff --git a/man/pulse-client.conf.5.xml.in b/man/pulse-client.conf.5.xml.in
index 46cc845..349b515 100644
--- a/man/pulse-client.conf.5.xml.in
+++ b/man/pulse-client.conf.5.xml.in
@@ -106,6 +106,16 @@ USA.
       memory overcommit.</p>
     </option>
 
+    <option>
+      <p><opt>auto-connect-localhost=</opt> Automatically try to
+      connect to localhost via IP. Enabling this is a potential
+      security hole since connections are only authenticated one-way
+      and a rogue server might hence fool a client into sending it its
+      private (e.g. VoIP call) data. This was enabled by default on
+      PulseAudio version 0.9.21 and older. Defaults to
+      <opt>no</opt>.</p>
+    </option>
+
   </section>
 
   <section name="Authors">
diff --git a/src/pulse/client-conf.c b/src/pulse/client-conf.c
index 3eaca4d..6c97802 100644
--- a/src/pulse/client-conf.c
+++ b/src/pulse/client-conf.c
@@ -62,7 +62,8 @@ static const pa_client_conf default_conf = {
     .disable_shm = FALSE,
     .cookie_file = NULL,
     .cookie_valid = FALSE,
-    .shm_size = 0
+    .shm_size = 0,
+    .auto_connect_localhost = FALSE
 };
 
 pa_client_conf *pa_client_conf_new(void) {
@@ -105,6 +106,7 @@ int pa_client_conf_load(pa_client_conf *c, const char *filename) {
         { "disable-shm",            pa_config_parse_bool,     &c->disable_shm, NULL },
         { "enable-shm",             pa_config_parse_not_bool, &c->disable_shm, NULL },
         { "shm-size-bytes",         pa_config_parse_size,     &c->shm_size, NULL },
+        { "auto-connect-localhost", pa_config_parse_bool,     &c->auto_connect_localhost, NULL },
         { NULL,                     NULL,                     NULL, NULL },
     };
 
diff --git a/src/pulse/client-conf.h b/src/pulse/client-conf.h
index 618216f..3bca8fd 100644
--- a/src/pulse/client-conf.h
+++ b/src/pulse/client-conf.h
@@ -29,7 +29,7 @@
 
 typedef struct pa_client_conf {
     char *daemon_binary, *extra_arguments, *default_sink, *default_source, *default_server, *default_dbus_server, *cookie_file;
-    pa_bool_t autospawn, disable_shm;
+    pa_bool_t autospawn, disable_shm, auto_connect_localhost;
     uint8_t cookie[PA_NATIVE_COOKIE_LENGTH];
     pa_bool_t cookie_valid; /* non-zero, when cookie is valid */
     size_t shm_size;
diff --git a/src/pulse/client.conf.in b/src/pulse/client.conf.in
index e03096e..090713e 100644
--- a/src/pulse/client.conf.in
+++ b/src/pulse/client.conf.in
@@ -32,3 +32,5 @@
 
 ; enable-shm = yes
 ; shm-size-bytes = 0 # setting this 0 will use the system-default, usually 64 MiB
+
+; auto-connect-localhost = no
diff --git a/src/pulse/context.c b/src/pulse/context.c
index 0018492..85b90ac 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -997,8 +997,10 @@ int pa_context_connect(
         }
 
         /* Add TCP/IP on the localhost */
-        c->server_list = pa_strlist_prepend(c->server_list, "tcp6:[::1]");
-        c->server_list = pa_strlist_prepend(c->server_list, "tcp4:127.0.0.1");
+        if (c->conf->auto_connect_localhost) {
+            c->server_list = pa_strlist_prepend(c->server_list, "tcp6:[::1]");
+            c->server_list = pa_strlist_prepend(c->server_list, "tcp4:127.0.0.1");
+        }
 
         /* The system wide instance via PF_LOCAL */
         c->server_list = pa_strlist_prepend(c->server_list, PA_SYSTEM_RUNTIME_PATH PA_PATH_SEP PA_NATIVE_DEFAULT_UNIX_SOCKET);

commit 21cbcc1a8a5900af9e820b10d5c1b28fc803f947
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Jan 13 22:15:52 2010 +0100

    client: introduce auto-connect-display= following the scheme of auto-connect-localhost=
    
    Just connecting to a PA server just because X11's $DISPLAY is set might
    be a security hole.

diff --git a/man/pulse-client.conf.5.xml.in b/man/pulse-client.conf.5.xml.in
index 349b515..c2a847f 100644
--- a/man/pulse-client.conf.5.xml.in
+++ b/man/pulse-client.conf.5.xml.in
@@ -116,6 +116,13 @@ USA.
       <opt>no</opt>.</p>
     </option>
 
+    <option>
+      <p><opt>auto-connect-display=</opt> Automatically try to connect
+      to the host X11's $DISPLAY variable is set to. The same security
+      issues apply as to <opt>auto-connect-localhost=</opt>. Defaults
+      to <opt>no</opt>.</p>
+    </option>
+
   </section>
 
   <section name="Authors">
diff --git a/src/pulse/client-conf.c b/src/pulse/client-conf.c
index 6c97802..18fafe3 100644
--- a/src/pulse/client-conf.c
+++ b/src/pulse/client-conf.c
@@ -63,7 +63,8 @@ static const pa_client_conf default_conf = {
     .cookie_file = NULL,
     .cookie_valid = FALSE,
     .shm_size = 0,
-    .auto_connect_localhost = FALSE
+    .auto_connect_localhost = FALSE,
+    .auto_connect_display = FALSE
 };
 
 pa_client_conf *pa_client_conf_new(void) {
@@ -107,6 +108,7 @@ int pa_client_conf_load(pa_client_conf *c, const char *filename) {
         { "enable-shm",             pa_config_parse_not_bool, &c->disable_shm, NULL },
         { "shm-size-bytes",         pa_config_parse_size,     &c->shm_size, NULL },
         { "auto-connect-localhost", pa_config_parse_bool,     &c->auto_connect_localhost, NULL },
+        { "auto-connect-display",   pa_config_parse_bool,     &c->auto_connect_display, NULL },
         { NULL,                     NULL,                     NULL, NULL },
     };
 
diff --git a/src/pulse/client-conf.h b/src/pulse/client-conf.h
index 3bca8fd..f281f4e 100644
--- a/src/pulse/client-conf.h
+++ b/src/pulse/client-conf.h
@@ -29,7 +29,7 @@
 
 typedef struct pa_client_conf {
     char *daemon_binary, *extra_arguments, *default_sink, *default_source, *default_server, *default_dbus_server, *cookie_file;
-    pa_bool_t autospawn, disable_shm, auto_connect_localhost;
+    pa_bool_t autospawn, disable_shm, auto_connect_localhost, auto_connect_display;
     uint8_t cookie[PA_NATIVE_COOKIE_LENGTH];
     pa_bool_t cookie_valid; /* non-zero, when cookie is valid */
     size_t shm_size;
diff --git a/src/pulse/client.conf.in b/src/pulse/client.conf.in
index 090713e..436747b 100644
--- a/src/pulse/client.conf.in
+++ b/src/pulse/client.conf.in
@@ -34,3 +34,4 @@
 ; shm-size-bytes = 0 # setting this 0 will use the system-default, usually 64 MiB
 
 ; auto-connect-localhost = no
+; auto-connect-display = no
diff --git a/src/pulse/context.c b/src/pulse/context.c
index 85b90ac..83e0dbb 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -987,13 +987,15 @@ int pa_context_connect(
         /* Prepend in reverse order */
 
         /* Follow the X display */
-        if ((d = getenv("DISPLAY"))) {
-            d = pa_xstrndup(d, strcspn(d, ":"));
+        if (c->conf->auto_connect_display) {
+            if ((d = getenv("DISPLAY"))) {
+                d = pa_xstrndup(d, strcspn(d, ":"));
 
-            if (*d)
-                c->server_list = pa_strlist_prepend(c->server_list, d);
+                if (*d)
+                    c->server_list = pa_strlist_prepend(c->server_list, d);
 
-            pa_xfree(d);
+                pa_xfree(d);
+            }
         }
 
         /* Add TCP/IP on the localhost */

commit 76089b11eb27675bad4d929d34cc43639f0e54ee
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jan 14 00:13:13 2010 +0100

    native: fallback to another port if the default port is taken
    
    Unless the port number is explicitly configured we will now fallback to
    a kernel picked port if the one we'd like by default we cannot get.
    
    http://pulseaudio.org/ticket/773

diff --git a/src/modules/module-protocol-stub.c b/src/modules/module-protocol-stub.c
index 5b351d1..e0e7aa1 100644
--- a/src/modules/module-protocol-stub.c
+++ b/src/modules/module-protocol-stub.c
@@ -246,6 +246,7 @@ int pa__init(pa_module*m) {
 
 #if defined(USE_TCP_SOCKETS)
     uint32_t port = IPV4_PORT;
+    pa_bool_t port_fallback = TRUE;
     const char *listen_on;
 #else
     int r;
@@ -293,6 +294,10 @@ int pa__init(pa_module*m) {
 #endif
 
 #if defined(USE_TCP_SOCKETS)
+
+    if (pa_modargs_get_value(ma, "port", NULL))
+        port_fallback = FALSE;
+
     if (pa_modargs_get_value_u32(ma, "port", &port) < 0 || port < 1 || port > 0xFFFF) {
         pa_log("port= expects a numerical argument between 1 and 65535.");
         goto fail;
@@ -302,14 +307,14 @@ int pa__init(pa_module*m) {
 
     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);
+        u->socket_server_ipv6 = pa_socket_server_new_ipv6_string(m->core->mainloop, listen_on, (uint16_t) port, port_fallback, TCPWRAP_SERVICE);
 #  endif
-        u->socket_server_ipv4 = pa_socket_server_new_ipv4_string(m->core->mainloop, listen_on, (uint16_t) port, TCPWRAP_SERVICE);
+        u->socket_server_ipv4 = pa_socket_server_new_ipv4_string(m->core->mainloop, listen_on, (uint16_t) port, port_fallback, TCPWRAP_SERVICE);
     } else {
 #  ifdef HAVE_IPV6
-        u->socket_server_ipv6 = pa_socket_server_new_ipv6_any(m->core->mainloop, (uint16_t) port, TCPWRAP_SERVICE);
+        u->socket_server_ipv6 = pa_socket_server_new_ipv6_any(m->core->mainloop, (uint16_t) port, port_fallback, TCPWRAP_SERVICE);
 #  endif
-        u->socket_server_ipv4 = pa_socket_server_new_ipv4_any(m->core->mainloop, (uint16_t) port, TCPWRAP_SERVICE);
+        u->socket_server_ipv4 = pa_socket_server_new_ipv4_any(m->core->mainloop, (uint16_t) port, port_fallback, TCPWRAP_SERVICE);
     }
 
 #  ifdef HAVE_IPV6
diff --git a/src/pulsecore/socket-server.c b/src/pulsecore/socket-server.c
index 5d55de3..3b7c697 100644
--- a/src/pulsecore/socket-server.c
+++ b/src/pulsecore/socket-server.c
@@ -86,7 +86,12 @@ struct pa_socket_server {
 
     pa_io_event *io_event;
     pa_mainloop_api *mainloop;
-    enum { SOCKET_SERVER_GENERIC, SOCKET_SERVER_IPV4, SOCKET_SERVER_UNIX, SOCKET_SERVER_IPV6 } type;
+    enum {
+        SOCKET_SERVER_GENERIC,
+        SOCKET_SERVER_IPV4,
+        SOCKET_SERVER_UNIX,
+        SOCKET_SERVER_IPV6
+    } type;
 };
 
 static void callback(pa_mainloop_api *mainloop, pa_io_event *e, int fd, pa_io_event_flags_t f, void *userdata) {
@@ -150,15 +155,11 @@ pa_socket_server* pa_socket_server_new(pa_mainloop_api *m, int fd) {
     pa_assert(m);
     pa_assert(fd >= 0);
 
-    s = pa_xnew(pa_socket_server, 1);
+    s = pa_xnew0(pa_socket_server, 1);
     PA_REFCNT_INIT(s);
     s->fd = fd;
-    s->filename = NULL;
-    s->on_connection = NULL;
-    s->userdata = NULL;
-    s->tcpwrap_service = NULL;
-
     s->mainloop = m;
+
     pa_assert_se(s->io_event = m->io_new(m, fd, PA_IO_EVENT_INPUT, callback, s));
 
     s->type = SOCKET_SERVER_GENERIC;
@@ -233,7 +234,7 @@ pa_socket_server* pa_socket_server_new_unix(pa_mainloop_api *m, const char *file
 
 #endif /* HAVE_SYS_UN_H */
 
-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_ipv4(pa_mainloop_api *m, uint32_t address, uint16_t port, pa_bool_t fallback, const char *tcpwrap_service) {
     pa_socket_server *ss;
     int fd = -1;
     struct sockaddr_in sa;
@@ -260,8 +261,19 @@ pa_socket_server* pa_socket_server_new_ipv4(pa_mainloop_api *m, uint32_t address
     sa.sin_addr.s_addr = htonl(address);
 
     if (bind(fd, (struct sockaddr *) &sa, sizeof(sa)) < 0) {
+
+        if (errno == EADDRINUSE && fallback) {
+            sa.sin_port = 0;
+
+            if (bind(fd, (struct sockaddr *) &sa, sizeof(sa)) >= 0)
+                goto good;
+        }
+
         pa_log("bind(): %s", pa_cstrerror(errno));
         goto fail;
+
+    good:
+        ;
     }
 
     if (listen(fd, 5) < 0) {
@@ -284,7 +296,7 @@ fail:
 }
 
 #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(pa_mainloop_api *m, const uint8_t address[16], uint16_t port, pa_bool_t fallback, const char *tcpwrap_service) {
     pa_socket_server *ss;
     int fd = -1;
     struct sockaddr_in6 sa;
@@ -318,8 +330,19 @@ pa_socket_server* pa_socket_server_new_ipv6(pa_mainloop_api *m, const uint8_t ad
     memcpy(sa.sin6_addr.s6_addr, address, 16);
 
     if (bind(fd, (struct sockaddr *) &sa, sizeof(sa)) < 0) {
+
+        if (errno == EADDRINUSE && fallback) {
+            sa.sin6_port = 0;
+
+            if (bind(fd, (struct sockaddr *) &sa, sizeof(sa)) >= 0)
+                goto good;
+        }
+
         pa_log("bind(): %s", pa_cstrerror(errno));
         goto fail;
+
+    good:
+        ;
     }
 
     if (listen(fd, 5) < 0) {
@@ -342,39 +365,39 @@ fail:
 }
 #endif
 
-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_ipv4_loopback(pa_mainloop_api *m, uint16_t port, pa_bool_t fallback, const char *tcpwrap_service) {
     pa_assert(m);
     pa_assert(port > 0);
 
-    return pa_socket_server_new_ipv4(m, INADDR_LOOPBACK, port, tcpwrap_service);
+    return pa_socket_server_new_ipv4(m, INADDR_LOOPBACK, port, fallback, 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_socket_server* pa_socket_server_new_ipv6_loopback(pa_mainloop_api *m, uint16_t port, pa_bool_t fallback, 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);
+    return pa_socket_server_new_ipv6(m, in6addr_loopback.s6_addr, port, fallback, tcpwrap_service);
 }
 #endif
 
-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_ipv4_any(pa_mainloop_api *m, uint16_t port, pa_bool_t fallback, const char *tcpwrap_service) {
     pa_assert(m);
     pa_assert(port > 0);
 
-    return pa_socket_server_new_ipv4(m, INADDR_ANY, port, tcpwrap_service);
+    return pa_socket_server_new_ipv4(m, INADDR_ANY, port, fallback, 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_socket_server* pa_socket_server_new_ipv6_any(pa_mainloop_api *m, uint16_t port, pa_bool_t fallback, 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);
+    return pa_socket_server_new_ipv6(m, in6addr_any.s6_addr, port, fallback, 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) {
+pa_socket_server* pa_socket_server_new_ipv4_string(pa_mainloop_api *m, const char *name, uint16_t port, pa_bool_t fallback, const char *tcpwrap_service) {
     struct in_addr ipv4;
 
     pa_assert(m);
@@ -382,13 +405,13 @@ pa_socket_server* pa_socket_server_new_ipv4_string(pa_mainloop_api *m, const cha
     pa_assert(port > 0);
 
     if (inet_pton(AF_INET, name, &ipv4) > 0)
-        return pa_socket_server_new_ipv4(m, ntohl(ipv4.s_addr), port, tcpwrap_service);
+        return pa_socket_server_new_ipv4(m, ntohl(ipv4.s_addr), port, fallback, tcpwrap_service);
 
     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) {
+pa_socket_server* pa_socket_server_new_ipv6_string(pa_mainloop_api *m, const char *name, uint16_t port, pa_bool_t fallback, const char *tcpwrap_service) {
     struct in6_addr ipv6;
 
     pa_assert(m);
@@ -396,7 +419,7 @@ pa_socket_server* pa_socket_server_new_ipv6_string(pa_mainloop_api *m, const cha
     pa_assert(port > 0);
 
     if (inet_pton(AF_INET6, name, &ipv6) > 0)
-        return pa_socket_server_new_ipv6(m, ipv6.s6_addr, port, tcpwrap_service);
+        return pa_socket_server_new_ipv6(m, ipv6.s6_addr, port, fallback, tcpwrap_service);
 
     return NULL;
 }
diff --git a/src/pulsecore/socket-server.h b/src/pulsecore/socket-server.h
index 72b6eda..16da07b 100644
--- a/src/pulsecore/socket-server.h
+++ b/src/pulsecore/socket-server.h
@@ -33,15 +33,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_ipv4_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_ipv4_string(pa_mainloop_api *m, const char *name, uint16_t port, const char *tcpwrap_service);
+pa_socket_server* pa_socket_server_new_ipv4(pa_mainloop_api *m, uint32_t address, uint16_t port, pa_bool_t fallback, const char *tcpwrap_service);
+pa_socket_server* pa_socket_server_new_ipv4_loopback(pa_mainloop_api *m, uint16_t port, pa_bool_t fallback, const char *tcpwrap_service);
+pa_socket_server* pa_socket_server_new_ipv4_any(pa_mainloop_api *m, uint16_t port, pa_bool_t fallback, const char *tcpwrap_service);
+pa_socket_server* pa_socket_server_new_ipv4_string(pa_mainloop_api *m, const char *name, uint16_t port, pa_bool_t fallback, 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);
+pa_socket_server* pa_socket_server_new_ipv6(pa_mainloop_api *m, const uint8_t address[16], uint16_t port, pa_bool_t fallback, const char *tcpwrap_service);
+pa_socket_server* pa_socket_server_new_ipv6_loopback(pa_mainloop_api *m, uint16_t port, pa_bool_t fallback, const char *tcpwrap_service);
+pa_socket_server* pa_socket_server_new_ipv6_any(pa_mainloop_api *m, uint16_t port, pa_bool_t fallback, const char *tcpwrap_service);
+pa_socket_server* pa_socket_server_new_ipv6_string(pa_mainloop_api *m, const char *name, uint16_t port, pa_bool_t fallback, const char *tcpwrap_service);
 #endif
 
 void pa_socket_server_unref(pa_socket_server*s);

commit 2465cfac616c0931e89ead7efdbaa70bd8e0d66d
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jan 14 00:15:51 2010 +0100

    native: when run in system mode, do not look for fallback port

diff --git a/src/modules/module-protocol-stub.c b/src/modules/module-protocol-stub.c
index e0e7aa1..e21186b 100644
--- a/src/modules/module-protocol-stub.c
+++ b/src/modules/module-protocol-stub.c
@@ -295,7 +295,7 @@ int pa__init(pa_module*m) {
 
 #if defined(USE_TCP_SOCKETS)
 
-    if (pa_modargs_get_value(ma, "port", NULL))
+    if (pa_in_system_mode() || pa_modargs_get_value(ma, "port", NULL))
         port_fallback = FALSE;
 
     if (pa_modargs_get_value_u32(ma, "port", &port) < 0 || port < 1 || port > 0xFFFF) {

commit 1bfa1c3b03f8ab6c0edc08ac50e4babba70cbb3e
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jan 14 20:33:40 2010 +0100

    start: we don't need to check for $PULSE_SERVER anymore
    
    pulseaudio --start does that internally anyway, so we can get rid of
    this here.

diff --git a/src/daemon/start-pulseaudio-x11.in b/src/daemon/start-pulseaudio-x11.in
index c57c489..391a6d3 100755
--- a/src/daemon/start-pulseaudio-x11.in
+++ b/src/daemon/start-pulseaudio-x11.in
@@ -19,8 +19,6 @@
 
 set -e
 
-[ -z "$PULSE_SERVER" ]
-
 @PA_BINARY@ --start "$@"
 
 if [ x"$DISPLAY" != x ] ; then

commit 62bfb511f60dc81c6c38e1f00c43e90eca934dcb
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jan 14 21:32:26 2010 +0100

    client: include dolby channel names in comments

diff --git a/src/pulse/channelmap.h b/src/pulse/channelmap.h
index 469effc..d1d5c8b 100644
--- a/src/pulse/channelmap.h
+++ b/src/pulse/channelmap.h
@@ -74,9 +74,9 @@ typedef enum pa_channel_position {
     PA_CHANNEL_POSITION_INVALID = -1,
     PA_CHANNEL_POSITION_MONO = 0,
 
-    PA_CHANNEL_POSITION_FRONT_LEFT,               /* Apple calls this 'Left' */
-    PA_CHANNEL_POSITION_FRONT_RIGHT,              /* Apple calls this 'Right' */
-    PA_CHANNEL_POSITION_FRONT_CENTER,             /* Apple calls this 'Center' */
+    PA_CHANNEL_POSITION_FRONT_LEFT,               /* Apple, Dolby call this 'Left' */
+    PA_CHANNEL_POSITION_FRONT_RIGHT,              /* Apple, Dolby call this 'Right' */
+    PA_CHANNEL_POSITION_FRONT_CENTER,             /* Apple, Dolby call this 'Center' */
 
 /** \cond fulldocs */
     PA_CHANNEL_POSITION_LEFT = PA_CHANNEL_POSITION_FRONT_LEFT,
@@ -84,20 +84,20 @@ typedef enum pa_channel_position {
     PA_CHANNEL_POSITION_CENTER = PA_CHANNEL_POSITION_FRONT_CENTER,
 /** \endcond */
 
-    PA_CHANNEL_POSITION_REAR_CENTER,              /* Microsoft calls this 'Back Center', Apple calls this 'Center Surround' */
-    PA_CHANNEL_POSITION_REAR_LEFT,                /* Microsoft calls this 'Back Left', Apple calls this 'Left Surround' */
-    PA_CHANNEL_POSITION_REAR_RIGHT,               /* Microsoft calls this 'Back Right', Apple calls this 'Right Surround' */
+    PA_CHANNEL_POSITION_REAR_CENTER,              /* Microsoft calls this 'Back Center', Apple calls this 'Center Surround', Dolby calls this 'Surround Rear Center' */
+    PA_CHANNEL_POSITION_REAR_LEFT,                /* Microsoft calls this 'Back Left', Apple calls this 'Left Surround' (!), Dolby calls this 'Surround Rear Left'  */
+    PA_CHANNEL_POSITION_REAR_RIGHT,               /* Microsoft calls this 'Back Right', Apple calls this 'Right Surround' (!), Dolby calls this 'Surround Rear Right'  */
 
     PA_CHANNEL_POSITION_LFE,                      /* Microsoft calls this 'Low Frequency', Apple calls this 'LFEScreen' */
 /** \cond fulldocs */
     PA_CHANNEL_POSITION_SUBWOOFER = PA_CHANNEL_POSITION_LFE,
 /** \endcond */
 
-    PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,     /* Apple calls this 'Left Center' */
-    PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,    /* Apple calls this 'Right Center */
+    PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER,     /* Apple, Dolby call this 'Left Center' */
+    PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER,    /* Apple, Dolby call this 'Right Center */
 
-    PA_CHANNEL_POSITION_SIDE_LEFT,                /* Apple calls this 'Left Surround Direct' */
-    PA_CHANNEL_POSITION_SIDE_RIGHT,               /* Apple calls this 'Right Surround Direct' */
+    PA_CHANNEL_POSITION_SIDE_LEFT,                /* Apple calls this 'Left Surround Direct', Dolby calls this 'Surround Left' (!) */
+    PA_CHANNEL_POSITION_SIDE_RIGHT,               /* Apple calls this 'Right Surround Direct', Dolby calls this 'Surround Right' (!) */
 
     PA_CHANNEL_POSITION_AUX0,
     PA_CHANNEL_POSITION_AUX1,

commit ea8927f1d47be101a1f64b2f87fd6e527ff76dbe
Author: Paul Menzel <paulepanter at users.sourceforge.net>
Date:   Thu Jan 21 13:11:56 2010 +0100

    Typo. s/a/are/
    
    Signed-off-by: Paul Menzel <paulepanter at users.sourceforge.net>

diff --git a/src/daemon/daemon.conf.in b/src/daemon/daemon.conf.in
index 7c1a7b8..5de27ed 100644
--- a/src/daemon/daemon.conf.in
+++ b/src/daemon/daemon.conf.in
@@ -16,7 +16,7 @@
 # USA.
 
 ## Configuration file for the PulseAudio daemon. See pulse-daemon.conf(5) for
-## more information. Default values a commented out.  Use either ; or # for
+## more information. Default values are commented out.  Use either ; or # for
 ## commenting.
 
 ; daemonize = no

commit f250179b4ea989c26d99268a362d57a8a7136a1f
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Feb 2 08:51:44 2010 +0100

    shm: explicitly mark shm seg for MAP_NORESERVE to request overcommiting no matter what

diff --git a/src/pulsecore/shm.c b/src/pulsecore/shm.c
index fbf777a..29849d5 100644
--- a/src/pulsecore/shm.c
+++ b/src/pulsecore/shm.c
@@ -154,7 +154,11 @@ int pa_shm_create_rw(pa_shm *m, size_t size, pa_bool_t shared, mode_t mode) {
             goto fail;
         }
 
-        if ((m->ptr = mmap(NULL, PA_PAGE_ALIGN(m->size), PROT_READ|PROT_WRITE, MAP_SHARED, fd, (off_t) 0)) == MAP_FAILED) {
+#ifndef MAP_NORESERVE
+#define MAP_NORESERVE 0
+#endif
+
+        if ((m->ptr = mmap(NULL, PA_PAGE_ALIGN(m->size), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_NORESERVE, fd, (off_t) 0)) == MAP_FAILED) {
             pa_log("mmap() failed: %s", pa_cstrerror(errno));
             goto fail;
         }

commit 0ac13f17bae05764d080eb9e164224e6aaf59175
Author: Paul Menzel <paulepanter at users.sourceforge.net>
Date:   Sun Jan 31 12:44:59 2010 +0100

    man pages: correct formatting/markup of options

diff --git a/man/pulse-client.conf.5.xml.in b/man/pulse-client.conf.5.xml.in
index c2a847f..739fae4 100644
--- a/man/pulse-client.conf.5.xml.in
+++ b/man/pulse-client.conf.5.xml.in
@@ -69,7 +69,7 @@ USA.
 
     <option>
       <p><opt>autospawn=</opt> Autospawn a PulseAudio daemon when
-      needed. Takes a boolean value, defaults to "yes".</p>
+      needed. Takes a boolean value, defaults to <opt>yes</opt>.</p>
     </option>
 
     <option>
diff --git a/man/pulse-daemon.conf.5.xml.in b/man/pulse-daemon.conf.5.xml.in
index e6b1e19..b5c9e92 100644
--- a/man/pulse-daemon.conf.5.xml.in
+++ b/man/pulse-daemon.conf.5.xml.in
@@ -53,14 +53,14 @@ USA.
 
     <option>
       <p><opt>daemonize= </opt> Daemonize after startup. Takes a
-      boolean value, defaults to "no". The <opt>--daemonize</opt>
+      boolean value, defaults to <opt>no</opt>. The <opt>--daemonize</opt>
       command line option takes precedence.</p>
     </option>
 
     <option>
       <p><opt>fail=</opt> Fail to start up if any of the directives
       in the configuration script <file>default.pa</file>
-      fail. Takes a boolean argument, defaults to "yes". The <opt>--fail</opt> command line
+      fail. Takes a boolean argument, defaults to <opt>yes</opt>. The <opt>--fail</opt> command line
       option takes precedence.</p>
     </option>
 
@@ -191,7 +191,7 @@ USA.
       RLIMIT_NICE is used. root is dropped immediately after gaining
       the nice level on startup, thus it is presumably safe. See
       <manref section="1" name="pulseaudio"/> for more
-      information. Takes a boolean argument, defaults to "yes". The <opt>--high-priority</opt>
+      information. Takes a boolean argument, defaults to <opt>yes</opt>. The <opt>--high-priority</opt>
       command line option takes precedence.</p>
     </option>
 
@@ -205,7 +205,7 @@ USA.
       real-time. The controlling thread is left a normally scheduled
       thread. Thus enabling the high-priority option is orthogonal.
       See <manref section="1" name="pulseaudio"/> for more
-      information. Takes a boolean argument, defaults to "yes". The
+      information. Takes a boolean argument, defaults to <opt>yes</opt>. The
       <opt>--realtime</opt> command line option takes precedence.</p>
     </option>
 
@@ -215,7 +215,7 @@ USA.
       by default, 9 for clients. Thus it is recommended to choose the
       PulseAudio real-time priorities lower. Some PulseAudio threads
       might choose a priority a little lower or higher than the
-      specified value. Defaults to "5".</p>
+      specified value. Defaults to <opt>5</opt>.</p>
     </option>
 
     <option>

commit 57b0397823088fd3e15119f0e1aeb6b7bc2bc90b
Author: Paul Menzel <paulepanter at users.sourceforge.net>
Date:   Sat Jan 30 13:59:52 2010 +0100

    client.conf.in: Typo. s/a/are/
    
    This is the same typo as reported in [1] and fixed in [2] in `client.conf.in`.
    
    I did `git grep "values a commented"` and did not get anymore hits.
    
    [1] http://pulseaudio.org/ticket/783
    [2] http://git.0pointer.de/?p=pulseaudio.git;a=commit;h=ea8927f1d47be101a1f64b2f87fd6e527ff76dbe

diff --git a/src/pulse/client.conf.in b/src/pulse/client.conf.in
index 436747b..17753b0 100644
--- a/src/pulse/client.conf.in
+++ b/src/pulse/client.conf.in
@@ -16,7 +16,7 @@
 # USA.
 
 ## Configuration file for PulseAudio clients. See pulse-client.conf(5) for
-## more information. Default values a commented out.  Use either ; or # for
+## more information. Default values are commented out.  Use either ; or # for
 ## commenting.
 
 ; default-sink =

commit 2f86ba4fc22901b4aa5e0b4029d3b80f3feb0a91
Author: Daniel Mack <daniel at caiaq.de>
Date:   Tue Feb 2 18:30:09 2010 +0800

    osx: don't build the once-test binary on OS X
    
    OS X lacks the barrier pthread APIs

diff --git a/src/Makefile.am b/src/Makefile.am
index 2978b8f..6c0b4d8 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -294,7 +294,6 @@ TESTS_BINARIES = \
 		hook-list-test \
 		memblock-test \
 		thread-test \
-		once-test \
 		flist-test \
 		asyncq-test \
 		asyncmsgq-test \
@@ -340,6 +339,11 @@ TESTS_BINARIES += \
 		alsa-time-test
 endif
 
+if !OS_IS_DARWIN
+TESTS_BINARIES += \
+		once-test
+endif
+
 if BUILD_TESTS_DEFAULT
 noinst_PROGRAMS = $(TESTS_BINARIES)
 else

commit 6fd2d087585b33dce918e857e9f2635862a0746c
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Fri Feb 5 00:15:38 2010 +0000

    stream-restore: Clear the save_sink/save_source flags on apply_entry.
    
    If the user specifically removes the device element from the stream
    restore rule, we have to clear the save_sink/save_source flag of the
    stream. This means that other stream routing systems
    (e.g. module-device-manager) can take over routing for this
    stream. In order to facilitate the reapplication of other routing
    rules, we fire a stream change event. Arguably the stream itself
    has not changed, but the rules governing its routing have, so
    I feel this is justified.

diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index becdb54..64a7fd3 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -1626,12 +1626,24 @@ static void apply_entry(struct userdata *u, const char *name, struct entry *e) {
             pa_sink_input_set_mute(si, e->muted, TRUE);
         }
 
-        if (u->restore_device &&
-            e->device_valid &&
-            (s = pa_namereg_get(u->core, e->device, PA_NAMEREG_SINK))) {
-
-            pa_log_info("Restoring device for stream %s.", name);
-            pa_sink_input_move_to(si, s, TRUE);
+        if (u->restore_device) {
+            if (!e->device_valid) {
+                if (si->save_sink) {
+                    pa_log_info("Ensuring device is not saved for stream %s.", name);
+                    /* If the device is not valid we should make sure the
+                       save flag is cleared as the user may have specifically
+                       removed the sink element from the rule. */
+                    si->save_sink = FALSE;
+                    /* This is cheating a bit. The sink input itself has not changed
+                       but the rules governing it's routing have, so we fire this event
+                       such that other routing modules (e.g. module-device-manager)
+                       will pick up the change and reapply their routing */
+                    pa_subscription_post(si->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, si->index);
+                }
+            } else if ((s = pa_namereg_get(u->core, e->device, PA_NAMEREG_SINK))) {
+                pa_log_info("Restoring device for stream %s.", name);
+                pa_sink_input_move_to(si, s, TRUE);
+            }
         }
     }
 
@@ -1648,12 +1660,24 @@ static void apply_entry(struct userdata *u, const char *name, struct entry *e) {
         }
         pa_xfree(n);
 
-        if (u->restore_device &&
-            e->device_valid &&
-            (s = pa_namereg_get(u->core, e->device, PA_NAMEREG_SOURCE))) {
-
-            pa_log_info("Restoring device for stream %s.", name);
-            pa_source_output_move_to(so, s, TRUE);
+        if (u->restore_device) {
+            if (!e->device_valid) {
+                if (so->save_source) {
+                    pa_log_info("Ensuring device is not saved for stream %s.", name);
+                    /* If the device is not valid we should make sure the
+                       save flag is cleared as the user may have specifically
+                       removed the source element from the rule. */
+                    so->save_source = FALSE;
+                    /* This is cheating a bit. The source output itself has not changed
+                       but the rules governing it's routing have, so we fire this event
+                       such that other routing modules (e.g. module-device-manager)
+                       will pick up the change and reapply their routing */
+                    pa_subscription_post(so->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE, so->index);
+                }
+            } else if ((s = pa_namereg_get(u->core, e->device, PA_NAMEREG_SOURCE))) {
+                pa_log_info("Restoring device for stream %s.", name);
+                pa_source_output_move_to(so, s, TRUE);
+            }
         }
     }
 }

commit cd559553a0bfbf37d18c86ba4efc56d65af2ed4e
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Tue Feb 9 21:37:32 2010 +0000

    core: Fix macro typo - PA_SINK_IS_LINKED -> PA_SINK_INPUT_IS_LINKED

diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index c75d417..e73999d 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -1061,7 +1061,7 @@ void pa_sink_input_update_proplist(pa_sink_input *i, pa_update_mode_t mode, pa_p
     if (p)
         pa_proplist_update(i->proplist, mode, p);
 
-    if (PA_SINK_IS_LINKED(i->state)) {
+    if (PA_SINK_INPUT_IS_LINKED(i->state)) {
         pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED], i);
         pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
     }

commit 63abcc83307fd74d6556e8a679d647b5b5920868
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Nov 11 05:32:24 2009 +0100

    build-sys: bump soname

diff --git a/configure.ac b/configure.ac
index 6b540e4..b4f94c1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -44,7 +44,7 @@ AC_SUBST(PA_PROTOCOL_VERSION, 17)
 
 # The stable ABI for client applications, for the version info x:y:z
 # always will hold y=z
-AC_SUBST(LIBPULSE_VERSION_INFO, [12:0:12])
+AC_SUBST(LIBPULSE_VERSION_INFO, [12:1:12])
 
 # A simplified, synchronous, ABI-stable interface for client
 # applications, for the version info x:y:z always will hold y=z

commit 5e2a80c7e33a9f32058d53c33519197567a9887a
Author: Lennart Poettering <lennart at poettering.net>
Date:   Mon Nov 23 05:07:00 2009 +0100

    bump soname

diff --git a/configure.ac b/configure.ac
index b4f94c1..8abaabb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -44,7 +44,7 @@ AC_SUBST(PA_PROTOCOL_VERSION, 17)
 
 # The stable ABI for client applications, for the version info x:y:z
 # always will hold y=z
-AC_SUBST(LIBPULSE_VERSION_INFO, [12:1:12])
+AC_SUBST(LIBPULSE_VERSION_INFO, [12:2:12])
 
 # A simplified, synchronous, ABI-stable interface for client
 # applications, for the version info x:y:z always will hold y=z

commit 66dbca1e06af0607a2d0fc6b8d14ef1ebb034f0a
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Jan 8 20:06:21 2010 +0100

    dbus: remove filter functions only if they were actually set before
    
    This fixes an assert when destructing modules that have not been fully
    initialized.
    
    https://bugzilla.redhat.com/show_bug.cgi?id=548525

diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
index 47d6200..795d510 100644
--- a/src/modules/bluetooth/bluetooth-util.c
+++ b/src/modules/bluetooth/bluetooth-util.c
@@ -37,6 +37,7 @@ struct pa_bluetooth_discovery {
     PA_LLIST_HEAD(pa_dbus_pending, pending);
     pa_hashmap *devices;
     pa_hook hook;
+    pa_bool_t filter_added;
 };
 
 static void get_properties_reply(DBusPendingCall *pending, void *userdata);
@@ -788,6 +789,7 @@ pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *c) {
         pa_log_error("Failed to add filter function");
         goto fail;
     }
+    y->filter_added = TRUE;
 
     if (pa_dbus_add_matches(
                 pa_dbus_connection_get(y->connection), &err,
@@ -856,7 +858,8 @@ void pa_bluetooth_discovery_unref(pa_bluetooth_discovery *y) {
                                "type='signal',sender='org.bluez',interface='org.bluez.AudioSink',member='PropertyChanged'",
                                "type='signal',sender='org.bluez',interface='org.bluez.AudioSource',member='PropertyChanged'", NULL);
 
-        dbus_connection_remove_filter(pa_dbus_connection_get(y->connection), filter_cb, y);
+        if (y->filter_added)
+            dbus_connection_remove_filter(pa_dbus_connection_get(y->connection), filter_cb, y);
 
         pa_dbus_connection_unref(y->connection);
     }
diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 0ba1421..19676df 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -179,6 +179,8 @@ struct userdata {
 
     int stream_write_type;
     int service_write_type, service_read_type;
+
+    pa_bool_t filter_added;
 };
 
 #define FIXED_LATENCY_PLAYBACK_A2DP (25*PA_USEC_PER_MSEC)
@@ -2405,6 +2407,7 @@ int pa__init(pa_module* m) {
         pa_log_error("Failed to add filter function");
         goto fail;
     }
+    u->filter_added = TRUE;
 
     speaker = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='SpeakerGainChanged',path='%s'", u->path);
     mike = pa_sprintf_malloc("type='signal',sender='org.bluez',interface='org.bluez.Headset',member='MicrophoneGainChanged',path='%s'", u->path);
@@ -2494,7 +2497,9 @@ void pa__done(pa_module *m) {
             pa_xfree(mike);
         }
 
-        dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
+        if (u->filter_added)
+            dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
+
         pa_dbus_connection_unref(u->connection);
     }
 
diff --git a/src/modules/bluetooth/module-bluetooth-proximity.c b/src/modules/bluetooth/module-bluetooth-proximity.c
index c4cfd73..3eed9ce 100644
--- a/src/modules/bluetooth/module-bluetooth-proximity.c
+++ b/src/modules/bluetooth/module-bluetooth-proximity.c
@@ -92,7 +92,8 @@ struct userdata {
     unsigned n_found;
     unsigned n_unknown;
 
-    pa_bool_t muted;
+    pa_bool_t muted:1;
+    pa_bool_t filter_added:1;
 };
 
 static void update_volume(struct userdata *u) {
@@ -358,9 +359,10 @@ static int add_matches(struct userdata *u, pa_bool_t add) {
     } else
         dbus_bus_remove_match(pa_dbus_connection_get(u->dbus_connection), filter2, &e);
 
-    if (add)
+    if (add) {
         pa_assert_se(dbus_connection_add_filter(pa_dbus_connection_get(u->dbus_connection), filter_func, u, NULL));
-    else
+        u->filter_added = TRUE;
+    } else if (u->filter_added)
         dbus_connection_remove_filter(pa_dbus_connection_get(u->dbus_connection), filter_func, u);
 
     r = 0;
@@ -393,9 +395,6 @@ int pa__init(pa_module*m) {
     u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink", NULL));
     u->hci = pa_xstrdup(pa_modargs_get_value(ma, "hci", DEFAULT_HCI));
     u->hci_path = pa_sprintf_malloc("/org/bluez/%s", u->hci);
-    u->n_found = u->n_unknown = 0;
-    u->muted = FALSE;
-
     u->bondings = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
 
     if (!(u->dbus_connection = pa_dbus_bus_get(m->core, DBUS_BUS_SYSTEM, &e))) {
diff --git a/src/modules/module-console-kit.c b/src/modules/module-console-kit.c
index 103f5c4..875852f 100644
--- a/src/modules/module-console-kit.c
+++ b/src/modules/module-console-kit.c
@@ -67,6 +67,7 @@ struct userdata {
     pa_core *core;
     pa_dbus_connection *connection;
     pa_hashmap *sessions;
+    pa_bool_t filter_added;
 };
 
 static void add_session(struct userdata *u, const char *id) {
@@ -300,7 +301,7 @@ int pa__init(pa_module*m) {
         goto fail;
     }
 
-    m->userdata = u = pa_xnew(struct userdata, 1);
+    m->userdata = u = pa_xnew0(struct userdata, 1);
     u->core = m->core;
     u->module = m;
     u->connection = connection;
@@ -311,6 +312,8 @@ int pa__init(pa_module*m) {
         goto fail;
     }
 
+    u->filter_added = TRUE;
+
     if (pa_dbus_add_matches(
                 pa_dbus_connection_get(connection), &error,
                 "type='signal',sender='org.freedesktop.ConsoleKit',interface='org.freedesktop.ConsoleKit.Seat',member='SessionAdded'",
@@ -359,7 +362,9 @@ void pa__done(pa_module *m) {
                 "type='signal',sender='org.freedesktop.ConsoleKit',interface='org.freedesktop.ConsoleKit.Seat',member='SessionAdded'",
                 "type='signal',sender='org.freedesktop.ConsoleKit',interface='org.freedesktop.ConsoleKit.Seat',member='SessionRemoved'", NULL);
 
-        dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
+        if (u->filter_added)
+            dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
+
         pa_dbus_connection_unref(u->connection);
     }
 
diff --git a/src/modules/module-hal-detect.c b/src/modules/module-hal-detect.c
index 1851913..23d4010 100644
--- a/src/modules/module-hal-detect.c
+++ b/src/modules/module-hal-detect.c
@@ -87,6 +87,7 @@ struct userdata {
 #ifdef HAVE_OSS_OUTPUT
     pa_bool_t init_subdevs;
 #endif
+    pa_bool_t filter_added:1;
 };
 
 #define CAPABILITY_ALSA "alsa"
@@ -733,12 +734,9 @@ int pa__init(pa_module*m) {
         goto fail;
     }
 
-    m->userdata = u = pa_xnew(struct userdata, 1);
+    m->userdata = u = pa_xnew0(struct userdata, 1);
     u->core = m->core;
-    u->context = NULL;
-    u->connection = NULL;
     u->devices = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
-    u->capability = NULL;
 
 #ifdef HAVE_ALSA
     u->use_tsched = TRUE;
@@ -800,6 +798,7 @@ int pa__init(pa_module*m) {
         pa_log_error("Failed to add filter function");
         goto fail;
     }
+    u->filter_added = TRUE;
 
     if (pa_dbus_add_matches(
                 pa_dbus_connection_get(u->connection), &error,
@@ -856,7 +855,8 @@ void pa__done(pa_module *m) {
                 "type='signal',sender='org.freedesktop.Hal',interface='org.freedesktop.Hal.Device.AccessControl',member='ACLRemoved'",
                 "type='signal',interface='org.pulseaudio.Server',member='DirtyGiveUpMessage'", NULL);
 
-        dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
+        if (u->filter_added)
+            dbus_connection_remove_filter(pa_dbus_connection_get(u->connection), filter_cb, u);
         pa_dbus_connection_unref(u->connection);
     }
 
diff --git a/src/pulse/context.c b/src/pulse/context.c
index 83e0dbb..8875bfd 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -145,7 +145,7 @@ pa_context *pa_context_new_with_proplist(pa_mainloop_api *mainloop, const char *
 
     pa_init_i18n();
 
-    c = pa_xnew(pa_context, 1);
+    c = pa_xnew0(pa_context, 1);
     PA_REFCNT_INIT(c);
 
     c->proplist = p ? pa_proplist_copy(p) : pa_proplist_new();
@@ -157,9 +157,6 @@ pa_context *pa_context_new_with_proplist(pa_mainloop_api *mainloop, const char *
     c->system_bus = c->session_bus = NULL;
 #endif
     c->mainloop = mainloop;
-    c->client = NULL;
-    c->pstream = NULL;
-    c->pdispatch = NULL;
     c->playback_streams = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
     c->record_streams = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
     c->client_index = PA_INVALID_INDEX;
@@ -170,22 +167,9 @@ pa_context *pa_context_new_with_proplist(pa_mainloop_api *mainloop, const char *
 
     c->error = PA_OK;
     c->state = PA_CONTEXT_UNCONNECTED;
-    c->ctag = 0;
-    c->csyncid = 0;
 
     reset_callbacks(c);
 
-    c->is_local = FALSE;
-    c->server_list = NULL;
-    c->server = NULL;
-
-    c->do_shm = FALSE;
-
-    c->server_specified = FALSE;
-    c->no_fail = FALSE;
-    c->do_autospawn = FALSE;
-    memset(&c->spawn_api, 0, sizeof(c->spawn_api));
-
 #ifndef MSG_NOSIGNAL
 #ifdef SIGPIPE
     pa_check_signal_is_blocked(SIGPIPE);
@@ -255,12 +239,14 @@ static void context_free(pa_context *c) {
 
 #ifdef HAVE_DBUS
     if (c->system_bus) {
-        dbus_connection_remove_filter(pa_dbus_wrap_connection_get(c->system_bus), filter_cb, c);
+        if (c->filter_added)
+            dbus_connection_remove_filter(pa_dbus_wrap_connection_get(c->system_bus), filter_cb, c);
         pa_dbus_wrap_connection_free(c->system_bus);
     }
 
     if (c->session_bus) {
-        dbus_connection_remove_filter(pa_dbus_wrap_connection_get(c->session_bus), filter_cb, c);
+        if (c->filter_added)
+            dbus_connection_remove_filter(pa_dbus_wrap_connection_get(c->session_bus), filter_cb, c);
         pa_dbus_wrap_connection_free(c->session_bus);
     }
 #endif
@@ -794,6 +780,7 @@ static void track_pulseaudio_on_dbus(pa_context *c, DBusBusType type, pa_dbus_wr
         pa_log_warn("Failed to add filter function");
         goto fail;
     }
+    c->filter_added = TRUE;
 
     if (pa_dbus_add_matches(
                 pa_dbus_wrap_connection_get(*conn), &error,
diff --git a/src/pulse/internal.h b/src/pulse/internal.h
index 9545d50..ab702b9 100644
--- a/src/pulse/internal.h
+++ b/src/pulse/internal.h
@@ -90,6 +90,7 @@ struct pa_context {
     pa_bool_t no_fail:1;
     pa_bool_t do_autospawn:1;
     pa_bool_t use_rtclock:1;
+    pa_bool_t filter_added:1;
     pa_spawn_api spawn_api;
 
     pa_strlist *server_list;

commit 699233fb47d133f6ea1e36e8354a386c23608d5a
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Jan 8 20:07:34 2010 +0100

    native: fix request counter miscalculations
    
    Do not subtract bytes the client sends us beyond what we requested from
    our missing bytes counter.
    
    This was mostly a thinko that caused servers asking for too little data
    when the client initially sent more data than requested, because that
    data sent too much was accounted for twice.
    
    This commit fixes this miscalculation.
    
    http://bugzilla.redhat.com/show_bug.cgi?id=534130

diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index 4081256..0f9e50a 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -741,6 +741,8 @@ void pa_command_request(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tag
 
     s->requested_bytes += bytes;
 
+    /* pa_log("got request for %lli, now at %lli", (long long) bytes, (long long) s->requested_bytes); */
+
     if (s->requested_bytes > 0 && s->write_callback)
         s->write_callback(s, (size_t) s->requested_bytes, s->write_userdata);
 
@@ -1362,6 +1364,8 @@ int pa_stream_write(
      * that's OK, the server side applies the same error */
     s->requested_bytes -= (seek == PA_SEEK_RELATIVE ? offset : 0) + (int64_t) length;
 
+    /* pa_log("wrote %lli, now at %lli", (long long) length, (long long) s->requested_bytes); */
+
     if (s->direction == PA_STREAM_PLAYBACK) {
 
         /* Update latency request correction */
diff --git a/src/pulsecore/memblockq.c b/src/pulsecore/memblockq.c
index 32758be..4641801 100644
--- a/src/pulsecore/memblockq.c
+++ b/src/pulsecore/memblockq.c
@@ -55,8 +55,7 @@ struct pa_memblockq {
     pa_bool_t in_prebuf;
     pa_memchunk silence;
     pa_mcalign *mcalign;
-    int64_t missing;
-    size_t requested;
+    int64_t missing, requested;
 };
 
 pa_memblockq* pa_memblockq_new(
@@ -84,8 +83,8 @@ pa_memblockq* pa_memblockq_new(
     pa_log_debug("memblockq requested: maxlength=%lu, tlength=%lu, base=%lu, prebuf=%lu, minreq=%lu maxrewind=%lu",
                  (unsigned long) maxlength, (unsigned long) tlength, (unsigned long) base, (unsigned long) prebuf, (unsigned long) minreq, (unsigned long) maxrewind);
 
-    bq->missing = 0;
-    bq->requested = bq->maxlength = bq->tlength = bq->prebuf = bq->minreq = bq->maxrewind = 0;
+    bq->missing = bq->requested = 0;
+    bq->maxlength = bq->tlength = bq->prebuf = bq->minreq = bq->maxrewind = 0;
     bq->in_prebuf = TRUE;
 
     pa_memblockq_set_maxlength(bq, maxlength);
@@ -246,10 +245,34 @@ static pa_bool_t can_push(pa_memblockq *bq, size_t l) {
     return TRUE;
 }
 
+static void write_index_changed(pa_memblockq *bq, int64_t old_write_index, pa_bool_t account) {
+    int64_t delta;
+
+    pa_assert(bq);
+
+    delta = bq->write_index - old_write_index;
+
+    if (account)
+        bq->requested -= delta;
+
+    /* pa_log("pushed/seeked %lli: requested counter at %lli, account=%i", (long long) delta, (long long) bq->requested, account); */
+}
+
+static void read_index_changed(pa_memblockq *bq, int64_t old_read_index) {
+    int64_t delta;
+
+    pa_assert(bq);
+
+    delta = bq->read_index - old_read_index;
+    bq->missing += delta;
+
+    /* pa_log("popped %lli: missing counter at %lli", (long long) delta, (long long) bq->missing); */
+}
+
 int pa_memblockq_push(pa_memblockq* bq, const pa_memchunk *uchunk) {
     struct list_item *q, *n;
     pa_memchunk chunk;
-    int64_t old, delta;
+    int64_t old;
 
     pa_assert(bq);
     pa_assert(uchunk);
@@ -409,18 +432,7 @@ int pa_memblockq_push(pa_memblockq* bq, const pa_memchunk *uchunk) {
 
 finish:
 
-    delta = bq->write_index - old;
-
-    if (delta >= (int64_t) bq->requested) {
-        delta -= (int64_t) bq->requested;
-        bq->requested = 0;
-    } else {
-        bq->requested -= (size_t) delta;
-        delta = 0;
-    }
-
-    bq->missing -= delta;
-
+    write_index_changed(bq, old, TRUE);
     return 0;
 }
 
@@ -514,7 +526,7 @@ int pa_memblockq_peek(pa_memblockq* bq, pa_memchunk *chunk) {
 }
 
 void pa_memblockq_drop(pa_memblockq *bq, size_t length) {
-    int64_t old, delta;
+    int64_t old;
     pa_assert(bq);
     pa_assert(length % bq->base == 0);
 
@@ -553,19 +565,21 @@ void pa_memblockq_drop(pa_memblockq *bq, size_t length) {
     }
 
     drop_backlog(bq);
-
-    delta = bq->read_index - old;
-    bq->missing += delta;
+    read_index_changed(bq, old);
 }
 
 void pa_memblockq_rewind(pa_memblockq *bq, size_t length) {
+    int64_t old;
     pa_assert(bq);
     pa_assert(length % bq->base == 0);
 
+    old = bq->read_index;
+
     /* This is kind of the inverse of pa_memblockq_drop() */
 
     bq->read_index -= (int64_t) length;
-    bq->missing -= (int64_t) length;
+
+    read_index_changed(bq, old);
 }
 
 pa_bool_t pa_memblockq_is_readable(pa_memblockq *bq) {
@@ -602,7 +616,7 @@ size_t pa_memblockq_missing(pa_memblockq *bq) {
 }
 
 void pa_memblockq_seek(pa_memblockq *bq, int64_t offset, pa_seek_mode_t seek, pa_bool_t account) {
-    int64_t old, delta;
+    int64_t old;
     pa_assert(bq);
 
     old = bq->write_index;
@@ -625,24 +639,11 @@ void pa_memblockq_seek(pa_memblockq *bq, int64_t offset, pa_seek_mode_t seek, pa
     }
 
     drop_backlog(bq);
-
-    delta = bq->write_index - old;
-
-    if (account) {
-        if (delta >= (int64_t) bq->requested) {
-            delta -= (int64_t) bq->requested;
-            bq->requested = 0;
-        } else if (delta >= 0) {
-            bq->requested -= (size_t) delta;
-            delta = 0;
-        }
-    }
-
-    bq->missing -= delta;
+    write_index_changed(bq, old, account);
 }
 
 void pa_memblockq_flush_write(pa_memblockq *bq) {
-    int64_t old, delta;
+    int64_t old;
     pa_assert(bq);
 
     pa_memblockq_silence(bq);
@@ -651,22 +652,11 @@ void pa_memblockq_flush_write(pa_memblockq *bq) {
     bq->write_index = bq->read_index;
 
     pa_memblockq_prebuf_force(bq);
-
-    delta = bq->write_index - old;
-
-    if (delta >= (int64_t) bq->requested) {
-        delta -= (int64_t) bq->requested;
-        bq->requested = 0;
-    } else if (delta >= 0) {
-        bq->requested -= (size_t) delta;
-        delta = 0;
-    }
-
-    bq->missing -= delta;
+    write_index_changed(bq, old, TRUE);
 }
 
 void pa_memblockq_flush_read(pa_memblockq *bq) {
-    int64_t old, delta;
+    int64_t old;
     pa_assert(bq);
 
     pa_memblockq_silence(bq);
@@ -675,9 +665,7 @@ void pa_memblockq_flush_read(pa_memblockq *bq) {
     bq->read_index = bq->write_index;
 
     pa_memblockq_prebuf_force(bq);
-
-    delta = bq->read_index - old;
-    bq->missing += delta;
+    read_index_changed(bq, old);
 }
 
 size_t pa_memblockq_get_tlength(pa_memblockq *bq) {
@@ -774,8 +762,11 @@ size_t pa_memblockq_pop_missing(pa_memblockq *bq) {
         return 0;
 
     l = (size_t) bq->missing;
+
+    bq->requested += bq->missing;
     bq->missing = 0;
-    bq->requested += l;
+
+    /* pa_log("sent %lli: request counter is at %lli", (long long) l, (long long) bq->requested); */
 
     return l;
 }
diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index d49a78e..89f33d0 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -1114,6 +1114,8 @@ static playback_stream* playback_stream_new(
 
     *missing = (uint32_t) pa_memblockq_pop_missing(s->memblockq);
 
+    /* pa_log("missing original: %li", (long int) *missing); */
+
     *ss = s->sink_input->sample_spec;
     *map = s->sink_input->channel_map;
 
@@ -1138,11 +1140,12 @@ static void playback_stream_request_bytes(playback_stream *s) {
 
     m = pa_memblockq_pop_missing(s->memblockq);
 
-    /* pa_log("request_bytes(%lu) (tlength=%lu minreq=%lu length=%lu)", */
+    /* pa_log("request_bytes(%lu) (tlength=%lu minreq=%lu length=%lu really missing=%lli)", */
     /*        (unsigned long) m, */
     /*        pa_memblockq_get_tlength(s->memblockq), */
     /*        pa_memblockq_get_minreq(s->memblockq), */
-    /*        pa_memblockq_get_length(s->memblockq)); */
+    /*        pa_memblockq_get_length(s->memblockq), */
+    /*        (long long) pa_memblockq_get_tlength(s->memblockq) - (long long) pa_memblockq_get_length(s->memblockq)); */
 
     if (m <= 0)
         return;

commit 345547853bcb0825c0afb5b2528a8f1d5339a8ea
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Jan 8 21:51:30 2010 +0100

    core: make sure we always return a valid memblock in sink_input_pop() callbacks
    
    https://bugzilla.redhat.com/show_bug.cgi?id=553607

diff --git a/src/modules/module-combine.c b/src/modules/module-combine.c
index a186c89..62e6267 100644
--- a/src/modules/module-combine.c
+++ b/src/modules/module-combine.c
@@ -890,7 +890,7 @@ static struct output *output_new(struct userdata *u, pa_sink *sink) {
             1,
             0,
             0,
-            NULL);
+            &u->sink->silence);
 
     pa_assert_se(pa_idxset_put(u->outputs, o, NULL) == 0);
     update_description(u);
diff --git a/src/modules/module-ladspa-sink.c b/src/modules/module-ladspa-sink.c
index 994c778..185871b 100644
--- a/src/modules/module-ladspa-sink.c
+++ b/src/modules/module-ladspa-sink.c
@@ -476,6 +476,7 @@ int pa__init(pa_module*m) {
     unsigned long input_port, output_port, p, j, n_control;
     unsigned c;
     pa_bool_t *use_default = NULL;
+    pa_memchunk silence;
 
     pa_assert(m);
 
@@ -514,7 +515,10 @@ int pa__init(pa_module*m) {
     u = pa_xnew0(struct userdata, 1);
     u->module = m;
     m->userdata = u;
-    u->memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, pa_frame_size(&ss), 1, 1, 0, NULL);
+
+    pa_silence_memchunk_get(&m->core->silence_cache, m->core->mempool, &silence, &ss, 0);
+    u->memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, pa_frame_size(&ss), 1, 1, 0, &silence);
+    pa_memblock_unref(silence.memblock);
 
     if (!(e = getenv("LADSPA_PATH")))
         e = LADSPA_PATH;
diff --git a/src/pulsecore/play-memchunk.c b/src/pulsecore/play-memchunk.c
index f127d7a..1a3bd5b 100644
--- a/src/pulsecore/play-memchunk.c
+++ b/src/pulsecore/play-memchunk.c
@@ -47,12 +47,16 @@ int pa_play_memchunk(
 
     pa_memblockq *q;
     int r;
+    pa_memchunk silence;
 
     pa_assert(sink);
     pa_assert(ss);
     pa_assert(chunk);
 
-    q = pa_memblockq_new(0, chunk->length, 0, pa_frame_size(ss), 1, 1, 0, NULL);
+    pa_silence_memchunk_get(&sink->core->silence_cache, sink->core->mempool, &silence, ss, 0);
+    q = pa_memblockq_new(0, chunk->length, 0, pa_frame_size(ss), 1, 1, 0, &silence);
+    pa_memblock_unref(silence.memblock);
+
     pa_assert_se(pa_memblockq_push(q, chunk) >= 0);
 
     if ((r = pa_play_memblockq(sink, ss, map, q, volume, p, sink_input_index)) < 0) {
diff --git a/src/pulsecore/protocol-esound.c b/src/pulsecore/protocol-esound.c
index 2326eb3..a89f327 100644
--- a/src/pulsecore/protocol-esound.c
+++ b/src/pulsecore/protocol-esound.c
@@ -389,6 +389,7 @@ static int esd_proto_stream_play(connection *c, esd_proto_t request, const void
     size_t l;
     pa_sink *sink = NULL;
     pa_sink_input_new_data sdata;
+    pa_memchunk silence;
 
     connection_assert_ref(c);
     pa_assert(data);
@@ -435,6 +436,7 @@ static int esd_proto_stream_play(connection *c, esd_proto_t request, const void
     CHECK_VALIDITY(c->sink_input, "Failed to create sink input.");
 
     l = (size_t) ((double) pa_bytes_per_second(&ss)*PLAYBACK_BUFFER_SECONDS);
+    pa_sink_input_get_silence(c->sink_input, &silence);
     c->input_memblockq = pa_memblockq_new(
             0,
             l,
@@ -443,7 +445,8 @@ static int esd_proto_stream_play(connection *c, esd_proto_t request, const void
             (size_t) -1,
             l/PLAYBACK_BUFFER_FRAGMENTS,
             0,
-            NULL);
+            &silence);
+    pa_memblock_unref(silence.memblock);
     pa_iochannel_socket_set_rcvbuf(c->io, l);
 
     c->sink_input->parent.process_msg = sink_input_process_msg;
diff --git a/src/pulsecore/protocol-simple.c b/src/pulsecore/protocol-simple.c
index a9f7389..fb2e564 100644
--- a/src/pulsecore/protocol-simple.c
+++ b/src/pulsecore/protocol-simple.c
@@ -525,6 +525,7 @@ void pa_simple_protocol_connect(pa_simple_protocol *p, pa_iochannel *io, pa_simp
 
     if (o->playback) {
         pa_sink_input_new_data data;
+        pa_memchunk silence;
         size_t l;
         pa_sink *sink;
 
@@ -559,6 +560,7 @@ void pa_simple_protocol_connect(pa_simple_protocol *p, pa_iochannel *io, pa_simp
         pa_sink_input_set_requested_latency(c->sink_input, DEFAULT_SINK_LATENCY);
 
         l = (size_t) ((double) pa_bytes_per_second(&o->sample_spec)*PLAYBACK_BUFFER_SECONDS);
+        pa_sink_input_get_silence(c->sink_input, &silence);
         c->input_memblockq = pa_memblockq_new(
                 0,
                 l,
@@ -567,7 +569,9 @@ void pa_simple_protocol_connect(pa_simple_protocol *p, pa_iochannel *io, pa_simp
                 (size_t) -1,
                 l/PLAYBACK_BUFFER_FRAGMENTS,
                 0,
-                NULL);
+                &silence);
+        pa_memblock_unref(silence.memblock);
+
         pa_iochannel_socket_set_rcvbuf(io, l);
 
         pa_atomic_store(&c->playback.missing, (int) pa_memblockq_missing(c->input_memblockq));
diff --git a/src/pulsecore/sound-file-stream.c b/src/pulsecore/sound-file-stream.c
index 53674ba..4037dca 100644
--- a/src/pulsecore/sound-file-stream.c
+++ b/src/pulsecore/sound-file-stream.c
@@ -239,6 +239,7 @@ int pa_play_file(
     pa_sink_input_new_data data;
     int fd;
     SF_INFO sfi;
+    pa_memchunk silence;
 
     pa_assert(sink);
     pa_assert(fname);
@@ -320,7 +321,9 @@ int pa_play_file(
     u->sink_input->state_change = sink_input_state_change_cb;
     u->sink_input->userdata = u;
 
-    u->memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, pa_frame_size(&ss), 1, 1, 0, NULL);
+    pa_sink_input_get_silence(u->sink_input, &silence);
+    u->memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, pa_frame_size(&ss), 1, 1, 0, &silence);
+    pa_memblock_unref(silence.memblock);
 
     pa_sink_input_put(u->sink_input);
 

commit 21250ff1a7ad9f3494f1d9f8aeb651c5f01dc942
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Jan 8 22:18:15 2010 +0100

    bluetooth: destruct stream only if it is not already destructed
    
    https://bugzilla.redhat.com/show_bug.cgi?id=551842

diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 19676df..2bbae41 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -823,23 +823,25 @@ static int stop_stream_fd(struct userdata *u) {
 
     pa_assert(u);
     pa_assert(u->rtpoll);
-    pa_assert(u->rtpoll_item);
-    pa_assert(u->stream_fd >= 0);
 
-    pa_rtpoll_item_free(u->rtpoll_item);
-    u->rtpoll_item = NULL;
+    if (u->rtpoll_item) {
+        pa_rtpoll_item_free(u->rtpoll_item);
+        u->rtpoll_item = NULL;
+    }
 
-    memset(msg.buf, 0, BT_SUGGESTED_BUFFER_SIZE);
-    msg.start_req.h.type = BT_REQUEST;
-    msg.start_req.h.name = BT_STOP_STREAM;
-    msg.start_req.h.length = sizeof(msg.start_req);
+    if (u->stream_fd >= 0) {
+        memset(msg.buf, 0, BT_SUGGESTED_BUFFER_SIZE);
+        msg.start_req.h.type = BT_REQUEST;
+        msg.start_req.h.name = BT_STOP_STREAM;
+        msg.start_req.h.length = sizeof(msg.start_req);
 
-    if (service_send(u, &msg.start_req.h) < 0 ||
-        service_expect(u, &msg.rsp, sizeof(msg), BT_STOP_STREAM, sizeof(msg.start_rsp)) < 0)
-        r = -1;
+        if (service_send(u, &msg.start_req.h) < 0 ||
+            service_expect(u, &msg.rsp, sizeof(msg), BT_STOP_STREAM, sizeof(msg.start_rsp)) < 0)
+            r = -1;
 
-    pa_close(u->stream_fd);
-    u->stream_fd = -1;
+        pa_close(u->stream_fd);
+        u->stream_fd = -1;
+    }
 
     if (u->read_smoother) {
         pa_smoother_free(u->read_smoother);

commit e8a2d127249dfb255efd03f7eebbbbe5502e5951
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Jan 8 23:44:42 2010 +0100

    bluetooth: don't hit an assert if latency is queried for a stooped recording stream
    
    https://bugzilla.redhat.com/show_bug.cgi?id=537422

diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 2bbae41..d6868b8 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -972,10 +972,14 @@ static int source_process_msg(pa_msgobject *o, int code, void *data, int64_t off
         case PA_SOURCE_MESSAGE_GET_LATENCY: {
             pa_usec_t wi, ri;
 
-            wi = pa_smoother_get(u->read_smoother, pa_rtclock_now());
-            ri = pa_bytes_to_usec(u->read_index, &u->sample_spec);
+            if (u->read_smoother) {
+                wi = pa_smoother_get(u->read_smoother, pa_rtclock_now());
+                ri = pa_bytes_to_usec(u->read_index, &u->sample_spec);
+
+                *((pa_usec_t*) data) = (wi > ri ? wi - ri : 0) + u->source->thread_info.fixed_latency;
+            } else
+                *((pa_usec_t*) data) = 0;
 
-            *((pa_usec_t*) data) = (wi > ri ? wi - ri : 0) + u->source->thread_info.fixed_latency;
             return 0;
         }
 

commit 7ab9bea29dc9b3174be6b6a3a557c934b8265533
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jan 12 03:01:14 2010 +0100

    client: detect forking in sample cache API, too

diff --git a/src/pulse/scache.c b/src/pulse/scache.c
index 27da688..2a7602f 100644
--- a/src/pulse/scache.c
+++ b/src/pulse/scache.c
@@ -28,15 +28,15 @@
 #include <string.h>
 
 #include <pulse/utf8.h>
+#include <pulse/scache.h>
 
 #include <pulsecore/pstream-util.h>
 #include <pulsecore/macro.h>
 #include <pulsecore/proplist-util.h>
 
+#include "fork-detect.h"
 #include "internal.h"
 
-#include "scache.h"
-
 int pa_stream_connect_upload(pa_stream *s, size_t length) {
     pa_tagstruct *t;
     uint32_t tag;
@@ -45,6 +45,7 @@ int pa_stream_connect_upload(pa_stream *s, size_t length) {
     pa_assert(s);
     pa_assert(PA_REFCNT_VALUE(s) >= 1);
 
+    PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED);
     PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_UNCONNECTED, PA_ERR_BADSTATE);
     PA_CHECK_VALIDITY(s->context, length > 0, PA_ERR_INVALID);
     PA_CHECK_VALIDITY(s->context, length == (size_t) (uint32_t) length, PA_ERR_INVALID);
@@ -85,6 +86,7 @@ int pa_stream_finish_upload(pa_stream *s) {
     pa_assert(s);
     pa_assert(PA_REFCNT_VALUE(s) >= 1);
 
+    PA_CHECK_VALIDITY(s->context, !pa_detect_fork(), PA_ERR_FORKED);
     PA_CHECK_VALIDITY(s->context, s->channel_valid, PA_ERR_BADSTATE);
     PA_CHECK_VALIDITY(s->context, s->context->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
 
@@ -174,6 +176,7 @@ pa_operation *pa_context_play_sample(pa_context *c, const char *name, const char
     pa_assert(c);
     pa_assert(PA_REFCNT_VALUE(c) >= 1);
 
+    PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
     PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
     PA_CHECK_VALIDITY_RETURN_NULL(c, name && *name, PA_ERR_INVALID);
     PA_CHECK_VALIDITY_RETURN_NULL(c, !dev || *dev, PA_ERR_INVALID);
@@ -213,6 +216,7 @@ pa_operation *pa_context_play_sample_with_proplist(pa_context *c, const char *na
     pa_assert(c);
     pa_assert(PA_REFCNT_VALUE(c) >= 1);
 
+    PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
     PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
     PA_CHECK_VALIDITY_RETURN_NULL(c, name && *name, PA_ERR_INVALID);
     PA_CHECK_VALIDITY_RETURN_NULL(c, !dev || *dev, PA_ERR_INVALID);
@@ -255,6 +259,7 @@ pa_operation* pa_context_remove_sample(pa_context *c, const char *name, pa_conte
     pa_assert(c);
     pa_assert(PA_REFCNT_VALUE(c) >= 1);
 
+    PA_CHECK_VALIDITY_RETURN_NULL(c, !pa_detect_fork(), PA_ERR_FORKED);
     PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
     PA_CHECK_VALIDITY_RETURN_NULL(c, name && *name, PA_ERR_INVALID);
 
diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index 0f9e50a..a4f34d9 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -29,6 +29,7 @@
 #include <string.h>
 
 #include <pulse/def.h>
+#include <pulse/stream.h>
 #include <pulse/timeval.h>
 #include <pulse/rtclock.h>
 #include <pulse/xmalloc.h>

commit 9ac12b7048b466effa551bd707648f66df18fe8a
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jan 12 03:01:27 2010 +0100

    client: verify connection state in pa_stream_connect_upload()
    
    Make suer we check the connection state before going on, so that we can
    rely that s->context->pstream is properly initialized.
    
    https://bugzilla.redhat.com/show_bug.cgi?id=539500

diff --git a/src/pulse/scache.c b/src/pulse/scache.c
index 2a7602f..b2169b6 100644
--- a/src/pulse/scache.c
+++ b/src/pulse/scache.c
@@ -49,6 +49,7 @@ int pa_stream_connect_upload(pa_stream *s, size_t length) {
     PA_CHECK_VALIDITY(s->context, s->state == PA_STREAM_UNCONNECTED, PA_ERR_BADSTATE);
     PA_CHECK_VALIDITY(s->context, length > 0, PA_ERR_INVALID);
     PA_CHECK_VALIDITY(s->context, length == (size_t) (uint32_t) length, PA_ERR_INVALID);
+    PA_CHECK_VALIDITY(s->context, s->context->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
 
     if (!(name = pa_proplist_gets(s->proplist, PA_PROP_EVENT_ID)))
         name = pa_proplist_gets(s->proplist, PA_PROP_MEDIA_NAME);

commit 66ddeede9ea02cc97178d42c7be18067519eed8f
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jan 12 23:01:24 2010 +0100

    udev: don't forget to unref devices we are not interested in
    
    https://bugzilla.redhat.com/show_bug.cgi?id=552932

diff --git a/src/modules/module-udev-detect.c b/src/modules/module-udev-detect.c
index f17695b..dfd13ee 100644
--- a/src/modules/module-udev-detect.c
+++ b/src/modules/module-udev-detect.c
@@ -416,8 +416,10 @@ static void monitor_cb(
         goto fail;
     }
 
-    if (!path_get_card_id(udev_device_get_devpath(dev)))
+    if (!path_get_card_id(udev_device_get_devpath(dev))) {
+        udev_device_unref(dev);
         return;
+    }
 
     process_device(u, dev);
     udev_device_unref(dev);

commit 7f7455b1be68d2ff5706ccf85eff1a96f7c43d34
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Jan 12 23:03:04 2010 +0100

    once: make once related variables volatile

diff --git a/src/pulsecore/flist.h b/src/pulsecore/flist.h
index e147486..184e599 100644
--- a/src/pulsecore/flist.h
+++ b/src/pulsecore/flist.h
@@ -45,7 +45,7 @@ void* pa_flist_pop(pa_flist*l);
 
 #define PA_STATIC_FLIST_DECLARE(name, size, free_cb)                    \
     static struct {                                                     \
-        pa_flist *flist;                                                \
+        pa_flist *volatile flist;                                       \
         pa_once once;                                                   \
     } name##_flist = { NULL, PA_ONCE_INIT };                            \
     static void name##_flist_init(void) {                               \
diff --git a/src/pulsecore/once.c b/src/pulsecore/once.c
index 05a3ad2..4e509e0 100644
--- a/src/pulsecore/once.c
+++ b/src/pulsecore/once.c
@@ -29,8 +29,6 @@
 #include "once.h"
 
 pa_bool_t pa_once_begin(pa_once *control) {
-    pa_mutex *m;
-
     pa_assert(control);
 
     if (pa_atomic_load(&control->done))
@@ -43,6 +41,7 @@ pa_bool_t pa_once_begin(pa_once *control) {
      * executed by us. Hence the awkward locking. */
 
     for (;;) {
+        pa_mutex *m;
 
         if ((m = pa_atomic_ptr_load(&control->mutex))) {
 
diff --git a/src/pulsecore/thread-posix.c b/src/pulsecore/thread-posix.c
index fdab270..bc0d6e3 100644
--- a/src/pulsecore/thread-posix.c
+++ b/src/pulsecore/thread-posix.c
@@ -80,11 +80,9 @@ pa_thread* pa_thread_new(pa_thread_func_t thread_func, void *userdata) {
 
     pa_assert(thread_func);
 
-    t = pa_xnew(pa_thread, 1);
+    t = pa_xnew0(pa_thread, 1);
     t->thread_func = thread_func;
     t->userdata = userdata;
-    t->joined = FALSE;
-    pa_atomic_store(&t->running, 0);
 
     if (pthread_create(&t->id, NULL, internal_thread_func, t) < 0) {
         pa_xfree(t);
@@ -135,10 +133,8 @@ pa_thread* pa_thread_self(void) {
     /* This is a foreign thread, let's create a pthread structure to
      * make sure that we can always return a sensible pointer */
 
-    t = pa_xnew(pa_thread, 1);
+    t = pa_xnew0(pa_thread, 1);
     t->id = pthread_self();
-    t->thread_func = NULL;
-    t->userdata = NULL;
     t->joined = TRUE;
     pa_atomic_store(&t->running, 2);
 
diff --git a/src/pulsecore/thread.h b/src/pulsecore/thread.h
index 25eace6..60c1267 100644
--- a/src/pulsecore/thread.h
+++ b/src/pulsecore/thread.h
@@ -55,7 +55,7 @@ void *pa_tls_set(pa_tls *t, void *userdata);
 #define PA_STATIC_TLS_DECLARE(name, free_cb)                            \
     static struct {                                                     \
         pa_once once;                                                   \
-        pa_tls *tls;                                                    \
+        pa_tls *volatile tls;                                           \
     } name##_tls = {                                                    \
         .once = PA_ONCE_INIT,                                           \
         .tls = NULL                                                     \

commit 41ce7cbde9e3f936c134e3982e5587ce831d04de
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Jan 13 17:24:37 2010 +0100

    bluetooth: fix invalid memory access
    
    When an GetProperties() reply arrives after we already deleted the
    device structure for it make sure we don't accidentaly touch the
    invalidated object.
    
    https://bugzilla.redhat.com/show_bug.cgi?id=543205

diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
index 795d510..b2c0429 100644
--- a/src/modules/bluetooth/bluetooth-util.c
+++ b/src/modules/bluetooth/bluetooth-util.c
@@ -342,7 +342,13 @@ static void get_properties_reply(DBusPendingCall *pending, void *userdata) {
 /*                  dbus_message_get_interface(p->message), */
 /*                  dbus_message_get_path(p->message)); */
 
-    d = p->call_data;
+    /* We don't use p->call_data here right-away since the device
+     * might already be invalidated at this point */
+
+    if (!(d = pa_hashmap_get(y->devices, dbus_message_get_path(p->message))))
+        return;
+
+    pa_assert(p->call_data == d);
 
     valid = dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR ? -1 : 1;
 

commit f732c23d9504e16b4412755fc11e692e2f4dbacc
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Jan 13 17:35:04 2010 +0100

    log: add an easy way to disable log rate limiting
    
    Should help with debuggin bugs like:
    
    https://bugzilla.redhat.com/show_bug.cgi?id=554405

diff --git a/src/pulsecore/log.c b/src/pulsecore/log.c
index 8c21ee6..0c5a317 100644
--- a/src/pulsecore/log.c
+++ b/src/pulsecore/log.c
@@ -61,6 +61,7 @@
 #define ENV_LOG_PRINT_LEVEL "PULSE_LOG_LEVEL"
 #define ENV_LOG_BACKTRACE "PULSE_LOG_BACKTRACE"
 #define ENV_LOG_BACKTRACE_SKIP "PULSE_LOG_BACKTRACE_SKIP"
+#define ENV_LOG_NO_RATELIMIT "PULSE_LOG_NO_RATE_LIMIT"
 
 static char *ident = NULL; /* in local charset format */
 static pa_log_target_t target = PA_LOG_STDERR, target_override;
@@ -68,6 +69,7 @@ static pa_bool_t target_override_set = FALSE;
 static pa_log_level_t maximum_level = PA_LOG_ERROR, maximum_level_override = PA_LOG_ERROR;
 static unsigned show_backtrace = 0, show_backtrace_override = 0, skip_backtrace = 0;
 static pa_log_flags_t flags = 0, flags_override = 0;
+static pa_bool_t no_rate_limit = FALSE;
 
 #ifdef HAVE_SYSLOG_H
 static const int level_to_syslog[] = {
@@ -195,54 +197,61 @@ static char* get_backtrace(unsigned show_nframes) {
 #endif
 
 static void init_defaults(void) {
-    const char *e;
+    PA_ONCE_BEGIN {
 
-    if (!ident) {
-        char binary[256];
-        if (pa_get_binary_name(binary, sizeof(binary)))
-            pa_log_set_ident(binary);
-    }
+        const char *e;
 
-    if (getenv(ENV_LOG_SYSLOG)) {
-        target_override = PA_LOG_SYSLOG;
-        target_override_set = TRUE;
-    }
+        if (!ident) {
+            char binary[256];
+            if (pa_get_binary_name(binary, sizeof(binary)))
+                pa_log_set_ident(binary);
+        }
 
-    if ((e = getenv(ENV_LOG_LEVEL))) {
-        maximum_level_override = (pa_log_level_t) atoi(e);
+        if (getenv(ENV_LOG_SYSLOG)) {
+            target_override = PA_LOG_SYSLOG;
+            target_override_set = TRUE;
+        }
 
-        if (maximum_level_override >= PA_LOG_LEVEL_MAX)
-            maximum_level_override = PA_LOG_LEVEL_MAX-1;
-    }
+        if ((e = getenv(ENV_LOG_LEVEL))) {
+            maximum_level_override = (pa_log_level_t) atoi(e);
 
-    if (getenv(ENV_LOG_COLORS))
-        flags_override |= PA_LOG_COLORS;
+            if (maximum_level_override >= PA_LOG_LEVEL_MAX)
+                maximum_level_override = PA_LOG_LEVEL_MAX-1;
+        }
 
-    if (getenv(ENV_LOG_PRINT_TIME))
-        flags_override |= PA_LOG_PRINT_TIME;
+        if (getenv(ENV_LOG_COLORS))
+            flags_override |= PA_LOG_COLORS;
 
-    if (getenv(ENV_LOG_PRINT_FILE))
-        flags_override |= PA_LOG_PRINT_FILE;
+        if (getenv(ENV_LOG_PRINT_TIME))
+            flags_override |= PA_LOG_PRINT_TIME;
 
-    if (getenv(ENV_LOG_PRINT_META))
-        flags_override |= PA_LOG_PRINT_META;
+        if (getenv(ENV_LOG_PRINT_FILE))
+            flags_override |= PA_LOG_PRINT_FILE;
 
-    if (getenv(ENV_LOG_PRINT_LEVEL))
-        flags_override |= PA_LOG_PRINT_LEVEL;
+        if (getenv(ENV_LOG_PRINT_META))
+            flags_override |= PA_LOG_PRINT_META;
 
-    if ((e = getenv(ENV_LOG_BACKTRACE))) {
-        show_backtrace_override = (unsigned) atoi(e);
+        if (getenv(ENV_LOG_PRINT_LEVEL))
+            flags_override |= PA_LOG_PRINT_LEVEL;
 
-        if (show_backtrace_override <= 0)
-            show_backtrace_override = 0;
-    }
+        if ((e = getenv(ENV_LOG_BACKTRACE))) {
+            show_backtrace_override = (unsigned) atoi(e);
 
-    if ((e = getenv(ENV_LOG_BACKTRACE_SKIP))) {
-        skip_backtrace = (unsigned) atoi(e);
+            if (show_backtrace_override <= 0)
+                show_backtrace_override = 0;
+        }
 
-        if (skip_backtrace <= 0)
-            skip_backtrace = 0;
-    }
+        if ((e = getenv(ENV_LOG_BACKTRACE_SKIP))) {
+            skip_backtrace = (unsigned) atoi(e);
+
+            if (skip_backtrace <= 0)
+                skip_backtrace = 0;
+        }
+
+        if (getenv(ENV_LOG_NO_RATELIMIT))
+            no_rate_limit = TRUE;
+
+    } PA_ONCE_END;
 }
 
 void pa_log_levelv_meta(
@@ -268,9 +277,7 @@ void pa_log_levelv_meta(
     pa_assert(level < PA_LOG_LEVEL_MAX);
     pa_assert(format);
 
-    PA_ONCE_BEGIN {
-        init_defaults();
-    } PA_ONCE_END;
+    init_defaults();
 
     _target = target_override_set ? target_override : target;
     _maximum_level = PA_MAX(maximum_level, maximum_level_override);
@@ -428,5 +435,10 @@ pa_bool_t pa_log_ratelimit(void) {
     /* Not more than 10 messages every 5s */
     static PA_DEFINE_RATELIMIT(ratelimit, 5 * PA_USEC_PER_SEC, 10);
 
+    init_defaults();
+
+    if (no_rate_limit)
+        return TRUE;
+
     return pa_ratelimit_test(&ratelimit);
 }

commit ce7bd05ca50c946ea6b3ec9a9dcb9bfd7e90ac5e
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Jan 13 19:41:44 2010 +0100

    udev: make sure we get events only for sound devices

diff --git a/src/modules/module-udev-detect.c b/src/modules/module-udev-detect.c
index dfd13ee..9b1fdb0 100644
--- a/src/modules/module-udev-detect.c
+++ b/src/modules/module-udev-detect.c
@@ -639,6 +639,11 @@ int pa__init(pa_module *m) {
         goto fail;
     }
 
+    if (udev_monitor_filter_add_match_subsystem_devtype(u->monitor, "sound", NULL) < 0) {
+        pa_log("Failed to subscribe to sound devices.");
+        goto fail;
+    }
+
     errno = 0;
     if (udev_monitor_enable_receiving(u->monitor) < 0) {
         pa_log("Failed to enable monitor: %s", pa_cstrerror(errno));

commit c88e4680f050a6ac65335b1d8148287cc4566b00
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Jan 13 20:30:36 2010 +0100

    alsa: ignore volume changes from the hw if we are not on the active console

diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
index ed16c83..690480f 100644
--- a/src/modules/alsa/alsa-sink.c
+++ b/src/modules/alsa/alsa-sink.c
@@ -1103,6 +1103,9 @@ static int mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) {
     if (mask == SND_CTL_EVENT_MASK_REMOVE)
         return 0;
 
+    if (u->sink->suspend_cause & PA_SUSPEND_SESSION)
+        return 0;
+
     if (mask & SND_CTL_EVENT_MASK_VALUE) {
         pa_sink_get_volume(u->sink, TRUE);
         pa_sink_get_mute(u->sink, TRUE);
diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
index 157698e..f8b583e 100644
--- a/src/modules/alsa/alsa-source.c
+++ b/src/modules/alsa/alsa-source.c
@@ -1051,6 +1051,9 @@ static int mixer_callback(snd_mixer_elem_t *elem, unsigned int mask) {
     if (mask == SND_CTL_EVENT_MASK_REMOVE)
         return 0;
 
+    if (u->source->suspend_cause & PA_SUSPEND_SESSION)
+        return 0;
+
     if (mask & SND_CTL_EVENT_MASK_VALUE) {
         pa_source_get_volume(u->source, TRUE);
         pa_source_get_mute(u->source, TRUE);

commit 54025c96a7133964aa1568fe6d2e6c5ad05651bf
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Jan 13 20:31:17 2010 +0100

    cpu: check for CMOV flag before using this intsruction in assembly
    
    http://pulseaudio.org/ticket/776

diff --git a/src/pulsecore/cpu-x86.c b/src/pulsecore/cpu-x86.c
index f194a60..b173072 100644
--- a/src/pulsecore/cpu-x86.c
+++ b/src/pulsecore/cpu-x86.c
@@ -57,6 +57,9 @@ void pa_cpu_init_x86 (void) {
     if (level >= 1) {
         get_cpuid (0x00000001, &eax, &ebx, &ecx, &edx);
 
+        if (edx & (1<<15))
+          flags |= PA_CPU_X86_CMOV;
+
         if (edx & (1<<23))
           flags |= PA_CPU_X86_MMX;
 
@@ -97,7 +100,8 @@ void pa_cpu_init_x86 (void) {
           flags |= PA_CPU_X86_3DNOW;
     }
 
-    pa_log_info ("CPU flags: %s%s%s%s%s%s%s%s%s%s",
+    pa_log_info ("CPU flags: %s%s%s%s%s%s%s%s%s%s%s",
+    (flags & PA_CPU_X86_CMOV) ? "CMOV " : "",
     (flags & PA_CPU_X86_MMX) ? "MMX " : "",
     (flags & PA_CPU_X86_SSE) ? "SSE " : "",
     (flags & PA_CPU_X86_SSE2) ? "SSE2 " : "",
diff --git a/src/pulsecore/cpu-x86.h b/src/pulsecore/cpu-x86.h
index f6484c5..285c203 100644
--- a/src/pulsecore/cpu-x86.h
+++ b/src/pulsecore/cpu-x86.h
@@ -35,12 +35,12 @@ typedef enum pa_cpu_x86_flag {
     PA_CPU_X86_SSE4_1    = (1 << 6),
     PA_CPU_X86_SSE4_2    = (1 << 7),
     PA_CPU_X86_3DNOW     = (1 << 8),
-    PA_CPU_X86_3DNOWEXT  = (1 << 9)
+    PA_CPU_X86_3DNOWEXT  = (1 << 9),
+    PA_CPU_X86_CMOV      = (1 << 10)
 } pa_cpu_x86_flag_t;
 
 void pa_cpu_init_x86 (void);
 
-
 #if defined (__i386__)
 typedef int32_t pa_reg_x86;
 #define PA_REG_a "eax"
diff --git a/src/pulsecore/svolume_mmx.c b/src/pulsecore/svolume_mmx.c
index a011789..0e222cd 100644
--- a/src/pulsecore/svolume_mmx.c
+++ b/src/pulsecore/svolume_mmx.c
@@ -309,7 +309,7 @@ void pa_volume_func_init_mmx (pa_cpu_x86_flag_t flags) {
     run_test ();
 #endif
 
-    if (flags & PA_CPU_X86_MMX) {
+    if ((flags & PA_CPU_X86_MMX) && (flags & PA_CPU_X86_CMOV)) {
         pa_log_info("Initialising MMX optimized functions.");
 
         pa_set_volume_func (PA_SAMPLE_S16NE, (pa_do_volume_func_t) pa_volume_s16ne_mmx);

commit 7f6531d3ce15fd46f75cafa61f9896d2adf6fe94
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Wed Jan 13 23:44:00 2010 +0000

    alsa: cover Input Source:Int Mic
    
    As seen on some HDA chips (e.g. Fujitsu Siemens S6410)
    Refs http://pulseaudio.org/ticket/772

diff --git a/src/modules/alsa/mixer/paths/analog-input.conf.common b/src/modules/alsa/mixer/paths/analog-input.conf.common
index 951e11f..fbdc8fb 100644
--- a/src/modules/alsa/mixer/paths/analog-input.conf.common
+++ b/src/modules/alsa/mixer/paths/analog-input.conf.common
@@ -78,6 +78,10 @@ priority = 19
 name = input-microphone
 priority = 19
 
+[Option Input Source:Int Mic]
+name = input-microphone
+priority = 19
+
 [Option Input Source:Internal Mic]
 name = input-microphone
 priority = 19

commit 7b89c8531c1bde251f2c9f247bf65bd1b20ce9c9
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Wed Jan 13 23:47:21 2010 +0000

    alsa: Cover the 'Int Mic Boost' element.
    
    This is not 100% ideal as we have not way to tie specific boosts to specific
    inputs and this particular chipset (as noted in #772) appears to
    support just that.
    
    For the time being incorporate it into the normal boost logic.
    
    See http://pulseaudio.org/ticket/772

diff --git a/src/modules/alsa/mixer/paths/analog-input-mic.conf.common b/src/modules/alsa/mixer/paths/analog-input-mic.conf.common
index b35e7af..4663305 100644
--- a/src/modules/alsa/mixer/paths/analog-input-mic.conf.common
+++ b/src/modules/alsa/mixer/paths/analog-input-mic.conf.common
@@ -61,3 +61,12 @@ name = input-boost-on
 
 [Option Front Mic Boost:off]
 name = input-boost-off
+
+[Element Int Mic Boost]
+switch = select
+
+[Option Int Mic Boost:on]
+name = input-boost-on
+
+[Option Int Mic Boost:off]
+name = input-boost-off

commit c2ab61c54d8b9d9a18a56ce873debf530c7f6d4a
Author: Daniel T. Chen <crimsun at ubuntu.com>
Date:   Thu Jan 14 00:57:27 2010 +0100

    udev: handle sound cards with both modem and audio properly
    
    http://pulseaudio.org/ticket/681
    https://bugs.launchpad.net/ubuntu/+source/pulseaudio/+bug/394500

diff --git a/src/modules/module-udev-detect.c b/src/modules/module-udev-detect.c
index 9b1fdb0..4019cd8 100644
--- a/src/modules/module-udev-detect.c
+++ b/src/modules/module-udev-detect.c
@@ -103,13 +103,17 @@ static const char *path_get_card_id(const char *path) {
     return e + 5;
 }
 
+static const char *pa_udev_get_sysattr(const char *card_idx, const char *name);
+
 static pa_bool_t is_card_busy(const char *id) {
-    char *card_path = NULL, *pcm_path = NULL, *sub_status = NULL;
+    const char *pcm_class;
+    char *card_path = NULL, *pcm_path = NULL, *sub_status = NULL,
+         *sysfs_path = NULL;
     DIR *card_dir = NULL, *pcm_dir = NULL;
     FILE *status_file = NULL;
     size_t len;
     struct dirent *space = NULL, *de;
-    pa_bool_t busy = FALSE;
+    pa_bool_t busy = FALSE, is_modem = FALSE;
     int r;
 
     pa_assert(id);
@@ -127,6 +131,17 @@ static pa_bool_t is_card_busy(const char *id) {
     len = offsetof(struct dirent, d_name) + fpathconf(dirfd(card_dir), _PC_NAME_MAX) + 1;
     space = pa_xmalloc(len);
 
+    /* Also check /sys/class/sound/card.../pcmC...D6p/pcm_class. An HDA
+     * modem can be used simultaneously with generic playback/record. */
+
+    pa_xfree(sysfs_path);
+    sysfs_path = pa_sprintf_malloc("pcmC%sD6p/pcm_class", id);
+
+    pcm_class = pa_udev_get_sysattr(id, sysfs_path);
+
+    if (pcm_class && pa_streq(pcm_class, "modem"))
+        is_modem = TRUE;
+
     for (;;) {
         de = NULL;
 
@@ -182,7 +197,7 @@ static pa_bool_t is_card_busy(const char *id) {
                 continue;
             }
 
-            if (!pa_streq(line, "closed\n")) {
+            if (!is_modem && !pa_streq(line, "closed\n")) {
                 busy = TRUE;
                 break;
             }
@@ -193,6 +208,7 @@ fail:
 
     pa_xfree(card_path);
     pa_xfree(pcm_path);
+    pa_xfree(sysfs_path);
     pa_xfree(sub_status);
     pa_xfree(space);
 
@@ -594,6 +610,43 @@ static int setup_inotify(struct userdata *u) {
     return 0;
 }
 
+static const char *pa_udev_get_sysattr(const char *card_idx, const char *name) {
+    struct udev *udev;
+    struct udev_device *card = NULL;
+    char *t, *r = NULL;
+    const char *v;
+
+    pa_assert(card_idx);
+    pa_assert(name);
+
+    if (!(udev = udev_new())) {
+        pa_log_error("Failed to allocate udev context.");
+        goto finish;
+    }
+
+    t = pa_sprintf_malloc("%s/class/sound/card%s", udev_get_sys_path(udev), card_idx);
+    card = udev_device_new_from_syspath(udev, t);
+    pa_xfree(t);
+
+    if (!card) {
+        pa_log_error("Failed to get card object.");
+        goto finish;
+    }
+
+    if ((v = udev_device_get_sysattr_value(card, name)) && *v)
+        r = pa_xstrdup(v);
+
+finish:
+
+    if (card)
+        udev_device_unref(card);
+
+    if (udev)
+        udev_unref(udev);
+
+    return r;
+}
+
 int pa__init(pa_module *m) {
     struct userdata *u = NULL;
     pa_modargs *ma;

commit 63ebd054644f009631e25ad68e93a70415cd0c0c
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jan 14 02:06:52 2010 +0100

    udev: rework modem detection a bit
    
    Check every single pcm device of a card whether it is a modem.

diff --git a/src/modules/module-udev-detect.c b/src/modules/module-udev-detect.c
index 4019cd8..7695d3c 100644
--- a/src/modules/module-udev-detect.c
+++ b/src/modules/module-udev-detect.c
@@ -103,17 +103,70 @@ static const char *path_get_card_id(const char *path) {
     return e + 5;
 }
 
-static const char *pa_udev_get_sysattr(const char *card_idx, const char *name);
+static char *card_get_sysattr(const char *card_idx, const char *name) {
+    struct udev *udev;
+    struct udev_device *card = NULL;
+    char *t, *r = NULL;
+    const char *v;
+
+    pa_assert(card_idx);
+    pa_assert(name);
+
+    if (!(udev = udev_new())) {
+        pa_log_error("Failed to allocate udev context.");
+        goto finish;
+    }
+
+    t = pa_sprintf_malloc("%s/class/sound/card%s", udev_get_sys_path(udev), card_idx);
+    card = udev_device_new_from_syspath(udev, t);
+    pa_xfree(t);
+
+    if (!card) {
+        pa_log_error("Failed to get card object.");
+        goto finish;
+    }
+
+    if ((v = udev_device_get_sysattr_value(card, name)) && *v)
+        r = pa_xstrdup(v);
+
+finish:
+
+    if (card)
+        udev_device_unref(card);
+
+    if (udev)
+        udev_unref(udev);
+
+    return r;
+}
+
+static pa_bool_t pcm_is_modem(const char *card_idx, const char *pcm) {
+    char *sysfs_path, *pcm_class;
+    pa_bool_t is_modem;
+
+    pa_assert(card_idx);
+    pa_assert(pcm);
+
+    /* Check /sys/class/sound/card.../pcmC...../pcm_class. An HDA
+     * modem can be used simultaneously with generic
+     * playback/record. */
+
+    sysfs_path = pa_sprintf_malloc("pcmC%sD%s/pcm_class", card_idx, pcm);
+    pcm_class = card_get_sysattr(card_idx, sysfs_path);
+    is_modem = pcm_class && pa_streq(pcm_class, "modem");
+    pa_xfree(pcm_class);
+    pa_xfree(sysfs_path);
+
+    return is_modem;
+}
 
 static pa_bool_t is_card_busy(const char *id) {
-    const char *pcm_class;
-    char *card_path = NULL, *pcm_path = NULL, *sub_status = NULL,
-         *sysfs_path = NULL;
+    char *card_path = NULL, *pcm_path = NULL, *sub_status = NULL;
     DIR *card_dir = NULL, *pcm_dir = NULL;
     FILE *status_file = NULL;
     size_t len;
     struct dirent *space = NULL, *de;
-    pa_bool_t busy = FALSE, is_modem = FALSE;
+    pa_bool_t busy = FALSE;
     int r;
 
     pa_assert(id);
@@ -131,17 +184,6 @@ static pa_bool_t is_card_busy(const char *id) {
     len = offsetof(struct dirent, d_name) + fpathconf(dirfd(card_dir), _PC_NAME_MAX) + 1;
     space = pa_xmalloc(len);
 
-    /* Also check /sys/class/sound/card.../pcmC...D6p/pcm_class. An HDA
-     * modem can be used simultaneously with generic playback/record. */
-
-    pa_xfree(sysfs_path);
-    sysfs_path = pa_sprintf_malloc("pcmC%sD6p/pcm_class", id);
-
-    pcm_class = pa_udev_get_sysattr(id, sysfs_path);
-
-    if (pcm_class && pa_streq(pcm_class, "modem"))
-        is_modem = TRUE;
-
     for (;;) {
         de = NULL;
 
@@ -156,6 +198,9 @@ static pa_bool_t is_card_busy(const char *id) {
         if (!pa_startswith(de->d_name, "pcm"))
             continue;
 
+        if (pcm_is_modem(id, de->d_name + 3))
+            continue;
+
         pa_xfree(pcm_path);
         pcm_path = pa_sprintf_malloc("%s/%s", card_path, de->d_name);
 
@@ -197,7 +242,7 @@ static pa_bool_t is_card_busy(const char *id) {
                 continue;
             }
 
-            if (!is_modem && !pa_streq(line, "closed\n")) {
+            if (!pa_streq(line, "closed\n")) {
                 busy = TRUE;
                 break;
             }
@@ -208,7 +253,6 @@ fail:
 
     pa_xfree(card_path);
     pa_xfree(pcm_path);
-    pa_xfree(sysfs_path);
     pa_xfree(sub_status);
     pa_xfree(space);
 
@@ -610,43 +654,6 @@ static int setup_inotify(struct userdata *u) {
     return 0;
 }
 
-static const char *pa_udev_get_sysattr(const char *card_idx, const char *name) {
-    struct udev *udev;
-    struct udev_device *card = NULL;
-    char *t, *r = NULL;
-    const char *v;
-
-    pa_assert(card_idx);
-    pa_assert(name);
-
-    if (!(udev = udev_new())) {
-        pa_log_error("Failed to allocate udev context.");
-        goto finish;
-    }
-
-    t = pa_sprintf_malloc("%s/class/sound/card%s", udev_get_sys_path(udev), card_idx);
-    card = udev_device_new_from_syspath(udev, t);
-    pa_xfree(t);
-
-    if (!card) {
-        pa_log_error("Failed to get card object.");
-        goto finish;
-    }
-
-    if ((v = udev_device_get_sysattr_value(card, name)) && *v)
-        r = pa_xstrdup(v);
-
-finish:
-
-    if (card)
-        udev_device_unref(card);
-
-    if (udev)
-        udev_unref(udev);
-
-    return r;
-}
-
 int pa__init(pa_module *m) {
     struct userdata *u = NULL;
     pa_modargs *ma;

commit 4315f277bcdb89d2e17c7bf9bd5ac0c2b9b3aa6e
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jan 14 02:53:50 2010 +0100

    alsa: cover bass boost mixer element
    
    http://pulseaudio.org/ticket/740

diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index 8b13239..8bbd1f5 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -1713,6 +1713,8 @@ static int option_verify(pa_alsa_option *o) {
         { "input-boost-off",           N_("No Boost") },
         { "output-amplifier-on",       N_("Amplifier") },
         { "output-amplifier-off",      N_("No Amplifier") },
+        { "output-bass-boost-on",      N_("Bass Boost") },
+        { "output-bass-boost-off",     N_("No Bass Boost") },
         { "output-speaker",            N_("Speaker") },
         { "output-headphones",         N_("Headphones") }
     };
diff --git a/src/modules/alsa/mixer/paths/analog-output.conf.common b/src/modules/alsa/mixer/paths/analog-output.conf.common
index fd7f0cf..6131da5 100644
--- a/src/modules/alsa/mixer/paths/analog-output.conf.common
+++ b/src/modules/alsa/mixer/paths/analog-output.conf.common
@@ -110,6 +110,17 @@ priority = 10
 name = output-amplifier-off
 priority = 0
 
+[Element Bass Boost]
+switch = select
+
+[Option Bass Boost:on]
+name = output-bass-boost-on
+priority = 0
+
+[Option Bass Boost:off]
+name = output-bass-boost-off
+priority = 10
+
 ;;; 'Analog Output'
 
 [Element Analog Output]

commit 544fa0b7dbc5ba5684f2a4dac7dbc7eebb74afc6
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jan 14 20:31:00 2010 +0100

    udev: use ID_MODEL_ENC instead of ID_MODEL if it is set
    
    That way we should be able to make use of the nicer USB strings the USB
    hw provides.
    
    Fixes the issues pointed out in:
    
    https://tango.0pointer.de/pipermail/pulseaudio-discuss/2010-January/006248.html

diff --git a/src/modules/udev-util.c b/src/modules/udev-util.c
index cc82446..eee5409 100644
--- a/src/modules/udev-util.c
+++ b/src/modules/udev-util.c
@@ -58,6 +58,112 @@ static int read_id(struct udev_device *d, const char *n) {
     return u;
 }
 
+static int dehex(char x) {
+    if (x >= '0' && x <= '9')
+        return x - '0';
+
+    if (x >= 'A' && x <= 'F')
+        return x - 'A';
+
+    if (x >= 'a' && x <= 'f')
+        return x - 'a';
+
+    return -1;
+}
+
+static void proplist_sets_unescape(pa_proplist *p, const char *prop, const char *s) {
+    const char *f;
+    char *t, *r;
+    int c;
+
+    enum {
+        TEXT,
+        BACKSLASH,
+        EX,
+        FIRST
+    } state = TEXT;
+
+    /* The resulting string is definitely shorter than the source string */
+    r = pa_xnew(char, strlen(s)+1);
+
+    for (f = s, t = r; *f; f++) {
+
+        switch (state) {
+
+            case TEXT:
+                if (*f == '\\')
+                    state = BACKSLASH;
+                else
+                    *(t++) = *f;
+                break;
+
+            case BACKSLASH:
+                if (*f == 'x')
+                    state = EX;
+                else {
+                    *(t++) = '\\';
+                    *(t++) = *f;
+                    state = TEXT;
+                }
+                break;
+
+            case EX:
+                c = dehex(*f);
+
+                if (c < 0) {
+                    *(t++) = '\\';
+                    *(t++) = 'x';
+                    *(t++) = *f;
+                    state = TEXT;
+                } else
+                    state = FIRST;
+
+                break;
+
+            case FIRST: {
+                int d = dehex(*f);
+
+                if (d < 0) {
+                    *(t++) = '\\';
+                    *(t++) = 'x';
+                    *(t++) = *(f-1);
+                    *(t++) = *f;
+                } else
+                    *(t++) = (char) (c << 4) | d;
+
+                state = TEXT;
+                break;
+            }
+        }
+    }
+
+    switch (state) {
+
+        case TEXT:
+            break;
+
+        case BACKSLASH:
+            *(t++) = '\\';
+            break;
+
+        case EX:
+            *(t++) = '\\';
+            *(t++) = 'x';
+            break;
+
+        case FIRST:
+            *(t++) = '\\';
+            *(t++) = 'x';
+            *(t++) = *(f-1);
+            break;
+    }
+
+    *t = 0;
+
+    pa_proplist_sets(p, prop, r);
+    pa_xfree(r);
+}
+
 int pa_udev_get_info(int card_idx, pa_proplist *p) {
     int r = -1;
     struct udev *udev;
@@ -107,6 +213,8 @@ int pa_udev_get_info(int card_idx, pa_proplist *p) {
     if (!pa_proplist_contains(p, PA_PROP_DEVICE_VENDOR_NAME)) {
         if ((v = udev_device_get_property_value(card, "ID_VENDOR_FROM_DATABASE")) && *v)
             pa_proplist_sets(p, PA_PROP_DEVICE_VENDOR_NAME, v);
+        else if ((v = udev_device_get_property_value(card, "ID_VENDOR_ENC")) && *v)
+            proplist_sets_unescape(p, PA_PROP_DEVICE_VENDOR_NAME, v);
         else if ((v = udev_device_get_property_value(card, "ID_VENDOR")) && *v)
             pa_proplist_sets(p, PA_PROP_DEVICE_VENDOR_NAME, v);
     }
@@ -118,6 +226,8 @@ int pa_udev_get_info(int card_idx, pa_proplist *p) {
     if (!pa_proplist_contains(p, PA_PROP_DEVICE_PRODUCT_NAME)) {
         if ((v = udev_device_get_property_value(card, "ID_MODEL_FROM_DATABASE")) && *v)
             pa_proplist_sets(p, PA_PROP_DEVICE_PRODUCT_NAME, v);
+        else if ((v = udev_device_get_property_value(card, "ID_MODEL_ENC")) && *v)
+            proplist_sets_unescape(p, PA_PROP_DEVICE_PRODUCT_NAME, v);
         else if ((v = udev_device_get_property_value(card, "ID_MODEL")) && *v)
             pa_proplist_sets(p, PA_PROP_DEVICE_PRODUCT_NAME, v);
     }

commit fb55798a3eb73b4c00225232408b766f74533409
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Jan 15 01:25:21 2010 +0100

    pacat: allow configuration of latency in msec

diff --git a/man/pacat.1.xml.in b/man/pacat.1.xml.in
index 68a3a12..2e27450 100644
--- a/man/pacat.1.xml.in
+++ b/man/pacat.1.xml.in
@@ -21,18 +21,22 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
 USA.
 -->
 
-<manpage name="pacat" section="1" desc="Play back or record raw audio streams on a PulseAudio sound server">
+<manpage name="pacat" section="1" desc="Play back or record raw or encoded audio streams on a PulseAudio sound server">
 
   <synopsis>
+    <cmd>paplay [<arg>options</arg>] [<arg>FILE</arg>]</cmd>
+    <cmd>parecord [<arg>options</arg>] [<arg>FILE</arg>]</cmd>
     <cmd>pacat [<arg>options</arg>] [<arg>FILE</arg>]</cmd>
     <cmd>parec [<arg>options</arg>] [<arg>FILE</arg>]</cmd>
-    <cmd>paplay <opt>--help</opt></cmd>
-    <cmd>paplay <opt>--version</opt></cmd>
+    <cmd>pamon [<arg>options</arg>] [<arg>FILE</arg>]</cmd>
+    <cmd>pacat <opt>--help</opt></cmd>
+    <cmd>pacat <opt>--version</opt></cmd>
   </synopsis>
 
   <description>
     <p><file>pacat</file> is a simple tool for playing back or
-    capturing raw audio files on a PulseAudio sound server.</p>
+    capturing raw or encoded audio files on a PulseAudio sound
+    server.</p>
   </description>
 
   <options>
@@ -52,13 +56,13 @@ USA.
     <option>
       <p><opt>-r | --record</opt></p>
 
-      <optdesc><p>Capture raw audio data and write it to the specified file or to STDOUT if none is specified. If the tool is called under the name <file>parec</file> this is the default.</p></optdesc>
+      <optdesc><p>Capture audio data and write it to the specified file or to STDOUT if none is specified. If the tool is called under the name <file>parec</file> this is the default.</p></optdesc>
     </option>
 
     <option>
       <p><opt>-p | --playback</opt></p>
 
-      <optdesc><p>Read raw audio data from the specified file or STDIN if none is specified, and play it back. If the tool is called under the name <file>pacat</file> this is the default.</p></optdesc>
+      <optdesc><p>Read audio data from the specified file or STDIN if none is specified, and play it back. If the tool is called under the name <file>pacat</file> this is the default.</p></optdesc>
     </option>
 
     <option>
@@ -108,14 +112,17 @@ USA.
 
       <optdesc><p>Capture or play back audio with the specified sample
       format. Specify one of <opt>u8</opt>, <opt>s16le</opt>,
-      <opt>s16be</opt>, <opt>s32le</opt>,
-      <opt>s32be</opt>, <opt>float32le</opt>, <opt>float32be</opt>,
-      <opt>ulaw</opt>, <opt>alaw</opt>. Depending on the endianess of
-      the CPU the
-      formats <opt>s16ne</opt>, <opt>s16re</opt>, <opt>s32ne</opt>, <opt>s32re</opt>,
-      <opt>float32ne</opt>, <opt>float32re</opt> (for native,
-      resp. reverse endian) are available as aliases. Defaults to
-      s16ne.</p></optdesc>
+      <opt>s16be</opt>, <opt>s32le</opt>, <opt>s32be</opt>,
+      <opt>float32le</opt>, <opt>float32be</opt>, <opt>ulaw</opt>,
+      <opt>alaw</opt>, <opt>s32le</opt>, <opt>s32be</opt>,
+      <opt>s24le</opt>, <opt>s24be</opt>, <opt>s24-32le</opt>,
+      <opt>s24-32be</opt>. Depending on the endianess of the CPU the
+      formats <opt>s16ne</opt>, <opt>s16re</opt>, <opt>s32ne</opt>,
+      <opt>s32re</opt>, <opt>float32ne</opt>, <opt>float32re</opt>,
+      <opt>s32ne</opt>, <opt>s32re</opt>, <opt>s24ne</opt>,
+      <opt>s24re</opt>, <opt>s24-32ne</opt>, <opt>s24-32re</opt> (for
+      native, resp. reverse endian) are available as aliases. Defaults
+      to s16ne.</p></optdesc>
     </option>
 
     <option>
@@ -170,6 +177,65 @@ USA.
       <optdesc><p>Never remap channels. Instead of mapping channels by their name this will match them solely by their index/order.</p></optdesc>
     </option>
 
+    <option>
+      <p><opt>--latency</opt><arg>=BYTES</arg></p>
+      <optdesc><p>Explicitly configure the latency, with a time
+      specified in bytes in the selected sample format. If left out
+      the server will pick the latency, usually relatively high for
+      power saving reasons. Use either this option or
+      <opt>--latency-msec</opt>, but not both.</p></optdesc>
+    </option>
+
+    <option>
+      <p><opt>--latency-msec</opt><arg>=MSEC</arg></p>
+      <optdesc><p>Explicitly configure the latency, with a time
+      specified in miliseconds. If left out the server will pick the
+      latency, usually relatively high for power saving reasons. Use
+      either this option or <opt>--latency</opt>, but not
+      both.</p></optdesc>
+    </option>
+
+    <option>
+      <p><opt>--process-time</opt><arg>=BYTES</arg></p>
+      <optdesc><p>Explicitly configure the process time, with a time
+      specified in bytes in the selected sample format. If left out
+      the server will pick the process time. Use either this option or
+      <opt>--process-time-msec</opt>, but not both.</p></optdesc>
+    </option>
+
+    <option>
+      <p><opt>--process-time-msec</opt><arg>=MSEC</arg></p>
+      <optdesc><p>Explicitly configure the process time, with a time
+      specified in miliseconds. If left out the server will pick the
+      process time. Use either this option or <opt>--process-time</opt>,
+      but not both.</p></optdesc>
+    </option>
+
+    <option>
+      <p><opt>--property</opt><arg>=PROPERTY=VALUE</arg></p>
+      <optdesc><p>Attach a property to the client and stream. May be
+      used multiple times</p></optdesc>
+    </option>
+
+    <option>
+      <p><opt>--raw</opt></p>
+      <optdesc><p>Play/record raw audio data. This is the default if
+      this program is invoked as <cmd>pacat</cmd>, <cmd>parec</cmd> or
+      <cmd>pamon</cmd>.</p></optdesc>
+    </option>
+
+    <option>
+      <p><opt>--file-format</opt><arg>[=FFORMAT]</arg></p>
+      <optdesc><p>Play/record encoded audio data in the file format
+      specified. This is the default if this program is invoked as
+      <cmd>paplay</cmd> and <cmd>parecord</cmd>.</p></optdesc>
+    </option>
+
+    <option>
+      <p><opt>--list-file-formats</opt></p>
+      <optdesc><p>List supported file formats.</p></optdesc>
+    </option>
+
   </options>
 
   <section name="Authors">
@@ -178,7 +244,7 @@ USA.
 
   <section name="See also">
     <p>
-      <manref name="pulseaudio" section="1"/>, <manref name="paplay" section="1"/>
+      <manref name="pulseaudio" section="1"/>, <manref name="pactl" section="1"/>
     </p>
   </section>
 
diff --git a/src/utils/pacat.c b/src/utils/pacat.c
index d348c16..1036af6 100644
--- a/src/utils/pacat.c
+++ b/src/utils/pacat.c
@@ -45,6 +45,7 @@
 #include <pulsecore/core-util.h>
 #include <pulsecore/log.h>
 #include <pulsecore/sndfile-util.h>
+#include <pulsecore/core-util.h>
 
 #define TIME_EVENT_USEC 50000
 
@@ -86,6 +87,7 @@ static sf_count_t (*writef_function)(SNDFILE *_sndfile, const void *ptr, sf_coun
 static pa_stream_flags_t flags = 0;
 
 static size_t latency = 0, process_time = 0;
+static int32_t latency_msec = 0, process_time_msec = 0;
 
 static pa_bool_t raw = TRUE;
 static int file_format = -1;
@@ -434,19 +436,25 @@ static void context_state_callback(pa_context *c, void *userdata) {
             buffer_attr.maxlength = (uint32_t) -1;
             buffer_attr.prebuf = (uint32_t) -1;
 
-            if (latency > 0) {
+            if (latency_msec > 0) {
+                buffer_attr.fragsize = buffer_attr.tlength = pa_usec_to_bytes(latency_msec * PA_USEC_PER_MSEC, &sample_spec);
+                flags |= PA_STREAM_ADJUST_LATENCY;
+            } else if (latency > 0) {
                 buffer_attr.fragsize = buffer_attr.tlength = (uint32_t) latency;
-                buffer_attr.minreq = (uint32_t) process_time;
                 flags |= PA_STREAM_ADJUST_LATENCY;
-            } else {
-                buffer_attr.tlength = (uint32_t) -1;
+            } else
+                buffer_attr.fragsize = buffer_attr.tlength = (uint32_t) -1;
+
+            if (process_time_msec > 0) {
+                buffer_attr.minreq = pa_usec_to_bytes(process_time_msec * PA_USEC_PER_MSEC, &sample_spec);
+            } else if (process_time > 0)
+                buffer_attr.minreq = (uint32_t) process_time;
+            else
                 buffer_attr.minreq = (uint32_t) -1;
-                buffer_attr.fragsize = (uint32_t) -1;
-            }
 
             if (mode == PLAYBACK) {
                 pa_cvolume cv;
-                if (pa_stream_connect_playback(stream, device, latency > 0 ? &buffer_attr : NULL, flags, volume_is_set ? pa_cvolume_set(&cv, sample_spec.channels, volume) : NULL, NULL) < 0) {
+                if (pa_stream_connect_playback(stream, device, &buffer_attr, flags, volume_is_set ? pa_cvolume_set(&cv, sample_spec.channels, volume) : NULL, NULL) < 0) {
                     pa_log(_("pa_stream_connect_playback() failed: %s"), pa_strerror(pa_context_errno(c)));
                     goto fail;
                 }
@@ -634,9 +642,11 @@ static void help(const char *argv0) {
              "      --no-remap                        Map channels by index instead of name.\n"
              "      --latency=BYTES                   Request the specified latency in bytes.\n"
              "      --process-time=BYTES              Request the specified process time per request in bytes.\n"
+             "      --latency-msec=MSEC               Request the specified latency in msec.\n"
+             "      --process-time-msec=MSEC          Request the specified process time per request in msec.\n"
              "      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
              "      --raw                             Record/play raw PCM data.\n"
-             "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+             "      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
              "      --list-file-formats               List available file formats.\n")
            , argv0);
 }
@@ -659,7 +669,9 @@ enum {
     ARG_RAW,
     ARG_PROPERTY,
     ARG_FILE_FORMAT,
-    ARG_LIST_FILE_FORMATS
+    ARG_LIST_FILE_FORMATS,
+    ARG_LATENCY_MSEC,
+    ARG_PROCESS_TIME_MSEC
 };
 
 int main(int argc, char *argv[]) {
@@ -695,6 +707,8 @@ int main(int argc, char *argv[]) {
         {"raw",          0, NULL, ARG_RAW},
         {"file-format",  2, NULL, ARG_FILE_FORMAT},
         {"list-file-formats", 0, NULL, ARG_LIST_FILE_FORMATS},
+        {"latency-msec", 1, NULL, ARG_LATENCY_MSEC},
+        {"process-time-msec", 1, NULL, ARG_PROCESS_TIME_MSEC},
         {NULL,           0, NULL, 0}
     };
 
@@ -854,6 +868,20 @@ int main(int argc, char *argv[]) {
                 }
                 break;
 
+            case ARG_LATENCY_MSEC:
+                if (((latency_msec = (int32_t) atoi(optarg))) <= 0) {
+                    pa_log(_("Invalid latency specification '%s'"), optarg);
+                    goto quit;
+                }
+                break;
+
+            case ARG_PROCESS_TIME_MSEC:
+                if (((process_time_msec = (int32_t) atoi(optarg))) <= 0) {
+                    pa_log(_("Invalid process time specification '%s'"), optarg);
+                    goto quit;
+                }
+                break;
+
             case ARG_PROPERTY: {
                 char *t;
 

commit d09099526220fb87ac8c4f6bae298b23744d0dae
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Jan 15 01:25:42 2010 +0100

    client: implement $PULSE_LATENCY_MSEC
    
    This allows easy overriding of a clients latency setting for debugging
    purposes.
    
    http://pulseaudio.org/ticket/753

diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index a4f34d9..5e42ab2 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -39,6 +39,7 @@
 #include <pulsecore/hashmap.h>
 #include <pulsecore/macro.h>
 #include <pulsecore/core-rtclock.h>
+#include <pulsecore/core-util.h>
 
 #include "fork-detect.h"
 #include "internal.h"
@@ -855,10 +856,28 @@ static void create_stream_complete(pa_stream *s) {
     check_smoother_status(s, TRUE, FALSE, FALSE);
 }
 
-static void automatic_buffer_attr(pa_stream *s, pa_buffer_attr *attr, const pa_sample_spec *ss) {
+static void patch_buffer_attr(pa_stream *s, pa_buffer_attr *attr, pa_stream_flags_t *flags) {
+    const char *e;
+
     pa_assert(s);
     pa_assert(attr);
-    pa_assert(ss);
+
+    if ((e = getenv("PULSE_LATENCY_MSEC"))) {
+        uint32_t ms;
+
+        if (pa_atou(e, &ms) < 0 || ms <= 0)
+            pa_log_debug("Failed to parse $PULSE_LATENCY_MSEC: %s", e);
+        else {
+            attr->maxlength = (uint32_t) -1;
+            attr->tlength = pa_usec_to_bytes(ms * PA_USEC_PER_MSEC, &s->sample_spec);
+            attr->minreq = (uint32_t) -1;
+            attr->prebuf = (uint32_t) -1;
+            attr->fragsize = attr->tlength;
+        }
+
+        if (flags)
+            *flags |= PA_STREAM_ADJUST_LATENCY;
+    }
 
     if (s->context->version >= 13)
         return;
@@ -873,7 +892,7 @@ static void automatic_buffer_attr(pa_stream *s, pa_buffer_attr *attr, const pa_s
         attr->maxlength = 4*1024*1024; /* 4MB is the maximum queue length PulseAudio <= 0.9.9 supported. */
 
     if (attr->tlength == (uint32_t) -1)
-        attr->tlength = (uint32_t) pa_usec_to_bytes(250*PA_USEC_PER_MSEC, ss); /* 250ms of buffering */
+        attr->tlength = (uint32_t) pa_usec_to_bytes(250*PA_USEC_PER_MSEC, &s->sample_spec); /* 250ms of buffering */
 
     if (attr->minreq == (uint32_t) -1)
         attr->minreq = (attr->tlength)/5; /* Ask for more data when there are only 200ms left in the playback buffer */
@@ -1065,15 +1084,16 @@ static int create_stream(
     pa_stream_ref(s);
 
     s->direction = direction;
-    s->flags = flags;
-    s->corked = !!(flags & PA_STREAM_START_CORKED);
 
     if (sync_stream)
         s->syncid = sync_stream->syncid;
 
     if (attr)
         s->buffer_attr = *attr;
-    automatic_buffer_attr(s, &s->buffer_attr, &s->sample_spec);
+    patch_buffer_attr(s, &s->buffer_attr, &flags);
+
+    s->flags = flags;
+    s->corked = !!(flags & PA_STREAM_START_CORKED);
 
     if (flags & PA_STREAM_INTERPOLATE_TIMING) {
         pa_usec_t x;
@@ -2420,6 +2440,7 @@ pa_operation* pa_stream_set_buffer_attr(pa_stream *s, const pa_buffer_attr *attr
     pa_operation *o;
     pa_tagstruct *t;
     uint32_t tag;
+    pa_buffer_attr copy;
 
     pa_assert(s);
     pa_assert(PA_REFCNT_VALUE(s) >= 1);
@@ -2443,6 +2464,10 @@ pa_operation* pa_stream_set_buffer_attr(pa_stream *s, const pa_buffer_attr *attr
             &tag);
     pa_tagstruct_putu32(t, s->channel);
 
+    copy = *attr;
+    patch_buffer_attr(s, &copy, NULL);
+    attr = &copy;
+
     pa_tagstruct_putu32(t, attr->maxlength);
 
     if (s->direction == PA_STREAM_PLAYBACK)

commit 66cfa72eb4fd4669dfd7e465c07c41bb7e6d3d85
Author: Lennart Poettering <lennart at poettering.net>
Date:   Mon Jan 18 01:33:04 2010 +0100

    native: rework handling of seeks that depend on variables the client does not know anything about
    
    All seeks/flushes that depend on the playback buffer read pointer cannot
    be accounted for properly in the client since it does not know the
    actual read pointer. Due to that the clients do not account for it at
    all. We need do the same on the server side. And we did, but a little
    bit too extreme. While we properly have not applied the changes to the
    "request" counter we still do have to apply it to the "missing" counter.
    This patch fixes that.

diff --git a/src/modules/module-combine.c b/src/modules/module-combine.c
index 62e6267..cffb901 100644
--- a/src/modules/module-combine.c
+++ b/src/modules/module-combine.c
@@ -562,7 +562,7 @@ static int sink_input_process_msg(pa_msgobject *obj, int code, void *data, int64
             if (PA_SINK_IS_OPENED(o->sink_input->sink->thread_info.state))
                 pa_memblockq_push_align(o->memblockq, chunk);
             else
-                pa_memblockq_flush_write(o->memblockq);
+                pa_memblockq_flush_write(o->memblockq, TRUE);
 
             return 0;
     }
@@ -982,7 +982,7 @@ static void output_disable(struct output *o) {
     o->sink_input = NULL;
 
     /* Finally, drop all queued data */
-    pa_memblockq_flush_write(o->memblockq);
+    pa_memblockq_flush_write(o->memblockq, TRUE);
     pa_asyncmsgq_flush(o->inq, FALSE);
     pa_asyncmsgq_flush(o->outq, FALSE);
 }
diff --git a/src/modules/module-loopback.c b/src/modules/module-loopback.c
index bb0182b..15ef96e 100644
--- a/src/modules/module-loopback.c
+++ b/src/modules/module-loopback.c
@@ -430,7 +430,7 @@ static int sink_input_process_msg_cb(pa_msgobject *obj, int code, void *data, in
             if (PA_SINK_IS_OPENED(u->sink_input->sink->thread_info.state))
                 pa_memblockq_push_align(u->memblockq, chunk);
             else
-                pa_memblockq_flush_write(u->memblockq);
+                pa_memblockq_flush_write(u->memblockq, TRUE);
 
             update_min_memblockq_length(u);
 
@@ -457,7 +457,7 @@ static int sink_input_process_msg_cb(pa_msgobject *obj, int code, void *data, in
             if (PA_SINK_IS_OPENED(u->sink_input->sink->thread_info.state))
                 pa_memblockq_seek(u->memblockq, -offset, PA_SEEK_RELATIVE, TRUE);
             else
-                pa_memblockq_flush_write(u->memblockq);
+                pa_memblockq_flush_write(u->memblockq, TRUE);
 
             u->recv_counter -= offset;
 
diff --git a/src/pulse/stream.c b/src/pulse/stream.c
index 5e42ab2..36514e0 100644
--- a/src/pulse/stream.c
+++ b/src/pulse/stream.c
@@ -2154,6 +2154,11 @@ pa_operation* pa_stream_flush(pa_stream *s, pa_stream_success_cb_t cb, void *use
          * index, but the read index might jump. */
         invalidate_indexes(s, TRUE, FALSE);
 
+    /* Note that we do not update requested_bytes here. This is
+     * because we cannot really know how data actually was dropped
+     * from the write index due to this. This 'error' will be applied
+     * by both client and server and hence we should be fine. */
+
     return o;
 }
 
diff --git a/src/pulsecore/memblockq.c b/src/pulsecore/memblockq.c
index 4641801..2b063fa 100644
--- a/src/pulsecore/memblockq.c
+++ b/src/pulsecore/memblockq.c
@@ -254,6 +254,8 @@ static void write_index_changed(pa_memblockq *bq, int64_t old_write_index, pa_bo
 
     if (account)
         bq->requested -= delta;
+    else
+        bq->missing -= delta;
 
     /* pa_log("pushed/seeked %lli: requested counter at %lli, account=%i", (long long) delta, (long long) bq->requested, account); */
 }
@@ -642,7 +644,7 @@ void pa_memblockq_seek(pa_memblockq *bq, int64_t offset, pa_seek_mode_t seek, pa
     write_index_changed(bq, old, account);
 }
 
-void pa_memblockq_flush_write(pa_memblockq *bq) {
+void pa_memblockq_flush_write(pa_memblockq *bq, pa_bool_t account) {
     int64_t old;
     pa_assert(bq);
 
@@ -652,7 +654,7 @@ void pa_memblockq_flush_write(pa_memblockq *bq) {
     bq->write_index = bq->read_index;
 
     pa_memblockq_prebuf_force(bq);
-    write_index_changed(bq, old, TRUE);
+    write_index_changed(bq, old, account);
 }
 
 void pa_memblockq_flush_read(pa_memblockq *bq) {
diff --git a/src/pulsecore/memblockq.h b/src/pulsecore/memblockq.h
index b756549..402c6cd 100644
--- a/src/pulsecore/memblockq.h
+++ b/src/pulsecore/memblockq.h
@@ -118,7 +118,7 @@ size_t pa_memblockq_pop_missing(pa_memblockq *bq);
 int pa_memblockq_splice(pa_memblockq *bq, pa_memblockq *source);
 
 /* Set the queue to silence, set write index to read index */
-void pa_memblockq_flush_write(pa_memblockq *bq);
+void pa_memblockq_flush_write(pa_memblockq *bq, pa_bool_t account);
 
 /* Set the queue to silence, set write read index to write index*/
 void pa_memblockq_flush_read(pa_memblockq *bq);
diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index 89f33d0..ff24612 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -1326,6 +1326,10 @@ static void handle_seek(playback_stream *s, int64_t indexw) {
     playback_stream_request_bytes(s);
 }
 
+static void flush_write_no_account(pa_memblockq *q) {
+    pa_memblockq_flush_write(q, FALSE);
+}
+
 /* Called from thread context */
 static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int64_t offset, pa_memchunk *chunk) {
     pa_sink_input *i = PA_SINK_INPUT(o);
@@ -1387,7 +1391,7 @@ static int sink_input_process_msg(pa_msgobject *o, int code, void *userdata, int
 
             switch  (code) {
                 case SINK_INPUT_MESSAGE_FLUSH:
-                    func = pa_memblockq_flush_write;
+                    func = flush_write_no_account;
                     break;
 
                 case SINK_INPUT_MESSAGE_PREBUF_FORCE:
diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index e73999d..395110b 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -842,7 +842,7 @@ void pa_sink_input_process_rewind(pa_sink_input *i, size_t nbytes /* in sink sam
         /* We were asked to drop all buffered data, and rerequest new
          * data from implementor the next time push() is called */
 
-        pa_memblockq_flush_write(i->thread_info.render_memblockq);
+        pa_memblockq_flush_write(i->thread_info.render_memblockq, TRUE);
 
     } else if (i->thread_info.rewrite_nbytes > 0) {
         size_t max_rewrite, amount;

commit ff2091b2c47dfa7d9f1397627b72d9366b60f566
Author: Colin Guthrie <cguthrie at mandriva.org>
Date:   Thu Feb 11 23:33:19 2010 +0000

    pacat: Don't use any buffer attr if we don't set any latency/process time params

diff --git a/src/utils/pacat.c b/src/utils/pacat.c
index 1036af6..68280e5 100644
--- a/src/utils/pacat.c
+++ b/src/utils/pacat.c
@@ -409,6 +409,7 @@ static void context_state_callback(pa_context *c, void *userdata) {
 
         case PA_CONTEXT_READY: {
             pa_buffer_attr buffer_attr;
+            const pa_buffer_attr *active_buffer_attr = NULL;
 
             pa_assert(c);
             pa_assert(!stream);
@@ -438,29 +439,33 @@ static void context_state_callback(pa_context *c, void *userdata) {
 
             if (latency_msec > 0) {
                 buffer_attr.fragsize = buffer_attr.tlength = pa_usec_to_bytes(latency_msec * PA_USEC_PER_MSEC, &sample_spec);
+                active_buffer_attr = &buffer_attr;
                 flags |= PA_STREAM_ADJUST_LATENCY;
             } else if (latency > 0) {
                 buffer_attr.fragsize = buffer_attr.tlength = (uint32_t) latency;
+                active_buffer_attr = &buffer_attr;
                 flags |= PA_STREAM_ADJUST_LATENCY;
             } else
                 buffer_attr.fragsize = buffer_attr.tlength = (uint32_t) -1;
 
             if (process_time_msec > 0) {
                 buffer_attr.minreq = pa_usec_to_bytes(process_time_msec * PA_USEC_PER_MSEC, &sample_spec);
-            } else if (process_time > 0)
+                active_buffer_attr = &buffer_attr;
+            } else if (process_time > 0) {
                 buffer_attr.minreq = (uint32_t) process_time;
-            else
+                active_buffer_attr = &buffer_attr;
+            } else
                 buffer_attr.minreq = (uint32_t) -1;
 
             if (mode == PLAYBACK) {
                 pa_cvolume cv;
-                if (pa_stream_connect_playback(stream, device, &buffer_attr, flags, volume_is_set ? pa_cvolume_set(&cv, sample_spec.channels, volume) : NULL, NULL) < 0) {
+                if (pa_stream_connect_playback(stream, device, active_buffer_attr, flags, volume_is_set ? pa_cvolume_set(&cv, sample_spec.channels, volume) : NULL, NULL) < 0) {
                     pa_log(_("pa_stream_connect_playback() failed: %s"), pa_strerror(pa_context_errno(c)));
                     goto fail;
                 }
 
             } else {
-                if (pa_stream_connect_record(stream, device, latency > 0 ? &buffer_attr : NULL, flags) < 0) {
+                if (pa_stream_connect_record(stream, device, active_buffer_attr, flags) < 0) {
                     pa_log(_("pa_stream_connect_record() failed: %s"), pa_strerror(pa_context_errno(c)));
                     goto fail;
                 }

commit 9ffb4f38152d3815fede49b0af7a835682a4f0bf
Author: Pierre-Louis Bossart <pierre-louis.bossart at intel.com>
Date:   Thu Feb 11 15:44:11 2010 -0600

    virutal-sink: boilerplate virtual sink to add PCM processing

diff --git a/src/modules/module-virtual-sink.c b/src/modules/module-virtual-sink.c
new file mode 100644
index 0000000..4fe4867
--- /dev/null
+++ b/src/modules/module-virtual-sink.c
@@ -0,0 +1,635 @@
+/***
+    This file is part of PulseAudio.
+
+    Copyright 2010 Intel Corporation
+    Contributor: Pierre-Louis Bossart <pierre-louis.bossart at intel.com>
+
+    PulseAudio is free software; you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as published
+    by the Free Software Foundation; either version 2.1 of the License,
+    or (at your option) any later version.
+
+    PulseAudio is distributed in the hope that it will be useful, but
+    WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+    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.
+***/
+
+/* TODO: Some plugins cause latency, and some even report it by using a control
+   out port. We don't currently use the latency information. */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <pulse/xmalloc.h>
+#include <pulse/i18n.h>
+
+#include <pulsecore/core-error.h>
+#include <pulsecore/namereg.h>
+#include <pulsecore/sink.h>
+#include <pulsecore/module.h>
+#include <pulsecore/core-util.h>
+#include <pulsecore/modargs.h>
+#include <pulsecore/log.h>
+#include <pulsecore/thread.h>
+#include <pulsecore/thread-mq.h>
+#include <pulsecore/rtpoll.h>
+#include <pulsecore/sample-util.h>
+#include <pulsecore/ltdl-helper.h>
+
+#include "module-virtual-sink-symdef.h"
+
+PA_MODULE_AUTHOR("Pierre-Louis Bossart");
+PA_MODULE_DESCRIPTION(_("Virtual sink"));
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
+PA_MODULE_USAGE(
+        _("sink_name=<name for the sink> "
+          "sink_properties=<properties for the sink> "
+          "master=<name of sink to filter> "
+          "format=<sample format> "
+          "rate=<sample rate> "
+          "channels=<number of channels> "
+          "channel_map=<channel map> "
+        ));
+
+#define MEMBLOCKQ_MAXLENGTH (16*1024*1024)
+
+struct userdata {
+    pa_module *module;
+
+    pa_sink *sink;
+    pa_sink_input *sink_input;
+
+    pa_memblockq *memblockq;
+
+    pa_bool_t auto_desc;
+    unsigned channels;
+};
+
+static const char* const valid_modargs[] = {
+    "sink_name",
+    "sink_properties",
+    "master",
+    "format",
+    "rate",
+    "channels",
+    "channel_map",
+    NULL
+};
+
+/* Called from I/O thread context */
+static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
+    struct userdata *u = PA_SINK(o)->userdata;
+
+    switch (code) {
+
+        case PA_SINK_MESSAGE_GET_LATENCY:
+
+            /* The sink is _put() before the sink input is, so let's
+             * make sure we don't access it in that time. Also, the
+             * sink input is first shut down, the sink second. */
+            if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
+                !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state)) {
+                *((pa_usec_t*) data) = 0;
+                return 0;
+            }
+
+            *((pa_usec_t*) data) =
+
+                /* Get the latency of the master sink */
+                pa_sink_get_latency_within_thread(u->sink_input->sink) +
+
+                /* Add the latency internal to our sink input on top */
+                pa_bytes_to_usec(pa_memblockq_get_length(u->sink_input->thread_info.render_memblockq), &u->sink_input->sink->sample_spec);
+
+            return 0;
+    }
+
+    return pa_sink_process_msg(o, code, data, offset, chunk);
+}
+
+/* Called from main context */
+static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state) {
+    struct userdata *u;
+
+    pa_sink_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    if (!PA_SINK_IS_LINKED(state) ||
+        !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
+        return 0;
+
+    pa_sink_input_cork(u->sink_input, state == PA_SINK_SUSPENDED);
+    return 0;
+}
+
+/* Called from I/O thread context */
+static void sink_request_rewind_cb(pa_sink *s) {
+    struct userdata *u;
+
+    pa_sink_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
+        !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state))
+        return;
+
+    /* Just hand this one over to the master sink */
+    pa_sink_input_request_rewind(u->sink_input, s->thread_info.rewind_nbytes + pa_memblockq_get_length(u->memblockq), TRUE, FALSE, FALSE);
+}
+
+/* Called from I/O thread context */
+static void sink_update_requested_latency_cb(pa_sink *s) {
+    struct userdata *u;
+
+    pa_sink_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    if (!PA_SINK_IS_LINKED(u->sink->thread_info.state) ||
+        !PA_SINK_INPUT_IS_LINKED(u->sink_input->thread_info.state))
+        return;
+
+    /* Just hand this one over to the master sink */
+    pa_sink_input_set_requested_latency_within_thread(
+            u->sink_input,
+            pa_sink_get_requested_latency_within_thread(s));
+}
+
+/* Called from main context */
+static void sink_set_volume_cb(pa_sink *s) {
+    struct userdata *u;
+
+    pa_sink_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    if (!PA_SINK_IS_LINKED(pa_sink_get_state(s)) ||
+        !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
+        return;
+
+    pa_sink_input_set_volume(u->sink_input, &s->real_volume, s->save_volume, TRUE);
+}
+
+/* Called from main context */
+static void sink_set_mute_cb(pa_sink *s) {
+    struct userdata *u;
+
+    pa_sink_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    if (!PA_SINK_IS_LINKED(pa_sink_get_state(s)) ||
+        !PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(u->sink_input)))
+        return;
+
+    pa_sink_input_set_mute(u->sink_input, s->muted, s->save_muted);
+}
+
+/* Called from I/O thread context */
+static int sink_input_pop_cb(pa_sink_input *i, size_t nbytes, pa_memchunk *chunk) {
+    struct userdata *u;
+    float *src, *dst;
+    size_t fs;
+    unsigned n, c;
+    pa_memchunk tchunk;
+    pa_usec_t curr_latency;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert(chunk);
+    pa_assert_se(u = i->userdata);
+
+    /* Hmm, process any rewind request that might be queued up */
+    pa_sink_process_rewind(u->sink, 0);
+
+    while (pa_memblockq_peek(u->memblockq, &tchunk) < 0) {
+        pa_memchunk nchunk;
+
+        pa_sink_render(u->sink, nbytes, &nchunk);
+        pa_memblockq_push(u->memblockq, &nchunk);
+        pa_memblock_unref(nchunk.memblock);
+    }
+
+    tchunk.length = PA_MIN(nbytes, tchunk.length);
+    pa_assert(tchunk.length > 0);
+
+    fs = pa_frame_size(&i->sample_spec);
+    //n = (unsigned) (PA_MIN(tchunk.length, u->block_size) / fs);
+    n = (unsigned) (tchunk.length / fs);
+
+    pa_assert(n > 0);
+
+    chunk->index = 0;
+    chunk->length = n*fs;
+    chunk->memblock = pa_memblock_new(i->sink->core->mempool, chunk->length);
+    pa_assert( chunk->memblock );
+
+    pa_memblockq_drop(u->memblockq, chunk->length);
+
+    src = (float*) ((uint8_t*) pa_memblock_acquire(tchunk.memblock) + tchunk.index);
+    dst = (float*) pa_memblock_acquire(chunk->memblock);
+
+    /* PUT YOUR CODE HERE TO DO SOMETHING WITH THE DATA */
+    /* example, copy input to output */
+    for (c = 0; c < u->channels; c++) {
+        pa_sample_clamp(PA_SAMPLE_FLOAT32NE,dst+c, u->channels*sizeof(float),
+                        src+c, u->channels*sizeof(float),n);
+    }
+    pa_memblock_release(tchunk.memblock);
+    pa_memblock_release(chunk->memblock);
+
+    pa_memblock_unref(tchunk.memblock);
+
+
+    curr_latency =
+        /* Get the latency of the master sink */
+        pa_sink_get_latency_within_thread(i->sink) +
+
+        /* Add the latency internal to our sink input on top */
+        pa_bytes_to_usec(pa_memblockq_get_length(i->thread_info.render_memblockq), &i->sink->sample_spec);
+
+    /* FIXME: do something with the latency */
+
+
+    return 0;
+}
+
+/* Called from I/O thread context */
+static void sink_input_process_rewind_cb(pa_sink_input *i, size_t nbytes) {
+    struct userdata *u;
+    size_t amount = 0;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    if (u->sink->thread_info.rewind_nbytes > 0) {
+        size_t max_rewrite;
+
+        max_rewrite = nbytes + pa_memblockq_get_length(u->memblockq);
+        amount = PA_MIN(u->sink->thread_info.rewind_nbytes, max_rewrite);
+        u->sink->thread_info.rewind_nbytes = 0;
+
+        if (amount > 0) {
+            pa_memblockq_seek(u->memblockq, - (int64_t) amount, PA_SEEK_RELATIVE, TRUE);
+            /* NEED TO RESET POST-PROCESSING HERE */
+
+        }
+    }
+
+    pa_sink_process_rewind(u->sink, amount);
+    pa_memblockq_rewind(u->memblockq, nbytes);
+}
+
+/* Called from I/O thread context */
+static void sink_input_update_max_rewind_cb(pa_sink_input *i, size_t nbytes) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    pa_memblockq_set_maxrewind(u->memblockq, nbytes);
+    pa_sink_set_max_rewind_within_thread(u->sink, nbytes);
+}
+
+/* Called from I/O thread context */
+static void sink_input_update_max_request_cb(pa_sink_input *i, size_t nbytes) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    pa_sink_set_max_request_within_thread(u->sink, nbytes);
+}
+
+/* Called from I/O thread context */
+static void sink_input_update_sink_latency_range_cb(pa_sink_input *i) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
+}
+
+/* Called from I/O thread context */
+static void sink_input_update_sink_fixed_latency_cb(pa_sink_input *i) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
+}
+
+/* Called from I/O thread context */
+static void sink_input_detach_cb(pa_sink_input *i) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    pa_sink_detach_within_thread(u->sink);
+
+    pa_sink_set_rtpoll(u->sink, NULL);
+}
+
+/* Called from I/O thread context */
+static void sink_input_attach_cb(pa_sink_input *i) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    pa_sink_set_rtpoll(u->sink, i->sink->thread_info.rtpoll);
+    pa_sink_set_latency_range_within_thread(u->sink, i->sink->thread_info.min_latency, i->sink->thread_info.max_latency);
+    pa_sink_set_fixed_latency_within_thread(u->sink, i->sink->thread_info.fixed_latency);
+    pa_sink_set_max_request_within_thread(u->sink, pa_sink_input_get_max_request(i));
+    pa_sink_set_max_rewind_within_thread(u->sink, pa_sink_input_get_max_rewind(i));
+
+    pa_sink_attach_within_thread(u->sink);
+}
+
+/* Called from main context */
+static void sink_input_kill_cb(pa_sink_input *i) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    /* The order here matters! We first kill the sink input, followed
+     * by the sink. That means the sink callbacks must be protected
+     * against an unconnected sink input! */
+    pa_sink_input_unlink(u->sink_input);
+    pa_sink_unlink(u->sink);
+
+    pa_sink_input_unref(u->sink_input);
+    u->sink_input = NULL;
+
+    pa_sink_unref(u->sink);
+    u->sink = NULL;
+
+    pa_module_unload_request(u->module, TRUE);
+}
+
+/* Called from IO thread context */
+static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t state) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    /* If we are added for the first time, ask for a rewinding so that
+     * we are heard right-away. */
+    if (PA_SINK_INPUT_IS_LINKED(state) &&
+        i->thread_info.state == PA_SINK_INPUT_INIT) {
+        pa_log_debug("Requesting rewind due to state change.");
+        pa_sink_input_request_rewind(i, 0, FALSE, TRUE, TRUE);
+    }
+}
+
+/* Called from main context */
+static pa_bool_t sink_input_may_move_to_cb(pa_sink_input *i, pa_sink *dest) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    return u->sink != dest;
+}
+
+/* Called from main context */
+static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    if (dest) {
+        pa_sink_set_asyncmsgq(u->sink, dest->asyncmsgq);
+        pa_sink_update_flags(u->sink, PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY, dest->flags);
+    } else
+        pa_sink_set_asyncmsgq(u->sink, NULL);
+
+    if (u->auto_desc && dest) {
+        const char *z;
+        pa_proplist *pl;
+
+        pl = pa_proplist_new();
+        z = pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_DESCRIPTION);
+        pa_proplist_setf(pl, PA_PROP_DEVICE_DESCRIPTION, "Virtual Sink %s on %s",
+                         pa_proplist_gets(u->sink->proplist, "device.vsink.name"), z ? z : dest->name);
+
+        pa_sink_update_proplist(u->sink, PA_UPDATE_REPLACE, pl);
+        pa_proplist_free(pl);
+    }
+}
+
+/* Called from main context */
+static void sink_input_volume_changed_cb(pa_sink_input *i) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    pa_sink_volume_changed(u->sink, &i->volume);
+}
+
+/* Called from main context */
+static void sink_input_mute_changed_cb(pa_sink_input *i) {
+    struct userdata *u;
+
+    pa_sink_input_assert_ref(i);
+    pa_assert_se(u = i->userdata);
+
+    pa_sink_mute_changed(u->sink, i->muted);
+}
+
+int pa__init(pa_module*m) {
+    struct userdata *u;
+    pa_sample_spec ss;
+    pa_channel_map map;
+    pa_modargs *ma;
+    pa_sink *master=NULL;
+    pa_sink_input_new_data sink_input_data;
+    pa_sink_new_data sink_data;
+    pa_bool_t *use_default = NULL;
+
+    pa_assert(m);
+
+    if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
+        pa_log("Failed to parse module arguments.");
+        goto fail;
+    }
+
+    if (!(master = pa_namereg_get(m->core, pa_modargs_get_value(ma, "master", NULL), PA_NAMEREG_SINK))) {
+        pa_log("Master sink not found");
+        goto fail;
+    }
+
+    pa_assert(master);
+
+    ss = master->sample_spec;
+    ss.format = PA_SAMPLE_FLOAT32;
+    map = master->channel_map;
+    if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0) {
+        pa_log("Invalid sample format specification or channel map");
+        goto fail;
+    }
+
+
+    u = pa_xnew0(struct userdata, 1);
+    if (!u) {
+        pa_log("Failed to alloc userdata");
+        goto fail;
+    }
+    u->module = m;
+    m->userdata = u;
+    u->memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, pa_frame_size(&ss), 1, 1, 0, NULL);
+    if (!u->memblockq) {
+        pa_log("Failed to create sink memblockq.");
+        goto fail;
+    }
+    u->channels = ss.channels;
+
+    /* Create sink */
+    pa_sink_new_data_init(&sink_data);
+    sink_data.driver = __FILE__;
+    sink_data.module = m;
+    if (!(sink_data.name = pa_xstrdup(pa_modargs_get_value(ma, "sink_name", NULL))))
+        sink_data.name = pa_sprintf_malloc("%s.vsink", master->name);
+    pa_sink_new_data_set_sample_spec(&sink_data, &ss);
+    pa_sink_new_data_set_channel_map(&sink_data, &map);
+    pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_MASTER_DEVICE, master->name);
+    pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_CLASS, "filter");
+    pa_proplist_sets(sink_data.proplist, "device.vsink.name", sink_data.name);
+
+    if (pa_modargs_get_proplist(ma, "sink_properties", sink_data.proplist, PA_UPDATE_REPLACE) < 0) {
+        pa_log("Invalid properties");
+        pa_sink_new_data_done(&sink_data);
+        goto fail;
+    }
+
+    if ((u->auto_desc = !pa_proplist_contains(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION))) {
+        const char *z;
+
+        z = pa_proplist_gets(master->proplist, PA_PROP_DEVICE_DESCRIPTION);
+        pa_proplist_setf(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Virtual Sink %s on %s", sink_data.name, z ? z : master->name);
+    }
+
+    u->sink = pa_sink_new(m->core, &sink_data,
+                          PA_SINK_HW_MUTE_CTRL|PA_SINK_HW_VOLUME_CTRL|PA_SINK_DECIBEL_VOLUME|
+                          (master->flags & (PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY)));
+    pa_sink_new_data_done(&sink_data);
+
+    if (!u->sink) {
+        pa_log("Failed to create sink.");
+        goto fail;
+    }
+
+    u->sink->parent.process_msg = sink_process_msg_cb;
+    u->sink->set_state = sink_set_state_cb;
+    u->sink->update_requested_latency = sink_update_requested_latency_cb;
+    u->sink->request_rewind = sink_request_rewind_cb;
+    u->sink->set_volume = sink_set_volume_cb;
+    u->sink->set_mute = sink_set_mute_cb;
+    u->sink->userdata = u;
+
+    pa_sink_set_asyncmsgq(u->sink, master->asyncmsgq);
+
+    /* Create sink input */
+    pa_sink_input_new_data_init(&sink_input_data);
+    sink_input_data.driver = __FILE__;
+    sink_input_data.module = m;
+    sink_input_data.sink = master;
+    pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_NAME, "Virtual Sink Stream");
+    pa_proplist_sets(sink_input_data.proplist, PA_PROP_MEDIA_ROLE, "filter");
+    pa_sink_input_new_data_set_sample_spec(&sink_input_data, &ss);
+    pa_sink_input_new_data_set_channel_map(&sink_input_data, &map);
+
+    pa_sink_input_new(&u->sink_input, m->core, &sink_input_data);
+    pa_sink_input_new_data_done(&sink_input_data);
+
+    if (!u->sink_input)
+        goto fail;
+
+    u->sink_input->pop = sink_input_pop_cb;
+    u->sink_input->process_rewind = sink_input_process_rewind_cb;
+    u->sink_input->update_max_rewind = sink_input_update_max_rewind_cb;
+    u->sink_input->update_max_request = sink_input_update_max_request_cb;
+    u->sink_input->update_sink_latency_range = sink_input_update_sink_latency_range_cb;
+    u->sink_input->update_sink_fixed_latency = sink_input_update_sink_fixed_latency_cb;
+    u->sink_input->kill = sink_input_kill_cb;
+    u->sink_input->attach = sink_input_attach_cb;
+    u->sink_input->detach = sink_input_detach_cb;
+    u->sink_input->state_change = sink_input_state_change_cb;
+    u->sink_input->may_move_to = sink_input_may_move_to_cb;
+    u->sink_input->moving = sink_input_moving_cb;
+    u->sink_input->volume_changed = sink_input_volume_changed_cb;
+    u->sink_input->mute_changed = sink_input_mute_changed_cb;
+    u->sink_input->userdata = u;
+
+    //pa_sink_input_set_requested_latency(u->sink_input, 5000);
+
+    pa_sink_put(u->sink);
+    pa_sink_input_put(u->sink_input);
+
+    pa_modargs_free(ma);
+
+    pa_xfree(use_default);
+
+    return 0;
+
+ fail:
+    if (ma)
+        pa_modargs_free(ma);
+
+    pa_xfree(use_default);
+
+    pa__done(m);
+
+    return -1;
+}
+
+int pa__get_n_used(pa_module *m) {
+    struct userdata *u;
+
+    pa_assert(m);
+    pa_assert_se(u = m->userdata);
+
+    return pa_sink_linked_by(u->sink);
+}
+
+void pa__done(pa_module*m) {
+    struct userdata *u;
+
+    pa_assert(m);
+
+    if (!(u = m->userdata))
+        return;
+
+    /* See comments in sink_input_kill_cb() above regarding
+     * destruction order! */
+
+    if (u->sink_input)
+        pa_sink_input_unlink(u->sink_input);
+
+    if (u->sink)
+        pa_sink_unlink(u->sink);
+
+    if (u->sink_input)
+        pa_sink_input_unref(u->sink_input);
+
+    if (u->sink)
+        pa_sink_unref(u->sink);
+
+
+    if (u->memblockq)
+        pa_memblockq_free(u->memblockq);
+
+
+    pa_xfree(u);
+}

commit bffd21f5663282cfb23a02fa9036a54debf6365e
Author: Pierre-Louis Bossart <pierre-louis.bossart at intel.com>
Date:   Thu Feb 11 15:45:35 2010 -0600

    virtual-source: boilerplate virtual source for PCM processing on inputs

diff --git a/src/modules/module-virtual-source.c b/src/modules/module-virtual-source.c
new file mode 100644
index 0000000..fdf89b0
--- /dev/null
+++ b/src/modules/module-virtual-source.c
@@ -0,0 +1,771 @@
+/***
+    This file is part of PulseAudio.
+
+    Copyright 2010 Intel Corporation
+    Contributor: Pierre-Louis Bossart <pierre-louis.bossart at intel.com>
+
+    PulseAudio is free software; you can redistribute it and/or modify
+    it under the terms of the GNU Lesser General Public License as published
+    by the Free Software Foundation; either version 2.1 of the License,
+    or (at your option) any later version.
+
+    PulseAudio is distributed in the hope that it will be useful, but
+    WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+    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 <math.h>
+
+#include <pulse/xmalloc.h>
+#include <pulse/i18n.h>
+
+#include <pulsecore/macro.h>
+#include <pulsecore/core-error.h>
+#include <pulsecore/namereg.h>
+#include <pulsecore/sink.h>
+#include <pulsecore/module.h>
+#include <pulsecore/core-rtclock.h>
+#include <pulsecore/core-util.h>
+#include <pulsecore/core-error.h>
+#include <pulsecore/modargs.h>
+#include <pulsecore/log.h>
+#include <pulsecore/thread.h>
+#include <pulsecore/thread-mq.h>
+#include <pulsecore/rtpoll.h>
+#include <pulsecore/sample-util.h>
+#include <pulsecore/ltdl-helper.h>
+
+#include "module-virtual-source-symdef.h"
+
+PA_MODULE_AUTHOR("Pierre-Louis Bossart");
+PA_MODULE_DESCRIPTION("Virtual source");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
+PA_MODULE_USAGE(
+        _("source_name=<name for the source> "
+          "source_properties=<properties for the source> "
+          "master=<name of source to filter> "
+          "uplink_sink=<name> (optional)"
+          "format=<sample format> "
+          "rate=<sample rate> "
+          "channels=<number of channels> "
+          "channel_map=<channel map> "
+        ));
+
+#define MEMBLOCKQ_MAXLENGTH (16*1024*1024)
+#define BLOCK_USEC 1000 /* FIXME */
+
+struct userdata {
+    pa_module *module;
+
+    pa_source *source;
+    pa_source_output *source_output;
+
+    pa_memblockq *memblockq;
+
+    pa_bool_t auto_desc;
+    unsigned channels;
+
+    /* optional fields for uplink sink */
+    pa_sink *sink;
+    pa_usec_t block_usec;
+    pa_memblockq *sink_memblockq;
+
+};
+
+static const char* const valid_modargs[] = {
+    "source_name",
+    "source_properties",
+    "master",
+    "uplink_sink",
+    "format",
+    "rate",
+    "channels",
+    "channel_map",
+    NULL
+};
+
+/* Called from I/O thread context */
+static int sink_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
+
+    switch (code) {
+
+        case PA_SINK_MESSAGE_GET_LATENCY:
+
+            /* there's no real latency here */
+            *((pa_usec_t*) data) = 0;
+
+            return 0;
+    }
+
+    return pa_sink_process_msg(o, code, data, offset, chunk);
+}
+
+/* Called from main context */
+static int sink_set_state_cb(pa_sink *s, pa_sink_state_t state) {
+    struct userdata *u;
+
+    pa_sink_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    if (!PA_SINK_IS_LINKED(state)) {
+        return 0;
+    }
+
+    if (state == PA_SINK_RUNNING) {
+        /* need to wake-up source if it was suspended */
+        pa_source_suspend(u->source, FALSE, PA_SUSPEND_ALL);
+
+        /* FIXME: if there's no client connected, the source will suspend
+           and playback will be stuck. You'd want to prevent the source from
+           sleeping when the uplink sink is active; even if the audio is
+           discarded at least the app isn't stuck */
+
+    } else {
+        /* nothing to do, if the sink becomes idle or suspended let
+           module-suspend-idle handle the sources later */
+    }
+
+    return 0;
+}
+
+static void sink_update_requested_latency_cb(pa_sink *s) {
+    struct userdata *u;
+
+    pa_sink_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    /* FIXME: there's no latency support */
+
+}
+
+
+/* Called from I/O thread context */
+static void sink_request_rewind_cb(pa_sink *s) {
+    struct userdata *u;
+
+    pa_sink_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    /* Do nothing */
+    pa_sink_process_rewind(u->sink, 0);
+
+}
+
+/* Called from I/O thread context */
+static int source_process_msg_cb(pa_msgobject *o, int code, void *data, int64_t offset, pa_memchunk *chunk) {
+    struct userdata *u = PA_SOURCE(o)->userdata;
+
+    switch (code) {
+
+        case PA_SOURCE_MESSAGE_GET_LATENCY:
+
+            /* The source is _put() before the source output is, so let's
+             * make sure we don't access it in that time. Also, the
+             * source output is first shut down, the source second. */
+            if (!PA_SOURCE_IS_LINKED(u->source->thread_info.state) ||
+                !PA_SOURCE_OUTPUT_IS_LINKED(u->source_output->thread_info.state)) {
+                *((pa_usec_t*) data) = 0;
+                return 0;
+            }
+
+            *((pa_usec_t*) data) =
+
+                /* Get the latency of the master source */
+                pa_source_get_latency_within_thread(u->source_output->source) +
+
+                /* Add the latency internal to our source output on top */
+                /* FIXME, no idea what I am doing here */
+                pa_bytes_to_usec(pa_memblockq_get_length(u->source_output->thread_info.delay_memblockq), &u->source_output->source->sample_spec);
+
+            return 0;
+    }
+
+    return pa_source_process_msg(o, code, data, offset, chunk);
+}
+
+/* Called from main context */
+static int source_set_state_cb(pa_source *s, pa_source_state_t state) {
+    struct userdata *u;
+
+    pa_source_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    if (!PA_SOURCE_IS_LINKED(state) ||
+        !PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(u->source_output)))
+        return 0;
+
+    pa_source_output_cork(u->source_output, state == PA_SOURCE_SUSPENDED);
+    return 0;
+}
+
+/* Called from I/O thread context */
+static void source_update_requested_latency_cb(pa_source *s) {
+    struct userdata *u;
+
+    pa_source_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    if (!PA_SOURCE_IS_LINKED(u->source->thread_info.state) ||
+        !PA_SOURCE_OUTPUT_IS_LINKED(u->source_output->thread_info.state))
+        return;
+
+    /* Just hand this one over to the master source */
+    pa_source_output_set_requested_latency_within_thread(
+            u->source_output,
+            pa_source_get_requested_latency_within_thread(s));
+}
+
+/* Called from main context */
+static void source_set_volume_cb(pa_source *s) {
+    struct userdata *u;
+
+    pa_source_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    if (!PA_SOURCE_IS_LINKED(pa_source_get_state(s)) ||
+        !PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(u->source_output)))
+        return;
+
+    /* FIXME, no volume control in source_output, set volume at the master */
+    pa_source_set_volume(u->source_output->source, &s->volume, TRUE);
+}
+
+static void source_get_volume_cb(pa_source *s) {
+    struct userdata *u;
+
+    pa_source_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    if (!PA_SOURCE_IS_LINKED(pa_source_get_state(s)) ||
+        !PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(u->source_output)))
+        return;
+
+    /* FIXME, no volume control in source_output, get the info from the master */
+    pa_source_get_volume(u->source_output->source, TRUE);
+
+    if (pa_cvolume_equal(&s->volume,&u->source_output->source->volume))
+        /* no change */
+        return;
+
+    s->volume = u->source_output->source->volume;
+    pa_source_set_soft_volume(s, NULL);
+}
+
+
+/* Called from main context */
+static void source_set_mute_cb(pa_source *s) {
+    struct userdata *u;
+
+    pa_source_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    if (!PA_SOURCE_IS_LINKED(pa_source_get_state(s)) ||
+        !PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(u->source_output)))
+        return;
+
+    /* FIXME, no volume control in source_output, set mute at the master */
+    pa_source_set_mute(u->source_output->source, TRUE, TRUE);
+}
+
+/* Called from main context */
+static void source_get_mute_cb(pa_source *s) {
+    struct userdata *u;
+
+    pa_source_assert_ref(s);
+    pa_assert_se(u = s->userdata);
+
+    if (!PA_SOURCE_IS_LINKED(pa_source_get_state(s)) ||
+        !PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(u->source_output)))
+        return;
+
+    /* FIXME, no volume control in source_output, get the info from the master */
+    pa_source_get_mute(u->source_output->source, TRUE);
+}
+
+/* Called from input thread context */
+static void source_output_push_cb(pa_source_output *o, const pa_memchunk *chunk) {
+    struct userdata *u;
+
+    pa_source_output_assert_ref(o);
+    pa_source_output_assert_io_context(o);
+    pa_assert_se(u = o->userdata);
+
+    if (!PA_SOURCE_OUTPUT_IS_LINKED(pa_source_output_get_state(u->source_output))) {
+        pa_log("push when no link?");
+        return;
+    }
+
+    /* PUT YOUR CODE HERE TO DO SOMETHING WITH THE SOURCE DATA */
+
+    /* if uplink sink exists, pull data from there; simplify by using
+       same length as chunk provided by source */
+    if(u->sink && (pa_sink_get_state(u->sink) == PA_SINK_RUNNING)) {
+        pa_memchunk tchunk;
+        size_t nbytes = chunk->length;
+        pa_mix_info streams[2];
+        pa_memchunk target_chunk;
+        void *target;
+        int ch;
+
+        /* Hmm, process any rewind request that might be queued up */
+        pa_sink_process_rewind(u->sink, 0);
+
+        /* get data from the sink */
+        while (pa_memblockq_peek(u->sink_memblockq, &tchunk) < 0) {
+            pa_memchunk nchunk;
+
+            /* make sure we get nbytes from the sink with render_full,
+               otherwise we cannot mix with the uplink */
+            pa_sink_render_full(u->sink, nbytes, &nchunk);
+            pa_memblockq_push(u->sink_memblockq, &nchunk);
+            pa_memblock_unref(nchunk.memblock);
+        }
+        pa_assert(tchunk.length == chunk->length);
+
+        /* move the read pointer for sink memblockq */
+        pa_memblockq_drop(u->sink_memblockq, tchunk.length);
+
+        /* allocate target chunk */
+        /* this could probably be done in-place, but having chunk as both
+           the input and output creates issues with reference counts */
+        target_chunk.index = 0;
+        target_chunk.length = chunk->length;
+        pa_assert(target_chunk.length == chunk->length);
+
+        target_chunk.memblock = pa_memblock_new(o->source->core->mempool,
+                                                target_chunk.length);
+        pa_assert( target_chunk.memblock );
+
+        /* get target pointer */
+        target = (void*)((uint8_t*)pa_memblock_acquire(target_chunk.memblock)
+                         + target_chunk.index);
+
+        /* set-up mixing structure
+           volume was taken care of in sink and source already */
+        streams[0].chunk = *chunk;
+        for(ch=0;ch<o->sample_spec.channels;ch++)
+            streams[0].volume.values[ch] = PA_VOLUME_NORM; /* FIXME */
+        streams[0].volume.channels = o->sample_spec.channels;
+
+        streams[1].chunk = tchunk;
+        for(ch=0;ch<o->sample_spec.channels;ch++)
+            streams[1].volume.values[ch] = PA_VOLUME_NORM; /* FIXME */
+        streams[1].volume.channels = o->sample_spec.channels;
+
+        /* do mixing */
+        pa_mix(streams,                /* 2 streams to be mixed */
+               2,
+               target,                 /* put result in target chunk */
+               chunk->length,          /* same length as input */
+               (const pa_sample_spec *)&o->sample_spec, /* same sample spec for input and output */
+               NULL,                   /* no volume information */
+               FALSE);                 /* no mute */
+
+        pa_memblock_release(target_chunk.memblock);
+        pa_memblock_unref(tchunk.memblock); /* clean-up */
+
+        /* forward the data to the virtual source */
+        pa_source_post(u->source, &target_chunk);
+
+        pa_memblock_unref(target_chunk.memblock); /* clean-up */
+
+    } else {
+        /* forward the data to the virtual source */
+        pa_source_post(u->source, chunk);
+    }
+
+
+}
+
+/* Called from input thread context */
+static void source_output_process_rewind_cb(pa_source_output *o, size_t nbytes) {
+    struct userdata *u;
+
+    pa_source_output_assert_ref(o);
+    pa_source_output_assert_io_context(o);
+    pa_assert_se(u = o->userdata);
+
+    /* FIXME, no idea what I am doing here */
+#if 0
+    pa_asyncmsgq_post(u->asyncmsgq, PA_MSGOBJECT(u->sink_input), SINK_INPUT_MESSAGE_REWIND, NULL, (int64_t) nbytes, NULL, NULL);
+    u->send_counter -= (int64_t) nbytes;
+#endif
+}
+
+/* Called from output thread context */
+static int source_output_process_msg_cb(pa_msgobject *obj, int code, void *data, int64_t offset, pa_memchunk *chunk) {
+
+    /* FIXME, nothing to do here ? */
+
+    return pa_source_output_process_msg(obj, code, data, offset, chunk);
+}
+
+/* Called from output thread context */
+static void source_output_attach_cb(pa_source_output *o) {
+    struct userdata *u;
+
+    pa_source_output_assert_ref(o);
+    pa_source_output_assert_io_context(o);
+    pa_assert_se(u = o->userdata);
+
+    pa_source_set_rtpoll(u->source, o->source->thread_info.rtpoll);
+    pa_source_set_latency_range_within_thread(u->source, o->source->thread_info.min_latency, o->source->thread_info.max_latency);
+    pa_source_set_fixed_latency_within_thread(u->source, o->source->thread_info.fixed_latency);
+    pa_source_set_max_rewind_within_thread(u->source, pa_source_output_get_max_rewind(o));
+
+    pa_source_attach_within_thread(u->source);
+}
+
+/* Called from output thread context */
+static void source_output_detach_cb(pa_source_output *o) {
+    struct userdata *u;
+
+    pa_source_output_assert_ref(o);
+    pa_source_output_assert_io_context(o);
+    pa_assert_se(u = o->userdata);
+
+    pa_source_detach_within_thread(u->source);
+    pa_source_set_rtpoll(u->source, NULL);
+}
+
+/* Called from output thread context */
+static void source_output_state_change_cb(pa_source_output *o, pa_source_output_state_t state) {
+    struct userdata *u;
+
+    pa_source_output_assert_ref(o);
+    pa_source_output_assert_io_context(o);
+    pa_assert_se(u = o->userdata);
+
+    /* FIXME */
+#if 0
+    if (PA_SOURCE_OUTPUT_IS_LINKED(state) && o->thread_info.state == PA_SOURCE_OUTPUT_INIT) {
+
+        u->skip = pa_usec_to_bytes(PA_CLIP_SUB(pa_source_get_latency_within_thread(o->source),
+                                               u->latency),
+                                   &o->sample_spec);
+
+        pa_log_info("Skipping %lu bytes", (unsigned long) u->skip);
+    }
+#endif
+}
+
+/* Called from main thread */
+static void source_output_kill_cb(pa_source_output *o) {
+    struct userdata *u;
+
+    pa_source_output_assert_ref(o);
+    pa_assert_ctl_context();
+    pa_assert_se(u = o->userdata);
+
+    /* The order here matters! We first kill the source output, followed
+     * by the source. That means the source callbacks must be protected
+     * against an unconnected source output! */
+    pa_source_output_unlink(u->source_output);
+    pa_source_unlink(u->source);
+
+    pa_source_output_unref(u->source_output);
+    u->source_output = NULL;
+
+    pa_source_unref(u->source);
+    u->source = NULL;
+
+    pa_module_unload_request(u->module, TRUE);
+}
+
+/* Called from main thread */
+static pa_bool_t source_output_may_move_to_cb(pa_source_output *o, pa_source *dest) {
+    struct userdata *u;
+
+    pa_source_output_assert_ref(o);
+    pa_assert_ctl_context();
+    pa_assert_se(u = o->userdata);
+
+    /* FIXME */
+    //return dest != u->source_input->source->monitor_source;
+
+    return TRUE;
+}
+
+/* Called from main thread */
+static void source_output_moving_cb(pa_source_output *o, pa_source *dest) {
+    struct userdata *u;
+
+    pa_source_output_assert_ref(o);
+    pa_assert_ctl_context();
+    pa_assert_se(u = o->userdata);
+
+    if (dest) {
+        pa_source_set_asyncmsgq(u->source, dest->asyncmsgq);
+        pa_source_update_flags(u->source, PA_SOURCE_LATENCY|PA_SOURCE_DYNAMIC_LATENCY, dest->flags);
+    } else
+        pa_source_set_asyncmsgq(u->source, NULL);
+
+    if (u->auto_desc && dest) {
+        const char *z;
+        pa_proplist *pl;
+
+        pl = pa_proplist_new();
+        z = pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_DESCRIPTION);
+        pa_proplist_setf(pl, PA_PROP_DEVICE_DESCRIPTION, "Virtual Source %s on %s",
+                         pa_proplist_gets(u->source->proplist, "device.vsource.name"), z ? z : dest->name);
+
+        pa_source_update_proplist(u->source, PA_UPDATE_REPLACE, pl);
+        pa_proplist_free(pl);
+    }
+}
+
+
+int pa__init(pa_module*m) {
+    struct userdata *u;
+    pa_sample_spec ss;
+    pa_channel_map map;
+    pa_modargs *ma;
+    pa_source *master=NULL;
+    pa_source_output_new_data source_output_data;
+    pa_source_new_data source_data;
+    pa_bool_t *use_default = NULL;
+
+    /* optional for uplink_sink */
+    pa_sink_new_data sink_data;
+    size_t nbytes;
+
+    pa_assert(m);
+
+    if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
+        pa_log("Failed to parse module arguments.");
+        goto fail;
+    }
+
+    if (!(master = pa_namereg_get(m->core, pa_modargs_get_value(ma, "master", NULL), PA_NAMEREG_SOURCE))) {
+        pa_log("Master source not found");
+        goto fail;
+    }
+
+    pa_assert(master);
+
+    ss = master->sample_spec;
+    ss.format = PA_SAMPLE_FLOAT32;
+    map = master->channel_map;
+    if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_DEFAULT) < 0) {
+        pa_log("Invalid sample format specification or channel map");
+        goto fail;
+    }
+
+
+    u = pa_xnew0(struct userdata, 1);
+    if (!u) {
+        pa_log("Failed to alloc userdata");
+        goto fail;
+    }
+    u->module = m;
+    m->userdata = u;
+    u->memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, pa_frame_size(&ss), 1, 1, 0, NULL);
+    if (!u->memblockq) {
+        pa_log("Failed to create source memblockq.");
+        goto fail;
+    }
+    u->channels = ss.channels;
+
+    /* Create source */
+    pa_source_new_data_init(&source_data);
+    source_data.driver = __FILE__;
+    source_data.module = m;
+    if (!(source_data.name = pa_xstrdup(pa_modargs_get_value(ma, "source_name", NULL))))
+        source_data.name = pa_sprintf_malloc("%s.vsource", master->name);
+    pa_source_new_data_set_sample_spec(&source_data, &ss);
+    pa_source_new_data_set_channel_map(&source_data, &map);
+    pa_proplist_sets(source_data.proplist, PA_PROP_DEVICE_MASTER_DEVICE, master->name);
+    pa_proplist_sets(source_data.proplist, PA_PROP_DEVICE_CLASS, "filter");
+    pa_proplist_sets(source_data.proplist, "device.vsource.name", source_data.name);
+
+    if (pa_modargs_get_proplist(ma, "source_properties", source_data.proplist, PA_UPDATE_REPLACE) < 0) {
+        pa_log("Invalid properties");
+        pa_source_new_data_done(&source_data);
+        goto fail;
+    }
+
+    if ((u->auto_desc = !pa_proplist_contains(source_data.proplist, PA_PROP_DEVICE_DESCRIPTION))) {
+        const char *z;
+
+        z = pa_proplist_gets(master->proplist, PA_PROP_DEVICE_DESCRIPTION);
+        pa_proplist_setf(source_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Virtual Source %s on %s", source_data.name, z ? z : master->name);
+    }
+
+    u->source = pa_source_new(m->core, &source_data,
+                          PA_SOURCE_HW_MUTE_CTRL|PA_SOURCE_HW_VOLUME_CTRL|PA_SOURCE_DECIBEL_VOLUME|
+                          (master->flags & (PA_SOURCE_LATENCY|PA_SOURCE_DYNAMIC_LATENCY)));
+    pa_source_new_data_done(&source_data);
+
+    if (!u->source) {
+        pa_log("Failed to create source.");
+        goto fail;
+    }
+
+    u->source->parent.process_msg = source_process_msg_cb;
+    u->source->set_state = source_set_state_cb;
+    u->source->update_requested_latency = source_update_requested_latency_cb;
+    u->source->set_volume = source_set_volume_cb;
+    u->source->set_mute = source_set_mute_cb;
+    u->source->get_volume = source_get_volume_cb;
+    u->source->get_mute = source_get_mute_cb;
+    u->source->userdata = u;
+
+    pa_source_set_asyncmsgq(u->source, master->asyncmsgq);
+
+    /* Create source output */
+    pa_source_output_new_data_init(&source_output_data);
+    source_output_data.driver = __FILE__;
+    source_output_data.module = m;
+    source_output_data.source = master;
+    /* FIXME
+       source_output_data.flags = PA_SOURCE_OUTPUT_DONT_INHIBIT_AUTO_SUSPEND; */
+
+    pa_proplist_sets(source_output_data.proplist, PA_PROP_MEDIA_NAME, "Virtual Source Stream");
+    pa_proplist_sets(source_output_data.proplist, PA_PROP_MEDIA_ROLE, "filter");
+    pa_source_output_new_data_set_sample_spec(&source_output_data, &ss);
+    pa_source_output_new_data_set_channel_map(&source_output_data, &map);
+
+    pa_source_output_new(&u->source_output, m->core, &source_output_data);
+    pa_source_output_new_data_done(&source_output_data);
+
+    if (!u->source_output)
+        goto fail;
+
+    u->source_output->parent.process_msg = source_output_process_msg_cb;
+    u->source_output->push = source_output_push_cb;
+    u->source_output->process_rewind = source_output_process_rewind_cb;
+    u->source_output->kill = source_output_kill_cb;
+    u->source_output->attach = source_output_attach_cb;
+    u->source_output->detach = source_output_detach_cb;
+    u->source_output->state_change = source_output_state_change_cb;
+    u->source_output->may_move_to = source_output_may_move_to_cb;
+    u->source_output->moving = source_output_moving_cb;
+    u->source_output->userdata = u;
+
+    pa_source_put(u->source);
+    pa_source_output_put(u->source_output);
+
+    /* Create optional uplink sink */
+    pa_sink_new_data_init(&sink_data);
+    sink_data.driver = __FILE__;
+    sink_data.module = m;
+    if ((sink_data.name = pa_xstrdup(pa_modargs_get_value(ma, "uplink_sink", NULL)))) {
+        pa_sink_new_data_set_sample_spec(&sink_data, &ss);
+        pa_sink_new_data_set_channel_map(&sink_data, &map);
+        pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_MASTER_DEVICE, master->name);
+        pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_CLASS, "uplink sink");
+        pa_proplist_sets(sink_data.proplist, "device.uplink_sink.name", sink_data.name);
+
+        if ((u->auto_desc = !pa_proplist_contains(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION))) {
+            const char *z;
+
+            z = pa_proplist_gets(master->proplist, PA_PROP_DEVICE_DESCRIPTION);
+            pa_proplist_setf(sink_data.proplist, PA_PROP_DEVICE_DESCRIPTION, "Uplink Sink %s on %s", sink_data.name, z ? z : master->name);
+        }
+
+        u->sink_memblockq = pa_memblockq_new(0, MEMBLOCKQ_MAXLENGTH, 0, pa_frame_size(&ss), 1, 1, 0, NULL);
+        if (!u->sink_memblockq) {
+            pa_log("Failed to create sink memblockq.");
+            goto fail;
+        }
+
+        u->sink = pa_sink_new(m->core, &sink_data, 0);  /* FIXME, sink has no capabilities */
+        pa_sink_new_data_done(&sink_data);
+
+        if (!u->sink) {
+            pa_log("Failed to create sink.");
+            goto fail;
+        }
+
+        u->sink->parent.process_msg = sink_process_msg_cb;
+        u->sink->update_requested_latency = sink_update_requested_latency_cb;
+        u->sink->request_rewind = sink_request_rewind_cb;
+        u->sink->set_state = sink_set_state_cb;
+        u->sink->userdata = u;
+
+        pa_sink_set_asyncmsgq(u->sink, master->asyncmsgq);
+
+        /* FIXME: no idea what I am doing here */
+        u->block_usec = BLOCK_USEC;
+        nbytes = pa_usec_to_bytes(u->block_usec, &u->sink->sample_spec);
+        pa_sink_set_max_rewind(u->sink, nbytes);
+        pa_sink_set_max_request(u->sink, nbytes);
+
+        pa_sink_put(u->sink);
+    } else {
+        /* optional uplink sink not enabled */
+        u->sink = NULL;
+    }
+
+    pa_modargs_free(ma);
+
+    pa_xfree(use_default);
+
+    return 0;
+
+ fail:
+    if (ma)
+        pa_modargs_free(ma);
+
+    pa_xfree(use_default);
+
+    pa__done(m);
+
+    return -1;
+}
+
+int pa__get_n_used(pa_module *m) {
+    struct userdata *u;
+
+    pa_assert(m);
+    pa_assert_se(u = m->userdata);
+
+    return pa_source_linked_by(u->source);
+}
+
+void pa__done(pa_module*m) {
+    struct userdata *u;
+
+    pa_assert(m);
+
+    if (!(u = m->userdata))
+        return;
+
+    /* See comments in source_output_kill_cb() above regarding
+     * destruction order! */
+
+    if (u->source_output)
+        pa_source_output_unlink(u->source_output);
+
+    if (u->source)
+        pa_source_unlink(u->source);
+
+    if (u->source_output)
+        pa_source_output_unref(u->source_output);
+
+    if (u->source)
+        pa_source_unref(u->source);
+
+    if (u->sink)
+        pa_sink_unref(u->sink);
+
+    if (u->memblockq)
+        pa_memblockq_free(u->memblockq);
+
+    if (u->sink_memblockq)
+         pa_memblockq_free(u->sink_memblockq);
+
+    pa_xfree(u);
+}

commit 3e6293f42279ac9d18aec49767ba17c0ea2274fb
Author: Pierre-Louis Bossart <pierre-louis.bossart at intel.com>
Date:   Thu Feb 11 15:46:41 2010 -0600

    virtual-sink,source: enable virtual-source and virtual-sink

diff --git a/src/Makefile.am b/src/Makefile.am
index 6c0b4d8..3268137 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1027,7 +1027,9 @@ modlibexec_LTLIBRARIES += \
 		module-position-event-sounds.la \
 		module-augment-properties.la \
 		module-cork-music-on-phone.la \
-		module-loopback.la
+		module-loopback.la \
+		module-virtual-sink.la \
+		module-virtual-source.la
 
 # See comment at librtp.la above
 if !OS_IS_WIN32
@@ -1292,7 +1294,9 @@ SYMDEF_FILES = \
 		modules/module-cork-music-on-phone-symdef.h \
 		modules/module-console-kit-symdef.h \
 		modules/dbus/module-dbus-protocol-symdef.h \
-		modules/module-loopback-symdef.h
+		modules/module-loopback-symdef.h \
+		modules/module-virtual-sink-symdef.h \
+		modules/module-virtual-source-symdef.h
 
 EXTRA_DIST += $(SYMDEF_FILES)
 BUILT_SOURCES += $(SYMDEF_FILES)
@@ -1461,6 +1465,14 @@ module_loopback_la_SOURCES = modules/module-loopback.c
 module_loopback_la_LDFLAGS = $(MODULE_LDFLAGS)
 module_loopback_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
 
+module_virtual_sink_la_SOURCES = modules/module-virtual-sink.c
+module_virtual_sink_la_LDFLAGS = $(MODULE_LDFLAGS)
+module_virtual_sink_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
+
+module_virtual_source_la_SOURCES = modules/module-virtual-source.c
+module_virtual_source_la_LDFLAGS = $(MODULE_LDFLAGS)
+module_virtual_source_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
+
 # X11
 
 module_x11_bell_la_SOURCES = modules/x11/module-x11-bell.c

commit 2c631dfe9a57950ae971cbeda14e1ee634348424
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sun Feb 21 17:39:47 2010 +0100

    pactl: implement pactl subscribe
    
    This is a simple debugging tool which prints out subscription events

diff --git a/src/utils/pactl.c b/src/utils/pactl.c
index ee67c42..cae96f2 100644
--- a/src/utils/pactl.c
+++ b/src/utils/pactl.c
@@ -99,7 +99,8 @@ static enum {
     SET_SINK_INPUT_VOLUME,
     SET_SINK_MUTE,
     SET_SOURCE_MUTE,
-    SET_SINK_INPUT_MUTE
+    SET_SINK_INPUT_MUTE,
+    SUBSCRIBE
 } action = NONE;
 
 static void quit(int ret) {
@@ -728,6 +729,67 @@ static void stream_write_callback(pa_stream *s, size_t length, void *userdata) {
     }
 }
 
+static const char *subscription_event_type_to_string(pa_subscription_event_type_t t) {
+
+    switch (t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) {
+
+    case PA_SUBSCRIPTION_EVENT_NEW:
+        return _("new");
+
+    case PA_SUBSCRIPTION_EVENT_CHANGE:
+        return _("change");
+
+    case PA_SUBSCRIPTION_EVENT_REMOVE:
+        return _("remove");
+    }
+
+    return _("unknown");
+}
+
+static const char *subscription_event_facility_to_string(pa_subscription_event_type_t t) {
+
+    switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) {
+
+    case PA_SUBSCRIPTION_EVENT_SINK:
+        return _("sink");
+
+    case PA_SUBSCRIPTION_EVENT_SOURCE:
+        return _("source");
+
+    case PA_SUBSCRIPTION_EVENT_SINK_INPUT:
+        return _("sink-input");
+
+    case PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT:
+        return _("source-output");
+
+    case PA_SUBSCRIPTION_EVENT_MODULE:
+        return _("module");
+
+    case PA_SUBSCRIPTION_EVENT_CLIENT:
+        return _("client");
+
+    case PA_SUBSCRIPTION_EVENT_SAMPLE_CACHE:
+        return _("sample-cache");
+
+    case PA_SUBSCRIPTION_EVENT_SERVER:
+        return _("server");
+
+    case PA_SUBSCRIPTION_EVENT_CARD:
+        return _("server");
+    }
+
+    return _("unknown");
+}
+
+static void context_subscribe_callback(pa_context *c, pa_subscription_event_type_t t, uint32_t idx, void *userdata) {
+    pa_assert(c);
+
+    printf(_("Event '%s' on %s #%u\n"),
+           subscription_event_type_to_string(t),
+           subscription_event_facility_to_string(t),
+           idx);
+}
+
 static void context_state_callback(pa_context *c, void *userdata) {
     pa_assert(c);
     switch (pa_context_get_state(c)) {
@@ -855,6 +917,24 @@ static void context_state_callback(pa_context *c, void *userdata) {
                     break;
                 }
 
+               case SUBSCRIBE:
+                   pa_context_set_subscribe_callback(c, context_subscribe_callback, NULL);
+
+                   pa_operation_unref(pa_context_subscribe(
+                                              c,
+                                              PA_SUBSCRIPTION_MASK_SINK|
+                                              PA_SUBSCRIPTION_MASK_SOURCE|
+                                              PA_SUBSCRIPTION_MASK_SINK_INPUT|
+                                              PA_SUBSCRIPTION_MASK_SOURCE_OUTPUT|
+                                              PA_SUBSCRIPTION_MASK_MODULE|
+                                              PA_SUBSCRIPTION_MASK_CLIENT|
+                                              PA_SUBSCRIPTION_MASK_SAMPLE_CACHE|
+                                              PA_SUBSCRIPTION_MASK_SERVER|
+                                              PA_SUBSCRIPTION_MASK_CARD,
+                                              NULL,
+                                              NULL));
+                   break;
+
                 default:
                     pa_assert_not_reached();
             }
@@ -898,7 +978,8 @@ static void help(const char *argv0) {
              "%s [options] set-sink-input-volume SINKINPUT VOLUME\n"
              "%s [options] set-sink-mute SINK 1|0\n"
              "%s [options] set-source-mute SOURCE 1|0\n"
-             "%s [options] set-sink-input-mute SINKINPUT 1|0\n\n"
+             "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+             "%s [options] subscribe\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"
@@ -907,7 +988,7 @@ static void help(const char *argv0) {
            argv0, argv0, argv0, argv0, argv0,
            argv0, argv0, argv0, argv0, argv0,
            argv0, argv0, argv0, argv0, argv0,
-           argv0);
+           argv0, argv0);
 }
 
 enum {
@@ -1263,7 +1344,11 @@ int main(int argc, char *argv[]) {
 
             mute = b;
 
-        } else if (pa_streq(argv[optind], "help")) {
+        } else if (pa_streq(argv[optind], "subscribe"))
+
+            action = SUBSCRIBE;
+
+        else if (pa_streq(argv[optind], "help")) {
             help(bn);
             ret = 0;
             goto quit;

commit f6f957b53cc8ed945364ef5d51546f59a4c653be
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sun Feb 21 17:40:44 2010 +0100

    Revert "pacat: Don't use any buffer attr if we don't set any latency/process time params"
    
    This reverts commit ff2091b2c47dfa7d9f1397627b72d9366b60f566.

diff --git a/src/utils/pacat.c b/src/utils/pacat.c
index 68280e5..1036af6 100644
--- a/src/utils/pacat.c
+++ b/src/utils/pacat.c
@@ -409,7 +409,6 @@ static void context_state_callback(pa_context *c, void *userdata) {
 
         case PA_CONTEXT_READY: {
             pa_buffer_attr buffer_attr;
-            const pa_buffer_attr *active_buffer_attr = NULL;
 
             pa_assert(c);
             pa_assert(!stream);
@@ -439,33 +438,29 @@ static void context_state_callback(pa_context *c, void *userdata) {
 
             if (latency_msec > 0) {
                 buffer_attr.fragsize = buffer_attr.tlength = pa_usec_to_bytes(latency_msec * PA_USEC_PER_MSEC, &sample_spec);
-                active_buffer_attr = &buffer_attr;
                 flags |= PA_STREAM_ADJUST_LATENCY;
             } else if (latency > 0) {
                 buffer_attr.fragsize = buffer_attr.tlength = (uint32_t) latency;
-                active_buffer_attr = &buffer_attr;
                 flags |= PA_STREAM_ADJUST_LATENCY;
             } else
                 buffer_attr.fragsize = buffer_attr.tlength = (uint32_t) -1;
 
             if (process_time_msec > 0) {
                 buffer_attr.minreq = pa_usec_to_bytes(process_time_msec * PA_USEC_PER_MSEC, &sample_spec);
-                active_buffer_attr = &buffer_attr;
-            } else if (process_time > 0) {
+            } else if (process_time > 0)
                 buffer_attr.minreq = (uint32_t) process_time;
-                active_buffer_attr = &buffer_attr;
-            } else
+            else
                 buffer_attr.minreq = (uint32_t) -1;
 
             if (mode == PLAYBACK) {
                 pa_cvolume cv;
-                if (pa_stream_connect_playback(stream, device, active_buffer_attr, flags, volume_is_set ? pa_cvolume_set(&cv, sample_spec.channels, volume) : NULL, NULL) < 0) {
+                if (pa_stream_connect_playback(stream, device, &buffer_attr, flags, volume_is_set ? pa_cvolume_set(&cv, sample_spec.channels, volume) : NULL, NULL) < 0) {
                     pa_log(_("pa_stream_connect_playback() failed: %s"), pa_strerror(pa_context_errno(c)));
                     goto fail;
                 }
 
             } else {
-                if (pa_stream_connect_record(stream, device, active_buffer_attr, flags) < 0) {
+                if (pa_stream_connect_record(stream, device, latency > 0 ? &buffer_attr : NULL, flags) < 0) {
                     pa_log(_("pa_stream_connect_record() failed: %s"), pa_strerror(pa_context_errno(c)));
                     goto fail;
                 }

commit 14e4369bee6a808ca1f57945e7fe7165f7f18a9e
Author: Lennart Poettering <lennart at poettering.net>
Date:   Mon Feb 15 22:23:39 2010 +0100

    alsa: cover "Desktop Speaker" mixer elements
    
    As exposed by really old Microsoft USB sound systems

diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index 8bbd1f5..cb814af 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -1784,7 +1784,8 @@ static int path_verify(pa_alsa_path *p) {
         { "analog-output-lfe-on-mono",  N_("Analog Output (LFE)") },
         { "analog-output-mono",         N_("Analog Mono Output") },
         { "analog-output-headphones-2", N_("Analog Headphones 2") },
-        { "analog-output-speaker",      N_("Analog Speaker") }
+        { "analog-output-speaker",      N_("Analog Speakers") }
+        { "analog-output-desktop-speaker", N_("Analog Speakers 2") }
     };
 
     pa_alsa_element *e;
diff --git a/src/modules/alsa/mixer/paths/analog-output-speaker.conf b/src/modules/alsa/mixer/paths/analog-output-desktop-speaker.conf
similarity index 88%
copy from src/modules/alsa/mixer/paths/analog-output-speaker.conf
copy to src/modules/alsa/mixer/paths/analog-output-desktop-speaker.conf
index aea7853..9f18b25 100644
--- a/src/modules/alsa/mixer/paths/analog-output-speaker.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-desktop-speaker.conf
@@ -14,7 +14,7 @@
 # along with PulseAudio; if not, write to the Free Software Foundation,
 # Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 
-; Path for mixers that have a 'Speaker' control
+; Path for mixers that have a 'Desktop Speaker' control
 ;
 ; See analog-output.conf.common for an explanation on the directives
 
@@ -37,9 +37,9 @@ override-map.2 = all-left,all-right
 switch = off
 volume = off
 
-; This profile path is intended to control the speaker, not the
-; headphones. But it should not hurt if we leave the headphone jack
-; enabled nonetheless.
+; This profile path is intended to control the desktop speaker, not
+; the headphones. But it should not hurt if we leave the headphone
+; jack enabled nonetheless.
 [Element Headphone]
 switch = mute
 volume = zero
@@ -49,6 +49,10 @@ switch = mute
 volume = zero
 
 [Element Speaker]
+switch = off
+volume = off
+
+[Element Desktop Speaker]
 required = any
 switch = mute
 volume = merge
diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
index f2fd31c..580c798 100644
--- a/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
@@ -55,6 +55,10 @@ override-map.2 = all-left,all-right
 switch = off
 volume = off
 
+[Element Desktop Speaker]
+switch = off
+volume = off
+
 [Element Front]
 switch = off
 volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones.conf b/src/modules/alsa/mixer/paths/analog-output-headphones.conf
index 2131cfe..79ebc7f 100644
--- a/src/modules/alsa/mixer/paths/analog-output-headphones.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-headphones.conf
@@ -55,6 +55,10 @@ volume = zero
 switch = off
 volume = off
 
+[Element Desktop Speaker]
+switch = off
+volume = off
+
 [Element Front]
 switch = off
 volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf b/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf
index 0a43e27..67ee32f 100644
--- a/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf
@@ -58,6 +58,10 @@ volume = merge
 override-map.1 = all
 override-map.2 = all-left,all-right
 
+[Element Desktop Speaker]
+switch = off
+volume = off
+
 [Element Front]
 switch = off
 volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-output-mono.conf b/src/modules/alsa/mixer/paths/analog-output-mono.conf
index 542edc4..13a2d6a 100644
--- a/src/modules/alsa/mixer/paths/analog-output-mono.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-mono.conf
@@ -55,6 +55,10 @@ volume = merge
 override-map.1 = all
 override-map.2 = all-left,all-right
 
+[Element Desktop Speaker]
+switch = off
+volume = off
+
 [Element Front]
 switch = off
 volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-output-speaker.conf b/src/modules/alsa/mixer/paths/analog-output-speaker.conf
index aea7853..b133a2e 100644
--- a/src/modules/alsa/mixer/paths/analog-output-speaker.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-speaker.conf
@@ -55,6 +55,10 @@ volume = merge
 override-map.1 = all
 override-map.2 = all-left,all-right
 
+[Element Desktop Speaker]
+switch = off
+volume = off
+
 [Element Front]
 switch = mute
 volume = merge
diff --git a/src/modules/alsa/mixer/paths/analog-output.conf b/src/modules/alsa/mixer/paths/analog-output.conf
index d7c1223..50fc88e 100644
--- a/src/modules/alsa/mixer/paths/analog-output.conf
+++ b/src/modules/alsa/mixer/paths/analog-output.conf
@@ -53,6 +53,10 @@ volume = zero
 switch = mute
 volume = off
 
+[Element Desktop Speaker]
+switch = mute
+volume = off
+
 [Element Front]
 switch = mute
 volume = merge
diff --git a/src/modules/alsa/mixer/profile-sets/default.conf b/src/modules/alsa/mixer/profile-sets/default.conf
index 046938f..5d352f1 100644
--- a/src/modules/alsa/mixer/profile-sets/default.conf
+++ b/src/modules/alsa/mixer/profile-sets/default.conf
@@ -62,42 +62,42 @@ auto-profiles = yes
 [Mapping analog-mono]
 device-strings = hw:%f
 channel-map = mono
-paths-output = analog-output analog-output-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-desktop-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono
 paths-input = analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line
 priority = 1
 
 [Mapping analog-stereo]
 device-strings = front:%f hw:%f
 channel-map = left,right
-paths-output = analog-output analog-output-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-desktop-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono analog-output-lfe-on-mono
 paths-input = analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line
 priority = 10
 
 [Mapping analog-surround-40]
 device-strings = surround40:%f
 channel-map = front-left,front-right,rear-left,rear-right
-paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-desktop-speaker analog-output-lfe-on-mono
 priority = 7
 direction = output
 
 [Mapping analog-surround-41]
 device-strings = surround41:%f
 channel-map = front-left,front-right,rear-left,rear-right,lfe
-paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-desktop-speaker analog-output-lfe-on-mono
 priority = 8
 direction = output
 
 [Mapping analog-surround-50]
 device-strings = surround50:%f
 channel-map = front-left,front-right,rear-left,rear-right,front-center
-paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-desktop-speaker analog-output-lfe-on-mono
 priority = 7
 direction = output
 
 [Mapping analog-surround-51]
 device-strings = surround51:%f
 channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
-paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-desktop-speaker analog-output-lfe-on-mono
 priority = 8
 direction = output
 
@@ -105,7 +105,7 @@ direction = output
 device-strings = surround71:%f
 channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
 description = Analog Surround 7.1
-paths-output = analog-output analog-output-speaker analog-output-lfe-on-mono
+paths-output = analog-output analog-output-speaker analog-output-desktop-speaker analog-output-lfe-on-mono
 priority = 7
 direction = output
 

commit 67e3925795ad939f2c9acb3aa93122a18672fade
Author: Lennart Poettering <lennart at poettering.net>
Date:   Mon Feb 15 23:39:12 2010 +0100

    alsa: cover 'Shared Mic/Line in', 'Analog Source'
    
    https://bugzilla.redhat.com/show_bug.cgi?id=558638

diff --git a/src/modules/alsa/mixer/paths/analog-input.conf.common b/src/modules/alsa/mixer/paths/analog-input.conf.common
index fbdc8fb..66c3dda 100644
--- a/src/modules/alsa/mixer/paths/analog-input.conf.common
+++ b/src/modules/alsa/mixer/paths/analog-input.conf.common
@@ -277,6 +277,31 @@ name = input-microphone
 [Option Digital Input Source:Digital Mic 2]
 name = input-microphone
 
+;;; 'Analog Source'
+
+[Element Analog Source]
+enumeration = select
+
+[Option Analog Source:Mic]
+name = input-microphone
+
+[Option Analog Source:Line in]
+name = input-linein
+
+[Option Analog Source:Aux]
+name = input
+
+;;; 'Shared Mic/Line in'
+
+[Element Shared Mic/Line in]
+enumeration = select
+
+[Option Shared Mic/Line in:Mic in]
+name = input-microphone
+
+[Option Shared Mic/Line in:Line in]
+name = input-linein
+
 ;;; Various Boosts
 
 [Element Capture Boost]

commit dfa00bf8f846d0e1ea0f47b09d114768a781abb7
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Feb 16 00:58:49 2010 +0100

    alsa: cover "Internal Mic" elements
    
    https://bugzilla.redhat.com/show_bug.cgi?id=562216

diff --git a/src/modules/alsa/mixer/paths/analog-input-aux.conf b/src/modules/alsa/mixer/paths/analog-input-aux.conf
index db78eb4..3a7cb7b 100644
--- a/src/modules/alsa/mixer/paths/analog-input-aux.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-aux.conf
@@ -32,6 +32,10 @@ override-map.2 = all-left,all-right
 switch = off
 volume = off
 
+[Element Internal Mic]
+switch = off
+volume = off
+
 [Element Line]
 switch = off
 volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-input-fm.conf b/src/modules/alsa/mixer/paths/analog-input-fm.conf
index baf674a..7f150e3 100644
--- a/src/modules/alsa/mixer/paths/analog-input-fm.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-fm.conf
@@ -32,6 +32,10 @@ override-map.2 = all-left,all-right
 switch = off
 volume = off
 
+[Element Internal Mic]
+switch = off
+volume = off
+
 [Element Line]
 switch = off
 volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-input-mic.conf b/src/modules/alsa/mixer/paths/analog-input-internal-mic.conf
similarity index 92%
copy from src/modules/alsa/mixer/paths/analog-input-mic.conf
copy to src/modules/alsa/mixer/paths/analog-input-internal-mic.conf
index 2a36f2f..70cd512 100644
--- a/src/modules/alsa/mixer/paths/analog-input-mic.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-internal-mic.conf
@@ -14,12 +14,12 @@
 # along with PulseAudio; if not, write to the Free Software Foundation,
 # Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
 
-; For devices where a 'Mic' element exists
+; For devices where a 'Internal Mic' element exists
 ;
 ; See analog-output.conf.common for an explanation on the directives
 
 [General]
-priority = 100
+priority = 90
 name = analog-input-microphone
 
 [Element Capture]
@@ -29,6 +29,10 @@ override-map.1 = all
 override-map.2 = all-left,all-right
 
 [Element Mic]
+switch = off
+volume = off
+
+[Element Internal Mic]
 required = any
 switch = mute
 volume = merge
diff --git a/src/modules/alsa/mixer/paths/analog-input-linein.conf b/src/modules/alsa/mixer/paths/analog-input-linein.conf
index 4be5722..57568cc 100644
--- a/src/modules/alsa/mixer/paths/analog-input-linein.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-linein.conf
@@ -31,6 +31,10 @@ override-map.2 = all-left,all-right
 switch = off
 volume = off
 
+[Element Internal Mic]
+switch = off
+volume = off
+
 [Element Line]
 required = any
 switch = mute
diff --git a/src/modules/alsa/mixer/paths/analog-input-mic-line.conf b/src/modules/alsa/mixer/paths/analog-input-mic-line.conf
index f7f3085..fa680aa 100644
--- a/src/modules/alsa/mixer/paths/analog-input-mic-line.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-mic-line.conf
@@ -32,6 +32,10 @@ override-map.2 = all-left,all-right
 switch = off
 volume = off
 
+[Element Internal Mic]
+switch = off
+volume = off
+
 [Element Line]
 switch = off
 volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-input-mic.conf b/src/modules/alsa/mixer/paths/analog-input-mic.conf
index 2a36f2f..9b8b75a 100644
--- a/src/modules/alsa/mixer/paths/analog-input-mic.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-mic.conf
@@ -35,6 +35,10 @@ volume = merge
 override-map.1 = all
 override-map.2 = all-left,all-right
 
+[Element Internal Mic]
+switch = off
+volume = off
+
 [Element Line]
 switch = off
 volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-input-tvtuner.conf b/src/modules/alsa/mixer/paths/analog-input-tvtuner.conf
index 8531ec7..fae3ce8 100644
--- a/src/modules/alsa/mixer/paths/analog-input-tvtuner.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-tvtuner.conf
@@ -32,6 +32,10 @@ override-map.2 = all-left,all-right
 switch = off
 volume = off
 
+[Element Internal Mic]
+switch = off
+volume = off
+
 [Element Line]
 switch = off
 volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-input-video.conf b/src/modules/alsa/mixer/paths/analog-input-video.conf
index 74c76f0..19f1809 100644
--- a/src/modules/alsa/mixer/paths/analog-input-video.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-video.conf
@@ -31,6 +31,10 @@ override-map.2 = all-left,all-right
 switch = off
 volume = off
 
+[Element Internal Mic]
+switch = off
+volume = off
+
 [Element Line]
 switch = off
 volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-input.conf b/src/modules/alsa/mixer/paths/analog-input.conf
index 5055f90..3050738 100644
--- a/src/modules/alsa/mixer/paths/analog-input.conf
+++ b/src/modules/alsa/mixer/paths/analog-input.conf
@@ -32,6 +32,9 @@ override-map.2 = all-left,all-right
 [Element Mic]
 required-absent = any
 
+[Element Internal Mic]
+required-absent = any
+
 [Element Line]
 required-absent = any
 

commit abfd2aa0e712223a3573aa43468dacf3eee3c4e4
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Feb 16 00:59:24 2010 +0100

    alsa: use default output port names
    
    instead of coming up with pointless aliases, reuse the already established
    names, for second headphones, and second speakers.

diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index cb814af..93f2ed0 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -1783,9 +1783,7 @@ static int path_verify(pa_alsa_path *p) {
         { "analog-output-headphones",   N_("Analog Headphones") },
         { "analog-output-lfe-on-mono",  N_("Analog Output (LFE)") },
         { "analog-output-mono",         N_("Analog Mono Output") },
-        { "analog-output-headphones-2", N_("Analog Headphones 2") },
         { "analog-output-speaker",      N_("Analog Speakers") }
-        { "analog-output-desktop-speaker", N_("Analog Speakers 2") }
     };
 
     pa_alsa_element *e;
diff --git a/src/modules/alsa/mixer/paths/analog-output-desktop-speaker.conf b/src/modules/alsa/mixer/paths/analog-output-desktop-speaker.conf
index 9f18b25..dfdecf4 100644
--- a/src/modules/alsa/mixer/paths/analog-output-desktop-speaker.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-desktop-speaker.conf
@@ -19,7 +19,8 @@
 ; See analog-output.conf.common for an explanation on the directives
 
 [General]
-priority = 100
+priority = 101
+name = analog-output-speaker
 
 [Element Hardware Master]
 switch = mute
diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
index 580c798..e47543f 100644
--- a/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-headphones-2.conf
@@ -20,6 +20,7 @@
 
 [General]
 priority = 89
+name = analog-output-headphones
 
 [Element Hardware Master]
 switch = mute
diff --git a/src/modules/alsa/mixer/paths/analog-output-headphones.conf b/src/modules/alsa/mixer/paths/analog-output-headphones.conf
index 79ebc7f..1d7bb0b 100644
--- a/src/modules/alsa/mixer/paths/analog-output-headphones.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-headphones.conf
@@ -20,6 +20,7 @@
 
 [General]
 priority = 90
+name = analog-output-headphones
 
 [Element Hardware Master]
 switch = mute
diff --git a/src/modules/alsa/mixer/paths/analog-output-speaker.conf b/src/modules/alsa/mixer/paths/analog-output-speaker.conf
index b133a2e..c6916d6 100644
--- a/src/modules/alsa/mixer/paths/analog-output-speaker.conf
+++ b/src/modules/alsa/mixer/paths/analog-output-speaker.conf
@@ -20,6 +20,7 @@
 
 [General]
 priority = 100
+name = analog-output-speaker
 
 [Element Hardware Master]
 switch = mute

commit 80093c94be077d15fda945786bc1291fb864e51c
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Feb 16 01:43:00 2010 +0100

    build-sys: add gobject to build dependencies
    
    Since we call g_object_unref() we need to link against gobject in
    compliance of the new Fedora implicit DSO linking policy.

diff --git a/configure.ac b/configure.ac
index 8abaabb..d23e09e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -929,7 +929,7 @@ AC_ARG_ENABLE([gconf],
         [gconf=auto])
 
 if test "x${gconf}" != xno ; then
-    PKG_CHECK_MODULES(GCONF, [ gconf-2.0 >= 2.4.0 ],
+    PKG_CHECK_MODULES(GCONF, [ gconf-2.0 >= 2.4.0 gobject-2.0 ],
         HAVE_GCONF=1,
         [
             HAVE_GCONF=0

commit 69ddfaf6ed8db98535382413ec4675865053dbc2
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Feb 16 02:03:45 2010 +0100

    padsp: emulate /dev/audio, too
    
    https://bugzilla.redhat.com/show_bug.cgi?id=561262

diff --git a/src/utils/padsp.c b/src/utils/padsp.c
index 2ed0a03..fb756d3 100644
--- a/src/utils/padsp.c
+++ b/src/utils/padsp.c
@@ -1458,11 +1458,11 @@ static int real_open(const char *filename, int flags, mode_t mode) {
         return _open(filename, flags, mode);
     }
 
-    if (filename && dsp_cloak_enable() && (strcmp(filename, "/dev/dsp") == 0 || strcmp(filename, "/dev/adsp") == 0))
+    if (filename && dsp_cloak_enable() && (pa_streq(filename, "/dev/dsp") || pa_streq(filename, "/dev/adsp") || pa_streq(filename, "/dev/audio")))
         r = dsp_open(flags, &_errno);
-    else if (filename && mixer_cloak_enable() && strcmp(filename, "/dev/mixer") == 0)
+    else if (filename && mixer_cloak_enable() && pa_streq(filename, "/dev/mixer"))
         r = mixer_open(flags, &_errno);
-    else if (filename && sndstat_cloak_enable() && strcmp(filename, "/dev/sndstat") == 0)
+    else if (filename && sndstat_cloak_enable() && pa_streq(filename, "/dev/sndstat"))
         r = sndstat_open(flags, &_errno);
     else {
         function_exit();
@@ -2383,15 +2383,21 @@ int close(int fd) {
     return 0;
 }
 
+static pa_bool_t is_audio_device_node(const char *path) {
+    return
+        pa_streq(path, "/dev/dsp") ||
+        pa_streq(path, "/dev/adsp") ||
+        pa_streq(path, "/dev/audio") ||
+        pa_streq(path, "/dev/sndstat") ||
+        pa_streq(path, "/dev/mixer");
+}
+
 int access(const char *pathname, int mode) {
 
     debug(DEBUG_LEVEL_VERBOSE, __FILE__": access(%s)\n", pathname?pathname:"NULL");
 
     if (!pathname ||
-        (strcmp(pathname, "/dev/dsp") != 0 &&
-         strcmp(pathname, "/dev/adsp") != 0 &&
-         strcmp(pathname, "/dev/sndstat") != 0 &&
-         strcmp(pathname, "/dev/mixer") != 0 )) {
+        !is_audio_device_node(pathname)) {
         LOAD_ACCESS_FUNC();
         return _access(pathname, mode);
     }
@@ -2417,10 +2423,7 @@ int stat(const char *pathname, struct stat *buf) {
 
     if (!pathname ||
         !buf ||
-        ( strcmp(pathname, "/dev/dsp") != 0 &&
-          strcmp(pathname, "/dev/adsp") != 0 &&
-          strcmp(pathname, "/dev/sndstat") != 0 &&
-          strcmp(pathname, "/dev/mixer") != 0 )) {
+        !is_audio_device_node(pathname)) {
         debug(DEBUG_LEVEL_VERBOSE, __FILE__": stat(%s)\n", pathname?pathname:"NULL");
         LOAD_STAT_FUNC();
         return _stat(pathname, buf);
@@ -2474,10 +2477,7 @@ int stat64(const char *pathname, struct stat64 *buf) {
 
     if (!pathname ||
         !buf ||
-        ( strcmp(pathname, "/dev/dsp") != 0 &&
-          strcmp(pathname, "/dev/adsp") != 0 &&
-          strcmp(pathname, "/dev/sndstat") != 0 &&
-          strcmp(pathname, "/dev/mixer") != 0 )) {
+        !is_audio_device_node(pathname)) {
         LOAD_STAT64_FUNC();
         return _stat64(pathname, buf);
     }
@@ -2519,10 +2519,7 @@ int open64(const char *filename, int flags, ...) {
     }
 
     if (!filename ||
-        ( strcmp(filename, "/dev/dsp") != 0 &&
-          strcmp(filename, "/dev/adsp") != 0 &&
-          strcmp(filename, "/dev/sndstat") != 0 &&
-          strcmp(filename, "/dev/mixer") != 0 )) {
+        !is_audio_device_node(filename)) {
         LOAD_OPEN64_FUNC();
         return _open64(filename, flags, mode);
     }
@@ -2539,10 +2536,7 @@ int __xstat(int ver, const char *pathname, struct stat *buf) {
 
     if (!pathname ||
         !buf ||
-        ( strcmp(pathname, "/dev/dsp") != 0 &&
-          strcmp(pathname, "/dev/adsp") != 0 &&
-          strcmp(pathname, "/dev/sndstat") != 0 &&
-          strcmp(pathname, "/dev/mixer") != 0 )) {
+        !is_audio_device_node(pathname)) {
         LOAD_XSTAT_FUNC();
         return ___xstat(ver, pathname, buf);
     }
@@ -2562,10 +2556,7 @@ int __xstat64(int ver, const char *pathname, struct stat64 *buf) {
 
     if (!pathname ||
         !buf ||
-        ( strcmp(pathname, "/dev/dsp") != 0 &&
-          strcmp(pathname, "/dev/adsp") != 0 &&
-          strcmp(pathname, "/dev/sndstat") != 0 &&
-          strcmp(pathname, "/dev/mixer") != 0 )) {
+        !is_audio_device_node(pathname)) {
         LOAD_XSTAT64_FUNC();
         return ___xstat64(ver, pathname, buf);
     }
@@ -2591,10 +2582,7 @@ FILE* fopen(const char *filename, const char *mode) {
 
     if (!filename ||
         !mode ||
-        ( strcmp(filename, "/dev/dsp") != 0 &&
-          strcmp(filename, "/dev/adsp") != 0 &&
-          strcmp(filename, "/dev/sndstat") != 0 &&
-          strcmp(filename, "/dev/mixer") != 0 )) {
+        !is_audio_device_node(filename)) {
         LOAD_FOPEN_FUNC();
         return _fopen(filename, mode);
     }
@@ -2634,10 +2622,7 @@ FILE *fopen64(const char *filename, const char *mode) {
 
     if (!filename ||
         !mode ||
-        ( strcmp(filename, "/dev/dsp") != 0 &&
-          strcmp(filename, "/dev/adsp") != 0 &&
-          strcmp(filename, "/dev/sndstat") != 0 &&
-          strcmp(filename, "/dev/mixer") != 0 )) {
+        !is_audio_device_node(filename)) {
         LOAD_FOPEN64_FUNC();
         return _fopen64(filename, mode);
     }

commit ac76dbde6312b8052b80ce0239ef9443cfb27e1f
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Feb 16 02:49:44 2010 +0100

    dbus: first restart timer, then dispatch it
    
    This makes sure that we don't access the timer after it might have been
    destroyed already from the dbus timeout callback.
    
    https://bugzilla.redhat.com/attachment.cgi?id=389952

diff --git a/src/pulsecore/dbus-util.c b/src/pulsecore/dbus-util.c
index e3700ea..09ab071 100644
--- a/src/pulsecore/dbus-util.c
+++ b/src/pulsecore/dbus-util.c
@@ -45,17 +45,16 @@ struct pa_dbus_wrap_connection {
 };
 
 struct timeout_data {
-    pa_dbus_wrap_connection *c;
+    pa_dbus_wrap_connection *connection;
     DBusTimeout *timeout;
 };
 
 static void dispatch_cb(pa_mainloop_api *ea, pa_defer_event *ev, void *userdata) {
     DBusConnection *conn = userdata;
 
-    if (dbus_connection_dispatch(conn) == DBUS_DISPATCH_COMPLETE) {
+    if (dbus_connection_dispatch(conn) == DBUS_DISPATCH_COMPLETE)
         /* no more data to process, disable the deferred */
         ea->defer_enable(ev, 0);
-    }
 }
 
 /* DBusDispatchStatusFunction callback for the pa mainloop */
@@ -132,13 +131,17 @@ static void handle_time_event(pa_mainloop_api *ea, pa_time_event* e, const struc
     struct timeout_data *d = userdata;
 
     pa_assert(d);
-    pa_assert(d->c);
+    pa_assert(d->connection);
 
     if (dbus_timeout_get_enabled(d->timeout)) {
-        dbus_timeout_handle(d->timeout);
+        /* Restart it for the next scheduled time. We do this before
+         * calling dbus_timeout_handle() to make sure that the time
+         * event is still around. */
+        ea->time_restart(e, pa_timeval_rtstore(&tv,
+                                               pa_timeval_load(t) + dbus_timeout_get_interval(d->timeout) * PA_USEC_PER_MSEC,
+                                               d->connection->use_rtclock));
 
-        /* restart it for the next scheduled time */
-        ea->time_restart(e, pa_timeval_rtstore(&tv, pa_timeval_load(t) + dbus_timeout_get_interval(d->timeout) * PA_USEC_PER_MSEC, d->c->use_rtclock));
+        dbus_timeout_handle(d->timeout);
     }
 }
 
@@ -208,7 +211,7 @@ static dbus_bool_t add_timeout(DBusTimeout *timeout, void *data) {
         return FALSE;
 
     d = pa_xnew(struct timeout_data, 1);
-    d->c = c;
+    d->connection = c;
     d->timeout = timeout;
     ev = c->mainloop->time_new(c->mainloop, pa_timeval_rtstore(&tv, pa_rtclock_now() + dbus_timeout_get_interval(timeout) * PA_USEC_PER_MSEC, c->use_rtclock), handle_time_event, d);
     c->mainloop->time_set_destroy(ev, time_event_destroy_cb);
@@ -237,15 +240,15 @@ static void toggle_timeout(DBusTimeout *timeout, void *data) {
     struct timeval tv;
 
     pa_assert(d);
-    pa_assert(d->c);
+    pa_assert(d->connection);
     pa_assert(timeout);
 
     pa_assert_se(ev = dbus_timeout_get_data(timeout));
 
-    if (dbus_timeout_get_enabled(timeout)) {
-        d->c->mainloop->time_restart(ev, pa_timeval_rtstore(&tv, pa_rtclock_now() + dbus_timeout_get_interval(timeout) * PA_USEC_PER_MSEC, d->c->use_rtclock));
-    } else
-        d->c->mainloop->time_restart(ev, pa_timeval_rtstore(&tv, PA_USEC_INVALID, d->c->use_rtclock));
+    if (dbus_timeout_get_enabled(timeout))
+        d->connection->mainloop->time_restart(ev, pa_timeval_rtstore(&tv, pa_rtclock_now() + dbus_timeout_get_interval(timeout) * PA_USEC_PER_MSEC, d->connection->use_rtclock));
+    else
+        d->connection->mainloop->time_restart(ev, pa_timeval_rtstore(&tv, PA_USEC_INVALID, d->connection->use_rtclock));
 }
 
 static void wakeup_main(void *userdata) {

commit b9bcc7c733d0e877da24686f413fac10defcfa3c
Author: Lennart Poettering <lennart at poettering.net>
Date:   Tue Feb 16 03:36:44 2010 +0100

    fdsem: be more verbose when reading from eventfd fails.
    
    Apperently reading from an eventfd can fail, which results in an assert
    to be hit. I am not sure about the reason for the failure, but in
    attempt to track down the issue the next time is hit this prints a more
    useful log message.
    
    https://bugzilla.redhat.com/attachment.cgi?id=386380

diff --git a/src/pulsecore/fdsem.c b/src/pulsecore/fdsem.c
index ea14e8a..5bf9947 100644
--- a/src/pulsecore/fdsem.c
+++ b/src/pulsecore/fdsem.c
@@ -35,6 +35,7 @@
 #include <pulsecore/thread.h>
 #include <pulsecore/macro.h>
 #include <pulsecore/core-util.h>
+#include <pulsecore/core-error.h>
 #include <pulse/xmalloc.h>
 
 #ifndef HAVE_PIPE
@@ -154,7 +155,12 @@ static void flush(pa_fdsem *f) {
             uint64_t u;
 
             if ((r = read(f->efd, &u, sizeof(u))) != sizeof(u)) {
-                pa_assert(r < 0 && errno == EINTR);
+
+                if (r >= 0 || errno != EINTR) {
+                    pa_log_error("Invalid read from eventfd: %s", r < 0 ? pa_cstrerror(errno) : "EOF");
+                    pa_assert_not_reached();
+                }
+
                 continue;
             }
             r = (ssize_t) u;
@@ -162,7 +168,12 @@ static void flush(pa_fdsem *f) {
 #endif
 
         if ((r = read(f->fds[0], &x, sizeof(x))) <= 0) {
-            pa_assert(r < 0 && errno == EINTR);
+
+            if (r >= 0 || errno != EINTR) {
+                pa_log_error("Invalid read from pipe: %s", r < 0 ? pa_cstrerror(errno) : "EOF");
+                pa_assert_not_reached();
+            }
+
             continue;
         }
 
@@ -187,14 +198,22 @@ void pa_fdsem_post(pa_fdsem *f) {
                     uint64_t u = 1;
 
                     if ((r = write(f->efd, &u, sizeof(u))) != sizeof(u)) {
-                        pa_assert(r < 0 && errno == EINTR);
+                        if (r >= 0 || errno != EINTR) {
+                            pa_log_error("Invalid read from pipe: %s", r < 0 ? pa_cstrerror(errno) : "EOF");
+                            pa_assert_not_reached();
+                        }
+
                         continue;
                     }
                 } else
 #endif
 
                 if ((r = write(f->fds[1], &x, 1)) != 1) {
-                    pa_assert(r < 0 && errno == EINTR);
+                    if (r >= 0 || errno != EINTR) {
+                        pa_log_error("Invalid read from pipe: %s", r < 0 ? pa_cstrerror(errno) : "EOF");
+                        pa_assert_not_reached();
+                    }
+
                     continue;
                 }
 
@@ -223,7 +242,12 @@ void pa_fdsem_wait(pa_fdsem *f) {
             uint64_t u;
 
             if ((r = read(f->efd, &u, sizeof(u))) != sizeof(u)) {
-                pa_assert(r < 0 && errno == EINTR);
+
+                if (r >= 0 || errno != EINTR) {
+                    pa_log_error("Invalid read from pipe: %s", r < 0 ? pa_cstrerror(errno) : "EOF");
+                    pa_assert_not_reached();
+                }
+
                 continue;
             }
 
@@ -232,7 +256,12 @@ void pa_fdsem_wait(pa_fdsem *f) {
 #endif
 
         if ((r = read(f->fds[0], &x, sizeof(x))) <= 0) {
-            pa_assert(r < 0 && errno == EINTR);
+
+            if (r >= 0 || errno != EINTR) {
+                pa_log_error("Invalid read from pipe: %s", r < 0 ? pa_cstrerror(errno) : "EOF");
+                pa_assert_not_reached();
+            }
+
             continue;
         }
 

commit d57ba824145f9e42610c0aa21740f219ba671041
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 18 01:54:51 2010 +0100

    pacat: always fully fulfill write requests
    
    Make sure we always fulfill write requests from the server. If we don't
    the server won't ask us again and playback will stay stuck.
    
    https://tango.0pointer.de/pipermail/pulseaudio-discuss/2010-February/006611.html

diff --git a/src/utils/pacat.c b/src/utils/pacat.c
index 1036af6..75ccd9a 100644
--- a/src/utils/pacat.c
+++ b/src/utils/pacat.c
@@ -195,28 +195,41 @@ static void stream_write_callback(pa_stream *s, size_t length, void *userdata) {
 
         pa_assert(sndfile);
 
-        if (pa_stream_begin_write(s, &data, &length) < 0) {
-            pa_log(_("pa_stream_begin_write() failed: %s"), pa_strerror(pa_context_errno(context)));
-            quit(1);
-            return;
-        }
+        for (;;) {
+            size_t data_length = length;
 
-        if (readf_function) {
-            size_t k = pa_frame_size(&sample_spec);
+            if (pa_stream_begin_write(s, &data, &data_length) < 0) {
+                pa_log(_("pa_stream_begin_write() failed: %s"), pa_strerror(pa_context_errno(context)));
+                quit(1);
+                return;
+            }
 
-            if ((bytes = readf_function(sndfile, data, (sf_count_t) (length/k))) > 0)
-                bytes *= (sf_count_t) k;
+            if (readf_function) {
+                size_t k = pa_frame_size(&sample_spec);
 
-        } else
-            bytes = sf_read_raw(sndfile, data, (sf_count_t) length);
+                if ((bytes = readf_function(sndfile, data, (sf_count_t) (data_length/k))) > 0)
+                    bytes *= (sf_count_t) k;
 
-        if (bytes > 0)
-            pa_stream_write(s, data, (size_t) bytes, NULL, 0, PA_SEEK_RELATIVE);
-        else
-            pa_stream_cancel_write(s);
+            } else
+                bytes = sf_read_raw(sndfile, data, (sf_count_t) data_length);
 
-        if (bytes < (sf_count_t) length)
-            start_drain();
+            if (bytes > 0)
+                pa_stream_write(s, data, (size_t) bytes, NULL, 0, PA_SEEK_RELATIVE);
+            else
+                pa_stream_cancel_write(s);
+
+            /* EOF? */
+            if (bytes < (sf_count_t) data_length) {
+                start_drain();
+                break;
+            }
+
+            /* Request fulfilled */
+            if ((size_t) bytes >= length)
+                break;
+
+            length -= bytes;
+        }
     }
 }
 

commit f9f2d6f3e0f9dfa310c7cd29bb06b8b52a0c8a1c
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 18 02:32:35 2010 +0100

    pacmd: store away fd type

diff --git a/src/utils/pacmd.c b/src/utils/pacmd.c
index 6ffe94f..c173ccc 100644
--- a/src/utils/pacmd.c
+++ b/src/utils/pacmd.c
@@ -61,6 +61,7 @@ int main(int argc, char*argv[]) {
     char *cli;
     pa_bool_t ibuf_eof, obuf_eof, ibuf_closed, obuf_closed;
     struct pollfd pollfd[N_WATCH];
+    int stdin_type = 0, stdout_type = 0, fd_type = 0;
 
     setlocale(LC_ALL, "");
     bindtextdomain(GETTEXT_PACKAGE, PULSE_LOCALEDIR);
@@ -166,7 +167,7 @@ int main(int argc, char*argv[]) {
             ssize_t r;
             pa_assert(!ibuf_length);
 
-            if ((r = pa_read(STDIN_FILENO, ibuf, sizeof(ibuf), NULL)) <= 0) {
+            if ((r = pa_read(STDIN_FILENO, ibuf, sizeof(ibuf), &stdin_type)) <= 0) {
                 if (r < 0) {
                     pa_log(_("read(): %s"), strerror(errno));
                     goto fail;
@@ -183,7 +184,7 @@ int main(int argc, char*argv[]) {
             ssize_t r;
             pa_assert(!obuf_length);
 
-            if ((r = pa_read(fd, obuf, sizeof(obuf), NULL)) <= 0) {
+            if ((r = pa_read(fd, obuf, sizeof(obuf), &fd_type)) <= 0) {
                 if (r < 0) {
                     pa_log(_("read(): %s"), strerror(errno));
                     goto fail;
@@ -203,7 +204,7 @@ int main(int argc, char*argv[]) {
             ssize_t r;
             pa_assert(obuf_length);
 
-            if ((r = pa_write(STDOUT_FILENO, obuf + obuf_index, obuf_length, NULL)) < 0) {
+            if ((r = pa_write(STDOUT_FILENO, obuf + obuf_index, obuf_length, &stdout_type)) < 0) {
                 pa_log(_("write(): %s"), strerror(errno));
                 goto fail;
             }
@@ -219,7 +220,7 @@ int main(int argc, char*argv[]) {
             ssize_t r;
             pa_assert(ibuf_length);
 
-            if ((r = pa_write(fd, ibuf + ibuf_index, ibuf_length, NULL)) < 0) {
+            if ((r = pa_write(fd, ibuf + ibuf_index, ibuf_length, &fd_type)) < 0) {
                 pa_log(_("write(): %s"), strerror(errno));
                 goto fail;
             }

commit c2079d792c0eb8d2cbb8fdfcfc58302842a0a2d2
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 19 03:29:36 2010 +0100

    shm: don't complain about missing SHM segments
    
    If two clients try to cleanup the SHM directory at the same time, they
    might want to open and then delete the same segment at the same time, in
    which case one client might win, the other one lose. In this case, don't
    warn about ENOENT.

diff --git a/src/pulsecore/shm.c b/src/pulsecore/shm.c
index 29849d5..5d5d85a 100644
--- a/src/pulsecore/shm.c
+++ b/src/pulsecore/shm.c
@@ -290,7 +290,7 @@ int pa_shm_attach_ro(pa_shm *m, unsigned id) {
     segment_name(fn, sizeof(fn), m->id = id);
 
     if ((fd = shm_open(fn, O_RDONLY, 0)) < 0) {
-        if (errno != EACCES)
+        if (errno != EACCES && errno != ENOENT)
             pa_log("shm_open() failed: %s", pa_cstrerror(errno));
         goto fail;
     }

commit 57e0e2cdab5ad59f570d2c476b7329047c03ae85
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 19 03:31:46 2010 +0100

    vala: fix definition of INVALID_INDEX

diff --git a/vala/libpulse.vapi b/vala/libpulse.vapi
index 9e05b14..b02bb56 100644
--- a/vala/libpulse.vapi
+++ b/vala/libpulse.vapi
@@ -46,7 +46,7 @@ namespace PulseAudio {
         [CCode (cname="PA_CHECK_VERSION")]
         public bool CHECK_VERSION(int major, int minor, int micro);
 
-        [CCode (cname="INVALID_INDEX")]
+        [CCode (cname="PA_INVALID_INDEX")]
         public const uint32 INVALID_INDEX;
 
         [CCode (cname="pa_free_cb_t")]

commit c25665ed10d6cebaa3d0c6d0ce1e620b01ff8ae9
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 19 03:32:00 2010 +0100

    vala: fix definition of the GLib mainloop adapter

diff --git a/vala/libpulse.vapi b/vala/libpulse.vapi
index b02bb56..d47ef73 100644
--- a/vala/libpulse.vapi
+++ b/vala/libpulse.vapi
@@ -879,11 +879,11 @@ namespace PulseAudio {
         }
 
         [Compact]
-        [CCode (cname="pa_glib_mainloop", cprefix="pa_glib_mainloop_", free_function="pa_glib_mainloop_free")]
+        [CCode (cheader_filename="pulse/glib-mainloop.h", cname="pa_glib_mainloop", cprefix="pa_glib_mainloop_", free_function="pa_glib_mainloop_free")]
         public class GLibMainLoop {
 
                 [CCode (cname="pa_glib_mainloop_new")]
-                public GLibMainLoop();
+                public GLibMainLoop(MainContext? c = null);
 
                 public unowned MainLoopApi get_api();
         }

commit 27427c114cb93f52bcea3bb8e7900d39b286a271
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sun Feb 21 16:19:40 2010 +0100

    channelmap: Use "Subwoofer" as pretty name for LFE
    
    The pretty name is suspposed to be understandable by non-technical
    folks, and they are generally more used to the term "Subwoofer" than
    "Low Frequency Emitter", so let's change the name here.

diff --git a/src/pulse/channelmap.c b/src/pulse/channelmap.c
index 9b51626..83fdb43 100644
--- a/src/pulse/channelmap.c
+++ b/src/pulse/channelmap.c
@@ -112,7 +112,7 @@ const char *const pretty_table[PA_CHANNEL_POSITION_MAX] = {
     [PA_CHANNEL_POSITION_REAR_LEFT] = N_("Rear Left"),
     [PA_CHANNEL_POSITION_REAR_RIGHT] = N_("Rear Right"),
 
-    [PA_CHANNEL_POSITION_LFE] = N_("Low Frequency Emmiter"),
+    [PA_CHANNEL_POSITION_LFE] = N_("Subwoofer"),
 
     [PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER] = N_("Front Left-of-center"),
     [PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER] = N_("Front Right-of-center"),

commit 534def2d2b5d62c3ce85672d82d58223c7ea054d
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sun Feb 21 16:21:13 2010 +0100

    vala: fix wrapping of port setting calls

diff --git a/vala/libpulse.vapi b/vala/libpulse.vapi
index d47ef73..21c0f7c 100644
--- a/vala/libpulse.vapi
+++ b/vala/libpulse.vapi
@@ -1024,7 +1024,7 @@ namespace PulseAudio {
                 public Operation? suspend_sink_by_index(uint32 idx, bool suspend, SuccessCb? cb = null);
 
                 public Operation? set_sink_port_by_name(string name, string port, SuccessCb? cb = null);
-                public Operation? set_sink_port_by_index(string idx, string port, SuccessCb? cb = null);
+                public Operation? set_sink_port_by_index(uint32 idx, string port, SuccessCb? cb = null);
 
                 public Operation? get_source_info_by_name(string name, SourceInfoCb cb);
                 public Operation? get_source_info_by_index(uint32 idx, SourceInfoCb cb);
@@ -1039,7 +1039,7 @@ namespace PulseAudio {
                 public Operation? suspend_source_by_index(uint32 idx, bool suspend, SuccessCb? cb = null);
 
                 public Operation? set_source_port_by_name(string name, string port, SuccessCb? cb = null);
-                public Operation? set_source_port_by_index(string idx, string port, SuccessCb? cb = null);
+                public Operation? set_source_port_by_index(uint32 idx, string port, SuccessCb? cb = null);
 
                 public Operation? get_server_info(ServerInfoCb cb);
 

commit 7098d60b302c94f560ea1014b5079a346ba843b2
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sun Feb 21 16:21:43 2010 +0100

    proplist: explicitly mention a role 'test'

diff --git a/src/pulse/proplist.h b/src/pulse/proplist.h
index e3f0af0..5db3ada 100644
--- a/src/pulse/proplist.h
+++ b/src/pulse/proplist.h
@@ -59,7 +59,7 @@ PA_C_DECL_BEGIN
 /** 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", "a11y" */
+/** For streams: logic role of this media. One of the strings "video", "music", "game", "event", "phone", "animation", "production", "a11y", "test" */
 #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") */

commit 857ff2c160c19699ecc541767ac443fa61456cb5
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sun Feb 21 16:22:17 2010 +0100

    stream-restore: be a little bit more verbose why we don't reastore a sink

diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index 64a7fd3..c16a74c 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -1278,7 +1278,7 @@ static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_n
         return PA_HOOK_OK;
 
     if (new_data->sink)
-        pa_log_debug("Not restoring device for stream %s, because already set.", name);
+        pa_log_debug("Not restoring device for stream %s, because already set to '%s'.", name, new_data->sink->name);
     else if ((e = read_entry(u, name))) {
         pa_sink *s = NULL;
 

commit 3f1c90b9d7fa434ae90b45018255d086b0fa6e8a
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sun Feb 21 16:23:25 2010 +0100

    sample-cache: use the sample name as unmodified fallback in the properties when playing a sample from the cache

diff --git a/src/pulsecore/core-scache.c b/src/pulsecore/core-scache.c
index 1fb81d0..95aaa10 100644
--- a/src/pulsecore/core-scache.c
+++ b/src/pulsecore/core-scache.c
@@ -310,7 +310,8 @@ int pa_scache_play_item(pa_core *c, const char *name, pa_sink *sink, pa_volume_t
         return -1;
 
     merged = pa_proplist_new();
-    pa_proplist_setf(merged, PA_PROP_MEDIA_NAME, "Sample %s", name);
+    pa_proplist_sets(merged, PA_PROP_MEDIA_NAME, name);
+    pa_proplist_sets(merged, PA_PROP_EVENT_ID, name);
 
     if (e->lazy && !e->memchunk.memblock) {
         pa_channel_map old_channel_map = e->channel_map;

commit ea29b11097b9d4180582924ca5df142fae4b6400
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sun Feb 21 17:35:05 2010 +0100

    scache: when playing a sample from the cache make sure not queue them up when the sink is suspended
    
    libcanberra already sets the appropriate flags for uncached sample
    streams, we now need to make sure to set them for cached samples too.

diff --git a/src/pulsecore/core-scache.c b/src/pulsecore/core-scache.c
index 95aaa10..0172419 100644
--- a/src/pulsecore/core-scache.c
+++ b/src/pulsecore/core-scache.c
@@ -351,7 +351,12 @@ int pa_scache_play_item(pa_core *c, const char *name, pa_sink *sink, pa_volume_t
     if (p)
         pa_proplist_update(merged, PA_UPDATE_REPLACE, p);
 
-    if (pa_play_memchunk(sink, &e->sample_spec, &e->channel_map, &e->memchunk, pass_volume ? &r : NULL, merged, sink_input_idx) < 0)
+    if (pa_play_memchunk(sink,
+                         &e->sample_spec, &e->channel_map,
+                         &e->memchunk,
+                         pass_volume ? &r : NULL,
+                         merged,
+                         PA_SINK_INPUT_NO_CREATE_ON_SUSPEND|PA_SINK_INPUT_KILL_ON_SUSPEND, sink_input_idx) < 0)
         goto fail;
 
     pa_proplist_free(merged);
diff --git a/src/pulsecore/play-memblockq.c b/src/pulsecore/play-memblockq.c
index f528c49..0d6da3e 100644
--- a/src/pulsecore/play-memblockq.c
+++ b/src/pulsecore/play-memblockq.c
@@ -173,7 +173,8 @@ pa_sink_input* pa_memblockq_sink_input_new(
         const pa_channel_map *map,
         pa_memblockq *q,
         pa_cvolume *volume,
-        pa_proplist *p) {
+        pa_proplist *p,
+        pa_sink_input_flags_t flags) {
 
     memblockq_stream *u = NULL;
     pa_sink_input_new_data data;
@@ -198,6 +199,7 @@ pa_sink_input* pa_memblockq_sink_input_new(
     pa_sink_input_new_data_set_channel_map(&data, map);
     pa_sink_input_new_data_set_volume(&data, volume);
     pa_proplist_update(data.proplist, PA_UPDATE_REPLACE, p);
+    data.flags |= flags;
 
     pa_sink_input_new(&u->sink_input, sink->core, &data);
     pa_sink_input_new_data_done(&data);
@@ -237,6 +239,7 @@ int pa_play_memblockq(
         pa_memblockq *q,
         pa_cvolume *volume,
         pa_proplist *p,
+        pa_sink_input_flags_t flags,
         uint32_t *sink_input_index) {
 
     pa_sink_input *i;
@@ -245,7 +248,7 @@ int pa_play_memblockq(
     pa_assert(ss);
     pa_assert(q);
 
-    if (!(i = pa_memblockq_sink_input_new(sink, ss, map, q, volume, p)))
+    if (!(i = pa_memblockq_sink_input_new(sink, ss, map, q, volume, p, flags)))
         return -1;
 
     pa_sink_input_put(i);
diff --git a/src/pulsecore/play-memblockq.h b/src/pulsecore/play-memblockq.h
index 9d5f40f..a55fed0 100644
--- a/src/pulsecore/play-memblockq.h
+++ b/src/pulsecore/play-memblockq.h
@@ -31,17 +31,19 @@ pa_sink_input* pa_memblockq_sink_input_new(
         const pa_channel_map *map,
         pa_memblockq *q,
         pa_cvolume *volume,
-        pa_proplist *p);
+        pa_proplist *p,
+        pa_sink_input_flags_t flags);
 
 void pa_memblockq_sink_input_set_queue(pa_sink_input *i, pa_memblockq *q);
 
 int pa_play_memblockq(
-    pa_sink *sink,
-    const pa_sample_spec *ss,
-    const pa_channel_map *map,
-    pa_memblockq *q,
-    pa_cvolume *cvolume,
-    pa_proplist *p,
-    uint32_t *sink_input_index);
+        pa_sink *sink,
+        const pa_sample_spec *ss,
+        const pa_channel_map *map,
+        pa_memblockq *q,
+        pa_cvolume *cvolume,
+        pa_proplist *p,
+        pa_sink_input_flags_t flags,
+        uint32_t *sink_input_index);
 
 #endif
diff --git a/src/pulsecore/play-memchunk.c b/src/pulsecore/play-memchunk.c
index 1a3bd5b..6fb8902 100644
--- a/src/pulsecore/play-memchunk.c
+++ b/src/pulsecore/play-memchunk.c
@@ -43,6 +43,7 @@ int pa_play_memchunk(
         const pa_memchunk *chunk,
         pa_cvolume *volume,
         pa_proplist *p,
+        pa_sink_input_flags_t flags,
         uint32_t *sink_input_index) {
 
     pa_memblockq *q;
@@ -59,7 +60,7 @@ int pa_play_memchunk(
 
     pa_assert_se(pa_memblockq_push(q, chunk) >= 0);
 
-    if ((r = pa_play_memblockq(sink, ss, map, q, volume, p, sink_input_index)) < 0) {
+    if ((r = pa_play_memblockq(sink, ss, map, q, volume, p, flags, sink_input_index)) < 0) {
         pa_memblockq_free(q);
         return r;
     }
diff --git a/src/pulsecore/play-memchunk.h b/src/pulsecore/play-memchunk.h
index c813611..068add1 100644
--- a/src/pulsecore/play-memchunk.h
+++ b/src/pulsecore/play-memchunk.h
@@ -26,12 +26,13 @@
 #include <pulsecore/memchunk.h>
 
 int pa_play_memchunk(
-    pa_sink *sink,
-    const pa_sample_spec *ss,
-    const pa_channel_map *map,
-    const pa_memchunk *chunk,
-    pa_cvolume *cvolume,
-    pa_proplist *p,
-    uint32_t *sink_input_index);
+        pa_sink *sink,
+        const pa_sample_spec *ss,
+        const pa_channel_map *map,
+        const pa_memchunk *chunk,
+        pa_cvolume *cvolume,
+        pa_proplist *p,
+        pa_sink_input_flags_t flags,
+        uint32_t *sink_input_index);
 
 #endif

commit 83eb8afc5f9faaa4d17fce7dbde58b1863d9173c
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Jan 14 02:33:49 2010 +0100

    daemon: first take name on the bus, then return in starter process
    
    http://pulseaudio.org/ticket/748

diff --git a/src/daemon/main.c b/src/daemon/main.c
index 5ccda77..9bea2ae 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -1027,15 +1027,6 @@ int main(int argc, char *argv[]) {
      * from now on, if requested */
     c->disallow_module_loading = !!conf->disallow_module_loading;
 
-#ifdef HAVE_FORK
-    if (daemon_pipe[1] >= 0) {
-        int ok = 0;
-        pa_loop_write(daemon_pipe[1], &ok, sizeof(ok), NULL);
-        pa_close(daemon_pipe[1]);
-        daemon_pipe[1] = -1;
-    }
-#endif
-
 #ifdef HAVE_DBUS
     if (!conf->system_instance) {
         if (!(server_lookup = pa_dbusobj_server_lookup_new(c)))
@@ -1048,6 +1039,15 @@ int main(int argc, char *argv[]) {
         goto finish;
 #endif
 
+#ifdef HAVE_FORK
+    if (daemon_pipe[1] >= 0) {
+        int ok = 0;
+        pa_loop_write(daemon_pipe[1], &ok, sizeof(ok), NULL);
+        pa_close(daemon_pipe[1]);
+        daemon_pipe[1] = -1;
+    }
+#endif
+
     pa_log_info(_("Daemon startup complete."));
 
     retval = 0;

commit 609a005b77b5dc691271f48351bd39e3eecb7dc9
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 18 03:28:56 2010 +0100

    pacmd: don't enter busy loop when reading from stdin very early
    
    pointed out in:
    
    https://tango.0pointer.de/pipermail/pulseaudio-discuss/2010-January/006365.html

diff --git a/src/utils/pacmd.c b/src/utils/pacmd.c
index c173ccc..143a948 100644
--- a/src/utils/pacmd.c
+++ b/src/utils/pacmd.c
@@ -45,13 +45,6 @@
 
 int main(int argc, char*argv[]) {
 
-    enum {
-        WATCH_STDIN,
-        WATCH_STDOUT,
-        WATCH_SOCKET,
-        N_WATCH
-    };
-
     pid_t pid ;
     int fd = -1;
     int ret = 1, i;
@@ -60,7 +53,9 @@ int main(int argc, char*argv[]) {
     size_t ibuf_index, ibuf_length, obuf_index, obuf_length;
     char *cli;
     pa_bool_t ibuf_eof, obuf_eof, ibuf_closed, obuf_closed;
-    struct pollfd pollfd[N_WATCH];
+    struct pollfd pollfd[3];
+    struct pollfd *watch_socket, *watch_stdin, *watch_stdout;
+
     int stdin_type = 0, stdout_type = 0, fd_type = 0;
 
     setlocale(LC_ALL, "");
@@ -129,32 +124,53 @@ int main(int argc, char*argv[]) {
         ibuf_eof = TRUE;
     }
 
-    pa_zero(pollfd);
-
-    pollfd[WATCH_STDIN].fd = STDIN_FILENO;
-    pollfd[WATCH_STDOUT].fd = STDOUT_FILENO;
-    pollfd[WATCH_SOCKET].fd = fd;
-
     for (;;) {
+        struct pollfd *p;
+
         if (ibuf_eof &&
             obuf_eof &&
             ibuf_length <= 0 &&
             obuf_length <= 0)
             break;
 
-        pollfd[WATCH_STDIN].events = pollfd[WATCH_STDOUT].events = pollfd[WATCH_SOCKET].events = 0;
+        if (ibuf_length <= 0 && ibuf_eof && !ibuf_closed) {
+            shutdown(fd, SHUT_WR);
+            ibuf_closed = TRUE;
+        }
 
-        if (obuf_length > 0)
-            pollfd[WATCH_STDOUT].events |= POLLOUT;
-        else if (!obuf_eof)
-            pollfd[WATCH_SOCKET].events |= POLLIN;
+        if (obuf_length <= 0 && obuf_eof && !obuf_closed) {
+            shutdown(fd, SHUT_RD);
+            obuf_closed = TRUE;
+        }
+
+        pa_zero(pollfd);
+
+        p = pollfd;
 
-        if (ibuf_length > 0)
-            pollfd[WATCH_SOCKET].events |= POLLOUT;
-        else if (!ibuf_eof)
-            pollfd[WATCH_STDIN].events |= POLLIN;
+        if (ibuf_length > 0 || (!obuf_eof && obuf_length <= 0)) {
+            watch_socket = p++;
+            watch_socket->fd = fd;
+            watch_socket->events =
+                (ibuf_length > 0 ? POLLOUT : 0) |
+                (!obuf_eof && obuf_length <= 0 ? POLLIN : 0);
+        } else
+            watch_socket = NULL;
 
-        if (pa_poll(pollfd, N_WATCH, -1) < 0) {
+        if (!ibuf_eof && ibuf_length <= 0) {
+            watch_stdin = p++;
+            watch_stdin->fd = STDIN_FILENO;
+            watch_stdin->events = POLLIN;
+        } else
+            watch_stdin = NULL;
+
+        if (obuf_length > 0) {
+            watch_stdout = p++;
+            watch_stdout->fd = STDOUT_FILENO;
+            watch_stdout->events = POLLOUT;
+        } else
+            watch_stdout = NULL;
+
+        if (pa_poll(pollfd, p-pollfd, -1) < 0) {
 
             if (errno == EINTR)
                 continue;
@@ -163,82 +179,80 @@ int main(int argc, char*argv[]) {
             goto fail;
         }
 
-        if (pollfd[WATCH_STDIN].revents & POLLIN) {
-            ssize_t r;
-            pa_assert(!ibuf_length);
-
-            if ((r = pa_read(STDIN_FILENO, ibuf, sizeof(ibuf), &stdin_type)) <= 0) {
-                if (r < 0) {
-                    pa_log(_("read(): %s"), strerror(errno));
-                    goto fail;
+        if (watch_stdin) {
+            if (watch_stdin->revents & POLLIN) {
+                ssize_t r;
+                pa_assert(ibuf_length <= 0);
+
+                if ((r = pa_read(STDIN_FILENO, ibuf, sizeof(ibuf), &stdin_type)) <= 0) {
+                    if (r < 0) {
+                        pa_log(_("read(): %s"), strerror(errno));
+                        goto fail;
+                    }
+
+                    ibuf_eof = TRUE;
+                } else {
+                    ibuf_length = (size_t) r;
+                    ibuf_index = 0;
                 }
-
+            } else if (watch_stdin->revents & POLLHUP)
                 ibuf_eof = TRUE;
-            } else {
-                ibuf_length = (size_t) r;
-                ibuf_index = 0;
-            }
         }
 
-        if (pollfd[WATCH_SOCKET].revents & POLLIN) {
-            ssize_t r;
-            pa_assert(!obuf_length);
-
-            if ((r = pa_read(fd, obuf, sizeof(obuf), &fd_type)) <= 0) {
-                if (r < 0) {
-                    pa_log(_("read(): %s"), strerror(errno));
-                    goto fail;
+        if (watch_socket) {
+            if (watch_socket->revents & POLLIN) {
+                ssize_t r;
+                pa_assert(obuf_length <= 0);
+
+                if ((r = pa_read(fd, obuf, sizeof(obuf), &fd_type)) <= 0) {
+                    if (r < 0) {
+                        pa_log(_("read(): %s"), strerror(errno));
+                        goto fail;
+                    }
+
+                    obuf_eof = TRUE;
+                } else {
+                    obuf_length = (size_t) r;
+                    obuf_index = 0;
                 }
-
+            } else if (watch_socket->revents & POLLHUP)
                 obuf_eof = TRUE;
-            } else {
-                obuf_length = (size_t) r;
-                obuf_index = 0;
-            }
         }
 
-        if (pollfd[WATCH_STDOUT].revents & POLLHUP) {
-            obuf_eof = TRUE;
-            obuf_length = 0;
-        } else if (pollfd[WATCH_STDOUT].revents & POLLOUT) {
-            ssize_t r;
-            pa_assert(obuf_length);
-
-            if ((r = pa_write(STDOUT_FILENO, obuf + obuf_index, obuf_length, &stdout_type)) < 0) {
-                pa_log(_("write(): %s"), strerror(errno));
-                goto fail;
-            }
-
-            obuf_length -= (size_t) r;
-            obuf_index += obuf_index;
-        }
+        if (watch_stdout) {
+            if (watch_stdout->revents & POLLHUP) {
+                obuf_eof = TRUE;
+                obuf_length = 0;
+            } else if (watch_stdout->revents & POLLOUT) {
+                ssize_t r;
+                pa_assert(obuf_length > 0);
 
-        if (pollfd[WATCH_SOCKET].revents & POLLHUP) {
-            ibuf_eof = TRUE;
-            ibuf_length = 0;
-        } if (pollfd[WATCH_SOCKET].revents & POLLOUT) {
-            ssize_t r;
-            pa_assert(ibuf_length);
+                if ((r = pa_write(STDOUT_FILENO, obuf + obuf_index, obuf_length, &stdout_type)) < 0) {
+                    pa_log(_("write(): %s"), strerror(errno));
+                    goto fail;
+                }
 
-            if ((r = pa_write(fd, ibuf + ibuf_index, ibuf_length, &fd_type)) < 0) {
-                pa_log(_("write(): %s"), strerror(errno));
-                goto fail;
+                obuf_length -= (size_t) r;
+                obuf_index += obuf_index;
             }
-
-            ibuf_length -= (size_t) r;
-            ibuf_index += obuf_index;
         }
 
-        if (ibuf_length <= 0 && ibuf_eof && !ibuf_closed) {
-            pa_close(STDIN_FILENO);
-            shutdown(fd, SHUT_WR);
-            ibuf_closed = TRUE;
-        }
+        if (watch_socket) {
+            if (watch_socket->revents & POLLHUP) {
+                ibuf_eof = TRUE;
+                ibuf_length = 0;
+            } if (watch_socket->revents & POLLOUT) {
+                ssize_t r;
+                pa_assert(ibuf_length > 0);
 
-        if (obuf_length <= 0 && obuf_eof && !obuf_closed) {
-            shutdown(fd, SHUT_RD);
-            pa_close(STDOUT_FILENO);
-            obuf_closed = TRUE;
+                if ((r = pa_write(fd, ibuf + ibuf_index, ibuf_length, &fd_type)) < 0) {
+                    pa_log(_("write(): %s"), strerror(errno));
+                    goto fail;
+                }
+
+                ibuf_length -= (size_t) r;
+                ibuf_index += obuf_index;
+            }
         }
     }
 

commit 2b2149dc9d6b2010a9acd4d05ec4e331e710fd25
Author: Daniel T Chen <crimsun at ubuntu.com>
Date:   Fri Feb 19 00:23:17 2010 -0500

    build-sys: Add missing profile and alsa-mixer/paths to src/Makefile.am
    
    Commits e8cb96c and 0c836aa created mixer paths but did not update
    src/Makefile.am.  Building a snapshot containing these two commits
    therefore results in the user being unable to adjust the volume or
    (un)mute through PA.  Fix this by adding the two new mixer paths
    files to src/Makefile.am.
    
    Likewise, commit 66e1a2d created a profile for the M-Audio FastTrack
    Pro USB but did not update src/Makefile.am.  Fix this by adding the
    profile to src/Makefile.am.

diff --git a/src/Makefile.am b/src/Makefile.am
index 3268137..01ec1a5 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1095,6 +1095,7 @@ modlibexec_LTLIBRARIES += \
 
 dist_alsaprofilesets_DATA = \
 		modules/alsa/mixer/profile-sets/default.conf \
+		modules/alsa/mixer/profile-sets/maudio-fasttrack-pro.conf \
 		modules/alsa/mixer/profile-sets/native-instruments-audio4dj.conf \
 		modules/alsa/mixer/profile-sets/native-instruments-audio8dj.conf
 
@@ -1108,6 +1109,7 @@ dist_alsapaths_DATA = \
 		modules/alsa/mixer/paths/analog-input.conf \
 		modules/alsa/mixer/paths/analog-input.conf.common \
 		modules/alsa/mixer/paths/analog-input-fm.conf \
+		modules/alsa/mixer/paths/analog-input-internal-mic.conf \
 		modules/alsa/mixer/paths/analog-input-linein.conf \
 		modules/alsa/mixer/paths/analog-input-mic.conf \
 		modules/alsa/mixer/paths/analog-input-mic.conf.common \
@@ -1117,6 +1119,7 @@ dist_alsapaths_DATA = \
 		modules/alsa/mixer/paths/analog-output.conf \
 		modules/alsa/mixer/paths/analog-output-speaker.conf \
 		modules/alsa/mixer/paths/analog-output.conf.common \
+		modules/alsa/mixer/paths/analog-output-desktop-speaker.conf \
 		modules/alsa/mixer/paths/analog-output-headphones.conf \
 		modules/alsa/mixer/paths/analog-output-headphones-2.conf \
 		modules/alsa/mixer/paths/analog-output-lfe-on-mono.conf \

commit 323f0ad4034bf37b8c2002a8ee8efab22db5b140
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sun Feb 21 20:11:23 2010 +0100

    build-sys: fix check for pthread_setaffinity_np()

diff --git a/configure.ac b/configure.ac
index d23e09e..c277f6e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -402,6 +402,7 @@ AC_SEARCH_LIBS([dlopen], [dl])
 AC_SEARCH_LIBS([shm_open], [rt])
 AC_SEARCH_LIBS([inet_ntop], [nsl])
 AC_SEARCH_LIBS([timer_create], [rt])
+AC_SEARCH_LIBS([pthread_setaffinity_np], [pthread])
 
 # BSD
 AC_SEARCH_LIBS([connect], [socket])
diff --git a/src/tests/once-test.c b/src/tests/once-test.c
index 5b55532..37f3ac3 100644
--- a/src/tests/once-test.c
+++ b/src/tests/once-test.c
@@ -36,7 +36,6 @@ static pa_once once = PA_ONCE_INIT;
 static volatile unsigned n_run = 0;
 static const char * volatile ran_by = NULL;
 static pthread_barrier_t barrier;
-static pa_atomic_t i_cpu = PA_ATOMIC_INIT(0);
 static unsigned n_cpu;
 
 #define N_ITERATIONS 500
@@ -51,6 +50,7 @@ static void thread_func(void *data) {
     int r;
 
 #ifdef HAVE_PTHREAD_SETAFFINITY_NP
+    static pa_atomic_t i_cpu = PA_ATOMIC_INIT(0);
     cpu_set_t mask;
 
     CPU_ZERO(&mask);

commit edf5f5be6bf5b4c4b7188b4691caebd4db233788
Author: João Paulo Rechi Vita <jprvita at profusion.mobi>
Date:   Fri Jan 29 10:59:33 2010 -0200

    bluetooth: improve dbus logging

diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
index b2c0429..7b0e6f8 100644
--- a/src/modules/bluetooth/bluetooth-util.c
+++ b/src/modules/bluetooth/bluetooth-util.c
@@ -293,9 +293,10 @@ static int parse_audio_property(pa_bluetooth_discovery *u, int *state, DBusMessa
             const char *value;
             dbus_message_iter_get_basic(&variant_i, &value);
 
-            if (pa_streq(key, "State"))
+            if (pa_streq(key, "State")) {
                 *state = pa_bt_audio_state_from_string(value);
-/*             pa_log_debug("Value %s", value); */
+                pa_log_debug("dbus: property 'State' changed to value '%s'", value);
+            }
 
             break;
         }

commit 342e06498f9720d9198b006fc0f3a51c21a0c95c
Author: João Paulo Rechi Vita <jprvita at profusion.mobi>
Date:   Fri Jan 29 11:01:31 2010 -0200

    bluetooth: add HFP Gateway support
    
    Create the 'Handsfree Gateway' profile for bluetooth cards and add
    filters for 'org.bluez.HandsfreeGateway' to the discover module so
    module-bluetooth-device is loaded with the correct profile when a
    Handsfree Gateway connects to bluetoothd (in this case bluetoothd
    is acting as the headset).

diff --git a/src/modules/bluetooth/bluetooth-util.c b/src/modules/bluetooth/bluetooth-util.c
index 7b0e6f8..c3b08ea 100644
--- a/src/modules/bluetooth/bluetooth-util.c
+++ b/src/modules/bluetooth/bluetooth-util.c
@@ -98,6 +98,7 @@ static pa_bluetooth_device* device_new(const char *path) {
     d->audio_sink_state = PA_BT_AUDIO_STATE_INVALID;
     d->audio_source_state = PA_BT_AUDIO_STATE_INVALID;
     d->headset_state = PA_BT_AUDIO_STATE_INVALID;
+    d->hfgw_state = PA_BT_AUDIO_STATE_INVALID;
 
     return d;
 }
@@ -123,11 +124,11 @@ static pa_bool_t device_is_audio(pa_bluetooth_device *d) {
     pa_assert(d);
 
     return
-        d->device_info_valid &&
+        d->device_info_valid && (d->hfgw_state != PA_BT_AUDIO_STATE_INVALID ||
         (d->audio_state != PA_BT_AUDIO_STATE_INVALID &&
          (d->audio_sink_state != PA_BT_AUDIO_STATE_INVALID ||
           d->audio_source_state != PA_BT_AUDIO_STATE_INVALID ||
-          d->headset_state != PA_BT_AUDIO_STATE_INVALID));
+          d->headset_state != PA_BT_AUDIO_STATE_INVALID)));
 }
 
 static int parse_device_property(pa_bluetooth_discovery *y, pa_bluetooth_device *d, DBusMessageIter *i) {
@@ -230,7 +231,10 @@ static int parse_device_property(pa_bluetooth_discovery *y, pa_bluetooth_device
                     PA_LLIST_PREPEND(pa_bluetooth_uuid, d->uuids, node);
 
                     /* Vudentz said the interfaces are here when the UUIDs are announced */
-                    if (strcasecmp(HSP_HS_UUID, value) == 0 || strcasecmp(HFP_HS_UUID, value) == 0) {
+                    if (strcasecmp(HSP_AG_UUID, value) == 0 || strcasecmp(HFP_AG_UUID, value) == 0) {
+                        pa_assert_se(m = dbus_message_new_method_call("org.bluez", d->path, "org.bluez.HandsfreeGateway", "GetProperties"));
+                        send_and_add_to_pending(y, d, m, get_properties_reply);
+                    } else if (strcasecmp(HSP_HS_UUID, value) == 0 || strcasecmp(HFP_HS_UUID, value) == 0) {
                         pa_assert_se(m = dbus_message_new_method_call("org.bluez", d->path, "org.bluez.Headset", "GetProperties"));
                         send_and_add_to_pending(y, d, m, get_properties_reply);
                     } else if (strcasecmp(A2DP_SINK_UUID, value) == 0) {
@@ -403,9 +407,14 @@ static void get_properties_reply(DBusPendingCall *pending, void *userdata) {
             }  else if (dbus_message_has_interface(p->message, "org.bluez.AudioSink")) {
                 if (parse_audio_property(y, &d->audio_sink_state, &dict_i) < 0)
                     goto finish;
+
             }  else if (dbus_message_has_interface(p->message, "org.bluez.AudioSource")) {
                 if (parse_audio_property(y, &d->audio_source_state, &dict_i) < 0)
                     goto finish;
+
+            }  else if (dbus_message_has_interface(p->message, "org.bluez.HandsfreeGateway")) {
+                if (parse_audio_property(y, &d->hfgw_state, &arg_i) < 0)
+                    goto finish;
             }
         }
 
@@ -633,6 +642,7 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us
                dbus_message_is_signal(m, "org.bluez.Headset", "PropertyChanged") ||
                dbus_message_is_signal(m, "org.bluez.AudioSink", "PropertyChanged") ||
                dbus_message_is_signal(m, "org.bluez.AudioSource", "PropertyChanged") ||
+               dbus_message_is_signal(m, "org.bluez.HandsfreeGateway", "PropertyChanged") ||
                dbus_message_is_signal(m, "org.bluez.Device", "PropertyChanged")) {
 
         pa_bluetooth_device *d;
@@ -660,9 +670,14 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us
             }  else if (dbus_message_has_interface(m, "org.bluez.AudioSink")) {
                 if (parse_audio_property(y, &d->audio_sink_state, &arg_i) < 0)
                     goto fail;
+
             }  else if (dbus_message_has_interface(m, "org.bluez.AudioSource")) {
                 if (parse_audio_property(y, &d->audio_source_state, &arg_i) < 0)
                     goto fail;
+
+            }  else if (dbus_message_has_interface(m, "org.bluez.HandsfreeGateway")) {
+                if (parse_audio_property(y, &d->hfgw_state, &arg_i) < 0)
+                    goto fail;
             }
 
             run_callback(y, d, FALSE);
@@ -679,6 +694,7 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us
             d->audio_sink_state = PA_BT_AUDIO_STATE_DISCONNECTED;
             d->audio_source_state = PA_BT_AUDIO_STATE_DISCONNECTED;
             d->headset_state = PA_BT_AUDIO_STATE_DISCONNECTED;
+            d->hfgw_state = PA_BT_AUDIO_STATE_DISCONNECTED;
 
             run_callback(y, d, FALSE);
         }
@@ -809,7 +825,9 @@ pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *c) {
                 "type='signal',sender='org.bluez',interface='org.bluez.Audio',member='PropertyChanged'",
                 "type='signal',sender='org.bluez',interface='org.bluez.Headset',member='PropertyChanged'",
                 "type='signal',sender='org.bluez',interface='org.bluez.AudioSink',member='PropertyChanged'",
-                "type='signal',sender='org.bluez',interface='org.bluez.AudioSource',member='PropertyChanged'", NULL) < 0) {
+                "type='signal',sender='org.bluez',interface='org.bluez.AudioSource',member='PropertyChanged'",
+                "type='signal',sender='org.bluez',interface='org.bluez.HandsfreeGateway',member='PropertyChanged'",
+                NULL) < 0) {
         pa_log("Failed to add D-Bus matches: %s", err.message);
         goto fail;
     }
@@ -863,7 +881,9 @@ void pa_bluetooth_discovery_unref(pa_bluetooth_discovery *y) {
                                "type='signal',sender='org.bluez',interface='org.bluez.Audio',member='PropertyChanged'",
                                "type='signal',sender='org.bluez',interface='org.bluez.Headset',member='PropertyChanged'",
                                "type='signal',sender='org.bluez',interface='org.bluez.AudioSink',member='PropertyChanged'",
-                               "type='signal',sender='org.bluez',interface='org.bluez.AudioSource',member='PropertyChanged'", NULL);
+                               "type='signal',sender='org.bluez',interface='org.bluez.AudioSource',member='PropertyChanged'",
+                               "type='signal',sender='org.bluez',interface='org.bluez.HandsfreeGateway',member='PropertyChanged'",
+                               NULL);
 
         if (y->filter_added)
             dbus_connection_remove_filter(pa_dbus_connection_get(y->connection), filter_cb, y);
diff --git a/src/modules/bluetooth/bluetooth-util.h b/src/modules/bluetooth/bluetooth-util.h
index e2a0c3d..9cee3de 100644
--- a/src/modules/bluetooth/bluetooth-util.h
+++ b/src/modules/bluetooth/bluetooth-util.h
@@ -89,6 +89,9 @@ struct pa_bluetooth_device {
 
     /* Headset state */
     pa_bt_audio_state_t headset_state;
+
+    /* HandsfreeGateway state */
+    pa_bt_audio_state_t hfgw_state;
 };
 
 pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *core);
diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index d6868b8..f9721d1 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -71,7 +71,7 @@ PA_MODULE_USAGE(
         "source_name=<name for the source> "
         "source_properties=<properties for the source> "
         "address=<address of the device> "
-        "profile=<a2dp|hsp> "
+        "profile=<a2dp|hsp|hfgw> "
         "rate=<sample rate> "
         "channels=<number of channels> "
         "path=<device object path> "
@@ -133,6 +133,7 @@ enum profile {
     PROFILE_A2DP,
     PROFILE_A2DP_SOURCE,
     PROFILE_HSP,
+    PROFILE_HFGW,
     PROFILE_OFF
 };
 
@@ -318,12 +319,12 @@ static int parse_caps(struct userdata *u, uint8_t seid, const struct bt_get_capa
     pa_log_debug("Payload size is %lu %lu", (unsigned long) bytes_left, (unsigned long) sizeof(*codec));
 
     if (((u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE) && codec->transport != BT_CAPABILITIES_TRANSPORT_A2DP) ||
-        (u->profile == PROFILE_HSP && codec->transport != BT_CAPABILITIES_TRANSPORT_SCO)) {
+        ((u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW) && codec->transport != BT_CAPABILITIES_TRANSPORT_SCO)) {
         pa_log_error("Got capabilities for wrong codec.");
         return -1;
     }
 
-    if (u->profile == PROFILE_HSP) {
+    if (u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW) {
 
         if (bytes_left <= 0 || codec->length != sizeof(u->hsp.pcm_capabilities))
             return -1;
@@ -401,7 +402,7 @@ static int get_caps(struct userdata *u, uint8_t seid) {
     if (u->profile == PROFILE_A2DP || u->profile == PROFILE_A2DP_SOURCE)
         msg.getcaps_req.transport = BT_CAPABILITIES_TRANSPORT_A2DP;
     else {
-        pa_assert(u->profile == PROFILE_HSP);
+        pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW);
         msg.getcaps_req.transport = BT_CAPABILITIES_TRANSPORT_SCO;
     }
     msg.getcaps_req.flags = u->auto_connect ? BT_FLAG_AUTOCONNECT : 0;
@@ -697,7 +698,7 @@ static int set_conf(struct userdata *u) {
         if (setup_a2dp(u) < 0)
             return -1;
     } else {
-        pa_assert(u->profile == PROFILE_HSP);
+        pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW);
 
         u->sample_spec.format = PA_SAMPLE_S16LE;
         u->sample_spec.channels = 1;
@@ -995,7 +996,7 @@ static int hsp_process_render(struct userdata *u) {
     int ret = 0;
 
     pa_assert(u);
-    pa_assert(u->profile == PROFILE_HSP);
+    pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW);
     pa_assert(u->sink);
 
     /* First, render some data */
@@ -1060,7 +1061,7 @@ static int hsp_process_push(struct userdata *u) {
     pa_memchunk memchunk;
 
     pa_assert(u);
-    pa_assert(u->profile == PROFILE_HSP);
+    pa_assert(u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW);
     pa_assert(u->source);
     pa_assert(u->read_smoother);
 
@@ -1434,7 +1435,7 @@ static void thread_func(void *userdata) {
             if (pollfd && (pollfd->revents & POLLIN)) {
                 int n_read;
 
-                if (u->profile == PROFILE_HSP)
+                if (u->profile == PROFILE_HSP || PROFILE_HFGW)
                     n_read = hsp_process_push(u);
                 else
                     n_read = a2dp_process_push(u);
@@ -1842,7 +1843,7 @@ static int add_source(struct userdata *u) {
         data.module = u->module;
         pa_source_new_data_set_sample_spec(&data, &u->sample_spec);
         pa_proplist_sets(data.proplist, "bluetooth.protocol", u->profile == PROFILE_A2DP_SOURCE ? "a2dp_source" : "hsp");
-        if (u->profile == PROFILE_HSP)
+        if ((u->profile == PROFILE_HSP) || (u->profile == PROFILE_HFGW))
             pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone");
         data.card = u->card;
         data.name = get_name("source", u->modargs, u->address, &b);
@@ -1870,8 +1871,10 @@ static int add_source(struct userdata *u) {
                                     pa_bytes_to_usec(u->block_size, &u->sample_spec));
     }
 
-    if (u->profile == PROFILE_HSP) {
+    if (u->profile == PROFILE_HSP || u->profile == PROFILE_HFGW)
         pa_proplist_sets(u->source->proplist, "bluetooth.nrec", (u->hsp.pcm_capabilities.flags & BT_PCM_FLAG_NREC) ? "1" : "0");
+
+    if (u->profile == PROFILE_HSP) {
         u->source->set_volume = source_set_volume_cb;
         u->source->n_volume_steps = 16;
     }
@@ -1959,12 +1962,14 @@ static int init_profile(struct userdata *u) {
         return -1;
 
     if (u->profile == PROFILE_A2DP ||
-        u->profile == PROFILE_HSP)
+        u->profile == PROFILE_HSP ||
+        u->profile == PROFILE_HFGW)
         if (add_sink(u) < 0)
             r = -1;
 
     if (u->profile == PROFILE_HSP ||
-        u->profile == PROFILE_A2DP_SOURCE)
+        u->profile == PROFILE_A2DP_SOURCE ||
+        u->profile == PROFILE_HFGW)
         if (add_source(u) < 0)
             r = -1;
 
@@ -2099,6 +2104,10 @@ static int card_set_profile(pa_card *c, pa_card_profile *new_profile) {
         pa_log_warn("A2DP is not connected, refused to switch profile");
         return -PA_ERR_IO;
     }
+    else if (device->hfgw_state <= PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HFGW) {
+        pa_log_warn("HandsfreeGateway is not connected, refused to switch profile");
+        return -PA_ERR_IO;
+    }
 
     if (u->sink) {
         inputs = pa_sink_move_all_start(u->sink, NULL);
@@ -2234,6 +2243,20 @@ static int add_card(struct userdata *u, const pa_bluetooth_device *device) {
         pa_hashmap_put(data.profiles, p->name, p);
     }
 
+    if (pa_bluetooth_uuid_has(device->uuids, HFP_AG_UUID)) {
+        p = pa_card_profile_new("hfgw", _("Handsfree Gateway"), sizeof(enum profile));
+        p->priority = 20;
+        p->n_sinks = 1;
+        p->n_sources = 1;
+        p->max_sink_channels = 1;
+        p->max_source_channels = 1;
+
+        d = PA_CARD_PROFILE_DATA(p);
+        *d = PROFILE_HFGW;
+
+        pa_hashmap_put(data.profiles, p->name, p);
+    }
+
     pa_assert(!pa_hashmap_isempty(data.profiles));
 
     p = pa_card_profile_new("off", _("Off"), sizeof(enum profile));
@@ -2262,7 +2285,8 @@ static int add_card(struct userdata *u, const pa_bluetooth_device *device) {
     d = PA_CARD_PROFILE_DATA(u->card->active_profile);
 
     if ((device->headset_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HSP) ||
-        (device->audio_sink_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP)) {
+        (device->audio_sink_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_A2DP) ||
+        (device->hfgw_state < PA_BT_AUDIO_STATE_CONNECTED && *d == PROFILE_HFGW)) {
         pa_log_warn("Default profile not connected, selecting off profile");
         u->card->active_profile = pa_hashmap_get(u->card->profiles, "off");
         u->card->save_profile = FALSE;
diff --git a/src/modules/bluetooth/module-bluetooth-discover.c b/src/modules/bluetooth/module-bluetooth-discover.c
index 0085fa8..fd34c6f 100644
--- a/src/modules/bluetooth/module-bluetooth-discover.c
+++ b/src/modules/bluetooth/module-bluetooth-discover.c
@@ -83,8 +83,10 @@ static pa_hook_result_t load_module_for_device(pa_bluetooth_discovery *y, const
 
     mi = pa_hashmap_get(u->hashmap, d->path);
 
-    if (!d->dead &&
-        d->device_connected > 0 && (d->audio_state >= PA_BT_AUDIO_STATE_CONNECTED || d->audio_source_state >= PA_BT_AUDIO_STATE_CONNECTED)) {
+    if (!d->dead && d->device_connected > 0 &&
+        (d->audio_state >= PA_BT_AUDIO_STATE_CONNECTED ||
+         d->audio_source_state >= PA_BT_AUDIO_STATE_CONNECTED ||
+         d->hfgw_state > PA_BT_AUDIO_STATE_CONNECTED)) {
 
         if (!mi) {
             pa_module *m = NULL;
@@ -119,6 +121,9 @@ static pa_hook_result_t load_module_for_device(pa_bluetooth_discovery *y, const
             if (d->audio_source_state >= PA_BT_AUDIO_STATE_CONNECTED)
                 args = pa_sprintf_malloc("%s profile=\"a2dp_source\" auto_connect=no", args);
 
+            if (d->hfgw_state > PA_BT_AUDIO_STATE_CONNECTED)
+                args = pa_sprintf_malloc("%s profile=\"hfgw\"", args);
+
             pa_log_debug("Loading module-bluetooth-device %s", args);
             m = pa_module_load(u->module->core, "module-bluetooth-device", args);
             pa_xfree(args);

commit 0a7fccdb3d6bf63448d491727316e033ae235b58
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sun Feb 21 21:09:26 2010 +0100

    pacat: pass buffer_attr to recording streams too
    
    Pointed out by Colin Guthrie.
    
    https://tango.0pointer.de/pipermail/pulseaudio-discuss/2010-February/006698.html

diff --git a/src/utils/pacat.c b/src/utils/pacat.c
index 75ccd9a..6cbff2e 100644
--- a/src/utils/pacat.c
+++ b/src/utils/pacat.c
@@ -473,7 +473,7 @@ static void context_state_callback(pa_context *c, void *userdata) {
                 }
 
             } else {
-                if (pa_stream_connect_record(stream, device, latency > 0 ? &buffer_attr : NULL, flags) < 0) {
+                if (pa_stream_connect_record(stream, device, &buffer_attr, flags) < 0) {
                     pa_log(_("pa_stream_connect_record() failed: %s"), pa_strerror(pa_context_errno(c)));
                     goto fail;
                 }

commit 5c13d86746f3e77e1deb0d78450b349ff29eb866
Author: warrink <warrink at fedoraproject.org>
Date:   Wed Sep 30 14:48:45 2009 +0000

    Sending translation for Dutch

diff --git a/po/nl.po b/po/nl.po
index cf07e8a..0506e66 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-11 19:58+0200\n"
+"POT-Creation-Date: 2009-09-30 09:44+0000\n"
+"PO-Revision-Date: 2009-09-30 16:47+0200\n"
 "Last-Translator: Geert Warrink <geert.warrink at onsnet.nu>\n"
 "Language-Team: nl <nl at li.org>\n"
 "MIME-Version: 1.0\n"
@@ -2382,131 +2382,122 @@ msgstr "PulseAudio geluids server"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "Output apparaten"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "Input apparaten"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "Geluid op @HOSTNAME@"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "Input"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "Docking station input"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "Docking station microfoon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "Lijn-in"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "Microfoon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "Externe microfoon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "Intern geluid"
+msgstr "Interne microfoon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "Radio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "Video"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "Automatische volume controle"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "Geen automatische volume controle"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "Boostversterking"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "Geen boostversterking"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "Versterker"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "Geen versterker"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
-#, fuzzy
 msgid "Analog Input"
-msgstr "Analoog mono"
+msgstr "Analoge input"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
-#, fuzzy
 msgid "Analog Microphone"
-msgstr "Analoog mono"
+msgstr "Analoge microfoon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
-#, fuzzy
 msgid "Analog Line-In"
-msgstr "Analoog mono"
+msgstr "Analoge lijn-in"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
-#, fuzzy
 msgid "Analog Radio"
-msgstr "Analoog mono"
+msgstr "Analoge radio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
-#, fuzzy
 msgid "Analog Video"
-msgstr "Analoog stereo"
+msgstr "Analoge video"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "Null output"
+msgstr "Analoge output"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
-#, fuzzy
 msgid "Analog Headphones"
-msgstr "Analoog mono"
+msgstr "Analoeg koptelefoon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "Analoge output (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
-#, fuzzy
 msgid "Analog Mono Output"
-msgstr "Analoog mono"
+msgstr "Analoge mono output"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s/%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
@@ -2517,19 +2508,16 @@ msgid "Analog Stereo"
 msgstr "Analoog stereo"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "Analoog surround 4.1"
+msgstr "Analoog surround 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "Analoog surround 4.0"
+msgstr "Analoog surround 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "Analoog surround 4.1"
+msgstr "Analoog surround 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Surround 4.0"
@@ -2548,19 +2536,16 @@ msgid "Analog Surround 5.1"
 msgstr "Analoog surround 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "Analoog surround 4.0"
+msgstr "Analoog surround 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "Analoog surround 4.1"
+msgstr "Analoog surround 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "Analoog surround 4.0"
+msgstr "Analoog surround 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 7.1"
@@ -2571,9 +2556,8 @@ msgid "Digital Stereo (IEC958)"
 msgstr "Digitaal stereo (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
-#, fuzzy
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr "Digitaal surround 4.0 (IEC958/AC3)"
+msgstr "Digitaal surround 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
@@ -2588,19 +2572,16 @@ msgid "Digital Stereo (HDMI)"
 msgstr "Digitaal stereo (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
-#, fuzzy
 msgid "Analog Mono Duplex"
-msgstr "Analoog mono"
+msgstr "Analoog mono duplex"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
-#, fuzzy
 msgid "Analog Stereo Duplex"
-msgstr "Analoog stereo"
+msgstr "Analoog stereo duplex"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
-#, fuzzy
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr "Digitaal stereo (IEC958)"
+msgstr "Digitaal stereo duplex (IEC958)"
 
 #, fuzzy
 #~ msgid "Invalid client name '%s'\n"

commit 0a7086d8ea594644c4c4d03c2e287bc3c6afd407
Author: raven <raven at fedoraproject.org>
Date:   Wed Sep 30 15:05:36 2009 +0000

    Sending translation for Polish

diff --git a/po/pl.po b/po/pl.po
index 7daafda..5d7f3a0 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -5,8 +5,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pl\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-27 15:42+0200\n"
+"POT-Creation-Date: 2009-09-30 09:44+0000\n"
+"PO-Revision-Date: 2009-09-30 17:04+0200\n"
 "Last-Translator: Piotr DrÄ…g <piotrdrag at gmail.com>\n"
 "Language-Team: Polish <fedora-trans-pl at redhat.com>\n"
 "MIME-Version: 1.0\n"
@@ -2377,217 +2377,203 @@ msgstr "Serwer dźwięku PulseAudio"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "Urządzenia wyjściowe"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "Urządzenia wejściowe"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "Dźwięk na @HOSTNAME@"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "Wejście"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "Wejście stacji dokującej"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "Mikrofon stacji dokujÄ…cej"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "Wejście liniowe"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "Mikrofon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "Zewnętrzny mikrofon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "Wewnętrzny dźwięk"
+msgstr "Wewnętrzny mikrofon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "Radio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "Wideo"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "Automatyczna kontrola natężenia"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "Brak automatycznej kontroli natężenia"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "Podbicie"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "Brak podbicia"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "Amplituner"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "Brak amplitunera"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "Wejście analogowe"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "Mikrofon analogowy"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "Analogowe wejście liniowe"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "Radio analogowe"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "Wideo analogowe"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "Puste wyjście"
+msgstr "Wyjście analogowe"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "SÅ‚uchawki analogowe"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "Wyjście analogowe (subwoofer)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "Analogowe wyjście mono"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s/%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "Analogowe mono"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
-#, fuzzy
 msgid "Analog Stereo"
-msgstr "Stereo"
+msgstr "Analogowe stereo"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "Surround 4.1"
+msgstr "Analogowe surround 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "Surround 4.0"
+msgstr "Analogowe surround 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "Surround 4.1"
+msgstr "Analogowe surround 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
-#, fuzzy
 msgid "Analog Surround 4.0"
-msgstr "Surround 4.0"
+msgstr "Analogowe surround 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
-#, fuzzy
 msgid "Analog Surround 4.1"
-msgstr "Surround 4.1"
+msgstr "Analogowe surround 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
-#, fuzzy
 msgid "Analog Surround 5.0"
-msgstr "Surround 5.0"
+msgstr "Analogowe surround 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
-#, fuzzy
 msgid "Analog Surround 5.1"
-msgstr "Surround 5.1"
+msgstr "Analogowe surround 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "Surround 4.0"
+msgstr "Analogowe surround 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "Surround 4.1"
+msgstr "Analogowe surround 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "Surround 4.0"
+msgstr "Analogowe surround 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
-#, fuzzy
 msgid "Analog Surround 7.1"
-msgstr "Surround 7.1"
+msgstr "Analogowe surround 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "Cyfrowe stereo (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "Cyfrowe surround 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "Cyfrowe surround 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "Cyfrowe surround 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "Cyfrowe stereo (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "Analogowy dupleks mono"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "Analogowy dupleks stereo"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "Cyfrowy dupleks stereo (IEC958)"

commit 4c2adfc44c222b2d0be21b143473af82ceb04b9e
Author: pmkovar <pmkovar at fedoraproject.org>
Date:   Wed Sep 30 18:43:00 2009 +0000

    Sending translation for Czech

diff --git a/po/cs.po b/po/cs.po
index 4b9c4a6..3660685 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -6,14 +6,15 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-09 02:43+0100\n"
+"POT-Creation-Date: 2009-09-30 09:44+0000\n"
+"PO-Revision-Date: 2009-09-30 20:33+0200\n"
 "Last-Translator: Petr Kovar <pknbe at volny.cz>\n"
 "Language-Team: Czech <translation-team-cs at lists.sourceforge.net>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+"X-Generator: Lokalize 1.0\n"
 
 #: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
 #, c-format
@@ -61,11 +62,11 @@ msgstr ""
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr ""
+msgstr "Udržuje nahraný vždy alespoň jeden cíl, i když se jedná o \"null\""
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
-msgstr ""
+msgstr "Prázdný výstup"
 
 #: ../src/modules/module-ladspa-sink.c:49
 msgid "Virtual LADSPA sink"
@@ -87,12 +88,11 @@ msgstr ""
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
-msgstr ""
+msgstr "Taktovaný cíl NULL"
 
 #: ../src/modules/module-null-sink.c:291
-#, fuzzy
 msgid "Null Output"
-msgstr "Výstup %s"
+msgstr "Výstup \"null\""
 
 #: ../src/pulsecore/sink.c:2613
 msgid "Internal Audio"
@@ -1095,11 +1095,11 @@ msgstr "Klient rozvětven"
 
 #: ../src/pulse/error.c:68
 msgid "Input/Output error"
-msgstr ""
+msgstr "Chyba vstupu/výstupu"
 
 #: ../src/pulse/error.c:69
 msgid "Device or resource busy"
-msgstr ""
+msgstr "Zařízení nebo zdroj se používá"
 
 #: ../src/pulse/sample.c:172
 #, c-format
@@ -1308,10 +1308,9 @@ msgstr "Získán signál, ukončování."
 msgid "Failed to get latency: %s"
 msgstr "Nezdařilo se získat latenci: %s"
 
-#: ../src/utils/pacat.c:580
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:580, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
-msgstr "Čas: %0.3f sekund; latence: %0.0f μs.  \r"
+msgstr "Čas: %0.3f sekund; latence: %0.0f μs"
 
 #: ../src/utils/pacat.c:599
 #, c-format
@@ -2358,133 +2357,120 @@ msgstr "Zvukový server PulseAudio"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "Výstupní zařízení"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
-#, fuzzy
 msgid "Input Devices"
-msgstr "Vstup %s"
+msgstr "Vstupní zařízení"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "Zvuk na @HOSTNAME@"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
-#, fuzzy
 msgid "Input"
-msgstr "Vstup %s"
+msgstr "Vstup"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "Vstup dokovací stanice"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "Mikrofon dokovací stanice"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "Linkový vstup"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "Mikrofon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "Externí mikrofon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "Vnitřní zvukový systém"
+msgstr "Interní mikrofon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "Rádio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "Obraz"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "Automatické ovládání zesílení"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "Bez automatického ovládání zesílení"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "Zesílení"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "Bez zesílení"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "Zesilovač"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "Bez zesilovače"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
-#, fuzzy
 msgid "Analog Input"
-msgstr "Analogové mono"
+msgstr "Analogový vstup"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
-#, fuzzy
 msgid "Analog Microphone"
-msgstr "Analogové mono"
+msgstr "Analogový mikrofon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
-#, fuzzy
 msgid "Analog Line-In"
-msgstr "Analogové mono"
+msgstr "Analogový linkový vstup"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
-#, fuzzy
 msgid "Analog Radio"
-msgstr "Analogové mono"
+msgstr "Analogové rádio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
-#, fuzzy
 msgid "Analog Video"
-msgstr "Analogové stereo"
+msgstr "Analogový obraz"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "Výstup %s"
+msgstr "Analogový výstup"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
-#, fuzzy
 msgid "Analog Headphones"
-msgstr "Analogové mono"
+msgstr "Analogová sluchátka"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "Analogový výstup (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
-#, fuzzy
 msgid "Analog Mono Output"
-msgstr "Analogové mono"
+msgstr "Analogový výstup mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#: ../src/modules/alsa/alsa-mixer.c:1981, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
@@ -2495,19 +2481,16 @@ msgid "Analog Stereo"
 msgstr "Analogové stereo"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "Analogový Surround 4.1"
+msgstr "Analogový Surround 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "Analogový Surround 4.0"
+msgstr "Analogový Surround 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "Analogový Surround 4.1"
+msgstr "Analogový Surround 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Surround 4.0"
@@ -2526,19 +2509,16 @@ msgid "Analog Surround 5.1"
 msgstr "Analogový Surround 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "Analogový Surround 4.0"
+msgstr "Analogový Surround 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "Analogový Surround 4.1"
+msgstr "Analogový Surround 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "Analogový Surround 4.0"
+msgstr "Analogový Surround 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 7.1"
@@ -2549,9 +2529,8 @@ msgid "Digital Stereo (IEC958)"
 msgstr "Digitální stereo (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
-#, fuzzy
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr "Digitální Surround 4.0 (IEC958/AC3)"
+msgstr "Digitální Surround 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
@@ -2566,19 +2545,16 @@ msgid "Digital Stereo (HDMI)"
 msgstr "Digitální stereo (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
-#, fuzzy
 msgid "Analog Mono Duplex"
-msgstr "Analogové mono"
+msgstr "Analogové duplexní mono"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
-#, fuzzy
 msgid "Analog Stereo Duplex"
-msgstr "Analogové stereo"
+msgstr "Analogové duplexní stereo"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
-#, fuzzy
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr "Digitální stereo (IEC958)"
+msgstr "Digitální duplexní stereo (IEC958)"
 
 #~ msgid "Invalid client name '%s'\n"
 #~ msgstr "Neplatný název klienta \"%s\"\n"

commit 9bda558321943c79fd9abc4ecdaef6bc1d74c64d
Author: kami911 <kami911 at fedoraproject.org>
Date:   Thu Oct 1 08:46:05 2009 +0000

    Sending translation for po/hu.po

diff --git a/po/hu.po b/po/hu.po
new file mode 100644
index 0000000..c3cd24f
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,2375 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-09-30 21:32+0000\n"
+"PO-Revision-Date: \n"
+"Last-Translator: KAMI <kami911 at gmail.com>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Hungarian\n"
+"X-Poedit-Country: HUNGARY\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: ../src/modules/alsa/alsa-util.c:858
+#: ../src/pulsecore/sink.c:2629
+#, fuzzy, c-format
+msgid "%s %s"
+msgstr "%s.%s"
+
+#: ../src/modules/alsa/alsa-util.c:1106
+#, c-format
+msgid ""
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1147
+#, c-format
+msgid ""
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1194
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/module-always-sink.c:39
+msgid "Always keeps at least one sink loaded even if it's a null one"
+msgstr ""
+
+#: ../src/modules/module-always-sink.c:83
+#, fuzzy
+msgid "Dummy Output"
+msgstr "szabványos kimenet"
+
+#: ../src/modules/module-ladspa-sink.c:49
+#, fuzzy
+msgid "Virtual LADSPA sink"
+msgstr "Ismeretlen nyelőelem"
+
+#: ../src/modules/module-ladspa-sink.c:53
+msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
+msgstr ""
+
+#: ../src/modules/module-null-sink.c:55
+#, fuzzy
+msgid "Clocked NULL sink"
+msgstr "Ismeretlen nyelőelem"
+
+#: ../src/modules/module-null-sink.c:291
+#, fuzzy
+msgid "Null Output"
+msgstr "szabványos kimenet"
+
+#: ../src/pulsecore/sink.c:2613
+#, fuzzy
+msgid "Internal Audio"
+msgstr "<b>Hangszűrő</b>"
+
+#: ../src/pulsecore/sink.c:2618
+msgid "Modem"
+msgstr "Modem"
+
+#: ../src/daemon/ltdl-bind-now.c:124
+#, fuzzy
+msgid "Failed to find original lt_dlopen loader."
+msgstr "A PNM-betöltő egy egészet várt, de nem talált"
+
+#: ../src/daemon/ltdl-bind-now.c:129
+#, fuzzy
+msgid "Failed to allocate new dl loader."
+msgstr "dpkg: a memóriafoglalás meghiúsult a meghibásodott csomagok listájában egy új bejegyzés számára."
+
+#: ../src/daemon/ltdl-bind-now.c:142
+#, fuzzy
+msgid "Failed to add bind-now-loader."
+msgstr "nem sikerült hozzáadni a tartományt a csatlakozások hasítótáblázatához"
+
+#: ../src/daemon/main.c:141
+#, fuzzy, c-format
+msgid "Got signal %s."
+msgstr "Szignálnév"
+
+#: ../src/daemon/main.c:168
+msgid "Exiting."
+msgstr "Kilépés."
+
+#: ../src/daemon/main.c:186
+#, fuzzy, c-format
+msgid "Failed to find user '%s'."
+msgstr "A csomag („%s”) keresése meghiúsult: %s"
+
+#: ../src/daemon/main.c:191
+#, fuzzy, c-format
+msgid "Failed to find group '%s'."
+msgstr "%s csoportjának megváltoztatása sikertelen a következőre: %s\n"
+
+#: ../src/daemon/main.c:195
+#, fuzzy, c-format
+msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
+msgstr "%s: Nem módosítható a tulajdonos uid-ja %lu, gid-je %lu értékekre"
+
+#: ../src/daemon/main.c:200
+#, fuzzy, c-format
+msgid "GID of user '%s' and of group '%s' don't match."
+msgstr "csomagok letöltése és a műveletek el nem indítása"
+
+#: ../src/daemon/main.c:205
+#, fuzzy, c-format
+msgid "Home directory of user '%s' is not '%s', ignoring."
+msgstr "%s: nem törlöm %s könyvtárat (%s saját könyvtára)\n"
+
+#: ../src/daemon/main.c:208
+#: ../src/daemon/main.c:213
+#, fuzzy, c-format
+msgid "Failed to create '%s': %s"
+msgstr "A szervizcsomag („%s”) létrehozása meghiúsult: %s"
+
+#: ../src/daemon/main.c:220
+#, fuzzy, c-format
+msgid "Failed to change group list: %s"
+msgstr "Aktív tartományok listázása nem sikerült"
+
+#: ../src/daemon/main.c:236
+#, fuzzy, c-format
+msgid "Failed to change GID: %s"
+msgstr "A könyvtárváltás meghiúsult"
+
+#: ../src/daemon/main.c:252
+#, fuzzy, c-format
+msgid "Failed to change UID: %s"
+msgstr "A könyvtárváltás meghiúsult"
+
+#: ../src/daemon/main.c:271
+#, fuzzy
+msgid "Successfully dropped root privileges."
+msgstr "GNOME Commander - ROOT JOGSULTSÁGOK"
+
+#: ../src/daemon/main.c:279
+#, fuzzy
+msgid "System wide mode unsupported on this platform."
+msgstr "Az --atime-preserve='system' nem támogatott ezen az operációs rendszeren"
+
+#: ../src/daemon/main.c:297
+#, fuzzy, c-format
+msgid "setrlimit(%s, (%u, %u)) failed: %s"
+msgstr "<b>Sikertelen bejelentkezést</b>"
+
+#: ../src/daemon/main.c:474
+#, fuzzy
+msgid "Failed to parse command line."
+msgstr "Nem lehet feldolgozni a(z) „%s” parancssort: %s"
+
+#: ../src/daemon/main.c:541
+#, fuzzy
+msgid "Daemon not running"
+msgstr "A démon nem fut"
+
+#: ../src/daemon/main.c:543
+#, fuzzy, c-format
+msgid "Daemon running as PID %u"
+msgstr "Ne démonként fusson."
+
+#: ../src/daemon/main.c:553
+#, fuzzy, c-format
+msgid "Failed to kill daemon: %s"
+msgstr "nem sikerült olvasni a Xen-szolgáltatásból"
+
+#: ../src/daemon/main.c:571
+msgid "This program is not intended to be run as root (unless --system is specified)."
+msgstr ""
+
+#: ../src/daemon/main.c:573
+#, fuzzy
+msgid "Root privileges required."
+msgstr "Rendszergazdai jogok szükségesek!"
+
+#: ../src/daemon/main.c:578
+#, fuzzy
+msgid "--start not supported for system instances."
+msgstr "A címcsalád a gépnévhez nem támogatott"
+
+#: ../src/daemon/main.c:583
+msgid "Running in system mode, but --disallow-exit not set!"
+msgstr ""
+
+#: ../src/daemon/main.c:586
+msgid "Running in system mode, but --disallow-module-loading not set!"
+msgstr ""
+
+#: ../src/daemon/main.c:589
+#, fuzzy
+msgid "Running in system mode, forcibly disabling SHM mode!"
+msgstr "A rendszeróra teszt módban nem kerül beállításra.\n"
+
+#: ../src/daemon/main.c:594
+msgid "Running in system mode, forcibly disabling exit idle time!"
+msgstr ""
+
+#: ../src/daemon/main.c:621
+#, fuzzy
+msgid "Failed to acquire stdio."
+msgstr "A(z) „%s” D-Bus név beszerzése meghiúsult\n"
+
+#: ../src/daemon/main.c:627
+#, fuzzy, c-format
+msgid "pipe failed: %s"
+msgstr "%s: Cső létrehozása sikertelen"
+
+#: ../src/daemon/main.c:632
+#, fuzzy, c-format
+msgid "fork() failed: %s"
+msgstr "az indítás meghiúsult\n"
+
+#: ../src/daemon/main.c:646
+#: ../src/utils/pacat.c:508
+#, fuzzy, c-format
+msgid "read() failed: %s"
+msgstr "olvasás sikertelen"
+
+#: ../src/daemon/main.c:652
+#, fuzzy
+msgid "Daemon startup failed."
+msgstr "A csatlakozás meghiúsult a démonhoz"
+
+#: ../src/daemon/main.c:654
+#, fuzzy
+msgid "Daemon startup successful."
+msgstr "A portátirányítás sikeres!"
+
+#: ../src/daemon/main.c:731
+#, fuzzy, c-format
+msgid "This is PulseAudio %s"
+msgstr "Ez egy programhiba... (%s:%d:%s)\n"
+
+#: ../src/daemon/main.c:732
+#, fuzzy, c-format
+msgid "Compilation host: %s"
+msgstr "Válassz _gépet ..."
+
+#: ../src/daemon/main.c:733
+#, fuzzy, c-format
+msgid "Compilation CFLAGS: %s"
+msgstr "Regex fordítási hiba - %s"
+
+#: ../src/daemon/main.c:736
+#, fuzzy, c-format
+msgid "Running on host: %s"
+msgstr "Python %s verzió"
+
+#: ../src/daemon/main.c:739
+#, fuzzy, c-format
+msgid "Found %u CPUs."
+msgstr "Minden CPU"
+
+#: ../src/daemon/main.c:741
+#, fuzzy, c-format
+msgid "Page size is %lu bytes"
+msgstr "minimális szegmensméret = %lu\n"
+
+#: ../src/daemon/main.c:744
+#, fuzzy
+msgid "Compiled with Valgrind support: yes"
+msgstr "Pacman-szerű játék többjátékos módban"
+
+#: ../src/daemon/main.c:746
+#, fuzzy
+msgid "Compiled with Valgrind support: no"
+msgstr "A leírások nem érhetőek el: nincs XML támogatás befordítva."
+
+#: ../src/daemon/main.c:749
+#, fuzzy, c-format
+msgid "Running in valgrind mode: %s"
+msgstr "Bemutató mód"
+
+#: ../src/daemon/main.c:752
+#, fuzzy
+msgid "Optimized build: yes"
+msgstr ""
+"&Igen\n"
+"&Nem\n"
+"&Mégsem"
+
+#: ../src/daemon/main.c:754
+#, fuzzy
+msgid "Optimized build: no"
+msgstr "Nincs fordítási függősége a következőnek: %s.\n"
+
+#: ../src/daemon/main.c:758
+#, fuzzy
+msgid "NDEBUG defined, all asserts disabled."
+msgstr "Már minden elsődleges partíció megadásra került!\n"
+
+#: ../src/daemon/main.c:760
+msgid "FASTPATH defined, only fast path asserts disabled."
+msgstr ""
+
+#: ../src/daemon/main.c:762
+#, fuzzy
+msgid "All asserts enabled."
+msgstr "Adatok indexelése minden engedélyezett modulból"
+
+#: ../src/daemon/main.c:766
+#, fuzzy
+msgid "Failed to get machine ID"
+msgstr "A PDA azonosító lekérdezése nem sikerült"
+
+#: ../src/daemon/main.c:769
+#, fuzzy, c-format
+msgid "Machine ID is %s."
+msgstr "\"%s\" felhasználói azonosító lejárt."
+
+#: ../src/daemon/main.c:773
+#, fuzzy, c-format
+msgid "Session ID is %s."
+msgstr "A munkamenet le van zárva"
+
+#: ../src/daemon/main.c:779
+#, fuzzy, c-format
+msgid "Using runtime directory %s."
+msgstr "Nem hozható létre ideiglenes könyvtár a következő sablon használatával: %s"
+
+#: ../src/daemon/main.c:784
+#, fuzzy, c-format
+msgid "Using state directory %s."
+msgstr "HIBA: Nem lehet létrehozni a(z) %s állapotkönyvtárat"
+
+#: ../src/daemon/main.c:787
+#, fuzzy, c-format
+msgid "Using modules directory %s."
+msgstr "Nem hozható létre ideiglenes könyvtár a következő sablon használatával: %s"
+
+#: ../src/daemon/main.c:789
+#, fuzzy, c-format
+msgid "Running in system mode: %s"
+msgstr "A rendszeróra teszt módban nem kerül beállításra.\n"
+
+#: ../src/daemon/main.c:792
+msgid ""
+"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."
+msgstr ""
+
+#: ../src/daemon/main.c:809
+#, fuzzy
+msgid "pa_pid_file_create() failed."
+msgstr "A(z) „%s” fájl létrehozása meghiúsult: %s"
+
+#: ../src/daemon/main.c:819
+msgid "Fresh high-resolution timers available! Bon appetit!"
+msgstr ""
+
+#: ../src/daemon/main.c:821
+msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
+msgstr ""
+
+#: ../src/daemon/main.c:844
+#, fuzzy
+msgid "pa_core_new() failed."
+msgstr "Nem sikerült megnyitni a(z) %s.new fájlt"
+
+#: ../src/daemon/main.c:904
+#, fuzzy
+msgid "Failed to initialize daemon."
+msgstr "PAM inicializálása sikertelen\n"
+
+#: ../src/daemon/main.c:909
+msgid "Daemon startup without any loaded modules, refusing to work."
+msgstr ""
+
+#: ../src/daemon/main.c:926
+#, fuzzy
+msgid "Daemon startup complete."
+msgstr "Az importálás kész"
+
+#: ../src/daemon/main.c:932
+#, fuzzy
+msgid "Daemon shutdown initiated."
+msgstr "egy tartomány elegáns leállítása"
+
+#: ../src/daemon/main.c:954
+#, fuzzy
+msgid "Daemon terminated."
+msgstr ""
+"\n"
+"A parancs megszakítva\n"
+
+#: ../src/daemon/cmdline.c:115
+#, c-format
+msgid ""
+"%s [options]\n"
+"\n"
+"COMMANDS:\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"      --dump-conf                       Dump default configuration\n"
+"      --dump-modules                    Dump list of available modules\n"
+"      --dump-resample-methods           Dump available resample methods\n"
+"      --cleanup-shm                     Cleanup stale shared memory segments\n"
+"      --start                           Start the daemon if it is not running\n"
+"  -k  --kill                            Kill a running daemon\n"
+"      --check                           Check for a running daemon (only returns exit code)\n"
+"\n"
+"OPTIONS:\n"
+"      --system[=BOOL]                   Run as system-wide instance\n"
+"  -D, --daemonize[=BOOL]                Daemonize after startup\n"
+"      --fail[=BOOL]                     Quit when startup fails\n"
+"      --high-priority[=BOOL]            Try to set high nice level\n"
+"                                        (only available as root, when SUID or\n"
+"                                        with elevated RLIMIT_NICE)\n"
+"      --realtime[=BOOL]                 Try to enable realtime scheduling\n"
+"                                        (only available as root, when SUID or\n"
+"                                        with elevated RLIMIT_RTPRIO)\n"
+"      --disallow-module-loading[=BOOL]  Disallow module user requested module\n"
+"                                        loading/unloading after startup\n"
+"      --disallow-exit[=BOOL]            Disallow user requested exit\n"
+"      --exit-idle-time=SECS             Terminate the daemon when idle and this\n"
+"                                        time passed\n"
+"      --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"
+"                                        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-time[=BOOL]                 Include timestamps in log messages\n"
+"      --log-backtrace=FRAMES            Include a backtrace in log messages\n"
+"  -p, --dl-search-path=PATH             Set the search path for dynamic shared\n"
+"                                        objects (plugins)\n"
+"      --resample-method=METHOD          Use the specified resampling method\n"
+"                                        (See --dump-resample-methods for\n"
+"                                        possible values)\n"
+"      --use-pid-file[=BOOL]             Create a PID file\n"
+"      --no-cpu-limit[=BOOL]             Do not install CPU load limiter on\n"
+"                                        platforms that support it.\n"
+"      --disable-shm[=BOOL]              Disable shared memory support.\n"
+"\n"
+"STARTUP SCRIPT:\n"
+"  -L, --load=\"MODULE ARGUMENTS\"         Load the specified plugin module with\n"
+"                                        the specified argument\n"
+"  -F, --file=FILENAME                   Run the specified script\n"
+"  -C                                    Open a command line on the running TTY\n"
+"                                        after startup\n"
+"\n"
+"  -n                                    Don't load default script file\n"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:247
+#, fuzzy
+msgid "--daemonize expects boolean argument"
+msgstr "„%s” legalább egy paramétert vár"
+
+#: ../src/daemon/cmdline.c:254
+#, fuzzy
+msgid "--fail expects boolean argument"
+msgstr "„%s” legalább egy paramétert vár"
+
+#: ../src/daemon/cmdline.c:264
+msgid "--log-level expects log level argument (either numeric in range 0..4 or one of debug, info, notice, warn, error)."
+msgstr ""
+
+#: ../src/daemon/cmdline.c:276
+#, fuzzy
+msgid "--high-priority expects boolean argument"
+msgstr "„%s” legalább egy paramétert vár"
+
+#: ../src/daemon/cmdline.c:283
+#, fuzzy
+msgid "--realtime expects boolean argument"
+msgstr "„%s” legalább egy paramétert vár"
+
+#: ../src/daemon/cmdline.c:290
+#, fuzzy
+msgid "--disallow-module-loading expects boolean argument"
+msgstr "a(z) „%s” első paraméterként karakterláncot vár"
+
+#: ../src/daemon/cmdline.c:297
+#, fuzzy
+msgid "--disallow-exit expects boolean argument"
+msgstr "„%s” legalább egy paramétert vár"
+
+#: ../src/daemon/cmdline.c:304
+#, fuzzy
+msgid "--use-pid-file expects boolean argument"
+msgstr "a(z) „%s” első paraméterként karakterláncot vár"
+
+#: ../src/daemon/cmdline.c:321
+msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
+msgstr ""
+
+#: ../src/daemon/cmdline.c:328
+#, fuzzy
+msgid "--log-time expects boolean argument"
+msgstr "„%s” első paraméterként time_t-t vár"
+
+#: ../src/daemon/cmdline.c:335
+#, fuzzy
+msgid "--log-meta expects boolean argument"
+msgstr "„%s” legalább egy paramétert vár"
+
+#: ../src/daemon/cmdline.c:354
+#, fuzzy, c-format
+msgid "Invalid resample method '%s'."
+msgstr "Üres rajzolásimód-név – érvénytelen"
+
+#: ../src/daemon/cmdline.c:361
+#, fuzzy
+msgid "--system expects boolean argument"
+msgstr "„%s” legalább egy paramétert vár"
+
+#: ../src/daemon/cmdline.c:368
+#, fuzzy
+msgid "--no-cpu-limit expects boolean argument"
+msgstr "a(z) „%s” első paraméterként karakterláncot vár"
+
+#: ../src/daemon/cmdline.c:375
+#, fuzzy
+msgid "--disable-shm expects boolean argument"
+msgstr "„%s” legalább egy paramétert vár"
+
+#: ../src/daemon/dumpmodules.c:60
+#, c-format
+msgid "Name: %s\n"
+msgstr "Név: %s\n"
+
+#: ../src/daemon/dumpmodules.c:63
+#, fuzzy, c-format
+msgid "No module information available\n"
+msgstr "Nem áll rendelkezésre további információ."
+
+#: ../src/daemon/dumpmodules.c:66
+#, c-format
+msgid "Version: %s\n"
+msgstr "Verzió: %s\n"
+
+#: ../src/daemon/dumpmodules.c:68
+#, c-format
+msgid "Description: %s\n"
+msgstr "Leírás: %s\n"
+
+#: ../src/daemon/dumpmodules.c:70
+#, c-format
+msgid "Author: %s\n"
+msgstr "Szerző: %s\n"
+
+#: ../src/daemon/dumpmodules.c:72
+#, c-format
+msgid "Usage: %s\n"
+msgstr "Használat: %s\n"
+
+#: ../src/daemon/dumpmodules.c:73
+#, c-format
+msgid "Load Once: %s\n"
+msgstr "Betöltve: %s\n"
+
+#: ../src/daemon/dumpmodules.c:75
+#, fuzzy, c-format
+msgid "DEPRECATION WARNING: %s\n"
+msgstr "%s: figyelem: %s felülbírálja %s-t\n"
+
+#: ../src/daemon/dumpmodules.c:79
+#, c-format
+msgid "Path: %s\n"
+msgstr "Elérési útvonal: %s\n"
+
+#: ../src/daemon/daemon-conf.c:232
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid log target '%s'."
+msgstr "Érvénytelen naplózási szint: „%s”"
+
+#: ../src/daemon/daemon-conf.c:248
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid log level '%s'."
+msgstr "Érvénytelen naplózási szint: „%s”"
+
+#: ../src/daemon/daemon-conf.c:264
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid resample method '%s'."
+msgstr "Üres rajzolásimód-név – érvénytelen"
+
+#: ../src/daemon/daemon-conf.c:287
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid rlimit '%s'."
+msgstr "Érvénytelen művelet"
+
+#: ../src/daemon/daemon-conf.c:294
+#, fuzzy, c-format
+msgid "[%s:%u] rlimit not supported on this platform."
+msgstr "Az --atime-preserve='system' nem támogatott ezen az operációs rendszeren"
+
+#: ../src/daemon/daemon-conf.c:310
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid sample format '%s'."
+msgstr "érvénytelen rövidítési forma"
+
+#: ../src/daemon/daemon-conf.c:328
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid sample rate '%s'."
+msgstr "FIGYELEM: Événytelen mintavételezést határott meg 44100-at használom.\n"
+
+#: ../src/daemon/daemon-conf.c:352
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid sample channels '%s'."
+msgstr "FIGYELEM: Érénytelen mintavételezést határozott meg, 16-ost használom.\n"
+
+#: ../src/daemon/daemon-conf.c:370
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid channel map '%s'."
+msgstr "Érvénytelen csatornatípus '%s'"
+
+#: ../src/daemon/daemon-conf.c:388
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid number of fragments '%s'."
+msgstr "a sorok száma érvénytelen"
+
+#: ../src/daemon/daemon-conf.c:406
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid fragment size '%s'."
+msgstr "a -size típusa („%c”) érvénytelen"
+
+#: ../src/daemon/daemon-conf.c:424
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid nice level '%s'."
+msgstr "Érvénytelen optimalizálási szint: %s"
+
+#: ../src/daemon/daemon-conf.c:546
+#, fuzzy, c-format
+msgid "Failed to open configuration file: %s"
+msgstr "nem sikerült olvasásra megnyitni a beállítási fájlt"
+
+#: ../src/daemon/daemon-conf.c:562
+msgid "The specified default channel map has a different number of channels than the specified default number of channels."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:638
+#, fuzzy, c-format
+msgid "### Read from configuration file: %s ###\n"
+msgstr "%s: Olvasási hiba a(z) %s fájlban\n"
+
+#: ../src/daemon/caps.c:62
+#, fuzzy
+msgid "Cleaning up privileges."
+msgstr "Csomagok tisztítása"
+
+#: ../src/daemon/pulseaudio.desktop.in.h:1
+msgid "PulseAudio Sound System"
+msgstr "PulseAudio hangrendszer"
+
+#: ../src/daemon/pulseaudio.desktop.in.h:2
+msgid "Start the PulseAudio Sound System"
+msgstr "A PulseAudio hangrendszer elindítása"
+
+#: ../src/pulse/channelmap.c:105
+#: ../src/pulse/channelmap.c:757
+msgid "Mono"
+msgstr "Mono"
+
+#: ../src/pulse/channelmap.c:107
+msgid "Front Center"
+msgstr "Szemközti középső"
+
+#: ../src/pulse/channelmap.c:108
+msgid "Front Left"
+msgstr "Szemközti bal"
+
+#: ../src/pulse/channelmap.c:109
+msgid "Front Right"
+msgstr "Szemközti jobb"
+
+#: ../src/pulse/channelmap.c:111
+msgid "Rear Center"
+msgstr "Hátsó középső"
+
+#: ../src/pulse/channelmap.c:112
+msgid "Rear Left"
+msgstr "Hátsó bal"
+
+#: ../src/pulse/channelmap.c:113
+msgid "Rear Right"
+msgstr "Hátsó jobb"
+
+#: ../src/pulse/channelmap.c:115
+#, fuzzy
+msgid "Low Frequency Emmiter"
+msgstr "Az internetes rádióállomás frekvenciája"
+
+#: ../src/pulse/channelmap.c:117
+#, fuzzy
+msgid "Front Left-of-center"
+msgstr "Balra, jobbra vagy középre igazítás"
+
+#: ../src/pulse/channelmap.c:118
+#, fuzzy
+msgid "Front Right-of-center"
+msgstr "Balra, jobbra vagy középre igazítás"
+
+#: ../src/pulse/channelmap.c:120
+#, fuzzy
+msgid "Side Left"
+msgstr "Bal oldalsó"
+
+#: ../src/pulse/channelmap.c:121
+#, fuzzy
+msgid "Side Right"
+msgstr "Jobb oldalsó"
+
+#: ../src/pulse/channelmap.c:123
+#, fuzzy
+msgid "Auxiliary 0"
+msgstr "Folyamat/kiegészítő művelet"
+
+#: ../src/pulse/channelmap.c:124
+#, fuzzy
+msgid "Auxiliary 1"
+msgstr "Folyamat/kiegészítő művelet"
+
+#: ../src/pulse/channelmap.c:125
+#, fuzzy
+msgid "Auxiliary 2"
+msgstr "Folyamat/kiegészítő művelet"
+
+#: ../src/pulse/channelmap.c:126
+#, fuzzy
+msgid "Auxiliary 3"
+msgstr "Folyamat/kiegészítő művelet"
+
+#: ../src/pulse/channelmap.c:127
+#, fuzzy
+msgid "Auxiliary 4"
+msgstr "Folyamat/kiegészítő művelet"
+
+#: ../src/pulse/channelmap.c:128
+#, fuzzy
+msgid "Auxiliary 5"
+msgstr "Folyamat/kiegészítő művelet"
+
+#: ../src/pulse/channelmap.c:129
+#, fuzzy
+msgid "Auxiliary 6"
+msgstr "Folyamat/kiegészítő művelet"
+
+#: ../src/pulse/channelmap.c:130
+#, fuzzy
+msgid "Auxiliary 7"
+msgstr "Folyamat/kiegészítő művelet"
+
+#: ../src/pulse/channelmap.c:131
+#, fuzzy
+msgid "Auxiliary 8"
+msgstr "Folyamat/kiegészítő művelet"
+
+#: ../src/pulse/channelmap.c:132
+#, fuzzy
+msgid "Auxiliary 9"
+msgstr "Folyamat/kiegészítő művelet"
+
+#: ../src/pulse/channelmap.c:133
+#, fuzzy
+msgid "Auxiliary 10"
+msgstr "#10 boríték"
+
+#: ../src/pulse/channelmap.c:134
+#, fuzzy
+msgid "Auxiliary 11"
+msgstr "5-11 éveseknek"
+
+#: ../src/pulse/channelmap.c:135
+#, fuzzy
+msgid "Auxiliary 12"
+msgstr "#12 boríték"
+
+#: ../src/pulse/channelmap.c:136
+#, fuzzy
+msgid "Auxiliary 13"
+msgstr "13 jegy"
+
+#: ../src/pulse/channelmap.c:137
+#, fuzzy
+msgid "Auxiliary 14"
+msgstr "#14 boríték"
+
+#: ../src/pulse/channelmap.c:138
+#, fuzzy
+msgid "Auxiliary 15"
+msgstr "15 fok  (%s)"
+
+#: ../src/pulse/channelmap.c:139
+#, fuzzy
+msgid "Auxiliary 16"
+msgstr "16:9 (szélesvásznú)"
+
+#: ../src/pulse/channelmap.c:140
+#, fuzzy
+msgid "Auxiliary 17"
+msgstr "17 USD"
+
+#: ../src/pulse/channelmap.c:141
+#, fuzzy
+msgid "Auxiliary 18"
+msgstr "GTK+ 2.18"
+
+#: ../src/pulse/channelmap.c:142
+#, fuzzy
+msgid "Auxiliary 19"
+msgstr "19.2 Kb/mp modem"
+
+#: ../src/pulse/channelmap.c:143
+#, fuzzy
+msgid "Auxiliary 20"
+msgstr "Kivonás: 0-tól 20-ig"
+
+#: ../src/pulse/channelmap.c:144
+#, fuzzy
+msgid "Auxiliary 21"
+msgstr "Folyamat/kiegészítő művelet"
+
+#: ../src/pulse/channelmap.c:145
+#, fuzzy
+msgid "Auxiliary 22"
+msgstr "Folyamat/kiegészítő művelet"
+
+#: ../src/pulse/channelmap.c:146
+#, fuzzy
+msgid "Auxiliary 23"
+msgstr "2009-09-23"
+
+#: ../src/pulse/channelmap.c:147
+#, fuzzy
+msgid "Auxiliary 24"
+msgstr "24 órás"
+
+#: ../src/pulse/channelmap.c:148
+#, fuzzy
+msgid "Auxiliary 25"
+msgstr "25% szürke"
+
+#: ../src/pulse/channelmap.c:149
+#, fuzzy
+msgid "Auxiliary 26"
+msgstr "Imigre-_26…"
+
+#: ../src/pulse/channelmap.c:150
+#, fuzzy
+msgid "Auxiliary 27"
+msgstr "Folyamat/kiegészítő művelet"
+
+#: ../src/pulse/channelmap.c:151
+#, fuzzy
+msgid "Auxiliary 28"
+msgstr "GNOME 2.28"
+
+#: ../src/pulse/channelmap.c:152
+#, fuzzy
+msgid "Auxiliary 29"
+msgstr "Folyamat/kiegészítő művelet"
+
+#: ../src/pulse/channelmap.c:153
+#, fuzzy
+msgid "Auxiliary 30"
+msgstr "30 perc"
+
+#: ../src/pulse/channelmap.c:154
+#, fuzzy
+msgid "Auxiliary 31"
+msgstr "1999 szeptember 31."
+
+#: ../src/pulse/channelmap.c:156
+#, fuzzy
+msgid "Top Center"
+msgstr "Fent, középen"
+
+#: ../src/pulse/channelmap.c:158
+#, fuzzy
+msgid "Top Front Center"
+msgstr "A bekezdés igazítása középre"
+
+#: ../src/pulse/channelmap.c:159
+#, fuzzy
+msgid "Top Front Left"
+msgstr "Elhelyezés balra felülre"
+
+#: ../src/pulse/channelmap.c:160
+#, fuzzy
+msgid "Top Front Right"
+msgstr "Elhelyezés jobbra felülre"
+
+#: ../src/pulse/channelmap.c:162
+#, fuzzy
+msgid "Top Rear Center"
+msgstr "A bekezdés igazítása középre"
+
+#: ../src/pulse/channelmap.c:163
+#, fuzzy
+msgid "Top Rear Left"
+msgstr "Elhelyezés balra felülre"
+
+#: ../src/pulse/channelmap.c:164
+#, fuzzy
+msgid "Top Rear Right"
+msgstr "Elhelyezés jobbra felülre"
+
+#: ../src/pulse/channelmap.c:484
+#: ../src/pulse/sample.c:170
+#: ../src/pulse/volume.c:295
+#: ../src/pulse/volume.c:321
+#: ../src/pulse/volume.c:341
+#: ../src/pulse/volume.c:371
+#, fuzzy
+msgid "(invalid)"
+msgstr "(Érvénytelen)"
+
+#: ../src/pulse/channelmap.c:761
+msgid "Stereo"
+msgstr "Sztereó"
+
+#: ../src/pulse/channelmap.c:766
+msgid "Surround 4.0"
+msgstr "Térhatású 4.0"
+
+#: ../src/pulse/channelmap.c:772
+msgid "Surround 4.1"
+msgstr "Térhatású 4.1"
+
+#: ../src/pulse/channelmap.c:778
+msgid "Surround 5.0"
+msgstr "Térhatású 5.0"
+
+#: ../src/pulse/channelmap.c:784
+msgid "Surround 5.1"
+msgstr "Térhatású 5.1"
+
+#: ../src/pulse/channelmap.c:791
+msgid "Surround 7.1"
+msgstr "Térhatású 7.1"
+
+#: ../src/pulse/error.c:43
+msgid "OK"
+msgstr "OK"
+
+#: ../src/pulse/error.c:44
+msgid "Access denied"
+msgstr "Hozzáférés megtagadva"
+
+#: ../src/pulse/error.c:45
+msgid "Unknown command"
+msgstr "Ismeretlen parancs"
+
+#: ../src/pulse/error.c:46
+msgid "Invalid argument"
+msgstr "Érvénytelen paraméter"
+
+#: ../src/pulse/error.c:47
+#, fuzzy
+msgid "Entity exists"
+msgstr "\" már létezik!"
+
+#: ../src/pulse/error.c:48
+#, fuzzy
+msgid "No such entity"
+msgstr "nincs ilyen puffer"
+
+#: ../src/pulse/error.c:49
+msgid "Connection refused"
+msgstr "Kapcsolat elutasítva"
+
+#: ../src/pulse/error.c:50
+msgid "Protocol error"
+msgstr "Protokollhiba"
+
+#: ../src/pulse/error.c:51
+msgid "Timeout"
+msgstr "Időtúllépés"
+
+#: ../src/pulse/error.c:52
+#, fuzzy
+msgid "No authorization key"
+msgstr "Nem érhető el kulcs"
+
+#: ../src/pulse/error.c:53
+msgid "Internal error"
+msgstr "Belső hiba"
+
+#: ../src/pulse/error.c:54
+#, fuzzy
+msgid "Connection terminated"
+msgstr ""
+"\n"
+"A parancs megszakítva\n"
+
+#: ../src/pulse/error.c:55
+#, fuzzy
+msgid "Entity killed"
+msgstr "A(z) %d számú folyamat kilőve"
+
+#: ../src/pulse/error.c:56
+#, fuzzy
+msgid "Invalid server"
+msgstr "Érvénytelen kiszolgáló"
+
+#: ../src/pulse/error.c:57
+#, fuzzy
+msgid "Module initalization failed"
+msgstr "A(z) \"%s\" modul végrehajtása meghiúsult."
+
+#: ../src/pulse/error.c:58
+msgid "Bad state"
+msgstr "Hibás állapot"
+
+#: ../src/pulse/error.c:59
+msgid "No data"
+msgstr "Nincs adat"
+
+#: ../src/pulse/error.c:60
+#, fuzzy
+msgid "Incompatible protocol version"
+msgstr "Inkompatibilis protokollverzió"
+
+#: ../src/pulse/error.c:61
+msgid "Too large"
+msgstr "Túl nagy"
+
+#: ../src/pulse/error.c:62
+msgid "Not supported"
+msgstr "Nem támogatott"
+
+#: ../src/pulse/error.c:63
+msgid "Unknown error code"
+msgstr "Ismeretlen hibakód"
+
+#: ../src/pulse/error.c:64
+#, fuzzy
+msgid "No such extension"
+msgstr "nincs ilyen puffer"
+
+#: ../src/pulse/error.c:65
+#, fuzzy
+msgid "Obsolete functionality"
+msgstr "Elavult vagy helyi"
+
+#: ../src/pulse/error.c:66
+#, fuzzy
+msgid "Missing implementation"
+msgstr "Nincs megvalósítva"
+
+#: ../src/pulse/error.c:67
+#, fuzzy
+msgid "Client forked"
+msgstr "BitTorrent kliens"
+
+#: ../src/pulse/error.c:68
+#, fuzzy
+msgid "Input/Output error"
+msgstr "Kimeneti/bemeneti hiba"
+
+#: ../src/pulse/error.c:69
+#, fuzzy
+msgid "Device or resource busy"
+msgstr "Az eszköz vagy erőforrás foglalt"
+
+#: ../src/pulse/sample.c:172
+#, c-format
+msgid "%s %uch %uHz"
+msgstr ""
+
+#: ../src/pulse/sample.c:184
+#, fuzzy, c-format
+msgid "%0.1f GiB"
+msgstr "%.1f GiB"
+
+#: ../src/pulse/sample.c:186
+#, fuzzy, c-format
+msgid "%0.1f MiB"
+msgstr "%.1f MiB"
+
+#: ../src/pulse/sample.c:188
+#, fuzzy, c-format
+msgid "%0.1f KiB"
+msgstr "%.1f KiB"
+
+#: ../src/pulse/sample.c:190
+#, c-format
+msgid "%u B"
+msgstr ""
+
+#: ../src/pulse/client-conf-x11.c:55
+#: ../src/utils/pax11publish.c:100
+#, fuzzy
+msgid "XOpenDisplay() failed"
+msgstr "<b>Sikertelen bejelentkezést</b>"
+
+#: ../src/pulse/client-conf-x11.c:93
+#, fuzzy
+msgid "Failed to parse cookie data"
+msgstr "sikertelen a szimbólum adatainak a betöltése"
+
+#: ../src/pulse/client-conf.c:111
+#, fuzzy, c-format
+msgid "Failed to open configuration file '%s': %s"
+msgstr "nem sikerült olvasásra megnyitni a beállítási fájlt"
+
+#: ../src/pulse/context.c:550
+msgid "No cookie loaded. Attempting to connect without."
+msgstr ""
+
+#: ../src/pulse/context.c:693
+#, fuzzy, c-format
+msgid "fork(): %s"
+msgstr "programindítás: %s"
+
+#: ../src/pulse/context.c:748
+#, fuzzy, c-format
+msgid "waitpid(): %s"
+msgstr "Váratlan hiba a waitpid()-ben (%s)"
+
+#: ../src/pulse/context.c:1438
+#, fuzzy, c-format
+msgid "Received message for unknown extension '%s'"
+msgstr "\"_Ismeretlen állapotú\" üzenet olvasása"
+
+#: ../src/utils/pacat.c:108
+#, fuzzy, c-format
+msgid "Failed to drain stream: %s"
+msgstr "Az új adatfolyam indítása meghiúsult"
+
+#: ../src/utils/pacat.c:113
+#, fuzzy
+msgid "Playback stream drained."
+msgstr "A folyam váratlanul véget ért!"
+
+#: ../src/utils/pacat.c:123
+#, fuzzy
+msgid "Draining connection to server."
+msgstr "Kapcsolat visszaállítása a kiszolgálóhoz"
+
+#: ../src/utils/pacat.c:136
+#, fuzzy, c-format
+msgid "pa_stream_drain(): %s"
+msgstr "pa_ext_stream_restore_read() meghiúsult"
+
+#: ../src/utils/pacat.c:159
+#, fuzzy, c-format
+msgid "pa_stream_write() failed: %s"
+msgstr "pa_ext_stream_restore_write() meghiúsult"
+
+#: ../src/utils/pacat.c:197
+#, fuzzy, c-format
+msgid "pa_stream_begin_write() failed: %s"
+msgstr "pa_ext_stream_restore_write() meghiúsult"
+
+#: ../src/utils/pacat.c:237
+#: ../src/utils/pacat.c:267
+#, fuzzy, c-format
+msgid "pa_stream_peek() failed: %s"
+msgstr "pa_ext_stream_restore_read() meghiúsult"
+
+#: ../src/utils/pacat.c:307
+msgid "Stream successfully created."
+msgstr "Az adatfolyam sikeresen létrejött."
+
+#: ../src/utils/pacat.c:310
+#, fuzzy, c-format
+msgid "pa_stream_get_buffer_attr() failed: %s"
+msgstr "pa_context_get_client_info() meghiúsult"
+
+#: ../src/utils/pacat.c:314
+#, c-format
+msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
+msgstr ""
+
+#: ../src/utils/pacat.c:317
+#, fuzzy, c-format
+msgid "Buffer metrics: maxlength=%u, fragsize=%u"
+msgstr "--Nincsenek sorok a pufferben--"
+
+#: ../src/utils/pacat.c:321
+#, fuzzy, c-format
+msgid "Using sample spec '%s', channel map '%s'."
+msgstr "%s: térkép tábla \"%s\": %lu bájt\n"
+
+#: ../src/utils/pacat.c:325
+#, fuzzy, c-format
+msgid "Connected to device %s (%u, %ssuspended)."
+msgstr "Kapcsolódva az eszközhöz a következőn: %s"
+
+#: ../src/utils/pacat.c:335
+#, fuzzy, c-format
+msgid "Stream error: %s"
+msgstr "Folyam hiba"
+
+#: ../src/utils/pacat.c:345
+#, fuzzy, c-format
+msgid "Stream device suspended.%s"
+msgstr "Az eszköz nem adatfolyam"
+
+#: ../src/utils/pacat.c:347
+#, fuzzy, c-format
+msgid "Stream device resumed.%s"
+msgstr "Az eszköz nem adatfolyam"
+
+#: ../src/utils/pacat.c:355
+#, fuzzy, c-format
+msgid "Stream underrun.%s"
+msgstr "Vége az adatfolyamnak"
+
+#: ../src/utils/pacat.c:362
+#, fuzzy, c-format
+msgid "Stream overrun.%s"
+msgstr "%s: a bemenet túlcsordult"
+
+#: ../src/utils/pacat.c:369
+#, fuzzy, c-format
+msgid "Stream started.%s"
+msgstr "%s tartomány elindítva\n"
+
+#: ../src/utils/pacat.c:376
+#, fuzzy, c-format
+msgid "Stream moved to device %s (%u, %ssuspended).%s"
+msgstr "Nem sikerült megnyitni a kimeneti eszközt"
+
+#: ../src/utils/pacat.c:376
+#, fuzzy
+msgid "not "
+msgstr "Nem győződtem meg"
+
+#: ../src/utils/pacat.c:383
+#, fuzzy, c-format
+msgid "Stream buffer attributes changed.%s"
+msgstr "E787: A puffer váratlanul megváltozott"
+
+#: ../src/utils/pacat.c:415
+#, fuzzy, c-format
+msgid "Connection established.%s"
+msgstr "Kapcsolat létrehozva"
+
+#: ../src/utils/pacat.c:418
+#, fuzzy, c-format
+msgid "pa_stream_new() failed: %s"
+msgstr "Az új adatfolyam indítása meghiúsult"
+
+#: ../src/utils/pacat.c:450
+#, fuzzy, c-format
+msgid "pa_stream_connect_playback() failed: %s"
+msgstr "A megfigyelő adatfolyam csatlakoztatása meghiúsult"
+
+#: ../src/utils/pacat.c:456
+#, fuzzy, c-format
+msgid "pa_stream_connect_record() failed: %s"
+msgstr "A megfigyelő adatfolyam csatlakoztatása meghiúsult"
+
+#: ../src/utils/pacat.c:470
+#: ../src/utils/pactl.c:857
+#, fuzzy, c-format
+msgid "Connection failure: %s"
+msgstr "Hitelesítési hiba"
+
+#: ../src/utils/pacat.c:503
+#, fuzzy
+msgid "Got EOF."
+msgstr "Üzenet érkezett: #%"
+
+#: ../src/utils/pacat.c:540
+#, fuzzy, c-format
+msgid "write() failed: %s"
+msgstr "az írás sikertelen"
+
+#: ../src/utils/pacat.c:561
+#, fuzzy
+msgid "Got signal, exiting."
+msgstr "%d szignál érkezett, kilépés…\n"
+
+#: ../src/utils/pacat.c:575
+#, fuzzy, c-format
+msgid "Failed to get latency: %s"
+msgstr "nem sikerült a képességek lekérdezése"
+
+#: ../src/utils/pacat.c:580
+#, fuzzy, c-format
+msgid "Time: %0.3f sec; Latency: %0.0f usec."
+msgstr "%d csoport elmentve ebben: \"%s\" %.1f másodperc alatt (%.0f csoport/mp)"
+
+#: ../src/utils/pacat.c:599
+#, fuzzy, c-format
+msgid "pa_stream_update_timing_info() failed: %s"
+msgstr "pa_context_get_client_info() meghiúsult"
+
+#: ../src/utils/pacat.c:609
+#, c-format
+msgid ""
+"%s [options]\n"
+"\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"\n"
+"  -r, --record                          Create a connection for recording\n"
+"  -p, --playback                        Create a connection for playback\n"
+"\n"
+"  -v, --verbose                         Enable verbose operations\n"
+"\n"
+"  -s, --server=SERVER                   The name of the server to connect to\n"
+"  -d, --device=DEVICE                   The name of the sink/source to connect to\n"
+"  -n, --client-name=NAME                How to call this client on the server\n"
+"      --stream-name=NAME                How to call this stream on the server\n"
+"      --volume=VOLUME                   Specify the initial (linear) volume in range 0...65536\n"
+"      --rate=SAMPLERATE                 The sample rate in Hz (defaults to 44100)\n"
+"      --format=SAMPLEFORMAT             The sample type, one of s16le, s16be, u8, float32le,\n"
+"                                        float32be, ulaw, alaw, s32le, s32be, s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, 2 for stereo\n"
+"                                        (defaults to 2)\n"
+"      --channel-map=CHANNELMAP          Channel map to use instead of the default\n"
+"      --fix-format                      Take the sample format from the sink the stream is\n"
+"                                        being connected to.\n"
+"      --fix-rate                        Take the sampling rate from the sink the stream is\n"
+"                                        being connected to.\n"
+"      --fix-channels                    Take the number of channels and the channel map\n"
+"                                        from the sink the stream is being connected to.\n"
+"      --no-remix                        Don't upmix or downmix channels.\n"
+"      --no-remap                        Map channels by index instead of name.\n"
+"      --latency=BYTES                   Request the specified latency in bytes.\n"
+"      --process-time=BYTES              Request the specified process time per request in bytes.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
+"      --raw                             Record/play raw PCM data.\n"
+"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --list-file-formats               List available file formats.\n"
+msgstr ""
+
+#: ../src/utils/pacat.c:731
+#, fuzzy, c-format
+msgid ""
+"pacat %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
+msgstr "A program kapcsolói ütköznek"
+
+#: ../src/utils/pacat.c:764
+#: ../src/utils/pactl.c:953
+#, fuzzy, c-format
+msgid "Invalid client name '%s'"
+msgstr "%s: érvénytelen kapcsolónév"
+
+#: ../src/utils/pacat.c:779
+#, fuzzy, c-format
+msgid "Invalid stream name '%s'"
+msgstr "%s: érvénytelen kapcsolónév"
+
+#: ../src/utils/pacat.c:816
+#, fuzzy, c-format
+msgid "Invalid channel map '%s'"
+msgstr "Érvénytelen csatornatípus '%s'"
+
+#: ../src/utils/pacat.c:845
+#, fuzzy, c-format
+msgid "Invalid latency specification '%s'"
+msgstr "%.*s: érvénytelen konverziós specifikáció"
+
+#: ../src/utils/pacat.c:852
+#, fuzzy, c-format
+msgid "Invalid process time specification '%s'"
+msgstr "Nem adott meg folyamat-specifikációt"
+
+#: ../src/utils/pacat.c:864
+#, fuzzy, c-format
+msgid "Invalid property '%s'"
+msgstr "Érvénytelen %s tulajdonságérték"
+
+#: ../src/utils/pacat.c:881
+#, fuzzy, c-format
+msgid "Unknown file format %s."
+msgstr "Ismeretlen fájlformátum: \"%s\""
+
+#: ../src/utils/pacat.c:900
+#, fuzzy
+msgid "Invalid sample specification"
+msgstr "%.*s: érvénytelen konverziós specifikáció"
+
+#: ../src/utils/pacat.c:910
+#, fuzzy, c-format
+msgid "open(): %s"
+msgstr "%s:%d megnyitása"
+
+#: ../src/utils/pacat.c:915
+#, fuzzy, c-format
+msgid "dup2(): %s"
+msgstr "a dup2 meghiúsult"
+
+#: ../src/utils/pacat.c:922
+#, fuzzy
+msgid "Too many arguments."
+msgstr "túl sok argumentum"
+
+#: ../src/utils/pacat.c:933
+#, fuzzy
+msgid "Failed to generate sample specification for file."
+msgstr "meghiúsult az alábbi beállító fájl megnyitása olvasásra: `%.255s'"
+
+#: ../src/utils/pacat.c:953
+#, fuzzy
+msgid "Failed to open audio file."
+msgstr "Nem sikerült megnyitni az átmeneti fájlt"
+
+#: ../src/utils/pacat.c:959
+msgid "Warning: specified sample specification will be overwritten with specification from file."
+msgstr ""
+
+#: ../src/utils/pacat.c:962
+#: ../src/utils/pactl.c:997
+#, fuzzy
+msgid "Failed to determine sample specification from file."
+msgstr "RGB-adat betöltése a TIFF-fájlból sikertelen"
+
+#: ../src/utils/pacat.c:971
+msgid "Warning: Failed to determine channel map from file."
+msgstr ""
+
+#: ../src/utils/pacat.c:982
+#, fuzzy
+msgid "Channel map doesn't match sample specification"
+msgstr "%s: a tanúsítvány „%s” általános neve nem egyezik a kért „%s” gépnévvel.\n"
+
+#: ../src/utils/pacat.c:993
+#, fuzzy
+msgid "Warning: failed to write channel map to file."
+msgstr "Hiba történt a fájl írása közben. A fájlnév rendben van?"
+
+#: ../src/utils/pacat.c:1008
+#, c-format
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr ""
+
+#: ../src/utils/pacat.c:1009
+#, fuzzy
+msgid "recording"
+msgstr "felvétel"
+
+#: ../src/utils/pacat.c:1009
+#, fuzzy
+msgid "playback"
+msgstr "Lejátszás"
+
+#: ../src/utils/pacat.c:1035
+#: ../src/utils/pactl.c:1267
+#, fuzzy
+msgid "pa_mainloop_new() failed."
+msgstr "Nem sikerült megnyitni a(z) %s.new fájlt"
+
+#: ../src/utils/pacat.c:1054
+#, fuzzy
+msgid "io_new() failed."
+msgstr "Nem sikerült megnyitni a(z) %s.new fájlt"
+
+#: ../src/utils/pacat.c:1061
+#: ../src/utils/pactl.c:1279
+#, fuzzy
+msgid "pa_context_new() failed."
+msgstr "pa_context_subscribe() meghiúsult"
+
+#: ../src/utils/pacat.c:1069
+#: ../src/utils/pactl.c:1285
+#, fuzzy, c-format
+msgid "pa_context_connect() failed: %s"
+msgstr "pa_context_subscribe() meghiúsult"
+
+#: ../src/utils/pacat.c:1075
+#, fuzzy
+msgid "pa_context_rttime_new() failed."
+msgstr "az új kontextus kiszámítása meghiúsult"
+
+#: ../src/utils/pacat.c:1082
+#: ../src/utils/pactl.c:1290
+#, fuzzy
+msgid "pa_mainloop_run() failed."
+msgstr "svc_run: - választás sikertelen"
+
+#: ../src/utils/pasuspender.c:81
+#, fuzzy, c-format
+msgid "fork(): %s\n"
+msgstr "programindítás: %s"
+
+#: ../src/utils/pasuspender.c:92
+#, fuzzy, c-format
+msgid "execvp(): %s\n"
+msgstr "az execvp meghiúsult"
+
+#: ../src/utils/pasuspender.c:109
+#, fuzzy, c-format
+msgid "Failure to suspend: %s\n"
+msgstr "Kérés a felfüggesztésre"
+
+#: ../src/utils/pasuspender.c:124
+#, fuzzy, c-format
+msgid "Failure to resume: %s\n"
+msgstr "Kattintson a folytatáshoz"
+
+#: ../src/utils/pasuspender.c:147
+#, fuzzy, c-format
+msgid "WARNING: Sound server is not local, not suspending.\n"
+msgstr "A leejtett fájl nem helyi."
+
+#: ../src/utils/pasuspender.c:159
+#, fuzzy, c-format
+msgid "Connection failure: %s\n"
+msgstr "Hitelesítési hiba"
+
+#: ../src/utils/pasuspender.c:176
+#, fuzzy, c-format
+msgid "Got SIGINT, exiting.\n"
+msgstr "Kilépés (SIGINT szignál)..."
+
+#: ../src/utils/pasuspender.c:194
+#, fuzzy, c-format
+msgid "WARNING: Child process terminated by signal %u\n"
+msgstr ""
+"A(z) %d azonosítójú folyamatot nem lehet kilőni %d jelzéssel.\n"
+"%s"
+
+#: ../src/utils/pasuspender.c:212
+#, c-format
+msgid ""
+"%s [options] ... \n"
+"\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"  -s, --server=SERVER                   The name of the server to connect to\n"
+"\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:248
+#, fuzzy, c-format
+msgid ""
+"pasuspender %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
+msgstr "A program kapcsolói ütköznek"
+
+#: ../src/utils/pasuspender.c:277
+#, fuzzy, c-format
+msgid "pa_mainloop_new() failed.\n"
+msgstr "Nem sikerült megnyitni a(z) %s.new fájlt"
+
+#: ../src/utils/pasuspender.c:290
+#, fuzzy, c-format
+msgid "pa_context_new() failed.\n"
+msgstr "pa_context_subscribe() meghiúsult"
+
+#: ../src/utils/pasuspender.c:298
+#, fuzzy, c-format
+msgid "pa_mainloop_run() failed.\n"
+msgstr "svc_run: - választás sikertelen"
+
+#: ../src/utils/pactl.c:135
+#, fuzzy, c-format
+msgid "Failed to get statistics: %s"
+msgstr "nem sikerült a képességek lekérdezése"
+
+#: ../src/utils/pactl.c:141
+#, c-format
+msgid "Currently in use: %u blocks containing %s bytes total.\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:144
+#, c-format
+msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:147
+#, fuzzy, c-format
+msgid "Sample cache size: %s\n"
+msgstr "Lemezes gyorsítótár mérete"
+
+#: ../src/utils/pactl.c:156
+#, fuzzy, c-format
+msgid "Failed to get server information: %s"
+msgstr "csomópont-információ lekérdezése nem sikerült"
+
+#: ../src/utils/pactl.c:164
+#, c-format
+msgid ""
+"User name: %s\n"
+"Host Name: %s\n"
+"Server Name: %s\n"
+"Server Version: %s\n"
+"Default Sample Specification: %s\n"
+"Default Channel Map: %s\n"
+"Default Sink: %s\n"
+"Default Source: %s\n"
+"Cookie: %08x\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:205
+#, fuzzy, c-format
+msgid "Failed to get sink information: %s"
+msgstr "csomópont-információ lekérdezése nem sikerült"
+
+#: ../src/utils/pactl.c:221
+#, c-format
+msgid ""
+"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:268
+#: ../src/utils/pactl.c:360
+#, c-format
+msgid "\tPorts:\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:274
+#: ../src/utils/pactl.c:366
+#, fuzzy, c-format
+msgid "\tActive Port: %s\n"
+msgstr "[kiszolgáló:port]"
+
+#: ../src/utils/pactl.c:297
+#, fuzzy, c-format
+msgid "Failed to get source information: %s"
+msgstr "csomópont-információ lekérdezése nem sikerült"
+
+#: ../src/utils/pactl.c:313
+#, c-format
+msgid ""
+"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:345
+#: ../src/utils/pactl.c:401
+#: ../src/utils/pactl.c:436
+#: ../src/utils/pactl.c:473
+#: ../src/utils/pactl.c:532
+#: ../src/utils/pactl.c:533
+#: ../src/utils/pactl.c:543
+#: ../src/utils/pactl.c:587
+#: ../src/utils/pactl.c:588
+#: ../src/utils/pactl.c:594
+#: ../src/utils/pactl.c:637
+#: ../src/utils/pactl.c:638
+#: ../src/utils/pactl.c:645
+#, fuzzy
+msgid "n/a"
+msgstr "ismeretlen"
+
+#: ../src/utils/pactl.c:375
+#, fuzzy, c-format
+msgid "Failed to get module information: %s"
+msgstr "csomópont-információ lekérdezése nem sikerült"
+
+#: ../src/utils/pactl.c:393
+#, c-format
+msgid ""
+"Module #%u\n"
+"\tName: %s\n"
+"\tArgument: %s\n"
+"\tUsage counter: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:412
+#, fuzzy, c-format
+msgid "Failed to get client information: %s"
+msgstr "csomópont-információ lekérdezése nem sikerült"
+
+#: ../src/utils/pactl.c:430
+#, fuzzy, c-format
+msgid ""
+"Client #%u\n"
+"\tDriver: %s\n"
+"\tOwner Module: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
+msgstr "A modul nem képes létrehozni a szükséges szálakat"
+
+#: ../src/utils/pactl.c:447
+#, fuzzy, c-format
+msgid "Failed to get card information: %s"
+msgstr "csomópont-információ lekérdezése nem sikerült"
+
+#: ../src/utils/pactl.c:465
+#, c-format
+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:479
+#, c-format
+msgid "\tProfiles:\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:485
+#, fuzzy, c-format
+msgid "\tActive Profile: %s\n"
+msgstr "Profillétrehozás"
+
+#: ../src/utils/pactl.c:496
+#, fuzzy, c-format
+msgid "Failed to get sink input information: %s"
+msgstr "pa_context_get_sink_input_info() meghiúsult"
+
+#: ../src/utils/pactl.c:515
+#, c-format
+msgid ""
+"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:554
+#, fuzzy, c-format
+msgid "Failed to get source output information: %s"
+msgstr "pa_context_get_source_output_info_list() meghiúsult"
+
+#: ../src/utils/pactl.c:574
+#, c-format
+msgid ""
+"Source Output #%u\n"
+"\tDriver: %s\n"
+"\tOwner Module: %s\n"
+"\tClient: %s\n"
+"\tSource: %u\n"
+"\tSample Specification: %s\n"
+"\tChannel Map: %s\n"
+"\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:605
+#, fuzzy, c-format
+msgid "Failed to get sample information: %s"
+msgstr "csomópont-információ lekérdezése nem sikerült"
+
+#: ../src/utils/pactl.c:623
+#, c-format
+msgid ""
+"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:653
+#: ../src/utils/pactl.c:663
+#, fuzzy, c-format
+msgid "Failure: %s"
+msgstr "Hiba"
+
+#: ../src/utils/pactl.c:687
+#, fuzzy, c-format
+msgid "Failed to upload sample: %s"
+msgstr ""
+"A feltöltés a kiszolgálóra meghiúsult,\n"
+"később próbálja meg újra."
+
+#: ../src/utils/pactl.c:704
+#, fuzzy
+msgid "Premature end of file"
+msgstr "Idő előtti fájlvége"
+
+#: ../src/utils/pactl.c:863
+#, fuzzy
+msgid "Got SIGINT, exiting."
+msgstr "Kilépés (SIGINT szignál)..."
+
+#: ../src/utils/pactl.c:869
+#, c-format
+msgid ""
+"%s [options] stat\n"
+"%s [options] list\n"
+"%s [options] exit\n"
+"%s [options] upload-sample FILENAME [NAME]\n"
+"%s [options] play-sample NAME [SINK]\n"
+"%s [options] remove-sample NAME\n"
+"%s [options] move-sink-input SINKINPUT SINK\n"
+"%s [options] move-source-output SOURCEOUTPUT SOURCE\n"
+"%s [options] load-module NAME [ARGS ...]\n"
+"%s [options] unload-module MODULE\n"
+"%s [options] suspend-sink SINK 1|0\n"
+"%s [options] suspend-source SOURCE 1|0\n"
+"%s [options] set-card-profile CARD PROFILE\n"
+"%s [options] set-sink-port SINK PORT\n"
+"%s [options] set-source-port SOURCE PORT\n"
+"%s [options] set-sink-volume SINK VOLUME\n"
+"%s [options] set-source-volume SOURCE VOLUME\n"
+"%s [options] set-sink-input-volume SINKINPUT VOLUME\n"
+"%s [options] set-sink-mute SINK 1|0\n"
+"%s [options] set-source-mute SOURCE 1|0\n"
+"%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"\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"
+msgstr ""
+
+#: ../src/utils/pactl.c:933
+#, fuzzy, c-format
+msgid ""
+"pactl %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
+msgstr "A program kapcsolói ütköznek"
+
+#: ../src/utils/pactl.c:979
+#, fuzzy
+msgid "Please specify a sample file to load"
+msgstr "A glade fájl betöltése meghiúsult, ellenőrizze a telepítését."
+
+#: ../src/utils/pactl.c:992
+#, fuzzy
+msgid "Failed to open sound file."
+msgstr "Nem sikerült megnyitni az átmeneti fájlt"
+
+#: ../src/utils/pactl.c:1004
+#, fuzzy
+msgid "Warning: Failed to determine sample specification from file."
+msgstr "RGB-adat betöltése a TIFF-fájlból sikertelen"
+
+#: ../src/utils/pactl.c:1014
+#, fuzzy
+msgid "You have to specify a sample name to play"
+msgstr "Meg kell adnia egy feloldandó csomagnevet"
+
+#: ../src/utils/pactl.c:1026
+#, fuzzy
+msgid "You have to specify a sample name to remove"
+msgstr "Meg kell adnia egy eltávolítandó csomagot"
+
+#: ../src/utils/pactl.c:1035
+#, fuzzy
+msgid "You have to specify a sink input index and a sink"
+msgstr "Meg kell adnia egy tárnevet/paramétert és értéket"
+
+#: ../src/utils/pactl.c:1045
+#, fuzzy
+msgid "You have to specify a source output index and a source"
+msgstr "Adja meg a kimeneti fájl helyét és nevét:"
+
+#: ../src/utils/pactl.c:1060
+#, fuzzy
+msgid "You have to specify a module name and arguments."
+msgstr "Meg kell adnia egy tárnevet/paramétert és értéket"
+
+#: ../src/utils/pactl.c:1080
+#, fuzzy
+msgid "You have to specify a module index"
+msgstr "Meg kell adnia egy archívumnevet."
+
+#: ../src/utils/pactl.c:1090
+msgid "You may not specify more than one sink. You have to specify a boolean value."
+msgstr ""
+
+#: ../src/utils/pactl.c:1103
+msgid "You may not specify more than one source. You have to specify a boolean value."
+msgstr ""
+
+#: ../src/utils/pactl.c:1115
+msgid "You have to specify a card name/index and a profile name"
+msgstr ""
+
+#: ../src/utils/pactl.c:1126
+#, fuzzy
+msgid "You have to specify a sink name/index and a port name"
+msgstr "Meg kell adnia egy tárnevet/paramétert és értéket"
+
+#: ../src/utils/pactl.c:1137
+msgid "You have to specify a source name/index and a port name"
+msgstr ""
+
+#: ../src/utils/pactl.c:1149
+#, fuzzy
+msgid "You have to specify a sink name/index and a volume"
+msgstr "Meg kell adnia egy tárnevet/paramétert és értéket"
+
+#: ../src/utils/pactl.c:1154
+#: ../src/utils/pactl.c:1171
+#: ../src/utils/pactl.c:1193
+#: ../src/utils/pactl.c:1209
+#: ../src/utils/pactl.c:1226
+#: ../src/utils/pactl.c:1248
+#, fuzzy
+msgid "Invalid volume specification"
+msgstr "%.*s: érvénytelen konverziós specifikáció"
+
+#: ../src/utils/pactl.c:1166
+msgid "You have to specify a source name/index and a volume"
+msgstr ""
+
+#: ../src/utils/pactl.c:1183
+msgid "You have to specify a sink input index and a volume"
+msgstr ""
+
+#: ../src/utils/pactl.c:1188
+#, fuzzy
+msgid "Invalid sink input index"
+msgstr "pa_context_move_sink_input_by_index() meghiúsult"
+
+#: ../src/utils/pactl.c:1204
+#, fuzzy
+msgid "You have to specify a sink name/index and a mute boolean"
+msgstr "Meg kell adnia egy tárnevet/paramétert és értéket"
+
+#: ../src/utils/pactl.c:1221
+msgid "You have to specify a source name/index and a mute boolean"
+msgstr ""
+
+#: ../src/utils/pactl.c:1238
+msgid "You have to specify a sink input index and a mute boolean"
+msgstr ""
+
+#: ../src/utils/pactl.c:1243
+#, fuzzy
+msgid "Invalid sink input index specification"
+msgstr "A(z) „%s” escape sorozat érvénytelen a bemenet elhatárolójának meghatározásában."
+
+#: ../src/utils/pactl.c:1262
+#, fuzzy
+msgid "No valid command specified."
+msgstr "nincs megadva a végrehajtandó parancs"
+
+#: ../src/utils/pax11publish.c:61
+#, c-format
+msgid ""
+"%s [-D display] [-S server] [-O sink] [-I source] [-c file]  [-d|-e|-i|-r]\n"
+"\n"
+" -d    Show current PulseAudio data attached to X11 display (default)\n"
+" -e    Export local PulseAudio data to X11 display\n"
+" -i    Import PulseAudio data from X11 display to local environment variables and cookie file.\n"
+" -r    Remove PulseAudio data from X11 display\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:94
+#, fuzzy, c-format
+msgid "Failed to parse command line.\n"
+msgstr "Nem lehet feldolgozni a(z) „%s” parancssort: %s"
+
+#: ../src/utils/pax11publish.c:108
+#, fuzzy, c-format
+msgid "Server: %s\n"
+msgstr "_Kiszolgáló:"
+
+#: ../src/utils/pax11publish.c:110
+#, fuzzy, c-format
+msgid "Source: %s\n"
+msgstr "Forrás:"
+
+#: ../src/utils/pax11publish.c:112
+#, fuzzy, c-format
+msgid "Sink: %s\n"
+msgstr "Bemenet"
+
+#: ../src/utils/pax11publish.c:114
+#, fuzzy, c-format
+msgid "Cookie: %s\n"
+msgstr "süti"
+
+#: ../src/utils/pax11publish.c:132
+#, fuzzy, c-format
+msgid "Failed to parse cookie data\n"
+msgstr "sikertelen a szimbólum adatainak a betöltése"
+
+#: ../src/utils/pax11publish.c:137
+#, fuzzy, c-format
+msgid "Failed to save cookie data\n"
+msgstr "sikertelen a szimbólum adatainak a betöltése"
+
+#: ../src/utils/pax11publish.c:152
+#, fuzzy, c-format
+msgid "Failed to load client configuration file.\n"
+msgstr "nem sikerült olvasásra megnyitni a beállítási fájlt"
+
+#: ../src/utils/pax11publish.c:157
+#, fuzzy, c-format
+msgid "Failed to read environment configuration data.\n"
+msgstr "Az adatok olvasása meghiúsult az adatfolyamból"
+
+#: ../src/utils/pax11publish.c:174
+#, fuzzy, c-format
+msgid "Failed to get FQDN.\n"
+msgstr "nem sikerült a képességek lekérdezése"
+
+#: ../src/utils/pax11publish.c:194
+#, fuzzy, c-format
+msgid "Failed to load cookie data\n"
+msgstr "sikertelen a szimbólum adatainak a betöltése"
+
+#: ../src/utils/pax11publish.c:211
+#, fuzzy, c-format
+msgid "Not yet implemented.\n"
+msgstr "Még nincs megvalósítva."
+
+#: ../src/utils/pacmd.c:69
+msgid "No PulseAudio daemon running, or not running as session daemon."
+msgstr ""
+
+#: ../src/utils/pacmd.c:74
+#, fuzzy, c-format
+msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
+msgstr "svc_unix.c - AF_UNIX gond van illesztőpont létrehozásával"
+
+#: ../src/utils/pacmd.c:91
+#, fuzzy, c-format
+msgid "connect(): %s"
+msgstr "\\kapcsolat: %s"
+
+#: ../src/utils/pacmd.c:99
+#, fuzzy
+msgid "Failed to kill PulseAudio daemon."
+msgstr "nem sikerült olvasni a Xen-szolgáltatásból"
+
+#: ../src/utils/pacmd.c:107
+#, fuzzy
+msgid "Daemon not responding."
+msgstr "„%s” nem válaszol."
+
+#: ../src/utils/pacmd.c:161
+#, fuzzy, c-format
+msgid "poll(): %s"
+msgstr "poll(): %s"
+
+#: ../src/utils/pacmd.c:171
+#: ../src/utils/pacmd.c:188
+#, fuzzy, c-format
+msgid "read(): %s"
+msgstr "read(): %s"
+
+#: ../src/utils/pacmd.c:207
+#: ../src/utils/pacmd.c:223
+#, fuzzy, c-format
+msgid "write(): %s"
+msgstr "write(): %s"
+
+#: ../src/pulsecore/lock-autospawn.c:136
+#: ../src/pulsecore/lock-autospawn.c:219
+#, fuzzy
+msgid "Cannot access autospawn lock."
+msgstr "A modul nem képes megfelelően zárolni az adatokat"
+
+#: ../src/modules/alsa/alsa-sink.c:530
+#: ../src/modules/alsa/alsa-sink.c:689
+#, c-format
+msgid ""
+"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-source.c:506
+#: ../src/modules/alsa/alsa-source.c:656
+#, c-format
+msgid ""
+"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
+msgstr ""
+
+#: ../src/modules/alsa/module-alsa-card.c:152
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
+#: ../src/modules/alsa/alsa-mixer.c:2931
+msgid "Off"
+msgstr "Kikapcsolva"
+
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#, fuzzy
+msgid "High Fidelity Playback (A2DP)"
+msgstr "A lejátszás nem szüneteltethető"
+
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#, fuzzy
+msgid "High Fidelity Capture (A2DP)"
+msgstr "Felvétel, hozzáfűzés a film végéhez"
+
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#, fuzzy
+msgid "Telephony Duplex (HSP/HFP)"
+msgstr "Mobiltelefon bázisállomás"
+
+#: ../src/modules/reserve-wrap.c:151
+msgid "PulseAudio Sound Server"
+msgstr "PulseAudio hangkiszolgáló"
+
+#: ../src/modules/module-rygel-media-server.c:569
+#: ../src/modules/module-rygel-media-server.c:583
+msgid "Output Devices"
+msgstr "Kimeneti eszközök"
+
+#: ../src/modules/module-rygel-media-server.c:570
+#: ../src/modules/module-rygel-media-server.c:584
+msgid "Input Devices"
+msgstr "Bemeneti eszközök"
+
+#: ../src/modules/module-rygel-media-server.c:774
+#, fuzzy
+msgid "Audio on @HOSTNAME@"
+msgstr "%(safeuser)s felhasználó listatagságai a(z) %(hostname)s gépen"
+
+#: ../src/modules/alsa/alsa-mixer.c:1701
+msgid "Input"
+msgstr "Bemenet"
+
+#: ../src/modules/alsa/alsa-mixer.c:1702
+msgid "Docking Station Input"
+msgstr "Dokkolóállomás bemenet"
+
+#: ../src/modules/alsa/alsa-mixer.c:1703
+msgid "Docking Station Microphone"
+msgstr "Dokkolóállomás mikrofon"
+
+#: ../src/modules/alsa/alsa-mixer.c:1704
+msgid "Line-In"
+msgstr "Vonalbemenet"
+
+#: ../src/modules/alsa/alsa-mixer.c:1705
+msgid "Microphone"
+msgstr "Mikrofon"
+
+#: ../src/modules/alsa/alsa-mixer.c:1706
+msgid "External Microphone"
+msgstr "Külső mikrofon"
+
+#: ../src/modules/alsa/alsa-mixer.c:1707
+msgid "Internal Microphone"
+msgstr "Belső mikrofon"
+
+#: ../src/modules/alsa/alsa-mixer.c:1708
+msgid "Radio"
+msgstr "Rádió"
+
+#: ../src/modules/alsa/alsa-mixer.c:1709
+msgid "Video"
+msgstr "Videó"
+
+#: ../src/modules/alsa/alsa-mixer.c:1710
+#, fuzzy
+msgid "Automatic Gain Control"
+msgstr "Automatikus beállításvezérlés"
+
+#: ../src/modules/alsa/alsa-mixer.c:1711
+#, fuzzy
+msgid "No Automatic Gain Control"
+msgstr "Nem található hangerőszabályzó"
+
+#: ../src/modules/alsa/alsa-mixer.c:1712
+msgid "Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1713
+#, fuzzy
+msgid "No Boost"
+msgstr "nincs automatikus indítás"
+
+#: ../src/modules/alsa/alsa-mixer.c:1714
+#, fuzzy
+msgid "Amplifier"
+msgstr "Műveleti erősítő"
+
+#: ../src/modules/alsa/alsa-mixer.c:1715
+#, fuzzy
+msgid "No Amplifier"
+msgstr "Műveleti erősítő"
+
+#: ../src/modules/alsa/alsa-mixer.c:1773
+msgid "Analog Input"
+msgstr "Analóg bemenet"
+
+#: ../src/modules/alsa/alsa-mixer.c:1774
+msgid "Analog Microphone"
+msgstr "Analóg mikrofon"
+
+#: ../src/modules/alsa/alsa-mixer.c:1775
+msgid "Analog Line-In"
+msgstr "Analóg vonalbemenet"
+
+#: ../src/modules/alsa/alsa-mixer.c:1776
+msgid "Analog Radio"
+msgstr "Analóg rádió"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
+msgid "Analog Video"
+msgstr "Analóg videó"
+
+#: ../src/modules/alsa/alsa-mixer.c:1778
+msgid "Analog Output"
+msgstr "Analóg kimenet"
+
+#: ../src/modules/alsa/alsa-mixer.c:1779
+msgid "Analog Headphones"
+msgstr "Analóg fejhallgató"
+
+#: ../src/modules/alsa/alsa-mixer.c:1780
+#, fuzzy
+msgid "Analog Output (LFE)"
+msgstr "Hiba a kimenet elindítása közben"
+
+#: ../src/modules/alsa/alsa-mixer.c:1781
+#, fuzzy
+msgid "Analog Mono Output"
+msgstr "A Mono.Addins hibakeresési kimenetének engedélyezése"
+
+#: ../src/modules/alsa/alsa-mixer.c:1981
+#, c-format
+msgid "%s+%s"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1984
+#: ../src/modules/alsa/alsa-mixer.c:3404
+#, c-format
+msgid "%s / %s"
+msgstr "%s / %s"
+
+#: ../src/modules/alsa/alsa-mixer.c:2790
+#, fuzzy
+msgid "Analog Mono"
+msgstr "Mono betöltő"
+
+#: ../src/modules/alsa/alsa-mixer.c:2791
+msgid "Analog Stereo"
+msgstr "Analóg sztereó"
+
+#: ../src/modules/alsa/alsa-mixer.c:2792
+msgid "Analog Surround 2.1"
+msgstr "Analóg térhatású 2.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:2793
+msgid "Analog Surround 3.0"
+msgstr "Analóg térhatású 3.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:2794
+msgid "Analog Surround 3.1"
+msgstr "Analóg térhatású 3.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:2795
+msgid "Analog Surround 4.0"
+msgstr "Analóg térhatású 4.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:2796
+msgid "Analog Surround 4.1"
+msgstr "Analóg térhatású 4.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:2797
+msgid "Analog Surround 5.0"
+msgstr "Analóg térhatású 5.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:2798
+msgid "Analog Surround 5.1"
+msgstr "Analóg térhatású 5.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:2799
+msgid "Analog Surround 6.0"
+msgstr "Analóg térhatású 6.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:2800
+msgid "Analog Surround 6.1"
+msgstr "Analóg térhatású 6.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:2801
+msgid "Analog Surround 7.0"
+msgstr "Analóg térhatású 7.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:2802
+msgid "Analog Surround 7.1"
+msgstr "Analóg térhatású 7.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:2803
+msgid "Digital Stereo (IEC958)"
+msgstr "Digitális sztereó (IEC958)"
+
+#: ../src/modules/alsa/alsa-mixer.c:2804
+msgid "Digital Surround 4.0 (IEC958)"
+msgstr "Digitális térhatású 4.0 (IEC958)"
+
+#: ../src/modules/alsa/alsa-mixer.c:2805
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr "Digitális térhatású 4.0 (IEC958/AC3)"
+
+#: ../src/modules/alsa/alsa-mixer.c:2806
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr "Digitális térhatású 5.1 (IEC958/AC3)"
+
+#: ../src/modules/alsa/alsa-mixer.c:2807
+msgid "Digital Stereo (HDMI)"
+msgstr "Digitális térhatású (HDMI)"
+
+#: ../src/modules/alsa/alsa-mixer.c:2928
+#, fuzzy
+msgid "Analog Mono Duplex"
+msgstr "Kétoldalas/fordítva beállítás"
+
+#: ../src/modules/alsa/alsa-mixer.c:2929
+#, fuzzy
+msgid "Analog Stereo Duplex"
+msgstr "Kétoldalas/fordítva beállítás"
+
+#: ../src/modules/alsa/alsa-mixer.c:2930
+#, fuzzy
+msgid "Digital Stereo Duplex (IEC958)"
+msgstr "Szteró LADSPA effekt rack"
+

commit 0f68e0f5f125973d6a16cb5218e6c75cb2264339
Author: warrink <warrink at fedoraproject.org>
Date:   Fri Oct 2 22:50:26 2009 +0000

    Sending translation for Dutch

diff --git a/po/nl.po b/po/nl.po
index 0506e66..b2a7370 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-30 09:44+0000\n"
+"POT-Creation-Date: 2009-10-02 20:57+0000\n"
 "PO-Revision-Date: 2009-09-30 16:47+0200\n"
 "Last-Translator: Geert Warrink <geert.warrink at onsnet.nu>\n"
 "Language-Team: nl <nl at li.org>\n"
@@ -1026,7 +1026,7 @@ msgstr "Eenheid onbekent"
 
 #: ../src/pulse/error.c:49
 msgid "Connection refused"
-msgstr "Verbinding geweigert"
+msgstr "Verbinding geweigerd"
 
 #: ../src/pulse/error.c:50
 msgid "Protocol error"

commit e53a24d48004d3bbca6fd1d066fac4313feb8017
Author: fgonz <fgonz at fedoraproject.org>
Date:   Sun Oct 4 19:24:35 2009 +0000

    Sending translation for Spanish

diff --git a/po/es.po b/po/es.po
index a38d24c..48a4f13 100644
--- a/po/es.po
+++ b/po/es.po
@@ -4,14 +4,15 @@
 # Domingo Becker <domingobecker at gmail.com>, 2009.
 # Héctor Daniel Cabrera <h.daniel.cabrera at gmail.com>, 2009.
 #
+# Fernando Gonzalez Blanco <fgonz at fedoraproject.org>, 2009.
 msgid ""
 msgstr ""
 "Project-Id-Version: PulseAudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-11 08:40-0300\n"
-"Last-Translator: Domingo Becker <domingobecker at gmail.com>\n"
-"Language-Team: Fedora Spanish <fedora-trans-es at redhat.com>\n"
+"POT-Creation-Date: 2009-10-04 16:37+0000\n"
+"PO-Revision-Date: 2009-10-04 21:16+0200\n"
+"Last-Translator: Fernando Gonzalez Blanco <fgonz at fedoraproject.org>\n"
+"Language-Team: Spanish <fedora-trans-es at redhat.com>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
@@ -2399,133 +2400,122 @@ msgstr "Servidor de Sonido PulseAudio"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "Dispositivos de salida"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
-#, fuzzy
 msgid "Input Devices"
-msgstr "Entrada %s"
+msgstr "Dispositivos de entrada"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "Audio en @HOSTNAME@"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
-#, fuzzy
 msgid "Input"
-msgstr "Entrada %s"
+msgstr "Entrada"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "Estación dock de entrada"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "Micrófono de la estación Dock"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "En línea"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "Micrófono"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "Micrófono externo"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "Audio Interno"
+msgstr "Micrófono interno"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "Radio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "Vídeo"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "Control automático de ganancia"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "Sin control automático de ganancia"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "Incremento de ganancia"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "Sin incremento de ganancia"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "Amplificador"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "Sin amplificador"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
-#, fuzzy
 msgid "Analog Input"
-msgstr "Mono Analógico"
+msgstr "Entrada analógica"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
-#, fuzzy
 msgid "Analog Microphone"
-msgstr "Mono Analógico"
+msgstr "Micrófono analógico"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
-#, fuzzy
 msgid "Analog Line-In"
-msgstr "Mono Analógico"
+msgstr "Entrada en línea analógica"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
-#, fuzzy
 msgid "Analog Radio"
-msgstr "Mono Analógico"
+msgstr "Radio analógico"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
-#, fuzzy
 msgid "Analog Video"
-msgstr "Estéreo Analógico"
+msgstr "Vídeo analógico"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "Salida Nula"
+msgstr "Salida analógica"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
-#, fuzzy
 msgid "Analog Headphones"
-msgstr "Mono Analógico"
+msgstr "Auriculares analógicos"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "Salida analógica (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
-#, fuzzy
 msgid "Analog Mono Output"
-msgstr "Mono Analógico"
+msgstr "Salida Mono analógica "
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
@@ -2536,19 +2526,16 @@ msgid "Analog Stereo"
 msgstr "Estéreo Analógico"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "Análogo Envolvente 4.1"
+msgstr "Análogico Envolvente 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "Análogo Envolvente 4.0"
+msgstr "Análogico Envolvente 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "Análogo Envolvente 4.1"
+msgstr "Análogico Envolvente 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Surround 4.0"
@@ -2567,19 +2554,16 @@ msgid "Analog Surround 5.1"
 msgstr "Análogo Envolvente 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "Análogo Envolvente 4.0"
+msgstr "Análogico Envolvente 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "Análogo Envolvente 4.1"
+msgstr "Análogico Envolvente 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "Análogo Envolvente 4.0"
+msgstr "Análogico Envolvente 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 7.1"
@@ -2590,9 +2574,8 @@ msgid "Digital Stereo (IEC958)"
 msgstr "Estéreo Digital (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
-#, fuzzy
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr "Digital Envolvente 4.0 (IEC9588/AC3)"
+msgstr "Digital Envolvente 4.0 (IEC9588)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
@@ -2607,19 +2590,16 @@ msgid "Digital Stereo (HDMI)"
 msgstr "Estéreo Digital (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
-#, fuzzy
 msgid "Analog Mono Duplex"
-msgstr "Mono Analógico"
+msgstr "Mono Analógico.Duplex"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
-#, fuzzy
 msgid "Analog Stereo Duplex"
-msgstr "Estéreo Analógico"
+msgstr "Estéreo Analógico.Duplex"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
-#, fuzzy
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr "Estéreo Digital (IEC958)"
+msgstr "Estéreo Digital Duplex(IEC958)"
 
 #~ msgid "Invalid client name '%s'\n"
 #~ msgstr "Nombre de cliente inválido '%s'\n"

commit 16e9ff261cceb19671c95808f1a48821815c2f22
Author: mvdz <mvdz at fedoraproject.org>
Date:   Tue Oct 6 10:22:55 2009 +0000

    Sending translation for Ukrainian

diff --git a/po/uk.po b/po/uk.po
index a341cd6..aacdf94 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -6,16 +6,16 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-11 17:38+0300\n"
+"POT-Creation-Date: 2009-10-03 10:02+0000\n"
+"PO-Revision-Date: 2009-10-03 19:28+0300\n"
 "Last-Translator: Yuri Chornoivan <yurchor at ukr.net>\n"
 "Language-Team: Ukrainian <translation at linux.org.ua>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Lokalize 0.3\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
-"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 "
+"&& (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
 #: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
 #, c-format
@@ -224,8 +224,7 @@ msgstr ""
 
 #: ../src/daemon/main.c:583
 msgid "Running in system mode, but --disallow-exit not set!"
-msgstr ""
-"Запуск у загальносистемному режимі, але не встановлено --disallow-exit!"
+msgstr "Запуск у загальносистемному режимі, але не встановлено --disallow-exit!"
 
 #: ../src/daemon/main.c:586
 msgid "Running in system mode, but --disallow-module-loading not set!"
@@ -1168,8 +1167,7 @@ msgstr "Не вдалося відкрити файл налаштування 
 
 #: ../src/pulse/context.c:550
 msgid "No cookie loaded. Attempting to connect without."
-msgstr ""
-"Куків не завантажено. Буде виконано спробу з’єднання за їх відсутності."
+msgstr "Куків не завантажено. Буде виконано спробу з’єднання за їх відсутності."
 
 #: ../src/pulse/context.c:693
 #, c-format
@@ -1343,8 +1341,7 @@ msgstr "Час: %0.3f сек.; Латентність: %0.0f мкс."
 #: ../src/utils/pacat.c:599
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
-msgstr ""
-"Спроба виконання pa_stream_update_timing_info() завершилася невдало: %s"
+msgstr "Спроба виконання pa_stream_update_timing_info() завершилася невдало: %s"
 
 #: ../src/utils/pacat.c:609
 #, c-format
@@ -1558,10 +1555,8 @@ msgstr "Попередження: не вдалося записати карт
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr ""
-"Відкриття потоку %s з частотною специфікацією «%s» і картою каналів «%s»."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr "Відкриття потоку %s з частотною специфікацією «%s» і картою каналів «%s»."
 
 #: ../src/utils/pacat.c:1009
 msgid "recording"
@@ -1635,8 +1630,7 @@ msgstr "Отримано сигнал SIGINT, завершення роботи.
 #: ../src/utils/pasuspender.c:194
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
-msgstr ""
-"ПОПЕРЕДЖЕННЯ: виконання дочірнього процесу було перервано з сигналом %u\n"
+msgstr "ПОПЕРЕДЖЕННЯ: виконання дочірнього процесу було перервано з сигналом %u\n"
 
 #: ../src/utils/pasuspender.c:212
 #, c-format
@@ -1696,8 +1690,7 @@ msgstr "Зараз використано: %u блоків, що містять
 #: ../src/utils/pactl.c:144
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
-msgstr ""
-"Виділено протягом виконання загалом: %u блоків, що містять %s байтів.\n"
+msgstr "Виділено протягом виконання загалом: %u блоків, що містять %s байтів.\n"
 
 #: ../src/utils/pactl.c:147
 #, c-format
@@ -2203,18 +2196,15 @@ msgstr "Некоректний індекс вхідних даних прийм
 
 #: ../src/utils/pactl.c:1204
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr ""
-"Вам слід вказати назву/індекс приймача і булеве значення вимикання звуку"
+msgstr "Вам слід вказати назву/індекс приймача і булеве значення вимикання звуку"
 
 #: ../src/utils/pactl.c:1221
 msgid "You have to specify a source name/index and a mute boolean"
-msgstr ""
-"Вам слід вказати назву/індекс джерела і булеве значення вимикання звуку"
+msgstr "Вам слід вказати назву/індекс джерела і булеве значення вимикання звуку"
 
 #: ../src/utils/pactl.c:1238
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr ""
-"Вам слід вказати індекс приймача даних і булеве значення вимикання звуку"
+msgstr "Вам слід вказати індекс приймача даних і булеве значення вимикання звуку"
 
 #: ../src/utils/pactl.c:1243
 msgid "Invalid sink input index specification"
@@ -2323,8 +2313,7 @@ msgstr "connect(): %s"
 
 #: ../src/utils/pacmd.c:99
 msgid "Failed to kill PulseAudio daemon."
-msgstr ""
-"Спроба завершення роботи фонової служби PulseAudio завершилася невдало."
+msgstr "Спроба завершення роботи фонової служби PulseAudio завершилася невдало."
 
 #: ../src/utils/pacmd.c:107
 msgid "Daemon not responding."
@@ -2408,217 +2397,202 @@ msgstr "Звуковий сервер PulseAudio"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "Пристрої відтворення"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "Пристрої отримання"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "Звук на @НАЗВАВУЗЛА@"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "Вхід"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "Вхідний канал стикувальної станції"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "Мікрофон стикувальної станції"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "Лінійний вхід"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "Мікрофон"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "Зовнішній мікрофон"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "Вбудоване аудіо"
+msgstr "Вбудований мікрофон"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "Радіо"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "Відео"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "Автоматичне керування підсиленням"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "Без автоматичного керування підсиленням"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "Підсилення"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "Без пісилення"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "Підсилювач"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "Без підсилювача"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "Аналогових вхід"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "Аналоговий мікрофон"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "Аналоговий лінійний вхід"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "Аналогове радіо"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "Аналогове відео"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "Нуль-відтворення"
+msgstr "Аналогове відтворення"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "Аналогові навушники"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "Аналоговий вихід (сабвуфер)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "Аналоговий моно-вихід"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#: ../src/modules/alsa/alsa-mixer.c:1981, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "Аналогове моно"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
-#, fuzzy
 msgid "Analog Stereo"
-msgstr "Стерео"
+msgstr "Аналогове стерео"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "Об'ємний 4.1"
+msgstr "Аналоговий об'ємний 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "Об'ємний 4.0"
+msgstr "Аналоговий об'ємний 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "Об'ємний 4.1"
+msgstr "Аналоговий об'ємний 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
-#, fuzzy
 msgid "Analog Surround 4.0"
-msgstr "Об'ємний 4.0"
+msgstr "Аналоговий об'ємний 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
-#, fuzzy
 msgid "Analog Surround 4.1"
-msgstr "Об'ємний 4.1"
+msgstr "Аналоговий об'ємний 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
-#, fuzzy
 msgid "Analog Surround 5.0"
-msgstr "Об'ємний 5.0"
+msgstr "Аналоговий об'ємний 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
-#, fuzzy
 msgid "Analog Surround 5.1"
-msgstr "Об'ємний 5.1"
+msgstr "Аналоговий об'ємний 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "Об'ємний 4.0"
+msgstr "Аналоговий об'ємний 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "Об'ємний 4.1"
+msgstr "Аналоговий об'ємний 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "Об'ємний 4.0"
+msgstr "Аналоговий об'ємний 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
-#, fuzzy
 msgid "Analog Surround 7.1"
-msgstr "Об'ємний 7.1"
+msgstr "Аналоговий об'ємний 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "Цифрове стерео (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "Цифровий об’ємний 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "Цифровий об’ємний 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "Цифровий об’ємний 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "Цифровий стерео (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "Аналогове двобічне моно"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "Аналогове двобічне стерео"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "Цифрове двобічне стерео (IEC958)"
+

commit e7ec9d59879fbeccb6b50c70890b8fa3740a112e
Author: kami911 <kami911 at fedoraproject.org>
Date:   Fri Oct 9 06:17:41 2009 +0000

    Sending translation for Hungarian

diff --git a/po/hu.po b/po/hu.po
index c3cd24f..7353267 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -15,9 +15,9 @@ msgstr ""
 
 #: ../src/modules/alsa/alsa-util.c:858
 #: ../src/pulsecore/sink.c:2629
-#, fuzzy, c-format
+#, c-format
 msgid "%s %s"
-msgstr "%s.%s"
+msgstr "%s %s"
 
 #: ../src/modules/alsa/alsa-util.c:1106
 #, c-format
@@ -93,9 +93,9 @@ msgid "Failed to add bind-now-loader."
 msgstr "nem sikerült hozzáadni a tartományt a csatlakozások hasítótáblázatához"
 
 #: ../src/daemon/main.c:141
-#, fuzzy, c-format
+#, c-format
 msgid "Got signal %s."
-msgstr "Szignálnév"
+msgstr "Szignál: %s."
 
 #: ../src/daemon/main.c:168
 msgid "Exiting."
@@ -168,9 +168,8 @@ msgid "Failed to parse command line."
 msgstr "Nem lehet feldolgozni a(z) „%s” parancssort: %s"
 
 #: ../src/daemon/main.c:541
-#, fuzzy
 msgid "Daemon not running"
-msgstr "A démon nem fut"
+msgstr "A démon nem fut."
 
 #: ../src/daemon/main.c:543
 #, fuzzy, c-format
@@ -265,9 +264,9 @@ msgid "Running on host: %s"
 msgstr "Python %s verzió"
 
 #: ../src/daemon/main.c:739
-#, fuzzy, c-format
+#, c-format
 msgid "Found %u CPUs."
-msgstr "Minden CPU"
+msgstr "%u CPU található a rendszerben."
 
 #: ../src/daemon/main.c:741
 #, fuzzy, c-format
@@ -290,17 +289,12 @@ msgid "Running in valgrind mode: %s"
 msgstr "Bemutató mód"
 
 #: ../src/daemon/main.c:752
-#, fuzzy
 msgid "Optimized build: yes"
-msgstr ""
-"&Igen\n"
-"&Nem\n"
-"&Mégsem"
+msgstr "Optimalizált összeépítés: Igen"
 
 #: ../src/daemon/main.c:754
-#, fuzzy
 msgid "Optimized build: no"
-msgstr "Nincs fordítási függősége a következőnek: %s.\n"
+msgstr "Optimalizált összeépítés: Nem"
 
 #: ../src/daemon/main.c:758
 #, fuzzy
@@ -656,9 +650,8 @@ msgid "### Read from configuration file: %s ###\n"
 msgstr "%s: Olvasási hiba a(z) %s fájlban\n"
 
 #: ../src/daemon/caps.c:62
-#, fuzzy
 msgid "Cleaning up privileges."
-msgstr "Csomagok tisztítása"
+msgstr "Jogosultságok letisztázása."
 
 #: ../src/daemon/pulseaudio.desktop.in.h:1
 msgid "PulseAudio Sound System"
@@ -675,15 +668,15 @@ msgstr "Mono"
 
 #: ../src/pulse/channelmap.c:107
 msgid "Front Center"
-msgstr "Szemközti középső"
+msgstr "Első középső"
 
 #: ../src/pulse/channelmap.c:108
 msgid "Front Left"
-msgstr "Szemközti bal"
+msgstr "Első bal"
 
 #: ../src/pulse/channelmap.c:109
 msgid "Front Right"
-msgstr "Szemközti jobb"
+msgstr "Első jobb"
 
 #: ../src/pulse/channelmap.c:111
 msgid "Rear Center"
@@ -698,224 +691,180 @@ msgid "Rear Right"
 msgstr "Hátsó jobb"
 
 #: ../src/pulse/channelmap.c:115
-#, fuzzy
 msgid "Low Frequency Emmiter"
-msgstr "Az internetes rádióállomás frekvenciája"
+msgstr "Mély-hangszóró (LFE)"
 
 #: ../src/pulse/channelmap.c:117
-#, fuzzy
 msgid "Front Left-of-center"
-msgstr "Balra, jobbra vagy középre igazítás"
+msgstr "Első közép-bal"
 
 #: ../src/pulse/channelmap.c:118
-#, fuzzy
 msgid "Front Right-of-center"
-msgstr "Balra, jobbra vagy középre igazítás"
+msgstr "Első közép-jobb"
 
 #: ../src/pulse/channelmap.c:120
-#, fuzzy
 msgid "Side Left"
 msgstr "Bal oldalsó"
 
 #: ../src/pulse/channelmap.c:121
-#, fuzzy
 msgid "Side Right"
 msgstr "Jobb oldalsó"
 
 #: ../src/pulse/channelmap.c:123
-#, fuzzy
 msgid "Auxiliary 0"
-msgstr "Folyamat/kiegészítő művelet"
+msgstr "Külső 0"
 
 #: ../src/pulse/channelmap.c:124
-#, fuzzy
 msgid "Auxiliary 1"
-msgstr "Folyamat/kiegészítő művelet"
+msgstr "Külső 1"
 
 #: ../src/pulse/channelmap.c:125
-#, fuzzy
 msgid "Auxiliary 2"
-msgstr "Folyamat/kiegészítő művelet"
+msgstr "Külső 2"
 
 #: ../src/pulse/channelmap.c:126
-#, fuzzy
 msgid "Auxiliary 3"
-msgstr "Folyamat/kiegészítő művelet"
+msgstr "Külső 3"
 
 #: ../src/pulse/channelmap.c:127
-#, fuzzy
 msgid "Auxiliary 4"
-msgstr "Folyamat/kiegészítő művelet"
+msgstr "Külső 4"
 
 #: ../src/pulse/channelmap.c:128
-#, fuzzy
 msgid "Auxiliary 5"
-msgstr "Folyamat/kiegészítő művelet"
+msgstr "Külső 5"
 
 #: ../src/pulse/channelmap.c:129
-#, fuzzy
 msgid "Auxiliary 6"
-msgstr "Folyamat/kiegészítő művelet"
+msgstr "Külső 6"
 
 #: ../src/pulse/channelmap.c:130
-#, fuzzy
 msgid "Auxiliary 7"
-msgstr "Folyamat/kiegészítő művelet"
+msgstr "Külső 7"
 
 #: ../src/pulse/channelmap.c:131
-#, fuzzy
 msgid "Auxiliary 8"
-msgstr "Folyamat/kiegészítő művelet"
+msgstr "Külső 8"
 
 #: ../src/pulse/channelmap.c:132
-#, fuzzy
 msgid "Auxiliary 9"
-msgstr "Folyamat/kiegészítő művelet"
+msgstr "Külső 9"
 
 #: ../src/pulse/channelmap.c:133
-#, fuzzy
 msgid "Auxiliary 10"
-msgstr "#10 boríték"
+msgstr "Külső 10"
 
 #: ../src/pulse/channelmap.c:134
-#, fuzzy
 msgid "Auxiliary 11"
-msgstr "5-11 éveseknek"
+msgstr "Külső 11"
 
 #: ../src/pulse/channelmap.c:135
-#, fuzzy
 msgid "Auxiliary 12"
-msgstr "#12 boríték"
+msgstr "Külső 12"
 
 #: ../src/pulse/channelmap.c:136
-#, fuzzy
 msgid "Auxiliary 13"
-msgstr "13 jegy"
+msgstr "Külső 13"
 
 #: ../src/pulse/channelmap.c:137
-#, fuzzy
 msgid "Auxiliary 14"
-msgstr "#14 boríték"
+msgstr "Külső 14"
 
 #: ../src/pulse/channelmap.c:138
-#, fuzzy
 msgid "Auxiliary 15"
-msgstr "15 fok  (%s)"
+msgstr "Külső 15"
 
 #: ../src/pulse/channelmap.c:139
-#, fuzzy
 msgid "Auxiliary 16"
-msgstr "16:9 (szélesvásznú)"
+msgstr "Külső 16"
 
 #: ../src/pulse/channelmap.c:140
-#, fuzzy
 msgid "Auxiliary 17"
-msgstr "17 USD"
+msgstr "Külső 17"
 
 #: ../src/pulse/channelmap.c:141
-#, fuzzy
 msgid "Auxiliary 18"
-msgstr "GTK+ 2.18"
+msgstr "Külső 18"
 
 #: ../src/pulse/channelmap.c:142
-#, fuzzy
 msgid "Auxiliary 19"
-msgstr "19.2 Kb/mp modem"
+msgstr "Külső 19"
 
 #: ../src/pulse/channelmap.c:143
-#, fuzzy
 msgid "Auxiliary 20"
-msgstr "Kivonás: 0-tól 20-ig"
+msgstr "Külső 20"
 
 #: ../src/pulse/channelmap.c:144
-#, fuzzy
 msgid "Auxiliary 21"
-msgstr "Folyamat/kiegészítő művelet"
+msgstr "Külső 21"
 
 #: ../src/pulse/channelmap.c:145
-#, fuzzy
 msgid "Auxiliary 22"
-msgstr "Folyamat/kiegészítő művelet"
+msgstr "Külső 22"
 
 #: ../src/pulse/channelmap.c:146
-#, fuzzy
 msgid "Auxiliary 23"
-msgstr "2009-09-23"
+msgstr "Külső 23"
 
 #: ../src/pulse/channelmap.c:147
-#, fuzzy
 msgid "Auxiliary 24"
-msgstr "24 órás"
+msgstr "Külső 24"
 
 #: ../src/pulse/channelmap.c:148
-#, fuzzy
 msgid "Auxiliary 25"
-msgstr "25% szürke"
+msgstr "Külső 25"
 
 #: ../src/pulse/channelmap.c:149
-#, fuzzy
 msgid "Auxiliary 26"
-msgstr "Imigre-_26…"
+msgstr "Külső 26"
 
 #: ../src/pulse/channelmap.c:150
-#, fuzzy
 msgid "Auxiliary 27"
-msgstr "Folyamat/kiegészítő művelet"
+msgstr "Külső 27"
 
 #: ../src/pulse/channelmap.c:151
-#, fuzzy
 msgid "Auxiliary 28"
-msgstr "GNOME 2.28"
+msgstr "Külső 28"
 
 #: ../src/pulse/channelmap.c:152
-#, fuzzy
 msgid "Auxiliary 29"
-msgstr "Folyamat/kiegészítő művelet"
+msgstr "Külső 29"
 
 #: ../src/pulse/channelmap.c:153
-#, fuzzy
 msgid "Auxiliary 30"
-msgstr "30 perc"
+msgstr "Külső 30"
 
 #: ../src/pulse/channelmap.c:154
-#, fuzzy
 msgid "Auxiliary 31"
-msgstr "1999 szeptember 31."
+msgstr "Külső 31"
 
 #: ../src/pulse/channelmap.c:156
-#, fuzzy
 msgid "Top Center"
-msgstr "Fent, középen"
+msgstr "Felső középső"
 
 #: ../src/pulse/channelmap.c:158
-#, fuzzy
 msgid "Top Front Center"
-msgstr "A bekezdés igazítása középre"
+msgstr "Felső első középső"
 
 #: ../src/pulse/channelmap.c:159
-#, fuzzy
 msgid "Top Front Left"
-msgstr "Elhelyezés balra felülre"
+msgstr "Felső első bal"
 
 #: ../src/pulse/channelmap.c:160
-#, fuzzy
 msgid "Top Front Right"
-msgstr "Elhelyezés jobbra felülre"
+msgstr "Felső első jobb"
 
 #: ../src/pulse/channelmap.c:162
-#, fuzzy
 msgid "Top Rear Center"
-msgstr "A bekezdés igazítása középre"
+msgstr "Felső hátsó középső"
 
 #: ../src/pulse/channelmap.c:163
-#, fuzzy
 msgid "Top Rear Left"
-msgstr "Elhelyezés balra felülre"
+msgstr "Felső hátsó bal"
 
 #: ../src/pulse/channelmap.c:164
-#, fuzzy
 msgid "Top Rear Right"
-msgstr "Elhelyezés jobbra felülre"
+msgstr "Felső hátsó jobb"
 
 #: ../src/pulse/channelmap.c:484
 #: ../src/pulse/sample.c:170
@@ -923,7 +872,6 @@ msgstr "Elhelyezés jobbra felülre"
 #: ../src/pulse/volume.c:321
 #: ../src/pulse/volume.c:341
 #: ../src/pulse/volume.c:371
-#, fuzzy
 msgid "(invalid)"
 msgstr "(Érvénytelen)"
 
@@ -1081,19 +1029,19 @@ msgid "%s %uch %uHz"
 msgstr ""
 
 #: ../src/pulse/sample.c:184
-#, fuzzy, c-format
+#, c-format
 msgid "%0.1f GiB"
-msgstr "%.1f GiB"
+msgstr "%0.1f GiB"
 
 #: ../src/pulse/sample.c:186
-#, fuzzy, c-format
+#, c-format
 msgid "%0.1f MiB"
-msgstr "%.1f MiB"
+msgstr "%0.1f MiB"
 
 #: ../src/pulse/sample.c:188
-#, fuzzy, c-format
+#, c-format
 msgid "%0.1f KiB"
-msgstr "%.1f KiB"
+msgstr "%0.1f KiB"
 
 #: ../src/pulse/sample.c:190
 #, c-format
@@ -1102,9 +1050,8 @@ msgstr ""
 
 #: ../src/pulse/client-conf-x11.c:55
 #: ../src/utils/pax11publish.c:100
-#, fuzzy
 msgid "XOpenDisplay() failed"
-msgstr "<b>Sikertelen bejelentkezést</b>"
+msgstr "Az XOpenDisplay() függvényhívás meghiúsult."
 
 #: ../src/pulse/client-conf-x11.c:93
 #, fuzzy
@@ -1121,14 +1068,14 @@ msgid "No cookie loaded. Attempting to connect without."
 msgstr ""
 
 #: ../src/pulse/context.c:693
-#, fuzzy, c-format
+#, c-format
 msgid "fork(): %s"
-msgstr "programindítás: %s"
+msgstr "Programindítás: %s"
 
 #: ../src/pulse/context.c:748
-#, fuzzy, c-format
+#, c-format
 msgid "waitpid(): %s"
-msgstr "Váratlan hiba a waitpid()-ben (%s)"
+msgstr "waitpid(): %s"
 
 #: ../src/pulse/context.c:1438
 #, fuzzy, c-format
@@ -1151,34 +1098,34 @@ msgid "Draining connection to server."
 msgstr "Kapcsolat visszaállítása a kiszolgálóhoz"
 
 #: ../src/utils/pacat.c:136
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_drain(): %s"
-msgstr "pa_ext_stream_restore_read() meghiúsult"
+msgstr "pa_stream_drain(): %s"
 
 #: ../src/utils/pacat.c:159
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_write() failed: %s"
-msgstr "pa_ext_stream_restore_write() meghiúsult"
+msgstr "A „pa_stream_write()” függvényhívás meghiúsult: %s"
 
 #: ../src/utils/pacat.c:197
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_begin_write() failed: %s"
-msgstr "pa_ext_stream_restore_write() meghiúsult"
+msgstr "A „pa_stream_begin_write()” függvényhívás meghiúsult: %s"
 
 #: ../src/utils/pacat.c:237
 #: ../src/utils/pacat.c:267
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_peek() failed: %s"
-msgstr "pa_ext_stream_restore_read() meghiúsult"
+msgstr "A „pa_stream_peek()” függvényhívás meghiúsult: %s"
 
 #: ../src/utils/pacat.c:307
 msgid "Stream successfully created."
 msgstr "Az adatfolyam sikeresen létrejött."
 
 #: ../src/utils/pacat.c:310
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
-msgstr "pa_context_get_client_info() meghiúsult"
+msgstr "A „pa_stream_get_buffer_attr()” függvényhívás meghiúsult: %s"
 
 #: ../src/utils/pacat.c:314
 #, c-format
@@ -1201,34 +1148,34 @@ msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Kapcsolódva az eszközhöz a következőn: %s"
 
 #: ../src/utils/pacat.c:335
-#, fuzzy, c-format
+#, c-format
 msgid "Stream error: %s"
-msgstr "Folyam hiba"
+msgstr "Adatfolyam hiba: %s"
 
 #: ../src/utils/pacat.c:345
-#, fuzzy, c-format
+#, c-format
 msgid "Stream device suspended.%s"
-msgstr "Az eszköz nem adatfolyam"
+msgstr "Adatfolyam-eszköz készenléti állapotban: %s"
 
 #: ../src/utils/pacat.c:347
-#, fuzzy, c-format
+#, c-format
 msgid "Stream device resumed.%s"
-msgstr "Az eszköz nem adatfolyam"
+msgstr "Adatfolyam-eszköz visszatért a készenléti állapotból: %s"
 
 #: ../src/utils/pacat.c:355
-#, fuzzy, c-format
+#, c-format
 msgid "Stream underrun.%s"
-msgstr "Vége az adatfolyamnak"
+msgstr "%s adatfolyam alulcsordulás."
 
 #: ../src/utils/pacat.c:362
-#, fuzzy, c-format
+#, c-format
 msgid "Stream overrun.%s"
-msgstr "%s: a bemenet túlcsordult"
+msgstr "%s adatfolyam túlcsordulás."
 
 #: ../src/utils/pacat.c:369
-#, fuzzy, c-format
+#, c-format
 msgid "Stream started.%s"
-msgstr "%s tartomány elindítva\n"
+msgstr "%s adatfolyam elindítva."
 
 #: ../src/utils/pacat.c:376
 #, fuzzy, c-format
@@ -1251,9 +1198,9 @@ msgid "Connection established.%s"
 msgstr "Kapcsolat létrehozva"
 
 #: ../src/utils/pacat.c:418
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_new() failed: %s"
-msgstr "Az új adatfolyam indítása meghiúsult"
+msgstr "A „pa_stream_new()” függvényhívás meghiúsult: %s"
 
 #: ../src/utils/pacat.c:450
 #, fuzzy, c-format
@@ -1267,9 +1214,9 @@ msgstr "A megfigyelő adatfolyam csatlakoztatása meghiúsult"
 
 #: ../src/utils/pacat.c:470
 #: ../src/utils/pactl.c:857
-#, fuzzy, c-format
+#, c-format
 msgid "Connection failure: %s"
-msgstr "Hitelesítési hiba"
+msgstr "Kapcsolódási hiba: %s"
 
 #: ../src/utils/pacat.c:503
 #, fuzzy
@@ -1277,14 +1224,13 @@ msgid "Got EOF."
 msgstr "Üzenet érkezett: #%"
 
 #: ../src/utils/pacat.c:540
-#, fuzzy, c-format
+#, c-format
 msgid "write() failed: %s"
-msgstr "az írás sikertelen"
+msgstr "Az írás sikertelen: %s"
 
 #: ../src/utils/pacat.c:561
-#, fuzzy
 msgid "Got signal, exiting."
-msgstr "%d szignál érkezett, kilépés…\n"
+msgstr "Kilépés, szignál hatására…"
 
 #: ../src/utils/pacat.c:575
 #, fuzzy, c-format
@@ -1297,9 +1243,9 @@ msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "%d csoport elmentve ebben: \"%s\" %.1f másodperc alatt (%.0f csoport/mp)"
 
 #: ../src/utils/pacat.c:599
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
-msgstr "pa_context_get_client_info() meghiúsult"
+msgstr "A „pa_stream_update_timing_info()” függvényhívás meghiúsult: %s"
 
 #: ../src/utils/pacat.c:609
 #, c-format
@@ -1352,69 +1298,65 @@ msgstr "A program kapcsolói ütköznek"
 
 #: ../src/utils/pacat.c:764
 #: ../src/utils/pactl.c:953
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid client name '%s'"
-msgstr "%s: érvénytelen kapcsolónév"
+msgstr "Érvénytelen kliensnév: „%s”"
 
 #: ../src/utils/pacat.c:779
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid stream name '%s'"
-msgstr "%s: érvénytelen kapcsolónév"
+msgstr "Érvénytelen adatfolyam-név: „%s”"
 
 #: ../src/utils/pacat.c:816
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid channel map '%s'"
-msgstr "Érvénytelen csatornatípus '%s'"
+msgstr "Érvénytelen csatornaleképzés: „%s”"
 
 #: ../src/utils/pacat.c:845
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid latency specification '%s'"
-msgstr "%.*s: érvénytelen konverziós specifikáció"
+msgstr "Érvénytelen késleltetés leírás: „%s”"
 
 #: ../src/utils/pacat.c:852
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid process time specification '%s'"
-msgstr "Nem adott meg folyamat-specifikációt"
+msgstr "Érvénytelen műveleti idő leírás: „%s”"
 
 #: ../src/utils/pacat.c:864
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid property '%s'"
-msgstr "Érvénytelen %s tulajdonságérték"
+msgstr "Érvénytelen tulajdonság: „%s”"
 
 #: ../src/utils/pacat.c:881
-#, fuzzy, c-format
+#, c-format
 msgid "Unknown file format %s."
-msgstr "Ismeretlen fájlformátum: \"%s\""
+msgstr "Ismeretlen fájlformátum: „%s”"
 
 #: ../src/utils/pacat.c:900
-#, fuzzy
 msgid "Invalid sample specification"
-msgstr "%.*s: érvénytelen konverziós specifikáció"
+msgstr "Érvénytelen mintavételi leírás."
 
 #: ../src/utils/pacat.c:910
-#, fuzzy, c-format
+#, c-format
 msgid "open(): %s"
-msgstr "%s:%d megnyitása"
+msgstr "Megnyitás: %s"
 
 #: ../src/utils/pacat.c:915
-#, fuzzy, c-format
+#, c-format
 msgid "dup2(): %s"
-msgstr "a dup2 meghiúsult"
+msgstr "dup2(): %s"
 
 #: ../src/utils/pacat.c:922
-#, fuzzy
 msgid "Too many arguments."
-msgstr "túl sok argumentum"
+msgstr "Túl sok paraméter."
 
 #: ../src/utils/pacat.c:933
-#, fuzzy
 msgid "Failed to generate sample specification for file."
-msgstr "meghiúsult az alábbi beállító fájl megnyitása olvasásra: `%.255s'"
+msgstr "Nem sikerült létrehozni a mintavételi leírást a fájlhoz."
 
 #: ../src/utils/pacat.c:953
-#, fuzzy
 msgid "Failed to open audio file."
-msgstr "Nem sikerült megnyitni az átmeneti fájlt"
+msgstr "Nem sikerült megnyitni a hangfájlt."
 
 #: ../src/utils/pacat.c:959
 msgid "Warning: specified sample specification will be overwritten with specification from file."
@@ -1422,23 +1364,20 @@ msgstr ""
 
 #: ../src/utils/pacat.c:962
 #: ../src/utils/pactl.c:997
-#, fuzzy
 msgid "Failed to determine sample specification from file."
-msgstr "RGB-adat betöltése a TIFF-fájlból sikertelen"
+msgstr "Nem sikerült meghatározni a mintavételi leírást a fájlból."
 
 #: ../src/utils/pacat.c:971
 msgid "Warning: Failed to determine channel map from file."
 msgstr ""
 
 #: ../src/utils/pacat.c:982
-#, fuzzy
 msgid "Channel map doesn't match sample specification"
-msgstr "%s: a tanúsítvány „%s” általános neve nem egyezik a kért „%s” gépnévvel.\n"
+msgstr "A csatornaleképzés nem feleltethető meg a mintavételi leírásnak."
 
 #: ../src/utils/pacat.c:993
-#, fuzzy
 msgid "Warning: failed to write channel map to file."
-msgstr "Hiba történt a fájl írása közben. A fájlnév rendben van?"
+msgstr "Hiba történt a csatornaleképzés fájlba írása közben."
 
 #: ../src/utils/pacat.c:1008
 #, c-format
@@ -1446,68 +1385,61 @@ msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
 
 #: ../src/utils/pacat.c:1009
-#, fuzzy
 msgid "recording"
-msgstr "felvétel"
+msgstr "Felvétel"
 
 #: ../src/utils/pacat.c:1009
-#, fuzzy
 msgid "playback"
 msgstr "Lejátszás"
 
 #: ../src/utils/pacat.c:1035
 #: ../src/utils/pactl.c:1267
-#, fuzzy
 msgid "pa_mainloop_new() failed."
-msgstr "Nem sikerült megnyitni a(z) %s.new fájlt"
+msgstr "A „pa_mainloop_new()” függvényhívás meghiúsult."
 
 #: ../src/utils/pacat.c:1054
-#, fuzzy
 msgid "io_new() failed."
-msgstr "Nem sikerült megnyitni a(z) %s.new fájlt"
+msgstr "A „io_new()” függvényhívás meghiúsult."
 
 #: ../src/utils/pacat.c:1061
 #: ../src/utils/pactl.c:1279
-#, fuzzy
 msgid "pa_context_new() failed."
-msgstr "pa_context_subscribe() meghiúsult"
+msgstr "A „pa_context_new()” függvényhívás meghiúsult."
 
 #: ../src/utils/pacat.c:1069
 #: ../src/utils/pactl.c:1285
-#, fuzzy, c-format
+#, c-format
 msgid "pa_context_connect() failed: %s"
-msgstr "pa_context_subscribe() meghiúsult"
+msgstr "A „pa_context_connect()” függvényhívás meghiúsult: %s"
 
 #: ../src/utils/pacat.c:1075
-#, fuzzy
 msgid "pa_context_rttime_new() failed."
-msgstr "az új kontextus kiszámítása meghiúsult"
+msgstr "A „pa_context_rttime_new()” függvényhívás meghiúsult."
 
 #: ../src/utils/pacat.c:1082
 #: ../src/utils/pactl.c:1290
-#, fuzzy
 msgid "pa_mainloop_run() failed."
-msgstr "svc_run: - választás sikertelen"
+msgstr "A „pa_mainloop_run()” függvényhívás meghiúsult."
 
 #: ../src/utils/pasuspender.c:81
-#, fuzzy, c-format
+#, c-format
 msgid "fork(): %s\n"
-msgstr "programindítás: %s"
+msgstr "Programindítás: %s\n"
 
 #: ../src/utils/pasuspender.c:92
-#, fuzzy, c-format
+#, c-format
 msgid "execvp(): %s\n"
-msgstr "az execvp meghiúsult"
+msgstr "execvp(): %s\n"
 
 #: ../src/utils/pasuspender.c:109
-#, fuzzy, c-format
+#, c-format
 msgid "Failure to suspend: %s\n"
-msgstr "Kérés a felfüggesztésre"
+msgstr "Hiba lépett fel a készenléti állapotba térés közben: %s\n"
 
 #: ../src/utils/pasuspender.c:124
-#, fuzzy, c-format
+#, c-format
 msgid "Failure to resume: %s\n"
-msgstr "Kattintson a folytatáshoz"
+msgstr "Hiba lépett fel a készenléti állapotból visszatérés közben: %s\n"
 
 #: ../src/utils/pasuspender.c:147
 #, fuzzy, c-format
@@ -1515,14 +1447,14 @@ msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "A leejtett fájl nem helyi."
 
 #: ../src/utils/pasuspender.c:159
-#, fuzzy, c-format
+#, c-format
 msgid "Connection failure: %s\n"
-msgstr "Hitelesítési hiba"
+msgstr "Kapcsolódási hiba: %s\n"
 
 #: ../src/utils/pasuspender.c:176
-#, fuzzy, c-format
+#, c-format
 msgid "Got SIGINT, exiting.\n"
-msgstr "Kilépés (SIGINT szignál)..."
+msgstr "Kilépés, SIGINT szignál hatására…\n"
 
 #: ../src/utils/pasuspender.c:194
 #, fuzzy, c-format
@@ -1551,24 +1483,24 @@ msgid ""
 msgstr "A program kapcsolói ütköznek"
 
 #: ../src/utils/pasuspender.c:277
-#, fuzzy, c-format
+#, c-format
 msgid "pa_mainloop_new() failed.\n"
-msgstr "Nem sikerült megnyitni a(z) %s.new fájlt"
+msgstr "A „pa_mainloop_new()” függvényhívás meghiúsult.\n"
 
 #: ../src/utils/pasuspender.c:290
-#, fuzzy, c-format
+#, c-format
 msgid "pa_context_new() failed.\n"
-msgstr "pa_context_subscribe() meghiúsult"
+msgstr "A „pa_context_new()” függvényhívás meghiúsult.\n"
 
 #: ../src/utils/pasuspender.c:298
-#, fuzzy, c-format
+#, c-format
 msgid "pa_mainloop_run() failed.\n"
-msgstr "svc_run: - választás sikertelen"
+msgstr "A „pa_mainloop_run()” függvényhívás meghiúsult.\n"
 
 #: ../src/utils/pactl.c:135
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get statistics: %s"
-msgstr "nem sikerült a képességek lekérdezése"
+msgstr "Nem sikerült a statisztika lekérdezése: %s"
 
 #: ../src/utils/pactl.c:141
 #, c-format
@@ -1581,9 +1513,9 @@ msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr ""
 
 #: ../src/utils/pactl.c:147
-#, fuzzy, c-format
+#, c-format
 msgid "Sample cache size: %s\n"
-msgstr "Lemezes gyorsítótár mérete"
+msgstr "Minta-gyorsítótár mérete: %s\n"
 
 #: ../src/utils/pactl.c:156
 #, fuzzy, c-format
@@ -1635,13 +1567,13 @@ msgstr ""
 #: ../src/utils/pactl.c:360
 #, c-format
 msgid "\tPorts:\n"
-msgstr ""
+msgstr "\tPort:\n"
 
 #: ../src/utils/pactl.c:274
 #: ../src/utils/pactl.c:366
-#, fuzzy, c-format
+#, c-format
 msgid "\tActive Port: %s\n"
-msgstr "[kiszolgáló:port]"
+msgstr "\tAktív Port: %s\n"
 
 #: ../src/utils/pactl.c:297
 #, fuzzy, c-format
@@ -1683,7 +1615,6 @@ msgstr ""
 #: ../src/utils/pactl.c:637
 #: ../src/utils/pactl.c:638
 #: ../src/utils/pactl.c:645
-#, fuzzy
 msgid "n/a"
 msgstr "ismeretlen"
 
@@ -1737,12 +1668,12 @@ msgstr ""
 #: ../src/utils/pactl.c:479
 #, c-format
 msgid "\tProfiles:\n"
-msgstr ""
+msgstr "\tProfil:\n"
 
 #: ../src/utils/pactl.c:485
-#, fuzzy, c-format
+#, c-format
 msgid "\tActive Profile: %s\n"
-msgstr "Profillétrehozás"
+msgstr "\tAktív profil: %s\n"
 
 #: ../src/utils/pactl.c:496
 #, fuzzy, c-format
@@ -1817,9 +1748,9 @@ msgstr ""
 
 #: ../src/utils/pactl.c:653
 #: ../src/utils/pactl.c:663
-#, fuzzy, c-format
+#, c-format
 msgid "Failure: %s"
-msgstr "Hiba"
+msgstr "Hiba: %s"
 
 #: ../src/utils/pactl.c:687
 #, fuzzy, c-format
@@ -1834,9 +1765,8 @@ msgid "Premature end of file"
 msgstr "Idő előtti fájlvége"
 
 #: ../src/utils/pactl.c:863
-#, fuzzy
 msgid "Got SIGINT, exiting."
-msgstr "Kilépés (SIGINT szignál)..."
+msgstr "Kilépés, SIGINT szignál hatására…"
 
 #: ../src/utils/pactl.c:869
 #, c-format
@@ -1894,34 +1824,28 @@ msgid "Warning: Failed to determine sample specification from file."
 msgstr "RGB-adat betöltése a TIFF-fájlból sikertelen"
 
 #: ../src/utils/pactl.c:1014
-#, fuzzy
 msgid "You have to specify a sample name to play"
-msgstr "Meg kell adnia egy feloldandó csomagnevet"
+msgstr "Meg kell adnia lejátszandó minta nevét."
 
 #: ../src/utils/pactl.c:1026
-#, fuzzy
 msgid "You have to specify a sample name to remove"
-msgstr "Meg kell adnia egy eltávolítandó csomagot"
+msgstr "Meg kell adnia az eltávolítandó minta nevét."
 
 #: ../src/utils/pactl.c:1035
-#, fuzzy
 msgid "You have to specify a sink input index and a sink"
-msgstr "Meg kell adnia egy tárnevet/paramétert és értéket"
+msgstr "Meg kell adnia a nyelő bemeneti azonosítóját és a nyelőt."
 
 #: ../src/utils/pactl.c:1045
-#, fuzzy
 msgid "You have to specify a source output index and a source"
-msgstr "Adja meg a kimeneti fájl helyét és nevét:"
+msgstr "Meg kell adnia a forrás kimeneti azonosítóját és a forrást."
 
 #: ../src/utils/pactl.c:1060
-#, fuzzy
 msgid "You have to specify a module name and arguments."
-msgstr "Meg kell adnia egy tárnevet/paramétert és értéket"
+msgstr "Meg kell adnia a modul nevét és a paramétereit."
 
 #: ../src/utils/pactl.c:1080
-#, fuzzy
 msgid "You have to specify a module index"
-msgstr "Meg kell adnia egy archívumnevet."
+msgstr "Meg kell adnia a modul azonosítóját."
 
 #: ../src/utils/pactl.c:1090
 msgid "You may not specify more than one sink. You have to specify a boolean value."
@@ -1936,18 +1860,16 @@ msgid "You have to specify a card name/index and a profile name"
 msgstr ""
 
 #: ../src/utils/pactl.c:1126
-#, fuzzy
 msgid "You have to specify a sink name/index and a port name"
-msgstr "Meg kell adnia egy tárnevet/paramétert és értéket"
+msgstr "Meg kell adnia a nyelő nevét vagy azonosítóját és a port nevét."
 
 #: ../src/utils/pactl.c:1137
 msgid "You have to specify a source name/index and a port name"
 msgstr ""
 
 #: ../src/utils/pactl.c:1149
-#, fuzzy
 msgid "You have to specify a sink name/index and a volume"
-msgstr "Meg kell adnia egy tárnevet/paramétert és értéket"
+msgstr "Meg kell adnia a nyelő nevét vagy azonosítóját és a hangerejét."
 
 #: ../src/utils/pactl.c:1154
 #: ../src/utils/pactl.c:1171
@@ -1955,9 +1877,8 @@ msgstr "Meg kell adnia egy tárnevet/paramétert és értéket"
 #: ../src/utils/pactl.c:1209
 #: ../src/utils/pactl.c:1226
 #: ../src/utils/pactl.c:1248
-#, fuzzy
 msgid "Invalid volume specification"
-msgstr "%.*s: érvénytelen konverziós specifikáció"
+msgstr "A hangerő megadása érvénytelen."
 
 #: ../src/utils/pactl.c:1166
 msgid "You have to specify a source name/index and a volume"
@@ -1968,14 +1889,12 @@ msgid "You have to specify a sink input index and a volume"
 msgstr ""
 
 #: ../src/utils/pactl.c:1188
-#, fuzzy
 msgid "Invalid sink input index"
-msgstr "pa_context_move_sink_input_by_index() meghiúsult"
+msgstr "A nyelő bemeneti azonosítója érvénytelen."
 
 #: ../src/utils/pactl.c:1204
-#, fuzzy
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr "Meg kell adnia egy tárnevet/paramétert és értéket"
+msgstr "Meg kell adnia a nyelő nevét vagy azonosítóját és a némítás logikai változóját."
 
 #: ../src/utils/pactl.c:1221
 msgid "You have to specify a source name/index and a mute boolean"
@@ -1986,14 +1905,12 @@ msgid "You have to specify a sink input index and a mute boolean"
 msgstr ""
 
 #: ../src/utils/pactl.c:1243
-#, fuzzy
 msgid "Invalid sink input index specification"
-msgstr "A(z) „%s” escape sorozat érvénytelen a bemenet elhatárolójának meghatározásában."
+msgstr "A nyelő bemeneti azonosítójának megadása érvénytelen."
 
 #: ../src/utils/pactl.c:1262
-#, fuzzy
 msgid "No valid command specified."
-msgstr "nincs megadva a végrehajtandó parancs"
+msgstr "Érvénytelen parancs lett megadva."
 
 #: ../src/utils/pax11publish.c:61
 #, c-format
@@ -2012,24 +1929,24 @@ msgid "Failed to parse command line.\n"
 msgstr "Nem lehet feldolgozni a(z) „%s” parancssort: %s"
 
 #: ../src/utils/pax11publish.c:108
-#, fuzzy, c-format
+#, c-format
 msgid "Server: %s\n"
-msgstr "_Kiszolgáló:"
+msgstr "Kiszolgáló: %s\n"
 
 #: ../src/utils/pax11publish.c:110
-#, fuzzy, c-format
+#, c-format
 msgid "Source: %s\n"
-msgstr "Forrás:"
+msgstr "Forrás: %s\n"
 
 #: ../src/utils/pax11publish.c:112
-#, fuzzy, c-format
+#, c-format
 msgid "Sink: %s\n"
-msgstr "Bemenet"
+msgstr "Nyelő: %s\n"
 
 #: ../src/utils/pax11publish.c:114
-#, fuzzy, c-format
+#, c-format
 msgid "Cookie: %s\n"
-msgstr "süti"
+msgstr "Süti: %s\n"
 
 #: ../src/utils/pax11publish.c:132
 #, fuzzy, c-format
@@ -2062,9 +1979,9 @@ msgid "Failed to load cookie data\n"
 msgstr "sikertelen a szimbólum adatainak a betöltése"
 
 #: ../src/utils/pax11publish.c:211
-#, fuzzy, c-format
+#, c-format
 msgid "Not yet implemented.\n"
-msgstr "Még nincs megvalósítva."
+msgstr "Még nincs elkészítve.\n"
 
 #: ../src/utils/pacmd.c:69
 msgid "No PulseAudio daemon running, or not running as session daemon."
@@ -2076,36 +1993,34 @@ msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "svc_unix.c - AF_UNIX gond van illesztőpont létrehozásával"
 
 #: ../src/utils/pacmd.c:91
-#, fuzzy, c-format
+#, c-format
 msgid "connect(): %s"
-msgstr "\\kapcsolat: %s"
+msgstr "Kapcsolódás: %s"
 
 #: ../src/utils/pacmd.c:99
-#, fuzzy
 msgid "Failed to kill PulseAudio daemon."
-msgstr "nem sikerült olvasni a Xen-szolgáltatásból"
+msgstr "A PulseAudio démon leállítása nem sikerült."
 
 #: ../src/utils/pacmd.c:107
-#, fuzzy
 msgid "Daemon not responding."
-msgstr "„%s” nem válaszol."
+msgstr "A démon nem válaszol."
 
 #: ../src/utils/pacmd.c:161
-#, fuzzy, c-format
+#, c-format
 msgid "poll(): %s"
-msgstr "poll(): %s"
+msgstr "Lekérdezés: %s"
 
 #: ../src/utils/pacmd.c:171
 #: ../src/utils/pacmd.c:188
-#, fuzzy, c-format
+#, c-format
 msgid "read(): %s"
-msgstr "read(): %s"
+msgstr "Olvasás: %s"
 
 #: ../src/utils/pacmd.c:207
 #: ../src/utils/pacmd.c:223
-#, fuzzy, c-format
+#, c-format
 msgid "write(): %s"
-msgstr "write(): %s"
+msgstr "Írás: %s"
 
 #: ../src/pulsecore/lock-autospawn.c:136
 #: ../src/pulsecore/lock-autospawn.c:219
@@ -2138,19 +2053,16 @@ msgid "Off"
 msgstr "Kikapcsolva"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2184
-#, fuzzy
 msgid "High Fidelity Playback (A2DP)"
-msgstr "A lejátszás nem szüneteltethető"
+msgstr "HiFi lejátszás (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2198
-#, fuzzy
 msgid "High Fidelity Capture (A2DP)"
-msgstr "Felvétel, hozzáfűzés a film végéhez"
+msgstr "HiFi felvétel (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2213
-#, fuzzy
 msgid "Telephony Duplex (HSP/HFP)"
-msgstr "Mobiltelefon bázisállomás"
+msgstr "Telefon duplex (HSP/HFP)"
 
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
@@ -2167,9 +2079,8 @@ msgid "Input Devices"
 msgstr "Bemeneti eszközök"
 
 #: ../src/modules/module-rygel-media-server.c:774
-#, fuzzy
 msgid "Audio on @HOSTNAME@"
-msgstr "%(safeuser)s felhasználó listatagságai a(z) %(hostname)s gépen"
+msgstr "Hangforrások a(z) @HOSTNAME@ számítógépen"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
@@ -2208,33 +2119,28 @@ msgid "Video"
 msgstr "Videó"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
-#, fuzzy
 msgid "Automatic Gain Control"
-msgstr "Automatikus beállításvezérlés"
+msgstr "Automatikus erősítésszabályzás"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
-#, fuzzy
 msgid "No Automatic Gain Control"
-msgstr "Nem található hangerőszabályzó"
+msgstr "Nincs automatikus erősítésszabályzás"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "Erősítés"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
-#, fuzzy
 msgid "No Boost"
-msgstr "nincs automatikus indítás"
+msgstr "Nincs erősítés"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
-#, fuzzy
 msgid "Amplifier"
-msgstr "Műveleti erősítő"
+msgstr "Erősítő"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
-#, fuzzy
 msgid "No Amplifier"
-msgstr "Műveleti erősítő"
+msgstr "Nincs erősítő"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
@@ -2265,19 +2171,17 @@ msgid "Analog Headphones"
 msgstr "Analóg fejhallgató"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
-#, fuzzy
 msgid "Analog Output (LFE)"
-msgstr "Hiba a kimenet elindítása közben"
+msgstr "Analóg kimenet (mély)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
-#, fuzzy
 msgid "Analog Mono Output"
-msgstr "A Mono.Addins hibakeresési kimenetének engedélyezése"
+msgstr "Analóg mono kimenet"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
 #, c-format
 msgid "%s+%s"
-msgstr ""
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984
 #: ../src/modules/alsa/alsa-mixer.c:3404
@@ -2286,9 +2190,8 @@ msgid "%s / %s"
 msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
-#, fuzzy
 msgid "Analog Mono"
-msgstr "Mono betöltő"
+msgstr "Analóg mono"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
 msgid "Analog Stereo"
@@ -2359,17 +2262,14 @@ msgid "Digital Stereo (HDMI)"
 msgstr "Digitális térhatású (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
-#, fuzzy
 msgid "Analog Mono Duplex"
-msgstr "Kétoldalas/fordítva beállítás"
+msgstr "Analóg mono duplex"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
-#, fuzzy
 msgid "Analog Stereo Duplex"
-msgstr "Kétoldalas/fordítva beállítás"
+msgstr "Analóg sztereó duplex"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
-#, fuzzy
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr "Szteró LADSPA effekt rack"
+msgstr "Analóg sztereó duplex (IEC958)"
 

commit 63c52c7b919058e1cba627a81ccbf328341e78f3
Author: reinouts <reinouts at fedoraproject.org>
Date:   Wed Oct 14 09:31:10 2009 +0000

    Sending translation for Dutch

diff --git a/po/nl.po b/po/nl.po
index b2a7370..a1c127e 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -2,16 +2,17 @@
 # Copyright (C) 2009 THE pulseaudio.master-tx'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the pulseaudio.master-tx package.
 # Geert Warrink <geert.warrink at onsnet.nu>, 2009.
+# Reinout van Schouwen <reinout at gmail.com>, 2009
 #
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-02 20:57+0000\n"
-"PO-Revision-Date: 2009-09-30 16:47+0200\n"
-"Last-Translator: Geert Warrink <geert.warrink at onsnet.nu>\n"
-"Language-Team: nl <nl at li.org>\n"
+"POT-Creation-Date: 2009-10-14 04:44+0000\n"
+"PO-Revision-Date: 2009-10-14 11:00+0100\n"
+"Last-Translator: Reinout van Schouwen <reinout at gmail.com>\n"
+"Language-Team: Dutch <vertaling at vrijschrift.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding:  \n"
@@ -31,8 +32,8 @@ msgid ""
 msgstr ""
 "snd_pcm_avail() gaf een waarde terug die uitzonderlijk groot is: %lu bytes (%"
 "lu ms).\n"
-"Waarschijnlijk is dit een bug in de ALSA driver '%s'. Rapporteer dit "
-"probleem a.u.b. aan de ALSA ontwikkelaars."
+"Waarschijnlijk is dit een fout in het ALSA-stuurprogramma ‘%s’. Meld dit "
+"probleem alstublieft aan de ALSA-ontwikkelaars."
 
 #: ../src/modules/alsa/alsa-util.c:1147
 #, c-format
@@ -44,8 +45,8 @@ msgid ""
 msgstr ""
 "snd_pcm_delay() gaf een waarde terug die uitzonderlijk groot is: %li bytes (%"
 "s%lu ms).\n"
-"Waarschijnlijk is  dit een bug in de ALSA driver '%s'. Rapporteer dit "
-"probleem a.u.b. aan de ALSA ontwikkelaars."
+"Waarschijnlijk is dit een fout in het ALSA-stuurprogramma ‘%s’. Meld dit "
+"probleem alstublieft aan de ALSA-ontwikkelaars."
 
 #: ../src/modules/alsa/alsa-util.c:1194
 #, c-format
@@ -57,21 +58,21 @@ msgid ""
 msgstr ""
 "snd_pcm_mmap_begin() gaf een waarde terug die uitzonderlijk groot is: %lu "
 "bytes (%lu ms).\n"
-"Waarschijnlijk is dit een bug in de ALSA driver '%s'. Rapporteer dit "
-"probleem a.u.b aan de ALSA ontwikkelaars."
+"Waarschijnlijk is dit een fout in het ALSA-stuurprogramma ‘%s’. Meld dit "
+"probleem alstublieft aan de ALSA-ontwikkelaars."
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
 msgstr ""
-"Houdt altijd ten minste een afvoer ingeladen zelfs als het de null afvoer is."
+"Houdt altijd ten minste een afvoer ingeladen zelfs als het de null-afvoer is."
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
-msgstr "Dummy output"
+msgstr "Dummy-uitvoer"
 
 #: ../src/modules/module-ladspa-sink.c:49
 msgid "Virtual LADSPA sink"
-msgstr "Virtuele LADSPA afoer"
+msgstr "Virtuele LADSPA afvoer"
 
 #: ../src/modules/module-ladspa-sink.c:53
 msgid ""
@@ -81,19 +82,19 @@ msgid ""
 "plugin name> label=<ladspa plugin label> control=<comma seperated list of "
 "input control values>"
 msgstr ""
-"sink_name=<naam voor de afoer> sink_properties=<eigenschappen van de afoer> "
-"master=<naam van de te filteren afoer> format=<sample formaat> rate=<sample "
-"snelheid> channels=<aantal kanalen> channel_map=<kanaal map> plugin=<ladspa "
-"plugin naam> label=<ladspa plugin label> control=<met kommas gescheiden "
-"lijst van input controle waarden>"
+"sink_name=<naam voor de afvoer> sink_properties=<eigenschappen van de afvoer> "
+"master=<naam van de te filteren afvoer> format=<sampleformaat> rate=<sample "
+"snelheid> channels=<aantal kanalen> channel_map=<kanaalkaart> plugin=<ladspa "
+"pluginnaam> label=<ladspa pluginlabel> control=<kommagescheiden "
+"lijst van invoercontrolewaarden>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
-msgstr "Geklokte MULL afvoer"
+msgstr "Geklokte NULL afvoer"
 
 #: ../src/modules/module-null-sink.c:291
 msgid "Null Output"
-msgstr "Null output"
+msgstr "Null-uitvoer"
 
 #: ../src/pulsecore/sink.c:2613
 msgid "Internal Audio"
@@ -118,7 +119,7 @@ msgstr "Kon bind-now-loader niet toevoegen."
 #: ../src/daemon/main.c:141
 #, c-format
 msgid "Got signal %s."
-msgstr "Ontving signaal %s."
+msgstr "Signaal %s ontvangen."
 
 #: ../src/daemon/main.c:168
 msgid "Exiting."
@@ -132,50 +133,50 @@ msgstr "Kon gebruiker '%s' niet vinden."
 #: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find group '%s'."
-msgstr "Kon groep '%s' niet vinden."
+msgstr "Kon groep ‘%s’ niet vinden."
 
 #: ../src/daemon/main.c:195
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
-msgstr "Gebruiker '%s' (UID %lu) en groep '%s' (GID %lu) gevonden."
+msgstr "Gebruiker ‘%s’ (UID %lu) en groep ‘%s’ (GID %lu) gevonden."
 
 #: ../src/daemon/main.c:200
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
-msgstr "GID van gebruiker '%s' en van groep '%s' passen niet bij elkaar."
+msgstr "GID van gebruiker ‘%s’ en van groep ‘%s’ passen niet bij elkaar."
 
 #: ../src/daemon/main.c:205
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
-msgstr "Persoonlijke map van gebruiker '%s' is niet '%s', negeer het."
+msgstr "Persoonlijke map van gebruiker ‘%s’ is niet ‘%s’, negeer het."
 
 #: ../src/daemon/main.c:208 ../src/daemon/main.c:213
 #, c-format
 msgid "Failed to create '%s': %s"
-msgstr "Aanmaken van '%s': %s mislukte"
+msgstr "Aanmaken van ‘%s’ mislukt: %s"
 
 #: ../src/daemon/main.c:220
 #, c-format
 msgid "Failed to change group list: %s"
-msgstr "Veranderen van groeps lijst: '%s' mislukte"
+msgstr "Veranderen van groepslijst mislukt: %s"
 
 #: ../src/daemon/main.c:236
 #, c-format
 msgid "Failed to change GID: %s"
-msgstr "Veranderen van GID: %s mislukte"
+msgstr "Veranderen van GID mislukt: %s"
 
 #: ../src/daemon/main.c:252
 #, c-format
 msgid "Failed to change UID: %s"
-msgstr "Veranderen van UID: %s mislukte"
+msgstr "Veranderen van UID mislukt: %s"
 
 #: ../src/daemon/main.c:271
 msgid "Successfully dropped root privileges."
-msgstr "Root rechten met succes laten vervallen."
+msgstr "Beheerdersrechten met succes laten vervallen."
 
 #: ../src/daemon/main.c:279
 msgid "System wide mode unsupported on this platform."
-msgstr "Systeem brede mode wordt op dit platform niet ondersteund."
+msgstr "Systeembrede modus wordt op dit platform niet ondersteund."
 
 #: ../src/daemon/main.c:297
 #, c-format
@@ -184,21 +185,21 @@ msgstr "setrlimit(%s, (%u, %u)) mislukte: %s"
 
 #: ../src/daemon/main.c:474
 msgid "Failed to parse command line."
-msgstr "Analyseren van de commandoregel mislukte."
+msgstr "Analyseren van de opdrachtregel mislukte."
 
 #: ../src/daemon/main.c:541
 msgid "Daemon not running"
-msgstr "Daemon draait niet"
+msgstr "Voorziening draait niet"
 
 #: ../src/daemon/main.c:543
 #, c-format
 msgid "Daemon running as PID %u"
-msgstr "Daemon draait met PID %u"
+msgstr "Voorziening draait met PID %u"
 
 #: ../src/daemon/main.c:553
 #, c-format
 msgid "Failed to kill daemon: %s"
-msgstr "Afschieten mislukt van daemon: '%s'"
+msgstr "Elimineren van voorziening mislukt: ‘%s’"
 
 #: ../src/daemon/main.c:571
 msgid ""
@@ -210,28 +211,28 @@ msgstr ""
 
 #: ../src/daemon/main.c:573
 msgid "Root privileges required."
-msgstr "Root rechten vereisd"
+msgstr "Beheerdersrechten vereist."
 
 #: ../src/daemon/main.c:578
 msgid "--start not supported for system instances."
-msgstr "--start wordt niet ondersteund voor systeem instances"
+msgstr "--start wordt niet ondersteund voor systeeminstanties"
 
 #: ../src/daemon/main.c:583
 msgid "Running in system mode, but --disallow-exit not set!"
-msgstr "Draaiend in systeem mode, maar --disallow-exit is niet gezet!"
+msgstr "Draaiend in systeemmodus, maar --disallow-exit is niet ingesteld!"
 
 #: ../src/daemon/main.c:586
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
-"Draaiend in systeem mode, maar --disallow-module-loading is niet gezet!"
+"Draaiend in systeemmodus, maar --disallow-module-loading is niet gezet!"
 
 #: ../src/daemon/main.c:589
 msgid "Running in system mode, forcibly disabling SHM mode!"
-msgstr "Draaiend in systeem mode, geforceerd uitzetten van SHM mode!"
+msgstr "Draaiend in systeemmodus, geforceerd uitzetten van SHM-modus!"
 
 #: ../src/daemon/main.c:594
 msgid "Running in system mode, forcibly disabling exit idle time!"
-msgstr "Draaiend in systeem mode, geforceerd uitzetten van exit idle time!"
+msgstr "Draaiend in systeemmodus, geforceerd uitzetten van exit idle time!"
 
 #: ../src/daemon/main.c:621
 msgid "Failed to acquire stdio."
@@ -254,11 +255,11 @@ msgstr "read() mislukte: %s"
 
 #: ../src/daemon/main.c:652
 msgid "Daemon startup failed."
-msgstr "Daemon opstarten mislukte."
+msgstr "Voorziening opstarten mislukt."
 
 #: ../src/daemon/main.c:654
 msgid "Daemon startup successful."
-msgstr "Daemon met succes opgestart."
+msgstr "Voorziening met succes opgestart."
 
 #: ../src/daemon/main.c:731
 #, c-format
@@ -268,12 +269,12 @@ msgstr "Dit is PulseAudio %s"
 #: ../src/daemon/main.c:732
 #, c-format
 msgid "Compilation host: %s"
-msgstr "Compilatie host: %s"
+msgstr "Compilatiehost: %s"
 
 #: ../src/daemon/main.c:733
 #, c-format
 msgid "Compilation CFLAGS: %s"
-msgstr "Compilatie CFLAGS: %s"
+msgstr "Compilatie-CFLAGS: %s"
 
 #: ../src/daemon/main.c:736
 #, c-format
@@ -301,61 +302,61 @@ msgstr "Gecompileerd met Valgrind ondersteuning: nee"
 #: ../src/daemon/main.c:749
 #, c-format
 msgid "Running in valgrind mode: %s"
-msgstr "Draaiend in valgrind mode: %s"
+msgstr "Draaiend in valgrind-modus: %s"
 
 #: ../src/daemon/main.c:752
 msgid "Optimized build: yes"
-msgstr "Optimaal gebouwd: ja"
+msgstr "Geoptimaliseerd gebouwd: ja"
 
 #: ../src/daemon/main.c:754
 msgid "Optimized build: no"
-msgstr "Optimaak gebouwd: nee"
+msgstr "Geoptimaliseerd gebouwd: nee"
 
 #: ../src/daemon/main.c:758
 msgid "NDEBUG defined, all asserts disabled."
-msgstr "NDEBUG gedefinieerd, alle verklaringen uitgezet."
+msgstr "NDEBUG gedefinieerd, alle asserts uitgezet."
 
 #: ../src/daemon/main.c:760
 msgid "FASTPATH defined, only fast path asserts disabled."
-msgstr "FASTPATH gedefinieerd, alleen snel pad verklaringen uitgezet."
+msgstr "FASTPATH gedefinieerd, alleen fast path-asserts uitgezet."
 
 #: ../src/daemon/main.c:762
 msgid "All asserts enabled."
-msgstr "Alle verklaringen aangezet."
+msgstr "Alle asserts aangezet."
 
 #: ../src/daemon/main.c:766
 msgid "Failed to get machine ID"
-msgstr "Machine ID verkrijgen mislukte"
+msgstr "Machine-ID verkrijgen mislukt"
 
 #: ../src/daemon/main.c:769
 #, c-format
 msgid "Machine ID is %s."
-msgstr "Machine ID is: %s."
+msgstr "Machine-ID is: %s."
 
 #: ../src/daemon/main.c:773
 #, c-format
 msgid "Session ID is %s."
-msgstr "Sessie ID is: %s."
+msgstr "Sessie-ID is: %s."
 
 #: ../src/daemon/main.c:779
 #, c-format
 msgid "Using runtime directory %s."
-msgstr "Gebruik van runtime map %s."
+msgstr "Gebruik van runtime-map %s."
 
 #: ../src/daemon/main.c:784
 #, c-format
 msgid "Using state directory %s."
-msgstr "Verbruik van state map %s."
+msgstr "Verbruik van state-map %s."
 
 #: ../src/daemon/main.c:787
 #, c-format
 msgid "Using modules directory %s."
-msgstr "Gebruik van module map %s."
+msgstr "Gebruik van module-map %s."
 
 #: ../src/daemon/main.c:789
 #, c-format
 msgid "Running in system mode: %s"
-msgstr "Draaiend in systeem mode: %s"
+msgstr "Draaiend in systeemmodus: %s"
 
 #: ../src/daemon/main.c:792
 msgid ""
@@ -366,12 +367,12 @@ msgid ""
 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
 "explanation why system mode is usually a bad idea."
 msgstr ""
-"OK, dus je draait PA in systeem mode. Merk a.u.b. op dat je dit "
-"waarschijnlijk niet moet doen.\n"
-"Als je het toch doet dan is het je eigen schuld als dingen niet werken zoals "
+"OK, dus u draait PA in systeemmodus. Merk op dat u dit "
+"waarschijnlijk beter niet kunt doen.\n"
+"Als u het toch doet dan is het uw eigen schuld als dingen niet werken zoals "
 "verwacht.\n"
-"Lees a.u.b.http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode voor een "
-"uitleg waarom systeem mode gewoonlijk een slecht idee is."
+"Lees http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode voor een "
+"uitleg waarom systeemmodus gewoonlijk een slecht idee is."
 
 #: ../src/daemon/main.c:809
 msgid "pa_pid_file_create() failed."
@@ -395,23 +396,23 @@ msgstr "pa_core_new() mislukte."
 
 #: ../src/daemon/main.c:904
 msgid "Failed to initialize daemon."
-msgstr "Initialiseren van de daemon mislukte."
+msgstr "Initialiseren van de voorziening mislukt."
 
 #: ../src/daemon/main.c:909
 msgid "Daemon startup without any loaded modules, refusing to work."
-msgstr "Daemon opgestart zonder geladen modules, dat werkt niet."
+msgstr "Voorziening opgestart zonder geladen modules, dat werkt niet."
 
 #: ../src/daemon/main.c:926
 msgid "Daemon startup complete."
-msgstr "Daemon opstarten is klaar."
+msgstr "Voorziening opstarten is klaar."
 
 #: ../src/daemon/main.c:932
 msgid "Daemon shutdown initiated."
-msgstr "Daemon afsluiten is begonnen."
+msgstr "Voorziening afsluiten is begonnen."
 
 #: ../src/daemon/main.c:954
 msgid "Daemon terminated."
-msgstr "Daemon is afgesloten."
+msgstr "Voorziening is afgesloten."
 
 #: ../src/daemon/cmdline.c:115
 #, c-format
@@ -559,7 +560,7 @@ msgstr ""
 "met\n"
 "                                        de opgegeven argumenten\n"
 "  -F, --file=FILENAME                   Draai het opgegeven script\n"
-"  -C                                    Open een commandoregel op de "
+"  -C                                    Open een opdrachtregel op de "
 "draaiende TTY\n"
 "                                        na het opstarten\n"
 "\n"
@@ -669,7 +670,7 @@ msgstr "Laad eenmaal: %s\n"
 #: ../src/daemon/dumpmodules.c:75
 #, c-format
 msgid "DEPRECATION WARNING: %s\n"
-msgstr "OUDERE VERSIE WAARSCHUWING: %s\n"
+msgstr "ACHTERHAALDHEIDSWAARSCHUWING: %s\n"
 
 #: ../src/daemon/dumpmodules.c:79
 #, c-format
@@ -679,22 +680,22 @@ msgstr "Pad: %s\n"
 #: ../src/daemon/daemon-conf.c:232
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
-msgstr "[%s:%u] Ongeldig log doel '%s'."
+msgstr "[%s:%u] Ongeldig logdoel '%s'."
 
 #: ../src/daemon/daemon-conf.c:248
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
-msgstr "[%s:%u] Ongeldig log niveau '%s'."
+msgstr "[%s:%u] Ongeldig logniveau '%s'."
 
 #: ../src/daemon/daemon-conf.c:264
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
-msgstr "[%s:%u] Ongeldige her-bemonster methode '%s'."
+msgstr "[%s:%u] Ongeldige resample-methode ‘%s’."
 
 #: ../src/daemon/daemon-conf.c:287
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
-msgstr "[%s:%u] Ongeldige rlimit '%s'."
+msgstr "[%s:%u] Ongeldige rlimit ‘%s’."
 
 #: ../src/daemon/daemon-conf.c:294
 #, c-format
@@ -704,22 +705,22 @@ msgstr "[%s:%u] rlimit wordt niet ondersteund op dit platform."
 #: ../src/daemon/daemon-conf.c:310
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
-msgstr "[%s:%u] Ongeldig bemonster formaat '%s'."
+msgstr "[%s:%u] Ongeldig sampleformaat ‘%s’."
 
 #: ../src/daemon/daemon-conf.c:328
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
-msgstr "[%s:%u] Ongeldige bemonster snelheid '%s'."
+msgstr "[%s:%u] Ongeldige samlperate ‘%s’."
 
 #: ../src/daemon/daemon-conf.c:352
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
-msgstr "[%s:%u] Ongeldige bemonster kanalen '%s'."
+msgstr "[%s:%u] Ongeldige sample-kanalen ‘%s’."
 
 #: ../src/daemon/daemon-conf.c:370
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
-msgstr "[%s:%u] Ongeldige kanalen map '%s'."
+msgstr "[%s:%u] Ongeldige kanalenkaart ‘%s’."
 
 #: ../src/daemon/daemon-conf.c:388
 #, c-format
@@ -729,30 +730,30 @@ msgstr "[%s:%u] Ongeldig aantal fragmenten '%s'."
 #: ../src/daemon/daemon-conf.c:406
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
-msgstr "[%s:%u] Ongeldige fragment grootte '%s'."
+msgstr "[%s:%u] Ongeldige fragmentgrootte ‘%s’."
 
 #: ../src/daemon/daemon-conf.c:424
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
-msgstr "[%s:%u] Ongeldig nice niveau '%s'."
+msgstr "[%s:%u] Ongeldig nice niveau ‘%s’."
 
 #: ../src/daemon/daemon-conf.c:546
 #, c-format
 msgid "Failed to open configuration file: %s"
-msgstr "Openen van configuratie bestand %s mislukte."
+msgstr "Openen van configuratiebestand %s mislukt."
 
 #: ../src/daemon/daemon-conf.c:562
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
 msgstr ""
-"De opgegeven standaard kanalen map heeft een ander aantal kanalen dan de "
+"De opgegeven standaard kanalenkaart heeft een ander aantal kanalen dan de "
 "opgegeven standaard aantal kanalen."
 
 #: ../src/daemon/daemon-conf.c:638
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
-msgstr "### Lees in het configuratie bestand: %s ###\n"
+msgstr "### Lees uit het configuratiebestand: %s ###\n"
 
 #: ../src/daemon/caps.c:62
 msgid "Cleaning up privileges."
@@ -792,11 +793,11 @@ msgstr "Achter links"
 
 #: ../src/pulse/channelmap.c:113
 msgid "Rear Right"
-msgstr "Achter rechta"
+msgstr "Achter rechts"
 
 #: ../src/pulse/channelmap.c:115
 msgid "Low Frequency Emmiter"
-msgstr "Lage frequentie zender"
+msgstr "Lage-frequentiezender"
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1022,7 +1023,7 @@ msgstr "Eenheid bestaat"
 
 #: ../src/pulse/error.c:48
 msgid "No such entity"
-msgstr "Eenheid onbekent"
+msgstr "Eenheid onbekend"
 
 #: ../src/pulse/error.c:49
 msgid "Connection refused"
@@ -1030,7 +1031,7 @@ msgstr "Verbinding geweigerd"
 
 #: ../src/pulse/error.c:50
 msgid "Protocol error"
-msgstr "Protocol fout"
+msgstr "Protocolfout"
 
 #: ../src/pulse/error.c:51
 msgid "Timeout"
@@ -1038,7 +1039,7 @@ msgstr "Tijd verstreken"
 
 #: ../src/pulse/error.c:52
 msgid "No authorization key"
-msgstr "Geen authorisatie sleutel"
+msgstr "Geen autorisatiesleutel"
 
 #: ../src/pulse/error.c:53
 msgid "Internal error"
@@ -1050,7 +1051,7 @@ msgstr "Verbinding verbroken"
 
 #: ../src/pulse/error.c:55
 msgid "Entity killed"
-msgstr "Eenheid afgeschoten"
+msgstr "Eenheid geëlimineerd"
 
 #: ../src/pulse/error.c:56
 msgid "Invalid server"
@@ -1058,7 +1059,7 @@ msgstr "Ongeldige server"
 
 #: ../src/pulse/error.c:57
 msgid "Module initalization failed"
-msgstr "Module initialisatie mislukte"
+msgstr "Module-initialisatie mislukt"
 
 #: ../src/pulse/error.c:58
 msgid "Bad state"
@@ -1139,12 +1140,12 @@ msgstr "XOpenDisplay() mislukte"
 
 #: ../src/pulse/client-conf-x11.c:93
 msgid "Failed to parse cookie data"
-msgstr "Analyseren van cookie data mislukte"
+msgstr "Analyseren van cookie-data mislukt"
 
 #: ../src/pulse/client-conf.c:111
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
-msgstr "Open van configuratie bestand '%s' mislukte: %s"
+msgstr "Open van configuratiebestand ‘%s’ mislukte: %s"
 
 #: ../src/pulse/context.c:550
 msgid "No cookie loaded. Attempting to connect without."
@@ -1163,7 +1164,7 @@ msgstr "waitpid(): %s"
 #: ../src/pulse/context.c:1438
 #, c-format
 msgid "Received message for unknown extension '%s'"
-msgstr "Ontving boodschap voor onbekende extensie '%s'"
+msgstr "Ontving boodschap voor onbekende extensie ‘%s’"
 
 #: ../src/utils/pacat.c:108
 #, c-format
@@ -1210,17 +1211,17 @@ msgstr "pa_stream_get_buffer_attr() mislukte: %s"
 #: ../src/utils/pacat.c:314
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
-msgstr "Buffer metriek: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
+msgstr "Buffermetriek: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
 #: ../src/utils/pacat.c:317
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
-msgstr "Buffer metriek: maxlength=%u, fragsize=%u"
+msgstr "Buffermetriek: maxlength=%u, fragsize=%u"
 
 #: ../src/utils/pacat.c:321
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
-msgstr "Gebruik bemonster spec  '%s', kanaal map '%s'."
+msgstr "Gebruik sample-spec  '%s', kanaal map '%s'."
 
 #: ../src/utils/pacat.c:325
 #, c-format
@@ -1230,27 +1231,27 @@ msgstr "Verbonden met apparaat %s (%u, %sopgeschort)."
 #: ../src/utils/pacat.c:335
 #, c-format
 msgid "Stream error: %s"
-msgstr "Stroom fout: %s"
+msgstr "Stroomfout: %s"
 
 #: ../src/utils/pacat.c:345
 #, c-format
 msgid "Stream device suspended.%s"
-msgstr "Stroom apparaat opgeschort.%s"
+msgstr "Stroomapparaat opgeschort.%s"
 
 #: ../src/utils/pacat.c:347
 #, c-format
 msgid "Stream device resumed.%s"
-msgstr "Stroom apparaat hervat.%s"
+msgstr "Stroomapparaat hervat.%s"
 
 #: ../src/utils/pacat.c:355
 #, c-format
 msgid "Stream underrun.%s"
-msgstr "Stroom te weinig data.%s"
+msgstr "Te weinig data voor stroom.%s"
 
 #: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream overrun.%s"
-msgstr "Stroom data overschrijding.%s"
+msgstr "Data-overschrijding voor stroom.%s"
 
 #: ../src/utils/pacat.c:369
 #, c-format
@@ -1264,7 +1265,7 @@ msgstr "Stroom verplaatst naar apparaat %s (%u, %sopgeschort).%s"
 
 #: ../src/utils/pacat.c:376
 msgid "not "
-msgstr "niet"
+msgstr "niet "
 
 #: ../src/utils/pacat.c:383
 #, c-format
@@ -1395,7 +1396,7 @@ msgstr ""
 "\n"
 "  -s, --server=SERVER                   De naam van de server waarmee "
 "verbonden moet worden\n"
-"  -d, --device=DEVICE                   De naam van de afoer/bron waarmee "
+"  -d, --device=DEVICE                   De naam van de afvoer/bron waarmee "
 "verbonden moet worden\n"
 "  -n, --client-name=NAME                Hoe wordt deze cliënt op de server "
 "genoemd\n"
@@ -1403,9 +1404,9 @@ msgstr ""
 "genoemd\n"
 "      --volume=VOLUME                   Geef het begins (lineare) volume in "
 "reeks 0...65536\n"
-"      --rate=SAMPLERATE                 De bemonstersnelheid in Hz "
+"      --rate=SAMPLERATE                 De samplerate in Hz "
 "(standaard 44100)\n"
-"      --format=SAMPLEFORMAT             Het bemonster type, een van s16le, "
+"      --format=SAMPLEFORMAT             Het sampletype, een van s16le, "
 "s16be, u8, float32le,\n"
 "                                        float32be, ulaw, alaw, s32le, s32be, "
 "s24le, s24be,\n"
@@ -1414,12 +1415,12 @@ msgstr ""
 "      --channels=CHANNELS               Het aantal kanalen, 1 voor mono, 2 "
 "voor stereo\n"
 "                                        (standaard 2)\n"
-"      --channel-map=CHANNELMAP          Kanaal map te gebruiken in plaats "
+"      --channel-map=CHANNELMAP          Kanaalkaart te gebruiken in plaats "
 "van de standaard\n"
-"      --fix-format                      Neem het bemonsteringsformaat over "
-"van de afoer waar de stroom\n"
+"      --fix-format                      Neem het sampleformaat over "
+"van de afvoer waar de stroom\n"
 "                                        mee verbonden is.\n"
-"      --fix-rate                        Neem de bemonsteringssnelheid over "
+"      --fix-rate                        Neem de samplerate over "
 "van de afvoer waar de stroom\n"
 "                                        mee verbonden is.\n"
 "      --fix-channels                    Neem het aantal kanalen en de kanaal "
@@ -1456,32 +1457,32 @@ msgstr ""
 #: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
 #, c-format
 msgid "Invalid client name '%s'"
-msgstr "Ongeldige cliënt naam '%s'."
+msgstr "Ongeldige clientnaam ‘%s’."
 
 #: ../src/utils/pacat.c:779
 #, c-format
 msgid "Invalid stream name '%s'"
-msgstr "Ongeldige stroom naam '%s'."
+msgstr "Ongeldige stroomnaam ‘%s’."
 
 #: ../src/utils/pacat.c:816
 #, c-format
 msgid "Invalid channel map '%s'"
-msgstr "Ongeldige kanaal map '%s'."
+msgstr "Ongeldige kanaalkaart ‘%s’."
 
 #: ../src/utils/pacat.c:845
 #, c-format
 msgid "Invalid latency specification '%s'"
-msgstr "Ongeldige latentie specificatie '%s'."
+msgstr "Ongeldige latentie-specificatie ‘%s’."
 
 #: ../src/utils/pacat.c:852
 #, c-format
 msgid "Invalid process time specification '%s'"
-msgstr "Ongeldige proces tijd specificatie '%s'."
+msgstr "Ongeldige procestijdspecificatie ‘%s’."
 
 #: ../src/utils/pacat.c:864
 #, c-format
 msgid "Invalid property '%s'"
-msgstr "Ongeldige eigenschap '%s'."
+msgstr "Ongeldige eigenschap ‘%s’."
 
 #: ../src/utils/pacat.c:881
 #, c-format
@@ -1490,7 +1491,7 @@ msgstr "Ongeldig bestandsformaat %s"
 
 #: ../src/utils/pacat.c:900
 msgid "Invalid sample specification"
-msgstr "Ongeldige bemonster specificatie"
+msgstr "Ongeldige samplespecificatie"
 
 #: ../src/utils/pacat.c:910
 #, c-format
@@ -1508,7 +1509,7 @@ msgstr "Te veel argumenten."
 
 #: ../src/utils/pacat.c:933
 msgid "Failed to generate sample specification for file."
-msgstr "Bemonster specificatie voor bestand aanmaken mislukte."
+msgstr "Aanmaken van samplespecificatie voor bestand mislukt."
 
 #: ../src/utils/pacat.c:953
 msgid "Failed to open audio file."
@@ -1524,11 +1525,11 @@ msgstr ""
 
 #: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
 msgid "Failed to determine sample specification from file."
-msgstr "Bepalen van bemonster specificatie van het bestand mislukte."
+msgstr "Bepalen van samplespecificatie van het bestand mislukte."
 
 #: ../src/utils/pacat.c:971
 msgid "Warning: Failed to determine channel map from file."
-msgstr "Waarschuwing: Bepalen van kanaal map van bestand mislukte."
+msgstr "Waarschuwing: Bepalen van kanaalkaart van bestand mislukte."
 
 #: ../src/utils/pacat.c:982
 msgid "Channel map doesn't match sample specification"
@@ -1536,14 +1537,14 @@ msgstr "Kanaal map komt niet overeen met bemonster specificatie."
 
 #: ../src/utils/pacat.c:993
 msgid "Warning: failed to write channel map to file."
-msgstr "Waarschuwing: schrijven van kanaal map naar bestand mislukte."
+msgstr "Waarschuwing: schrijven van kanaalkaart naar bestand mislukte."
 
 #: ../src/utils/pacat.c:1008
 #, c-format
 msgid ""
 "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
-"Openen van een %s stroom met bemonster specificatie '%s' en kanaal map '%s'."
+"Openen van een %s stroom met samplespecificatie ‘%s’ en kanaalkaart ‘%s’."
 
 #: ../src/utils/pacat.c:1009
 msgid "recording"
@@ -1601,7 +1602,7 @@ msgstr "Vervolgen mislukte: %s\n"
 #: ../src/utils/pasuspender.c:147
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
-msgstr "WAARSCHUWING: Geluidsserver is niet locaal, geen opschorten.\n"
+msgstr "WAARSCHUWING: Geluidsserver is niet lokaal, geen opschorten.\n"
 
 #: ../src/utils/pasuspender.c:159
 #, c-format
@@ -1683,7 +1684,7 @@ msgstr ""
 #: ../src/utils/pactl.c:147
 #, c-format
 msgid "Sample cache size: %s\n"
-msgstr "Bemonstering cache grootte: %s\n"
+msgstr "Sample-buffergrootte: %s\n"
 
 #: ../src/utils/pactl.c:156
 #, c-format
@@ -1706,8 +1707,8 @@ msgstr ""
 "Gebruikersnaam: %s\n"
 "Hostnaam: %s\n"
 "Servernaam: %s\n"
-"Server versie: %s\n"
-"Standaard bemonsterings specificatie: %s\n"
+"Serverversie: %s\n"
+"Standaard samplespecificatie: %s\n"
 "Standaard kanaal map: %s\n"
 "Standaard afvoer: %s\n"
 "Standaard bron: %s\n"
@@ -1716,7 +1717,7 @@ msgstr ""
 #: ../src/utils/pactl.c:205
 #, c-format
 msgid "Failed to get sink information: %s"
-msgstr "Verkrijgen afvoer informatie mislukte: %s"
+msgstr "Verkrijgen afvoerinformatie mislukte: %s"
 
 #: ../src/utils/pactl.c:221
 #, c-format
@@ -1770,7 +1771,7 @@ msgstr "\tActieve poort: %s\n"
 #: ../src/utils/pactl.c:297
 #, c-format
 msgid "Failed to get source information: %s"
-msgstr "Verkrijgen van bron informatie mislukte: %s"
+msgstr "Verkrijgen van broninformatie mislukt: %s"
 
 #: ../src/utils/pactl.c:313
 #, c-format
@@ -1798,14 +1799,14 @@ msgstr ""
 "\tNaam: %s\n"
 "\tBeschrijving: %s\n"
 "\tDriver: %s\n"
-"\tBemonsterings specificatie: %s\n"
+"\tSamplespecificatie: %s\n"
 "\tKanaal map: %s\n"
 "\tModule eigenaar: %u\n"
 "\tDemping: %s\n"
 "\tVolume: %s%s%s\n"
 "\t        balans %0.2f\n"
 "\tBasis volume: %s%s%s\n"
-"\tMonitor afvoer: %s\n"
+"\tMonitorafvoer: %s\n"
 "\tLatentie: %0.0f usec, ingesteld %0.0f usec\n"
 "\tVlaggen: %s%s%s%s%s%s\n"
 "\tEigenschappen:\n"
@@ -1837,14 +1838,14 @@ msgstr ""
 "Module #%u\n"
 "\tNaam: %s\n"
 "\tArgument: %s\n"
-"\tGebruiks teller: %s\n"
+"\tGebruiksteller: %s\n"
 "\tEigenschappen:\n"
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:412
 #, c-format
 msgid "Failed to get client information: %s"
-msgstr "Verkrijgen van cliënt informatie mislukte: %s"
+msgstr "Verkrijgen van clientinformatie mislukt: %s"
 
 #: ../src/utils/pactl.c:430
 #, c-format
@@ -1855,16 +1856,16 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
-"Cliënt #%u\n"
-"\tDriver: %s\n"
-"\tModule eigenaar: %s\n"
+"Client #%u\n"
+"\tStuurprogramma: %s\n"
+"\tModule-eigenaar: %s\n"
 "\tEigenschappen:\n"
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:447
 #, c-format
 msgid "Failed to get card information: %s"
-msgstr "Verkrijgen van kaart informatie mislukte: %s"
+msgstr "Verkrijgen van kaartinformatie mislukt: %s"
 
 #: ../src/utils/pactl.c:465
 #, c-format
@@ -1878,8 +1879,8 @@ msgid ""
 msgstr ""
 "Kaart #%u\n"
 "\tNaam: %s\n"
-"\tDriver: %s\n"
-"\tModule eigenaar: %s\n"
+"\tStuurprogramma: %s\n"
+"\tModule-eigenaar: %s\n"
 "\tEigenschappen:\n"
 "\t\t%s\n"
 
@@ -1896,7 +1897,7 @@ msgstr "\tActieve profiel: %s\n"
 #: ../src/utils/pactl.c:496
 #, c-format
 msgid "Failed to get sink input information: %s"
-msgstr "Verkrijgen van afvoer input informatie mislukte: %s"
+msgstr "Verkrijgen van afvoer-invoerinformatie mislukt: %s"
 
 #: ../src/utils/pactl.c:515
 #, c-format
@@ -1919,26 +1920,26 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 "Afvoer input #%u\n"
-"\tDriver: %s\n"
-"\tModule eigenaar: %s\n"
-"\tCliënt: %s\n"
-"\tSink: %u\n"
-"\tBemonsterings specificatie: %s\n"
-"\tKanaal map: %s\n"
+"\tStuurprogramma: %s\n"
+"\tModule-eigenaar: %s\n"
+"\tClient: %s\n"
+"\tAfvoer: %u\n"
+"\tSamplespecificatie: %s\n"
+"\tKanaalkaart: %s\n"
 "\tDemping: %s\n"
 "\tVolume: %s\n"
 "\t        %s\n"
 "\t        balans %0.2f\n"
-"\tBuffer latentie: %0.0f usec\n"
-"\tAfvoer latentie: %0.0f usec\n"
-"\tHerbemonsterings methode: %s\n"
+"\tBufferlatentie: %0.0f usec\n"
+"\tAfvoerlatentie: %0.0f usec\n"
+"\tResample-methode: %s\n"
 "\tEigenschappen:\n"
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:554
 #, c-format
 msgid "Failed to get source output information: %s"
-msgstr "Verkrijgen van bron output informatie mislukte: %s"
+msgstr "Verkrijgen van bron-uitvoerinformatie mislukt: %s"
 
 #: ../src/utils/pactl.c:574
 #, c-format
@@ -1956,23 +1957,23 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
-"Bron output #%u\n"
+"Bronuitvoer #%u\n"
 "\tDriver: %s\n"
-"\tModule eigenaaar: %s\n"
-"\tCliënt: %s\n"
+"\tModule-eigenaaar: %s\n"
+"\tClient: %s\n"
 "\tBron: %u\n"
-"\tBemonsterings specificatie: %s\n"
-"\tKanaal map: %s\n"
-"\tBuffer latentie: %0.0f usec\n"
-"\tBron latentie: %0.0f usec\n"
-"\tHerbemonsterings methode: %s\n"
+"\tSamplespecificatie: %s\n"
+"\tKanaalkaart: %s\n"
+"\tBufferlatentie: %0.0f usec\n"
+"\tBronlatentie: %0.0f usec\n"
+"\tResample-methode: %s\n"
 "\tEigenschappen:\n"
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:605
 #, c-format
 msgid "Failed to get sample information: %s"
-msgstr "Verkrijgen van bemonsterings informatie mislukte: %s"
+msgstr "Verkrijgen van sample-informatie mislukt: %s"
 
 #: ../src/utils/pactl.c:623
 #, c-format
@@ -1991,9 +1992,9 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
-"Monster #%u\n"
+"Sample #%u\n"
 "\tNaam: %s\n"
-"\tBemonsterings specificatie: %s\n"
+"\tSamplespecificatie: %s\n"
 "\tKanaal map: %s\n"
 "\tVolume: %s\n"
 "\t        %s\n"
@@ -2095,111 +2096,111 @@ msgid ""
 msgstr ""
 "pactl %s\n"
 "Gecompileerd met libpulse %s\n"
-"Gelint met libpulse %s\n"
+"Gelinkt met libpulse %s\n"
 
 #: ../src/utils/pactl.c:979
 msgid "Please specify a sample file to load"
-msgstr "Geef a.u.b een bemonsterings bestand op om te laden"
+msgstr "Geef een te laden samplebestand op"
 
 #: ../src/utils/pactl.c:992
 msgid "Failed to open sound file."
-msgstr "Openen geluidsbestand  mislukte."
+msgstr "Openen geluidsbestand mislukt."
 
 #: ../src/utils/pactl.c:1004
 msgid "Warning: Failed to determine sample specification from file."
 msgstr ""
-"Waarschuwing: Bepalen van bemonsterings specificatie van bestand mislukte."
+"Waarschuwing: Bepalen van samplespecificatie van bestand mislukte."
 
 #: ../src/utils/pactl.c:1014
 msgid "You have to specify a sample name to play"
-msgstr "Je moet een monster naam opgeven om af te spelen"
+msgstr "U dient een samplenaam op te geven om af te spelen"
 
 #: ../src/utils/pactl.c:1026
 msgid "You have to specify a sample name to remove"
-msgstr "Je moet een monster naam opgeven om te verwijderen"
+msgstr "U dient een samplenaam op te geven om te verwijderen"
 
 #: ../src/utils/pactl.c:1035
 msgid "You have to specify a sink input index and a sink"
-msgstr "Je moet een afvoer input index en een afvoer opgeven"
+msgstr "U dient een afvoer-invoerindex en een afvoer op te geven"
 
 #: ../src/utils/pactl.c:1045
 msgid "You have to specify a source output index and a source"
-msgstr "Je moet een bron output index en een bron opgeven"
+msgstr "U dient een bron-uitvoerindex en een bron op te geven"
 
 #: ../src/utils/pactl.c:1060
 msgid "You have to specify a module name and arguments."
-msgstr "Je moet een module naam en argumenten opgeven."
+msgstr "U dient een modulenaam en argumenten op te geven."
 
 #: ../src/utils/pactl.c:1080
 msgid "You have to specify a module index"
-msgstr "Je moet een module index opgeven"
+msgstr "U dient een module index op te geven"
 
 #: ../src/utils/pactl.c:1090
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
-"Je kunt niet meer dan een afvoer opgeven. Je moet een boolean waarde opgeven"
+"U kunt niet meer dan een afvoer opgeven. U dient een boolean waarde op te geven."
 
 #: ../src/utils/pactl.c:1103
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
 msgstr ""
-"Je kunt niet meerd dan een bron opgeven. Je moet een boolean waarde opgeven."
+"U kunt niet meer dan één bron opgeven. u dient een boolean waarde op te geven."
 
 #: ../src/utils/pactl.c:1115
 msgid "You have to specify a card name/index and a profile name"
-msgstr "Je moet een kaart naam/index en een profiel naam opgeven"
+msgstr "U dient een kaartnaam/index en een profielnaam op te geven"
 
 #: ../src/utils/pactl.c:1126
 msgid "You have to specify a sink name/index and a port name"
-msgstr "Je moet een afvoer naam/index en een poort naam opgeven"
+msgstr "U dient een afvoernaam/index en een poortnaam op te geven"
 
 #: ../src/utils/pactl.c:1137
 msgid "You have to specify a source name/index and a port name"
-msgstr "Je moet een bron naam/index en een poort naam opgeven"
+msgstr "U dient een bronnaam/index en een poortnaam op te geven"
 
 #: ../src/utils/pactl.c:1149
 msgid "You have to specify a sink name/index and a volume"
-msgstr "Je moet een afvoer naam/index en een volume opgeven"
+msgstr "U dient een afvoernaam/index en een volume op te geven"
 
 #: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
 #: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
 #: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
 msgid "Invalid volume specification"
-msgstr "Ongeldige volume opgave"
+msgstr "Ongeldige volume-opgave"
 
 #: ../src/utils/pactl.c:1166
 msgid "You have to specify a source name/index and a volume"
-msgstr "Je moet een bron naam/index en een volume opgeven"
+msgstr "U dient een bronnaam/index en een volume op te geven"
 
 #: ../src/utils/pactl.c:1183
 msgid "You have to specify a sink input index and a volume"
-msgstr "Je moet een afvoer input index en een volume opgeven"
+msgstr "U dient een afvoer-invoerindex en een volume op te geven"
 
 #: ../src/utils/pactl.c:1188
 msgid "Invalid sink input index"
-msgstr "Ongeldige afvoer input index"
+msgstr "Ongeldige afvoer-invoerindex"
 
 #: ../src/utils/pactl.c:1204
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr "Je moet een afvoer naam/index en een dempings boolean opgeven"
+msgstr "U dient een afvoernaam/index en een dempingsboolean op te geven"
 
 #: ../src/utils/pactl.c:1221
 msgid "You have to specify a source name/index and a mute boolean"
-msgstr "Je moet een bron naam/index en een dempings boolean opgeven"
+msgstr "U dient een bronnaam/index en een dempingsboolean op te geven"
 
 #: ../src/utils/pactl.c:1238
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr "Je moet een afvoer input index en een dempings boolean opgeven"
+msgstr "U dient een afvoer-invoerindex en een dempingsboolean op te geven"
 
 #: ../src/utils/pactl.c:1243
 msgid "Invalid sink input index specification"
-msgstr "Ongeldige afvoer input index opgave"
+msgstr "Ongeldige afvoer-invoerindex opgave"
 
 #: ../src/utils/pactl.c:1262
 msgid "No valid command specified."
-msgstr "Geen geldig commando opgegeven."
+msgstr "Geen geldige opdracht opgegeven."
 
 #: ../src/utils/pax11publish.c:61
 #, c-format
@@ -2224,7 +2225,7 @@ msgstr ""
 #: ../src/utils/pax11publish.c:94
 #, c-format
 msgid "Failed to parse command line.\n"
-msgstr "Commando regel ontleden mislukte.\n"
+msgstr "Opdrachtregel ontleden mislukt.\n"
 
 #: ../src/utils/pax11publish.c:108
 #, c-format
@@ -2249,22 +2250,22 @@ msgstr "Cookie: %s\n"
 #: ../src/utils/pax11publish.c:132
 #, c-format
 msgid "Failed to parse cookie data\n"
-msgstr "Cookie data ontleden mislukte\n"
+msgstr "Cookiedata ontleden mislukt\n"
 
 #: ../src/utils/pax11publish.c:137
 #, c-format
 msgid "Failed to save cookie data\n"
-msgstr "Cookie data opslaan mislukte\n"
+msgstr "Cookiedata opslaan mislukt\n"
 
 #: ../src/utils/pax11publish.c:152
 #, c-format
 msgid "Failed to load client configuration file.\n"
-msgstr "Cliënt configuratie bestand laden mislukte.\n"
+msgstr "Clientconfiguratiebestand laden mislukt.\n"
 
 #: ../src/utils/pax11publish.c:157
 #, c-format
 msgid "Failed to read environment configuration data.\n"
-msgstr "Omgevings configuratie bestand lezen mislukte.\n"
+msgstr "Omgevingsconfiguratiedata lezen mislukt.\n"
 
 #: ../src/utils/pax11publish.c:174
 #, c-format
@@ -2274,7 +2275,7 @@ msgstr "FQDN verkrijgen mislukte.\n"
 #: ../src/utils/pax11publish.c:194
 #, c-format
 msgid "Failed to load cookie data\n"
-msgstr "Cookie data laden mislukte\n"
+msgstr "Cookiedata laden mislukt\n"
 
 #: ../src/utils/pax11publish.c:211
 #, c-format
@@ -2284,7 +2285,7 @@ msgstr "Nog niet geïmplementeerd.\n"
 #: ../src/utils/pacmd.c:69
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
-"Er draait geen PulseAudio daemon, of het draait niet als sessie daemon."
+"Er draait geen PulseAudio-voorziening, of het draait niet als sessievoorziening."
 
 #: ../src/utils/pacmd.c:74
 #, c-format
@@ -2298,11 +2299,11 @@ msgstr "connect(): %s"
 
 #: ../src/utils/pacmd.c:99
 msgid "Failed to kill PulseAudio daemon."
-msgstr "PulseAudio daemon uitzetten mislukte."
+msgstr "PulseAudio-voorziening uitzetten mislukt."
 
 #: ../src/utils/pacmd.c:107
 msgid "Daemon not responding."
-msgstr "Daemon reageert niet."
+msgstr "Voorziening reageert niet."
 
 #: ../src/utils/pacmd.c:161
 #, c-format
@@ -2335,8 +2336,8 @@ msgid ""
 msgstr ""
 "ALSA maakte ons wakker om nieuwe data naar het apparaat te schrijven, maar "
 "er was niets om weg te schrijven!\n"
-"Waarschijnlijk is dit een fout in de ALSA driver '%s\". Rapporteer dit "
-"probleem a.u.b. aan de ALSA ontwikkelaars.\n"
+"Waarschijnlijk is dit een fout in het ALSA-stuurprogramma ‘%s’. Meld dit "
+"probleem alstublieft aan de ALSA-ontwikkelaars.\n"
 "We werden gewekt met POLLOUT ingesteld -- echter een opvolgende snd_pcm_avail"
 "() gaf 0 terug of een andere waarde < min_avail."
 
@@ -2352,8 +2353,8 @@ msgid ""
 msgstr ""
 "ALSA maakte ons wakker om nieuwe data van het apparaat te lezen, maar er was "
 "niets om te lezen!\n"
-"Waarschijnlijk is dit een fout in de ALSA driver '%s\". Rapporteer dit "
-"probleem a.u.b. aan de ALSA ontwikkelaars.\n"
+"Waarschijnlijk is dit een fout in het ALSA-stuurprogramma ‘%s’. Meld dit "
+"probleem alstublieft aan de ALSA-ontwikkelaars.\n"
 "We werden gewekt met POLLIN ingesteld -- echter een opvolgende snd_pcm_avail"
 "() gaf 0 terug of een andere waarde < min_avail."
 
@@ -2361,7 +2362,7 @@ msgstr ""
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2228
 #: ../src/modules/alsa/alsa-mixer.c:2931
 msgid "Off"
-msgstr "Uiy"
+msgstr "Uit"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2184
 msgid "High Fidelity Playback (A2DP)"
@@ -2369,25 +2370,25 @@ msgstr "High Fidelity Playback (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2198
 msgid "High Fidelity Capture (A2DP)"
-msgstr "High Fidelity Afvangen (A2DP)"
+msgstr "High Fidelity afvangen (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2213
 msgid "Telephony Duplex (HSP/HFP)"
-msgstr "Telefonie Duplex (HSP/HFP)"
+msgstr "Telefonie duplex (HSP/HFP)"
 
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
-msgstr "PulseAudio geluids server"
+msgstr "PulseAudio-geluidsserver"
 
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr "Output apparaten"
+msgstr "Uitvoerapparaten"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr "Input apparaten"
+msgstr "Invoerapparaten"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
@@ -2395,15 +2396,15 @@ msgstr "Geluid op @HOSTNAME@"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr "Input"
+msgstr "Invoer"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr "Docking station input"
+msgstr "Docking station-invoer"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr "Docking station microfoon"
+msgstr "Docking station-microfoon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
@@ -2431,11 +2432,11 @@ msgstr "Video"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr "Automatische volume controle"
+msgstr "Automatische gain-controle"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr "Geen automatische volume controle"
+msgstr "Geen automatische gain-controle"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
@@ -2455,7 +2456,7 @@ msgstr "Geen versterker"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr "Analoge input"
+msgstr "Analoge invoer"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
@@ -2479,7 +2480,7 @@ msgstr "Analoge output"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr "Analoeg koptelefoon"
+msgstr "Analoge koptelefoon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
@@ -2487,7 +2488,7 @@ msgstr "Analoge output (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr "Analoge mono output"
+msgstr "Analoge mono-uitvoer"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
 #, c-format

commit 1151e1575fe1291e80d6d9fbbfd4ce20da2fd447
Author: kami911 <kami911 at fedoraproject.org>
Date:   Thu Oct 15 13:12:37 2009 +0000

    Sending translation for Hungarian

diff --git a/po/hu.po b/po/hu.po
index 7353267..e3629a7 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -12,6 +12,7 @@ msgstr ""
 "X-Poedit-Language: Hungarian\n"
 "X-Poedit-Country: HUNGARY\n"
 "X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #: ../src/modules/alsa/alsa-util.c:858
 #: ../src/pulsecore/sink.c:2629
@@ -69,9 +70,8 @@ msgid "Null Output"
 msgstr "szabványos kimenet"
 
 #: ../src/pulsecore/sink.c:2613
-#, fuzzy
 msgid "Internal Audio"
-msgstr "<b>Hangszűrő</b>"
+msgstr "Belső hangforrás"
 
 #: ../src/pulsecore/sink.c:2618
 msgid "Modem"
@@ -112,9 +112,9 @@ msgid "Failed to find group '%s'."
 msgstr "%s csoportjának megváltoztatása sikertelen a következőre: %s\n"
 
 #: ../src/daemon/main.c:195
-#, fuzzy, c-format
+#, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
-msgstr "%s: Nem módosítható a tulajdonos uid-ja %lu, gid-je %lu értékekre"
+msgstr "Létező felhasználó „%s” (UID: %lu) és csoport „%s” (GID: %lu)."
 
 #: ../src/daemon/main.c:200
 #, fuzzy, c-format
@@ -244,9 +244,9 @@ msgid "Daemon startup successful."
 msgstr "A portátirányítás sikeres!"
 
 #: ../src/daemon/main.c:731
-#, fuzzy, c-format
+#, c-format
 msgid "This is PulseAudio %s"
-msgstr "Ez egy programhiba... (%s:%d:%s)\n"
+msgstr "PulseAudio %s"
 
 #: ../src/daemon/main.c:732
 #, fuzzy, c-format
@@ -316,14 +316,14 @@ msgid "Failed to get machine ID"
 msgstr "A PDA azonosító lekérdezése nem sikerült"
 
 #: ../src/daemon/main.c:769
-#, fuzzy, c-format
+#, c-format
 msgid "Machine ID is %s."
-msgstr "\"%s\" felhasználói azonosító lejárt."
+msgstr "Számítógép-azonosító: %s."
 
 #: ../src/daemon/main.c:773
-#, fuzzy, c-format
+#, c-format
 msgid "Session ID is %s."
-msgstr "A munkamenet le van zárva"
+msgstr "Munkamenet-azonosító: %s."
 
 #: ../src/daemon/main.c:779
 #, fuzzy, c-format
@@ -566,9 +566,9 @@ msgid "Load Once: %s\n"
 msgstr "Betöltve: %s\n"
 
 #: ../src/daemon/dumpmodules.c:75
-#, fuzzy, c-format
+#, c-format
 msgid "DEPRECATION WARNING: %s\n"
-msgstr "%s: figyelem: %s felülbírálja %s-t\n"
+msgstr "VISSZAVONÁSI FIGYELMEZTETÉS: %s\n"
 
 #: ../src/daemon/dumpmodules.c:79
 #, c-format
@@ -959,7 +959,6 @@ msgid "Entity killed"
 msgstr "A(z) %d számú folyamat kilőve"
 
 #: ../src/pulse/error.c:56
-#, fuzzy
 msgid "Invalid server"
 msgstr "Érvénytelen kiszolgáló"
 
@@ -994,9 +993,8 @@ msgid "Unknown error code"
 msgstr "Ismeretlen hibakód"
 
 #: ../src/pulse/error.c:64
-#, fuzzy
 msgid "No such extension"
-msgstr "nincs ilyen puffer"
+msgstr "Nincs ilyen kiterjesztés"
 
 #: ../src/pulse/error.c:65
 #, fuzzy
@@ -1819,9 +1817,8 @@ msgid "Failed to open sound file."
 msgstr "Nem sikerült megnyitni az átmeneti fájlt"
 
 #: ../src/utils/pactl.c:1004
-#, fuzzy
 msgid "Warning: Failed to determine sample specification from file."
-msgstr "RGB-adat betöltése a TIFF-fájlból sikertelen"
+msgstr "RGB-adat betöltése a TIFF fájlból sikertelen"
 
 #: ../src/utils/pactl.c:1014
 msgid "You have to specify a sample name to play"

commit 3f1fefff57e2ae47105af0a23174c8a4279629a2
Author: kami911 <kami911 at fedoraproject.org>
Date:   Sat Oct 17 09:13:06 2009 +0000

    Sending translation for Hungarian

diff --git a/po/hu.po b/po/hu.po
index e3629a7..b59bef5 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-30 21:32+0000\n"
+"POT-Creation-Date: 2009-10-17 04:45+0000\n"
 "PO-Revision-Date: \n"
 "Last-Translator: KAMI <kami911 at gmail.com>\n"
 "Language-Team: \n"
@@ -46,28 +46,24 @@ msgid "Always keeps at least one sink loaded even if it's a null one"
 msgstr ""
 
 #: ../src/modules/module-always-sink.c:83
-#, fuzzy
 msgid "Dummy Output"
-msgstr "szabványos kimenet"
+msgstr "Látszólagos kimenet"
 
 #: ../src/modules/module-ladspa-sink.c:49
-#, fuzzy
 msgid "Virtual LADSPA sink"
-msgstr "Ismeretlen nyelőelem"
+msgstr "Látszólagos LADSPA nyelő"
 
 #: ../src/modules/module-ladspa-sink.c:53
 msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
 msgstr ""
 
 #: ../src/modules/module-null-sink.c:55
-#, fuzzy
 msgid "Clocked NULL sink"
-msgstr "Ismeretlen nyelőelem"
+msgstr "Órajelezett semmis nyelő"
 
 #: ../src/modules/module-null-sink.c:291
-#, fuzzy
 msgid "Null Output"
-msgstr "szabványos kimenet"
+msgstr "Semmis kimenet"
 
 #: ../src/pulsecore/sink.c:2613
 msgid "Internal Audio"
@@ -78,19 +74,16 @@ msgid "Modem"
 msgstr "Modem"
 
 #: ../src/daemon/ltdl-bind-now.c:124
-#, fuzzy
 msgid "Failed to find original lt_dlopen loader."
-msgstr "A PNM-betöltő egy egészet várt, de nem talált"
+msgstr "Nem található az eredeti „lt_dlopen” betöltő."
 
 #: ../src/daemon/ltdl-bind-now.c:129
-#, fuzzy
 msgid "Failed to allocate new dl loader."
-msgstr "dpkg: a memóriafoglalás meghiúsult a meghibásodott csomagok listájában egy új bejegyzés számára."
+msgstr "Nem foglalható le hely az új dl betöltő számára."
 
 #: ../src/daemon/ltdl-bind-now.c:142
-#, fuzzy
 msgid "Failed to add bind-now-loader."
-msgstr "nem sikerült hozzáadni a tartományt a csatlakozások hasítótáblázatához"
+msgstr "Nem sikerült hozzáadni az azonnali betöltés csatolást."
 
 #: ../src/daemon/main.c:141
 #, c-format
@@ -102,14 +95,14 @@ msgid "Exiting."
 msgstr "Kilépés."
 
 #: ../src/daemon/main.c:186
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to find user '%s'."
-msgstr "A csomag („%s”) keresése meghiúsult: %s"
+msgstr "Nem található a(z) „%s” felhasználó."
 
 #: ../src/daemon/main.c:191
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to find group '%s'."
-msgstr "%s csoportjának megváltoztatása sikertelen a következőre: %s\n"
+msgstr "Nem található a(z) „%s” csoport."
 
 #: ../src/daemon/main.c:195
 #, c-format
@@ -117,45 +110,43 @@ msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Létező felhasználó „%s” (UID: %lu) és csoport „%s” (GID: %lu)."
 
 #: ../src/daemon/main.c:200
-#, fuzzy, c-format
+#, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
-msgstr "csomagok letöltése és a műveletek el nem indítása"
+msgstr "A(z) „%s” felhasználó GID azonosítója és „%s” csoportja nem egyezik meg."
 
 #: ../src/daemon/main.c:205
-#, fuzzy, c-format
+#, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
-msgstr "%s: nem törlöm %s könyvtárat (%s saját könyvtára)\n"
+msgstr "A(z) „%s” felhasználó Saját mappája nem „%s”. Kihagyás."
 
 #: ../src/daemon/main.c:208
 #: ../src/daemon/main.c:213
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to create '%s': %s"
-msgstr "A szervizcsomag („%s”) létrehozása meghiúsult: %s"
+msgstr "Nem sikerült létrehozni a(z) „%s” fájlt: %s"
 
 #: ../src/daemon/main.c:220
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to change group list: %s"
-msgstr "Aktív tartományok listázása nem sikerült"
+msgstr "Nem sikerült megváltoztatni a csoportlistát: %s"
 
 #: ../src/daemon/main.c:236
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to change GID: %s"
-msgstr "A könyvtárváltás meghiúsult"
+msgstr "Nem sikerült megváltoztatni az GID azonosítót: %s"
 
 #: ../src/daemon/main.c:252
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to change UID: %s"
-msgstr "A könyvtárváltás meghiúsult"
+msgstr "Nem sikerült megváltoztatni az UID azonosítót: %s"
 
 #: ../src/daemon/main.c:271
-#, fuzzy
 msgid "Successfully dropped root privileges."
-msgstr "GNOME Commander - ROOT JOGSULTSÁGOK"
+msgstr "A rendszergazdai jogosultságok sikeresen visszaadva."
 
 #: ../src/daemon/main.c:279
-#, fuzzy
 msgid "System wide mode unsupported on this platform."
-msgstr "Az --atime-preserve='system' nem támogatott ezen az operációs rendszeren"
+msgstr "A rendszerszintű üzemmód nem támogatott ezen az operációs rendszeren."
 
 #: ../src/daemon/main.c:297
 #, fuzzy, c-format
@@ -163,32 +154,30 @@ msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "<b>Sikertelen bejelentkezést</b>"
 
 #: ../src/daemon/main.c:474
-#, fuzzy
 msgid "Failed to parse command line."
-msgstr "Nem lehet feldolgozni a(z) „%s” parancssort: %s"
+msgstr "Nem sikerült feldolgozni a parancssort."
 
 #: ../src/daemon/main.c:541
 msgid "Daemon not running"
 msgstr "A démon nem fut."
 
 #: ../src/daemon/main.c:543
-#, fuzzy, c-format
+#, c-format
 msgid "Daemon running as PID %u"
-msgstr "Ne démonként fusson."
+msgstr "A démon a következő PID azonosítóval fut: %u"
 
 #: ../src/daemon/main.c:553
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to kill daemon: %s"
-msgstr "nem sikerült olvasni a Xen-szolgáltatásból"
+msgstr "A démon forszírozott leállítása nem sikerült: %s"
 
 #: ../src/daemon/main.c:571
 msgid "This program is not intended to be run as root (unless --system is specified)."
-msgstr ""
+msgstr "Ez a program nincsen felkészítve arra, hogy rendszergazdai jogosultságokkal fusson (kivéve, ha a --system paraméter megadásra kerül)."
 
 #: ../src/daemon/main.c:573
-#, fuzzy
 msgid "Root privileges required."
-msgstr "Rendszergazdai jogok szükségesek!"
+msgstr "Rendszergazdai jogosultságok szükségesek."
 
 #: ../src/daemon/main.c:578
 #, fuzzy
@@ -213,35 +202,32 @@ msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 
 #: ../src/daemon/main.c:621
-#, fuzzy
 msgid "Failed to acquire stdio."
-msgstr "A(z) „%s” D-Bus név beszerzése meghiúsult\n"
+msgstr "Nem sikerült jogot szerezni az alapértelmezett ki- és bemenetre (stdio)."
 
 #: ../src/daemon/main.c:627
-#, fuzzy, c-format
+#, c-format
 msgid "pipe failed: %s"
-msgstr "%s: Cső létrehozása sikertelen"
+msgstr "Cső létrehozás meghiúsult: %s"
 
 #: ../src/daemon/main.c:632
-#, fuzzy, c-format
+#, c-format
 msgid "fork() failed: %s"
-msgstr "az indítás meghiúsult\n"
+msgstr "Programindítás meghiúsult: %s"
 
 #: ../src/daemon/main.c:646
 #: ../src/utils/pacat.c:508
-#, fuzzy, c-format
+#, c-format
 msgid "read() failed: %s"
-msgstr "olvasás sikertelen"
+msgstr "Olvasás meghiúsult: %s"
 
 #: ../src/daemon/main.c:652
-#, fuzzy
 msgid "Daemon startup failed."
-msgstr "A csatlakozás meghiúsult a démonhoz"
+msgstr "A démon elindítása nem sikerült."
 
 #: ../src/daemon/main.c:654
-#, fuzzy
 msgid "Daemon startup successful."
-msgstr "A portátirányítás sikeres!"
+msgstr "A démon sikeresen elindult."
 
 #: ../src/daemon/main.c:731
 #, c-format
@@ -249,19 +235,19 @@ msgid "This is PulseAudio %s"
 msgstr "PulseAudio %s"
 
 #: ../src/daemon/main.c:732
-#, fuzzy, c-format
+#, c-format
 msgid "Compilation host: %s"
-msgstr "Válassz _gépet ..."
+msgstr "Összeépítő számítógép: %s"
 
 #: ../src/daemon/main.c:733
-#, fuzzy, c-format
+#, c-format
 msgid "Compilation CFLAGS: %s"
-msgstr "Regex fordítási hiba - %s"
+msgstr "Összeépítési CFLAGS jelzők: %s"
 
 #: ../src/daemon/main.c:736
-#, fuzzy, c-format
+#, c-format
 msgid "Running on host: %s"
-msgstr "Python %s verzió"
+msgstr "Kiszolgáló: %s"
 
 #: ../src/daemon/main.c:739
 #, c-format
@@ -274,19 +260,17 @@ msgid "Page size is %lu bytes"
 msgstr "minimális szegmensméret = %lu\n"
 
 #: ../src/daemon/main.c:744
-#, fuzzy
 msgid "Compiled with Valgrind support: yes"
-msgstr "Pacman-szerű játék többjátékos módban"
+msgstr "Összeépítés Valgrind támogatással: Igen"
 
 #: ../src/daemon/main.c:746
-#, fuzzy
 msgid "Compiled with Valgrind support: no"
-msgstr "A leírások nem érhetőek el: nincs XML támogatás befordítva."
+msgstr "Összeépítés Valgrind támogatással: Nem"
 
 #: ../src/daemon/main.c:749
-#, fuzzy, c-format
+#, c-format
 msgid "Running in valgrind mode: %s"
-msgstr "Bemutató mód"
+msgstr "Futás Valgrind üzemmódban: %s"
 
 #: ../src/daemon/main.c:752
 msgid "Optimized build: yes"
@@ -311,9 +295,8 @@ msgid "All asserts enabled."
 msgstr "Adatok indexelése minden engedélyezett modulból"
 
 #: ../src/daemon/main.c:766
-#, fuzzy
 msgid "Failed to get machine ID"
-msgstr "A PDA azonosító lekérdezése nem sikerült"
+msgstr "Nem sikerült lekérdezni a számítógép azonosítóját"
 
 #: ../src/daemon/main.c:769
 #, c-format
@@ -326,24 +309,24 @@ msgid "Session ID is %s."
 msgstr "Munkamenet-azonosító: %s."
 
 #: ../src/daemon/main.c:779
-#, fuzzy, c-format
+#, c-format
 msgid "Using runtime directory %s."
-msgstr "Nem hozható létre ideiglenes könyvtár a következő sablon használatával: %s"
+msgstr "A futásidőben használt mappa: %s."
 
 #: ../src/daemon/main.c:784
-#, fuzzy, c-format
+#, c-format
 msgid "Using state directory %s."
-msgstr "HIBA: Nem lehet létrehozni a(z) %s állapotkönyvtárat"
+msgstr "Az állapottároló mappa: %s."
 
 #: ../src/daemon/main.c:787
-#, fuzzy, c-format
+#, c-format
 msgid "Using modules directory %s."
-msgstr "Nem hozható létre ideiglenes könyvtár a következő sablon használatával: %s"
+msgstr "A modulok mappája: %s."
 
 #: ../src/daemon/main.c:789
-#, fuzzy, c-format
+#, c-format
 msgid "Running in system mode: %s"
-msgstr "A rendszeróra teszt módban nem kerül beállításra.\n"
+msgstr "Futás rendszer üzemmódban: %s"
 
 #: ../src/daemon/main.c:792
 msgid ""
@@ -353,9 +336,8 @@ msgid ""
 msgstr ""
 
 #: ../src/daemon/main.c:809
-#, fuzzy
 msgid "pa_pid_file_create() failed."
-msgstr "A(z) „%s” fájl létrehozása meghiúsult: %s"
+msgstr "A „pa_pid_file_create()” függvényhívás meghiúsult: %s"
 
 #: ../src/daemon/main.c:819
 msgid "Fresh high-resolution timers available! Bon appetit!"
@@ -366,35 +348,28 @@ msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with h
 msgstr ""
 
 #: ../src/daemon/main.c:844
-#, fuzzy
 msgid "pa_core_new() failed."
-msgstr "Nem sikerült megnyitni a(z) %s.new fájlt"
+msgstr "A „pa_core_new()” függvényhívás meghiúsult: %s"
 
 #: ../src/daemon/main.c:904
-#, fuzzy
 msgid "Failed to initialize daemon."
-msgstr "PAM inicializálása sikertelen\n"
+msgstr "Nem sikerült előkészíteni a démont."
 
 #: ../src/daemon/main.c:909
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr ""
 
 #: ../src/daemon/main.c:926
-#, fuzzy
 msgid "Daemon startup complete."
-msgstr "Az importálás kész"
+msgstr "A démon elindítása sikeres."
 
 #: ../src/daemon/main.c:932
-#, fuzzy
 msgid "Daemon shutdown initiated."
-msgstr "egy tartomány elegáns leállítása"
+msgstr "A démon leállítása kezdeményezve."
 
 #: ../src/daemon/main.c:954
-#, fuzzy
 msgid "Daemon terminated."
-msgstr ""
-"\n"
-"A parancs megszakítva\n"
+msgstr "A démon leállítva."
 
 #: ../src/daemon/cmdline.c:115
 #, c-format
@@ -511,9 +486,9 @@ msgid "--log-meta expects boolean argument"
 msgstr "„%s” legalább egy paramétert vár"
 
 #: ../src/daemon/cmdline.c:354
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid resample method '%s'."
-msgstr "Üres rajzolásimód-név – érvénytelen"
+msgstr "Érvénytelen újramintavételezési eljárás: „%s”."
 
 #: ../src/daemon/cmdline.c:361
 #, fuzzy
@@ -536,9 +511,9 @@ msgid "Name: %s\n"
 msgstr "Név: %s\n"
 
 #: ../src/daemon/dumpmodules.c:63
-#, fuzzy, c-format
+#, c-format
 msgid "No module information available\n"
-msgstr "Nem áll rendelkezésre további információ."
+msgstr "Nem áll rendelkezésre modul információ.\n"
 
 #: ../src/daemon/dumpmodules.c:66
 #, c-format
@@ -576,78 +551,78 @@ msgid "Path: %s\n"
 msgstr "Elérési útvonal: %s\n"
 
 #: ../src/daemon/daemon-conf.c:232
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid log target '%s'."
-msgstr "Érvénytelen naplózási szint: „%s”"
+msgstr "[%s:%u] Érvénytelen naplózási cél: „%s”."
 
 #: ../src/daemon/daemon-conf.c:248
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid log level '%s'."
-msgstr "Érvénytelen naplózási szint: „%s”"
+msgstr "[%s:%u] Érvénytelen naplózási szint: „%s”."
 
 #: ../src/daemon/daemon-conf.c:264
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
-msgstr "Üres rajzolásimód-név – érvénytelen"
+msgstr "[%s:%u] Érvénytelen újramintavételezési eljárás: „%s”."
 
 #: ../src/daemon/daemon-conf.c:287
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
-msgstr "Érvénytelen művelet"
+msgstr "[%s:%u] Érvénytelen rlimit érték: „%s”."
 
 #: ../src/daemon/daemon-conf.c:294
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
-msgstr "Az --atime-preserve='system' nem támogatott ezen az operációs rendszeren"
+msgstr "[%s:%u] Az rlimit nem támogatott ezen az operációs rendszeren."
 
 #: ../src/daemon/daemon-conf.c:310
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
-msgstr "érvénytelen rövidítési forma"
+msgstr "[%s:%u] Érvénytelen mintavételi formátum: „%s”."
 
 #: ../src/daemon/daemon-conf.c:328
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
-msgstr "FIGYELEM: Événytelen mintavételezést határott meg 44100-at használom.\n"
+msgstr "[%s:%u] Érvénytelen mintavételi ráta: „%s”."
 
 #: ../src/daemon/daemon-conf.c:352
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
-msgstr "FIGYELEM: Érénytelen mintavételezést határozott meg, 16-ost használom.\n"
+msgstr "[%s:%u] Érvénytelen minta csatornák: „%s”."
 
 #: ../src/daemon/daemon-conf.c:370
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
-msgstr "Érvénytelen csatornatípus '%s'"
+msgstr "[%s:%u] Érvénytelen csatornaleképzés: „%s”."
 
 #: ../src/daemon/daemon-conf.c:388
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
-msgstr "a sorok száma érvénytelen"
+msgstr "[%s:%u] Érvénytelen a részek száma: „%s”."
 
 #: ../src/daemon/daemon-conf.c:406
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
-msgstr "a -size típusa („%c”) érvénytelen"
+msgstr "[%s:%u] Érvénytelen a részek mérete: „%s”."
 
 #: ../src/daemon/daemon-conf.c:424
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
-msgstr "Érvénytelen optimalizálási szint: %s"
+msgstr "[%s:%u] Érvénytelen a prioritási érték: „%s”."
 
 #: ../src/daemon/daemon-conf.c:546
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to open configuration file: %s"
-msgstr "nem sikerült olvasásra megnyitni a beállítási fájlt"
+msgstr "Nem sikerült megnyitni a konfigurációs fájlt: %s"
 
 #: ../src/daemon/daemon-conf.c:562
 msgid "The specified default channel map has a different number of channels than the specified default number of channels."
 msgstr ""
 
 #: ../src/daemon/daemon-conf.c:638
-#, fuzzy, c-format
+#, c-format
 msgid "### Read from configuration file: %s ###\n"
-msgstr "%s: Olvasási hiba a(z) %s fájlban\n"
+msgstr "### Olvasás a következő konfigurációs fájlból: %s ###\n"
 
 #: ../src/daemon/caps.c:62
 msgid "Cleaning up privileges."
@@ -916,14 +891,12 @@ msgid "Invalid argument"
 msgstr "Érvénytelen paraméter"
 
 #: ../src/pulse/error.c:47
-#, fuzzy
 msgid "Entity exists"
-msgstr "\" már létezik!"
+msgstr "Az egység létezik"
 
 #: ../src/pulse/error.c:48
-#, fuzzy
 msgid "No such entity"
-msgstr "nincs ilyen puffer"
+msgstr "Nincs ilyen egység"
 
 #: ../src/pulse/error.c:49
 msgid "Connection refused"
@@ -938,34 +911,28 @@ msgid "Timeout"
 msgstr "Időtúllépés"
 
 #: ../src/pulse/error.c:52
-#, fuzzy
 msgid "No authorization key"
-msgstr "Nem érhető el kulcs"
+msgstr "Nem érhető el hitelesítőkulcs"
 
 #: ../src/pulse/error.c:53
 msgid "Internal error"
 msgstr "Belső hiba"
 
 #: ../src/pulse/error.c:54
-#, fuzzy
 msgid "Connection terminated"
-msgstr ""
-"\n"
-"A parancs megszakítva\n"
+msgstr "A kapcsolat megszakadt."
 
 #: ../src/pulse/error.c:55
-#, fuzzy
 msgid "Entity killed"
-msgstr "A(z) %d számú folyamat kilőve"
+msgstr "Egység forszírozottan leállítva"
 
 #: ../src/pulse/error.c:56
 msgid "Invalid server"
 msgstr "Érvénytelen kiszolgáló"
 
 #: ../src/pulse/error.c:57
-#, fuzzy
 msgid "Module initalization failed"
-msgstr "A(z) \"%s\" modul végrehajtása meghiúsult."
+msgstr "A modul előkészítése meghiúsult."
 
 #: ../src/pulse/error.c:58
 msgid "Bad state"
@@ -976,7 +943,6 @@ msgid "No data"
 msgstr "Nincs adat"
 
 #: ../src/pulse/error.c:60
-#, fuzzy
 msgid "Incompatible protocol version"
 msgstr "Inkompatibilis protokollverzió"
 
@@ -997,34 +963,29 @@ msgid "No such extension"
 msgstr "Nincs ilyen kiterjesztés"
 
 #: ../src/pulse/error.c:65
-#, fuzzy
 msgid "Obsolete functionality"
-msgstr "Elavult vagy helyi"
+msgstr "Elavult funkcionalitás"
 
 #: ../src/pulse/error.c:66
-#, fuzzy
 msgid "Missing implementation"
 msgstr "Nincs megvalósítva"
 
 #: ../src/pulse/error.c:67
-#, fuzzy
 msgid "Client forked"
-msgstr "BitTorrent kliens"
+msgstr "Kliens elindítva"
 
 #: ../src/pulse/error.c:68
-#, fuzzy
 msgid "Input/Output error"
 msgstr "Kimeneti/bemeneti hiba"
 
 #: ../src/pulse/error.c:69
-#, fuzzy
 msgid "Device or resource busy"
 msgstr "Az eszköz vagy erőforrás foglalt"
 
 #: ../src/pulse/sample.c:172
 #, c-format
 msgid "%s %uch %uHz"
-msgstr ""
+msgstr "%s %uch %uHz"
 
 #: ../src/pulse/sample.c:184
 #, c-format
@@ -1044,7 +1005,7 @@ msgstr "%0.1f KiB"
 #: ../src/pulse/sample.c:190
 #, c-format
 msgid "%u B"
-msgstr ""
+msgstr "%u B"
 
 #: ../src/pulse/client-conf-x11.c:55
 #: ../src/utils/pax11publish.c:100
@@ -1052,14 +1013,13 @@ msgid "XOpenDisplay() failed"
 msgstr "Az XOpenDisplay() függvényhívás meghiúsult."
 
 #: ../src/pulse/client-conf-x11.c:93
-#, fuzzy
 msgid "Failed to parse cookie data"
-msgstr "sikertelen a szimbólum adatainak a betöltése"
+msgstr "Nem sikerült feldolgozni a süti adatokat."
 
 #: ../src/pulse/client-conf.c:111
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to open configuration file '%s': %s"
-msgstr "nem sikerült olvasásra megnyitni a beállítási fájlt"
+msgstr "Nem sikerült megnyitni a(z) „%s” konfigurációs fájlt: %s"
 
 #: ../src/pulse/context.c:550
 msgid "No cookie loaded. Attempting to connect without."
@@ -1076,19 +1036,18 @@ msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
 #: ../src/pulse/context.c:1438
-#, fuzzy, c-format
+#, c-format
 msgid "Received message for unknown extension '%s'"
-msgstr "\"_Ismeretlen állapotú\" üzenet olvasása"
+msgstr "Üzenet érkezett az ismeretlen „%s” kiterjesztéstől"
 
 #: ../src/utils/pacat.c:108
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to drain stream: %s"
-msgstr "Az új adatfolyam indítása meghiúsult"
+msgstr "Nem sikerült csatlakozni a következő adatfolyamhoz: %s"
 
 #: ../src/utils/pacat.c:113
-#, fuzzy
 msgid "Playback stream drained."
-msgstr "A folyam váratlanul véget ért!"
+msgstr "A lejátszás adatfolyamához csatlakozva."
 
 #: ../src/utils/pacat.c:123
 #, fuzzy
@@ -1138,7 +1097,7 @@ msgstr "--Nincsenek sorok a pufferben--"
 #: ../src/utils/pacat.c:321
 #, fuzzy, c-format
 msgid "Using sample spec '%s', channel map '%s'."
-msgstr "%s: térkép tábla \"%s\": %lu bájt\n"
+msgstr "A csatornaleképzés nem feleltethető meg a mintavételi leírásnak."
 
 #: ../src/utils/pacat.c:325
 #, fuzzy, c-format
@@ -1181,9 +1140,8 @@ msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Nem sikerült megnyitni a kimeneti eszközt"
 
 #: ../src/utils/pacat.c:376
-#, fuzzy
 msgid "not "
-msgstr "Nem győződtem meg"
+msgstr "nem"
 
 #: ../src/utils/pacat.c:383
 #, fuzzy, c-format
@@ -1191,9 +1149,9 @@ msgid "Stream buffer attributes changed.%s"
 msgstr "E787: A puffer váratlanul megváltozott"
 
 #: ../src/utils/pacat.c:415
-#, fuzzy, c-format
+#, c-format
 msgid "Connection established.%s"
-msgstr "Kapcsolat létrehozva"
+msgstr "Kapcsolat létrehozva. %s"
 
 #: ../src/utils/pacat.c:418
 #, c-format
@@ -1201,14 +1159,14 @@ msgid "pa_stream_new() failed: %s"
 msgstr "A „pa_stream_new()” függvényhívás meghiúsult: %s"
 
 #: ../src/utils/pacat.c:450
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_connect_playback() failed: %s"
-msgstr "A megfigyelő adatfolyam csatlakoztatása meghiúsult"
+msgstr "A „pa_stream_connect_playback()” függvényhívás meghiúsult: %s"
 
 #: ../src/utils/pacat.c:456
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_connect_record() failed: %s"
-msgstr "A megfigyelő adatfolyam csatlakoztatása meghiúsult"
+msgstr "A „pa_stream_connect_record()” függvényhívás meghiúsult: %s"
 
 #: ../src/utils/pacat.c:470
 #: ../src/utils/pactl.c:857
@@ -1217,9 +1175,8 @@ msgid "Connection failure: %s"
 msgstr "Kapcsolódási hiba: %s"
 
 #: ../src/utils/pacat.c:503
-#, fuzzy
 msgid "Got EOF."
-msgstr "Üzenet érkezett: #%"
+msgstr "A fájl vége elérve."
 
 #: ../src/utils/pacat.c:540
 #, c-format
@@ -1231,14 +1188,14 @@ msgid "Got signal, exiting."
 msgstr "Kilépés, szignál hatására…"
 
 #: ../src/utils/pacat.c:575
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get latency: %s"
-msgstr "nem sikerült a képességek lekérdezése"
+msgstr "Nem sikerült lekérdezni a késleltetést: %s"
 
 #: ../src/utils/pacat.c:580
-#, fuzzy, c-format
+#, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
-msgstr "%d csoport elmentve ebben: \"%s\" %.1f másodperc alatt (%.0f csoport/mp)"
+msgstr "Idő: %0.3f másodperc, késleltetés: %0.0f ezredmásodperc."
 
 #: ../src/utils/pacat.c:599
 #, c-format
@@ -1440,9 +1397,9 @@ msgid "Failure to resume: %s\n"
 msgstr "Hiba lépett fel a készenléti állapotból visszatérés közben: %s\n"
 
 #: ../src/utils/pasuspender.c:147
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
-msgstr "A leejtett fájl nem helyi."
+msgstr "FIGYELMEZTETÉS: A hangkiszolgáló nem helyi és nincs is felfüggesztve.\n"
 
 #: ../src/utils/pasuspender.c:159
 #, c-format
@@ -1455,11 +1412,9 @@ msgid "Got SIGINT, exiting.\n"
 msgstr "Kilépés, SIGINT szignál hatására…\n"
 
 #: ../src/utils/pasuspender.c:194
-#, fuzzy, c-format
+#, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
-msgstr ""
-"A(z) %d azonosítójú folyamatot nem lehet kilőni %d jelzéssel.\n"
-"%s"
+msgstr "FIGYELMEZTETÉS: A gyermek folyamat a következő szignállal fejeződött be: %u\n"
 
 #: ../src/utils/pasuspender.c:212
 #, c-format
@@ -1508,7 +1463,7 @@ msgstr ""
 #: ../src/utils/pactl.c:144
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
-msgstr ""
+msgstr "A futás során összesen lefoglalt blokkok száma: %u, amely összesen %s bájtot jelent.\n"
 
 #: ../src/utils/pactl.c:147
 #, c-format
@@ -1516,9 +1471,9 @@ msgid "Sample cache size: %s\n"
 msgstr "Minta-gyorsítótár mérete: %s\n"
 
 #: ../src/utils/pactl.c:156
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get server information: %s"
-msgstr "csomópont-információ lekérdezése nem sikerült"
+msgstr "Nem sikerült lekérdezni a kiszolgáló adatait: „%s”"
 
 #: ../src/utils/pactl.c:164
 #, c-format
@@ -1533,11 +1488,20 @@ msgid ""
 "Default Source: %s\n"
 "Cookie: %08x\n"
 msgstr ""
+"Felhasználónév: %s\n"
+"Számítógépnév: %s\n"
+"Kiszolgálónév: %s\n"
+"Kiszolgáló verzió: %s\n"
+"Alapértelmezett mintavételi leírás: %s\n"
+"Alapértelmezett csatornaleképzés: %s\n"
+"Alapértelmezett nyelő: %s\n"
+"Alapértelmezett forrás: %s\n"
+"Süti: %08x\n"
 
 #: ../src/utils/pactl.c:205
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get sink information: %s"
-msgstr "csomópont-információ lekérdezése nem sikerült"
+msgstr "Nem sikerült lekérdezni a nyelő adatait: „%s”"
 
 #: ../src/utils/pactl.c:221
 #, c-format
@@ -1560,6 +1524,23 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"Nyelő #%u\n"
+"\tÁllapot: %s\n"
+"\tNév: %s\n"
+"\tLeírás: %s\n"
+"\tEszközmeghajtó: %s\n"
+"\tMintavételi leírás: %s\n"
+"\tCsatornaleképzés: %s\n"
+"\tTulajdonos modul: %u\n"
+"\tNémítás: %s\n"
+"\tHangerő: %s%s%s\n"
+"\t        egyensúly %0.2f\n"
+"\tAlap hangerő: %s%s%s\n"
+"\tMonitor forrás: %s\n"
+"\tKésleltetés: %0.0f ezredmásodperc, beállítva %0.0f ezredmásodperc\n"
+"\tJelzők: %s%s%s%s%s%s\n"
+"\tTulajdonságok:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:268
 #: ../src/utils/pactl.c:360
@@ -1574,9 +1555,9 @@ msgid "\tActive Port: %s\n"
 msgstr "\tAktív Port: %s\n"
 
 #: ../src/utils/pactl.c:297
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get source information: %s"
-msgstr "csomópont-információ lekérdezése nem sikerült"
+msgstr "Nem sikerült lekérdezni a forrás adatait: „%s”"
 
 #: ../src/utils/pactl.c:313
 #, c-format
@@ -1599,6 +1580,23 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"Forrás #%u\n"
+"\tÁllapot: %s\n"
+"\tNév: %s\n"
+"\tLeírás: %s\n"
+"\tEszközmeghajtó: %s\n"
+"\tMintavételi leírás: %s\n"
+"\tCsatornaleképzés: %s\n"
+"\tTulajdonos modul: %u\n"
+"\tNémítás: %s\n"
+"\tHangerő: %s%s%s\n"
+"\t        egyensúly %0.2f\n"
+"\tAlap hangerő: %s%s%s\n"
+"\tNyelő monitora: %s\n"
+"\tKésleltetés: %0.0f ezredmásodperc, beállítva %0.0f ezredmásodperc\n"
+"\tJelzők: %s%s%s%s%s%s\n"
+"\tTulajdonságok:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:345
 #: ../src/utils/pactl.c:401
@@ -1617,9 +1615,9 @@ msgid "n/a"
 msgstr "ismeretlen"
 
 #: ../src/utils/pactl.c:375
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get module information: %s"
-msgstr "csomópont-információ lekérdezése nem sikerült"
+msgstr "Nem sikerült lekérdezni a modul adatait: „%s”"
 
 #: ../src/utils/pactl.c:393
 #, c-format
@@ -1631,26 +1629,37 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"Modul #%u\n"
+"\tNév: %s\n"
+"\tParaméter: %s\n"
+"\tHasználva: %s\n"
+"\tTulajdonságok:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:412
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get client information: %s"
-msgstr "csomópont-információ lekérdezése nem sikerült"
+msgstr "Nem sikerült lekérdezni a kliens adatait: „%s”"
 
 #: ../src/utils/pactl.c:430
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Client #%u\n"
 "\tDriver: %s\n"
 "\tOwner Module: %s\n"
 "\tProperties:\n"
 "\t\t%s\n"
-msgstr "A modul nem képes létrehozni a szükséges szálakat"
+msgstr ""
+"Kliens #%u\n"
+"\tEszközmeghajtó: %s\n"
+"\tTulajdonos modul: %s\n"
+"\tTulajdonságok:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:447
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get card information: %s"
-msgstr "csomópont-információ lekérdezése nem sikerült"
+msgstr "Nem sikerült lekérdezni a kártya adatait: „%s”"
 
 #: ../src/utils/pactl.c:465
 #, c-format
@@ -1662,6 +1671,12 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"Kártya #%u\n"
+"\tNév: %s\n"
+"\tEszközmeghajtó: %s\n"
+"\tTulajdonos modul: %s\n"
+"\tTulajdonságok:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:479
 #, c-format
@@ -1674,9 +1689,9 @@ msgid "\tActive Profile: %s\n"
 msgstr "\tAktív profil: %s\n"
 
 #: ../src/utils/pactl.c:496
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get sink input information: %s"
-msgstr "pa_context_get_sink_input_info() meghiúsult"
+msgstr "Nem sikerült lekérdezni a nyelő bemeneti adatait: „%s”"
 
 #: ../src/utils/pactl.c:515
 #, c-format
@@ -1698,11 +1713,27 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"Nyelő bemenet #%u\n"
+"\tEszközmeghajtó: %s\n"
+"\tTulajdonos modul: %s\n"
+"\tKliens: %s\n"
+"\tNyelő: %u\n"
+"\tMintavételi leírás: %s\n"
+"\tCsatornaleképzés: %s\n"
+"\tNémítás: %s\n"
+"\tHangerő: %s\n"
+"\t        %s\n"
+"\t        egyensúly %0.2f\n"
+"\tPuffer késleltetés: %0.0f usec\n"
+"\tNyelő késleltetés: %0.0f usec\n"
+"\tÚjramintavételezési eljárás: %s\n"
+"\tTulajdonságok:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:554
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get source output information: %s"
-msgstr "pa_context_get_source_output_info_list() meghiúsult"
+msgstr "Nem sikerült lekérdezni a forrás kimeneti adatait: „%s”"
 
 #: ../src/utils/pactl.c:574
 #, c-format
@@ -1720,11 +1751,23 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"Forrás kimenet #%u\n"
+"\tEszközmeghajtó: %s\n"
+"\tTulajdonos modul: %s\n"
+"\tKliens: %s\n"
+"\tForrás: %u\n"
+"\tMintavételi leírás: %s\n"
+"\tCsatornaleképzés: %s\n"
+"\tPuffer késleltetés: %0.0f usec\n"
+"\tForrás késleltetés: %0.0f usec\n"
+"\tÚjramintavételezési eljárás: %s\n"
+"\tTulajdonságok:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:605
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get sample information: %s"
-msgstr "csomópont-információ lekérdezése nem sikerült"
+msgstr "Nem sikerült lekérdezni a mintavétel adatait: „%s”"
 
 #: ../src/utils/pactl.c:623
 #, c-format
@@ -1743,6 +1786,19 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"Minta #%u\n"
+"\tNév: %s\n"
+"\tMintavételi leírás: %s\n"
+"\tCsatornaleképzés: %s\n"
+"\tHangerő: %s\n"
+"\t        %s\n"
+"\t        egyensúly %0.2f\n"
+"\tIdőtartam: %0.1fs\n"
+"\tMéret: %s\n"
+"\tLassú: %s\n"
+"\tFájlnév: %s\n"
+"\tTulajdonságok:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:653
 #: ../src/utils/pactl.c:663
@@ -1751,14 +1807,11 @@ msgid "Failure: %s"
 msgstr "Hiba: %s"
 
 #: ../src/utils/pactl.c:687
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to upload sample: %s"
-msgstr ""
-"A feltöltés a kiszolgálóra meghiúsult,\n"
-"később próbálja meg újra."
+msgstr "Nem sikerült feltölteni a mintát: %s"
 
 #: ../src/utils/pactl.c:704
-#, fuzzy
 msgid "Premature end of file"
 msgstr "Idő előtti fájlvége"
 
@@ -1807,14 +1860,12 @@ msgid ""
 msgstr "A program kapcsolói ütköznek"
 
 #: ../src/utils/pactl.c:979
-#, fuzzy
 msgid "Please specify a sample file to load"
-msgstr "A glade fájl betöltése meghiúsult, ellenőrizze a telepítését."
+msgstr "Adja meg a betöltendő mintafájlt"
 
 #: ../src/utils/pactl.c:992
-#, fuzzy
 msgid "Failed to open sound file."
-msgstr "Nem sikerült megnyitni az átmeneti fájlt"
+msgstr "Nem sikerült megnyitni az hangfájlt."
 
 #: ../src/utils/pactl.c:1004
 msgid "Warning: Failed to determine sample specification from file."
@@ -1854,7 +1905,7 @@ msgstr ""
 
 #: ../src/utils/pactl.c:1115
 msgid "You have to specify a card name/index and a profile name"
-msgstr ""
+msgstr "Meg kell adnia a kártya nevét vagy azonosítóját és a profil nevét"
 
 #: ../src/utils/pactl.c:1126
 msgid "You have to specify a sink name/index and a port name"
@@ -1862,7 +1913,7 @@ msgstr "Meg kell adnia a nyelő nevét vagy azonosítóját és a port nevét."
 
 #: ../src/utils/pactl.c:1137
 msgid "You have to specify a source name/index and a port name"
-msgstr ""
+msgstr "Meg kell adnia a forrás nevét vagy azonosítóját és a port nevét"
 
 #: ../src/utils/pactl.c:1149
 msgid "You have to specify a sink name/index and a volume"
@@ -1879,11 +1930,11 @@ msgstr "A hangerő megadása érvénytelen."
 
 #: ../src/utils/pactl.c:1166
 msgid "You have to specify a source name/index and a volume"
-msgstr ""
+msgstr "Meg kell adnia a forrás nevét vagy azonosítóját és a hangerejét"
 
 #: ../src/utils/pactl.c:1183
 msgid "You have to specify a sink input index and a volume"
-msgstr ""
+msgstr "Meg kell adnia a nyelő bemenet azonosítóját és a hangerejét"
 
 #: ../src/utils/pactl.c:1188
 msgid "Invalid sink input index"
@@ -1895,11 +1946,11 @@ msgstr "Meg kell adnia a nyelő nevét vagy azonosítóját és a némítás log
 
 #: ../src/utils/pactl.c:1221
 msgid "You have to specify a source name/index and a mute boolean"
-msgstr ""
+msgstr "Meg kell adnia a forrás nevét vagy azonosítóját és a némítás logikai változóját"
 
 #: ../src/utils/pactl.c:1238
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr ""
+msgstr "Meg kell adnia a nyelő bemenet azonosítóját és a némítás logikai változóját"
 
 #: ../src/utils/pactl.c:1243
 msgid "Invalid sink input index specification"
@@ -1919,11 +1970,17 @@ msgid ""
 " -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 megjelenítő] [-S kiszolgáló] [-O nyelő] [-I forrás] [-c fájl]  [-d|-e|-i|-r]\n"
+"\n"
+" -d    Megjeleníti az aktuális X11 megjelenítőhöz csatlakoztatott PulseAudio adatokat (alapértelmezés)\n"
+" -e    Helyi PulseAudio adatok exportálása az X11 megjelenítőre\n"
+" -i    Helyi PulseAudio adatok importálása az X11 megjelenítőről helyi környezeti változókba és süti fájlokba\n"
+" -r    Eltávolítja a PulseAudio adatokat z X11 megjelenítőről\n"
 
 #: ../src/utils/pax11publish.c:94
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to parse command line.\n"
-msgstr "Nem lehet feldolgozni a(z) „%s” parancssort: %s"
+msgstr "Nem sikerült feldolgozni a parancssort.\n"
 
 #: ../src/utils/pax11publish.c:108
 #, c-format
@@ -1946,34 +2003,34 @@ msgid "Cookie: %s\n"
 msgstr "Süti: %s\n"
 
 #: ../src/utils/pax11publish.c:132
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to parse cookie data\n"
-msgstr "sikertelen a szimbólum adatainak a betöltése"
+msgstr "Nem sikerült feldolgozni a süti adatokat.\n"
 
 #: ../src/utils/pax11publish.c:137
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to save cookie data\n"
-msgstr "sikertelen a szimbólum adatainak a betöltése"
+msgstr "Nem sikerült elmenteni a süti adatokat.\n"
 
 #: ../src/utils/pax11publish.c:152
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to load client configuration file.\n"
-msgstr "nem sikerült olvasásra megnyitni a beállítási fájlt"
+msgstr "Nem sikerült betölteni a kliens konfigurációs fájlt.\n"
 
 #: ../src/utils/pax11publish.c:157
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to read environment configuration data.\n"
-msgstr "Az adatok olvasása meghiúsult az adatfolyamból"
+msgstr "Nem sikerült elolvasni a környezetváltozó konfigurációs adatokat.\n"
 
 #: ../src/utils/pax11publish.c:174
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get FQDN.\n"
-msgstr "nem sikerült a képességek lekérdezése"
+msgstr "Nem sikerült lekérdezni a teljes tartománynevet (FQDN).\n"
 
 #: ../src/utils/pax11publish.c:194
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to load cookie data\n"
-msgstr "sikertelen a szimbólum adatainak a betöltése"
+msgstr "Nem sikerült betölteni a süti adatokat.\n"
 
 #: ../src/utils/pax11publish.c:211
 #, c-format
@@ -1982,12 +2039,12 @@ msgstr "Még nincs elkészítve.\n"
 
 #: ../src/utils/pacmd.c:69
 msgid "No PulseAudio daemon running, or not running as session daemon."
-msgstr ""
+msgstr "Nem fut a PulseAudio démon vagy nem fut munkamenet démonként sem."
 
 #: ../src/utils/pacmd.c:74
-#, fuzzy, c-format
+#, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
-msgstr "svc_unix.c - AF_UNIX gond van illesztőpont létrehozásával"
+msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
 #: ../src/utils/pacmd.c:91
 #, c-format

commit 02a69d8b45ce293194d63974a6376646c841992d
Author: kami911 <kami911 at fedoraproject.org>
Date:   Sat Oct 17 09:48:40 2009 +0000

    Sending translation for Hungarian

diff --git a/po/hu.po b/po/hu.po
index b59bef5..b34c8ff 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -149,9 +149,9 @@ msgid "System wide mode unsupported on this platform."
 msgstr "A rendszerszintű üzemmód nem támogatott ezen az operációs rendszeren."
 
 #: ../src/daemon/main.c:297
-#, fuzzy, c-format
+#, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
-msgstr "<b>Sikertelen bejelentkezést</b>"
+msgstr "setrlimit(%s, (%u, %u)) meghiúsult: %s"
 
 #: ../src/daemon/main.c:474
 msgid "Failed to parse command line."
@@ -255,9 +255,9 @@ msgid "Found %u CPUs."
 msgstr "%u CPU található a rendszerben."
 
 #: ../src/daemon/main.c:741
-#, fuzzy, c-format
+#, c-format
 msgid "Page size is %lu bytes"
-msgstr "minimális szegmensméret = %lu\n"
+msgstr "Oldalméret: %lu bájt"
 
 #: ../src/daemon/main.c:744
 msgid "Compiled with Valgrind support: yes"
@@ -433,57 +433,48 @@ msgid ""
 msgstr ""
 
 #: ../src/daemon/cmdline.c:247
-#, fuzzy
 msgid "--daemonize expects boolean argument"
-msgstr "„%s” legalább egy paramétert vár"
+msgstr "--daemonize paraméter logikai értéket vár el"
 
 #: ../src/daemon/cmdline.c:254
-#, fuzzy
 msgid "--fail expects boolean argument"
-msgstr "„%s” legalább egy paramétert vár"
+msgstr "--fail paraméter logikai értéket vár el"
 
 #: ../src/daemon/cmdline.c:264
 msgid "--log-level expects log level argument (either numeric in range 0..4 or one of debug, info, notice, warn, error)."
 msgstr ""
 
 #: ../src/daemon/cmdline.c:276
-#, fuzzy
 msgid "--high-priority expects boolean argument"
-msgstr "„%s” legalább egy paramétert vár"
+msgstr "--high-priority paraméter logikai értéket vár el"
 
 #: ../src/daemon/cmdline.c:283
-#, fuzzy
 msgid "--realtime expects boolean argument"
-msgstr "„%s” legalább egy paramétert vár"
+msgstr "--realtime paraméter logikai értéket vár el"
 
 #: ../src/daemon/cmdline.c:290
-#, fuzzy
 msgid "--disallow-module-loading expects boolean argument"
-msgstr "a(z) „%s” első paraméterként karakterláncot vár"
+msgstr "--disallow-module-loading paraméter logikai értéket vár el"
 
 #: ../src/daemon/cmdline.c:297
-#, fuzzy
 msgid "--disallow-exit expects boolean argument"
-msgstr "„%s” legalább egy paramétert vár"
+msgstr "--disallow-exit paraméter logikai értéket vár el"
 
 #: ../src/daemon/cmdline.c:304
-#, fuzzy
 msgid "--use-pid-file expects boolean argument"
-msgstr "a(z) „%s” első paraméterként karakterláncot vár"
+msgstr "--use-pid-file paraméter logikai értéket vár el"
 
 #: ../src/daemon/cmdline.c:321
 msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
-msgstr ""
+msgstr "Érvénytelen naplózási cél: használja a „syslog”, a „stderr” vagy az „auto” értéket."
 
 #: ../src/daemon/cmdline.c:328
-#, fuzzy
 msgid "--log-time expects boolean argument"
-msgstr "„%s” első paraméterként time_t-t vár"
+msgstr "--log-time paraméter logikai értéket vár el"
 
 #: ../src/daemon/cmdline.c:335
-#, fuzzy
 msgid "--log-meta expects boolean argument"
-msgstr "„%s” legalább egy paramétert vár"
+msgstr "--log-meta paraméter logikai értéket vár el"
 
 #: ../src/daemon/cmdline.c:354
 #, c-format
@@ -491,19 +482,16 @@ msgid "Invalid resample method '%s'."
 msgstr "Érvénytelen újramintavételezési eljárás: „%s”."
 
 #: ../src/daemon/cmdline.c:361
-#, fuzzy
 msgid "--system expects boolean argument"
-msgstr "„%s” legalább egy paramétert vár"
+msgstr "--system paraméter logikai értéket vár el"
 
 #: ../src/daemon/cmdline.c:368
-#, fuzzy
 msgid "--no-cpu-limit expects boolean argument"
-msgstr "a(z) „%s” első paraméterként karakterláncot vár"
+msgstr "--no-cpu-limit paraméter logikai értéket vár el"
 
 #: ../src/daemon/cmdline.c:375
-#, fuzzy
 msgid "--disable-shm expects boolean argument"
-msgstr "„%s” legalább egy paramétert vár"
+msgstr "--disable-shm paraméter logikai értéket vár el"
 
 #: ../src/daemon/dumpmodules.c:60
 #, c-format
@@ -617,7 +605,7 @@ msgstr "Nem sikerült megnyitni a konfigurációs fájlt: %s"
 
 #: ../src/daemon/daemon-conf.c:562
 msgid "The specified default channel map has a different number of channels than the specified default number of channels."
-msgstr ""
+msgstr "Az alapértelmezetten megadott mintavételi leírás csatornáinak száma eltér az alapértelmezetten megadott csatornaszámtól."
 
 #: ../src/daemon/daemon-conf.c:638
 #, c-format
@@ -1050,9 +1038,8 @@ msgid "Playback stream drained."
 msgstr "A lejátszás adatfolyamához csatlakozva."
 
 #: ../src/utils/pacat.c:123
-#, fuzzy
 msgid "Draining connection to server."
-msgstr "Kapcsolat visszaállítása a kiszolgálóhoz"
+msgstr "Csatlakozás a kiszolgálóhoz kapcsolathoz."
 
 #: ../src/utils/pacat.c:136
 #, c-format
@@ -1087,22 +1074,22 @@ msgstr "A „pa_stream_get_buffer_attr()” függvényhívás meghiúsult: %s"
 #: ../src/utils/pacat.c:314
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
-msgstr ""
+msgstr "Pufferméretek: maximális nagyság: %u, hossz: %u, előpufferelés: %u, minimum: %u"
 
 #: ../src/utils/pacat.c:317
-#, fuzzy, c-format
+#, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
-msgstr "--Nincsenek sorok a pufferben--"
+msgstr "Pufferméretek: maximális nagyság: %u, részek mérete: %u"
 
 #: ../src/utils/pacat.c:321
-#, fuzzy, c-format
+#, c-format
 msgid "Using sample spec '%s', channel map '%s'."
-msgstr "A csatornaleképzés nem feleltethető meg a mintavételi leírásnak."
+msgstr "Mintavételi leírás: „%s” és csatornaleképzés: „%s” használata."
 
 #: ../src/utils/pacat.c:325
-#, fuzzy, c-format
+#, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
-msgstr "Kapcsolódva az eszközhöz a következőn: %s"
+msgstr "Csatlakozva a következő eszközhöz: „%s” (%u, %ssuspended)."
 
 #: ../src/utils/pacat.c:335
 #, c-format
@@ -1135,18 +1122,18 @@ msgid "Stream started.%s"
 msgstr "%s adatfolyam elindítva."
 
 #: ../src/utils/pacat.c:376
-#, fuzzy, c-format
+#, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
-msgstr "Nem sikerült megnyitni a kimeneti eszközt"
+msgstr "Az adatfolyam áthelyezve a következő eszközre: „%s” (%u, %ssuspended). %s"
 
 #: ../src/utils/pacat.c:376
 msgid "not "
 msgstr "nem"
 
 #: ../src/utils/pacat.c:383
-#, fuzzy, c-format
+#, c-format
 msgid "Stream buffer attributes changed.%s"
-msgstr "E787: A puffer váratlanul megváltozott"
+msgstr "Az adatfolyam-puffer beállításai megváltoztak: %s"
 
 #: ../src/utils/pacat.c:415
 #, c-format
@@ -1244,12 +1231,15 @@ msgid ""
 msgstr ""
 
 #: ../src/utils/pacat.c:731
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "pacat %s\n"
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
-msgstr "A program kapcsolói ütköznek"
+msgstr ""
+"pacat %s\n"
+"Összeépítve a libpulse %s programkönyvtárral\n"
+"Csatolva a libpulse %s programkönyvtárhoz\n"
 
 #: ../src/utils/pacat.c:764
 #: ../src/utils/pactl.c:953
@@ -1315,7 +1305,7 @@ msgstr "Nem sikerült megnyitni a hangfájlt."
 
 #: ../src/utils/pacat.c:959
 msgid "Warning: specified sample specification will be overwritten with specification from file."
-msgstr ""
+msgstr "Figyelmeztetés: a megadott mintavételi leírás felül lesz írva a fájlból származó mintavételi leírással."
 
 #: ../src/utils/pacat.c:962
 #: ../src/utils/pactl.c:997
@@ -1324,7 +1314,7 @@ msgstr "Nem sikerült meghatározni a mintavételi leírást a fájlból."
 
 #: ../src/utils/pacat.c:971
 msgid "Warning: Failed to determine channel map from file."
-msgstr ""
+msgstr "Figyelmeztetés: Nem sikerült meghatározni a csatornaleképzést a fájlból."
 
 #: ../src/utils/pacat.c:982
 msgid "Channel map doesn't match sample specification"
@@ -1337,7 +1327,7 @@ msgstr "Hiba történt a csatornaleképzés fájlba írása közben."
 #: ../src/utils/pacat.c:1008
 #, c-format
 msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr ""
+msgstr "A(z) „%s” adatfolyam megnyitása a következő mintavételi leírás: „%s” és csatornaleképzés: „%s” használatával."
 
 #: ../src/utils/pacat.c:1009
 msgid "recording"
@@ -1428,12 +1418,15 @@ msgid ""
 msgstr ""
 
 #: ../src/utils/pasuspender.c:248
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "pasuspender %s\n"
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
-msgstr "A program kapcsolói ütköznek"
+msgstr ""
+"pasuspender %s\n"
+"Összeépítve a libpulse %s programkönyvtárral\n"
+"Csatolva a libpulse %s programkönyvtárhoz\n"
 
 #: ../src/utils/pasuspender.c:277
 #, c-format
@@ -1852,12 +1845,15 @@ msgid ""
 msgstr ""
 
 #: ../src/utils/pactl.c:933
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "pactl %s\n"
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
-msgstr "A program kapcsolói ütköznek"
+msgstr ""
+"pactl %s\n"
+"Összeépítve a libpulse %s programkönyvtárral\n"
+"Csatolva a libpulse %s programkönyvtárhoz\n"
 
 #: ../src/utils/pactl.c:979
 msgid "Please specify a sample file to load"
@@ -1869,7 +1865,7 @@ msgstr "Nem sikerült megnyitni az hangfájlt."
 
 #: ../src/utils/pactl.c:1004
 msgid "Warning: Failed to determine sample specification from file."
-msgstr "RGB-adat betöltése a TIFF fájlból sikertelen"
+msgstr "Figyelmeztetés: Nem sikerült meghatározni a mintavételi leírást a fájlból."
 
 #: ../src/utils/pactl.c:1014
 msgid "You have to specify a sample name to play"
@@ -1897,11 +1893,11 @@ msgstr "Meg kell adnia a modul azonosítóját."
 
 #: ../src/utils/pactl.c:1090
 msgid "You may not specify more than one sink. You have to specify a boolean value."
-msgstr ""
+msgstr "Nem adhat meg egynél több nyelőt. Egy logikai értéket kell megadnia."
 
 #: ../src/utils/pactl.c:1103
 msgid "You may not specify more than one source. You have to specify a boolean value."
-msgstr ""
+msgstr "Nem adhat meg egynél több forrást. Egy logikai értéket kell megadnia."
 
 #: ../src/utils/pactl.c:1115
 msgid "You have to specify a card name/index and a profile name"
@@ -2090,6 +2086,9 @@ msgid ""
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
 "We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
 msgstr ""
+"Az ALSA modul értesítése nyomán új adatokat kellett volna írni az eszközre, de jelenleg semmilyen írandó adat nincsen.\n"
+"Ez egy hiba lehet a(z) „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé.\n"
+"Az értesítés a POLLOUT jelzésen keresztül érkezett – viszont a „snd_pcm_avail()” függvény visszatérési értéke 0 volt vagy a második érték kisebb volt, mint a minimum."
 
 #: ../src/modules/alsa/alsa-source.c:506
 #: ../src/modules/alsa/alsa-source.c:656
@@ -2099,6 +2098,9 @@ msgid ""
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
 "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
 msgstr ""
+"Az ALSA modul értesítése nyomán új adatokat kellett volna olvasni az eszközről, de jelenleg semmilyen olvasandó adat nincsen.\n"
+"Ez egy hiba lehet a(z) „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé.\n"
+"Az értesítés a POLLIN jelzésen keresztül érkezett – viszont a „snd_pcm_avail()” függvény visszatérési értéke 0 volt vagy a második érték kisebb volt, mint a minimum."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2228

commit f1436b88931e85087a16fcaefb28424512f15743
Author: kami911 <kami911 at fedoraproject.org>
Date:   Sat Oct 17 10:53:38 2009 +0000

    Sending translation for Hungarian

diff --git a/po/hu.po b/po/hu.po
index b34c8ff..bf69bb4 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -169,7 +169,7 @@ msgstr "A démon a következő PID azonosítóval fut: %u"
 #: ../src/daemon/main.c:553
 #, c-format
 msgid "Failed to kill daemon: %s"
-msgstr "A démon forszírozott leállítása nem sikerült: %s"
+msgstr "A démon kilövése nem sikerült: %s"
 
 #: ../src/daemon/main.c:571
 msgid "This program is not intended to be run as root (unless --system is specified)."
@@ -912,7 +912,7 @@ msgstr "A kapcsolat megszakadt."
 
 #: ../src/pulse/error.c:55
 msgid "Entity killed"
-msgstr "Egység forszírozottan leállítva"
+msgstr "Egység kilőve"
 
 #: ../src/pulse/error.c:56
 msgid "Invalid server"
@@ -2049,7 +2049,7 @@ msgstr "Kapcsolódás: %s"
 
 #: ../src/utils/pacmd.c:99
 msgid "Failed to kill PulseAudio daemon."
-msgstr "A PulseAudio démon leállítása nem sikerült."
+msgstr "A PulseAudio démon kilövése nem sikerült."
 
 #: ../src/utils/pacmd.c:107
 msgid "Daemon not responding."

commit df85322ec3eaef957a797fbf53bbc17997ae377b
Author: pmkovar <pmkovar at fedoraproject.org>
Date:   Sat Oct 17 15:16:40 2009 +0000

    Sending translation for Czech

diff --git a/po/cs.po b/po/cs.po
index 3660685..6d6c3a5 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -6,8 +6,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-30 09:44+0000\n"
-"PO-Revision-Date: 2009-09-30 20:33+0200\n"
+"POT-Creation-Date: 2009-10-17 09:51+0000\n"
+"PO-Revision-Date: 2009-10-17 17:08+0200\n"
 "Last-Translator: Petr Kovar <pknbe at volny.cz>\n"
 "Language-Team: Czech <translation-team-cs at lists.sourceforge.net>\n"
 "MIME-Version: 1.0\n"
@@ -1308,7 +1308,8 @@ msgstr "Získán signál, ukončování."
 msgid "Failed to get latency: %s"
 msgstr "Nezdařilo se získat latenci: %s"
 
-#: ../src/utils/pacat.c:580, c-format
+#: ../src/utils/pacat.c:580
+#, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Čas: %0.3f sekund; latence: %0.0f μs"
 
@@ -1732,7 +1733,7 @@ msgstr ""
 "\tHlasitost: %s%s%s\n"
 "\t        vyvážení %0.2f\n"
 "\tZákladní hlasitost %s%s%s\n"
-"\tZdroj monitoru: %s\n"
+"\tZdroj sledování: %s\n"
 "\tLatence: %0.0f μs, konfigurováno %0.0f μs\n"
 "\tPříznaky: %s%s%s%s%s%s\n"
 "\tVlastnosti:\n"
@@ -1786,7 +1787,7 @@ msgstr ""
 "\tHlasitost: %s%s%s\n"
 "\t        vyvážení %0.2f\n"
 "\tZákladní hlasitost %s%s%s\n"
-"\tMonitor zdroje: %s\n"
+"\tSledování zdroje: %s\n"
 "\tLatence: %0.0f μs, konfigurováno %0.0f μs\n"
 "\tPříznaky: %s%s%s%s%s%s\n"
 "\tVlastnosti:\n"
@@ -2464,11 +2465,13 @@ msgstr "Analogový výstup (LFE)"
 msgid "Analog Mono Output"
 msgstr "Analogový výstup mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981, c-format
+#: ../src/modules/alsa/alsa-mixer.c:1981
+#, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404, c-format
+#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 

commit abdd7b4bcb90ccc6c06d00f5a63ab4dc4bb651c8
Author: perplex <perplex at fedoraproject.org>
Date:   Sun Oct 18 12:20:39 2009 +0000

    Sending translation for Italian

diff --git a/po/it.po b/po/it.po
index 22e0244..c0c70e4 100644
--- a/po/it.po
+++ b/po/it.po
@@ -9,8 +9,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-08-26 21:46+0200\n"
+"POT-Creation-Date: 2009-10-18 05:22+0000\n"
+"PO-Revision-Date: 2009-10-18 11:46+0200\n"
 "Last-Translator: Milo Casagrande <milo at ubuntu.com>\n"
 "Language-Team: Italian <tp at lists.linux.it>\n"
 "MIME-Version: 1.0\n"
@@ -62,11 +62,11 @@ msgstr ""
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr ""
+msgstr "Mantiene sempre almeno un sink caricato anche se è nullo"
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
-msgstr ""
+msgstr "Output dummy"
 
 #: ../src/modules/module-ladspa-sink.c:49
 msgid "Virtual LADSPA sink"
@@ -88,12 +88,11 @@ msgstr ""
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
-msgstr ""
+msgstr "Sink NULL temporizzato"
 
 #: ../src/modules/module-null-sink.c:291
-#, fuzzy
 msgid "Null Output"
-msgstr "Output %s"
+msgstr "Output nullo"
 
 #: ../src/pulsecore/sink.c:2613
 msgid "Internal Audio"
@@ -1139,11 +1138,11 @@ msgstr "Fork del client"
 
 #: ../src/pulse/error.c:68
 msgid "Input/Output error"
-msgstr ""
+msgstr "Errore di input/output"
 
 #: ../src/pulse/error.c:69
 msgid "Device or resource busy"
-msgstr ""
+msgstr "Dispositivo o risorsa occupata"
 
 #: ../src/pulse/sample.c:172
 #, c-format
@@ -1355,9 +1354,9 @@ msgstr "Recupero della latenza non riuscito: %s"
 
 # dubbio: tempo o durata??
 #: ../src/utils/pacat.c:580
-#, fuzzy, c-format
+#, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
-msgstr "Tempo: %0.3f sec; Latenza: %0.0f microsec.  \r"
+msgstr "Tempo: %0.3f sec; Latenza: %0.0f microsec."
 
 #: ../src/utils/pacat.c:599
 #, c-format
@@ -1716,9 +1715,9 @@ msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() non riuscita.\n"
 
 #: ../src/utils/pactl.c:135
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get statistics: %s"
-msgstr "Recupero delle statistiche non riuscito: %s\n"
+msgstr "Recupero delle statistiche non riuscito: %s"
 
 #: ../src/utils/pactl.c:141
 #, c-format
@@ -1738,9 +1737,9 @@ msgid "Sample cache size: %s\n"
 msgstr "Dimensione della cache dei campioni: %s\n"
 
 #: ../src/utils/pactl.c:156
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get server information: %s"
-msgstr "Recupero delle informazioni del server non riuscito: %s\n"
+msgstr "Recupero delle informazioni del server non riuscito: %s"
 
 #: ../src/utils/pactl.c:164
 #, c-format
@@ -1766,9 +1765,9 @@ msgstr ""
 "Cookie: %08x\n"
 
 #: ../src/utils/pactl.c:205
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get sink information: %s"
-msgstr "Recupero delle informazioni del sink non riuscito: %s\n"
+msgstr "Recupero delle informazioni del sink non riuscito: %s"
 
 # nel relativo messaggio per il source
 # c'è "monitor of sink", quindi assumo che
@@ -1823,9 +1822,9 @@ msgid "\tActive Port: %s\n"
 msgstr "\tPorta attiva: %s\n"
 
 #: ../src/utils/pactl.c:297
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get source information: %s"
-msgstr "Recupero delle informazioni della sorgente non riuscito: %s\n"
+msgstr "Recupero delle informazioni della sorgente non riuscito: %s"
 
 #: ../src/utils/pactl.c:313
 #, c-format
@@ -1875,9 +1874,9 @@ msgid "n/a"
 msgstr "N/D"
 
 #: ../src/utils/pactl.c:375
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get module information: %s"
-msgstr "Recupero delle informazioni del modulo non riuscito: %s\n"
+msgstr "Recupero delle informazioni del modulo non riuscito: %s"
 
 #: ../src/utils/pactl.c:393
 #, c-format
@@ -1897,9 +1896,9 @@ msgstr ""
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:412
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get client information: %s"
-msgstr "Recupero delle informazioni del client non riuscito: %s\n"
+msgstr "Recupero delle informazioni del client non riuscito: %s"
 
 #: ../src/utils/pactl.c:430
 #, c-format
@@ -1917,9 +1916,9 @@ msgstr ""
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:447
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get card information: %s"
-msgstr "Recupero delle informazioni della scheda non riuscito: %s\n"
+msgstr "Recupero delle informazioni della scheda non riuscito: %s"
 
 #: ../src/utils/pactl.c:465
 #, c-format
@@ -1953,10 +1952,9 @@ msgstr "\tProfilo attivo: %s\n"
 #
 # from http://pulseaudio.org/wiki/WritingVolumeControlUIs
 #: ../src/utils/pactl.c:496
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get sink input information: %s"
-msgstr ""
-"Recupero delle informazioni dell'ingresso per il sink non riuscito: %s\n"
+msgstr "Recupero delle informazioni dell'ingresso per il sink non riuscito: %s"
 
 #: ../src/utils/pactl.c:515
 #, c-format
@@ -2000,10 +1998,10 @@ msgstr ""
 #
 # from http://pulseaudio.org/wiki/WritingVolumeControlUIs
 #: ../src/utils/pactl.c:554
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get source output information: %s"
 msgstr ""
-"Recupero delle informazioni dell'uscita per la sorgente non riuscito: %s\n"
+"Recupero delle informazioni dell'uscita per la sorgente non riuscito: %s"
 
 #: ../src/utils/pactl.c:574
 #, c-format
@@ -2035,9 +2033,9 @@ msgstr ""
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:605
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get sample information: %s"
-msgstr "Recupero delle informazioni del campione non riuscito: %s\n"
+msgstr "Recupero delle informazioni del campione non riuscito: %s"
 
 # campiona lazy??
 #: ../src/utils/pactl.c:623
@@ -2072,27 +2070,25 @@ msgstr ""
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
-#, fuzzy, c-format
+#, c-format
 msgid "Failure: %s"
-msgstr "Fallimento: %s\n"
+msgstr "Fallimento: %s"
 
 #: ../src/utils/pactl.c:687
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to upload sample: %s"
-msgstr "Caricamento del campione non riuscito: %s\n"
+msgstr "Caricamento del campione non riuscito: %s"
 
 #: ../src/utils/pactl.c:704
-#, fuzzy
 msgid "Premature end of file"
-msgstr "Fine del file prematura\n"
+msgstr "Fine del file prematura"
 
 #: ../src/utils/pactl.c:863
-#, fuzzy
 msgid "Got SIGINT, exiting."
-msgstr "Ricevuto SIGINT, in uscita.\n"
+msgstr "Ricevuto SIGINT, uscita."
 
 #: ../src/utils/pactl.c:869
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2130,15 +2126,21 @@ msgstr ""
 "%s [OPZIONI] upload-sample NOMEFILE [NOME]\n"
 "%s [OPZIONI] play-sample NOME [SINK]\n"
 "%s [OPZIONI] remove-sample NOME\n"
-"%s [OPZIONI] move-sink-input ID SINK\n"
-"%s [OPZIONI] move-source-output ID SORGENTE\n"
+"%s [OPZIONI] move-sink-input SINKINPUT SINK\n"
+"%s [OPZIONI] move-source-output SOURCEOUTPUT SORGENTE\n"
 "%s [OPZIONI] load-module NOME [ARGOMENTI...]\n"
-"%s [OPZIONI] unload-module ID\n"
-"%s [OPZIONI] suspend-sink [SINK] 1|0\n"
-"%s [OPZIONI] suspend-source [SORGENTE] 1|0\n"
-"%s [OPZIONI] set-card-profile [SCHEDA] [PROFILO] \n"
-"%s [OPZIONI] set-sink-port [SINK] [PORTA] \n"
-"%s [OPZIONI] set-source-port [SORGENTE] [PORTA] \n"
+"%s [OPZIONI] unload-module MODULO\n"
+"%s [OPZIONI] suspend-sink SINK 1|0\n"
+"%s [OPZIONI] suspend-source SORGENTE 1|0\n"
+"%s [OPZIONI] set-card-profile SCHEDA PROFILO\n"
+"%s [OPZIONI] set-sink-port SINK PORTA\n"
+"%s [OPZIONI] set-source-port SORGENTE PORTA\n"
+"%s [OPZIONI] set-sink-volume SINK VOLUME\n"
+"%s [OPZIONI] set-source-volume SORGENTE VOLUME\n"
+"%s [OPZIONI] set-sink-input-volume SINKINPUT VOLUME\n"
+"%s [OPZIONI] set-sink-mute SINK 1|0\n"
+"%s [OPZIONI] set-source-mute SORGENTE 1|0\n"
+"%s [OPZIONI] set-sink-input-mute SINKINPUT 1|0\n"
 "\n"
 "  -h, --help                       Mostra questo aiuto\n"
 "      --version                    Mostra la versione\n"
@@ -2158,139 +2160,113 @@ msgstr ""
 "Link eseguito con libpulse %s\n"
 
 #: ../src/utils/pactl.c:979
-#, fuzzy
 msgid "Please specify a sample file to load"
-msgstr "Specificare un file campione da caricare\n"
+msgstr "Specificare un file campione da caricare"
 
 #: ../src/utils/pactl.c:992
-#, fuzzy
 msgid "Failed to open sound file."
-msgstr "Apertura del file audio non riuscita.\n"
+msgstr "Apertura del file audio non riuscita."
 
 #: ../src/utils/pactl.c:1004
-#, fuzzy
 msgid "Warning: Failed to determine sample specification from file."
 msgstr ""
 "Attenzione: determinazione della specifica di campionamento dal file non "
-"riuscita.\n"
+"riuscita."
 
 #: ../src/utils/pactl.c:1014
-#, fuzzy
 msgid "You have to specify a sample name to play"
-msgstr "È necessario specificare un nome di campione da riprodurre\n"
+msgstr "È necessario specificare un nome di campione da riprodurre"
 
 #: ../src/utils/pactl.c:1026
-#, fuzzy
 msgid "You have to specify a sample name to remove"
-msgstr "È necessario specificare un nome di campione da rimuovere\n"
+msgstr "È necessario specificare un nome di campione da rimuovere"
 
 #: ../src/utils/pactl.c:1035
-#, fuzzy
 msgid "You have to specify a sink input index and a sink"
-msgstr "È necessario specificare un indice di ingresso per sink e un sink\n"
+msgstr "È necessario specificare un indice di ingresso per sink e un sink"
 
 #: ../src/utils/pactl.c:1045
-#, fuzzy
 msgid "You have to specify a source output index and a source"
 msgstr ""
-"È necessario specificare una indice di uscita per sorgente e una sorgente\n"
+"È necessario specificare una indice di uscita per sorgente e una sorgente"
 
 #: ../src/utils/pactl.c:1060
-#, fuzzy
 msgid "You have to specify a module name and arguments."
-msgstr "È necessario specificare un nome di modulo e gli argomenti.\n"
+msgstr "È necessario specificare un nome di modulo e gli argomenti."
 
 #: ../src/utils/pactl.c:1080
-#, fuzzy
 msgid "You have to specify a module index"
-msgstr "È necessario specificare un indice di modulo\n"
+msgstr "È necessario specificare un indice di modulo"
 
 #: ../src/utils/pactl.c:1090
-#, fuzzy
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 "Non è possibile specificare più di un sink. È necessario specificare un "
-"valore booleano.\n"
+"valore booleano."
 
 #: ../src/utils/pactl.c:1103
-#, fuzzy
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
 msgstr ""
 "Non è possibile specificare più di una sorgente. È necessario specificare un "
-"valore booleano.\n"
+"valore booleano."
 
 #: ../src/utils/pactl.c:1115
-#, fuzzy
 msgid "You have to specify a card name/index and a profile name"
 msgstr ""
-"È necessario specificare un nome/indice di scheda e un nome di profilo.\n"
+"È necessario specificare un nome/indice di scheda e un nome di profilo."
 
 #: ../src/utils/pactl.c:1126
-#, fuzzy
 msgid "You have to specify a sink name/index and a port name"
-msgstr "È necessario specificare un nome/indice di sink e un nome di porta\n"
+msgstr "È necessario specificare un nome/indice di sink e un nome di porta"
 
 #: ../src/utils/pactl.c:1137
-#, fuzzy
 msgid "You have to specify a source name/index and a port name"
-msgstr ""
-"È necessario specificare un nome/indice di sorgente e un nome di porta\n"
+msgstr "È necessario specificare un nome/indice di sorgente e un nome di porta"
 
 #: ../src/utils/pactl.c:1149
-#, fuzzy
 msgid "You have to specify a sink name/index and a volume"
-msgstr "È necessario specificare un nome/indice di sink e un nome di porta\n"
+msgstr "È necessario specificare un nome/indice di sink e un nome di porta"
 
 #: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
 #: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
 #: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
-#, fuzzy
 msgid "Invalid volume specification"
-msgstr "Specifica di campionamento non valida"
+msgstr "Specifica di volume non valida"
 
 #: ../src/utils/pactl.c:1166
-#, fuzzy
 msgid "You have to specify a source name/index and a volume"
-msgstr ""
-"È necessario specificare un nome/indice di sorgente e un nome di porta\n"
+msgstr "È necessario specificare un nome/indice di sorgente e un nome di porta"
 
 #: ../src/utils/pactl.c:1183
-#, fuzzy
 msgid "You have to specify a sink input index and a volume"
-msgstr "È necessario specificare un indice di ingresso per sink e un sink\n"
+msgstr "È necessario specificare un indice di ingresso per sink e un sink"
 
 #: ../src/utils/pactl.c:1188
 msgid "Invalid sink input index"
-msgstr ""
+msgstr "Indice dell'input del sink non valido"
 
 #: ../src/utils/pactl.c:1204
-#, fuzzy
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr "È necessario specificare un nome/indice di sink e un nome di porta\n"
+msgstr "È necessario specificare un nome/indice di sink e un nome di porta"
 
 #: ../src/utils/pactl.c:1221
-#, fuzzy
 msgid "You have to specify a source name/index and a mute boolean"
-msgstr ""
-"È necessario specificare un nome/indice di sorgente e un nome di porta\n"
+msgstr "È necessario specificare un nome/indice di sorgente e un nome di porta"
 
 #: ../src/utils/pactl.c:1238
-#, fuzzy
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr "È necessario specificare un indice di ingresso per sink e un sink\n"
+msgstr "È necessario specificare un indice di ingresso per sink e un sink"
 
 #: ../src/utils/pactl.c:1243
-#, fuzzy
 msgid "Invalid sink input index specification"
-msgstr "Specifica di campionamento non valida"
+msgstr "Specifica dell'indice di input del sink non valida"
 
 #: ../src/utils/pactl.c:1262
-#, fuzzy
 msgid "No valid command specified."
-msgstr "Nessun comando valido specificato.\n"
+msgstr "Nessun comando valido specificato."
 
 #: ../src/utils/pax11publish.c:61
 #, c-format
@@ -2475,133 +2451,122 @@ msgstr "Server sonoro PulseAudio"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "Dispositivi di uscita"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
-#, fuzzy
 msgid "Input Devices"
-msgstr "Input %s"
+msgstr "Dispositivi di ingresso"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "Audio su @HOSTNAME@"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
-#, fuzzy
 msgid "Input"
-msgstr "Input %s"
+msgstr "Ingresso"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "Ingresso docking station"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "Microfono docking station"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "Line-In"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "Microfono"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "Microfono esterno"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "Audio interno"
+msgstr "Microfono interno"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "Radio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "Video"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "Controllo automatico del guadagno"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "Nessun controllo automatico del guadagno"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "Boost"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "Nessun boost"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "Amplificatore"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "Nessun amplificatore"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
-#, fuzzy
 msgid "Analog Input"
-msgstr "Mono analogico"
+msgstr "Ingresso analogico"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
-#, fuzzy
 msgid "Analog Microphone"
-msgstr "Mono analogico"
+msgstr "Microfono analogico"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
-#, fuzzy
 msgid "Analog Line-In"
-msgstr "Mono analogico"
+msgstr "Line-in analogico"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
-#, fuzzy
 msgid "Analog Radio"
-msgstr "Mono analogico"
+msgstr "Radio analogica"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
-#, fuzzy
 msgid "Analog Video"
-msgstr "Stereo analogico"
+msgstr "Video analogico"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "Output %s"
+msgstr "Uscita analogica"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
-#, fuzzy
 msgid "Analog Headphones"
-msgstr "Mono analogico"
+msgstr "Cuffie analogiche"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "Uscita analogica (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
-#, fuzzy
 msgid "Analog Mono Output"
-msgstr "Mono analogico"
+msgstr "Uscita mono analogica"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
@@ -2612,19 +2577,16 @@ msgid "Analog Stereo"
 msgstr "Stereo analogico"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "Surround analogico 4.1"
+msgstr "Surround analogico 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "Surround analogico 4.0"
+msgstr "Surround analogico 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "Surround analogico 4.1"
+msgstr "Surround analogico 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Surround 4.0"
@@ -2643,19 +2605,16 @@ msgid "Analog Surround 5.1"
 msgstr "Surround analogico 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "Surround analogico 4.0"
+msgstr "Surround analogico 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "Surround analogico 4.1"
+msgstr "Surround analogico 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "Surround analogico 4.0"
+msgstr "Surround analogico 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 7.1"
@@ -2666,9 +2625,8 @@ msgid "Digital Stereo (IEC958)"
 msgstr "Stereo digitale (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
-#, fuzzy
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr "Surround digitale 4.0 (IEC958/AC3)"
+msgstr "Surround digitale 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
@@ -2683,235 +2641,13 @@ msgid "Digital Stereo (HDMI)"
 msgstr "Stereo digitale (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
-#, fuzzy
 msgid "Analog Mono Duplex"
-msgstr "Mono analogico"
+msgstr "Duplex mono analogico"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
-#, fuzzy
 msgid "Analog Stereo Duplex"
-msgstr "Stereo analogico"
+msgstr "Duplex stereo analogico"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
-#, fuzzy
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr "Stereo digitale (IEC958)"
-
-#~ msgid "Invalid client name '%s'\n"
-#~ msgstr "Nome del client \"%s\" non valido\n"
-
-#~ msgid "Failed to determine sample specification from file.\n"
-#~ msgstr ""
-#~ "Determinazione della specifica di campionamento dal file non riuscita.\n"
-
-#~ msgid "select(): %s"
-#~ msgstr "select(): %s"
-
-#~ msgid "Cannot connect to system bus: %s"
-#~ msgstr "Impossibile effettuare la connessione al bus di sistema: %s"
-
-#~ msgid "Cannot get caller from PID: %s"
-#~ msgstr "Impossibile ottenere il chiamante dal PID: %s"
-
-#~ msgid "Cannot set UID on caller object."
-#~ msgstr "Impossibile impostare l'UID sull'oggetto chiamante."
-
-#~ msgid "Failed to get CK session."
-#~ msgstr "Recupero della sessione CK non riuscito."
-
-#~ msgid "Cannot set UID on session object."
-#~ msgstr "Impossibile impostare l'UID sull'oggetto sessione."
-
-#~ msgid "Cannot allocate PolKitAction."
-#~ msgstr "Impossibile allocare PolKitAction."
-
-#~ msgid "Cannot set action_id"
-#~ msgstr "Impossibile impostare action_id"
-
-#~ msgid "Cannot allocate PolKitContext."
-#~ msgstr "Impossibile allocare PolKitContext."
-
-#~ msgid "Cannot initialize PolKitContext: %s"
-#~ msgstr "Impossibile inizializzare PolKitContext: %s"
-
-#~ msgid "Could not determine whether caller is authorized: %s"
-#~ msgstr "Impossibile determinare se il chiamante è autorizzato: %s"
-
-#~ msgid "Cannot obtain auth: %s"
-#~ msgstr "Impossibile ottenere l'autorizzazione: %s"
-
-#~ msgid "PolicyKit responded with '%s'"
-#~ msgstr "PolicyKit ha risposto con \"%s\""
-
-#~ msgid ""
-#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio "
-#~ "daemon"
-#~ msgstr ""
-#~ "Scheduling high-priority (valori negativi di \"nice\") per il demone "
-#~ "PulseAudio"
-
-#~ msgid "Real-time scheduling for the PulseAudio daemon"
-#~ msgstr "Scheduling realt-time per il demone PulseAudio"
-
-#~ msgid ""
-#~ "System policy prevents PulseAudio from acquiring high-priority scheduling."
-#~ msgstr ""
-#~ "La politica di sistema previene PulseAudio dall'ottenere lo scheduling "
-#~ "high-priority."
-
-#~ msgid ""
-#~ "System policy prevents PulseAudio from acquiring real-time scheduling."
-#~ msgstr ""
-#~ "La politica di sistema previene PulseAudio dall'ottenere lo scheduling "
-#~ "real-time."
-
-#~ msgid "read() failed: %s\n"
-#~ msgstr "read() non riuscita: %s\n"
-
-#, fuzzy
-#~ msgid "pa_context_connect() failed: %s\n"
-#~ msgstr "pa_context_connect() non riuscita: %s"
-
-#~ msgid "We're in the group '%s', allowing high-priority scheduling."
-#~ msgstr ""
-#~ "Attualmente nel gruppo \"%s\", che consente scheduling high-priority."
-
-#~ msgid "We're in the group '%s', allowing real-time scheduling."
-#~ msgstr "Attualmente nel gruppo \"%s\", che consente scheduling real-time."
-
-#~ msgid "PolicyKit grants us acquire-high-priority privilege."
-#~ msgstr "Privilegi acquire-high-priority assegnati da PolicyKit."
-
-#~ msgid "PolicyKit refuses acquire-high-priority privilege."
-#~ msgstr "Privilegi acquire-high-priority rifiutati da PolicyKit."
-
-#~ msgid "PolicyKit grants us acquire-real-time privilege."
-#~ msgstr "Privilegi acquire-real-time assegnati da PolicyKit."
-
-#~ msgid "PolicyKit refuses acquire-real-time privilege."
-#~ msgstr "Privilegi acquire-real-time rifiutati da PolicyKit."
-
-#~ 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 '%s', 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 '%s', or increase "
-#~ "the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user."
-#~ msgstr ""
-#~ "Lo SUID root e lo scheduling real-time o high-priority erano richiesti "
-#~ "nella configurazione, ma mancano i privilegi necessari:\n"
-#~ "non si è nel gruppo «%s», PolicyKit non consente di acquisire i privilegi "
-#~ "richiesti e non è possibile incrementare i limiti RLIMIT_NICE/"
-#~ "RLIMIT_RTPRIO della risorsa.\n"
-#~ "Per abilitare lo scheduling real-time/high-priority, acquisire i "
-#~ "privilegi PolicyKit appropriati, diventare un membro di «%s» oppure "
-#~ "incrementare i limiti RLIMIT_NICE/RLIMIT_RTPRIO della risorsa per questo "
-#~ "utente."
-
-#~ msgid ""
-#~ "High-priority scheduling enabled in configuration but not allowed by "
-#~ "policy."
-#~ msgstr ""
-#~ "Scheduling high-priority abilitato nella configurazione, ma non ammesso "
-#~ "dalla politica."
-
-#~ msgid "Successfully increased RLIMIT_RTPRIO"
-#~ msgstr "Incremento di RLIMIT_RTPRIO riuscito"
-
-#~ msgid "RLIMIT_RTPRIO failed: %s"
-#~ msgstr "RLIMIT_RTPRIO non riuscito: %s"
-
-# abbandono??
-#~ msgid "Giving up CAP_NICE"
-#~ msgstr "Abbandono del CAP_NICE"
-
-#~ msgid ""
-#~ "Real-time scheduling enabled in configuration but not allowed by policy."
-#~ msgstr ""
-#~ "Scheduling real-time abilitato nella configurazione, ma non ammesso dalla "
-#~ "politica."
-
-#~ msgid "Limited capabilities successfully to CAP_SYS_NICE."
-#~ msgstr "Limitazione delle capacità a CAP_SYS_NICE riuscita."
-
-#~ msgid "time_new() failed.\n"
-#~ msgstr "time_new() non riuscita.\n"
-
-#~ msgid "Output %s + Input %s"
-#~ msgstr "Output %s + Input %s"
-
-#~ msgid "Stream successfully created\n"
-#~ msgstr "Creazione dello stream riuscita\n"
-
-# fixme!!! errror
-#~ msgid "Stream errror: %s\n"
-#~ msgstr "Errore nello stream: %s\n"
-
-#~ msgid "Connection established.\n"
-#~ msgstr "Connessione stabilita.\n"
-
-#~ msgid ""
-#~ "%s [options] [FILE]\n"
-#~ "\n"
-#~ "  -h, --help                            Show this help\n"
-#~ "      --version                         Show version\n"
-#~ "\n"
-#~ "  -v, --verbose                         Enable verbose operation\n"
-#~ "\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"
-#~ "      --channel-map=CHANNELMAP          Set the channel map to the use\n"
-#~ msgstr ""
-#~ "%s [OPZIONI] [FILE]\n"
-#~ "\n"
-#~ "  -h, --help                            Mostra questo aiuto\n"
-#~ "      --version                         Mostra la versione\n"
-#~ "\n"
-#~ "  -v, --verbose                         Abilita la modalità prolissa\n"
-#~ "\n"
-#~ "  -s, --server=SERVER                   Il nome del server a cui "
-#~ "connettersi\n"
-#~ "  -d, --device=DEVICE                   Il nome del sink a cui "
-#~ "connettersi\n"
-#~ "  -n, --client-name=NOME                Come chiamare questo client sul "
-#~ "server\n"
-#~ "      --stream-name=NOME                Come chiamare questo stream sul "
-#~ "server\n"
-#~ "      --volume=VOLUME                   Specifica il volume iniziale "
-#~ "(lineare) \n"
-#~ "                                         nell'intervallo 0...65536\n"
-#~ "      --channel-map=MAPPA_CANALI        Imposta la mappa di canali da "
-#~ "usare\n"
-
-#~ msgid ""
-#~ "paplay %s\n"
-#~ "Compiled with libpulse %s\n"
-#~ "Linked with libpulse %s\n"
-#~ msgstr ""
-#~ "paplay %s\n"
-#~ "Compilato con libpulse %s\n"
-#~ "Link eseguito con libpulse %s\n"
-
-#~ msgid "Invalid channel map\n"
-#~ msgstr "Mappa dei canali non valida\n"
-
-#~ msgid "Failed to open file '%s'\n"
-#~ msgstr "Apertura del file \"%s\" non riuscita\n"
-
-#~ msgid "Channel map doesn't match file.\n"
-#~ msgstr "La mappa dei canali non corrisponde al file.\n"
-
-#~ msgid "Using sample spec '%s'\n"
-#~ msgstr "In uso la specifica di campionamento \"%s\"\n"
+msgstr "Duplex stereo digitale (IEC958)"

commit eccff7b11bc09d9e5f4b70bb3652ec92f153c867
Author: kami911 <kami911 at fedoraproject.org>
Date:   Thu Oct 22 06:26:23 2009 +0000

    Sending translation for Hungarian

diff --git a/po/hu.po b/po/hu.po
index bf69bb4..50557e1 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -26,6 +26,8 @@ msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
+"A „snd_pcm_avail()” függvény visszatérési értéke váratlanul nagy értékű: %lu bájt (%lu ms).\n"
+"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé."
 
 #: ../src/modules/alsa/alsa-util.c:1147
 #, c-format
@@ -33,6 +35,8 @@ msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
+"A „snd_pcm_delay()” függvény visszatérési értéke váratlanul nagy értékű: %li bájt (%s%lu ms).\n"
+"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé."
 
 #: ../src/modules/alsa/alsa-util.c:1194
 #, c-format
@@ -40,10 +44,12 @@ msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
+"A „snd_pcm_mmap_begin()” függvény visszatérési értéke váratlanul nagy értékű: %lu bájt (%lu ms).\n"
+"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé."
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr ""
+msgstr "Mindig maradjon meg legalább egy nyelőt, még ha az csak az üres nyelő."
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
@@ -55,7 +61,7 @@ msgstr "Látszólagos LADSPA nyelő"
 
 #: ../src/modules/module-ladspa-sink.c:53
 msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
-msgstr ""
+msgstr "sink_name=<nyelő neve> sink_properties=<nyelő tulajdonságai> master=<szűrendő nyelő neve> format=<sample format> rate=<mintavételezési ráta> channels=<csatornák száma> channel_map=<csatornaleképzés> plugin=<ladspa bővítmény neve> label=<ladspa bővítmény címkéje> control=<bemenetszabályzó értékek vesszővel elválasztott listája>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
@@ -146,7 +152,7 @@ msgstr "A rendszergazdai jogosultságok sikeresen visszaadva."
 
 #: ../src/daemon/main.c:279
 msgid "System wide mode unsupported on this platform."
-msgstr "A rendszerszintű üzemmód nem támogatott ezen az operációs rendszeren."
+msgstr "A rendszer üzemmód nem támogatott ezen az operációs rendszeren."
 
 #: ../src/daemon/main.c:297
 #, c-format
@@ -180,26 +186,24 @@ msgid "Root privileges required."
 msgstr "Rendszergazdai jogosultságok szükségesek."
 
 #: ../src/daemon/main.c:578
-#, fuzzy
 msgid "--start not supported for system instances."
-msgstr "A címcsalád a gépnévhez nem támogatott"
+msgstr "--start nem támogatott rendszer üzemmód használata esetén."
 
 #: ../src/daemon/main.c:583
 msgid "Running in system mode, but --disallow-exit not set!"
-msgstr ""
+msgstr "Futtatás rendszer üzemmódban, de a --disallow-exit paraméter nincs beállítva."
 
 #: ../src/daemon/main.c:586
 msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr ""
+msgstr "Futtatás rendszer üzemmódban, de a --disallow-module-loading paraméter nincs beállítva."
 
 #: ../src/daemon/main.c:589
-#, fuzzy
 msgid "Running in system mode, forcibly disabling SHM mode!"
-msgstr "A rendszeróra teszt módban nem kerül beállításra.\n"
+msgstr "Futtatás rendszer üzemmódban, az SHM üzemmód forszírozott letiltása."
 
 #: ../src/daemon/main.c:594
 msgid "Running in system mode, forcibly disabling exit idle time!"
-msgstr ""
+msgstr "Futtatás rendszer üzemmódban, kilépés üresjárati időtúllépés esetén beállítás forszírozott letiltása."
 
 #: ../src/daemon/main.c:621
 msgid "Failed to acquire stdio."
@@ -281,18 +285,16 @@ msgid "Optimized build: no"
 msgstr "Optimalizált összeépítés: Nem"
 
 #: ../src/daemon/main.c:758
-#, fuzzy
 msgid "NDEBUG defined, all asserts disabled."
-msgstr "Már minden elsődleges partíció megadásra került!\n"
+msgstr "NDEBUG megadva, minden lehetőség letiltva."
 
 #: ../src/daemon/main.c:760
 msgid "FASTPATH defined, only fast path asserts disabled."
-msgstr ""
+msgstr "FASTPATH megadva, így csak a gyors útvonalképzés lehetőségei lesznek letiltva."
 
 #: ../src/daemon/main.c:762
-#, fuzzy
 msgid "All asserts enabled."
-msgstr "Adatok indexelése minden engedélyezett modulból"
+msgstr "Minden lehetőség engedélyezve."
 
 #: ../src/daemon/main.c:766
 msgid "Failed to get machine ID"
@@ -334,6 +336,9 @@ msgid ""
 "If you do it nonetheless then it's your own fault if things don't work as expected.\n"
 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."
 msgstr ""
+"A PulseAudio rendszer üzemmódban fut. Általánosságban ezen üzemmód használata nem ajánlott.\n"
+"Ha mindenképpen ilyen üzemmódban kívánja futtatni a PulseAudio rendszert, ne lepődjön meg, ha egyes funkciók esetleg nem az elvárások szerint működnek.\n"
+"További tájékoztatás: http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode amelyből megtudhatja miért nem tanácsos a rendszer üzemmód használata."
 
 #: ../src/daemon/main.c:809
 msgid "pa_pid_file_create() failed."
@@ -341,11 +346,11 @@ msgstr "A „pa_pid_file_create()” függvényhívás meghiúsult: %s"
 
 #: ../src/daemon/main.c:819
 msgid "Fresh high-resolution timers available! Bon appetit!"
-msgstr ""
+msgstr "A nagypontosságú időzítők elérhetőek."
 
 #: ../src/daemon/main.c:821
 msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
-msgstr ""
+msgstr "A nagypontosságú időzítők nem érhetőek el. Napjaink Linux rendszereiben érdemes engedélyezni a nagypontosságú időzítőket."
 
 #: ../src/daemon/main.c:844
 msgid "pa_core_new() failed."
@@ -357,7 +362,7 @@ msgstr "Nem sikerült előkészíteni a démont."
 
 #: ../src/daemon/main.c:909
 msgid "Daemon startup without any loaded modules, refusing to work."
-msgstr ""
+msgstr "A démont noha elindult, de nem töltött be modulokat, így a hangrendszer nem üzemképes."
 
 #: ../src/daemon/main.c:926
 msgid "Daemon startup complete."
@@ -442,7 +447,7 @@ msgstr "--fail paraméter logikai értéket vár el"
 
 #: ../src/daemon/cmdline.c:264
 msgid "--log-level expects log level argument (either numeric in range 0..4 or one of debug, info, notice, warn, error)."
-msgstr ""
+msgstr "--log-level paraméter a naplózás szintjének értékét várja el (Ez lehet a 0..4 számtartomány, vagy a következők egyike: debug, info, notice, warn, error)."
 
 #: ../src/daemon/cmdline.c:276
 msgid "--high-priority expects boolean argument"
@@ -1011,7 +1016,7 @@ msgstr "Nem sikerült megnyitni a(z) „%s” konfigurációs fájlt: %s"
 
 #: ../src/pulse/context.c:550
 msgid "No cookie loaded. Attempting to connect without."
-msgstr ""
+msgstr "Nincs betölthető süti. Kísérlet a kapcsolat felvételére sütik használata nélkül."
 
 #: ../src/pulse/context.c:693
 #, c-format
@@ -1229,6 +1234,42 @@ msgid ""
 "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
+"%s [KAPCSOLÓ]\n"
+"\n"
+"  -h, --help                            Ezen súgó megjelenítése\n"
+"      --version                         Az alkalmazás verziószámának megjelenítése\n"
+"\n"
+"  -r, --record                          Kapcsolat létrehozása felvételhez\n"
+"  -p, --playback                        Kapcsolat létrehozása lejátszáshoz\n"
+"\n"
+"  -v, --verbose                         Történések részletezése\n"
+"\n"
+"  -s, --server=KISZOLGÁLÓ                   Kapcsolódás a megadott KISZOLGÁLÓ kiszolgálóhoz\n"
+"  -d, --device=ESZKÖZ                   Kapcsolódás az ESZKÖZ nevű nyelőhöz vagy forráshoz\n"
+"  -n, --client-name=NÉV                A kliens neve ezen a szerveren\n"
+"      --stream-name=NÉV                Adatfolyam neve a kiszolgálón\n"
+"      --volume=HANGERŐ                   Kezdeti (lineáris) hangerő megadása a következő tartományban: 0...65536\n"
+"      --rate=MINTAVÉTEL                 Mintavételezés érzéke Hz-ben (alapértelmezés: 44100)\n"
+"      --format=MINTAFORMÁTUM             A mintavétel típusa a következőkből: s16le, s16be, u8, float32le,\n"
+"                                        float32be, ulaw, alaw, s32le, s32be, s24le, s24be,\n"
+"                                        s24-32le, s24-32be (alapértelmezés: s16ne)\n"
+"      --channels=CSATORNÁK               Csatornák száma: 1 - mono, 2 - sztereó\n"
+"                                        (defaults to 2)\n"
+"      --channel-map=CSATORNALEKÉPZÉS          Az alapértelmezés helyett használandó csatornaleképzés\n"
+"      --fix-format                      Take the sample format from the sink the stream is\n"
+"                                        being connected to.\n"
+"      --fix-rate                        Take the sampling rate from the sink the stream is\n"
+"                                        being connected to.\n"
+"      --fix-channels                    Take the number of channels and the channel map\n"
+"                                        from the sink the stream is being connected to.\n"
+"      --no-remix                        Don't upmix or downmix channels.\n"
+"      --no-remap                        Map channels by index instead of name.\n"
+"      --latency=BYTES                   Request the specified latency in bytes.\n"
+"      --process-time=BYTES              Request the specified process time per request in bytes.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
+"      --raw                             Nyers PCM adatok felvétele vagy lejátszása.\n"
+"      --file-format=FORMÁTUM             FORMÁTUM alakú PCM adatok felvétele vagy lejátszása.\n"
+"      --list-file-formats               Elérhető fájlformátumok listája.\n"
 
 #: ../src/utils/pacat.c:731
 #, c-format
@@ -1416,6 +1457,11 @@ msgid ""
 "  -s, --server=SERVER                   The name of the server to connect to\n"
 "\n"
 msgstr ""
+"%s [KAPCSOLÓ] ... \n"
+"\n"
+"  -h, --help                            Megjeleníti ezt a súgót\n"
+"      --version                         Az alkalmazás verziószámának megjelenítése\n"
+"\n"
 
 #: ../src/utils/pasuspender.c:248
 #, c-format
@@ -1451,7 +1497,7 @@ msgstr "Nem sikerült a statisztika lekérdezése: %s"
 #: ../src/utils/pactl.c:141
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
-msgstr ""
+msgstr "Jelenleg lefoglalt blokkok száma: %u, amely összesen %s bájtot jelent.\n"
 
 #: ../src/utils/pactl.c:144
 #, c-format
@@ -1843,6 +1889,33 @@ msgid ""
 "  -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"
+"%s [options] exit\n"
+"%s [options] upload-sample FÁJLNÉV [NÉV]\n"
+"%s [options] play-sample NÉV [NYELŐ]\n"
+"%s [options] remove-sample NÉV\n"
+"%s [options] move-sink-input NYELŐBEMENET NYELŐ\n"
+"%s [options] move-source-output FORRÁSKIMENET FORRÁS\n"
+"%s [options] load-module NÉV [PARAMÉTEREK ...]\n"
+"%s [options] unload-module MODUL\n"
+"%s [options] suspend-sink NYELŐ 1|0\n"
+"%s [options] suspend-source FORRÁS 1|0\n"
+"%s [options] set-card-profile KÁRTYA PROFIL\n"
+"%s [options] set-sink-port NYELŐ PORT\n"
+"%s [options] set-source-port FORRÁS PORT\n"
+"%s [options] set-sink-volume NYELŐ HANGERŐ\n"
+"%s [options] set-source-volume FORRÁS HANGERŐ\n"
+"%s [options] set-sink-input-volume NYELŐBEMENET HANGERŐ\n"
+"%s [options] set-sink-mute NYELŐ 1|0\n"
+"%s [options] set-source-mute FORRÁS 1|0\n"
+"%s [options] set-sink-input-mute NYELŐBEMENET 1|0\n"
+"\n"
+"  -h, --help                            Megjeleníti ezt a súgót\n"
+"      --version                         Az alkalmazás verziószámának megjelenítése\n"
+"\n"
+"  -s, --server=KISZOLGÁLÓ                   Kapcsolódás a megadott KISZOLGÁLÓ kiszolgálóhoz\n"
+"  -n, --client-name=NÉV                A kliens neve ezen a szerveren\n"
 
 #: ../src/utils/pactl.c:933
 #, c-format
@@ -2074,9 +2147,8 @@ msgstr "Írás: %s"
 
 #: ../src/pulsecore/lock-autospawn.c:136
 #: ../src/pulsecore/lock-autospawn.c:219
-#, fuzzy
 msgid "Cannot access autospawn lock."
-msgstr "A modul nem képes megfelelően zárolni az adatokat"
+msgstr "Nem érhető zárolás az automatikus indításhoz."
 
 #: ../src/modules/alsa/alsa-sink.c:530
 #: ../src/modules/alsa/alsa-sink.c:689
@@ -2087,7 +2159,7 @@ msgid ""
 "We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
 msgstr ""
 "Az ALSA modul értesítése nyomán új adatokat kellett volna írni az eszközre, de jelenleg semmilyen írandó adat nincsen.\n"
-"Ez egy hiba lehet a(z) „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé.\n"
+"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé.\n"
 "Az értesítés a POLLOUT jelzésen keresztül érkezett – viszont a „snd_pcm_avail()” függvény visszatérési értéke 0 volt vagy a második érték kisebb volt, mint a minimum."
 
 #: ../src/modules/alsa/alsa-source.c:506
@@ -2099,7 +2171,7 @@ msgid ""
 "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
 msgstr ""
 "Az ALSA modul értesítése nyomán új adatokat kellett volna olvasni az eszközről, de jelenleg semmilyen olvasandó adat nincsen.\n"
-"Ez egy hiba lehet a(z) „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé.\n"
+"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé.\n"
 "Az értesítés a POLLIN jelzésen keresztül érkezett – viszont a „snd_pcm_avail()” függvény visszatérési értéke 0 volt vagy a második érték kisebb volt, mint a minimum."
 
 #: ../src/modules/alsa/module-alsa-card.c:152

commit f771b8aa5b0543b5c9c0c2fdf4316a8f8b901422
Author: kami911 <kami911 at fedoraproject.org>
Date:   Thu Oct 22 10:23:52 2009 +0000

    Sending translation for Hungarian

diff --git a/po/hu.po b/po/hu.po
index 50557e1..a6d059e 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -286,15 +286,15 @@ msgstr "Optimalizált összeépítés: Nem"
 
 #: ../src/daemon/main.c:758
 msgid "NDEBUG defined, all asserts disabled."
-msgstr "NDEBUG megadva, minden lehetőség letiltva."
+msgstr "NDEBUG megadva, minden érvényesítés letiltva."
 
 #: ../src/daemon/main.c:760
 msgid "FASTPATH defined, only fast path asserts disabled."
-msgstr "FASTPATH megadva, így csak a gyors útvonalképzés lehetőségei lesznek letiltva."
+msgstr "FASTPATH megadva, így csak a gyors útvonal-érvényesítés lesz letiltva."
 
 #: ../src/daemon/main.c:762
 msgid "All asserts enabled."
-msgstr "Minden lehetőség engedélyezve."
+msgstr "Minden érvényesítés engedélyezve."
 
 #: ../src/daemon/main.c:766
 msgid "Failed to get machine ID"

commit ba19d9ba9d3a8a08ee2a6eb75c946779d5a89033
Author: igor <igor at fedoraproject.org>
Date:   Thu Oct 22 20:19:26 2009 +0000

    Sending translation for Brazilian Portuguese

diff --git a/po/pt_BR.po b/po/pt_BR.po
index 6f44ca5..50dc91c 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-08-24 19:26-0300\n"
+"POT-Creation-Date: 2009-10-22 16:22+0000\n"
+"PO-Revision-Date: 2009-10-22 18:19-0300\n"
 "Last-Translator: Igor Pires Soares <igor at projetofedora.org>\n"
 "Language-Team: Brazilian-Portuguese <fedora-trans-pt_br at redhat.com>\n"
 "MIME-Version: 1.0\n"
@@ -19,7 +19,8 @@ msgstr ""
 "X-Poedit-Language: Portuguese\n"
 "X-Poedit-Country: Brazil\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:858
+#: ../src/pulsecore/sink.c:2629
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
@@ -27,75 +28,53 @@ msgstr "%s %s"
 #: ../src/modules/alsa/alsa-util.c:1106
 #, c-format
 msgid ""
-"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
-"ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
-"O snd_pcm_avail() retornou um valor que é excepcionalmente grande: %lu bytes "
-"(%lu ms).\n"
-"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, "
-"relate esse problema aos desenvolvedores do ALSA."
+"O snd_pcm_avail() retornou um valor que é excepcionalmente grande: %lu bytes (%lu ms).\n"
+"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, relate esse problema aos desenvolvedores do ALSA."
 
 #: ../src/modules/alsa/alsa-util.c:1147
 #, c-format
 msgid ""
-"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
-"lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
-"O snd_pcm_delay() retornou um valor que é excepcionalmente grande: %li bytes "
-"(%s%lu ms).\n"
-"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, "
-"relate esse problema aos desenvolvedores do ALSA."
+"O snd_pcm_delay() retornou um valor que é excepcionalmente grande: %li bytes (%s%lu ms).\n"
+"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, relate esse problema aos desenvolvedores do ALSA."
 
 #: ../src/modules/alsa/alsa-util.c:1194
 #, c-format
 msgid ""
-"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
-"(%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
-"O snd_pcm_mmap_begin() retornou um valor que é excepcionalmente grande: %lu "
-"bytes (%lu ms).\n"
-"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, "
-"relate esse problema aos desenvolvedores do ALSA."
+"O snd_pcm_mmap_begin() retornou um valor que é excepcionalmente grande: %lu bytes (%lu ms).\n"
+"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, relate esse problema aos desenvolvedores do ALSA."
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr ""
+msgstr "Sempre manter pelo menos um destino carregado mesmo se for nulo"
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
-msgstr ""
+msgstr "Saída fictícia"
 
 #: ../src/modules/module-ladspa-sink.c:49
 msgid "Virtual LADSPA sink"
 msgstr "Destino Virtual LADSPA"
 
 #: ../src/modules/module-ladspa-sink.c:53
-msgid ""
-"sink_name=<name for the sink> sink_properties=<properties for the sink> "
-"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
-"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
-"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
-"input control values>"
-msgstr ""
-"sink_name=<nome do destino> sink_properties=<propriedades do destino> "
-"master=<nome do destino a ser filtrado> format=<formato de amostragem> "
-"rate=<taxa da amostragem> channels=<número de canais> channel_map=<mapa dos "
-"canais> plugin=<nome do plugin ladspa> label=<rótulo do plugin ladspa> "
-"control=<lista separada por vírgulas dos valores de controle da entrada>"
+msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
+msgstr "sink_name=<nome do destino> sink_properties=<propriedades do destino> master=<nome do destino a ser filtrado> format=<formato de amostragem> rate=<taxa da amostragem> channels=<número de canais> channel_map=<mapa dos canais> plugin=<nome do plugin ladspa> label=<rótulo do plugin ladspa> control=<lista separada por vírgulas dos valores de controle da entrada>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
-msgstr ""
+msgstr "Destino nulo temporizado"
 
 #: ../src/modules/module-null-sink.c:291
 msgid "Null Output"
-msgstr ""
+msgstr "Saída nula"
 
 #: ../src/pulsecore/sink.c:2613
 msgid "Internal Audio"
@@ -151,7 +130,8 @@ msgstr "O GID do usuário'%s' e do grupo '%s' não combinam."
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "O diretório pessoal do usuário \"%s\" não é \"%s\", ignorando."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:208
+#: ../src/daemon/main.c:213
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Falha ao criar \"%s\": %s"
@@ -203,12 +183,8 @@ msgid "Failed to kill daemon: %s"
 msgstr "Falha em encerrar o daemon: %s"
 
 #: ../src/daemon/main.c:571
-msgid ""
-"This program is not intended to be run as root (unless --system is "
-"specified)."
-msgstr ""
-"Este programa não é para ser executado como root (a não ser que --system "
-"seja especificado)."
+msgid "This program is not intended to be run as root (unless --system is specified)."
+msgstr "Este programa não é para ser executado como root (a não ser que --system seja especificado)."
 
 #: ../src/daemon/main.c:573
 msgid "Root privileges required."
@@ -224,8 +200,7 @@ msgstr "Executando em no modo system, mas --disallow-exit não foi configurado!"
 
 #: ../src/daemon/main.c:586
 msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr ""
-"Executando no modo system, mas --disallow-module-loading não foi configurado!"
+msgstr "Executando no modo system, mas --disallow-module-loading não foi configurado!"
 
 #: ../src/daemon/main.c:589
 msgid "Running in system mode, forcibly disabling SHM mode!"
@@ -233,8 +208,7 @@ msgstr "Executando no modo system, desabilitando forçadamente o modo SHM!"
 
 #: ../src/daemon/main.c:594
 msgid "Running in system mode, forcibly disabling exit idle time!"
-msgstr ""
-"Executando no modo system, desabilitando forçadamente o exit idle time!"
+msgstr "Executando no modo system, desabilitando forçadamente o exit idle time!"
 
 #: ../src/daemon/main.c:621
 msgid "Failed to acquire stdio."
@@ -250,7 +224,8 @@ msgstr "O pipe falhou: %s"
 msgid "fork() failed: %s"
 msgstr "O fork() falhou: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:646
+#: ../src/utils/pacat.c:508
 #, c-format
 msgid "read() failed: %s"
 msgstr "A operação read() falhou: %s"
@@ -320,9 +295,7 @@ msgstr "NDEBUG definido, todas as declarações desabilitadas."
 
 #: ../src/daemon/main.c:760
 msgid "FASTPATH defined, only fast path asserts disabled."
-msgstr ""
-"FASTPATH definido, somente as declarações do \"fast path\" foram "
-"desabilitadas."
+msgstr "FASTPATH definido, somente as declarações do \"fast path\" foram desabilitadas."
 
 #: ../src/daemon/main.c:762
 msgid "All asserts enabled."
@@ -364,19 +337,13 @@ msgstr "Executando em modo do sistema: %s"
 
 #: ../src/daemon/main.c:792
 msgid ""
-"OK, so you are running PA in system mode. Please note that you most likely "
-"shouldn't be doing that.\n"
-"If you do it nonetheless then it's your own fault if things don't work as "
-"expected.\n"
-"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
-"explanation why system mode is usually a bad idea."
+"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."
 msgstr ""
-"OK, então você está executando o PA no modo de sistema. Por favor, note que "
-"é mais provável que você não deveria estar fazendo isso.\n"
-"Todavia, se você o fizer, então a culpa será sua se as coisas não "
-"funcionarem como esperado.\n"
-"Por favor, leia o http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode para "
-"obter um explicação sobre porque o modo de sistema é uma má idéia."
+"OK, então você está executando o PA no modo de sistema. Por favor, note que é mais provável que você não deveria estar fazendo isso.\n"
+"Todavia, se você o fizer, então a culpa será sua se as coisas não funcionarem como esperado.\n"
+"Por favor, leia o http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode para obter um explicação sobre porque o modo de sistema é uma má idéia."
 
 #: ../src/daemon/main.c:809
 msgid "pa_pid_file_create() failed."
@@ -387,12 +354,8 @@ msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Timers de alta resolução frequinhos disponíveis! Bon appetit!"
 
 #: ../src/daemon/main.c:821
-msgid ""
-"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
-"resolution timers enabled!"
-msgstr ""
-"Cara, teu kernel fede! A recomendação do chef hoje é Linux com timers de "
-"alta resolução habilitados!"
+msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
+msgstr "Cara, teu kernel fede! A recomendação do chef hoje é Linux com timers de alta resolução habilitados!"
 
 #: ../src/daemon/main.c:844
 msgid "pa_core_new() failed."
@@ -404,8 +367,7 @@ msgstr "Falha em iniciar o daemon."
 
 #: ../src/daemon/main.c:909
 msgid "Daemon startup without any loaded modules, refusing to work."
-msgstr ""
-"O Daemon iniciou sem qualquer módulo carregado, recusando-se a trabalhar."
+msgstr "O Daemon iniciou sem qualquer módulo carregado, recusando-se a trabalhar."
 
 #: ../src/daemon/main.c:926
 msgid "Daemon startup complete."
@@ -430,48 +392,37 @@ 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"
@@ -482,12 +433,10 @@ 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"
@@ -498,79 +447,56 @@ msgstr ""
 "  -h, --help                            Mostra esta ajuda\n"
 "      --version                        Mostra a versão\n"
 "      --dump-conf                       Descarrega a configuração padrão\n"
-"      --dump-modules                   Descarrega a lista de módulos "
-"disponíveis\n"
-"      --dump-resample-methods           Descarrega os métodos de "
-"reamostragem\n"
-"      --cleanup-shm                     Limpa os segmentos de memória "
-"compartilhados\n"
-"      --start                           Inicia o daemon se ele não estiver "
-"em execução\n"
+"      --dump-modules                   Descarrega a lista de módulos disponíveis\n"
+"      --dump-resample-methods           Descarrega os métodos de reamostragem\n"
+"      --cleanup-shm                     Limpa os segmentos de memória compartilhados\n"
+"      --start                           Inicia o daemon se ele não estiver em execução\n"
 "  -k  --kill                            Encerra um daemon em execução\n"
-"      --check                           Verifica se há um daemon em execução "
-"(somente retorna o código de saída)\n"
+"      --check                           Verifica se há um daemon em execução (somente retorna o código de saída)\n"
 "\n"
 "OPÇÕES:\n"
-"      --system[=BOOL]                   Executa como uma instância do "
-"sistema em escala ampla\n"
+"      --system[=BOOL]                   Executa como uma instância do sistema em escala ampla\n"
 "  -D, --daemonize[=BOOL]                Torna-se um daemom após o início\n"
 "      --fail[=BOOL]                     Sai quando a partida falha\n"
 "      --high-priority[=BOOL]            Tenta definir um nível alto de nice\n"
 "                                        (disponível apenas, quando SUID ou\n"
 "                                        com RLIMIT_NICE) elevado\n"
-"      --realtime[=BOOL]                 Tenta habilitar o escalonamento em "
-"tempo real\n"
-"                                        (disponível apenas como root, quando "
-"SUID ou\n"
+"      --realtime[=BOOL]                 Tenta habilitar o escalonamento em tempo real\n"
+"                                        (disponível apenas como root, quando SUID ou\n"
 "                                        com  RLIMIT_RTPRIO) elevado\n"
-"      --disallow-module-loading[=BOOL]  Não permite carga/descarga de módulo "
-"requerido pelo usuário\n"
+"      --disallow-module-loading[=BOOL]  Não permite carga/descarga de módulo requerido pelo usuário\n"
 "                                        depois da partida\n"
-"      --disallow-exit[=BOOL]            Não permite saída requisitada pelo "
-"usuário\n"
-"      --exit-idle-time=SECS             Termina um daemon quando ocioso e "
-"este\n"
+"      --disallow-exit[=BOOL]            Não permite saída requisitada pelo usuário\n"
+"      --exit-idle-time=SECS             Termina um daemon quando ocioso e este\n"
 "                                        tempo foi decorrido\n"
-"      --module-idle-time=SECS           Descarrega os módulos "
-"autocarregáveis quando ociosos e\n"
+"      --module-idle-time=SECS           Descarrega os módulos autocarregáveis quando ociosos e\n"
 "                                        este tempo foi decorrido\n"
-"      --scache-idle-time=SECS           Descarrega amostras quando ociosas "
-"e\n"
+"      --scache-idle-time=SECS           Descarrega amostras quando ociosas e\n"
 "                                        este tempo foi decorrido\n"
-"      --log-level[=LEVEL]               Aumenta ou define o grau de "
-"detalhamento\n"
+"      --log-level[=LEVEL]               Aumenta ou define o grau de detalhamento\n"
 "  -v                                    Aumenta o nível de detalhamento\n"
 "      --log-target={auto,syslog,stderr} Especifica o destino do log\n"
-"      --log-meta[=BOOL]                 Inclui a localização do código na "
-"mensagem de log\n"
-"      --log-time[=BOOL]                 Inclui carimbos de hora nas "
-"mensagens de log\n"
-"      --log-backtrace=FRAMES            Inclui um backtrace na mensagem de "
-"log\n"
-"  -p, --dl-search-path=PATH             Define o caminho de pesquisa para "
-"objetos (plugins)\n"
+"      --log-meta[=BOOL]                 Inclui a localização do código na mensagem de log\n"
+"      --log-time[=BOOL]                 Inclui carimbos de hora nas mensagens de log\n"
+"      --log-backtrace=FRAMES            Inclui um backtrace na mensagem de log\n"
+"  -p, --dl-search-path=PATH             Define o caminho de pesquisa para objetos (plugins)\n"
 "                                            dinamicamente compartilhados\n"
-"      --resample-method=METHOD         Usa o método de reamostragem "
-"especificado\n"
+"      --resample-method=METHOD         Usa o método de reamostragem especificado\n"
 "                                        (Veja --dump-resample-methods para\n"
 "                                        valores possíveis)\n"
 "      --use-pid-file[=BOOL]             Cria um arquivo PID\n"
-"      --no-cpu-limit[=BOOL]            Não instala um limitador de carga de "
-"CPU em\n"
+"      --no-cpu-limit[=BOOL]            Não instala um limitador de carga de CPU em\n"
 "                                        plataformas que o suportem.\n"
-"      --disable-shm[=BOOL]              Desabilita o suporte à memória "
-"compartilhada.\n"
+"      --disable-shm[=BOOL]              Desabilita o suporte à memória compartilhada.\n"
 "\n"
 "SCRIPT DE INÍCIO:\n"
 "  -L, --load=\"ARGUMENTOS DO MÓDULO\"    Carrega um plugin especificado com\n"
 "                                        o argumento especificado\n"
 "  -F, --file=NOME_DO_ARQUIVO          Executa o script especificado\n"
-"  -C                                    Abre uma linha de comando no TTY em "
-"execução\n"
+"  -C                                    Abre uma linha de comando no TTY em execução\n"
 "                                       depois da partida\n"
 "\n"
-"  -n                                    Não carrega o arquivo de script "
-"padrão\n"
+"  -n                                    Não carrega o arquivo de script padrão\n"
 
 #: ../src/daemon/cmdline.c:247
 msgid "--daemonize expects boolean argument"
@@ -581,12 +507,8 @@ msgid "--fail expects boolean argument"
 msgstr "--fail espera argumento booleano"
 
 #: ../src/daemon/cmdline.c:264
-msgid ""
-"--log-level expects log level argument (either numeric in range 0..4 or one "
-"of debug, info, notice, warn, error)."
-msgstr ""
-"--log-level espera um argumento em nível de log  (seja numérico na faixa de "
-"0..4 seja algum entre 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 espera um argumento em nível de log  (seja numérico na faixa de 0..4 seja algum entre debug, info, notice, warn, error)."
 
 #: ../src/daemon/cmdline.c:276
 msgid "--high-priority expects boolean argument"
@@ -748,12 +670,8 @@ msgid "Failed to open configuration file: %s"
 msgstr "Falha em abrir o arquivo de configuração: %s"
 
 #: ../src/daemon/daemon-conf.c:562
-msgid ""
-"The specified default channel map has a different number of channels than "
-"the specified default number of channels."
-msgstr ""
-"O mapa padrão dos canais especificado tem um número diferente de canais do "
-"que o número de canais padrão especificado."
+msgid "The specified default channel map has a different number of channels than the specified default number of channels."
+msgstr "O mapa padrão dos canais especificado tem um número diferente de canais do que o número de canais padrão especificado."
 
 #: ../src/daemon/daemon-conf.c:638
 #, c-format
@@ -772,7 +690,8 @@ msgstr "Sistema de som PulseAudio"
 msgid "Start the PulseAudio Sound System"
 msgstr "Iniciar o sistema de som PulseAudio"
 
-#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757
+#: ../src/pulse/channelmap.c:105
+#: ../src/pulse/channelmap.c:757
 msgid "Mono"
 msgstr "Mono"
 
@@ -976,9 +895,12 @@ msgstr "Posterior Superior Esquerdo"
 msgid "Top Rear Right"
 msgstr "Posterior Superior Direito"
 
-#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170
-#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321
-#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371
+#: ../src/pulse/channelmap.c:484
+#: ../src/pulse/sample.c:170
+#: ../src/pulse/volume.c:295
+#: ../src/pulse/volume.c:321
+#: ../src/pulse/volume.c:341
+#: ../src/pulse/volume.c:371
 msgid "(invalid)"
 msgstr "(Inválido)"
 
@@ -1108,11 +1030,11 @@ msgstr "Cliente bifurcado"
 
 #: ../src/pulse/error.c:68
 msgid "Input/Output error"
-msgstr ""
+msgstr "Erro de entrada/saída"
 
 #: ../src/pulse/error.c:69
 msgid "Device or resource busy"
-msgstr ""
+msgstr "Dispositivo ou recurso ocupado"
 
 #: ../src/pulse/sample.c:172
 #, c-format
@@ -1139,7 +1061,8 @@ msgstr "%0.1f KiB"
 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() falhou"
 
@@ -1199,7 +1122,8 @@ msgstr "pa_stream_write() falhou: %s"
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() falhou: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:237
+#: ../src/utils/pacat.c:267
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() falhou: %s"
@@ -1297,7 +1221,8 @@ msgstr "pa_stream_connect_playback() falhou: %s"
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() falhou: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:470
+#: ../src/utils/pactl.c:857
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Falha na conexão: %s"
@@ -1343,48 +1268,29 @@ 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, "
-"s24le, s24be,\n"
-"                                        s24-32le, s24-32be (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, s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, 2 for stereo\n"
 "                                        (defaults to 2)\n"
-"      --channel-map=CHANNELMAP          Channel map to use instead of the "
-"default\n"
-"      --fix-format                      Take the sample format from the sink "
-"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"
-"      --property=PROPERTY=VALUE         Set the specified property to the "
-"specified value.\n"
+"      --no-remap                        Map channels by index instead of name.\n"
+"      --latency=BYTES                   Request the specified latency in bytes.\n"
+"      --process-time=BYTES              Request the specified process time per request in bytes.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
 "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
@@ -1397,56 +1303,34 @@ msgstr ""
 "  -r, --record                          Cria uma conexão para gravação\n"
 "  -p, --playback                        Cria uma conexão para reprodução\n"
 "\n"
-"  -v, --verbose                         Habilita operações no modo "
-"detalhado\n"
+"  -v, --verbose                         Habilita operações no modo detalhado\n"
 "\n"
 "  -s, --server=SERVIDOR                   Nome do servidor a conectar-se\n"
-"  -d, --device=DISPOSITIVO                   O nome do destino/fonte a "
-"conectar-se\n"
-"  -n, --client-name=NOME                Como chamar este cliente no "
-"servidor\n"
+"  -d, --device=DISPOSITIVO                   O nome do destino/fonte a conectar-se\n"
+"  -n, --client-name=NOME                Como chamar este cliente no servidor\n"
 "      --stream-name=NOME               Como chamar este fluxo no servidor\n"
-"      --volume=VOLUME                   Especifica a faixa (linear) inicial "
-"de volume no intervalo 0...65536\n"
-"      --rate=TAXA_DE_AMOSTRAGEM             Taxa de amostragem em Hz (o "
-"padrão é 44100)\n"
-"      --format=FORMATO_DE_AMOSTRAGEM       Tipo de amostragem, um de s16le, "
-"s16be, u8, float32le,\n"
-"                                        float32be, ulaw, alaw, s32le, s32be, "
-"s24le, s24be,\n"
-"                                        s24-32le, s24-32be (o padrão é "
-"s16ne)\n"
-"      --channels=CANAIS               O número de canais, 1 para mono, 2 "
-"para estéreo\n"
+"      --volume=VOLUME                   Especifica a faixa (linear) inicial de volume no intervalo 0...65536\n"
+"      --rate=TAXA_DE_AMOSTRAGEM             Taxa de amostragem em Hz (o padrão é 44100)\n"
+"      --format=FORMATO_DE_AMOSTRAGEM       Tipo de amostragem, um de s16le, s16be, u8, float32le,\n"
+"                                        float32be, ulaw, alaw, s32le, s32be, s24le, s24be,\n"
+"                                        s24-32le, s24-32be (o padrão é s16ne)\n"
+"      --channels=CANAIS               O número de canais, 1 para mono, 2 para estéreo\n"
 "                                        (o padrão é 2)\n"
-"      --channel-map=MAPA_DE_CANAIS          Mapeamento de canais a ser usado "
-"no lugar do padrão\n"
-"      --fix-format                      Obtém o formato da amostragem do "
-"destino onde o fluxo\n"
+"      --channel-map=MAPA_DE_CANAIS          Mapeamento de canais a ser usado no lugar do padrão\n"
+"      --fix-format                      Obtém o formato da amostragem do destino onde o fluxo\n"
 "                                             está sendo conectado.\n"
-"      --fix-rate                        Obtém a taxa de amostragem do "
-"destino onde o fluxo está\n"
+"      --fix-rate                        Obtém a taxa de amostragem do destino onde o fluxo está\n"
 "                                        sendo conectado.\n"
-"      --fix-channels                    Obtém o número de canais e o mapa de "
-"canais\n"
-"                                      do destino onde o fluxo está sendo "
-"conectado.\n"
-"      --no-remix                        Não realizar upmix nem downmix dos "
-"canais.\n"
-"      --no-remap                        Mapear os canais por índice em vez "
-"de nome.\n"
-"      --latency=BYTES                   Requisitar a latência especificada "
-"em bytes.\n"
-"      --process-time=BYTES              Requisitar o tempo de processo "
-"especificado por requisições em bytes.\n"
-"      --property=PROPRIEDADE=VALOR         Define a propriedade especificada "
-"para o valor especificado.\n"
-"      --raw                             Grava/reproduz dados PCM não "
-"tratados.\n"
-"      --file-format=FORMATO_DO_ARQ.             Grava/reproduz dados PCM "
-"formatados.\n"
-"      --list-file-formats               Lista os formatos de arquivo "
-"disponíveis.\n"
+"      --fix-channels                    Obtém o número de canais e o mapa de canais\n"
+"                                      do destino onde o fluxo está sendo conectado.\n"
+"      --no-remix                        Não realizar upmix nem downmix dos canais.\n"
+"      --no-remap                        Mapear os canais por índice em vez de nome.\n"
+"      --latency=BYTES                   Requisitar a latência especificada em bytes.\n"
+"      --process-time=BYTES              Requisitar o tempo de processo especificado por requisições em bytes.\n"
+"      --property=PROPRIEDADE=VALOR         Define a propriedade especificada para o valor especificado.\n"
+"      --raw                             Grava/reproduz dados PCM não tratados.\n"
+"      --file-format=FORMATO_DO_ARQ.             Grava/reproduz dados PCM formatados.\n"
+"      --list-file-formats               Lista os formatos de arquivo disponíveis.\n"
 
 #: ../src/utils/pacat.c:731
 #, c-format
@@ -1459,7 +1343,8 @@ msgstr ""
 "Compilado com  libpulse %s\n"
 "Linkado com libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:764
+#: ../src/utils/pactl.c:953
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Nome do cliente \"%s\" inválido"
@@ -1521,14 +1406,11 @@ msgid "Failed to open audio file."
 msgstr "Falha ao abrir o arquivo de áudio."
 
 #: ../src/utils/pacat.c:959
-msgid ""
-"Warning: specified sample specification will be overwritten with "
-"specification from file."
-msgstr ""
-"Aviso: a especificação de amostragem especificada será sobrescrita pela "
-"especificação do arquivo."
+msgid "Warning: specified sample specification will be overwritten with specification from file."
+msgstr "Aviso: a especificação de amostragem especificada será sobrescrita pela especificação do arquivo."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:962
+#: ../src/utils/pactl.c:997
 msgid "Failed to determine sample specification from file."
 msgstr "Falha ao determinar a especificação de amostragem a partir do arquivo."
 
@@ -1546,11 +1428,8 @@ msgstr "Aviso: falha ao gravar o mapa de canais no arquivo."
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr ""
-"Abrindo um fluxo %s com a especificação de amostragem \"%s\" e mapeamento de "
-"canais \"%s\"."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr "Abrindo um fluxo %s com a especificação de amostragem \"%s\" e mapeamento de canais \"%s\"."
 
 #: ../src/utils/pacat.c:1009
 msgid "recording"
@@ -1560,7 +1439,8 @@ msgstr "gravando"
 msgid "playback"
 msgstr "playback"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1035
+#: ../src/utils/pactl.c:1267
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() falhou."
 
@@ -1568,11 +1448,13 @@ msgstr "pa_mainloop_new() falhou."
 msgid "io_new() failed."
 msgstr "io_new() falhou."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1061
+#: ../src/utils/pactl.c:1279
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() falhou."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1069
+#: ../src/utils/pactl.c:1285
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_new() falhou: %s"
@@ -1581,7 +1463,8 @@ msgstr "pa_context_new() falhou: %s"
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() falhou."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1082
+#: ../src/utils/pactl.c:1290
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() falhou."
 
@@ -1608,9 +1491,7 @@ msgstr "Falha ao prosseguir: %s\n"
 #: ../src/utils/pasuspender.c:147
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
-msgstr ""
-"AVISO: O servidor de som não é local, Sound server is not local, não está em "
-"suspenso.\n"
+msgstr "AVISO: O servidor de som não é local, Sound server is not local, não está em suspenso.\n"
 
 #: ../src/utils/pasuspender.c:159
 #, c-format
@@ -1634,8 +1515,7 @@ 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"
@@ -1763,12 +1643,14 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:268
+#: ../src/utils/pactl.c:360
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tPortas:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:274
+#: ../src/utils/pactl.c:366
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tPorta ativa: %s\n"
@@ -1817,10 +1699,18 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
+#: ../src/utils/pactl.c:345
+#: ../src/utils/pactl.c:401
+#: ../src/utils/pactl.c:436
+#: ../src/utils/pactl.c:473
+#: ../src/utils/pactl.c:532
+#: ../src/utils/pactl.c:533
+#: ../src/utils/pactl.c:543
+#: ../src/utils/pactl.c:587
+#: ../src/utils/pactl.c:588
+#: ../src/utils/pactl.c:594
+#: ../src/utils/pactl.c:637
+#: ../src/utils/pactl.c:638
 #: ../src/utils/pactl.c:645
 msgid "n/a"
 msgstr "n/a"
@@ -2011,7 +1901,8 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:653
+#: ../src/utils/pactl.c:663
 #, fuzzy, c-format
 msgid "Failure: %s"
 msgstr "Falha: %s\n"
@@ -2059,10 +1950,8 @@ 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 [opções] stat\n"
 "%s [opções] list\n"
@@ -2084,8 +1973,7 @@ msgstr ""
 "      --version                        Mostra a versão\n"
 "\n"
 "  -s, --server=SERVER                   O nome do servidor a ser conectado\n"
-"  -n, --client-name=NAME                Como chamar este cliente no "
-"servidor \n"
+"  -n, --client-name=NAME                Como chamar este cliente no servidor \n"
 
 #: ../src/utils/pactl.c:933
 #, c-format
@@ -2111,9 +1999,7 @@ msgstr "Falha em abrir o arquivo de som.\n"
 #: ../src/utils/pactl.c:1004
 #, fuzzy
 msgid "Warning: Failed to determine sample specification from file."
-msgstr ""
-"Aviso: falha ao determinar a especificação da amostragem a partir do "
-"arquivo.\n"
+msgstr "Aviso: falha ao determinar a especificação da amostragem a partir do arquivo.\n"
 
 #: ../src/utils/pactl.c:1014
 #, fuzzy
@@ -2147,20 +2033,13 @@ msgstr "Você deve especificar um índice de um módulo\n"
 
 #: ../src/utils/pactl.c:1090
 #, fuzzy
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
-msgstr ""
-"Você não pode especificar mais de um destino. Você tem que especificar um "
-"valor booleano.\n"
+msgid "You may not specify more than one sink. You have to specify a boolean value."
+msgstr "Você não pode especificar mais de um destino. Você tem que especificar um valor booleano.\n"
 
 #: ../src/utils/pactl.c:1103
 #, fuzzy
-msgid ""
-"You may not specify more than one source. You have to specify a boolean "
-"value."
-msgstr ""
-"Você não pode especificar mais de uma fonte. Você tem que especificar um "
-"valor booleano.\n"
+msgid "You may not specify more than one source. You have to specify a boolean value."
+msgstr "Você não pode especificar mais de uma fonte. Você tem que especificar um valor booleano.\n"
 
 #: ../src/utils/pactl.c:1115
 #, fuzzy
@@ -2182,9 +2061,12 @@ msgstr "Você tem que especificar um nome/índice da fonte e o nome da porta\n"
 msgid "You have to specify a sink name/index and a volume"
 msgstr "Você tem que especificar um nome/índice do destino e o nome da porta\n"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1154
+#: ../src/utils/pactl.c:1171
+#: ../src/utils/pactl.c:1193
+#: ../src/utils/pactl.c:1209
+#: ../src/utils/pactl.c:1226
+#: ../src/utils/pactl.c:1248
 #, fuzzy
 msgid "Invalid volume specification"
 msgstr "Especificação de amostragem inválida"
@@ -2201,7 +2083,7 @@ msgstr "Você tem que especificar a entrada para o destino e um destino\n"
 
 #: ../src/utils/pactl.c:1188
 msgid "Invalid sink input index"
-msgstr ""
+msgstr "Índice de entrada de destino inválido"
 
 #: ../src/utils/pactl.c:1204
 #, fuzzy
@@ -2235,17 +2117,14 @@ 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    Mostra os dados atuais do PulseAudio associados ao display X11 "
-"(padrão)\n"
+" -d    Mostra os dados atuais do PulseAudio associados ao display X11 (padrão)\n"
 " -e    Exporta os dados locais do PulseAudio para um display X11 \n"
-" -i     Importa os dados do PulseAudio de um display X11 para as variáveis "
-"de ambiente locais e para o arquivo de cookie.\n"
+" -i     Importa os dados do PulseAudio de um display X11 para as variáveis de ambiente locais e para o arquivo de cookie.\n"
 " -r    Remove os dados do PulseAudio do display X11\n"
 
 #: ../src/utils/pax11publish.c:94
@@ -2310,9 +2189,7 @@ msgstr "Ainda não implementado.\n"
 
 #: ../src/utils/pacmd.c:69
 msgid "No PulseAudio daemon running, or not running as session daemon."
-msgstr ""
-"Nenhum daemon do PulseAudio em execução ou não está em execução como daemon "
-"de sessão."
+msgstr "Nenhum daemon do PulseAudio em execução ou não está em execução como daemon de sessão."
 
 #: ../src/utils/pacmd.c:74
 #, c-format
@@ -2337,53 +2214,46 @@ msgstr "O daemon não responde."
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:171
+#: ../src/utils/pacmd.c:188
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:207
+#: ../src/utils/pacmd.c:223
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:136
+#: ../src/pulsecore/lock-autospawn.c:219
 msgid "Cannot access autospawn lock."
 msgstr "Não foi possível acessar a trava de autogeração."
 
-#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
+#: ../src/modules/alsa/alsa-sink.c:530
+#: ../src/modules/alsa/alsa-sink.c:689
 #, c-format
 msgid ""
-"ALSA woke us up to write new data to the device, but there was actually "
-"nothing to write!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers.\n"
-"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
-"returned 0 or another value < min_avail."
+"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
 msgstr ""
-"O ALSA nos acordou para gravar novos dados no dispositivo, mas não há nada a "
-"ser gravado!\n"
-"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, "
-"relate esse problema para os desenvolvedores do ALSA.\n"
-"Nós fomos acordados com o conjunto POLLOUT -- entretanto, a snd_pcm_avail() "
-"subseqüente retornou 0 ou outro valor < min_avail."
+"O ALSA nos acordou para gravar novos dados no dispositivo, mas não há nada a ser gravado!\n"
+"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, relate esse problema para os desenvolvedores do ALSA.\n"
+"Nós fomos acordados com o conjunto POLLOUT -- entretanto, a snd_pcm_avail() subseqüente retornou 0 ou outro valor < min_avail."
 
-#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
+#: ../src/modules/alsa/alsa-source.c:506
+#: ../src/modules/alsa/alsa-source.c:656
 #, c-format
 msgid ""
-"ALSA woke us up to read new data from the device, but there was actually "
-"nothing to read!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers.\n"
-"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
-"returned 0 or another value < min_avail."
+"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
 msgstr ""
-"O ALSA nos acordou para ler novos dados no dispositivo, mas não há nada a "
-"ser lido!\n"
-"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, "
-"relate esse problema para os desenvolvedores do ALSA.\n"
-"Nós fomos acordados com o conjunto POLLIN -- entretanto, a snd_pcm_avail() "
-"subseqüente retornou 0 ou outro valor < min_avail."
+"O ALSA nos acordou para ler novos dados no dispositivo, mas não há nada a ser lido!\n"
+"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, relate esse problema para os desenvolvedores do ALSA.\n"
+"Nós fomos acordados com o conjunto POLLIN -- entretanto, a snd_pcm_avail() subseqüente retornou 0 ou outro valor < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2228
@@ -2411,40 +2281,40 @@ msgstr "Servidor de som PulseAudio"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "Dispositivos de saída"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "Dispositivos de entrada"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "Áudio em @HOSTNAME@"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "Entrada"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "Entrada da base de encaixe"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "Microfone da base de encaixe"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "Entrada de linha"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "Microfone"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "Microfone externo"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
 #, fuzzy
@@ -2453,85 +2323,86 @@ msgstr "Áudio interno"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "Rádio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "Vídeo"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "Ganho de controle automático"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "Sem ganho de controle automático"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "Impulso"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "Sem impulso"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "Amplificador"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "Sem amplificador"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "Entrada analógica"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "Microfone analógico"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "Entrada de linha analógica"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "Rádio analógico"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "Vídeo analógico"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Output"
-msgstr ""
+msgstr "Saída analógica"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "Fones de ouvido analógico"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "Saída analógica (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "Saída analógica monofônica"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
 #, fuzzy, c-format
 msgid "%s+%s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1984
+#: ../src/modules/alsa/alsa-mixer.c:3404
 #, fuzzy, c-format
 msgid "%s / %s"
 msgstr "%s %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "Monofônico analógico"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
 #, fuzzy
@@ -2595,166 +2466,129 @@ msgstr "Surround 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "Estéreo digital (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "Surround 4.0 digital (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "Surround digital 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "Surround digital 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "Estéreo digital (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "Duplex monofônico analógico"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "Duplex estéreo analógico"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "Duplex estéreo digital (IEC958)"
 
 #~ msgid "Invalid client name '%s'\n"
 #~ msgstr "Nome do cliente \"%s\" inválido\n"
-
 #~ msgid "Failed to determine sample specification from file.\n"
 #~ msgstr ""
 #~ "Falha ao determinar a especificação de amostragem a partir do arquivo.\n"
-
 #~ msgid "select(): %s"
 #~ msgstr "select(): %s"
-
 #~ msgid "Cannot connect to system bus: %s"
 #~ msgstr "Não foi possível conectar com o barramento do sistema: %s"
-
 #~ msgid "Cannot get caller from PID: %s"
 #~ msgstr "Não foi possível obter quem chamou pelo PID: %s"
-
 #~ msgid "Cannot set UID on caller object."
 #~ msgstr "Não foi possível definir o UID sobre o objeto que chamou."
-
 #~ msgid "Failed to get CK session."
 #~ msgstr "Falha em obter a sessão CK."
-
 #~ msgid "Cannot set UID on session object."
 #~ msgstr "Não foi possível definir o UID do objeto da sessão."
-
 #~ msgid "Cannot allocate PolKitAction."
 #~ msgstr "Não foi possível alocar o PolKitAction."
-
 #~ msgid "Cannot set action_id"
 #~ msgstr "Não foi possível definir a action_id"
-
 #~ msgid "Cannot allocate PolKitContext."
 #~ msgstr "Não foi possível alocar o PolKitContext."
-
 #~ msgid "Cannot initialize PolKitContext: %s"
 #~ msgstr "Não foi possível iniciar o PolKitContext: %s"
-
 #~ msgid "Could not determine whether caller is authorized: %s"
 #~ msgstr "Não foi possível determinar se o solicitante está autorizado: %s"
-
 #~ msgid "Cannot obtain auth: %s"
 #~ msgstr "Não foi possível obter auth: %s"
-
 #~ msgid "PolicyKit responded with '%s'"
 #~ msgstr "PolicyKit respondeu com '%s'"
-
 #~ msgid ""
 #~ "High-priority scheduling (negative Unix nice level) for the PulseAudio "
 #~ "daemon"
 #~ msgstr ""
 #~ "Escalonamento de alta prioridade (nível de nice Unix negativo) para o "
 #~ "daemon do PulseAudio"
-
 #~ msgid "Real-time scheduling for the PulseAudio daemon"
 #~ msgstr "Escalonamento em tempo real para o daemon do PulseAudio"
-
 #~ msgid ""
 #~ "System policy prevents PulseAudio from acquiring high-priority scheduling."
 #~ msgstr ""
 #~ "Uma política do sistema impede que o PulseAudio adquira escalonamento de "
 #~ "alta prioridade."
-
 #~ msgid ""
 #~ "System policy prevents PulseAudio from acquiring real-time scheduling."
 #~ msgstr ""
 #~ "Uma política do sistema impede que o PulseAudio adquira o escalonamento "
 #~ "em tempo real."
-
 #~ msgid "read() failed: %s\n"
 #~ msgstr "read() falhou: %s\n"
-
 #~ msgid "pa_context_connect() failed: %s\n"
 #~ msgstr "pa_context_connect() falhou: %s\n"
-
 #~ msgid "We're in the group '%s', allowing high-priority scheduling."
 #~ msgstr "Estamos no grupo '%s', permitindo escalonamento de alta prioridade."
-
 #~ msgid "We're in the group '%s', allowing real-time scheduling."
 #~ msgstr "Estamos no grupo '%s', permitindo escalonamento em tempo real."
-
 #~ msgid "PolicyKit grants us acquire-high-priority privilege."
 #~ msgstr ""
 #~ "O PolicyKit assegura-nos a aquisição de privilégio de alta prioridade."
-
 #~ msgid "PolicyKit refuses acquire-high-priority privilege."
 #~ msgstr "O PolicyKit recusa a aquisição de privilégios de alta prioridade."
-
 #~ msgid "PolicyKit grants us acquire-real-time privilege."
 #~ msgstr "O PolicyKit assegura-nos a aquisição de privilégios de tempo-real."
-
 #~ msgid "PolicyKit refuses acquire-real-time privilege."
 #~ msgstr "O PolicyKit recusa a aquisição de privilégios de tempo real."
-
 #~ 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."
-
 #~ msgid "Successfully increased RLIMIT_RTPRIO"
 #~ msgstr "RLIMIT_RTPRIO aumentado com sucesso"
-
 #~ msgid "RLIMIT_RTPRIO failed: %s"
 #~ msgstr "RLIMIT_RTPRIO falhou: %s"
-
 #~ msgid "Giving up CAP_NICE"
 #~ msgstr "Abandonando CAP_NICE"
-
 #~ 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."
-
 #~ msgid "Limited capabilities successfully to CAP_SYS_NICE."
 #~ msgstr "As capacidades foram limitadas com sucesso para CAP_SYS_NICE."
-
 #~ msgid "time_new() failed.\n"
 #~ msgstr "time_new() falhou.\n"
-
 #~ msgid "Stream successfully created\n"
 #~ msgstr "Fluxo criado com sucesso\n"
-
 #~ msgid "Stream errror: %s\n"
 #~ msgstr "Erro de fluxo: %s\n"
-
 #~ msgid "Connection established.\n"
 #~ msgstr "Conexão estabelecida.\n"
-
 #~ msgid ""
 #~ "%s [options] [FILE]\n"
 #~ "\n"
@@ -2793,7 +2627,6 @@ msgstr ""
 #~ "      --volume=VOLUME                   Especifica o volume inicial "
 #~ "(linear) no intervalo 0...65536\n"
 #~ "      --channel-map=CHANNELMAP          Define o mapa do canal para uso\n"
-
 #~ msgid ""
 #~ "paplay %s\n"
 #~ "Compiled with libpulse %s\n"
@@ -2802,16 +2635,12 @@ msgstr ""
 #~ "paplay %s\n"
 #~ "Compilado com libpulse %s\n"
 #~ "Linkado com  libpulse %s\n"
-
 #~ msgid "Invalid channel map\n"
 #~ msgstr "Mapa de canais inválido\n"
-
 #~ msgid "Failed to open file '%s'\n"
 #~ msgstr "Falha ao abrir o arquivo '%s'\n"
-
 #~ msgid "Channel map doesn't match file.\n"
 #~ msgstr "O mapa dos canais não coincide com o arquivo.\n"
-
 #~ msgid "Using sample spec '%s'\n"
 #~ msgstr "Usando a especificação da amostragem '%s'\n"
 
@@ -2830,19 +2659,14 @@ msgstr ""
 #, fuzzy
 #~ msgid "--log-time boolean argument"
 #~ msgstr "--disallow-exit argumento booleano"
-
 #~ msgid "Default sink name (%s) does not exist in name register."
 #~ msgstr "O nome padrão do destino (%s) não existe no registro de nomes."
-
 #~ msgid "Buffer overrun, dropping incoming data\n"
 #~ msgstr "Houve estouro de buffer, os dados que chegaram foram descartados\n"
-
 #~ msgid "pa_stream_drop() failed: %s\n"
 #~ msgstr "pa_stream_drop() falhou: %s\n"
-
 #~ msgid "muted"
 #~ msgstr "mudo"
-
 #~ msgid ""
 #~ "*** Autoload Entry #%u ***\n"
 #~ "Name: %s\n"
@@ -2855,13 +2679,10 @@ msgstr ""
 #~ "Tipo: %s\n"
 #~ "Módulo: %s\n"
 #~ "Argumento: %s\n"
-
 #~ msgid "sink"
 #~ msgstr "destino"
-
 #~ msgid "source"
 #~ msgstr "fonte"
-
 #~ msgid ""
 #~ "' and PolicyKit refuse to grant us priviliges. Dropping SUID again.\n"
 #~ "For enabling real-time scheduling please acquire the appropriate "
@@ -2871,13 +2692,12 @@ msgstr ""
 #~ "outra vez.\n"
 #~ " Para habilitar o escalonamento em tempo real, por favo, adquira os "
 #~ "privilégios adequados pelo PolicyKit, ou torne-se membro do'"
-
 #~ msgid ""
 #~ "', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this "
 #~ "user."
 #~ msgstr ""
 #~ "', ou eleve o RLIMIT_NICE/RLIMIT_RTPRIO dos limites do recurso para este "
 #~ "usuário."
-
 #~ msgid "socketpair(): %s"
 #~ msgstr "socketpair(): %s"
+

commit 667126b5fe062a4dbe8fe42ecbf51d03cfccd232
Author: igor <igor at fedoraproject.org>
Date:   Fri Oct 23 16:45:43 2009 +0000

    Sending translation for Brazilian Portuguese

diff --git a/po/pt_BR.po b/po/pt_BR.po
index 50dc91c..257aa36 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-22 16:22+0000\n"
-"PO-Revision-Date: 2009-10-22 18:19-0300\n"
+"POT-Creation-Date: 2009-10-23 09:53+0000\n"
+"PO-Revision-Date: 2009-10-23 14:42-0300\n"
 "Last-Translator: Igor Pires Soares <igor at projetofedora.org>\n"
 "Language-Team: Brazilian-Portuguese <fedora-trans-pt_br at redhat.com>\n"
 "MIME-Version: 1.0\n"
@@ -697,7 +697,7 @@ msgstr "Mono"
 
 #: ../src/pulse/channelmap.c:107
 msgid "Front Center"
-msgstr "Fronto-cental"
+msgstr "Frontal central"
 
 #: ../src/pulse/channelmap.c:108
 msgid "Front Left"
@@ -869,31 +869,31 @@ msgstr "Auxiliar 31"
 
 #: ../src/pulse/channelmap.c:156
 msgid "Top Center"
-msgstr "Central Superior"
+msgstr "Central superior"
 
 #: ../src/pulse/channelmap.c:158
 msgid "Top Front Center"
-msgstr "Central Frontal Superior"
+msgstr "Central frontal superior"
 
 #: ../src/pulse/channelmap.c:159
 msgid "Top Front Left"
-msgstr "Frontal Superior Esquerdo"
+msgstr "Frontal superior esquerdo"
 
 #: ../src/pulse/channelmap.c:160
 msgid "Top Front Right"
-msgstr "Fontal Superior Direito"
+msgstr "Fontal superior direito"
 
 #: ../src/pulse/channelmap.c:162
 msgid "Top Rear Center"
-msgstr "Central Superior Posterior"
+msgstr "Central superior posterior"
 
 #: ../src/pulse/channelmap.c:163
 msgid "Top Rear Left"
-msgstr "Posterior Superior Esquerdo"
+msgstr "Posterior superior esquerdo"
 
 #: ../src/pulse/channelmap.c:164
 msgid "Top Rear Right"
-msgstr "Posterior Superior Direito"
+msgstr "Posterior superior direito"
 
 #: ../src/pulse/channelmap.c:484
 #: ../src/pulse/sample.c:170
@@ -934,7 +934,7 @@ msgstr "OK"
 
 #: ../src/pulse/error.c:44
 msgid "Access denied"
-msgstr "Acesso Negado"
+msgstr "Acesso negado"
 
 #: ../src/pulse/error.c:45
 msgid "Unknown command"
@@ -1246,9 +1246,9 @@ msgid "Failed to get latency: %s"
 msgstr "Falha ao obter a latência: %s"
 
 #: ../src/utils/pacat.c:580
-#, fuzzy, c-format
+#, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
-msgstr "Tempo: %0.3f s; Latência: %0.0f us.  \r"
+msgstr "Tempo: %0.3f sec;; Latência: %0.0f usec."
 
 #: ../src/utils/pacat.c:599
 #, c-format
@@ -1552,9 +1552,9 @@ msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() falhou.\n"
 
 #: ../src/utils/pactl.c:135
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get statistics: %s"
-msgstr "Falha em obter as estatísticas: %s\n"
+msgstr "Falha ao obter estatísticas: %s"
 
 #: ../src/utils/pactl.c:141
 #, c-format
@@ -1572,9 +1572,9 @@ msgid "Sample cache size: %s\n"
 msgstr "Tamanho do cache para amostragem: %s\n"
 
 #: ../src/utils/pactl.c:156
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get server information: %s"
-msgstr "Falha em obter a informação do servidor: %s\n"
+msgstr "Falha ao obter informações do servidor: %s"
 
 #: ../src/utils/pactl.c:164
 #, c-format
@@ -1600,9 +1600,9 @@ msgstr ""
 "Cookie: %08x\n"
 
 #: ../src/utils/pactl.c:205
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get sink information: %s"
-msgstr "Falha em obter a informação do destino: %s\n"
+msgstr "Falha ao obter informações do destino: %s"
 
 #: ../src/utils/pactl.c:221
 #, c-format
@@ -1656,9 +1656,9 @@ msgid "\tActive Port: %s\n"
 msgstr "\tPorta ativa: %s\n"
 
 #: ../src/utils/pactl.c:297
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get source information: %s"
-msgstr "Falha em obter a informação da fonte: %s\n"
+msgstr "Falha ao obter informações da fonte: %s"
 
 #: ../src/utils/pactl.c:313
 #, c-format
@@ -1716,9 +1716,9 @@ msgid "n/a"
 msgstr "n/a"
 
 #: ../src/utils/pactl.c:375
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get module information: %s"
-msgstr "Falha em obter a informação do módulo: %s\n"
+msgstr "Falha ao obter informações do módulo: %s"
 
 #: ../src/utils/pactl.c:393
 #, c-format
@@ -1738,9 +1738,9 @@ msgstr ""
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:412
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get client information: %s"
-msgstr "Falhou ao obter a informação do cliente: %s\n"
+msgstr "Falha ao obter informações do cliente: %s"
 
 #: ../src/utils/pactl.c:430
 #, c-format
@@ -1758,9 +1758,9 @@ msgstr ""
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:447
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get card information: %s"
-msgstr "Falha ao obter as informações da placa: %s\n"
+msgstr "Falha ao obter informações da placa: %s"
 
 #: ../src/utils/pactl.c:465
 #, c-format
@@ -1790,9 +1790,9 @@ msgid "\tActive Profile: %s\n"
 msgstr "\tPerfil ativo: %s\n"
 
 #: ../src/utils/pactl.c:496
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get sink input information: %s"
-msgstr "Falha na obtenção da informação de entrada do destino: %s\n"
+msgstr "Falha ao obter informações da entrada do destino: %s"
 
 #: ../src/utils/pactl.c:515
 #, c-format
@@ -1832,9 +1832,9 @@ msgstr ""
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:554
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get source output information: %s"
-msgstr "Falha em obter informações sobre a saída da fonte: %s\n"
+msgstr "Falha ao obter informações da saída da fonte: %s"
 
 #: ../src/utils/pactl.c:574
 #, c-format
@@ -1866,9 +1866,9 @@ msgstr ""
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:605
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get sample information: %s"
-msgstr "Falha em obter informações sobre a amostragem: %s\n"
+msgstr "Falha ao obter informações sobre a amostragem: %s"
 
 #: ../src/utils/pactl.c:623
 #, c-format
@@ -1903,27 +1903,25 @@ msgstr ""
 
 #: ../src/utils/pactl.c:653
 #: ../src/utils/pactl.c:663
-#, fuzzy, c-format
+#, c-format
 msgid "Failure: %s"
-msgstr "Falha: %s\n"
+msgstr "Falha: %s"
 
 #: ../src/utils/pactl.c:687
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to upload sample: %s"
-msgstr "Falha em carregar a amostra: %s\n"
+msgstr "Falha ao enviar a amostra: %s"
 
 #: ../src/utils/pactl.c:704
-#, fuzzy
 msgid "Premature end of file"
-msgstr "Fim prematuro do arquivo\n"
+msgstr "Fim prematuro do arquivo"
 
 #: ../src/utils/pactl.c:863
-#, fuzzy
 msgid "Got SIGINT, exiting."
-msgstr "Recebido o SIGINT, saindo.\n"
+msgstr "SIGINT recebido, saindo."
 
 #: ../src/utils/pactl.c:869
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -1959,21 +1957,27 @@ msgstr ""
 "%s [opções] upload-sample NOME_DO_ARQUIVO [NOME]\n"
 "%s [opções] play-sample NOME [DESTINO]\n"
 "%s [opções] remove-sample NOME\n"
-"%s [opções] move-sink-input ID DESTINO\n"
-"%s [opções] move-source-output ID FONTE\n"
+"%s [opções] move-sink-input ENTRADA DESTINO\n"
+"%s [opções] move-source-output SAÍDA FONTE\n"
 "%s [opções] load-module NOME [ARGS ...]\n"
-"%s [opções] unload-module ID\n"
+"%s [opções] unload-module MÓDULO\n"
 "%s [opções] suspend-sink [DESTINO] 1|0\n"
 "%s [opções] suspend-source [FONTE] 1|0\n"
-"%s [opções] set-card-profile [PLACA] [PERFIL] \n"
-"%s [opções] set-sink-port [DESTINO] [PORTA] \n"
-"%s [opções] set-source-port [FONTE] [PORTA] \n"
+"%s [opções] set-card-profile [PLACA] [PERFIL]\n"
+"%s [opções] set-sink-port [DESTINO] [PORTA]\n"
+"%s [opções] set-source-port [FONTE] [PORTA]\n"
+"%s [opções] set-sink-volume DESTINO VOLUME\n"
+"%s [opções] set-source-volume FONTE VOLUME\n"
+"%s [opções] set-sink-input-volume ENTRADA VOLUME\n"
+"%s [opções] set-sink-mute DESTINO 1|0\n"
+"%s [opções] set-source-mute FONTE 1|0\n"
+"%s [opções] set-sink-input-mute ENTRADA 1|0\n"
 "\n"
 "  -h, --help                            Mostra essa ajuda\n"
 "      --version                        Mostra a versão\n"
 "\n"
-"  -s, --server=SERVER                   O nome do servidor a ser conectado\n"
-"  -n, --client-name=NAME                Como chamar este cliente no servidor \n"
+"  -s, --server=SERVIDOR                   O nome do servidor a ser conectado\n"
+"  -n, --client-name=NOME                Como chamar este cliente no servidor \n"
 
 #: ../src/utils/pactl.c:933
 #, c-format
@@ -1987,79 +1991,64 @@ msgstr ""
 "Linkado com libpulse %s\n"
 
 #: ../src/utils/pactl.c:979
-#, fuzzy
 msgid "Please specify a sample file to load"
-msgstr "Por favor, especifique o arquivo de amostra a ser carregado\n"
+msgstr "Por favor, especifique um arquivo de amostra a ser carregado"
 
 #: ../src/utils/pactl.c:992
-#, fuzzy
 msgid "Failed to open sound file."
-msgstr "Falha em abrir o arquivo de som.\n"
+msgstr "Falha ao abrir o arquivo de som."
 
 #: ../src/utils/pactl.c:1004
-#, fuzzy
 msgid "Warning: Failed to determine sample specification from file."
-msgstr "Aviso: falha ao determinar a especificação da amostragem a partir do arquivo.\n"
+msgstr "Aviso: falha ao determinar a especificação da amostragem a partir do arquivo."
 
 #: ../src/utils/pactl.c:1014
-#, fuzzy
 msgid "You have to specify a sample name to play"
-msgstr "Você deve especificar um nome da amostra para ser executada\n"
+msgstr "Você deve especificar um nome para amostra a ser reproduzida"
 
 #: ../src/utils/pactl.c:1026
-#, fuzzy
 msgid "You have to specify a sample name to remove"
-msgstr "Você deve especificar um nome da amostra para ser removida\n"
+msgstr "Você deve especificar um nome para a amostra a ser removida"
 
 #: ../src/utils/pactl.c:1035
-#, fuzzy
 msgid "You have to specify a sink input index and a sink"
-msgstr "Você tem que especificar a entrada para o destino e um destino\n"
+msgstr "Você deve especificar a entrada do destino e um destino"
 
 #: ../src/utils/pactl.c:1045
-#, fuzzy
 msgid "You have to specify a source output index and a source"
-msgstr "Você tem que especificar um índice de saída da fonte e uma fonte\n"
+msgstr "Você deve especificar um índice de saída da fonte e uma fonte"
 
 #: ../src/utils/pactl.c:1060
-#, fuzzy
 msgid "You have to specify a module name and arguments."
-msgstr "Você deve especificar um nome do módulo e seus argumentos\n"
+msgstr "Você deve especificar um nome para o módulo e seus argumentos."
 
 #: ../src/utils/pactl.c:1080
-#, fuzzy
 msgid "You have to specify a module index"
-msgstr "Você deve especificar um índice de um módulo\n"
+msgstr "Você deve especificar um índice do módulo"
 
 #: ../src/utils/pactl.c:1090
-#, fuzzy
 msgid "You may not specify more than one sink. You have to specify a boolean value."
-msgstr "Você não pode especificar mais de um destino. Você tem que especificar um valor booleano.\n"
+msgstr "Você não pode especificar mais de um destino. Você deve especificar um valor booleano."
 
 #: ../src/utils/pactl.c:1103
-#, fuzzy
 msgid "You may not specify more than one source. You have to specify a boolean value."
-msgstr "Você não pode especificar mais de uma fonte. Você tem que especificar um valor booleano.\n"
+msgstr "Você não pode especificar mais de uma fonte. Você deve especificar um valor booleano."
 
 #: ../src/utils/pactl.c:1115
-#, fuzzy
 msgid "You have to specify a card name/index and a profile name"
-msgstr "Você tem que especificar um nome/índice da placa e um nome de perfil\n"
+msgstr "Você deve especificar um nome/índice para a placa e um nome de perfil"
 
 #: ../src/utils/pactl.c:1126
-#, fuzzy
 msgid "You have to specify a sink name/index and a port name"
-msgstr "Você tem que especificar um nome/índice do destino e o nome da porta\n"
+msgstr "Você deve especificar um nome/índice do destino e o nome da porta"
 
 #: ../src/utils/pactl.c:1137
-#, fuzzy
 msgid "You have to specify a source name/index and a port name"
-msgstr "Você tem que especificar um nome/índice da fonte e o nome da porta\n"
+msgstr "Você deve especificar um nome/índice da fonte e o nome da porta"
 
 #: ../src/utils/pactl.c:1149
-#, fuzzy
 msgid "You have to specify a sink name/index and a volume"
-msgstr "Você tem que especificar um nome/índice do destino e o nome da porta\n"
+msgstr "Você deve especificar um nome/índice do destino e um volume"
 
 #: ../src/utils/pactl.c:1154
 #: ../src/utils/pactl.c:1171
@@ -2067,48 +2056,40 @@ msgstr "Você tem que especificar um nome/índice do destino e o nome da porta\n
 #: ../src/utils/pactl.c:1209
 #: ../src/utils/pactl.c:1226
 #: ../src/utils/pactl.c:1248
-#, fuzzy
 msgid "Invalid volume specification"
-msgstr "Especificação de amostragem inválida"
+msgstr "Especificação de volume inválida"
 
 #: ../src/utils/pactl.c:1166
-#, fuzzy
 msgid "You have to specify a source name/index and a volume"
-msgstr "Você tem que especificar um nome/índice da fonte e o nome da porta\n"
+msgstr "Você deve especificar um nome/índice da fonte e um volume"
 
 #: ../src/utils/pactl.c:1183
-#, fuzzy
 msgid "You have to specify a sink input index and a volume"
-msgstr "Você tem que especificar a entrada para o destino e um destino\n"
+msgstr "Você deve especificar um índice de entrada para o destino e um volume"
 
 #: ../src/utils/pactl.c:1188
 msgid "Invalid sink input index"
 msgstr "Índice de entrada de destino inválido"
 
 #: ../src/utils/pactl.c:1204
-#, fuzzy
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr "Você tem que especificar um nome/índice do destino e o nome da porta\n"
+msgstr "Você deve especificar um nome/índice do destino e um booleano do mudo"
 
 #: ../src/utils/pactl.c:1221
-#, fuzzy
 msgid "You have to specify a source name/index and a mute boolean"
-msgstr "Você tem que especificar um nome/índice da fonte e o nome da porta\n"
+msgstr "Você deve especificar um nome/índice da fonte e um booleano do mudo"
 
 #: ../src/utils/pactl.c:1238
-#, fuzzy
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr "Você tem que especificar a entrada para o destino e um destino\n"
+msgstr "Você deve especificar um índice de entrada para o destino e um booleano do mudo"
 
 #: ../src/utils/pactl.c:1243
-#, fuzzy
 msgid "Invalid sink input index specification"
-msgstr "Especificação de amostragem inválida"
+msgstr "Especificação do índice de entrada de destino inválida"
 
 #: ../src/utils/pactl.c:1262
-#, fuzzy
 msgid "No valid command specified."
-msgstr "Nenhum comando válido especificado.\n"
+msgstr "Nenhum comando válido especificado."
 
 #: ../src/utils/pax11publish.c:61
 #, c-format
@@ -2266,9 +2247,8 @@ msgid "High Fidelity Playback (A2DP)"
 msgstr "Reprodução de alta fidelidade (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2198
-#, fuzzy
 msgid "High Fidelity Capture (A2DP)"
-msgstr "Reprodução de alta fidelidade (A2DP)"
+msgstr "Captura de alta fidelidade (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2213
 msgid "Telephony Duplex (HSP/HFP)"
@@ -2317,9 +2297,8 @@ msgid "External Microphone"
 msgstr "Microfone externo"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "Áudio interno"
+msgstr "Microfone interno"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
@@ -2390,79 +2369,67 @@ msgid "Analog Mono Output"
 msgstr "Saída analógica monofônica"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984
 #: ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
 msgstr "Monofônico analógico"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
-#, fuzzy
 msgid "Analog Stereo"
-msgstr "Stereo"
+msgstr "Estéreo analógico"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "Surround 4.1"
+msgstr "Surround analógico 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "Surround 4.0"
+msgstr "Surround analógico 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "Surround 4.1"
+msgstr "Surround analógico 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
-#, fuzzy
 msgid "Analog Surround 4.0"
-msgstr "Surround 4.0"
+msgstr "Surround analógico 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
-#, fuzzy
 msgid "Analog Surround 4.1"
-msgstr "Surround 4.1"
+msgstr "Surround analógico 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
-#, fuzzy
 msgid "Analog Surround 5.0"
-msgstr "Surround 5.0"
+msgstr "Surround analógico 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
-#, fuzzy
 msgid "Analog Surround 5.1"
-msgstr "Surround 5.1"
+msgstr "Surround analógico 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "Surround 4.0"
+msgstr "Surround analógico 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "Surround 4.1"
+msgstr "Surround analógico 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "Surround 4.0"
+msgstr "Surround analógico 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
-#, fuzzy
 msgid "Analog Surround 7.1"
-msgstr "Surround 7.1"
+msgstr "Surround analógico 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"

commit f0382d1d20476d306ff277c6d4034d94008216a7
Author: thalia <thalia at fedoraproject.org>
Date:   Mon Oct 26 15:19:34 2009 +0000

    Sending translation for Greek

diff --git a/po/el.po b/po/el.po
index be677d1..d9b2a4d 100644
--- a/po/el.po
+++ b/po/el.po
@@ -2,13 +2,14 @@
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Dimitris Glezos <dimitris at glezos.com>, 2008.
+# Thalia Papoutsaki <saliyath at gmail.com>, 2009.
 msgid ""
 msgstr ""
 "Project-Id-Version: el\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2008-08-22 19:40+0300\n"
-"Last-Translator: Dimitris Glezos <dimitris at glezos.com>\n"
+"POT-Creation-Date: 2009-10-26 09:45+0000\n"
+"PO-Revision-Date: 2009-10-26 17:15+0200\n"
+"Last-Translator: Thalia Papoutsaki <saliyath at gmail.com>\n"
 "Language-Team: Greek <fedora-trans-el at redhat.com>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -16,36 +17,31 @@ msgstr ""
 "X-Generator: KAider 0.1\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:858
+#: ../src/pulsecore/sink.c:2629
 #, c-format
 msgid "%s %s"
-msgstr ""
+msgstr "%s %s"
 
 #: ../src/modules/alsa/alsa-util.c:1106
 #, c-format
 msgid ""
-"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
-"ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
 
 #: ../src/modules/alsa/alsa-util.c:1147
 #, c-format
 msgid ""
-"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
-"lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
 
 #: ../src/modules/alsa/alsa-util.c:1194
 #, c-format
 msgid ""
-"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
-"(%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
 
 #: ../src/modules/module-always-sink.c:39
@@ -61,12 +57,7 @@ msgid "Virtual LADSPA sink"
 msgstr ""
 
 #: ../src/modules/module-ladspa-sink.c:53
-msgid ""
-"sink_name=<name for the sink> sink_properties=<properties for the sink> "
-"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
-"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
-"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
-"input control values>"
+msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
 msgstr ""
 
 #: ../src/modules/module-null-sink.c:55
@@ -83,7 +74,7 @@ msgstr ""
 
 #: ../src/pulsecore/sink.c:2618
 msgid "Modem"
-msgstr ""
+msgstr "Modem"
 
 #: ../src/daemon/ltdl-bind-now.c:124
 msgid "Failed to find original lt_dlopen loader."
@@ -131,7 +122,8 @@ msgstr ""
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr ""
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:208
+#: ../src/daemon/main.c:213
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr ""
@@ -183,9 +175,7 @@ msgid "Failed to kill daemon: %s"
 msgstr ""
 
 #: ../src/daemon/main.c:571
-msgid ""
-"This program is not intended to be run as root (unless --system is "
-"specified)."
+msgid "This program is not intended to be run as root (unless --system is specified)."
 msgstr ""
 
 #: ../src/daemon/main.c:573
@@ -226,7 +216,8 @@ msgstr ""
 msgid "fork() failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:646
+#: ../src/utils/pacat.c:508
 #, c-format
 msgid "read() failed: %s"
 msgstr ""
@@ -338,12 +329,9 @@ msgstr ""
 
 #: ../src/daemon/main.c:792
 msgid ""
-"OK, so you are running PA in system mode. Please note that you most likely "
-"shouldn't be doing that.\n"
-"If you do it nonetheless then it's your own fault if things don't work as "
-"expected.\n"
-"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
-"explanation why system mode is usually a bad idea."
+"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."
 msgstr ""
 
 #: ../src/daemon/main.c:809
@@ -355,12 +343,8 @@ msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr ""
 
 #: ../src/daemon/main.c:821
-msgid ""
-"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
-"resolution timers enabled!"
-msgstr ""
-"Δικέ μου, ο πυρήνας σου είναι για τα μπάζα! Η πρόταση του σεφ σήμερα είναι "
-"Linux με ενεργοποιημένα τα high-resolution timers!"
+msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
+msgstr "Δικέ μου, ο πυρήνας σου είναι για τα μπάζα! Η πρόταση του σεφ σήμερα είναι Linux με ενεργοποιημένα τα high-resolution timers!"
 
 #: ../src/daemon/main.c:844
 msgid "pa_core_new() failed."
@@ -397,48 +381,37 @@ 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"
@@ -449,12 +422,10 @@ 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"
@@ -469,9 +440,7 @@ msgid "--fail expects boolean argument"
 msgstr ""
 
 #: ../src/daemon/cmdline.c:264
-msgid ""
-"--log-level expects log level argument (either numeric in range 0..4 or one "
-"of 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 ""
 
 #: ../src/daemon/cmdline.c:276
@@ -536,22 +505,22 @@ msgstr ""
 #: ../src/daemon/dumpmodules.c:66
 #, c-format
 msgid "Version: %s\n"
-msgstr ""
+msgstr "Έκδοση: %s\n"
 
 #: ../src/daemon/dumpmodules.c:68
 #, c-format
 msgid "Description: %s\n"
-msgstr ""
+msgstr "Περιγραφή: %s\n"
 
 #: ../src/daemon/dumpmodules.c:70
 #, c-format
 msgid "Author: %s\n"
-msgstr ""
+msgstr "Συγγραφέας: %s\n"
 
 #: ../src/daemon/dumpmodules.c:72
 #, c-format
 msgid "Usage: %s\n"
-msgstr ""
+msgstr "Χρήση: %s\n"
 
 #: ../src/daemon/dumpmodules.c:73
 #, c-format
@@ -634,9 +603,7 @@ msgid "Failed to open configuration file: %s"
 msgstr ""
 
 #: ../src/daemon/daemon-conf.c:562
-msgid ""
-"The specified default channel map has a different number of channels than "
-"the specified default number of channels."
+msgid "The specified default channel map has a different number of channels than the specified default number of channels."
 msgstr ""
 
 #: ../src/daemon/daemon-conf.c:638
@@ -656,9 +623,10 @@ msgstr ""
 msgid "Start the PulseAudio Sound System"
 msgstr ""
 
-#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757
+#: ../src/pulse/channelmap.c:105
+#: ../src/pulse/channelmap.c:757
 msgid "Mono"
-msgstr ""
+msgstr "Mono"
 
 #: ../src/pulse/channelmap.c:107
 msgid "Front Center"
@@ -706,131 +674,131 @@ msgstr ""
 
 #: ../src/pulse/channelmap.c:123
 msgid "Auxiliary 0"
-msgstr ""
+msgstr "Auxiliary 0"
 
 #: ../src/pulse/channelmap.c:124
 msgid "Auxiliary 1"
-msgstr ""
+msgstr "Auxiliary 1"
 
 #: ../src/pulse/channelmap.c:125
 msgid "Auxiliary 2"
-msgstr ""
+msgstr "Auxiliary 2"
 
 #: ../src/pulse/channelmap.c:126
 msgid "Auxiliary 3"
-msgstr ""
+msgstr "Auxiliary 3"
 
 #: ../src/pulse/channelmap.c:127
 msgid "Auxiliary 4"
-msgstr ""
+msgstr "Auxiliary 4"
 
 #: ../src/pulse/channelmap.c:128
 msgid "Auxiliary 5"
-msgstr ""
+msgstr "Auxiliary 5"
 
 #: ../src/pulse/channelmap.c:129
 msgid "Auxiliary 6"
-msgstr ""
+msgstr "Auxiliary 6"
 
 #: ../src/pulse/channelmap.c:130
 msgid "Auxiliary 7"
-msgstr ""
+msgstr "Auxiliary 7"
 
 #: ../src/pulse/channelmap.c:131
 msgid "Auxiliary 8"
-msgstr ""
+msgstr "Auxiliary 8"
 
 #: ../src/pulse/channelmap.c:132
 msgid "Auxiliary 9"
-msgstr ""
+msgstr "Auxiliary 9"
 
 #: ../src/pulse/channelmap.c:133
 msgid "Auxiliary 10"
-msgstr ""
+msgstr "Auxiliary 10"
 
 #: ../src/pulse/channelmap.c:134
 msgid "Auxiliary 11"
-msgstr ""
+msgstr "Auxiliary 11"
 
 #: ../src/pulse/channelmap.c:135
 msgid "Auxiliary 12"
-msgstr ""
+msgstr "Auxiliary 12"
 
 #: ../src/pulse/channelmap.c:136
 msgid "Auxiliary 13"
-msgstr ""
+msgstr "Auxiliary 13"
 
 #: ../src/pulse/channelmap.c:137
 msgid "Auxiliary 14"
-msgstr ""
+msgstr "Auxiliary 14"
 
 #: ../src/pulse/channelmap.c:138
 msgid "Auxiliary 15"
-msgstr ""
+msgstr "Auxiliary 15"
 
 #: ../src/pulse/channelmap.c:139
 msgid "Auxiliary 16"
-msgstr ""
+msgstr "Auxiliary 16"
 
 #: ../src/pulse/channelmap.c:140
 msgid "Auxiliary 17"
-msgstr ""
+msgstr "Auxiliary 17"
 
 #: ../src/pulse/channelmap.c:141
 msgid "Auxiliary 18"
-msgstr ""
+msgstr "Auxiliary 18"
 
 #: ../src/pulse/channelmap.c:142
 msgid "Auxiliary 19"
-msgstr ""
+msgstr "Auxiliary 19"
 
 #: ../src/pulse/channelmap.c:143
 msgid "Auxiliary 20"
-msgstr ""
+msgstr "Auxiliary 20"
 
 #: ../src/pulse/channelmap.c:144
 msgid "Auxiliary 21"
-msgstr ""
+msgstr "Auxiliary 21"
 
 #: ../src/pulse/channelmap.c:145
 msgid "Auxiliary 22"
-msgstr ""
+msgstr "Auxiliary 22"
 
 #: ../src/pulse/channelmap.c:146
 msgid "Auxiliary 23"
-msgstr ""
+msgstr "Auxiliary 23"
 
 #: ../src/pulse/channelmap.c:147
 msgid "Auxiliary 24"
-msgstr ""
+msgstr "Auxiliary 24"
 
 #: ../src/pulse/channelmap.c:148
 msgid "Auxiliary 25"
-msgstr ""
+msgstr "Auxiliary 25"
 
 #: ../src/pulse/channelmap.c:149
 msgid "Auxiliary 26"
-msgstr ""
+msgstr "Auxiliary 26"
 
 #: ../src/pulse/channelmap.c:150
 msgid "Auxiliary 27"
-msgstr ""
+msgstr "Auxiliary 27"
 
 #: ../src/pulse/channelmap.c:151
 msgid "Auxiliary 28"
-msgstr ""
+msgstr "Auxiliary 28"
 
 #: ../src/pulse/channelmap.c:152
 msgid "Auxiliary 29"
-msgstr ""
+msgstr "Auxiliary 29"
 
 #: ../src/pulse/channelmap.c:153
 msgid "Auxiliary 30"
-msgstr ""
+msgstr "Auxiliary 30"
 
 #: ../src/pulse/channelmap.c:154
 msgid "Auxiliary 31"
-msgstr ""
+msgstr "Auxiliary 31"
 
 #: ../src/pulse/channelmap.c:156
 msgid "Top Center"
@@ -860,39 +828,42 @@ msgstr ""
 msgid "Top Rear Right"
 msgstr ""
 
-#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170
-#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321
-#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371
+#: ../src/pulse/channelmap.c:484
+#: ../src/pulse/sample.c:170
+#: ../src/pulse/volume.c:295
+#: ../src/pulse/volume.c:321
+#: ../src/pulse/volume.c:341
+#: ../src/pulse/volume.c:371
 msgid "(invalid)"
-msgstr ""
+msgstr "(μη έγκυρο)"
 
 #: ../src/pulse/channelmap.c:761
 msgid "Stereo"
-msgstr ""
+msgstr "Stereo"
 
 #: ../src/pulse/channelmap.c:766
 msgid "Surround 4.0"
-msgstr ""
+msgstr "Surround 4.0"
 
 #: ../src/pulse/channelmap.c:772
 msgid "Surround 4.1"
-msgstr ""
+msgstr "Surround 4.1"
 
 #: ../src/pulse/channelmap.c:778
 msgid "Surround 5.0"
-msgstr ""
+msgstr "Surround 5.0"
 
 #: ../src/pulse/channelmap.c:784
 msgid "Surround 5.1"
-msgstr ""
+msgstr "Surround 5.1"
 
 #: ../src/pulse/channelmap.c:791
 msgid "Surround 7.1"
-msgstr ""
+msgstr "Surround 7.1"
 
 #: ../src/pulse/error.c:43
 msgid "OK"
-msgstr ""
+msgstr "Εντάξει"
 
 #: ../src/pulse/error.c:44
 msgid "Access denied"
@@ -1001,29 +972,30 @@ msgstr ""
 #: ../src/pulse/sample.c:172
 #, c-format
 msgid "%s %uch %uHz"
-msgstr ""
+msgstr "%s %uch %uHz"
 
 #: ../src/pulse/sample.c:184
 #, c-format
 msgid "%0.1f GiB"
-msgstr ""
+msgstr "%0.1f GiB"
 
 #: ../src/pulse/sample.c:186
 #, c-format
 msgid "%0.1f MiB"
-msgstr ""
+msgstr "%0.1f MiB"
 
 #: ../src/pulse/sample.c:188
 #, c-format
 msgid "%0.1f KiB"
-msgstr ""
+msgstr "%0.1f KiB"
 
 #: ../src/pulse/sample.c:190
 #, c-format
 msgid "%u B"
-msgstr ""
+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 ""
 
@@ -1041,14 +1013,14 @@ msgid "No cookie loaded. Attempting to connect without."
 msgstr ""
 
 #: ../src/pulse/context.c:693
-#, c-format
+#, fuzzy, c-format
 msgid "fork(): %s"
-msgstr ""
+msgstr "fork(): %s"
 
 #: ../src/pulse/context.c:748
-#, c-format
+#, fuzzy, c-format
 msgid "waitpid(): %s"
-msgstr ""
+msgstr "waitpid(): %s"
 
 #: ../src/pulse/context.c:1438
 #, c-format
@@ -1083,7 +1055,8 @@ msgstr ""
 msgid "pa_stream_begin_write() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:237
+#: ../src/utils/pacat.c:267
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr ""
@@ -1181,10 +1154,11 @@ msgstr ""
 msgid "pa_stream_connect_record() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:470
+#: ../src/utils/pactl.c:857
 #, c-format
 msgid "Connection failure: %s"
-msgstr ""
+msgstr "Αποτυχία σύνδεσης: %s"
 
 #: ../src/utils/pacat.c:503
 msgid "Got EOF."
@@ -1227,48 +1201,29 @@ 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, "
-"s24le, s24be,\n"
-"                                        s24-32le, s24-32be (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, s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, 2 for stereo\n"
 "                                        (defaults to 2)\n"
-"      --channel-map=CHANNELMAP          Channel map to use instead of the "
-"default\n"
-"      --fix-format                      Take the sample format from the sink "
-"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"
-"      --property=PROPERTY=VALUE         Set the specified property to the "
-"specified value.\n"
+"      --no-remap                        Map channels by index instead of name.\n"
+"      --latency=BYTES                   Request the specified latency in bytes.\n"
+"      --process-time=BYTES              Request the specified process time per request in bytes.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
 "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
@@ -1282,7 +1237,8 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:764
+#: ../src/utils/pactl.c:953
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr ""
@@ -1344,12 +1300,11 @@ msgid "Failed to open audio file."
 msgstr ""
 
 #: ../src/utils/pacat.c:959
-msgid ""
-"Warning: specified sample specification will be overwritten with "
-"specification from file."
+msgid "Warning: specified sample specification will be overwritten with specification from file."
 msgstr ""
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:962
+#: ../src/utils/pactl.c:997
 msgid "Failed to determine sample specification from file."
 msgstr ""
 
@@ -1367,8 +1322,7 @@ msgstr ""
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
 
 #: ../src/utils/pacat.c:1009
@@ -1379,7 +1333,8 @@ msgstr ""
 msgid "playback"
 msgstr ""
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1035
+#: ../src/utils/pactl.c:1267
 msgid "pa_mainloop_new() failed."
 msgstr ""
 
@@ -1387,11 +1342,13 @@ msgstr ""
 msgid "io_new() failed."
 msgstr ""
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1061
+#: ../src/utils/pactl.c:1279
 msgid "pa_context_new() failed."
 msgstr ""
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1069
+#: ../src/utils/pactl.c:1285
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr ""
@@ -1400,19 +1357,20 @@ msgstr ""
 msgid "pa_context_rttime_new() failed."
 msgstr ""
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1082
+#: ../src/utils/pactl.c:1290
 msgid "pa_mainloop_run() failed."
 msgstr ""
 
 #: ../src/utils/pasuspender.c:81
-#, c-format
+#, fuzzy, c-format
 msgid "fork(): %s\n"
-msgstr ""
+msgstr "fork(): %s\n"
 
 #: ../src/utils/pasuspender.c:92
-#, c-format
+#, fuzzy, c-format
 msgid "execvp(): %s\n"
-msgstr ""
+msgstr "execvp(): %s\n"
 
 #: ../src/utils/pasuspender.c:109
 #, c-format
@@ -1451,8 +1409,7 @@ 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 ""
 
@@ -1545,12 +1502,14 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:268
+#: ../src/utils/pactl.c:360
 #, c-format
 msgid "\tPorts:\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:274
+#: ../src/utils/pactl.c:366
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr ""
@@ -1582,10 +1541,18 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
+#: ../src/utils/pactl.c:345
+#: ../src/utils/pactl.c:401
+#: ../src/utils/pactl.c:436
+#: ../src/utils/pactl.c:473
+#: ../src/utils/pactl.c:532
+#: ../src/utils/pactl.c:533
+#: ../src/utils/pactl.c:543
+#: ../src/utils/pactl.c:587
+#: ../src/utils/pactl.c:588
+#: ../src/utils/pactl.c:594
+#: ../src/utils/pactl.c:637
+#: ../src/utils/pactl.c:638
 #: ../src/utils/pactl.c:645
 msgid "n/a"
 msgstr ""
@@ -1718,10 +1685,11 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:653
+#: ../src/utils/pactl.c:663
+#, c-format
 msgid "Failure: %s"
-msgstr "Όνομα: %s\n"
+msgstr "Αποτυχία: %s"
 
 #: ../src/utils/pactl.c:687
 #, fuzzy, c-format
@@ -1764,10 +1732,8 @@ 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 ""
 
 #: ../src/utils/pactl.c:933
@@ -1783,9 +1749,8 @@ msgid "Please specify a sample file to load"
 msgstr ""
 
 #: ../src/utils/pactl.c:992
-#, fuzzy
 msgid "Failed to open sound file."
-msgstr "Αποτυχία εύρεσης ομάδας χρηστών '%s'."
+msgstr "Αποτυχία ανοίγματος αρχείου ήχου."
 
 #: ../src/utils/pactl.c:1004
 msgid "Warning: Failed to determine sample specification from file."
@@ -1816,14 +1781,11 @@ msgid "You have to specify a module index"
 msgstr ""
 
 #: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
+msgid "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 
 #: ../src/utils/pactl.c:1103
-msgid ""
-"You may not specify more than one source. You have to specify a boolean "
-"value."
+msgid "You may not specify more than one source. You have to specify a boolean value."
 msgstr ""
 
 #: ../src/utils/pactl.c:1115
@@ -1842,9 +1804,12 @@ msgstr ""
 msgid "You have to specify a sink name/index and a volume"
 msgstr ""
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1154
+#: ../src/utils/pactl.c:1171
+#: ../src/utils/pactl.c:1193
+#: ../src/utils/pactl.c:1209
+#: ../src/utils/pactl.c:1226
+#: ../src/utils/pactl.c:1248
 msgid "Invalid volume specification"
 msgstr ""
 
@@ -1887,8 +1852,7 @@ 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 ""
 
@@ -1964,7 +1928,7 @@ msgstr ""
 #: ../src/utils/pacmd.c:91
 #, c-format
 msgid "connect(): %s"
-msgstr ""
+msgstr "σύνδεση(): %s"
 
 #: ../src/utils/pacmd.c:99
 msgid "Failed to kill PulseAudio daemon."
@@ -1979,40 +1943,39 @@ msgstr ""
 msgid "poll(): %s"
 msgstr ""
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:171
+#: ../src/utils/pacmd.c:188
 #, c-format
 msgid "read(): %s"
 msgstr ""
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:207
+#: ../src/utils/pacmd.c:223
 #, c-format
 msgid "write(): %s"
 msgstr ""
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:136
+#: ../src/pulsecore/lock-autospawn.c:219
 msgid "Cannot access autospawn lock."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
+#: ../src/modules/alsa/alsa-sink.c:530
+#: ../src/modules/alsa/alsa-sink.c:689
 #, c-format
 msgid ""
-"ALSA woke us up to write new data to the device, but there was actually "
-"nothing to write!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers.\n"
-"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
-"returned 0 or another value < min_avail."
+"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
+#: ../src/modules/alsa/alsa-source.c:506
+#: ../src/modules/alsa/alsa-source.c:656
 #, c-format
 msgid ""
-"ALSA woke us up to read new data from the device, but there was actually "
-"nothing to read!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers.\n"
-"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
-"returned 0 or another value < min_avail."
+"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
 msgstr ""
 
 #: ../src/modules/alsa/module-alsa-card.c:152
@@ -2081,11 +2044,11 @@ msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "Radio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "Video"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
@@ -2125,11 +2088,11 @@ msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "Analog Radio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "Analog Video"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Output"
@@ -2141,102 +2104,104 @@ msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "Analog Output (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "Analog Mono Output"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
 #, c-format
 msgid "%s+%s"
-msgstr ""
+msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1984
+#: ../src/modules/alsa/alsa-mixer.c:3404
 #, c-format
 msgid "%s / %s"
-msgstr ""
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "Analog Mono"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
 msgid "Analog Stereo"
-msgstr ""
+msgstr "Analog Stereo"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
 msgid "Analog Surround 2.1"
-msgstr ""
+msgstr "Analog Surround 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
 msgid "Analog Surround 3.0"
-msgstr ""
+msgstr "Analog Surround 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
 msgid "Analog Surround 3.1"
-msgstr ""
+msgstr "Analog Surround 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Surround 4.0"
-msgstr ""
+msgstr "Analog Surround 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Surround 4.1"
-msgstr ""
+msgstr "Analog Surround 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 5.0"
-msgstr ""
+msgstr "Analog Surround 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 5.1"
-msgstr ""
+msgstr "Analog Surround 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 6.0"
-msgstr ""
+msgstr "Analog Surround 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 6.1"
-msgstr ""
+msgstr "Analog Surround 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 7.0"
-msgstr ""
+msgstr "Analog Surround 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 7.1"
-msgstr ""
+msgstr "Analog Surround 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "Digital Stereo (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "Digital Surround 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "Digital Surround 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "Digital Surround 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "Digital Stereo (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "Analog Mono Duplex"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "Analog Stereo Duplex"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "Digital Stereo Duplex (IEC958)"
+

commit b54ea170b50242428e2be9e58fb8dc2f806633e5
Author: kmilos <kmilos at fedoraproject.org>
Date:   Fri Oct 30 23:18:18 2009 +0000

    Sending translation for Serbian

diff --git a/po/sr.po b/po/sr.po
index be03718..820b14d 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-16 22:10+0100\n"
+"POT-Creation-Date: 2009-10-30 10:22+0000\n"
+"PO-Revision-Date: 2009-10-30 22:51+0100\n"
 "Last-Translator: Miloš Komarčević <kmilos at gmail.com>\n"
 "Language-Team: Serbian (sr) <fedora-trans-sr at redhat.com>\n"
 "MIME-Version: 1.0\n"
@@ -2368,7 +2368,7 @@ msgstr "Снимање високе тачности (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2213
 msgid "Telephony Duplex (HSP/HFP)"
-msgstr "Двострано телефонирање (HSP/HFP)"
+msgstr "Двосмерно телефонирање (HSP/HFP)"
 
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
@@ -2377,217 +2377,203 @@ msgstr "PulseAudio звучни систем"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "Излазни уређаји"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "Улазни уређаји"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "Аудио на @HOSTNAME@"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "Улаз"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "Улаз прикључне станице"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "Микрофон прикључне станице"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "Линија у"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "Микрофон"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "Спољни микрофон"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "Унутрашњи звук"
+msgstr "Унутрашњи микрофон"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "Радио"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "Видео"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "Самостална контрола појачања"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "Без самосталне контроле појачања"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "Подизање"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "Без подизања"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "Појачало"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "Без појачала"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "Аналогни улаз"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "Аналогни микрофон"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "Аналогна линија у"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "Аналогни радио"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "Аналогни видео"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "Празан излаз"
+msgstr "Аналогни излаз"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "Аналогне слушалице"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "Аналогни излаз (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "Аналогни моно излаз"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "Аналогни моно"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
-#, fuzzy
 msgid "Analog Stereo"
-msgstr "Стерео"
+msgstr "Аналогни стерео"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "Окружујући 4.1"
+msgstr "Аналогни окружујући 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "Окружујући 4.0"
+msgstr "Аналогни окружујући 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "Окружујући 4.1"
+msgstr "Аналогни окружујући 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
-#, fuzzy
 msgid "Analog Surround 4.0"
-msgstr "Окружујући 4.0"
+msgstr "Аналогни окружујући 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
-#, fuzzy
 msgid "Analog Surround 4.1"
-msgstr "Окружујући 4.1"
+msgstr "Аналогни окружујући 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
-#, fuzzy
 msgid "Analog Surround 5.0"
-msgstr "Окружујући 5.0"
+msgstr "Аналогни окружујући 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
-#, fuzzy
 msgid "Analog Surround 5.1"
-msgstr "Окружујући 5.1"
+msgstr "Аналогни окружујући 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "Окружујући 4.0"
+msgstr "Аналогни окружујући 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "Окружујући 4.1"
+msgstr "Аналогни окружујући 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "Окружујући 4.0"
+msgstr "Аналогни окружујући 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
-#, fuzzy
 msgid "Analog Surround 7.1"
-msgstr "Окружујући 7.1"
+msgstr "Аналогни окружујући 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "Дигитални стерео (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "Дигитални окружујући 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "Дигитални окружујући 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "Дигитални окружујући 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "Дигитални стерео (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "Двосмерни аналогни моно"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "Двосмерни аналогни стерео"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "Двосмерни дигитални стерео (IEC958)"

commit b18e123c72d9414475aab7014d6af10afc3b33d9
Author: kmilos <kmilos at fedoraproject.org>
Date:   Fri Oct 30 23:18:50 2009 +0000

    Sending translation for Serbian (Latin)

diff --git a/po/sr at latin.po b/po/sr at latin.po
index e6945ad..45e83d6 100644
--- a/po/sr at latin.po
+++ b/po/sr at latin.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-16 22:10+0100\n"
+"POT-Creation-Date: 2009-10-30 10:22+0000\n"
+"PO-Revision-Date: 2009-10-30 22:51+0100\n"
 "Last-Translator: Miloš Komarčević <kmilos at gmail.com>\n"
 "Language-Team: Serbian (sr) <fedora-trans-sr at redhat.com>\n"
 "MIME-Version: 1.0\n"
@@ -2371,7 +2371,7 @@ msgstr "Snimanje visoke tačnosti (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2213
 msgid "Telephony Duplex (HSP/HFP)"
-msgstr "Dvostrano telefoniranje (HSP/HFP)"
+msgstr "Dvosmerno telefoniranje (HSP/HFP)"
 
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
@@ -2380,217 +2380,203 @@ msgstr "PulseAudio zvučni sistem"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "Izlazni uređaji"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "Ulazni uređaji"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "Audio na @HOSTNAME@"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "Ulaz"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "Ulaz priključne stanice"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "Mikrofon priključne stanice"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "Linija u"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "Mikrofon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "Spoljni mikrofon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "Unutrašnji zvuk"
+msgstr "Unutrašnji mikrofon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "Radio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "Video"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "Samostalna kontrola pojačanja"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "Bez samostalne kontrole pojačanja"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "Podizanje"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "Bez podizanja"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "Pojačalo"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "Bez pojačala"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "Analogni ulaz"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "Analogni mikrofon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "Analogna linija u"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "Analogni radio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "Analogni video"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "Prazan izlaz"
+msgstr "Analogni izlaz"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "Analogne slušalice"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "Analogni izlaz (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "Analogni mono izlaz"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "Analogni mono"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
-#, fuzzy
 msgid "Analog Stereo"
-msgstr "Stereo"
+msgstr "Analogni stereo"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "Okružujući 4.1"
+msgstr "Analogni okružujući 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "Okružujući 4.0"
+msgstr "Analogni okružujući 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "Okružujući 4.1"
+msgstr "Analogni okružujući 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
-#, fuzzy
 msgid "Analog Surround 4.0"
-msgstr "Okružujući 4.0"
+msgstr "Analogni okružujući 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
-#, fuzzy
 msgid "Analog Surround 4.1"
-msgstr "Okružujući 4.1"
+msgstr "Analogni okružujući 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
-#, fuzzy
 msgid "Analog Surround 5.0"
-msgstr "Okružujući 5.0"
+msgstr "Analogni okružujući 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
-#, fuzzy
 msgid "Analog Surround 5.1"
-msgstr "Okružujući 5.1"
+msgstr "Analogni okružujući 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "Okružujući 4.0"
+msgstr "Analogni okružujući 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "Okružujući 4.1"
+msgstr "Analogni okružujući 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "Okružujući 4.0"
+msgstr "Analogni okružujući 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
-#, fuzzy
 msgid "Analog Surround 7.1"
-msgstr "Okružujući 7.1"
+msgstr "Analogni okružujući 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "Digitalni stereo (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "Digitalni okružujući 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "Digitalni okružujući 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "Digitalni okružujući 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "Digitalni stereo (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "Dvosmerni analogni mono"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "Dvosmerni analogni stereo"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "Dvosmerni digitalni stereo (IEC958)"

commit 5778b16f954b8f9d511ae8da658be6520b6a3a57
Author: vpv <vpv at fedoraproject.org>
Date:   Mon Nov 9 13:04:10 2009 +0000

    Sending translation for Finnish

diff --git a/po/fi.po b/po/fi.po
index 515def3..13b5e15 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -1,14 +1,14 @@
-# pulseaudio translation to Finnish (fi).
+# pavucontrol Finnish (fi) translation.
 # Copyright (C) 2008 Timo Jyrinki
-# This file is distributed under the same license as the pulseaudio package.
-# Timo Jyrinki <timo.jyrinki at iki.fi>, 2008.
-# Ville-Pekka Vainio <vpivaini at cs.helsinki.fi>, 2009.
+# This file is distributed under the same license as the pavucontrol package.
+# Timo Jyrinki <timo.jyrinki at iki.fi>
+# Ville-Pekka Vainio <vpivaini at cs.helsinki.fi>, 2009
 msgid ""
 msgstr ""
 "Project-Id-Version: git trunk\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-15 13:24+0300\n"
+"POT-Creation-Date: 2009-11-09 09:45+0000\n"
+"PO-Revision-Date: 2009-11-09 15:03+0200\n"
 "Last-Translator: Ville-Pekka Vainio <vpivaini at cs.helsinki.fi>\n"
 "Language-Team: Finnish <laatu at lokalisointi.org>\n"
 "MIME-Version: 1.0\n"
@@ -16,2821 +16,388 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
-#, c-format
-msgid "%s %s"
-msgstr "%s %s"
-
-#: ../src/modules/alsa/alsa-util.c:1106
-#, c-format
-msgid ""
-"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
-"ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
-msgstr ""
-"snd_pcm_avail() palautti poikkeuksellisen suuren arvon: %lu tavua (%lu ms).\n"
-"Tämä on todennäköisesti ohjelmavirhe ALSA-ajurissa ”%s”. Ilmoita tästä "
-"ongelmasta ALSA-kehittäjille."
-
-#: ../src/modules/alsa/alsa-util.c:1147
-#, c-format
-msgid ""
-"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
-"lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
-msgstr ""
-"snd_pcm_delay() palautti poikkeuksellisen suuren arvon: %li tavua (%s%lu "
-"ms).\n"
-"Tämä on todennäköisesti ohjelmavirhe ALSA-ajurissa ”%s”. Ilmoita tästä "
-"ongelmasta ALSA-kehittäjille."
-
-#: ../src/modules/alsa/alsa-util.c:1194
-#, c-format
-msgid ""
-"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
-"(%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
-msgstr ""
-"snd_pcm_mmap_begin() palautti poikkeuksellisen suuren arvon: %lu tavua (%lu "
-"ms).\n"
-"Tämä on todennäköisesti ohjelmavirhe ALSA-ajurissa ”%s”. Ilmoita tästä "
-"ongelmasta ALSA-kehittäjille."
-
-#: ../src/modules/module-always-sink.c:39
-msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr "Pidä aina vähintään yksi nielu ladattuna, vaikka se olisi tyhjä nielu"
-
-#: ../src/modules/module-always-sink.c:83
-msgid "Dummy Output"
-msgstr "Valeulostulo"
-
-#: ../src/modules/module-ladspa-sink.c:49
-msgid "Virtual LADSPA sink"
-msgstr "Virtuaalinen LADSPA-nielu"
-
-#: ../src/modules/module-ladspa-sink.c:53
-msgid ""
-"sink_name=<name for the sink> sink_properties=<properties for the sink> "
-"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
-"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
-"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
-"input control values>"
-msgstr ""
-"sink_name=<nielun nimi> sink_properties=<nielun asetukset> "
-"master=<suodatettavan nielun nimi> format=<näytemuoto> "
-"rate=<näytteenottotaajuus> channels=<kanavien määrä> "
-"channel_map=<kanavakartta> plugin=<ladspa-liitännäisen nimi> label=<ladspa-"
-"liitännäisen nimiö (label)> control=<pilkulla erotettu luettelo "
-"syötteenhallinta-arvoja>"
-
-#: ../src/modules/module-null-sink.c:55
-msgid "Clocked NULL sink"
-msgstr "Kellotettu tyhjä nielu"
-
-#: ../src/modules/module-null-sink.c:291
-msgid "Null Output"
-msgstr "Tyhjä ulostulo"
-
-#: ../src/pulsecore/sink.c:2613
-msgid "Internal Audio"
-msgstr "Sisäinen äänentoisto"
-
-#: ../src/pulsecore/sink.c:2618
-msgid "Modem"
-msgstr "Modeemi"
-
-#: ../src/daemon/ltdl-bind-now.c:124
-msgid "Failed to find original lt_dlopen loader."
-msgstr "Alkuperäisen lt_dlopen-lataimen löytäminen epäonnistui."
-
-#: ../src/daemon/ltdl-bind-now.c:129
-msgid "Failed to allocate new dl loader."
-msgstr "Uuden dl-lataaminen varaaminen epäonnistui."
-
-#: ../src/daemon/ltdl-bind-now.c:142
-msgid "Failed to add bind-now-loader."
-msgstr "bind-now-loaderin lisääminen epäonnistui."
-
-#: ../src/daemon/main.c:141
-#, c-format
-msgid "Got signal %s."
-msgstr "Saatiin signaali %s."
-
-#: ../src/daemon/main.c:168
-msgid "Exiting."
-msgstr "Poistutaan."
-
-#: ../src/daemon/main.c:186
-#, c-format
-msgid "Failed to find user '%s'."
-msgstr "Käyttäjää ”%s” ei löydetty."
-
-#: ../src/daemon/main.c:191
-#, c-format
-msgid "Failed to find group '%s'."
-msgstr "Ryhmää ”%s” ei löydetty."
-
-#: ../src/daemon/main.c:195
-#, c-format
-msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
-msgstr "Löydettiin käyttäjä ”%s” (UID %lu) ja ryhmä ”%s” (GID %lu)."
-
-#: ../src/daemon/main.c:200
-#, c-format
-msgid "GID of user '%s' and of group '%s' don't match."
-msgstr "Käyttäjän ”%s” ja ryhmän ”%s” GID:t eivät vastaa toisiaan."
-
-#: ../src/daemon/main.c:205
-#, c-format
-msgid "Home directory of user '%s' is not '%s', ignoring."
-msgstr "Käyttäjän ”%s” kotihakemisto ei ole ”%s”, ohitetaan."
-
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
-#, c-format
-msgid "Failed to create '%s': %s"
-msgstr "Hakemiston ”%s” luominen epäonnistui: %s"
-
-#: ../src/daemon/main.c:220
-#, c-format
-msgid "Failed to change group list: %s"
-msgstr "Ryhmäluettelon vaihtaminen epäonnistui: %s"
-
-#: ../src/daemon/main.c:236
-#, c-format
-msgid "Failed to change GID: %s"
-msgstr "GID:n vaihtaminen epäonnistui: %s"
-
-#: ../src/daemon/main.c:252
-#, c-format
-msgid "Failed to change UID: %s"
-msgstr "UID:n vaihtaminen epäonnistui: %s"
-
-#: ../src/daemon/main.c:271
-msgid "Successfully dropped root privileges."
-msgstr "Root-oikeuksista luopuminen onnistui."
-
-#: ../src/daemon/main.c:279
-msgid "System wide mode unsupported on this platform."
-msgstr "Järjestelmänlaajuista tilaa ei tueta tällä alustalla."
-
-#: ../src/daemon/main.c:297
-#, c-format
-msgid "setrlimit(%s, (%u, %u)) failed: %s"
-msgstr "setrlimit(%s, (%u, %u)) epäonnistui: %s"
-
-#: ../src/daemon/main.c:474
-msgid "Failed to parse command line."
-msgstr "Komentorivin jäsentäminen epäonnistui."
-
-#: ../src/daemon/main.c:541
-msgid "Daemon not running"
-msgstr "Taustaprosessi ei ole käynnissä"
-
-#: ../src/daemon/main.c:543
-#, c-format
-msgid "Daemon running as PID %u"
-msgstr "Taustaprosessi käynnissä prosessitunnisteella %u"
-
-#: ../src/daemon/main.c:553
-#, c-format
-msgid "Failed to kill daemon: %s"
-msgstr "Taustaprosessin lopettaminen epäonnistui: %s"
-
-#: ../src/daemon/main.c:571
-msgid ""
-"This program is not intended to be run as root (unless --system is "
-"specified)."
-msgstr ""
-"Tätä ohjelmaa ei ole tarkoitettu suoritettavaksi pääkäyttäjänä (ellei --"
-"system ole määritelty)."
-
-#: ../src/daemon/main.c:573
-msgid "Root privileges required."
-msgstr "Pääkäyttäjän (root) oikeudet vaaditaan."
-
-#: ../src/daemon/main.c:578
-msgid "--start not supported for system instances."
-msgstr "--start-valitsinta ei tueta järjestelmätilassa."
-
-#: ../src/daemon/main.c:583
-msgid "Running in system mode, but --disallow-exit not set!"
-msgstr ""
-"Suoritetaan järjestelmätilassa, mutta --disallow-exit ei ole asetettuna!"
-
-#: ../src/daemon/main.c:586
-msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr ""
-"Suoritetaan järjestelmätilassa, mutta -disallow-module-loading ei ole "
-"asetettuna!"
-
-#: ../src/daemon/main.c:589
-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:594
-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:621
-msgid "Failed to acquire stdio."
-msgstr "stdio:n saaminen epäonnistui."
-
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
-msgstr "putki epäonnistui: %s"
-
-#: ../src/daemon/main.c:632
-#, c-format
-msgid "fork() failed: %s"
-msgstr "fork() epäonnistui: %s"
-
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
-#, c-format
-msgid "read() failed: %s"
-msgstr "read() epäonnistui: %s"
-
-#: ../src/daemon/main.c:652
-msgid "Daemon startup failed."
-msgstr "Taustaprosessin käynnistys epäonnistui."
-
-#: ../src/daemon/main.c:654
-msgid "Daemon startup successful."
-msgstr "Taustaprosessin käynnistys onnistui."
-
-#: ../src/daemon/main.c:731
-#, c-format
-msgid "This is PulseAudio %s"
-msgstr "Tämä on PulseAudio %s"
-
-#: ../src/daemon/main.c:732
-#, c-format
-msgid "Compilation host: %s"
-msgstr "Käännöksen isäntäkone: %s"
-
-#: ../src/daemon/main.c:733
-#, c-format
-msgid "Compilation CFLAGS: %s"
-msgstr "Käännösaikaiset C-liput (CFLAGS): %s"
-
-#: ../src/daemon/main.c:736
-#, c-format
-msgid "Running on host: %s"
-msgstr "Käynnissä isäntäkoneella: %s"
-
-#: ../src/daemon/main.c:739
-#, c-format
-msgid "Found %u CPUs."
-msgstr "Löydettiin %u CPU:ta."
-
-#: ../src/daemon/main.c:741
-#, c-format
-msgid "Page size is %lu bytes"
-msgstr "Sivun koko on %lu tavua"
-
-#: ../src/daemon/main.c:744
-msgid "Compiled with Valgrind support: yes"
-msgstr "Käännetty Valgrind-tuella: kyllä"
-
-#: ../src/daemon/main.c:746
-msgid "Compiled with Valgrind support: no"
-msgstr "Käännetty Valgrind-tuella: ei"
-
-#: ../src/daemon/main.c:749
-#, c-format
-msgid "Running in valgrind mode: %s"
-msgstr "Käynnissä valgrind-tilassa: %s"
-
-#: ../src/daemon/main.c:752
-msgid "Optimized build: yes"
-msgstr "Optimoitu rakentaminen: kyllä"
-
-#: ../src/daemon/main.c:754
-msgid "Optimized build: no"
-msgstr "Optimoitu rakentaminen: ei"
-
-#: ../src/daemon/main.c:758
-msgid "NDEBUG defined, all asserts disabled."
-msgstr "NDEBUG on määritelty, kaikki assertit ovat poissa käytöstä."
-
-#: ../src/daemon/main.c:760
-msgid "FASTPATH defined, only fast path asserts disabled."
-msgstr "FASTPATH on määritelty, vain fast path -assertit ovat poissa käytöstä."
-
-#: ../src/daemon/main.c:762
-msgid "All asserts enabled."
-msgstr "Kaikki assertit ovat käytössä."
-
-#: ../src/daemon/main.c:766
-msgid "Failed to get machine ID"
-msgstr "Konetunnisteen nouto epäonnistui"
-
-#: ../src/daemon/main.c:769
-#, c-format
-msgid "Machine ID is %s."
-msgstr "Konetunniste on %s."
-
-#: ../src/daemon/main.c:773
-#, c-format
-msgid "Session ID is %s."
-msgstr "Istunnon tunniste on %s."
-
-#: ../src/daemon/main.c:779
-#, c-format
-msgid "Using runtime directory %s."
-msgstr "Käytetään ajonaikaista hakemistoa %s."
-
-#: ../src/daemon/main.c:784
-#, c-format
-msgid "Using state directory %s."
-msgstr "Käytetään tilahakemistoa %s."
-
-#: ../src/daemon/main.c:787
-#, c-format
-msgid "Using modules directory %s."
-msgstr "Käytetään moduulihakemistoa %s."
-
-#: ../src/daemon/main.c:789
-#, c-format
-msgid "Running in system mode: %s"
-msgstr "Suoritetaan järjestelmätilassa: %s"
-
-#: ../src/daemon/main.c:792
-msgid ""
-"OK, so you are running PA in system mode. Please note that you most likely "
-"shouldn't be doing that.\n"
-"If you do it nonetheless then it's your own fault if things don't work as "
-"expected.\n"
-"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
-"explanation why system mode is usually a bad idea."
-msgstr ""
-"PA:ta suoritetaan järjestelmätilassa. Näin ei luultavasti pitäisi tehdä.\n"
-"Jos silti teet näin, on sinun vikasi jos kaikki ei toimikaan odotetusti.\n"
-"Lisätietoja siitä, miksi järjestelmätilan käyttäminen on yleensä huono "
-"ajatus on osoitteessa http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode"
-
-#: ../src/daemon/main.c:809
-msgid "pa_pid_file_create() failed."
-msgstr "pa_pid_file_create() epäonnistui."
-
-#: ../src/daemon/main.c:819
-msgid "Fresh high-resolution timers available! Bon appetit!"
-msgstr "Korkean tarkkuuden ajastimet käytettävissä."
-
-#: ../src/daemon/main.c:821
-msgid ""
-"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
-"resolution timers enabled!"
-msgstr ""
-"Hei, ytimesi on kehno! Linux korkean tarkkuuden ajastimien tuella on hyvin "
-"suositeltava!"
-
-#: ../src/daemon/main.c:844
-msgid "pa_core_new() failed."
-msgstr "pa_core_new() epäonnistui."
-
-#: ../src/daemon/main.c:904
-msgid "Failed to initialize daemon."
-msgstr "Taustaprosessin alustus epäonnistui."
-
-#: ../src/daemon/main.c:909
-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:926
-msgid "Daemon startup complete."
-msgstr "Taustaprosessin käynnistys valmis."
-
-#: ../src/daemon/main.c:932
-msgid "Daemon shutdown initiated."
-msgstr "Taustaprosessin sulkeminen käynnistetty."
-
-#: ../src/daemon/main.c:954
-msgid "Daemon terminated."
-msgstr "Taustaprosessi lopetettu."
-
-#: ../src/daemon/cmdline.c:115
-#, c-format
-msgid ""
-"%s [options]\n"
-"\n"
-"COMMANDS:\n"
-"  -h, --help                            Show this help\n"
-"      --version                         Show version\n"
-"      --dump-conf                       Dump default configuration\n"
-"      --dump-modules                    Dump list of available modules\n"
-"      --dump-resample-methods           Dump available resample methods\n"
-"      --cleanup-shm                     Cleanup stale shared memory "
-"segments\n"
-"      --start                           Start the daemon if it is not "
-"running\n"
-"  -k  --kill                            Kill a running daemon\n"
-"      --check                           Check for a running daemon (only "
-"returns exit code)\n"
-"\n"
-"OPTIONS:\n"
-"      --system[=BOOL]                   Run as system-wide instance\n"
-"  -D, --daemonize[=BOOL]                Daemonize after startup\n"
-"      --fail[=BOOL]                     Quit when startup fails\n"
-"      --high-priority[=BOOL]            Try to set high nice level\n"
-"                                        (only available as root, when SUID "
-"or\n"
-"                                        with elevated RLIMIT_NICE)\n"
-"      --realtime[=BOOL]                 Try to enable realtime scheduling\n"
-"                                        (only available as root, when SUID "
-"or\n"
-"                                        with elevated RLIMIT_RTPRIO)\n"
-"      --disallow-module-loading[=BOOL]  Disallow module user requested "
-"module\n"
-"                                        loading/unloading after startup\n"
-"      --disallow-exit[=BOOL]            Disallow user requested exit\n"
-"      --exit-idle-time=SECS             Terminate the daemon when idle and "
-"this\n"
-"                                        time passed\n"
-"      --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"
-"                                        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-time[=BOOL]                 Include timestamps in log messages\n"
-"      --log-backtrace=FRAMES            Include a backtrace in log messages\n"
-"  -p, --dl-search-path=PATH             Set the search path for dynamic "
-"shared\n"
-"                                        objects (plugins)\n"
-"      --resample-method=METHOD          Use the specified resampling method\n"
-"                                        (See --dump-resample-methods for\n"
-"                                        possible values)\n"
-"      --use-pid-file[=BOOL]             Create a PID file\n"
-"      --no-cpu-limit[=BOOL]             Do not install CPU load limiter on\n"
-"                                        platforms that support it.\n"
-"      --disable-shm[=BOOL]              Disable shared memory support.\n"
-"\n"
-"STARTUP SCRIPT:\n"
-"  -L, --load=\"MODULE ARGUMENTS\"         Load the specified plugin module "
-"with\n"
-"                                        the specified argument\n"
-"  -F, --file=FILENAME                   Run the specified script\n"
-"  -C                                    Open a command line on the running "
-"TTY\n"
-"                                        after startup\n"
-"\n"
-"  -n                                    Don't load default script file\n"
-msgstr ""
-"%s [valitsimet]\n"
-"\n"
-"KOMENNOT:\n"
-"  -h, --help                            Näytä tämä ohje\n"
-"      --version                         Näytä versio\n"
-"      --dump-conf                       Tulosta oletusasetukset\n"
-"      --dump-modules                    Tulosta saatavilla olevien\n"
-"                                        moduulien luettelo\n"
-"      --dump-resample-methods           Tulosta saatavilla\n"
-"                                        olevat\n"
-"                                        uudelleennäytteistystavat\n"
-"      --cleanup-shm                     Puhdista vanhentuneet jaetun\n"
-"                                        muistin segmentit\n"
-"      --start                           Käynnistä taustaprosessi, jos se\n"
-"                                        ei ole käynnissä\n"
-"  -k  --kill                            Tapa suoritettava taustaprosessi\n"
-"      --check                           Tarkista onko\n"
-"                                        taustaprosessi suoritettavana\n"
-"                                        (palauttaa vain lopetuskoodin)\n"
-"\n"
-"VALITSIMET:\n"
-"      --system[=BOOL]                   Suorita järjestelmänlaajuisena\n"
-"  -D, --daemonize[=BOOL]                Vaihda\n"
-"                                        taustaprosessiksi käynnistyksen\n"
-"                                        jälkeen\n"
-"      --fail[=BOOL]                     Lopeta kun käynnistys epäonnistuu\n"
-"      --high-priority[=BOOL]            Yritä asettaa korkea nice-taso\n"
-"                                        (käytettävissä vain root-\n"
-"                                        käyttäjänä, SUIDilla tai\n"
-"                                        kohotetulla RLIMIT_NICE-arvolla)\n"
-"      --realtime[=BOOL]                 Yritä asettaa reaaliaikainen\n"
-"                                        ajoitus (käytettävissä vain\n"
-"                                        root-käyttäjänä, SUIDilla tai\n"
-"                                        kohotetulla RLIMIT_RTPRIO-arvolla)\n"
-"      --disallow-module-loading[=BOOL]  Kiellä käyttäjän pyytämä moduulin\n"
-"                                        lataus tai poisto käynnistyksen\n"
-"                                        jälkeen\n"
-"      --disallow-exit[=BOOL]            Kiellä käyttäjän pyytämä\n"
-"                                        lopettaminen\n"
-"      --exit-idle-time=SEK              Lopeta taustaprosessi, kun se on\n"
-"                                        toimettomana ja tämä aika on\n"
-"                                        kulunut\n"
-"      --module-idle-time=SEK            Poista automaattisesti ladatut\n"
-"                                        moduulit, kun taustaprosessi on\n"
-"                                        toimettomana ja tämä aika on\n"
-"                                        kulunut\n"
-"      --scache-idle-time=SEK            Poista automaattisesti ladatut\n"
-"                                        näytteet, kun taustaprosessi on\n"
-"                                        toimettomana ja tämä aika on\n"
-"                                        kulunut\n"
-"      --log-level[=TASO]                Aseta tai kasvata\n"
-"                                        lokikirjoituksen tasoa\n"
-"  -v                                    Kasvata tulosteiden\n"
-"                                        yksityiskohtaisuutta\n"
-"      --log-target={auto,syslog,stderr} Aseta lokikirjoituksen kohde\n"
-"      --log-meta[=BOOL]                 Lisää koodikohta\n"
-"                                        lokiviesteihin\n"
-"      --log-time[=BOOL]                 Lisää aikaleima lokiviesteihin\n"
-"      --log-backtrace=KEHYKSET          Lisää pinolistaus lokiviesteihin\n"
-"  -p, --dl-search-path=POLKU            Aseta dynaamisten jaettujen\n"
-"                                        objektien (liitännäisten)\n"
-"                                        hakupolku\n"
-"      --resample-method=TAPA            Käytä määritettyä\n"
-"                                        uudelleennäytteistyksen tapaa\n"
-"                                        (--dump-resample-methods\n"
-"                                        luetteloi mahdolliset arvot)\n"
-"      --use-pid-file[=BOOL]             Luo PID-tiedosto\n"
-"      --no-cpu-limit[=BOOL]             Älä asenna suoritinkuorman\n"
-"                                        rajoitinta alustoilla, jotka\n"
-"                                        tukevat sitä\n"
-"      --disable-shm[=BOOL]              Poista jaetun muistin tuki käytöstä\n"
-"\n"
-"ALOITUSKOMENTOSARJA:\n"
-"  -L, --load=\"MODUULIN ARGUMENTIT\"    Lataa liitännäismoduuli annetulla\n"
-"                                        argumentilla\n"
-"  -F, --file=TIEDOSTO                   Suorita annettu komentosarja\n"
-"  -C                                    Avaa komentokehote nykyiseen\n"
-"                                        päätteeseen käynnistyksen jälkeen\n"
-"\n"
-"  -n                                    Älä lataa oletuskomentosarja-\n"
-"                                        tiedostoa\n"
-
-#: ../src/daemon/cmdline.c:247
-msgid "--daemonize expects boolean argument"
-msgstr "--daemonize vaatii totuusarvoisen argumentin"
-
-#: ../src/daemon/cmdline.c:254
-msgid "--fail expects boolean argument"
-msgstr "--fail vaatii totuusarvoisen argumentin"
-
-#: ../src/daemon/cmdline.c:264
-msgid ""
-"--log-level expects log level argument (either numeric in range 0..4 or one "
-"of debug, info, notice, warn, error)."
-msgstr ""
-"--log-level vaatii lokikirjoituksen tason argumentiksi (joko numero väliltä "
-"0..4 tai yksi seuraavista: debug, info, notice, warn, error)."
-
-#: ../src/daemon/cmdline.c:276
-msgid "--high-priority expects boolean argument"
-msgstr "--high-priority vaatii totuusarvoisen argumentin"
-
-#: ../src/daemon/cmdline.c:283
-msgid "--realtime expects boolean argument"
-msgstr "--realtime vaatii totuusarvoisen argumentin"
-
-#: ../src/daemon/cmdline.c:290
-msgid "--disallow-module-loading expects boolean argument"
-msgstr "--disallow-module-loading vaatii totuusarvoisen argumentin"
-
-#: ../src/daemon/cmdline.c:297
-msgid "--disallow-exit expects boolean argument"
-msgstr "--disallow-exit vaatii totuusarvoisen argumentin"
-
-#: ../src/daemon/cmdline.c:304
-msgid "--use-pid-file expects boolean argument"
-msgstr "--use-pid-file vaatii totuusarvoisen argumentin"
-
-#: ../src/daemon/cmdline.c:321
-msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
-msgstr ""
-"Virheellinen lokikirjoituksen kohde: käytä jotain seuraavista: ”syslog”, "
-"”stderr” tai ”auto”."
-
-#: ../src/daemon/cmdline.c:328
-msgid "--log-time expects boolean argument"
-msgstr "--log-time vaatii totuusarvoisen argumentin"
-
-#: ../src/daemon/cmdline.c:335
-msgid "--log-meta expects boolean argument"
-msgstr "--log-meta vaatii totuusarvoisen argumentin"
-
-#: ../src/daemon/cmdline.c:354
-#, c-format
-msgid "Invalid resample method '%s'."
-msgstr "Virheellinen uudelleennäytteistyksen tapa ”%s”."
-
-#: ../src/daemon/cmdline.c:361
-msgid "--system expects boolean argument"
-msgstr "--system vaatii totuusarvoisen argumentin"
-
-#: ../src/daemon/cmdline.c:368
-msgid "--no-cpu-limit expects boolean argument"
-msgstr "--no-cpu-limit vaatii totuusarvoisen argumentin"
-
-#: ../src/daemon/cmdline.c:375
-msgid "--disable-shm expects boolean argument"
-msgstr "--disable-shm vaatii totuusarvoisen argumentin"
-
-#: ../src/daemon/dumpmodules.c:60
-#, c-format
-msgid "Name: %s\n"
-msgstr "Nimi: %s\n"
-
-#: ../src/daemon/dumpmodules.c:63
-#, c-format
-msgid "No module information available\n"
-msgstr "Moduulitietoja ei saatavilla\n"
-
-#: ../src/daemon/dumpmodules.c:66
-#, c-format
-msgid "Version: %s\n"
-msgstr "Versio: %s\n"
-
-#: ../src/daemon/dumpmodules.c:68
-#, c-format
-msgid "Description: %s\n"
-msgstr "Kuvaus: %s\n"
-
-#: ../src/daemon/dumpmodules.c:70
-#, c-format
-msgid "Author: %s\n"
-msgstr "Tekijä: %s\n"
-
-#: ../src/daemon/dumpmodules.c:72
-#, c-format
-msgid "Usage: %s\n"
-msgstr "Käyttö: %s\n"
-
-#: ../src/daemon/dumpmodules.c:73
-#, c-format
-msgid "Load Once: %s\n"
-msgstr "Lataa kerran: %s\n"
-
-#: ../src/daemon/dumpmodules.c:75
-#, c-format
-msgid "DEPRECATION WARNING: %s\n"
-msgstr "VAROITUS VANHENTUNEISUUDESTA: %s\n"
-
-#: ../src/daemon/dumpmodules.c:79
-#, c-format
-msgid "Path: %s\n"
-msgstr "Polku: %s\n"
-
-#: ../src/daemon/daemon-conf.c:232
-#, c-format
-msgid "[%s:%u] Invalid log target '%s'."
-msgstr "[%s:%u] Virheellinen lokikirjoituksen kohde ”%s”."
-
-#: ../src/daemon/daemon-conf.c:248
-#, c-format
-msgid "[%s:%u] Invalid log level '%s'."
-msgstr "[%s:%u] Virheellinen lokikirjoituksen taso ”%s”."
-
-#: ../src/daemon/daemon-conf.c:264
-#, c-format
-msgid "[%s:%u] Invalid resample method '%s'."
-msgstr "[%s:%u] Virheellinen uudelleennäytteistyksen tapa ”%s”."
-
-#: ../src/daemon/daemon-conf.c:287
-#, c-format
-msgid "[%s:%u] Invalid rlimit '%s'."
-msgstr "[%s:%u] Virheellinen rlimit ”%s”."
-
-#: ../src/daemon/daemon-conf.c:294
-#, c-format
-msgid "[%s:%u] rlimit not supported on this platform."
-msgstr "[%s:%u] rlimitiä ei tueta tällä alustalla."
-
-#: ../src/daemon/daemon-conf.c:310
-#, c-format
-msgid "[%s:%u] Invalid sample format '%s'."
-msgstr "[%s:%u] Virheellinen näytemuoto ”%s”."
-
-#: ../src/daemon/daemon-conf.c:328
-#, c-format
-msgid "[%s:%u] Invalid sample rate '%s'."
-msgstr "[%s:%u] Virheellinen näytteenottotaajuus ”%s”."
-
-#: ../src/daemon/daemon-conf.c:352
-#, c-format
-msgid "[%s:%u] Invalid sample channels '%s'."
-msgstr "[%s:%u] Virheelliset näytekanavat ”%s”."
-
-#: ../src/daemon/daemon-conf.c:370
-#, c-format
-msgid "[%s:%u] Invalid channel map '%s'."
-msgstr "[%s:%u] Virheellinen kanavakartta ”%s”."
-
-#: ../src/daemon/daemon-conf.c:388
-#, c-format
-msgid "[%s:%u] Invalid number of fragments '%s'."
-msgstr "[%s:%u] Virheellinen fragmenttimäärä ”%s”."
-
-#: ../src/daemon/daemon-conf.c:406
-#, c-format
-msgid "[%s:%u] Invalid fragment size '%s'."
-msgstr "[%s:%u] Virheellinen fragmenttikoko ”%s”."
-
-#: ../src/daemon/daemon-conf.c:424
-#, c-format
-msgid "[%s:%u] Invalid nice level '%s'."
-msgstr "[%s:%u] Virheellinen nice-taso ”%s”."
-
-#: ../src/daemon/daemon-conf.c:546
-#, c-format
-msgid "Failed to open configuration file: %s"
-msgstr "Asetustiedoston avaaminen epäonnistui: %s"
-
-#: ../src/daemon/daemon-conf.c:562
-msgid ""
-"The specified default channel map has a different number of channels than "
-"the specified default number of channels."
-msgstr ""
-"Kanavien oletusmäärä ja oletuskanavakartan kanavien määrä poikkeavat "
-"toisistaan."
-
-#: ../src/daemon/daemon-conf.c:638
-#, c-format
-msgid "### Read from configuration file: %s ###\n"
-msgstr "### Luettu asetustiedostosta: %s ###\n"
-
-#: ../src/daemon/caps.c:62
-msgid "Cleaning up privileges."
-msgstr "Luovutaan oikeuksista."
-
-#: ../src/daemon/pulseaudio.desktop.in.h:1
-msgid "PulseAudio Sound System"
-msgstr "PulseAudio-äänijärjestelmä"
-
-#: ../src/daemon/pulseaudio.desktop.in.h:2
-msgid "Start the PulseAudio Sound System"
-msgstr "Käynnistä PulseAudio-äänijärjestelmä"
-
-#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757
-msgid "Mono"
-msgstr "Mono"
-
-#: ../src/pulse/channelmap.c:107
-msgid "Front Center"
-msgstr "Keski"
-
-#: ../src/pulse/channelmap.c:108
-msgid "Front Left"
-msgstr "Vasen etu"
-
-#: ../src/pulse/channelmap.c:109
-msgid "Front Right"
-msgstr "Oikea etu"
-
-#: ../src/pulse/channelmap.c:111
-msgid "Rear Center"
-msgstr "Takakeski"
-
-#: ../src/pulse/channelmap.c:112
-msgid "Rear Left"
-msgstr "Vasen taka"
-
-#: ../src/pulse/channelmap.c:113
-msgid "Rear Right"
-msgstr "Oikea taka"
-
-#: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Alataajuus"
-
-#: ../src/pulse/channelmap.c:117
-msgid "Front Left-of-center"
-msgstr "Vasemmalle keskeltä etu"
-
-#: ../src/pulse/channelmap.c:118
-msgid "Front Right-of-center"
-msgstr "Oikealle keskeltä etu"
-
-#: ../src/pulse/channelmap.c:120
-msgid "Side Left"
-msgstr "Vasen sivu"
-
-#: ../src/pulse/channelmap.c:121
-msgid "Side Right"
-msgstr "Oikea sivu"
-
-#: ../src/pulse/channelmap.c:123
-msgid "Auxiliary 0"
-msgstr "Avustava 0"
-
-#: ../src/pulse/channelmap.c:124
-msgid "Auxiliary 1"
-msgstr "Avustava 1"
-
-#: ../src/pulse/channelmap.c:125
-msgid "Auxiliary 2"
-msgstr "Avustava 2"
-
-#: ../src/pulse/channelmap.c:126
-msgid "Auxiliary 3"
-msgstr "Avustava 3"
-
-#: ../src/pulse/channelmap.c:127
-msgid "Auxiliary 4"
-msgstr "Avustava 4"
-
-#: ../src/pulse/channelmap.c:128
-msgid "Auxiliary 5"
-msgstr "Avustava 5"
-
-#: ../src/pulse/channelmap.c:129
-msgid "Auxiliary 6"
-msgstr "Avustava 6"
-
-#: ../src/pulse/channelmap.c:130
-msgid "Auxiliary 7"
-msgstr "Avustava 7"
-
-#: ../src/pulse/channelmap.c:131
-msgid "Auxiliary 8"
-msgstr "Avustava 8"
-
-#: ../src/pulse/channelmap.c:132
-msgid "Auxiliary 9"
-msgstr "Avustava 9"
-
-#: ../src/pulse/channelmap.c:133
-msgid "Auxiliary 10"
-msgstr "Avustava 10"
-
-#: ../src/pulse/channelmap.c:134
-msgid "Auxiliary 11"
-msgstr "Avustava 11"
-
-#: ../src/pulse/channelmap.c:135
-msgid "Auxiliary 12"
-msgstr "Avustava 12"
-
-#: ../src/pulse/channelmap.c:136
-msgid "Auxiliary 13"
-msgstr "Avustava 13"
-
-#: ../src/pulse/channelmap.c:137
-msgid "Auxiliary 14"
-msgstr "Avustava 14"
-
-#: ../src/pulse/channelmap.c:138
-msgid "Auxiliary 15"
-msgstr "Avustava 15"
-
-#: ../src/pulse/channelmap.c:139
-msgid "Auxiliary 16"
-msgstr "Avustava 16"
-
-#: ../src/pulse/channelmap.c:140
-msgid "Auxiliary 17"
-msgstr "Avustava 17"
-
-#: ../src/pulse/channelmap.c:141
-msgid "Auxiliary 18"
-msgstr "Avustava 18"
-
-#: ../src/pulse/channelmap.c:142
-msgid "Auxiliary 19"
-msgstr "Avustava 19"
-
-#: ../src/pulse/channelmap.c:143
-msgid "Auxiliary 20"
-msgstr "Avustava 20"
-
-#: ../src/pulse/channelmap.c:144
-msgid "Auxiliary 21"
-msgstr "Avustava 21"
-
-#: ../src/pulse/channelmap.c:145
-msgid "Auxiliary 22"
-msgstr "Avustava 22"
-
-#: ../src/pulse/channelmap.c:146
-msgid "Auxiliary 23"
-msgstr "Avustava 23"
-
-#: ../src/pulse/channelmap.c:147
-msgid "Auxiliary 24"
-msgstr "Avustava 24"
-
-#: ../src/pulse/channelmap.c:148
-msgid "Auxiliary 25"
-msgstr "Avustava 25"
-
-#: ../src/pulse/channelmap.c:149
-msgid "Auxiliary 26"
-msgstr "Avustava 26"
-
-#: ../src/pulse/channelmap.c:150
-msgid "Auxiliary 27"
-msgstr "Avustava 27"
-
-#: ../src/pulse/channelmap.c:151
-msgid "Auxiliary 28"
-msgstr "Avustava 28"
-
-#: ../src/pulse/channelmap.c:152
-msgid "Auxiliary 29"
-msgstr "Avustava 29"
-
-#: ../src/pulse/channelmap.c:153
-msgid "Auxiliary 30"
-msgstr "Avustava 30"
-
-#: ../src/pulse/channelmap.c:154
-msgid "Auxiliary 31"
-msgstr "Avustava 31"
-
-#: ../src/pulse/channelmap.c:156
-msgid "Top Center"
-msgstr "Keski ylä"
-
-#: ../src/pulse/channelmap.c:158
-msgid "Top Front Center"
-msgstr "Keski ylä etu"
-
-#: ../src/pulse/channelmap.c:159
-msgid "Top Front Left"
-msgstr "Vasen ylä etu"
-
-#: ../src/pulse/channelmap.c:160
-msgid "Top Front Right"
-msgstr "Oikea ylä etu"
-
-#: ../src/pulse/channelmap.c:162
-msgid "Top Rear Center"
-msgstr "Keski ylä taka"
-
-#: ../src/pulse/channelmap.c:163
-msgid "Top Rear Left"
-msgstr "Vasen ylä taka"
-
-#: ../src/pulse/channelmap.c:164
-msgid "Top Rear Right"
-msgstr "Oikea ylä taka"
-
-#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170
-#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321
-#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371
-msgid "(invalid)"
-msgstr "(virheellinen)"
-
-#: ../src/pulse/channelmap.c:761
-msgid "Stereo"
-msgstr "Stereo"
-
-#: ../src/pulse/channelmap.c:766
-msgid "Surround 4.0"
-msgstr "4.0-tilaääni"
-
-#: ../src/pulse/channelmap.c:772
-msgid "Surround 4.1"
-msgstr "4.1-tilaääni"
-
-#: ../src/pulse/channelmap.c:778
-msgid "Surround 5.0"
-msgstr "5.0-tilaääni"
-
-#: ../src/pulse/channelmap.c:784
-msgid "Surround 5.1"
-msgstr "5.1-tilaääni"
-
-#: ../src/pulse/channelmap.c:791
-msgid "Surround 7.1"
-msgstr "7.1-tilaääni"
-
-#: ../src/pulse/error.c:43
-msgid "OK"
-msgstr "OK"
-
-#: ../src/pulse/error.c:44
-msgid "Access denied"
-msgstr "Pääsy evätty"
-
-#: ../src/pulse/error.c:45
-msgid "Unknown command"
-msgstr "Tuntematon komento"
-
-#: ../src/pulse/error.c:46
-msgid "Invalid argument"
-msgstr "Virheellinen argumentti"
-
-#: ../src/pulse/error.c:47
-msgid "Entity exists"
-msgstr "Entiteetti on jo olemassa"
-
-#: ../src/pulse/error.c:48
-msgid "No such entity"
-msgstr "Ei kyseisenlaista entiteettiä"
-
-#: ../src/pulse/error.c:49
-msgid "Connection refused"
-msgstr "Yhteys hylätty"
-
-#: ../src/pulse/error.c:50
-msgid "Protocol error"
-msgstr "Yhteyskäytäntövirhe"
-
-#: ../src/pulse/error.c:51
-msgid "Timeout"
-msgstr "Aikakatkaisu"
-
-#: ../src/pulse/error.c:52
-msgid "No authorization key"
-msgstr "Ei todentamisavainta"
-
-#: ../src/pulse/error.c:53
-msgid "Internal error"
-msgstr "Sisäinen virhe"
-
-#: ../src/pulse/error.c:54
-msgid "Connection terminated"
-msgstr "Yhteys katkennut"
-
-#: ../src/pulse/error.c:55
-msgid "Entity killed"
-msgstr "Entiteetti lopetettu"
-
-#: ../src/pulse/error.c:56
-msgid "Invalid server"
-msgstr "Virheellinen palvelin"
-
-#: ../src/pulse/error.c:57
-msgid "Module initalization failed"
-msgstr "Moduulin alustus epäonnistui"
-
-#: ../src/pulse/error.c:58
-msgid "Bad state"
-msgstr "Virheellinen tila"
-
-#: ../src/pulse/error.c:59
-msgid "No data"
-msgstr "Ei dataa"
-
-#: ../src/pulse/error.c:60
-msgid "Incompatible protocol version"
-msgstr "Epäyhteensopiva yhteyskäytännön versio"
-
-#: ../src/pulse/error.c:61
-msgid "Too large"
-msgstr "Liian suuri"
-
-#: ../src/pulse/error.c:62
-msgid "Not supported"
-msgstr "Ei tuettu"
-
-#: ../src/pulse/error.c:63
-msgid "Unknown error code"
-msgstr "Tuntematon virhekoodi"
-
-#: ../src/pulse/error.c:64
-msgid "No such extension"
-msgstr "Ei kyseisenlaista laajennusta"
-
-#: ../src/pulse/error.c:65
-msgid "Obsolete functionality"
-msgstr "Puuttuva toiminnallisuus"
+#: ../src/pavucontrol.desktop.in.h:1
+msgid "Adjust the volume level"
+msgstr "Säädä äänenvoimakkuutta"
 
-#: ../src/pulse/error.c:66
-msgid "Missing implementation"
-msgstr "Puuttuva toteutus"
+#: ../src/pavucontrol.desktop.in.h:2 ../src/pavucontrol.cc:476
+msgid "PulseAudio Volume Control"
+msgstr "PulseAudion äänenvoimakkuuden hallinta"
 
-#: ../src/pulse/error.c:67
-msgid "Client forked"
-msgstr "Asiakasohjelma haarautui"
+#: ../src/pavucontrol.desktop.in.h:3 ../src/pavucontrol.glade.h:32
+msgid "Volume Control"
+msgstr "Äänenvoimakkuus"
 
-#: ../src/pulse/error.c:68
-msgid "Input/Output error"
-msgstr "Siirräntävirhe"
+#: ../src/pavucontrol.glade.h:2
+#, no-c-format
+msgid "50%"
+msgstr "50%"
 
-#: ../src/pulse/error.c:69
-msgid "Device or resource busy"
-msgstr "Laite tai resurssi on varattu"
+#: ../src/pavucontrol.glade.h:3
+msgid "<b>Port:</b>"
+msgstr "<b>Portti:</b>"
 
-#: ../src/pulse/sample.c:172
-#, c-format
-msgid "%s %uch %uHz"
-msgstr "%s %u kan. %uHz"
-
-#: ../src/pulse/sample.c:184
-#, c-format
-msgid "%0.1f GiB"
-msgstr "%0.1f GiB"
-
-#: ../src/pulse/sample.c:186
-#, c-format
-msgid "%0.1f MiB"
-msgstr "%0.1f MiB"
-
-#: ../src/pulse/sample.c:188
-#, c-format
-msgid "%0.1f KiB"
-msgstr "%0.1f KiB"
-
-#: ../src/pulse/sample.c:190
-#, c-format
-msgid "%u B"
-msgstr "%u B"
+#: ../src/pavucontrol.glade.h:4
+msgid "<b>Profile:</b>"
+msgstr "<b>Profiili:</b>"
 
-#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100
-msgid "XOpenDisplay() failed"
-msgstr "XOpenDisplay() epäonnistui"
+#: ../src/pavucontrol.glade.h:5
+msgid "<b>S_how:</b>"
+msgstr "<b>N_äytä:</b>"
 
-#: ../src/pulse/client-conf-x11.c:93
-msgid "Failed to parse cookie data"
-msgstr "Evästetietojen jäsennys epäonnistui"
+#: ../src/pavucontrol.glade.h:6
+msgid "<b>Sho_w:</b>"
+msgstr "<b>Nä_ytä:</b>"
 
-#: ../src/pulse/client-conf.c:111
-#, c-format
-msgid "Failed to open configuration file '%s': %s"
-msgstr "Asetustiedoston avaaminen epäonnistui: ”%s”: %s"
+#: ../src/pavucontrol.glade.h:7
+msgid "<b>_Show:</b>"
+msgstr "<b>_Näytä:</b>"
 
-#: ../src/pulse/context.c:550
-msgid "No cookie loaded. Attempting to connect without."
-msgstr "Ei ladattua evästettä. Yritetään yhdistämistä ilman."
+#: ../src/pavucontrol.glade.h:8
+msgid "<b>left-front</b>"
+msgstr "<b>vasen-etu</b>"
 
-#: ../src/pulse/context.c:693
-#, c-format
-msgid "fork(): %s"
-msgstr "fork(): %s"
+#: ../src/pavucontrol.glade.h:9
+msgid "<i>No application is currently playing audio.</i>"
+msgstr "<i>Yksikään sovellus ei tällä hetkellä toista ääntä.</i>"
 
-#: ../src/pulse/context.c:748
-#, c-format
-msgid "waitpid(): %s"
-msgstr "waitpid(): %s"
+#: ../src/pavucontrol.glade.h:10
+msgid "<i>No application is currently recording audio.</i>"
+msgstr "<i>Yksikään sovellus ei tällä hetkellä nauhoita ääntä.</i>"
 
-#: ../src/pulse/context.c:1438
-#, c-format
-msgid "Received message for unknown extension '%s'"
-msgstr "Saatiin viesti tuntemattomalle laajennokselle ”%s”"
+#: ../src/pavucontrol.glade.h:11
+msgid "<i>No cards available for configuration</i>"
+msgstr "<i>Yhtäkään äänikorttia ei ole käytettävissä</i>"
 
-#: ../src/utils/pacat.c:108
-#, c-format
-msgid "Failed to drain stream: %s"
-msgstr "Virran tyhjentäminen epäonnistui: %s"
-
-#: ../src/utils/pacat.c:113
-msgid "Playback stream drained."
-msgstr "Toistovirta on tyhjennetty."
-
-#: ../src/utils/pacat.c:123
-msgid "Draining connection to server."
-msgstr "Tyhjennetään yhteyttä palvelimelle."
-
-#: ../src/utils/pacat.c:136
-#, c-format
-msgid "pa_stream_drain(): %s"
-msgstr "pa_stream_drain(): %s"
-
-#: ../src/utils/pacat.c:159
-#, c-format
-msgid "pa_stream_write() failed: %s"
-msgstr "pa_stream_write() epäonnistui: %s"
-
-#: ../src/utils/pacat.c:197
-#, c-format
-msgid "pa_stream_begin_write() failed: %s"
-msgstr "pa_stream_write() epäonnistui: %s"
-
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
-#, c-format
-msgid "pa_stream_peek() failed: %s"
-msgstr "pa_stream_peek() epäonnistui: %s"
-
-#: ../src/utils/pacat.c:307
-msgid "Stream successfully created."
-msgstr "Virran luonti onnistui."
-
-#: ../src/utils/pacat.c:310
-#, c-format
-msgid "pa_stream_get_buffer_attr() failed: %s"
-msgstr "pa_stream_get_buffer_attr() epäonnistui: %s"
-
-#: ../src/utils/pacat.c:314
-#, c-format
-msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
-msgstr "Puskuritiedot: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
-
-#: ../src/utils/pacat.c:317
-#, c-format
-msgid "Buffer metrics: maxlength=%u, fragsize=%u"
-msgstr "Puskuritiedot: maxlength=%u, fragsize=%u"
-
-#: ../src/utils/pacat.c:321
-#, c-format
-msgid "Using sample spec '%s', channel map '%s'."
-msgstr "Käytetään näytemäärittelyä ”%s”, kanavakarttaa ”%s”."
-
-#: ../src/utils/pacat.c:325
-#, c-format
-msgid "Connected to device %s (%u, %ssuspended)."
-msgstr "Yhdistetty laitteeseen %s (%u, %ssuspended)."
+#: ../src/pavucontrol.glade.h:12
+msgid "<i>No input devices available</i>"
+msgstr "<i>Sisääntulolaitteita ei saatavilla</i>"
 
-#: ../src/utils/pacat.c:335
-#, c-format
-msgid "Stream error: %s"
-msgstr "Virtavirhe: %s"
-
-#: ../src/utils/pacat.c:345
-#, c-format
-msgid "Stream device suspended.%s"
-msgstr "Virtalaite keskeytetty.%s"
-
-#: ../src/utils/pacat.c:347
-#, c-format
-msgid "Stream device resumed.%s"
-msgstr "Virtalaite palautettu.%s"
-
-#: ../src/utils/pacat.c:355
-#, c-format
-msgid "Stream underrun.%s"
-msgstr "Virran alivuoto.%s"
-
-#: ../src/utils/pacat.c:362
-#, c-format
-msgid "Stream overrun.%s"
-msgstr "Virran ylivuoto.%s"
-
-#: ../src/utils/pacat.c:369
-#, c-format
-msgid "Stream started.%s"
-msgstr "Virta käynnistetty.%s"
-
-#: ../src/utils/pacat.c:376
-#, c-format
-msgid "Stream moved to device %s (%u, %ssuspended).%s"
-msgstr "Virta siirretty laitteelle %s (%u, %ssuspended).%s"
-
-#: ../src/utils/pacat.c:376
-msgid "not "
-msgstr "ei "
-
-#: ../src/utils/pacat.c:383
-#, c-format
-msgid "Stream buffer attributes changed.%s"
-msgstr "Virran puskuriattribuutteja muutettu.%s"
-
-#: ../src/utils/pacat.c:415
-#, c-format
-msgid "Connection established.%s"
-msgstr "Yhteys muodostettu.%s"
-
-#: ../src/utils/pacat.c:418
-#, c-format
-msgid "pa_stream_new() failed: %s"
-msgstr "pa_stream_new() epäonnistui: %s"
-
-#: ../src/utils/pacat.c:450
-#, c-format
-msgid "pa_stream_connect_playback() failed: %s"
-msgstr "pa_stream_connect_playback() epäonnistui: %s"
-
-#: ../src/utils/pacat.c:456
-#, c-format
-msgid "pa_stream_connect_record() failed: %s"
-msgstr "pa_stream_connect_record() epäonnistui: %s"
-
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
-#, c-format
-msgid "Connection failure: %s"
-msgstr "Yhteysvirhe: %s"
-
-#: ../src/utils/pacat.c:503
-msgid "Got EOF."
-msgstr "Saatiin EOF."
-
-#: ../src/utils/pacat.c:540
-#, c-format
-msgid "write() failed: %s"
-msgstr "write() epäonnistui: %s"
-
-#: ../src/utils/pacat.c:561
-msgid "Got signal, exiting."
-msgstr "Saatiin signaali, lopetetaan."
-
-#: ../src/utils/pacat.c:575
-#, c-format
-msgid "Failed to get latency: %s"
-msgstr "Latenssin selvittäminen epäonnistui: %s"
-
-#: ../src/utils/pacat.c:580
-#, c-format
-msgid "Time: %0.3f sec; Latency: %0.0f usec."
-msgstr "Aika: %0.3f s; Latenssi: %0.0f μs."
+#: ../src/pavucontrol.glade.h:13
+msgid "<i>No output devices available</i>"
+msgstr "<i>Ulostulolaitteita ei saatavilla</i>"
 
-#: ../src/utils/pacat.c:599
-#, c-format
-msgid "pa_stream_update_timing_info() failed: %s"
-msgstr "pa_stream_update_timing_info() epäonnistui: %s"
-
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/pavucontrol.glade.h:14
 msgid ""
-"%s [options]\n"
-"\n"
-"  -h, --help                            Show this help\n"
-"      --version                         Show version\n"
-"\n"
-"  -r, --record                          Create a connection for recording\n"
-"  -p, --playback                        Create a connection for playback\n"
-"\n"
-"  -v, --verbose                         Enable verbose operations\n"
-"\n"
-"  -s, --server=SERVER                   The name of the server to connect "
-"to\n"
-"  -d, --device=DEVICE                   The name of the sink/source to "
-"connect to\n"
-"  -n, --client-name=NAME                How to call this client on the "
-"server\n"
-"      --stream-name=NAME                How to call this stream on the "
-"server\n"
-"      --volume=VOLUME                   Specify the initial (linear) volume "
-"in range 0...65536\n"
-"      --rate=SAMPLERATE                 The sample rate in Hz (defaults to "
-"44100)\n"
-"      --format=SAMPLEFORMAT             The sample type, one of s16le, "
-"s16be, u8, float32le,\n"
-"                                        float32be, ulaw, alaw, s32le, s32be, "
-"s24le, s24be,\n"
-"                                        s24-32le, s24-32be (defaults to "
-"s16ne)\n"
-"      --channels=CHANNELS               The number of channels, 1 for mono, "
-"2 for stereo\n"
-"                                        (defaults to 2)\n"
-"      --channel-map=CHANNELMAP          Channel map to use instead of the "
-"default\n"
-"      --fix-format                      Take the sample format from the sink "
-"the stream is\n"
-"                                        being connected to.\n"
-"      --fix-rate                        Take the sampling rate from the sink "
-"the stream is\n"
-"                                        being connected to.\n"
-"      --fix-channels                    Take the number of channels and the "
-"channel map\n"
-"                                        from the sink the stream is being "
-"connected to.\n"
-"      --no-remix                        Don't upmix or downmix channels.\n"
-"      --no-remap                        Map channels by index instead of "
-"name.\n"
-"      --latency=BYTES                   Request the specified latency in "
-"bytes.\n"
-"      --process-time=BYTES              Request the specified process time "
-"per request in bytes.\n"
-"      --property=PROPERTY=VALUE         Set the specified property to the "
-"specified value.\n"
-"      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
-"      --list-file-formats               List available file formats.\n"
+"All Input Devices\n"
+"All Except Monitors\n"
+"Hardware Input Devices\n"
+"Virtual Input Devices\n"
+"Monitors"
 msgstr ""
-"%s [valitsimet]\n"
-"\n"
-"  -h, --help                            Näytä tämä ohje\n"
-"      --version                         Näytä versio\n"
-"\n"
-"  -r, --record                          Luo yhteys nauhoitukselle\n"
-"  -p, --playback                        Luo yhteys toistolle\n"
-"\n"
-"  -v, --verbose                         Yksityiskohtaiset tulosteet\n"
-"\n"
-"  -s, --server=PALVELIN                 Sen palvelimen nimi, johon "
-"yhdistetään\n"
-"  -d, --device=LAITE                    Sen nielun/lähteen nimi, johon "
-"yhdistetään\n"
-"  -n, --client-name=NIMI                Kuinka tätä asiakasohjelmaa "
-"kutsutaan palvelimella\n"
-"      --stream-name=NIMI                Kuinka tätä virtaa kutsutaan "
-"palvelimella\n"
-"      --volume=ÄÄNENVOIMAKKUUS          Määritä (lineaarinen) "
-"aloitusäänenvoimakkuus väliltä 0...65536\n"
-"      --rate=NÄYTTEENOTTOTAAJUUS        Näytteenottotaajuus hertseinä"
-"(oletus: 44100)\n"
-"      --format=NÄYTEMUOTO               Näytteen tyyppi, yksi seuraavista:"
-"s16le, s16be, u8, float32le,\n"
-"                                        float32be, ulaw, alaw, s32le, s32be\n"
-"s24le, s24be,\n"
-"                                        s24-32le, s24-32be (oletus s16ne)\n"
-"      --channels=KANAVIA                Kanavien määrä, 1=mono, 2=stereo\n"
-"                                        (oletus: 2)\n"
-"      --channel-map=KANAVAKARTTA        Oletuksen sijasta käytettävä "
-"kanavakartta\n"
-"      --fix-format                      Valitse näytemuoto nielusta, jossa "
-"virta on\n"
-"      --fix-rate                        Valitse näytteenottotaajuus "
-"nielusta, jossa virta on\n"
-"      --fix-channels                    Valitse kanavien määrä ja "
-"kanavakartta nielusta, johon virtaa\n"
-"                                        yhdistetään.\n"
-"      --no-remix                        Älä yli- tai alimiksaa kanavia.\n"
-"      --no-remap                        Kartoita kanavat indeksin mukaan, "
-"älä nimen mukaan.\n"
-"      --latency=TAVUA                   Pyydä määritettyä latenssia "
-"tavuissa.\n"
-"      --process-time=TAVUA              Pyydä määritettyä prosessiaikaa "
-"pyyntöä kohti tavuissa.\n"
-"      --property=ASETUS=ARVO            Anna määritetylle asetukselle "
-"määritetty arvo.\n"
-"      --raw                             Tallenna/soita raakaa PCM-dataa.\n"
-"      --file-format=TMUOTO              Tallenna/soita tietyn muotoista PCM-"
-"dataa.\n"
-"      --list-file-formats               Luettele käytettävissä olevat "
-"tiedostomuodot.\n"
-
-#: ../src/utils/pacat.c:731
-#, c-format
-msgid ""
-"pacat %s\n"
-"Compiled with libpulse %s\n"
-"Linked with libpulse %s\n"
-msgstr ""
-"pacat %s\n"
-"Käännetty libpulsen versiolle %s\n"
-"Linkitetty libpulsen versiolle %s\n"
-
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
-#, c-format
-msgid "Invalid client name '%s'"
-msgstr "Virheellinen asiakasohjelman nimi ”%s”"
-
-#: ../src/utils/pacat.c:779
-#, c-format
-msgid "Invalid stream name '%s'"
-msgstr "Virheellinen virran nimi ”%s”"
-
-#: ../src/utils/pacat.c:816
-#, c-format
-msgid "Invalid channel map '%s'"
-msgstr "Virheellinen kanavakartta ”%s”"
-
-#: ../src/utils/pacat.c:845
-#, c-format
-msgid "Invalid latency specification '%s'"
-msgstr "Virheellinen latenssimääritys ”%s”"
-
-#: ../src/utils/pacat.c:852
-#, c-format
-msgid "Invalid process time specification '%s'"
-msgstr "Virheellinen prosessiajan määritys ”%s”"
-
-#: ../src/utils/pacat.c:864
-#, c-format
-msgid "Invalid property '%s'"
-msgstr "Virheellinen asetus ”%s”"
-
-#: ../src/utils/pacat.c:881
-#, c-format
-msgid "Unknown file format %s."
-msgstr "Tuntematon tiedostomuoto %s."
-
-#: ../src/utils/pacat.c:900
-msgid "Invalid sample specification"
-msgstr "Virheellinen näytemääritys"
-
-#: ../src/utils/pacat.c:910
-#, c-format
-msgid "open(): %s"
-msgstr "open(): %s"
-
-#: ../src/utils/pacat.c:915
-#, c-format
-msgid "dup2(): %s"
-msgstr "dup2(): %s"
-
-#: ../src/utils/pacat.c:922
-msgid "Too many arguments."
-msgstr "Liian monta argumenttia."
+"Kaikki sisääntulolaitteet\n"
+"Kaikki paitsi tarkkailulaitteet\n"
+"Laitteistosisääntulolaitteet\n"
+"Näennäissisääntulolaitteet\n"
+"Tarkkailulaitteet"
 
-#: ../src/utils/pacat.c:933
-msgid "Failed to generate sample specification for file."
-msgstr "Näytemäärityksen generointi tiedostolle epäonnistui."
-
-#: ../src/utils/pacat.c:953
-msgid "Failed to open audio file."
-msgstr "Äänitiedoston avaaminen epäonnistui."
-
-#: ../src/utils/pacat.c:959
+#: ../src/pavucontrol.glade.h:19
 msgid ""
-"Warning: specified sample specification will be overwritten with "
-"specification from file."
+"All Output Devices\n"
+"Hardware Output Devices\n"
+"Virtual Output Devices"
 msgstr ""
-"Varoitus: tiedostosta luettava näytemääritys korvaa annetun määrityksen."
-
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
-msgid "Failed to determine sample specification from file."
-msgstr "Näytemäärityksen selvittäminen tiedostosta epäonnistui."
-
-#: ../src/utils/pacat.c:971
-msgid "Warning: Failed to determine channel map from file."
-msgstr "Varoitus: Kanavakartan selvittäminen tiedostosta epäonnistui."
-
-#: ../src/utils/pacat.c:982
-msgid "Channel map doesn't match sample specification"
-msgstr "Kanavakartta ei vastaa näytemääritystä"
-
-#: ../src/utils/pacat.c:993
-msgid "Warning: failed to write channel map to file."
-msgstr "Varoitus: kanavakartan kirjoittaminen tiedostoon epäonnistui."
-
-#: ../src/utils/pacat.c:1008
-#, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr "Avataan %svirta näytemäärityksellä ”%s” ja kanavakartalla ”%s”."
-
-#: ../src/utils/pacat.c:1009
-msgid "recording"
-msgstr "nauhoitus"
-
-#: ../src/utils/pacat.c:1009
-msgid "playback"
-msgstr "toisto"
-
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
-msgid "pa_mainloop_new() failed."
-msgstr "pa_mainloop_new() epäonnistui."
-
-#: ../src/utils/pacat.c:1054
-msgid "io_new() failed."
-msgstr "io_new() epäonnistui."
-
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
-msgid "pa_context_new() failed."
-msgstr "pa_context_new() epäonnistui."
-
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
-#, c-format
-msgid "pa_context_connect() failed: %s"
-msgstr "pa_context_connect() epäonnistui: %s"
-
-#: ../src/utils/pacat.c:1075
-msgid "pa_context_rttime_new() failed."
-msgstr "pa_context_new() epäonnistui."
-
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
-msgid "pa_mainloop_run() failed."
-msgstr "pa_mainloop_run() epäonnistui."
-
-#: ../src/utils/pasuspender.c:81
-#, c-format
-msgid "fork(): %s\n"
-msgstr "fork(): %s\n"
-
-#: ../src/utils/pasuspender.c:92
-#, c-format
-msgid "execvp(): %s\n"
-msgstr "execvp(): %s\n"
-
-#: ../src/utils/pasuspender.c:109
-#, c-format
-msgid "Failure to suspend: %s\n"
-msgstr "Keskeytys epäonnistui: %s\n"
-
-#: ../src/utils/pasuspender.c:124
-#, c-format
-msgid "Failure to resume: %s\n"
-msgstr "Palautus epäonnistui: %s\n"
-
-#: ../src/utils/pasuspender.c:147
-#, c-format
-msgid "WARNING: Sound server is not local, not suspending.\n"
-msgstr "VAROITUS: Äänipalvelin ei ole paikallinen, ei keskeytetä.\n"
-
-#: ../src/utils/pasuspender.c:159
-#, c-format
-msgid "Connection failure: %s\n"
-msgstr "Yhteysvirhe: %s\n"
-
-#: ../src/utils/pasuspender.c:176
-#, c-format
-msgid "Got SIGINT, exiting.\n"
-msgstr "Saatiin SIGINT, lopetetaan.\n"
-
-#: ../src/utils/pasuspender.c:194
-#, c-format
-msgid "WARNING: Child process terminated by signal %u\n"
-msgstr "VAROITUS: Lapsiprosessi lopetettiin signaalilla %u\n"
+"Kaikki ulostulolaitteet\n"
+"Laitteistoulostulolaitteet\n"
+"Näennäisulostulolaitteet"
 
-#: ../src/utils/pasuspender.c:212
-#, c-format
-msgid ""
-"%s [options] ... \n"
-"\n"
-"  -h, --help                            Show this help\n"
-"      --version                         Show version\n"
-"  -s, --server=SERVER                   The name of the server to connect "
-"to\n"
-"\n"
-msgstr ""
-"%s [valitsimet] ... \n"
-"\n"
-"  -h, --help                            Näytä tämä ohje\n"
-"      --version                         Näytä versio\n"
-"  -s, --server=PALVELIN                 Sen palvelimen nimi, johon\n"
-"                                        yhdistetään\n"
-"\n"
-
-#: ../src/utils/pasuspender.c:248
-#, c-format
+#. Applications All streams
+#: ../src/pavucontrol.glade.h:23
 msgid ""
-"pasuspender %s\n"
-"Compiled with libpulse %s\n"
-"Linked with libpulse %s\n"
+"All Streams\n"
+"Applications\n"
+"Virtual Streams"
 msgstr ""
-"pasuspender %s\n"
-"Käännetty libpulsen versiolle %s\n"
-"Linkitetty libpulsen versiolle %s\n"
+"Kaikki virrat\n"
+"Sovellukset\n"
+"Näennäisvirrat"
 
-#: ../src/utils/pasuspender.c:277
-#, c-format
-msgid "pa_mainloop_new() failed.\n"
-msgstr "pa_mainloop_new() epäonnistui.\n"
+#: ../src/pavucontrol.glade.h:26
+msgid "Card Name"
+msgstr "Kortin nimi"
 
-#: ../src/utils/pasuspender.c:290
-#, c-format
-msgid "pa_context_new() failed.\n"
-msgstr "pa_context_new() epäonnistui.\n"
+#: ../src/pavucontrol.glade.h:27
+msgid "Device"
+msgstr "Laite"
 
-#: ../src/utils/pasuspender.c:298
-#, c-format
-msgid "pa_mainloop_run() failed.\n"
-msgstr "pa_mainloop_run() epäonnistui.\n"
+#: ../src/pavucontrol.glade.h:28
+msgid "Lock channels together"
+msgstr "Lukitse kanavat yhteen"
 
-#: ../src/utils/pactl.c:135
-#, c-format
-msgid "Failed to get statistics: %s"
-msgstr "Tilastojen selvittäminen epäonnistui: %s"
+#: ../src/pavucontrol.glade.h:29
+msgid "Mute audio"
+msgstr "Vaimenna äänet"
 
-#: ../src/utils/pactl.c:141
-#, c-format
-msgid "Currently in use: %u blocks containing %s bytes total.\n"
-msgstr "Nyt käytössä: %u lohkoa sisältäen yhteensä %s tavua.\n"
-
-#: ../src/utils/pactl.c:144
-#, c-format
-msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
-msgstr "Koko käyttöaikana varattu: %u lohkoa sisältäen yhteensä %s tavua.\n"
-
-#: ../src/utils/pactl.c:147
-#, c-format
-msgid "Sample cache size: %s\n"
-msgstr "Näytevälimuistin koko: %s\n"
-
-#: ../src/utils/pactl.c:156
-#, c-format
-msgid "Failed to get server information: %s"
-msgstr "Palvelintietojen selvittäminen epäonnistui: %s"
-
-#: ../src/utils/pactl.c:164
-#, c-format
-msgid ""
-"User name: %s\n"
-"Host Name: %s\n"
-"Server Name: %s\n"
-"Server Version: %s\n"
-"Default Sample Specification: %s\n"
-"Default Channel Map: %s\n"
-"Default Sink: %s\n"
-"Default Source: %s\n"
-"Cookie: %08x\n"
-msgstr ""
-"Käyttäjänimi: %s\n"
-"Konenimi: %s\n"
-"Palvelimen nimi: %s\n"
-"Palvelimen versio: %s\n"
-"Oletusnäytemäärittely: %s\n"
-"Oletuskanavakartta: %s\n"
-"Oletusnielu: %s\n"
-"Oletuslähde: %s\n"
-"Eväste: %08x\n"
-
-#: ../src/utils/pactl.c:205
-#, c-format
-msgid "Failed to get sink information: %s"
-msgstr "Nielun tietojen nouto epäonnistui: %s"
-
-#: ../src/utils/pactl.c:221
-#, c-format
-msgid ""
-"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 ""
-"Nielu #%u\n"
-"\tTila: %s\n"
-"\tNimi: %s\n"
-"\tKuvaus: %s\n"
-"\tAjuri: %s\n"
-"\tNäytemäärittely: %s\n"
-"\tKanavakartta: %s\n"
-"\tOmistava moduuli: %u\n"
-"\tVaimennus: %s\n"
-"\tÄänenvoimakkuus: %s%s%s\n"
-"\t                 balanssi %0.2f\n"
-"\tPerusäänenvoimakkuus: %s%s%s\n"
-"\tTarkkailulähde: %s\n"
-"\tLatenssi: %0.0f μs, asetettu %0.0f μs\n"
-"\tLiput: %s%s%s%s%s%s\n"
-"\tOminaisuudet:\n"
-"\t\t%s\n"
-
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
-#, c-format
-msgid "\tPorts:\n"
-msgstr "\tPortit:\n"
+#: ../src/pavucontrol.glade.h:30
+msgid "Set as fallback"
+msgstr "Aseta toissijaiseksi"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
-#, c-format
-msgid "\tActive Port: %s\n"
-msgstr "\tAktiivinen portti: %s\n"
+#: ../src/pavucontrol.glade.h:31
+msgid "Stream Title"
+msgstr "Virran otsikko"
 
-#: ../src/utils/pactl.c:297
-#, c-format
-msgid "Failed to get source information: %s"
-msgstr "Lähteen tietojen nouto epäonnistui: %s"
+#: ../src/pavucontrol.glade.h:33
+msgid "_Configuration"
+msgstr "_Asetukset"
 
-#: ../src/utils/pactl.c:313
-#, c-format
-msgid ""
-"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 ""
-"Lähde #%u\n"
-"\tTila: %s\n"
-"\tNimi: %s\n"
-"\tKuvaus: %s\n"
-"\tAjuri: %s\n"
-"\tNäytemäärittely: %s\n"
-"\tKanavakartta: %s\n"
-"\tOmistava moduuli: %u\n"
-"\tVaimennus: %s\n"
-"\tÄänenvoimakkuus: %s%s%s\n"
-"\t                 balanssi %0.2f\n"
-"\tPerusäänenvoimakkuus: %s%s%s\n"
-"\tTarkkailtava nielu: %s\n"
-"\tLatenssi: %0.0f μs, asetettu %0.0f μs\n"
-"\tLiput: %s%s%s%s%s%s\n"
-"\tOminaisuudet:\n"
-"\t\t%s\n"
-
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
-msgid "n/a"
-msgstr "-"
-
-#: ../src/utils/pactl.c:375
-#, c-format
-msgid "Failed to get module information: %s"
-msgstr "Moduulin tietojen nouto epäonnistui: %s"
+#: ../src/pavucontrol.glade.h:34
+msgid "_Input Devices"
+msgstr "S_isääntulolaitteet"
 
-#: ../src/utils/pactl.c:393
-#, c-format
-msgid ""
-"Module #%u\n"
-"\tName: %s\n"
-"\tArgument: %s\n"
-"\tUsage counter: %s\n"
-"\tProperties:\n"
-"\t\t%s\n"
-msgstr ""
-"Moduuli #%u\n"
-"\tNimi: %s\n"
-"\tArgumentti: %s\n"
-"\tKäyttölaskuri: %s\n"
-"\tOminaisuudet:\n"
-"\t\t%s\n"
-
-#: ../src/utils/pactl.c:412
-#, c-format
-msgid "Failed to get client information: %s"
-msgstr "Asiakkaan tietojen nouto epäonnistui: %s"
-
-#: ../src/utils/pactl.c:430
-#, c-format
-msgid ""
-"Client #%u\n"
-"\tDriver: %s\n"
-"\tOwner Module: %s\n"
-"\tProperties:\n"
-"\t\t%s\n"
-msgstr ""
-"Asiakas #%u\n"
-"\tAjuri: %s\n"
-"\tOmistava moduuli: %s\n"
-"\tOminaisuudet:\n"
-"\t\t%s\n"
+#: ../src/pavucontrol.glade.h:35
+msgid "_Output Devices"
+msgstr "Ul_ostulolaitteet"
 
-#: ../src/utils/pactl.c:447
-#, c-format
-msgid "Failed to get card information: %s"
-msgstr "Kortin tietojen nouto epäonnistui: %s"
+#: ../src/pavucontrol.glade.h:36
+msgid "_Playback"
+msgstr "_Toisto"
 
-#: ../src/utils/pactl.c:465
-#, c-format
-msgid ""
-"Card #%u\n"
-"\tName: %s\n"
-"\tDriver: %s\n"
-"\tOwner Module: %s\n"
-"\tProperties:\n"
-"\t\t%s\n"
-msgstr ""
-"Kortti #%u\n"
-"\tNimi: %s\n"
-"\tAjuri: %s\n"
-"\tOmistava moduuli: %s\n"
-"\tOminaisuudet:\n"
-"\t\t%s\n"
-
-#: ../src/utils/pactl.c:479
-#, c-format
-msgid "\tProfiles:\n"
-msgstr "\tProfiilit:\n"
+#: ../src/pavucontrol.glade.h:37
+msgid "_Recording"
+msgstr "_Nauhoitus"
 
-#: ../src/utils/pactl.c:485
-#, c-format
-msgid "\tActive Profile: %s\n"
-msgstr "\tAktiivinen profiili: %s\n"
+#: ../src/pavucontrol.glade.h:38
+msgid "direction"
+msgstr "suunta"
 
-#: ../src/utils/pactl.c:496
-#, c-format
-msgid "Failed to get sink input information: %s"
-msgstr "Nielun sisääntulon tietojen nouto epäonnistui: %s"
+#: ../src/pavucontrol.cc:73
+msgid "Card callback failure"
+msgstr "Kortin takaisinkutsu epäonnistui"
 
-#: ../src/utils/pactl.c:515
-#, c-format
-msgid ""
-"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 ""
-"Nielun sisääntulo #%u\n"
-"\tAjuri: %s\n"
-"\tOmistava moduuli: %s\n"
-"\tAsiakas: %s\n"
-"\tNielu: %u\n"
-"\tNäytemäärittely: %s\n"
-"\tKanavakartta: %s\n"
-"\tVaimennus: %s\n"
-"\tÄänenvoimakkuus: %s\n"
-"\t                 %s\n"
-"\t                 balanssi %0.2f\n"
-"\tPuskurin latenssi: %0.0f μs\n"
-"\tNielun latenssi: %0.0f μs\n"
-"\tUudelleennäytteistyksen tapa: %s\n"
-"\tOminaisuudet:\n"
-"\t\t%s\n"
-
-#: ../src/utils/pactl.c:554
-#, c-format
-msgid "Failed to get source output information: %s"
-msgstr "Lähteen ulostulon tietojen nouto epäonnistui: %s"
+#: ../src/pavucontrol.cc:92
+msgid "Sink callback failure"
+msgstr "Nielun takaisinkutsu epäonnistui"
 
-#: ../src/utils/pactl.c:574
-#, c-format
-msgid ""
-"Source Output #%u\n"
-"\tDriver: %s\n"
-"\tOwner Module: %s\n"
-"\tClient: %s\n"
-"\tSource: %u\n"
-"\tSample Specification: %s\n"
-"\tChannel Map: %s\n"
-"\tBuffer Latency: %0.0f usec\n"
-"\tSource Latency: %0.0f usec\n"
-"\tResample method: %s\n"
-"\tProperties:\n"
-"\t\t%s\n"
-msgstr ""
-"Lähteen ulostulo #%u\n"
-"\tAjuri: %s\n"
-"\tOmistava moduuli: %s\n"
-"\tAsiakas: %s\n"
-"\tLähde: %u\n"
-"\tNäytemäärittely: %s\n"
-"\tKanavakartta: %s\n"
-"\tPuskurin latenssi: %0.0f μs\n"
-"\tLähteen latenssi: %0.0f μs\n"
-"\tUudelleennäytteistyksen tapa: %s\n"
-"\tOminaisuudet:\n"
-"\t\t%s\n"
-
-#: ../src/utils/pactl.c:605
-#, c-format
-msgid "Failed to get sample information: %s"
-msgstr "Näytetietojen nouto epäonnistui: %s"
+#: ../src/pavucontrol.cc:111
+msgid "Source callback failure"
+msgstr "Lähteen takaisinkutsu epäonnistui"
 
-#: ../src/utils/pactl.c:623
-#, c-format
-msgid ""
-"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 ""
-"Näyte #%u\n"
-"\tNimi: %s\n"
-"\tNäytemäärittely: %s\n"
-"\tKanavakartta: %s\n"
-"\tÄänenvoimakkuus: %s\n"
-"\t                 %s\n"
-"\t                 balanssi %0.2f\n"
-"\tKesto: %0.1fs\n"
-"\tKoko: %s\n"
-"\tLaiska: %s\n"
-"\tTiedostonimi: %s\n"
-"\tOminaisuudet:\n"
-"\t\t%s\n"
-
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
-#, c-format
-msgid "Failure: %s"
-msgstr "Epäonnistuminen: %s"
+#: ../src/pavucontrol.cc:130
+msgid "Sink input callback failure"
+msgstr "Nielun sisääntulon takaisinkutsu epäonnistui"
 
-#: ../src/utils/pactl.c:687
-#, c-format
-msgid "Failed to upload sample: %s"
-msgstr "Näytteen lähettäminen epäonnistui: %s"
+#: ../src/pavucontrol.cc:149
+msgid "Source output callback failure"
+msgstr "Lähteen ulostulon takaisinkutsu epäonnistui"
 
-#: ../src/utils/pactl.c:704
-msgid "Premature end of file"
-msgstr "Ennenaikainen tiedoston päättyminen"
+#: ../src/pavucontrol.cc:183
+msgid "Client callback failure"
+msgstr "Asiakkaan takaisinkutsu"
 
-#: ../src/utils/pactl.c:863
-msgid "Got SIGINT, exiting."
-msgstr "Saatiin SIGINT, lopetetaan."
+#: ../src/pavucontrol.cc:199
+msgid "Server info callback failure"
+msgstr "Palvelintietojen takaisinkutsu epäonnistui"
 
-#: ../src/utils/pactl.c:869
+#: ../src/pavucontrol.cc:217 ../src/pavucontrol.cc:430
 #, c-format
-msgid ""
-"%s [options] stat\n"
-"%s [options] list\n"
-"%s [options] exit\n"
-"%s [options] upload-sample FILENAME [NAME]\n"
-"%s [options] play-sample NAME [SINK]\n"
-"%s [options] remove-sample NAME\n"
-"%s [options] move-sink-input SINKINPUT SINK\n"
-"%s [options] move-source-output SOURCEOUTPUT SOURCE\n"
-"%s [options] load-module NAME [ARGS ...]\n"
-"%s [options] unload-module MODULE\n"
-"%s [options] suspend-sink SINK 1|0\n"
-"%s [options] suspend-source SOURCE 1|0\n"
-"%s [options] set-card-profile CARD PROFILE\n"
-"%s [options] set-sink-port SINK PORT\n"
-"%s [options] set-source-port SOURCE PORT\n"
-"%s [options] set-sink-volume SINK VOLUME\n"
-"%s [options] set-source-volume SOURCE VOLUME\n"
-"%s [options] set-sink-input-volume SINKINPUT VOLUME\n"
-"%s [options] set-sink-mute SINK 1|0\n"
-"%s [options] set-source-mute SOURCE 1|0\n"
-"%s [options] set-sink-input-mute SINKINPUT 1|0\n"
-"\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"
-msgstr ""
-"%s [valitsimet] stat\n"
-"%s [valitsimet] list\n"
-"%s [valitsimet] exit\n"
-"%s [valitsimet] upload-sample TIEDOSTONIMI [NIMI]\n"
-"%s [valitsimet] play-sample NIMI [NIELU]\n"
-"%s [valitsimet] remove-sample NIMI\n"
-"%s [valitsimet] move-sink-input NIELUSISÄÄNMENO NIELU\n"
-"%s [valitsimet] move-source-output LÄHDEULOSTULO LÄHDE\n"
-"%s [valitsimet] load-module NIMI [ARGUMENTIT ...]\n"
-"%s [valitsimet] unload-module MODUULI\n"
-"%s [valitsimet] suspend-sink NIELU 1|0\n"
-"%s [valitsimet] suspend-source LÄHDE 1|0\n"
-"%s [valitsimet] set-card-profile KORTTI PROFIILI\n"
-"%s [valitsimet] set-sink-port NIELU PORTTI\n"
-"%s [valitsimet] set-source-port LÄHDE PORTTI\n"
-"%s [valitsimet] set-sink-volume NIELU VOIMAKKUUS\n"
-"%s [valitsimet] set-source-volume LÄHDE VOIMAKKUUS\n"
-"%s [valitsimet] set-sink-input-volume NIELUSISÄÄNMENO VOIMAKKUUS\n"
-"%s [valitsimet] set-sink-mute NIELU 1|0\n"
-"%s [valitsimet] set-source-mute LÄHDE 1|0\n"
-"%s [valitsimet] set-sink-input-mute NIELUSISÄÄNMENO 1|0\n"
-"\n"
-"  -h, --help                            Näytä tämä ohje\n"
-"      --version                         Näytä versio\n"
-"\n"
-"  -s, --server=PALVELIN                 Sen palvelimen nimi, johon "
-"yhdistetään\n"
-"  -n, --client-name=NIMI                Kuinka tätä asiakasohjelmaa "
-"kutsutaan palvelimella\n"
-
-#: ../src/utils/pactl.c:933
-#, c-format
-msgid ""
-"pactl %s\n"
-"Compiled with libpulse %s\n"
-"Linked with libpulse %s\n"
-msgstr ""
-"pactl %s\n"
-"Käännetty libpulsen versiolle %s\n"
-"Linkitetty libpulsen versiolle %s\n"
-
-#: ../src/utils/pactl.c:979
-msgid "Please specify a sample file to load"
-msgstr "Anna ladattava näytetiedosto"
-
-#: ../src/utils/pactl.c:992
-msgid "Failed to open sound file."
-msgstr "Äänitiedoston avaaminen epäonnistui."
-
-#: ../src/utils/pactl.c:1004
-msgid "Warning: Failed to determine sample specification from file."
-msgstr "Varoitus: näytemäärityksen selvitys tiedostosta epäonnistui."
-
-#: ../src/utils/pactl.c:1014
-msgid "You have to specify a sample name to play"
-msgstr "Soitettavan näytteen nimi on annettava"
-
-#: ../src/utils/pactl.c:1026
-msgid "You have to specify a sample name to remove"
-msgstr "Poistettavan näytteen nimi on annettava"
-
-#: ../src/utils/pactl.c:1035
-msgid "You have to specify a sink input index and a sink"
-msgstr "Nielun syöteindeksi ja nielu on annettava"
-
-#: ../src/utils/pactl.c:1045
-msgid "You have to specify a source output index and a source"
-msgstr "Lähteen ulostuloindeksi ja lähde on annettava"
-
-#: ../src/utils/pactl.c:1060
-msgid "You have to specify a module name and arguments."
-msgstr "Moduulin nimi ja argumentit on annettava."
-
-#: ../src/utils/pactl.c:1080
-msgid "You have to specify a module index"
-msgstr "Moduulin indeksi on annettava"
-
-#: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
-msgstr "Ei voi antaa enempää kuin yhden nielun. Totuusarvo on annettava."
-
-#: ../src/utils/pactl.c:1103
-msgid ""
-"You may not specify more than one source. You have to specify a boolean "
-"value."
-msgstr "Ei voi antaa enempää kuin yhden lähteen. Totuusarvo on annettava."
-
-#: ../src/utils/pactl.c:1115
-msgid "You have to specify a card name/index and a profile name"
-msgstr "Kortin nimi/indeksi ja profiilin nimi on annettava"
-
-#: ../src/utils/pactl.c:1126
-msgid "You have to specify a sink name/index and a port name"
-msgstr "Nielun nimi/indeksi ja portin nimi on annettava"
-
-#: ../src/utils/pactl.c:1137
-msgid "You have to specify a source name/index and a port name"
-msgstr "Lähteen nimi/indeksi ja portin nimi on annettava"
-
-#: ../src/utils/pactl.c:1149
-msgid "You have to specify a sink name/index and a volume"
-msgstr "Nielun nimi/indeksi ja portin nimi on annettava"
-
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
-msgid "Invalid volume specification"
-msgstr "Virheellinen äänenvoimakkuuden määritys"
-
-#: ../src/utils/pactl.c:1166
-msgid "You have to specify a source name/index and a volume"
-msgstr "Lähteen nimi/indeksi ja äänenvoimakkuus on annettava"
-
-#: ../src/utils/pactl.c:1183
-msgid "You have to specify a sink input index and a volume"
-msgstr "Nielun syöteindeksi ja äänenvoimakkuus on annettava"
-
-#: ../src/utils/pactl.c:1188
-msgid "Invalid sink input index"
-msgstr "Virheellinen nielun syöteindeksi"
+msgid "Failed to initialize stream_restore extension: %s"
+msgstr "stream_restore-laajennoksen alustus epäonnistui: %s"
 
-#: ../src/utils/pactl.c:1204
-msgid "You have to specify a sink name/index and a mute boolean"
-msgstr "Nielun nimi/indeksi ja vaimennuksen totuusarvo on annettava"
+#: ../src/pavucontrol.cc:235
+msgid "pa_ext_stream_restore_read() failed"
+msgstr "pa_ext_stream_restore_read() epäonnistui"
 
-#: ../src/utils/pactl.c:1221
-msgid "You have to specify a source name/index and a mute boolean"
-msgstr "Lähteen nimi/indeksi ja vaimennuksen totuusarvo on annettava"
+#: ../src/pavucontrol.cc:252
+msgid "pa_context_get_sink_info_by_index() failed"
+msgstr "pa_context_get_sink_info_by_index() epäonnistui"
 
-#: ../src/utils/pactl.c:1238
-msgid "You have to specify a sink input index and a mute boolean"
-msgstr "Nielun syöteindeksi ja vaimennuksen totuusarvo on annettava"
+#: ../src/pavucontrol.cc:265
+msgid "pa_context_get_source_info_by_index() failed"
+msgstr "pa_context_get_source_info_by_index() epäonnistui"
 
-#: ../src/utils/pactl.c:1243
-msgid "Invalid sink input index specification"
-msgstr "Virheellinen nielun syöteindeksin määritys"
+#: ../src/pavucontrol.cc:278 ../src/pavucontrol.cc:291
+msgid "pa_context_get_sink_input_info() failed"
+msgstr "pa_context_get_sink_input_info() epäonnistui"
 
-#: ../src/utils/pactl.c:1262
-msgid "No valid command specified."
-msgstr "Mitään kelvollista komentoa ei annettu."
+#: ../src/pavucontrol.cc:304
+msgid "pa_context_get_client_info() failed"
+msgstr "pa_context_get_client_info() epäonnistui"
 
-#: ../src/utils/pax11publish.c:61
-#, c-format
-msgid ""
-"%s [-D display] [-S server] [-O sink] [-I source] [-c file]  [-d|-e|-i|-r]\n"
-"\n"
-" -d    Show current PulseAudio data attached to X11 display (default)\n"
-" -e    Export local PulseAudio data to X11 display\n"
-" -i    Import PulseAudio data from X11 display to local environment "
-"variables and cookie file.\n"
-" -r    Remove PulseAudio data from X11 display\n"
-msgstr ""
-"%s [-D näyttö] [-S palvelin] [-O nielu] [-I lähde] [-c tiedosto]  [-d|-e|-i|-"
-"r]\n"
-"\n"
-" -d    Näytä nykyiseen X11-näyttöön yhdistetyn PulseAudion tiedot (oletus)\n"
-" -e    Vie paikalliset PulseAudio-tiedot X11-näytölle\n"
-" -i    Tuo PulseAudio-tiedot X11-näytöltä paikallisiin ympäristömuuttujiin "
-"ja\n"
-"       evästetiedostoon.\n"
-" -r    Poista PulseAudio-tiedostot X11-näytöltä\n"
-
-#: ../src/utils/pax11publish.c:94
-#, c-format
-msgid "Failed to parse command line.\n"
-msgstr "Komentorivin jäsentäminen epäonnistui.\n"
-
-#: ../src/utils/pax11publish.c:108
-#, c-format
-msgid "Server: %s\n"
-msgstr "Palvelin: %s\n"
-
-#: ../src/utils/pax11publish.c:110
-#, c-format
-msgid "Source: %s\n"
-msgstr "Lähde: %s\n"
+#: ../src/pavucontrol.cc:314 ../src/pavucontrol.cc:371
+msgid "pa_context_get_server_info() failed"
+msgstr "pa_context_get_server_info() epäonnistui"
 
-#: ../src/utils/pax11publish.c:112
-#, c-format
-msgid "Sink: %s\n"
-msgstr "Nielu: %s\n"
+#: ../src/pavucontrol.cc:327
+msgid "pa_context_get_card_info_by_index() failed"
+msgstr "pa_context_get_card_info_by_index() epäonnistui"
 
-#: ../src/utils/pax11publish.c:114
-#, c-format
-msgid "Cookie: %s\n"
-msgstr "Eväste: %s\n"
+#: ../src/pavucontrol.cc:362
+msgid "pa_context_subscribe() failed"
+msgstr "pa_context_subscribe() epäonnistui"
 
-#: ../src/utils/pax11publish.c:132
-#, c-format
-msgid "Failed to parse cookie data\n"
-msgstr "Evästetietojen jäsennys epäonnistui\n"
+#: ../src/pavucontrol.cc:378
+msgid "pa_context_client_info_list() failed"
+msgstr "pa_context_client_info_list() epäonnistui"
 
-#: ../src/utils/pax11publish.c:137
-#, c-format
-msgid "Failed to save cookie data\n"
-msgstr "Evästetietojen tallennus epäonnistui\n"
+#: ../src/pavucontrol.cc:385
+msgid "pa_context_get_card_info_list() failed"
+msgstr "pa_context_get_card_info_list() epäonnistui"
 
-#: ../src/utils/pax11publish.c:152
-#, c-format
-msgid "Failed to load client configuration file.\n"
-msgstr "Asiakasohjelman asetustiedoston lataaminen epäonnistui.\n"
+#: ../src/pavucontrol.cc:392
+msgid "pa_context_get_sink_info_list() failed"
+msgstr "pa_context_get_sink_info_list() epäonnistui"
 
-#: ../src/utils/pax11publish.c:157
-#, c-format
-msgid "Failed to read environment configuration data.\n"
-msgstr "Ympäristön asetustietojen lukeminen epäonnistui.\n"
+#: ../src/pavucontrol.cc:399
+msgid "pa_context_get_source_info_list() failed"
+msgstr "pa_context_get_source_info_list() epäonnistui"
 
-#: ../src/utils/pax11publish.c:174
-#, c-format
-msgid "Failed to get FQDN.\n"
-msgstr "Verkkonimen saaminen epäonnistui.\n"
+#: ../src/pavucontrol.cc:406
+msgid "pa_context_get_sink_input_info_list() failed"
+msgstr "pa_context_get_sink_input_info_list() epäonnistui"
 
-#: ../src/utils/pax11publish.c:194
-#, c-format
-msgid "Failed to load cookie data\n"
-msgstr "Evästetietojen lataaminen epäonnistui\n"
+#: ../src/pavucontrol.cc:413
+msgid "pa_context_get_source_output_info_list() failed"
+msgstr "pa_context_get_source_output_info_list() epäonnistui"
 
-#: ../src/utils/pax11publish.c:211
-#, c-format
-msgid "Not yet implemented.\n"
-msgstr "Toteutusta ei vielä ole.\n"
+#: ../src/pavucontrol.cc:437
+msgid "Connection failed"
+msgstr "Yhteys epäonnistui"
 
-#: ../src/utils/pacmd.c:69
-msgid "No PulseAudio daemon running, or not running as session daemon."
-msgstr ""
-"PulseAudio-taustaprosessi ei ole käynnissä eikä PulseAudiota suoriteta "
-"istunnon taustaprosessina."
+#: ../src/cardwidget.cc:87
+msgid "pa_context_set_card_profile_by_index() failed"
+msgstr "pa_context_set_card_profile_by_index() epäonnistui"
 
-#: ../src/utils/pacmd.c:74
-#, c-format
-msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
-msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
+#: ../src/channelwidget.cc:104
+msgid "<small>Silence</small>"
+msgstr "<small>Hiljaisuus</small>"
 
-#: ../src/utils/pacmd.c:91
-#, c-format
-msgid "connect(): %s"
-msgstr "connect(): %s"
+#: ../src/channelwidget.cc:104
+msgid "<small>Min</small>"
+msgstr "<small>Minimi</small>"
 
-#: ../src/utils/pacmd.c:99
-msgid "Failed to kill PulseAudio daemon."
-msgstr "PulseAudio-taustaprosessin lopettaminen epäonnistui."
+#: ../src/channelwidget.cc:105
+msgid "<small>Max</small>"
+msgstr "<small>Maksimi</small>"
 
-#: ../src/utils/pacmd.c:107
-msgid "Daemon not responding."
-msgstr "Taustaprosessi ei vastaa."
+#: ../src/channelwidget.cc:109
+msgid "<small><i>Base</i></small>"
+msgstr "<small><i>Perus</i></small>"
 
-#: ../src/utils/pacmd.c:161
-#, c-format
-msgid "poll(): %s"
-msgstr "poll(): %s"
+#: ../src/mainwindow.cc:269
+msgid "Failed to read data from stream"
+msgstr "Datan lukeminen virrasta epäonnistui"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
-#, c-format
-msgid "read(): %s"
-msgstr "read(): %s"
+#: ../src/mainwindow.cc:304 ../src/mainwindow.cc:341
+msgid "Peak detect"
+msgstr "Huipun tunnistus"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
-#, c-format
-msgid "write(): %s"
-msgstr "write(): %s"
+#: ../src/mainwindow.cc:305 ../src/mainwindow.cc:342
+msgid "Failed to create monitoring stream"
+msgstr "Tarkkailuvirran luonti epäonnistui"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
-msgid "Cannot access autospawn lock."
-msgstr "Automaattisen käynnistyksen lukkoa ei voida käyttää."
+#: ../src/mainwindow.cc:313 ../src/mainwindow.cc:351
+msgid "Failed to connect monitoring stream"
+msgstr "Tarkkailuvirtaan yhdistäminen epäonnistui"
 
-#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
-#, c-format
-msgid ""
-"ALSA woke us up to write new data to the device, but there was actually "
-"nothing to write!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers.\n"
-"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
-"returned 0 or another value < min_avail."
-msgstr ""
-"ALSA herätti taustaprosessin kirjoittamaan uutta dataa laitteelle, mutta "
-"mitään kirjoitettavaa ei ollut!\n"
-"Tämä on luultavasti ohjelmavirhe ALSA-ajurissa ”%s”. Raportoi tästä "
-"ongelmasta ALSA-kehittäjille. Taustaprosessi herätettiin POLLOUT "
-"asetettuna,  snd_pcm_avail() palautti kuitenkin 0 tai jonkin muun arvon, "
-"joka on < min_avail."
-
-#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
-#, c-format
+#: ../src/mainwindow.cc:466
 msgid ""
-"ALSA woke us up to read new data from the device, but there was actually "
-"nothing to read!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers.\n"
-"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
-"returned 0 or another value < min_avail."
-msgstr ""
-"ALSA herätti taustaprosessin lukemaan uutta dataa laitteelta, mutta mitään "
-"luettavaa ei ollut!\n"
-"Tämä on luultavasti ohjelmavirhe ALSA-ajurissa ”%s”. Raportoi tästä "
-"ongelmasta ALSA-kehittäjille. Taustaprosessi herätettiin POLLIN asetettuna,  "
-"snd_pcm_avail() palautti kuitenkin 0 tai jonkin muun arvon, on < min_avail."
-
-#: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
-msgid "Off"
-msgstr "Poissa"
-
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
-msgid "High Fidelity Playback (A2DP)"
-msgstr "Korkean äänenlaadun toisto (A2DP)"
-
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
-msgid "High Fidelity Capture (A2DP)"
-msgstr "Korkean äänenlaadun tallennus (A2DP)"
-
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
-msgid "Telephony Duplex (HSP/HFP)"
-msgstr ""
-
-#: ../src/modules/reserve-wrap.c:151
-msgid "PulseAudio Sound Server"
-msgstr "PulseAudio-äänipalvelin"
-
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
-msgid "Output Devices"
-msgstr ""
-
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
-#, fuzzy
-msgid "Input Devices"
-msgstr "Sisääntulo %s"
-
-#: ../src/modules/module-rygel-media-server.c:774
-msgid "Audio on @HOSTNAME@"
-msgstr ""
-
-#: ../src/modules/alsa/alsa-mixer.c:1701
-#, fuzzy
-msgid "Input"
-msgstr "Sisääntulo %s"
-
-#: ../src/modules/alsa/alsa-mixer.c:1702
-msgid "Docking Station Input"
-msgstr ""
-
-#: ../src/modules/alsa/alsa-mixer.c:1703
-msgid "Docking Station Microphone"
-msgstr ""
-
-#: ../src/modules/alsa/alsa-mixer.c:1704
-msgid "Line-In"
-msgstr ""
-
-#: ../src/modules/alsa/alsa-mixer.c:1705
-msgid "Microphone"
+"Ignoring sink-input due to it being designated as an event and thus handled "
+"by the Event widget"
 msgstr ""
+"Ohitetaan nielusisäänmeno, koska se on määrätty tapahtumaksi ja siksi sen "
+"käsittelee Event-elementti"
 
-#: ../src/modules/alsa/alsa-mixer.c:1706
-msgid "External Microphone"
-msgstr ""
+#: ../src/mainwindow.cc:618
+msgid "System Sounds"
+msgstr "Järjestelmän äänet"
 
-#: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
-msgid "Internal Microphone"
-msgstr "Sisäinen äänentoisto"
+#: ../src/rolewidget.cc:71
+msgid "pa_ext_stream_restore_write() failed"
+msgstr "pa_ext_stream_restore_write() epäonnistui"
 
-#: ../src/modules/alsa/alsa-mixer.c:1708
-msgid "Radio"
-msgstr ""
+#: ../src/sinkinputwidget.cc:35
+msgid "on"
+msgstr "päällä"
 
-#: ../src/modules/alsa/alsa-mixer.c:1709
-msgid "Video"
-msgstr ""
+#: ../src/sinkinputwidget.cc:38
+msgid "Terminate Playback"
+msgstr "Lopeta toisto"
 
-#: ../src/modules/alsa/alsa-mixer.c:1710
-msgid "Automatic Gain Control"
-msgstr ""
-
-#: ../src/modules/alsa/alsa-mixer.c:1711
-msgid "No Automatic Gain Control"
-msgstr ""
-
-#: ../src/modules/alsa/alsa-mixer.c:1712
-msgid "Boost"
-msgstr ""
-
-#: ../src/modules/alsa/alsa-mixer.c:1713
-msgid "No Boost"
-msgstr ""
-
-#: ../src/modules/alsa/alsa-mixer.c:1714
-msgid "Amplifier"
-msgstr ""
-
-#: ../src/modules/alsa/alsa-mixer.c:1715
-msgid "No Amplifier"
-msgstr ""
-
-#: ../src/modules/alsa/alsa-mixer.c:1773
-#, fuzzy
-msgid "Analog Input"
-msgstr "Analoginen mono"
-
-#: ../src/modules/alsa/alsa-mixer.c:1774
-#, fuzzy
-msgid "Analog Microphone"
-msgstr "Analoginen mono"
-
-#: ../src/modules/alsa/alsa-mixer.c:1775
-#, fuzzy
-msgid "Analog Line-In"
-msgstr "Analoginen mono"
-
-#: ../src/modules/alsa/alsa-mixer.c:1776
-#, fuzzy
-msgid "Analog Radio"
-msgstr "Analoginen mono"
-
-#: ../src/modules/alsa/alsa-mixer.c:1777
-#, fuzzy
-msgid "Analog Video"
-msgstr "Analoginen stereo"
-
-#: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
-msgid "Analog Output"
-msgstr "Tyhjä ulostulo"
-
-#: ../src/modules/alsa/alsa-mixer.c:1779
-#, fuzzy
-msgid "Analog Headphones"
-msgstr "Analoginen mono"
-
-#: ../src/modules/alsa/alsa-mixer.c:1780
-msgid "Analog Output (LFE)"
-msgstr ""
+#: ../src/sinkinputwidget.cc:61
+msgid "Unknown output"
+msgstr "Tuntematon ulostulo"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
-#, fuzzy
-msgid "Analog Mono Output"
-msgstr "Analoginen mono"
-
-#: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
-msgid "%s+%s"
-msgstr "%s %s"
-
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
-msgid "%s / %s"
-msgstr "%s %s"
-
-#: ../src/modules/alsa/alsa-mixer.c:2790
-msgid "Analog Mono"
-msgstr "Analoginen mono"
-
-#: ../src/modules/alsa/alsa-mixer.c:2791
-msgid "Analog Stereo"
-msgstr "Analoginen stereo"
-
-#: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
-msgid "Analog Surround 2.1"
-msgstr "Analoginen tilaääni 4.1"
-
-#: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
-msgid "Analog Surround 3.0"
-msgstr "Analoginen tilaääni 4.0"
+#: ../src/sinkinputwidget.cc:72
+msgid "pa_context_set_sink_input_volume() failed"
+msgstr "pa_context_set_sink_input_volume() epäonnistui"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
-msgid "Analog Surround 3.1"
-msgstr "Analoginen tilaääni 4.1"
+#: ../src/sinkinputwidget.cc:87
+msgid "pa_context_set_sink_input_mute() failed"
+msgstr "pa_context_set_sink_input_mute() epäonnistui"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
-msgid "Analog Surround 4.0"
-msgstr "Analoginen tilaääni 4.0"
+#: ../src/sinkinputwidget.cc:97
+msgid "pa_context_kill_sink_input() failed"
+msgstr "pa_context_kill_sink_input() epäonnistui"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
-msgid "Analog Surround 4.1"
-msgstr "Analoginen tilaääni 4.1"
+#: ../src/sinkinputwidget.cc:133
+msgid "pa_context_move_sink_input_by_index() failed"
+msgstr "pa_context_move_sink_input_by_index() epäonnistui"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
-msgid "Analog Surround 5.0"
-msgstr "Analoginen tilaääni 5.0"
+#: ../src/sinkwidget.cc:48
+msgid "pa_context_set_sink_volume_by_index() failed"
+msgstr "pa_context_set_sink_volume_by_index() epäonnistui"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
-msgid "Analog Surround 5.1"
-msgstr "Analoginen tilaääni 5.1"
+#: ../src/sinkwidget.cc:63
+msgid "Volume Control Feedback Sound"
+msgstr "Äänenvoimakkuuden säädön palauteääni"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
-msgid "Analog Surround 6.0"
-msgstr "Analoginen tilaääni 4.0"
+#: ../src/sinkwidget.cc:80
+msgid "pa_context_set_sink_mute_by_index() failed"
+msgstr "pa_context_set_sink_mute_by_index() epäonnistui"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
-msgid "Analog Surround 6.1"
-msgstr "Analoginen tilaääni 4.1"
+#: ../src/sinkwidget.cc:94
+msgid "pa_context_set_default_sink() failed"
+msgstr "pa_context_set_default_sink() epäonnistui"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
-msgid "Analog Surround 7.0"
-msgstr "Analoginen tilaääni 4.0"
+#: ../src/sinkwidget.cc:114
+msgid "pa_context_set_sink_port_by_index() failed"
+msgstr "pa_context_set_sink_port_by_index() epäonnistui"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
-msgid "Analog Surround 7.1"
-msgstr "Analoginen tilaääni 7.1"
+#: ../src/sourceoutputwidget.cc:35
+msgid "from"
+msgstr "lähteestä"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
-msgid "Digital Stereo (IEC958)"
-msgstr "Digitaalinen stereo (IEC958)"
+#: ../src/sourceoutputwidget.cc:38
+msgid "Terminate Recording"
+msgstr "Lopeta nauhoitus"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
-#, fuzzy
-msgid "Digital Surround 4.0 (IEC958)"
-msgstr "Digitaalinen tilaääni 4.0 (IEC958/AC3)"
+#: ../src/sourceoutputwidget.cc:61
+msgid "Unknown input"
+msgstr "Tuntematon sisääntulo"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
-msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr "Digitaalinen tilaääni 4.0 (IEC958/AC3)"
+#: ../src/sourceoutputwidget.cc:71
+msgid "pa_context_kill_source_output() failed"
+msgstr "pa_context_kill_source_output() epäonnistui"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
-msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr "Digitaalinen tilaääni 5.1 (IEC958/AC3)"
+#: ../src/sourceoutputwidget.cc:108
+msgid "pa_context_move_source_output_by_index() failed"
+msgstr "pa_context_move_source_output_by_index() epäonnistui"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
-msgid "Digital Stereo (HDMI)"
-msgstr "Digitaalinen stereo (HDMI)"
+#: ../src/sourcewidget.cc:44
+msgid "pa_context_set_source_volume_by_index() failed"
+msgstr "pa_context_set_source_volume_by_index() epäonnistui"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
-#, fuzzy
-msgid "Analog Mono Duplex"
-msgstr "Analoginen mono"
+#: ../src/sourcewidget.cc:59
+msgid "pa_context_set_source_mute_by_index() failed"
+msgstr "pa_context_set_source_mute_by_index() epäonnistui"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
-#, fuzzy
-msgid "Analog Stereo Duplex"
-msgstr "Analoginen stereo"
+#: ../src/sourcewidget.cc:73
+msgid "pa_context_set_default_source() failed"
+msgstr "pa_context_set_default_source() epäonnistui"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
-#, fuzzy
-msgid "Digital Stereo Duplex (IEC958)"
-msgstr "Digitaalinen stereo (IEC958)"
+#: ../src/sourcewidget.cc:95
+msgid "pa_context_set_source_port_by_index() failed"
+msgstr "pa_context_set_source_port_by_index() epäonnistui"
 
-#~ msgid "Invalid client name '%s'\n"
-#~ msgstr "Virheellinen asiakasohjelman nimi ”%s”\n"
-
-#~ msgid "Failed to determine sample specification from file.\n"
-#~ msgstr "Näytemäärityksen selvitys tiedostosta epäonnistui: %s\n"
-
-#~ msgid "select(): %s"
-#~ msgstr "select(): %s"
-
-#~ msgid "Cannot connect to system bus: %s"
-#~ msgstr "Järjestelmäväylään ei voida yhdistää: %s"
-
-#~ msgid "Cannot get caller from PID: %s"
-#~ msgstr "Kutsujaa ei saada PID:stä: %s"
-
-#~ msgid "Cannot set UID on caller object."
-#~ msgstr "UID:tä ei voida asettaa kutsujaobjektille."
-
-#~ msgid "Failed to get CK session."
-#~ msgstr "CK-istunnon saaminen epäonnistui."
-
-#~ msgid "Cannot set UID on session object."
-#~ msgstr "UID:tä ei voida asettaa istunto-objektille."
-
-#~ msgid "Cannot allocate PolKitAction."
-#~ msgstr "Ei voida varata PolKitActionia."
-
-#~ msgid "Cannot set action_id"
-#~ msgstr "Ei voida asettaa action_id:tä"
-
-#~ msgid "Cannot allocate PolKitContext."
-#~ msgstr "Ei voida varata PolKitContextia."
-
-#~ msgid "Cannot initialize PolKitContext: %s"
-#~ msgstr "Ei voida alustaa PolKitContextia: %s"
-
-#~ msgid "Could not determine whether caller is authorized: %s"
-#~ msgstr "Ei voida päätellä onko kutsujalla käyttöoikeus: %s"
-
-#~ msgid "Cannot obtain auth: %s"
-#~ msgstr "Tunnistautumista ei saada: %s"
-
-#~ msgid "PolicyKit responded with '%s'"
-#~ msgstr "PolicyKit vastasi ”%s”"
+#: ../src/streamwidget.cc:45
+msgid "Terminate"
+msgstr "Lopeta"
 
-#~ msgid ""
-#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio "
-#~ "daemon"
-#~ msgstr ""
-#~ "Korkean prioriteetin ajoitus (negatiivinen Unix-nice-taso) PulseAudio-"
-#~ "taustajärjestelmälle"
+#~ msgid "Open menu"
+#~ msgstr "Avaa valikko"
 
-#~ msgid "Real-time scheduling for the PulseAudio daemon"
-#~ msgstr "Reaaliaikainen ajoitus PulseAudio-taustajärjestelmälle"
+#~ msgid "_Move Stream..."
+#~ msgstr "_Siirrä virta"
 
-#~ msgid ""
-#~ "System policy prevents PulseAudio from acquiring high-priority scheduling."
-#~ msgstr ""
-#~ "Järjestelmäkäytäntö estää PulseAudiota saamasta korkean prioriteetin "
-#~ "ajoitusta."
-
-#~ msgid ""
-#~ "System policy prevents PulseAudio from acquiring real-time scheduling."
-#~ msgstr ""
-#~ "Järjestelmäkäytäntö estää PulseAudiota saamasta reaaliaikaista ajoitusta."
-
-#~ msgid "read() failed: %s\n"
-#~ msgstr "read() epäonnistui: %s\n"
-
-#, fuzzy
-#~ msgid "pa_context_connect() failed: %s\n"
-#~ msgstr "pa_context_connect() epäonnistui: %s"
-
-#~ msgid "We're in the group '%s', allowing high-priority scheduling."
-#~ msgstr "Ollaan ryhmässä ”%s”, korkean prioriteetin ajoitus on sallittua."
-
-#~ msgid "We're in the group '%s', allowing real-time scheduling."
-#~ msgstr "Ollaan ryhmässä ”%s”, tosiaikainen vuorottaminen on sallittua."
-
-#~ msgid "PolicyKit grants us acquire-high-priority privilege."
-#~ msgstr "PolicyKit myöntää acquire-high-priority-oikeuden."
-
-#~ msgid "PolicyKit refuses acquire-high-priority privilege."
-#~ msgstr "PolicyKit ei myönnä acquire-high-priority-oikeutta."
-
-#~ msgid "PolicyKit grants us acquire-real-time privilege."
-#~ msgstr "PolicyKit myöntää acquire-real-time-oikeuden."
-
-#~ msgid "PolicyKit refuses acquire-real-time privilege."
-#~ msgstr "PolicyKit ei myönnä acquire-real-time-oikeutta."
-
-#~ 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 '%s', 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 '%s', or increase "
-#~ "the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user."
-#~ msgstr ""
-#~ "Ohjelmaa kutsuttiin SUID-rootina ja reaaliaikaista ja/tai korkean "
-#~ "prioriteetin ajoitusta pyydettiin asetuksissa. Tarvittavat oikeudet "
-#~ "kuitenkin puuttuvat:\n"
-#~ "Ei olla ryhmässä ”%s”, PolicyKit ei myönnä pyydettyjä oikeuksia ja "
-#~ "RLIMIT_NICE/RLIMIT_RTPRIO-resurssirajoja ei ole kasvatettu.\n"
-#~ "Hanki riittävät PolicyKit-oikeudet, liity ryhmään ”%s” tai kasvata tämän "
-#~ "käyttäjän RLIMIT_NICE/RLIMIT_RTPRIO-resurssirajoja reaaliaikaisen ja/tai "
-#~ "korkean prioriteetin ajoituksen ottamiseksi käyttöön."
-
-#~ msgid ""
-#~ "High-priority scheduling enabled in configuration but not allowed by "
-#~ "policy."
-#~ msgstr ""
-#~ "Korkean prioriteetin ajoitus otettu käyttöön asetuksissa, mutta käytännöt "
-#~ "eivät salli sitä."
-
-#~ msgid "Successfully increased RLIMIT_RTPRIO"
-#~ msgstr "RLIMIT_RTPRIO:n kasvatus onnistui"
-
-#~ msgid "RLIMIT_RTPRIO failed: %s"
-#~ msgstr "RLIMIT_RTPRIO epäonnistui: %s"
-
-#~ msgid "Giving up CAP_NICE"
-#~ msgstr "Luovutaan CAP_NICE:stä"
-
-#~ 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ä."
-
-#~ msgid "Limited capabilities successfully to CAP_SYS_NICE."
-#~ msgstr "Oikeuksien rajoittaminen CAP_SYS_NICEen onnistui."
-
-#~ msgid "time_new() failed.\n"
-#~ msgstr "time_new() epäonnistui.\n"
-
-#~ msgid "Output %s + Input %s"
-#~ msgstr "Ulostulo %s + Sisääntulo %s"
-
-#~ msgid "Stream successfully created\n"
-#~ msgstr "Virran luonti onnistui\n"
-
-#~ msgid "Stream errror: %s\n"
-#~ msgstr "Virtavirhe: %s\n"
-
-#~ msgid "Connection established.\n"
-#~ msgstr "Yhteys muodostetettu.\n"
-
-#~ msgid ""
-#~ "%s [options] [FILE]\n"
-#~ "\n"
-#~ "  -h, --help                            Show this help\n"
-#~ "      --version                         Show version\n"
-#~ "\n"
-#~ "  -v, --verbose                         Enable verbose operation\n"
-#~ "\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"
-#~ "      --channel-map=CHANNELMAP          Set the channel map to the use\n"
-#~ msgstr ""
-#~ "%s [valitsimet] [TIEDOSTO]\n"
-#~ "\n"
-#~ "  -h, --help                            Näytä tämä ohje\n"
-#~ "      --version                         Näytä tiedostot\n"
-#~ "\n"
-#~ "  -v, --verbose                         Yksityiskohtaiset tulosteet\n"
-#~ "\n"
-#~ "  -s, --server=PALVELIN                 Sen palvelimen nimi, johon\n"
-#~ "                                        yhdistetään\n"
-#~ "  -d, --device=LAITE                    Sen nielun nimi, johon "
-#~ "yhdistetään\n"
-#~ "  -n, --client-name=NIMI                Kuinka tätä asiakasohjelmaa "
-#~ "kutsutaan\n"
-#~ "                                        palvelimella\n"
-#~ "      --stream-name=NIMI                Kuinka tätä virtaa kutsutaan\n"
-#~ "                                        palvelimella\n"
-#~ "      --volume=ÄÄNENVOIMAKKUUS          Määritä (lineaarinen) "
-#~ "aloitusäänen-\n"
-#~ "                                        voimakkuus väliltä 0...65536\n"
-#~ "      --channel-map=KANAVAKARTTA        Aseta käytettävä kanavakartta\n"
-
-#~ msgid ""
-#~ "paplay %s\n"
-#~ "Compiled with libpulse %s\n"
-#~ "Linked with libpulse %s\n"
-#~ msgstr ""
-#~ "paplay %s\n"
-#~ "Käännetty libpulsen versiolle %s\n"
-#~ "Linkitetty libpulsen versiolle %s\n"
-
-#~ msgid "Invalid channel map\n"
-#~ msgstr "Virheellinen kanavakartta\n"
-
-#~ msgid "Failed to open file '%s'\n"
-#~ msgstr "Tiedoston ”%s” avaaminen epäonnistui\n"
-
-#~ msgid "Channel map doesn't match file.\n"
-#~ msgstr "Kanavakartta ei täsmää tiedostoon.\n"
-
-#~ msgid "Using sample spec '%s'\n"
-#~ msgstr "Käytetään näytemäärittelyä ”%s”\n"
-
-#~ msgid "muted"
-#~ msgstr "vaimennettu"
-
-#~ msgid ""
-#~ "*** Autoload Entry #%u ***\n"
-#~ "Name: %s\n"
-#~ "Type: %s\n"
-#~ "Module: %s\n"
-#~ "Argument: %s\n"
-#~ msgstr ""
-#~ "*** Automaattilataustietue #%u ***\n"
-#~ "Nimi: %s\n"
-#~ "Tyyppi: %s\n"
-#~ "Moduuli: %s\n"
-#~ "Argumentto: %s\n"
-
-#~ msgid "sink"
-#~ msgstr "nielu"
-
-#~ msgid "source"
-#~ msgstr "lähde"
+#~ msgid "_Default"
+#~ msgstr "_Oletus"

commit 68841d0dc878dcc868a91409008fe60888428931
Author: vpv <vpv at fedoraproject.org>
Date:   Mon Nov 9 13:05:56 2009 +0000

    Sending translation for Finnish

diff --git a/po/fi.po b/po/fi.po
index 13b5e15..515def3 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -1,14 +1,14 @@
-# pavucontrol Finnish (fi) translation.
+# pulseaudio translation to Finnish (fi).
 # Copyright (C) 2008 Timo Jyrinki
-# This file is distributed under the same license as the pavucontrol package.
-# Timo Jyrinki <timo.jyrinki at iki.fi>
-# Ville-Pekka Vainio <vpivaini at cs.helsinki.fi>, 2009
+# This file is distributed under the same license as the pulseaudio package.
+# Timo Jyrinki <timo.jyrinki at iki.fi>, 2008.
+# Ville-Pekka Vainio <vpivaini at cs.helsinki.fi>, 2009.
 msgid ""
 msgstr ""
 "Project-Id-Version: git trunk\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-09 09:45+0000\n"
-"PO-Revision-Date: 2009-11-09 15:03+0200\n"
+"POT-Creation-Date: 2009-09-29 23:47+0200\n"
+"PO-Revision-Date: 2009-09-15 13:24+0300\n"
 "Last-Translator: Ville-Pekka Vainio <vpivaini at cs.helsinki.fi>\n"
 "Language-Team: Finnish <laatu at lokalisointi.org>\n"
 "MIME-Version: 1.0\n"
@@ -16,388 +16,2821 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ../src/pavucontrol.desktop.in.h:1
-msgid "Adjust the volume level"
-msgstr "Säädä äänenvoimakkuutta"
+#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#, c-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: ../src/modules/alsa/alsa-util.c:1106
+#, c-format
+msgid ""
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
+"ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+"snd_pcm_avail() palautti poikkeuksellisen suuren arvon: %lu tavua (%lu ms).\n"
+"Tämä on todennäköisesti ohjelmavirhe ALSA-ajurissa ”%s”. Ilmoita tästä "
+"ongelmasta ALSA-kehittäjille."
+
+#: ../src/modules/alsa/alsa-util.c:1147
+#, c-format
+msgid ""
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
+"lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+"snd_pcm_delay() palautti poikkeuksellisen suuren arvon: %li tavua (%s%lu "
+"ms).\n"
+"Tämä on todennäköisesti ohjelmavirhe ALSA-ajurissa ”%s”. Ilmoita tästä "
+"ongelmasta ALSA-kehittäjille."
+
+#: ../src/modules/alsa/alsa-util.c:1194
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+"snd_pcm_mmap_begin() palautti poikkeuksellisen suuren arvon: %lu tavua (%lu "
+"ms).\n"
+"Tämä on todennäköisesti ohjelmavirhe ALSA-ajurissa ”%s”. Ilmoita tästä "
+"ongelmasta ALSA-kehittäjille."
+
+#: ../src/modules/module-always-sink.c:39
+msgid "Always keeps at least one sink loaded even if it's a null one"
+msgstr "Pidä aina vähintään yksi nielu ladattuna, vaikka se olisi tyhjä nielu"
+
+#: ../src/modules/module-always-sink.c:83
+msgid "Dummy Output"
+msgstr "Valeulostulo"
+
+#: ../src/modules/module-ladspa-sink.c:49
+msgid "Virtual LADSPA sink"
+msgstr "Virtuaalinen LADSPA-nielu"
+
+#: ../src/modules/module-ladspa-sink.c:53
+msgid ""
+"sink_name=<name for the sink> sink_properties=<properties for the sink> "
+"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
+"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
+"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
+"input control values>"
+msgstr ""
+"sink_name=<nielun nimi> sink_properties=<nielun asetukset> "
+"master=<suodatettavan nielun nimi> format=<näytemuoto> "
+"rate=<näytteenottotaajuus> channels=<kanavien määrä> "
+"channel_map=<kanavakartta> plugin=<ladspa-liitännäisen nimi> label=<ladspa-"
+"liitännäisen nimiö (label)> control=<pilkulla erotettu luettelo "
+"syötteenhallinta-arvoja>"
+
+#: ../src/modules/module-null-sink.c:55
+msgid "Clocked NULL sink"
+msgstr "Kellotettu tyhjä nielu"
+
+#: ../src/modules/module-null-sink.c:291
+msgid "Null Output"
+msgstr "Tyhjä ulostulo"
+
+#: ../src/pulsecore/sink.c:2613
+msgid "Internal Audio"
+msgstr "Sisäinen äänentoisto"
+
+#: ../src/pulsecore/sink.c:2618
+msgid "Modem"
+msgstr "Modeemi"
+
+#: ../src/daemon/ltdl-bind-now.c:124
+msgid "Failed to find original lt_dlopen loader."
+msgstr "Alkuperäisen lt_dlopen-lataimen löytäminen epäonnistui."
+
+#: ../src/daemon/ltdl-bind-now.c:129
+msgid "Failed to allocate new dl loader."
+msgstr "Uuden dl-lataaminen varaaminen epäonnistui."
+
+#: ../src/daemon/ltdl-bind-now.c:142
+msgid "Failed to add bind-now-loader."
+msgstr "bind-now-loaderin lisääminen epäonnistui."
+
+#: ../src/daemon/main.c:141
+#, c-format
+msgid "Got signal %s."
+msgstr "Saatiin signaali %s."
+
+#: ../src/daemon/main.c:168
+msgid "Exiting."
+msgstr "Poistutaan."
+
+#: ../src/daemon/main.c:186
+#, c-format
+msgid "Failed to find user '%s'."
+msgstr "Käyttäjää ”%s” ei löydetty."
+
+#: ../src/daemon/main.c:191
+#, c-format
+msgid "Failed to find group '%s'."
+msgstr "Ryhmää ”%s” ei löydetty."
+
+#: ../src/daemon/main.c:195
+#, c-format
+msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
+msgstr "Löydettiin käyttäjä ”%s” (UID %lu) ja ryhmä ”%s” (GID %lu)."
+
+#: ../src/daemon/main.c:200
+#, c-format
+msgid "GID of user '%s' and of group '%s' don't match."
+msgstr "Käyttäjän ”%s” ja ryhmän ”%s” GID:t eivät vastaa toisiaan."
+
+#: ../src/daemon/main.c:205
+#, c-format
+msgid "Home directory of user '%s' is not '%s', ignoring."
+msgstr "Käyttäjän ”%s” kotihakemisto ei ole ”%s”, ohitetaan."
+
+#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#, c-format
+msgid "Failed to create '%s': %s"
+msgstr "Hakemiston ”%s” luominen epäonnistui: %s"
+
+#: ../src/daemon/main.c:220
+#, c-format
+msgid "Failed to change group list: %s"
+msgstr "Ryhmäluettelon vaihtaminen epäonnistui: %s"
+
+#: ../src/daemon/main.c:236
+#, c-format
+msgid "Failed to change GID: %s"
+msgstr "GID:n vaihtaminen epäonnistui: %s"
+
+#: ../src/daemon/main.c:252
+#, c-format
+msgid "Failed to change UID: %s"
+msgstr "UID:n vaihtaminen epäonnistui: %s"
+
+#: ../src/daemon/main.c:271
+msgid "Successfully dropped root privileges."
+msgstr "Root-oikeuksista luopuminen onnistui."
+
+#: ../src/daemon/main.c:279
+msgid "System wide mode unsupported on this platform."
+msgstr "Järjestelmänlaajuista tilaa ei tueta tällä alustalla."
+
+#: ../src/daemon/main.c:297
+#, c-format
+msgid "setrlimit(%s, (%u, %u)) failed: %s"
+msgstr "setrlimit(%s, (%u, %u)) epäonnistui: %s"
+
+#: ../src/daemon/main.c:474
+msgid "Failed to parse command line."
+msgstr "Komentorivin jäsentäminen epäonnistui."
+
+#: ../src/daemon/main.c:541
+msgid "Daemon not running"
+msgstr "Taustaprosessi ei ole käynnissä"
+
+#: ../src/daemon/main.c:543
+#, c-format
+msgid "Daemon running as PID %u"
+msgstr "Taustaprosessi käynnissä prosessitunnisteella %u"
+
+#: ../src/daemon/main.c:553
+#, c-format
+msgid "Failed to kill daemon: %s"
+msgstr "Taustaprosessin lopettaminen epäonnistui: %s"
+
+#: ../src/daemon/main.c:571
+msgid ""
+"This program is not intended to be run as root (unless --system is "
+"specified)."
+msgstr ""
+"Tätä ohjelmaa ei ole tarkoitettu suoritettavaksi pääkäyttäjänä (ellei --"
+"system ole määritelty)."
+
+#: ../src/daemon/main.c:573
+msgid "Root privileges required."
+msgstr "Pääkäyttäjän (root) oikeudet vaaditaan."
+
+#: ../src/daemon/main.c:578
+msgid "--start not supported for system instances."
+msgstr "--start-valitsinta ei tueta järjestelmätilassa."
+
+#: ../src/daemon/main.c:583
+msgid "Running in system mode, but --disallow-exit not set!"
+msgstr ""
+"Suoritetaan järjestelmätilassa, mutta --disallow-exit ei ole asetettuna!"
+
+#: ../src/daemon/main.c:586
+msgid "Running in system mode, but --disallow-module-loading not set!"
+msgstr ""
+"Suoritetaan järjestelmätilassa, mutta -disallow-module-loading ei ole "
+"asetettuna!"
+
+#: ../src/daemon/main.c:589
+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:594
+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:621
+msgid "Failed to acquire stdio."
+msgstr "stdio:n saaminen epäonnistui."
+
+#: ../src/daemon/main.c:627
+#, c-format
+msgid "pipe failed: %s"
+msgstr "putki epäonnistui: %s"
+
+#: ../src/daemon/main.c:632
+#, c-format
+msgid "fork() failed: %s"
+msgstr "fork() epäonnistui: %s"
+
+#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#, c-format
+msgid "read() failed: %s"
+msgstr "read() epäonnistui: %s"
+
+#: ../src/daemon/main.c:652
+msgid "Daemon startup failed."
+msgstr "Taustaprosessin käynnistys epäonnistui."
+
+#: ../src/daemon/main.c:654
+msgid "Daemon startup successful."
+msgstr "Taustaprosessin käynnistys onnistui."
+
+#: ../src/daemon/main.c:731
+#, c-format
+msgid "This is PulseAudio %s"
+msgstr "Tämä on PulseAudio %s"
+
+#: ../src/daemon/main.c:732
+#, c-format
+msgid "Compilation host: %s"
+msgstr "Käännöksen isäntäkone: %s"
+
+#: ../src/daemon/main.c:733
+#, c-format
+msgid "Compilation CFLAGS: %s"
+msgstr "Käännösaikaiset C-liput (CFLAGS): %s"
+
+#: ../src/daemon/main.c:736
+#, c-format
+msgid "Running on host: %s"
+msgstr "Käynnissä isäntäkoneella: %s"
+
+#: ../src/daemon/main.c:739
+#, c-format
+msgid "Found %u CPUs."
+msgstr "Löydettiin %u CPU:ta."
+
+#: ../src/daemon/main.c:741
+#, c-format
+msgid "Page size is %lu bytes"
+msgstr "Sivun koko on %lu tavua"
+
+#: ../src/daemon/main.c:744
+msgid "Compiled with Valgrind support: yes"
+msgstr "Käännetty Valgrind-tuella: kyllä"
+
+#: ../src/daemon/main.c:746
+msgid "Compiled with Valgrind support: no"
+msgstr "Käännetty Valgrind-tuella: ei"
+
+#: ../src/daemon/main.c:749
+#, c-format
+msgid "Running in valgrind mode: %s"
+msgstr "Käynnissä valgrind-tilassa: %s"
+
+#: ../src/daemon/main.c:752
+msgid "Optimized build: yes"
+msgstr "Optimoitu rakentaminen: kyllä"
+
+#: ../src/daemon/main.c:754
+msgid "Optimized build: no"
+msgstr "Optimoitu rakentaminen: ei"
+
+#: ../src/daemon/main.c:758
+msgid "NDEBUG defined, all asserts disabled."
+msgstr "NDEBUG on määritelty, kaikki assertit ovat poissa käytöstä."
+
+#: ../src/daemon/main.c:760
+msgid "FASTPATH defined, only fast path asserts disabled."
+msgstr "FASTPATH on määritelty, vain fast path -assertit ovat poissa käytöstä."
+
+#: ../src/daemon/main.c:762
+msgid "All asserts enabled."
+msgstr "Kaikki assertit ovat käytössä."
+
+#: ../src/daemon/main.c:766
+msgid "Failed to get machine ID"
+msgstr "Konetunnisteen nouto epäonnistui"
+
+#: ../src/daemon/main.c:769
+#, c-format
+msgid "Machine ID is %s."
+msgstr "Konetunniste on %s."
+
+#: ../src/daemon/main.c:773
+#, c-format
+msgid "Session ID is %s."
+msgstr "Istunnon tunniste on %s."
+
+#: ../src/daemon/main.c:779
+#, c-format
+msgid "Using runtime directory %s."
+msgstr "Käytetään ajonaikaista hakemistoa %s."
+
+#: ../src/daemon/main.c:784
+#, c-format
+msgid "Using state directory %s."
+msgstr "Käytetään tilahakemistoa %s."
+
+#: ../src/daemon/main.c:787
+#, c-format
+msgid "Using modules directory %s."
+msgstr "Käytetään moduulihakemistoa %s."
+
+#: ../src/daemon/main.c:789
+#, c-format
+msgid "Running in system mode: %s"
+msgstr "Suoritetaan järjestelmätilassa: %s"
+
+#: ../src/daemon/main.c:792
+msgid ""
+"OK, so you are running PA in system mode. Please note that you most likely "
+"shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as "
+"expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
+"explanation why system mode is usually a bad idea."
+msgstr ""
+"PA:ta suoritetaan järjestelmätilassa. Näin ei luultavasti pitäisi tehdä.\n"
+"Jos silti teet näin, on sinun vikasi jos kaikki ei toimikaan odotetusti.\n"
+"Lisätietoja siitä, miksi järjestelmätilan käyttäminen on yleensä huono "
+"ajatus on osoitteessa http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode"
+
+#: ../src/daemon/main.c:809
+msgid "pa_pid_file_create() failed."
+msgstr "pa_pid_file_create() epäonnistui."
+
+#: ../src/daemon/main.c:819
+msgid "Fresh high-resolution timers available! Bon appetit!"
+msgstr "Korkean tarkkuuden ajastimet käytettävissä."
+
+#: ../src/daemon/main.c:821
+msgid ""
+"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
+"resolution timers enabled!"
+msgstr ""
+"Hei, ytimesi on kehno! Linux korkean tarkkuuden ajastimien tuella on hyvin "
+"suositeltava!"
+
+#: ../src/daemon/main.c:844
+msgid "pa_core_new() failed."
+msgstr "pa_core_new() epäonnistui."
+
+#: ../src/daemon/main.c:904
+msgid "Failed to initialize daemon."
+msgstr "Taustaprosessin alustus epäonnistui."
+
+#: ../src/daemon/main.c:909
+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:926
+msgid "Daemon startup complete."
+msgstr "Taustaprosessin käynnistys valmis."
+
+#: ../src/daemon/main.c:932
+msgid "Daemon shutdown initiated."
+msgstr "Taustaprosessin sulkeminen käynnistetty."
+
+#: ../src/daemon/main.c:954
+msgid "Daemon terminated."
+msgstr "Taustaprosessi lopetettu."
+
+#: ../src/daemon/cmdline.c:115
+#, c-format
+msgid ""
+"%s [options]\n"
+"\n"
+"COMMANDS:\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"      --dump-conf                       Dump default configuration\n"
+"      --dump-modules                    Dump list of available modules\n"
+"      --dump-resample-methods           Dump available resample methods\n"
+"      --cleanup-shm                     Cleanup stale shared memory "
+"segments\n"
+"      --start                           Start the daemon if it is not "
+"running\n"
+"  -k  --kill                            Kill a running daemon\n"
+"      --check                           Check for a running daemon (only "
+"returns exit code)\n"
+"\n"
+"OPTIONS:\n"
+"      --system[=BOOL]                   Run as system-wide instance\n"
+"  -D, --daemonize[=BOOL]                Daemonize after startup\n"
+"      --fail[=BOOL]                     Quit when startup fails\n"
+"      --high-priority[=BOOL]            Try to set high nice level\n"
+"                                        (only available as root, when SUID "
+"or\n"
+"                                        with elevated RLIMIT_NICE)\n"
+"      --realtime[=BOOL]                 Try to enable realtime scheduling\n"
+"                                        (only available as root, when SUID "
+"or\n"
+"                                        with elevated RLIMIT_RTPRIO)\n"
+"      --disallow-module-loading[=BOOL]  Disallow module user requested "
+"module\n"
+"                                        loading/unloading after startup\n"
+"      --disallow-exit[=BOOL]            Disallow user requested exit\n"
+"      --exit-idle-time=SECS             Terminate the daemon when idle and "
+"this\n"
+"                                        time passed\n"
+"      --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"
+"                                        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-time[=BOOL]                 Include timestamps in log messages\n"
+"      --log-backtrace=FRAMES            Include a backtrace in log messages\n"
+"  -p, --dl-search-path=PATH             Set the search path for dynamic "
+"shared\n"
+"                                        objects (plugins)\n"
+"      --resample-method=METHOD          Use the specified resampling method\n"
+"                                        (See --dump-resample-methods for\n"
+"                                        possible values)\n"
+"      --use-pid-file[=BOOL]             Create a PID file\n"
+"      --no-cpu-limit[=BOOL]             Do not install CPU load limiter on\n"
+"                                        platforms that support it.\n"
+"      --disable-shm[=BOOL]              Disable shared memory support.\n"
+"\n"
+"STARTUP SCRIPT:\n"
+"  -L, --load=\"MODULE ARGUMENTS\"         Load the specified plugin module "
+"with\n"
+"                                        the specified argument\n"
+"  -F, --file=FILENAME                   Run the specified script\n"
+"  -C                                    Open a command line on the running "
+"TTY\n"
+"                                        after startup\n"
+"\n"
+"  -n                                    Don't load default script file\n"
+msgstr ""
+"%s [valitsimet]\n"
+"\n"
+"KOMENNOT:\n"
+"  -h, --help                            Näytä tämä ohje\n"
+"      --version                         Näytä versio\n"
+"      --dump-conf                       Tulosta oletusasetukset\n"
+"      --dump-modules                    Tulosta saatavilla olevien\n"
+"                                        moduulien luettelo\n"
+"      --dump-resample-methods           Tulosta saatavilla\n"
+"                                        olevat\n"
+"                                        uudelleennäytteistystavat\n"
+"      --cleanup-shm                     Puhdista vanhentuneet jaetun\n"
+"                                        muistin segmentit\n"
+"      --start                           Käynnistä taustaprosessi, jos se\n"
+"                                        ei ole käynnissä\n"
+"  -k  --kill                            Tapa suoritettava taustaprosessi\n"
+"      --check                           Tarkista onko\n"
+"                                        taustaprosessi suoritettavana\n"
+"                                        (palauttaa vain lopetuskoodin)\n"
+"\n"
+"VALITSIMET:\n"
+"      --system[=BOOL]                   Suorita järjestelmänlaajuisena\n"
+"  -D, --daemonize[=BOOL]                Vaihda\n"
+"                                        taustaprosessiksi käynnistyksen\n"
+"                                        jälkeen\n"
+"      --fail[=BOOL]                     Lopeta kun käynnistys epäonnistuu\n"
+"      --high-priority[=BOOL]            Yritä asettaa korkea nice-taso\n"
+"                                        (käytettävissä vain root-\n"
+"                                        käyttäjänä, SUIDilla tai\n"
+"                                        kohotetulla RLIMIT_NICE-arvolla)\n"
+"      --realtime[=BOOL]                 Yritä asettaa reaaliaikainen\n"
+"                                        ajoitus (käytettävissä vain\n"
+"                                        root-käyttäjänä, SUIDilla tai\n"
+"                                        kohotetulla RLIMIT_RTPRIO-arvolla)\n"
+"      --disallow-module-loading[=BOOL]  Kiellä käyttäjän pyytämä moduulin\n"
+"                                        lataus tai poisto käynnistyksen\n"
+"                                        jälkeen\n"
+"      --disallow-exit[=BOOL]            Kiellä käyttäjän pyytämä\n"
+"                                        lopettaminen\n"
+"      --exit-idle-time=SEK              Lopeta taustaprosessi, kun se on\n"
+"                                        toimettomana ja tämä aika on\n"
+"                                        kulunut\n"
+"      --module-idle-time=SEK            Poista automaattisesti ladatut\n"
+"                                        moduulit, kun taustaprosessi on\n"
+"                                        toimettomana ja tämä aika on\n"
+"                                        kulunut\n"
+"      --scache-idle-time=SEK            Poista automaattisesti ladatut\n"
+"                                        näytteet, kun taustaprosessi on\n"
+"                                        toimettomana ja tämä aika on\n"
+"                                        kulunut\n"
+"      --log-level[=TASO]                Aseta tai kasvata\n"
+"                                        lokikirjoituksen tasoa\n"
+"  -v                                    Kasvata tulosteiden\n"
+"                                        yksityiskohtaisuutta\n"
+"      --log-target={auto,syslog,stderr} Aseta lokikirjoituksen kohde\n"
+"      --log-meta[=BOOL]                 Lisää koodikohta\n"
+"                                        lokiviesteihin\n"
+"      --log-time[=BOOL]                 Lisää aikaleima lokiviesteihin\n"
+"      --log-backtrace=KEHYKSET          Lisää pinolistaus lokiviesteihin\n"
+"  -p, --dl-search-path=POLKU            Aseta dynaamisten jaettujen\n"
+"                                        objektien (liitännäisten)\n"
+"                                        hakupolku\n"
+"      --resample-method=TAPA            Käytä määritettyä\n"
+"                                        uudelleennäytteistyksen tapaa\n"
+"                                        (--dump-resample-methods\n"
+"                                        luetteloi mahdolliset arvot)\n"
+"      --use-pid-file[=BOOL]             Luo PID-tiedosto\n"
+"      --no-cpu-limit[=BOOL]             Älä asenna suoritinkuorman\n"
+"                                        rajoitinta alustoilla, jotka\n"
+"                                        tukevat sitä\n"
+"      --disable-shm[=BOOL]              Poista jaetun muistin tuki käytöstä\n"
+"\n"
+"ALOITUSKOMENTOSARJA:\n"
+"  -L, --load=\"MODUULIN ARGUMENTIT\"    Lataa liitännäismoduuli annetulla\n"
+"                                        argumentilla\n"
+"  -F, --file=TIEDOSTO                   Suorita annettu komentosarja\n"
+"  -C                                    Avaa komentokehote nykyiseen\n"
+"                                        päätteeseen käynnistyksen jälkeen\n"
+"\n"
+"  -n                                    Älä lataa oletuskomentosarja-\n"
+"                                        tiedostoa\n"
+
+#: ../src/daemon/cmdline.c:247
+msgid "--daemonize expects boolean argument"
+msgstr "--daemonize vaatii totuusarvoisen argumentin"
+
+#: ../src/daemon/cmdline.c:254
+msgid "--fail expects boolean argument"
+msgstr "--fail vaatii totuusarvoisen argumentin"
+
+#: ../src/daemon/cmdline.c:264
+msgid ""
+"--log-level expects log level argument (either numeric in range 0..4 or one "
+"of debug, info, notice, warn, error)."
+msgstr ""
+"--log-level vaatii lokikirjoituksen tason argumentiksi (joko numero väliltä "
+"0..4 tai yksi seuraavista: debug, info, notice, warn, error)."
+
+#: ../src/daemon/cmdline.c:276
+msgid "--high-priority expects boolean argument"
+msgstr "--high-priority vaatii totuusarvoisen argumentin"
+
+#: ../src/daemon/cmdline.c:283
+msgid "--realtime expects boolean argument"
+msgstr "--realtime vaatii totuusarvoisen argumentin"
+
+#: ../src/daemon/cmdline.c:290
+msgid "--disallow-module-loading expects boolean argument"
+msgstr "--disallow-module-loading vaatii totuusarvoisen argumentin"
+
+#: ../src/daemon/cmdline.c:297
+msgid "--disallow-exit expects boolean argument"
+msgstr "--disallow-exit vaatii totuusarvoisen argumentin"
+
+#: ../src/daemon/cmdline.c:304
+msgid "--use-pid-file expects boolean argument"
+msgstr "--use-pid-file vaatii totuusarvoisen argumentin"
+
+#: ../src/daemon/cmdline.c:321
+msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
+msgstr ""
+"Virheellinen lokikirjoituksen kohde: käytä jotain seuraavista: ”syslog”, "
+"”stderr” tai ”auto”."
+
+#: ../src/daemon/cmdline.c:328
+msgid "--log-time expects boolean argument"
+msgstr "--log-time vaatii totuusarvoisen argumentin"
+
+#: ../src/daemon/cmdline.c:335
+msgid "--log-meta expects boolean argument"
+msgstr "--log-meta vaatii totuusarvoisen argumentin"
+
+#: ../src/daemon/cmdline.c:354
+#, c-format
+msgid "Invalid resample method '%s'."
+msgstr "Virheellinen uudelleennäytteistyksen tapa ”%s”."
+
+#: ../src/daemon/cmdline.c:361
+msgid "--system expects boolean argument"
+msgstr "--system vaatii totuusarvoisen argumentin"
+
+#: ../src/daemon/cmdline.c:368
+msgid "--no-cpu-limit expects boolean argument"
+msgstr "--no-cpu-limit vaatii totuusarvoisen argumentin"
+
+#: ../src/daemon/cmdline.c:375
+msgid "--disable-shm expects boolean argument"
+msgstr "--disable-shm vaatii totuusarvoisen argumentin"
+
+#: ../src/daemon/dumpmodules.c:60
+#, c-format
+msgid "Name: %s\n"
+msgstr "Nimi: %s\n"
+
+#: ../src/daemon/dumpmodules.c:63
+#, c-format
+msgid "No module information available\n"
+msgstr "Moduulitietoja ei saatavilla\n"
+
+#: ../src/daemon/dumpmodules.c:66
+#, c-format
+msgid "Version: %s\n"
+msgstr "Versio: %s\n"
+
+#: ../src/daemon/dumpmodules.c:68
+#, c-format
+msgid "Description: %s\n"
+msgstr "Kuvaus: %s\n"
+
+#: ../src/daemon/dumpmodules.c:70
+#, c-format
+msgid "Author: %s\n"
+msgstr "Tekijä: %s\n"
+
+#: ../src/daemon/dumpmodules.c:72
+#, c-format
+msgid "Usage: %s\n"
+msgstr "Käyttö: %s\n"
+
+#: ../src/daemon/dumpmodules.c:73
+#, c-format
+msgid "Load Once: %s\n"
+msgstr "Lataa kerran: %s\n"
+
+#: ../src/daemon/dumpmodules.c:75
+#, c-format
+msgid "DEPRECATION WARNING: %s\n"
+msgstr "VAROITUS VANHENTUNEISUUDESTA: %s\n"
+
+#: ../src/daemon/dumpmodules.c:79
+#, c-format
+msgid "Path: %s\n"
+msgstr "Polku: %s\n"
+
+#: ../src/daemon/daemon-conf.c:232
+#, c-format
+msgid "[%s:%u] Invalid log target '%s'."
+msgstr "[%s:%u] Virheellinen lokikirjoituksen kohde ”%s”."
+
+#: ../src/daemon/daemon-conf.c:248
+#, c-format
+msgid "[%s:%u] Invalid log level '%s'."
+msgstr "[%s:%u] Virheellinen lokikirjoituksen taso ”%s”."
+
+#: ../src/daemon/daemon-conf.c:264
+#, c-format
+msgid "[%s:%u] Invalid resample method '%s'."
+msgstr "[%s:%u] Virheellinen uudelleennäytteistyksen tapa ”%s”."
+
+#: ../src/daemon/daemon-conf.c:287
+#, c-format
+msgid "[%s:%u] Invalid rlimit '%s'."
+msgstr "[%s:%u] Virheellinen rlimit ”%s”."
+
+#: ../src/daemon/daemon-conf.c:294
+#, c-format
+msgid "[%s:%u] rlimit not supported on this platform."
+msgstr "[%s:%u] rlimitiä ei tueta tällä alustalla."
+
+#: ../src/daemon/daemon-conf.c:310
+#, c-format
+msgid "[%s:%u] Invalid sample format '%s'."
+msgstr "[%s:%u] Virheellinen näytemuoto ”%s”."
+
+#: ../src/daemon/daemon-conf.c:328
+#, c-format
+msgid "[%s:%u] Invalid sample rate '%s'."
+msgstr "[%s:%u] Virheellinen näytteenottotaajuus ”%s”."
+
+#: ../src/daemon/daemon-conf.c:352
+#, c-format
+msgid "[%s:%u] Invalid sample channels '%s'."
+msgstr "[%s:%u] Virheelliset näytekanavat ”%s”."
+
+#: ../src/daemon/daemon-conf.c:370
+#, c-format
+msgid "[%s:%u] Invalid channel map '%s'."
+msgstr "[%s:%u] Virheellinen kanavakartta ”%s”."
+
+#: ../src/daemon/daemon-conf.c:388
+#, c-format
+msgid "[%s:%u] Invalid number of fragments '%s'."
+msgstr "[%s:%u] Virheellinen fragmenttimäärä ”%s”."
+
+#: ../src/daemon/daemon-conf.c:406
+#, c-format
+msgid "[%s:%u] Invalid fragment size '%s'."
+msgstr "[%s:%u] Virheellinen fragmenttikoko ”%s”."
+
+#: ../src/daemon/daemon-conf.c:424
+#, c-format
+msgid "[%s:%u] Invalid nice level '%s'."
+msgstr "[%s:%u] Virheellinen nice-taso ”%s”."
+
+#: ../src/daemon/daemon-conf.c:546
+#, c-format
+msgid "Failed to open configuration file: %s"
+msgstr "Asetustiedoston avaaminen epäonnistui: %s"
+
+#: ../src/daemon/daemon-conf.c:562
+msgid ""
+"The specified default channel map has a different number of channels than "
+"the specified default number of channels."
+msgstr ""
+"Kanavien oletusmäärä ja oletuskanavakartan kanavien määrä poikkeavat "
+"toisistaan."
+
+#: ../src/daemon/daemon-conf.c:638
+#, c-format
+msgid "### Read from configuration file: %s ###\n"
+msgstr "### Luettu asetustiedostosta: %s ###\n"
+
+#: ../src/daemon/caps.c:62
+msgid "Cleaning up privileges."
+msgstr "Luovutaan oikeuksista."
+
+#: ../src/daemon/pulseaudio.desktop.in.h:1
+msgid "PulseAudio Sound System"
+msgstr "PulseAudio-äänijärjestelmä"
+
+#: ../src/daemon/pulseaudio.desktop.in.h:2
+msgid "Start the PulseAudio Sound System"
+msgstr "Käynnistä PulseAudio-äänijärjestelmä"
+
+#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757
+msgid "Mono"
+msgstr "Mono"
+
+#: ../src/pulse/channelmap.c:107
+msgid "Front Center"
+msgstr "Keski"
+
+#: ../src/pulse/channelmap.c:108
+msgid "Front Left"
+msgstr "Vasen etu"
+
+#: ../src/pulse/channelmap.c:109
+msgid "Front Right"
+msgstr "Oikea etu"
+
+#: ../src/pulse/channelmap.c:111
+msgid "Rear Center"
+msgstr "Takakeski"
+
+#: ../src/pulse/channelmap.c:112
+msgid "Rear Left"
+msgstr "Vasen taka"
+
+#: ../src/pulse/channelmap.c:113
+msgid "Rear Right"
+msgstr "Oikea taka"
+
+#: ../src/pulse/channelmap.c:115
+msgid "Low Frequency Emmiter"
+msgstr "Alataajuus"
+
+#: ../src/pulse/channelmap.c:117
+msgid "Front Left-of-center"
+msgstr "Vasemmalle keskeltä etu"
+
+#: ../src/pulse/channelmap.c:118
+msgid "Front Right-of-center"
+msgstr "Oikealle keskeltä etu"
+
+#: ../src/pulse/channelmap.c:120
+msgid "Side Left"
+msgstr "Vasen sivu"
+
+#: ../src/pulse/channelmap.c:121
+msgid "Side Right"
+msgstr "Oikea sivu"
+
+#: ../src/pulse/channelmap.c:123
+msgid "Auxiliary 0"
+msgstr "Avustava 0"
+
+#: ../src/pulse/channelmap.c:124
+msgid "Auxiliary 1"
+msgstr "Avustava 1"
+
+#: ../src/pulse/channelmap.c:125
+msgid "Auxiliary 2"
+msgstr "Avustava 2"
+
+#: ../src/pulse/channelmap.c:126
+msgid "Auxiliary 3"
+msgstr "Avustava 3"
+
+#: ../src/pulse/channelmap.c:127
+msgid "Auxiliary 4"
+msgstr "Avustava 4"
+
+#: ../src/pulse/channelmap.c:128
+msgid "Auxiliary 5"
+msgstr "Avustava 5"
+
+#: ../src/pulse/channelmap.c:129
+msgid "Auxiliary 6"
+msgstr "Avustava 6"
+
+#: ../src/pulse/channelmap.c:130
+msgid "Auxiliary 7"
+msgstr "Avustava 7"
+
+#: ../src/pulse/channelmap.c:131
+msgid "Auxiliary 8"
+msgstr "Avustava 8"
+
+#: ../src/pulse/channelmap.c:132
+msgid "Auxiliary 9"
+msgstr "Avustava 9"
+
+#: ../src/pulse/channelmap.c:133
+msgid "Auxiliary 10"
+msgstr "Avustava 10"
+
+#: ../src/pulse/channelmap.c:134
+msgid "Auxiliary 11"
+msgstr "Avustava 11"
+
+#: ../src/pulse/channelmap.c:135
+msgid "Auxiliary 12"
+msgstr "Avustava 12"
+
+#: ../src/pulse/channelmap.c:136
+msgid "Auxiliary 13"
+msgstr "Avustava 13"
+
+#: ../src/pulse/channelmap.c:137
+msgid "Auxiliary 14"
+msgstr "Avustava 14"
+
+#: ../src/pulse/channelmap.c:138
+msgid "Auxiliary 15"
+msgstr "Avustava 15"
+
+#: ../src/pulse/channelmap.c:139
+msgid "Auxiliary 16"
+msgstr "Avustava 16"
+
+#: ../src/pulse/channelmap.c:140
+msgid "Auxiliary 17"
+msgstr "Avustava 17"
+
+#: ../src/pulse/channelmap.c:141
+msgid "Auxiliary 18"
+msgstr "Avustava 18"
+
+#: ../src/pulse/channelmap.c:142
+msgid "Auxiliary 19"
+msgstr "Avustava 19"
+
+#: ../src/pulse/channelmap.c:143
+msgid "Auxiliary 20"
+msgstr "Avustava 20"
+
+#: ../src/pulse/channelmap.c:144
+msgid "Auxiliary 21"
+msgstr "Avustava 21"
+
+#: ../src/pulse/channelmap.c:145
+msgid "Auxiliary 22"
+msgstr "Avustava 22"
+
+#: ../src/pulse/channelmap.c:146
+msgid "Auxiliary 23"
+msgstr "Avustava 23"
+
+#: ../src/pulse/channelmap.c:147
+msgid "Auxiliary 24"
+msgstr "Avustava 24"
+
+#: ../src/pulse/channelmap.c:148
+msgid "Auxiliary 25"
+msgstr "Avustava 25"
+
+#: ../src/pulse/channelmap.c:149
+msgid "Auxiliary 26"
+msgstr "Avustava 26"
+
+#: ../src/pulse/channelmap.c:150
+msgid "Auxiliary 27"
+msgstr "Avustava 27"
+
+#: ../src/pulse/channelmap.c:151
+msgid "Auxiliary 28"
+msgstr "Avustava 28"
+
+#: ../src/pulse/channelmap.c:152
+msgid "Auxiliary 29"
+msgstr "Avustava 29"
+
+#: ../src/pulse/channelmap.c:153
+msgid "Auxiliary 30"
+msgstr "Avustava 30"
+
+#: ../src/pulse/channelmap.c:154
+msgid "Auxiliary 31"
+msgstr "Avustava 31"
+
+#: ../src/pulse/channelmap.c:156
+msgid "Top Center"
+msgstr "Keski ylä"
+
+#: ../src/pulse/channelmap.c:158
+msgid "Top Front Center"
+msgstr "Keski ylä etu"
+
+#: ../src/pulse/channelmap.c:159
+msgid "Top Front Left"
+msgstr "Vasen ylä etu"
+
+#: ../src/pulse/channelmap.c:160
+msgid "Top Front Right"
+msgstr "Oikea ylä etu"
+
+#: ../src/pulse/channelmap.c:162
+msgid "Top Rear Center"
+msgstr "Keski ylä taka"
+
+#: ../src/pulse/channelmap.c:163
+msgid "Top Rear Left"
+msgstr "Vasen ylä taka"
+
+#: ../src/pulse/channelmap.c:164
+msgid "Top Rear Right"
+msgstr "Oikea ylä taka"
+
+#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170
+#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321
+#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371
+msgid "(invalid)"
+msgstr "(virheellinen)"
+
+#: ../src/pulse/channelmap.c:761
+msgid "Stereo"
+msgstr "Stereo"
+
+#: ../src/pulse/channelmap.c:766
+msgid "Surround 4.0"
+msgstr "4.0-tilaääni"
+
+#: ../src/pulse/channelmap.c:772
+msgid "Surround 4.1"
+msgstr "4.1-tilaääni"
+
+#: ../src/pulse/channelmap.c:778
+msgid "Surround 5.0"
+msgstr "5.0-tilaääni"
+
+#: ../src/pulse/channelmap.c:784
+msgid "Surround 5.1"
+msgstr "5.1-tilaääni"
+
+#: ../src/pulse/channelmap.c:791
+msgid "Surround 7.1"
+msgstr "7.1-tilaääni"
+
+#: ../src/pulse/error.c:43
+msgid "OK"
+msgstr "OK"
+
+#: ../src/pulse/error.c:44
+msgid "Access denied"
+msgstr "Pääsy evätty"
+
+#: ../src/pulse/error.c:45
+msgid "Unknown command"
+msgstr "Tuntematon komento"
+
+#: ../src/pulse/error.c:46
+msgid "Invalid argument"
+msgstr "Virheellinen argumentti"
+
+#: ../src/pulse/error.c:47
+msgid "Entity exists"
+msgstr "Entiteetti on jo olemassa"
+
+#: ../src/pulse/error.c:48
+msgid "No such entity"
+msgstr "Ei kyseisenlaista entiteettiä"
+
+#: ../src/pulse/error.c:49
+msgid "Connection refused"
+msgstr "Yhteys hylätty"
+
+#: ../src/pulse/error.c:50
+msgid "Protocol error"
+msgstr "Yhteyskäytäntövirhe"
+
+#: ../src/pulse/error.c:51
+msgid "Timeout"
+msgstr "Aikakatkaisu"
+
+#: ../src/pulse/error.c:52
+msgid "No authorization key"
+msgstr "Ei todentamisavainta"
+
+#: ../src/pulse/error.c:53
+msgid "Internal error"
+msgstr "Sisäinen virhe"
+
+#: ../src/pulse/error.c:54
+msgid "Connection terminated"
+msgstr "Yhteys katkennut"
+
+#: ../src/pulse/error.c:55
+msgid "Entity killed"
+msgstr "Entiteetti lopetettu"
+
+#: ../src/pulse/error.c:56
+msgid "Invalid server"
+msgstr "Virheellinen palvelin"
+
+#: ../src/pulse/error.c:57
+msgid "Module initalization failed"
+msgstr "Moduulin alustus epäonnistui"
+
+#: ../src/pulse/error.c:58
+msgid "Bad state"
+msgstr "Virheellinen tila"
+
+#: ../src/pulse/error.c:59
+msgid "No data"
+msgstr "Ei dataa"
+
+#: ../src/pulse/error.c:60
+msgid "Incompatible protocol version"
+msgstr "Epäyhteensopiva yhteyskäytännön versio"
+
+#: ../src/pulse/error.c:61
+msgid "Too large"
+msgstr "Liian suuri"
+
+#: ../src/pulse/error.c:62
+msgid "Not supported"
+msgstr "Ei tuettu"
+
+#: ../src/pulse/error.c:63
+msgid "Unknown error code"
+msgstr "Tuntematon virhekoodi"
+
+#: ../src/pulse/error.c:64
+msgid "No such extension"
+msgstr "Ei kyseisenlaista laajennusta"
+
+#: ../src/pulse/error.c:65
+msgid "Obsolete functionality"
+msgstr "Puuttuva toiminnallisuus"
 
-#: ../src/pavucontrol.desktop.in.h:2 ../src/pavucontrol.cc:476
-msgid "PulseAudio Volume Control"
-msgstr "PulseAudion äänenvoimakkuuden hallinta"
+#: ../src/pulse/error.c:66
+msgid "Missing implementation"
+msgstr "Puuttuva toteutus"
 
-#: ../src/pavucontrol.desktop.in.h:3 ../src/pavucontrol.glade.h:32
-msgid "Volume Control"
-msgstr "Äänenvoimakkuus"
+#: ../src/pulse/error.c:67
+msgid "Client forked"
+msgstr "Asiakasohjelma haarautui"
 
-#: ../src/pavucontrol.glade.h:2
-#, no-c-format
-msgid "50%"
-msgstr "50%"
+#: ../src/pulse/error.c:68
+msgid "Input/Output error"
+msgstr "Siirräntävirhe"
 
-#: ../src/pavucontrol.glade.h:3
-msgid "<b>Port:</b>"
-msgstr "<b>Portti:</b>"
+#: ../src/pulse/error.c:69
+msgid "Device or resource busy"
+msgstr "Laite tai resurssi on varattu"
 
-#: ../src/pavucontrol.glade.h:4
-msgid "<b>Profile:</b>"
-msgstr "<b>Profiili:</b>"
+#: ../src/pulse/sample.c:172
+#, c-format
+msgid "%s %uch %uHz"
+msgstr "%s %u kan. %uHz"
+
+#: ../src/pulse/sample.c:184
+#, c-format
+msgid "%0.1f GiB"
+msgstr "%0.1f GiB"
+
+#: ../src/pulse/sample.c:186
+#, c-format
+msgid "%0.1f MiB"
+msgstr "%0.1f MiB"
+
+#: ../src/pulse/sample.c:188
+#, c-format
+msgid "%0.1f KiB"
+msgstr "%0.1f KiB"
+
+#: ../src/pulse/sample.c:190
+#, c-format
+msgid "%u B"
+msgstr "%u B"
 
-#: ../src/pavucontrol.glade.h:5
-msgid "<b>S_how:</b>"
-msgstr "<b>N_äytä:</b>"
+#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100
+msgid "XOpenDisplay() failed"
+msgstr "XOpenDisplay() epäonnistui"
 
-#: ../src/pavucontrol.glade.h:6
-msgid "<b>Sho_w:</b>"
-msgstr "<b>Nä_ytä:</b>"
+#: ../src/pulse/client-conf-x11.c:93
+msgid "Failed to parse cookie data"
+msgstr "Evästetietojen jäsennys epäonnistui"
 
-#: ../src/pavucontrol.glade.h:7
-msgid "<b>_Show:</b>"
-msgstr "<b>_Näytä:</b>"
+#: ../src/pulse/client-conf.c:111
+#, c-format
+msgid "Failed to open configuration file '%s': %s"
+msgstr "Asetustiedoston avaaminen epäonnistui: ”%s”: %s"
 
-#: ../src/pavucontrol.glade.h:8
-msgid "<b>left-front</b>"
-msgstr "<b>vasen-etu</b>"
+#: ../src/pulse/context.c:550
+msgid "No cookie loaded. Attempting to connect without."
+msgstr "Ei ladattua evästettä. Yritetään yhdistämistä ilman."
 
-#: ../src/pavucontrol.glade.h:9
-msgid "<i>No application is currently playing audio.</i>"
-msgstr "<i>Yksikään sovellus ei tällä hetkellä toista ääntä.</i>"
+#: ../src/pulse/context.c:693
+#, c-format
+msgid "fork(): %s"
+msgstr "fork(): %s"
 
-#: ../src/pavucontrol.glade.h:10
-msgid "<i>No application is currently recording audio.</i>"
-msgstr "<i>Yksikään sovellus ei tällä hetkellä nauhoita ääntä.</i>"
+#: ../src/pulse/context.c:748
+#, c-format
+msgid "waitpid(): %s"
+msgstr "waitpid(): %s"
 
-#: ../src/pavucontrol.glade.h:11
-msgid "<i>No cards available for configuration</i>"
-msgstr "<i>Yhtäkään äänikorttia ei ole käytettävissä</i>"
+#: ../src/pulse/context.c:1438
+#, c-format
+msgid "Received message for unknown extension '%s'"
+msgstr "Saatiin viesti tuntemattomalle laajennokselle ”%s”"
 
-#: ../src/pavucontrol.glade.h:12
-msgid "<i>No input devices available</i>"
-msgstr "<i>Sisääntulolaitteita ei saatavilla</i>"
+#: ../src/utils/pacat.c:108
+#, c-format
+msgid "Failed to drain stream: %s"
+msgstr "Virran tyhjentäminen epäonnistui: %s"
+
+#: ../src/utils/pacat.c:113
+msgid "Playback stream drained."
+msgstr "Toistovirta on tyhjennetty."
+
+#: ../src/utils/pacat.c:123
+msgid "Draining connection to server."
+msgstr "Tyhjennetään yhteyttä palvelimelle."
+
+#: ../src/utils/pacat.c:136
+#, c-format
+msgid "pa_stream_drain(): %s"
+msgstr "pa_stream_drain(): %s"
+
+#: ../src/utils/pacat.c:159
+#, c-format
+msgid "pa_stream_write() failed: %s"
+msgstr "pa_stream_write() epäonnistui: %s"
+
+#: ../src/utils/pacat.c:197
+#, c-format
+msgid "pa_stream_begin_write() failed: %s"
+msgstr "pa_stream_write() epäonnistui: %s"
+
+#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#, c-format
+msgid "pa_stream_peek() failed: %s"
+msgstr "pa_stream_peek() epäonnistui: %s"
+
+#: ../src/utils/pacat.c:307
+msgid "Stream successfully created."
+msgstr "Virran luonti onnistui."
+
+#: ../src/utils/pacat.c:310
+#, c-format
+msgid "pa_stream_get_buffer_attr() failed: %s"
+msgstr "pa_stream_get_buffer_attr() epäonnistui: %s"
+
+#: ../src/utils/pacat.c:314
+#, c-format
+msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
+msgstr "Puskuritiedot: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
+
+#: ../src/utils/pacat.c:317
+#, c-format
+msgid "Buffer metrics: maxlength=%u, fragsize=%u"
+msgstr "Puskuritiedot: maxlength=%u, fragsize=%u"
+
+#: ../src/utils/pacat.c:321
+#, c-format
+msgid "Using sample spec '%s', channel map '%s'."
+msgstr "Käytetään näytemäärittelyä ”%s”, kanavakarttaa ”%s”."
+
+#: ../src/utils/pacat.c:325
+#, c-format
+msgid "Connected to device %s (%u, %ssuspended)."
+msgstr "Yhdistetty laitteeseen %s (%u, %ssuspended)."
 
-#: ../src/pavucontrol.glade.h:13
-msgid "<i>No output devices available</i>"
-msgstr "<i>Ulostulolaitteita ei saatavilla</i>"
+#: ../src/utils/pacat.c:335
+#, c-format
+msgid "Stream error: %s"
+msgstr "Virtavirhe: %s"
+
+#: ../src/utils/pacat.c:345
+#, c-format
+msgid "Stream device suspended.%s"
+msgstr "Virtalaite keskeytetty.%s"
+
+#: ../src/utils/pacat.c:347
+#, c-format
+msgid "Stream device resumed.%s"
+msgstr "Virtalaite palautettu.%s"
+
+#: ../src/utils/pacat.c:355
+#, c-format
+msgid "Stream underrun.%s"
+msgstr "Virran alivuoto.%s"
+
+#: ../src/utils/pacat.c:362
+#, c-format
+msgid "Stream overrun.%s"
+msgstr "Virran ylivuoto.%s"
+
+#: ../src/utils/pacat.c:369
+#, c-format
+msgid "Stream started.%s"
+msgstr "Virta käynnistetty.%s"
+
+#: ../src/utils/pacat.c:376
+#, c-format
+msgid "Stream moved to device %s (%u, %ssuspended).%s"
+msgstr "Virta siirretty laitteelle %s (%u, %ssuspended).%s"
+
+#: ../src/utils/pacat.c:376
+msgid "not "
+msgstr "ei "
+
+#: ../src/utils/pacat.c:383
+#, c-format
+msgid "Stream buffer attributes changed.%s"
+msgstr "Virran puskuriattribuutteja muutettu.%s"
+
+#: ../src/utils/pacat.c:415
+#, c-format
+msgid "Connection established.%s"
+msgstr "Yhteys muodostettu.%s"
+
+#: ../src/utils/pacat.c:418
+#, c-format
+msgid "pa_stream_new() failed: %s"
+msgstr "pa_stream_new() epäonnistui: %s"
+
+#: ../src/utils/pacat.c:450
+#, c-format
+msgid "pa_stream_connect_playback() failed: %s"
+msgstr "pa_stream_connect_playback() epäonnistui: %s"
+
+#: ../src/utils/pacat.c:456
+#, c-format
+msgid "pa_stream_connect_record() failed: %s"
+msgstr "pa_stream_connect_record() epäonnistui: %s"
+
+#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#, c-format
+msgid "Connection failure: %s"
+msgstr "Yhteysvirhe: %s"
+
+#: ../src/utils/pacat.c:503
+msgid "Got EOF."
+msgstr "Saatiin EOF."
+
+#: ../src/utils/pacat.c:540
+#, c-format
+msgid "write() failed: %s"
+msgstr "write() epäonnistui: %s"
+
+#: ../src/utils/pacat.c:561
+msgid "Got signal, exiting."
+msgstr "Saatiin signaali, lopetetaan."
+
+#: ../src/utils/pacat.c:575
+#, c-format
+msgid "Failed to get latency: %s"
+msgstr "Latenssin selvittäminen epäonnistui: %s"
+
+#: ../src/utils/pacat.c:580
+#, c-format
+msgid "Time: %0.3f sec; Latency: %0.0f usec."
+msgstr "Aika: %0.3f s; Latenssi: %0.0f μs."
 
-#: ../src/pavucontrol.glade.h:14
+#: ../src/utils/pacat.c:599
+#, c-format
+msgid "pa_stream_update_timing_info() failed: %s"
+msgstr "pa_stream_update_timing_info() epäonnistui: %s"
+
+#: ../src/utils/pacat.c:609
+#, c-format
 msgid ""
-"All Input Devices\n"
-"All Except Monitors\n"
-"Hardware Input Devices\n"
-"Virtual Input Devices\n"
-"Monitors"
+"%s [options]\n"
+"\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"\n"
+"  -r, --record                          Create a connection for recording\n"
+"  -p, --playback                        Create a connection for playback\n"
+"\n"
+"  -v, --verbose                         Enable verbose operations\n"
+"\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
+"  -d, --device=DEVICE                   The name of the sink/source to "
+"connect to\n"
+"  -n, --client-name=NAME                How to call this client on the "
+"server\n"
+"      --stream-name=NAME                How to call this stream on the "
+"server\n"
+"      --volume=VOLUME                   Specify the initial (linear) volume "
+"in range 0...65536\n"
+"      --rate=SAMPLERATE                 The sample rate in Hz (defaults to "
+"44100)\n"
+"      --format=SAMPLEFORMAT             The sample type, one of s16le, "
+"s16be, u8, float32le,\n"
+"                                        float32be, ulaw, alaw, s32le, s32be, "
+"s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to "
+"s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, "
+"2 for stereo\n"
+"                                        (defaults to 2)\n"
+"      --channel-map=CHANNELMAP          Channel map to use instead of the "
+"default\n"
+"      --fix-format                      Take the sample format from the sink "
+"the stream is\n"
+"                                        being connected to.\n"
+"      --fix-rate                        Take the sampling rate from the sink "
+"the stream is\n"
+"                                        being connected to.\n"
+"      --fix-channels                    Take the number of channels and the "
+"channel map\n"
+"                                        from the sink the stream is being "
+"connected to.\n"
+"      --no-remix                        Don't upmix or downmix channels.\n"
+"      --no-remap                        Map channels by index instead of "
+"name.\n"
+"      --latency=BYTES                   Request the specified latency in "
+"bytes.\n"
+"      --process-time=BYTES              Request the specified process time "
+"per request in bytes.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the "
+"specified value.\n"
+"      --raw                             Record/play raw PCM data.\n"
+"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --list-file-formats               List available file formats.\n"
 msgstr ""
-"Kaikki sisääntulolaitteet\n"
-"Kaikki paitsi tarkkailulaitteet\n"
-"Laitteistosisääntulolaitteet\n"
-"Näennäissisääntulolaitteet\n"
-"Tarkkailulaitteet"
+"%s [valitsimet]\n"
+"\n"
+"  -h, --help                            Näytä tämä ohje\n"
+"      --version                         Näytä versio\n"
+"\n"
+"  -r, --record                          Luo yhteys nauhoitukselle\n"
+"  -p, --playback                        Luo yhteys toistolle\n"
+"\n"
+"  -v, --verbose                         Yksityiskohtaiset tulosteet\n"
+"\n"
+"  -s, --server=PALVELIN                 Sen palvelimen nimi, johon "
+"yhdistetään\n"
+"  -d, --device=LAITE                    Sen nielun/lähteen nimi, johon "
+"yhdistetään\n"
+"  -n, --client-name=NIMI                Kuinka tätä asiakasohjelmaa "
+"kutsutaan palvelimella\n"
+"      --stream-name=NIMI                Kuinka tätä virtaa kutsutaan "
+"palvelimella\n"
+"      --volume=ÄÄNENVOIMAKKUUS          Määritä (lineaarinen) "
+"aloitusäänenvoimakkuus väliltä 0...65536\n"
+"      --rate=NÄYTTEENOTTOTAAJUUS        Näytteenottotaajuus hertseinä"
+"(oletus: 44100)\n"
+"      --format=NÄYTEMUOTO               Näytteen tyyppi, yksi seuraavista:"
+"s16le, s16be, u8, float32le,\n"
+"                                        float32be, ulaw, alaw, s32le, s32be\n"
+"s24le, s24be,\n"
+"                                        s24-32le, s24-32be (oletus s16ne)\n"
+"      --channels=KANAVIA                Kanavien määrä, 1=mono, 2=stereo\n"
+"                                        (oletus: 2)\n"
+"      --channel-map=KANAVAKARTTA        Oletuksen sijasta käytettävä "
+"kanavakartta\n"
+"      --fix-format                      Valitse näytemuoto nielusta, jossa "
+"virta on\n"
+"      --fix-rate                        Valitse näytteenottotaajuus "
+"nielusta, jossa virta on\n"
+"      --fix-channels                    Valitse kanavien määrä ja "
+"kanavakartta nielusta, johon virtaa\n"
+"                                        yhdistetään.\n"
+"      --no-remix                        Älä yli- tai alimiksaa kanavia.\n"
+"      --no-remap                        Kartoita kanavat indeksin mukaan, "
+"älä nimen mukaan.\n"
+"      --latency=TAVUA                   Pyydä määritettyä latenssia "
+"tavuissa.\n"
+"      --process-time=TAVUA              Pyydä määritettyä prosessiaikaa "
+"pyyntöä kohti tavuissa.\n"
+"      --property=ASETUS=ARVO            Anna määritetylle asetukselle "
+"määritetty arvo.\n"
+"      --raw                             Tallenna/soita raakaa PCM-dataa.\n"
+"      --file-format=TMUOTO              Tallenna/soita tietyn muotoista PCM-"
+"dataa.\n"
+"      --list-file-formats               Luettele käytettävissä olevat "
+"tiedostomuodot.\n"
+
+#: ../src/utils/pacat.c:731
+#, c-format
+msgid ""
+"pacat %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
+msgstr ""
+"pacat %s\n"
+"Käännetty libpulsen versiolle %s\n"
+"Linkitetty libpulsen versiolle %s\n"
+
+#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#, c-format
+msgid "Invalid client name '%s'"
+msgstr "Virheellinen asiakasohjelman nimi ”%s”"
+
+#: ../src/utils/pacat.c:779
+#, c-format
+msgid "Invalid stream name '%s'"
+msgstr "Virheellinen virran nimi ”%s”"
+
+#: ../src/utils/pacat.c:816
+#, c-format
+msgid "Invalid channel map '%s'"
+msgstr "Virheellinen kanavakartta ”%s”"
+
+#: ../src/utils/pacat.c:845
+#, c-format
+msgid "Invalid latency specification '%s'"
+msgstr "Virheellinen latenssimääritys ”%s”"
+
+#: ../src/utils/pacat.c:852
+#, c-format
+msgid "Invalid process time specification '%s'"
+msgstr "Virheellinen prosessiajan määritys ”%s”"
+
+#: ../src/utils/pacat.c:864
+#, c-format
+msgid "Invalid property '%s'"
+msgstr "Virheellinen asetus ”%s”"
+
+#: ../src/utils/pacat.c:881
+#, c-format
+msgid "Unknown file format %s."
+msgstr "Tuntematon tiedostomuoto %s."
+
+#: ../src/utils/pacat.c:900
+msgid "Invalid sample specification"
+msgstr "Virheellinen näytemääritys"
+
+#: ../src/utils/pacat.c:910
+#, c-format
+msgid "open(): %s"
+msgstr "open(): %s"
+
+#: ../src/utils/pacat.c:915
+#, c-format
+msgid "dup2(): %s"
+msgstr "dup2(): %s"
+
+#: ../src/utils/pacat.c:922
+msgid "Too many arguments."
+msgstr "Liian monta argumenttia."
 
-#: ../src/pavucontrol.glade.h:19
+#: ../src/utils/pacat.c:933
+msgid "Failed to generate sample specification for file."
+msgstr "Näytemäärityksen generointi tiedostolle epäonnistui."
+
+#: ../src/utils/pacat.c:953
+msgid "Failed to open audio file."
+msgstr "Äänitiedoston avaaminen epäonnistui."
+
+#: ../src/utils/pacat.c:959
 msgid ""
-"All Output Devices\n"
-"Hardware Output Devices\n"
-"Virtual Output Devices"
+"Warning: specified sample specification will be overwritten with "
+"specification from file."
 msgstr ""
-"Kaikki ulostulolaitteet\n"
-"Laitteistoulostulolaitteet\n"
-"Näennäisulostulolaitteet"
+"Varoitus: tiedostosta luettava näytemääritys korvaa annetun määrityksen."
+
+#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+msgid "Failed to determine sample specification from file."
+msgstr "Näytemäärityksen selvittäminen tiedostosta epäonnistui."
+
+#: ../src/utils/pacat.c:971
+msgid "Warning: Failed to determine channel map from file."
+msgstr "Varoitus: Kanavakartan selvittäminen tiedostosta epäonnistui."
+
+#: ../src/utils/pacat.c:982
+msgid "Channel map doesn't match sample specification"
+msgstr "Kanavakartta ei vastaa näytemääritystä"
+
+#: ../src/utils/pacat.c:993
+msgid "Warning: failed to write channel map to file."
+msgstr "Varoitus: kanavakartan kirjoittaminen tiedostoon epäonnistui."
+
+#: ../src/utils/pacat.c:1008
+#, c-format
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr "Avataan %svirta näytemäärityksellä ”%s” ja kanavakartalla ”%s”."
+
+#: ../src/utils/pacat.c:1009
+msgid "recording"
+msgstr "nauhoitus"
+
+#: ../src/utils/pacat.c:1009
+msgid "playback"
+msgstr "toisto"
+
+#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+msgid "pa_mainloop_new() failed."
+msgstr "pa_mainloop_new() epäonnistui."
+
+#: ../src/utils/pacat.c:1054
+msgid "io_new() failed."
+msgstr "io_new() epäonnistui."
+
+#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+msgid "pa_context_new() failed."
+msgstr "pa_context_new() epäonnistui."
+
+#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#, c-format
+msgid "pa_context_connect() failed: %s"
+msgstr "pa_context_connect() epäonnistui: %s"
+
+#: ../src/utils/pacat.c:1075
+msgid "pa_context_rttime_new() failed."
+msgstr "pa_context_new() epäonnistui."
+
+#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+msgid "pa_mainloop_run() failed."
+msgstr "pa_mainloop_run() epäonnistui."
+
+#: ../src/utils/pasuspender.c:81
+#, c-format
+msgid "fork(): %s\n"
+msgstr "fork(): %s\n"
+
+#: ../src/utils/pasuspender.c:92
+#, c-format
+msgid "execvp(): %s\n"
+msgstr "execvp(): %s\n"
+
+#: ../src/utils/pasuspender.c:109
+#, c-format
+msgid "Failure to suspend: %s\n"
+msgstr "Keskeytys epäonnistui: %s\n"
+
+#: ../src/utils/pasuspender.c:124
+#, c-format
+msgid "Failure to resume: %s\n"
+msgstr "Palautus epäonnistui: %s\n"
+
+#: ../src/utils/pasuspender.c:147
+#, c-format
+msgid "WARNING: Sound server is not local, not suspending.\n"
+msgstr "VAROITUS: Äänipalvelin ei ole paikallinen, ei keskeytetä.\n"
+
+#: ../src/utils/pasuspender.c:159
+#, c-format
+msgid "Connection failure: %s\n"
+msgstr "Yhteysvirhe: %s\n"
+
+#: ../src/utils/pasuspender.c:176
+#, c-format
+msgid "Got SIGINT, exiting.\n"
+msgstr "Saatiin SIGINT, lopetetaan.\n"
+
+#: ../src/utils/pasuspender.c:194
+#, c-format
+msgid "WARNING: Child process terminated by signal %u\n"
+msgstr "VAROITUS: Lapsiprosessi lopetettiin signaalilla %u\n"
 
-#. Applications All streams
-#: ../src/pavucontrol.glade.h:23
+#: ../src/utils/pasuspender.c:212
+#, c-format
+msgid ""
+"%s [options] ... \n"
+"\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
+"\n"
+msgstr ""
+"%s [valitsimet] ... \n"
+"\n"
+"  -h, --help                            Näytä tämä ohje\n"
+"      --version                         Näytä versio\n"
+"  -s, --server=PALVELIN                 Sen palvelimen nimi, johon\n"
+"                                        yhdistetään\n"
+"\n"
+
+#: ../src/utils/pasuspender.c:248
+#, c-format
 msgid ""
-"All Streams\n"
-"Applications\n"
-"Virtual Streams"
+"pasuspender %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
 msgstr ""
-"Kaikki virrat\n"
-"Sovellukset\n"
-"Näennäisvirrat"
+"pasuspender %s\n"
+"Käännetty libpulsen versiolle %s\n"
+"Linkitetty libpulsen versiolle %s\n"
 
-#: ../src/pavucontrol.glade.h:26
-msgid "Card Name"
-msgstr "Kortin nimi"
+#: ../src/utils/pasuspender.c:277
+#, c-format
+msgid "pa_mainloop_new() failed.\n"
+msgstr "pa_mainloop_new() epäonnistui.\n"
 
-#: ../src/pavucontrol.glade.h:27
-msgid "Device"
-msgstr "Laite"
+#: ../src/utils/pasuspender.c:290
+#, c-format
+msgid "pa_context_new() failed.\n"
+msgstr "pa_context_new() epäonnistui.\n"
 
-#: ../src/pavucontrol.glade.h:28
-msgid "Lock channels together"
-msgstr "Lukitse kanavat yhteen"
+#: ../src/utils/pasuspender.c:298
+#, c-format
+msgid "pa_mainloop_run() failed.\n"
+msgstr "pa_mainloop_run() epäonnistui.\n"
 
-#: ../src/pavucontrol.glade.h:29
-msgid "Mute audio"
-msgstr "Vaimenna äänet"
+#: ../src/utils/pactl.c:135
+#, c-format
+msgid "Failed to get statistics: %s"
+msgstr "Tilastojen selvittäminen epäonnistui: %s"
 
-#: ../src/pavucontrol.glade.h:30
-msgid "Set as fallback"
-msgstr "Aseta toissijaiseksi"
+#: ../src/utils/pactl.c:141
+#, c-format
+msgid "Currently in use: %u blocks containing %s bytes total.\n"
+msgstr "Nyt käytössä: %u lohkoa sisältäen yhteensä %s tavua.\n"
+
+#: ../src/utils/pactl.c:144
+#, c-format
+msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
+msgstr "Koko käyttöaikana varattu: %u lohkoa sisältäen yhteensä %s tavua.\n"
+
+#: ../src/utils/pactl.c:147
+#, c-format
+msgid "Sample cache size: %s\n"
+msgstr "Näytevälimuistin koko: %s\n"
+
+#: ../src/utils/pactl.c:156
+#, c-format
+msgid "Failed to get server information: %s"
+msgstr "Palvelintietojen selvittäminen epäonnistui: %s"
+
+#: ../src/utils/pactl.c:164
+#, c-format
+msgid ""
+"User name: %s\n"
+"Host Name: %s\n"
+"Server Name: %s\n"
+"Server Version: %s\n"
+"Default Sample Specification: %s\n"
+"Default Channel Map: %s\n"
+"Default Sink: %s\n"
+"Default Source: %s\n"
+"Cookie: %08x\n"
+msgstr ""
+"Käyttäjänimi: %s\n"
+"Konenimi: %s\n"
+"Palvelimen nimi: %s\n"
+"Palvelimen versio: %s\n"
+"Oletusnäytemäärittely: %s\n"
+"Oletuskanavakartta: %s\n"
+"Oletusnielu: %s\n"
+"Oletuslähde: %s\n"
+"Eväste: %08x\n"
+
+#: ../src/utils/pactl.c:205
+#, c-format
+msgid "Failed to get sink information: %s"
+msgstr "Nielun tietojen nouto epäonnistui: %s"
+
+#: ../src/utils/pactl.c:221
+#, c-format
+msgid ""
+"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 ""
+"Nielu #%u\n"
+"\tTila: %s\n"
+"\tNimi: %s\n"
+"\tKuvaus: %s\n"
+"\tAjuri: %s\n"
+"\tNäytemäärittely: %s\n"
+"\tKanavakartta: %s\n"
+"\tOmistava moduuli: %u\n"
+"\tVaimennus: %s\n"
+"\tÄänenvoimakkuus: %s%s%s\n"
+"\t                 balanssi %0.2f\n"
+"\tPerusäänenvoimakkuus: %s%s%s\n"
+"\tTarkkailulähde: %s\n"
+"\tLatenssi: %0.0f μs, asetettu %0.0f μs\n"
+"\tLiput: %s%s%s%s%s%s\n"
+"\tOminaisuudet:\n"
+"\t\t%s\n"
+
+#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#, c-format
+msgid "\tPorts:\n"
+msgstr "\tPortit:\n"
 
-#: ../src/pavucontrol.glade.h:31
-msgid "Stream Title"
-msgstr "Virran otsikko"
+#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#, c-format
+msgid "\tActive Port: %s\n"
+msgstr "\tAktiivinen portti: %s\n"
 
-#: ../src/pavucontrol.glade.h:33
-msgid "_Configuration"
-msgstr "_Asetukset"
+#: ../src/utils/pactl.c:297
+#, c-format
+msgid "Failed to get source information: %s"
+msgstr "Lähteen tietojen nouto epäonnistui: %s"
 
-#: ../src/pavucontrol.glade.h:34
-msgid "_Input Devices"
-msgstr "S_isääntulolaitteet"
+#: ../src/utils/pactl.c:313
+#, c-format
+msgid ""
+"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 ""
+"Lähde #%u\n"
+"\tTila: %s\n"
+"\tNimi: %s\n"
+"\tKuvaus: %s\n"
+"\tAjuri: %s\n"
+"\tNäytemäärittely: %s\n"
+"\tKanavakartta: %s\n"
+"\tOmistava moduuli: %u\n"
+"\tVaimennus: %s\n"
+"\tÄänenvoimakkuus: %s%s%s\n"
+"\t                 balanssi %0.2f\n"
+"\tPerusäänenvoimakkuus: %s%s%s\n"
+"\tTarkkailtava nielu: %s\n"
+"\tLatenssi: %0.0f μs, asetettu %0.0f μs\n"
+"\tLiput: %s%s%s%s%s%s\n"
+"\tOminaisuudet:\n"
+"\t\t%s\n"
+
+#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
+#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
+#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
+#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
+#: ../src/utils/pactl.c:645
+msgid "n/a"
+msgstr "-"
+
+#: ../src/utils/pactl.c:375
+#, c-format
+msgid "Failed to get module information: %s"
+msgstr "Moduulin tietojen nouto epäonnistui: %s"
 
-#: ../src/pavucontrol.glade.h:35
-msgid "_Output Devices"
-msgstr "Ul_ostulolaitteet"
+#: ../src/utils/pactl.c:393
+#, c-format
+msgid ""
+"Module #%u\n"
+"\tName: %s\n"
+"\tArgument: %s\n"
+"\tUsage counter: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
+msgstr ""
+"Moduuli #%u\n"
+"\tNimi: %s\n"
+"\tArgumentti: %s\n"
+"\tKäyttölaskuri: %s\n"
+"\tOminaisuudet:\n"
+"\t\t%s\n"
+
+#: ../src/utils/pactl.c:412
+#, c-format
+msgid "Failed to get client information: %s"
+msgstr "Asiakkaan tietojen nouto epäonnistui: %s"
+
+#: ../src/utils/pactl.c:430
+#, c-format
+msgid ""
+"Client #%u\n"
+"\tDriver: %s\n"
+"\tOwner Module: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
+msgstr ""
+"Asiakas #%u\n"
+"\tAjuri: %s\n"
+"\tOmistava moduuli: %s\n"
+"\tOminaisuudet:\n"
+"\t\t%s\n"
 
-#: ../src/pavucontrol.glade.h:36
-msgid "_Playback"
-msgstr "_Toisto"
+#: ../src/utils/pactl.c:447
+#, c-format
+msgid "Failed to get card information: %s"
+msgstr "Kortin tietojen nouto epäonnistui: %s"
 
-#: ../src/pavucontrol.glade.h:37
-msgid "_Recording"
-msgstr "_Nauhoitus"
+#: ../src/utils/pactl.c:465
+#, c-format
+msgid ""
+"Card #%u\n"
+"\tName: %s\n"
+"\tDriver: %s\n"
+"\tOwner Module: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
+msgstr ""
+"Kortti #%u\n"
+"\tNimi: %s\n"
+"\tAjuri: %s\n"
+"\tOmistava moduuli: %s\n"
+"\tOminaisuudet:\n"
+"\t\t%s\n"
+
+#: ../src/utils/pactl.c:479
+#, c-format
+msgid "\tProfiles:\n"
+msgstr "\tProfiilit:\n"
 
-#: ../src/pavucontrol.glade.h:38
-msgid "direction"
-msgstr "suunta"
+#: ../src/utils/pactl.c:485
+#, c-format
+msgid "\tActive Profile: %s\n"
+msgstr "\tAktiivinen profiili: %s\n"
 
-#: ../src/pavucontrol.cc:73
-msgid "Card callback failure"
-msgstr "Kortin takaisinkutsu epäonnistui"
+#: ../src/utils/pactl.c:496
+#, c-format
+msgid "Failed to get sink input information: %s"
+msgstr "Nielun sisääntulon tietojen nouto epäonnistui: %s"
 
-#: ../src/pavucontrol.cc:92
-msgid "Sink callback failure"
-msgstr "Nielun takaisinkutsu epäonnistui"
+#: ../src/utils/pactl.c:515
+#, c-format
+msgid ""
+"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 ""
+"Nielun sisääntulo #%u\n"
+"\tAjuri: %s\n"
+"\tOmistava moduuli: %s\n"
+"\tAsiakas: %s\n"
+"\tNielu: %u\n"
+"\tNäytemäärittely: %s\n"
+"\tKanavakartta: %s\n"
+"\tVaimennus: %s\n"
+"\tÄänenvoimakkuus: %s\n"
+"\t                 %s\n"
+"\t                 balanssi %0.2f\n"
+"\tPuskurin latenssi: %0.0f μs\n"
+"\tNielun latenssi: %0.0f μs\n"
+"\tUudelleennäytteistyksen tapa: %s\n"
+"\tOminaisuudet:\n"
+"\t\t%s\n"
+
+#: ../src/utils/pactl.c:554
+#, c-format
+msgid "Failed to get source output information: %s"
+msgstr "Lähteen ulostulon tietojen nouto epäonnistui: %s"
 
-#: ../src/pavucontrol.cc:111
-msgid "Source callback failure"
-msgstr "Lähteen takaisinkutsu epäonnistui"
+#: ../src/utils/pactl.c:574
+#, c-format
+msgid ""
+"Source Output #%u\n"
+"\tDriver: %s\n"
+"\tOwner Module: %s\n"
+"\tClient: %s\n"
+"\tSource: %u\n"
+"\tSample Specification: %s\n"
+"\tChannel Map: %s\n"
+"\tBuffer Latency: %0.0f usec\n"
+"\tSource Latency: %0.0f usec\n"
+"\tResample method: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
+msgstr ""
+"Lähteen ulostulo #%u\n"
+"\tAjuri: %s\n"
+"\tOmistava moduuli: %s\n"
+"\tAsiakas: %s\n"
+"\tLähde: %u\n"
+"\tNäytemäärittely: %s\n"
+"\tKanavakartta: %s\n"
+"\tPuskurin latenssi: %0.0f μs\n"
+"\tLähteen latenssi: %0.0f μs\n"
+"\tUudelleennäytteistyksen tapa: %s\n"
+"\tOminaisuudet:\n"
+"\t\t%s\n"
+
+#: ../src/utils/pactl.c:605
+#, c-format
+msgid "Failed to get sample information: %s"
+msgstr "Näytetietojen nouto epäonnistui: %s"
 
-#: ../src/pavucontrol.cc:130
-msgid "Sink input callback failure"
-msgstr "Nielun sisääntulon takaisinkutsu epäonnistui"
+#: ../src/utils/pactl.c:623
+#, c-format
+msgid ""
+"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 ""
+"Näyte #%u\n"
+"\tNimi: %s\n"
+"\tNäytemäärittely: %s\n"
+"\tKanavakartta: %s\n"
+"\tÄänenvoimakkuus: %s\n"
+"\t                 %s\n"
+"\t                 balanssi %0.2f\n"
+"\tKesto: %0.1fs\n"
+"\tKoko: %s\n"
+"\tLaiska: %s\n"
+"\tTiedostonimi: %s\n"
+"\tOminaisuudet:\n"
+"\t\t%s\n"
+
+#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#, c-format
+msgid "Failure: %s"
+msgstr "Epäonnistuminen: %s"
 
-#: ../src/pavucontrol.cc:149
-msgid "Source output callback failure"
-msgstr "Lähteen ulostulon takaisinkutsu epäonnistui"
+#: ../src/utils/pactl.c:687
+#, c-format
+msgid "Failed to upload sample: %s"
+msgstr "Näytteen lähettäminen epäonnistui: %s"
 
-#: ../src/pavucontrol.cc:183
-msgid "Client callback failure"
-msgstr "Asiakkaan takaisinkutsu"
+#: ../src/utils/pactl.c:704
+msgid "Premature end of file"
+msgstr "Ennenaikainen tiedoston päättyminen"
 
-#: ../src/pavucontrol.cc:199
-msgid "Server info callback failure"
-msgstr "Palvelintietojen takaisinkutsu epäonnistui"
+#: ../src/utils/pactl.c:863
+msgid "Got SIGINT, exiting."
+msgstr "Saatiin SIGINT, lopetetaan."
 
-#: ../src/pavucontrol.cc:217 ../src/pavucontrol.cc:430
+#: ../src/utils/pactl.c:869
 #, c-format
-msgid "Failed to initialize stream_restore extension: %s"
-msgstr "stream_restore-laajennoksen alustus epäonnistui: %s"
+msgid ""
+"%s [options] stat\n"
+"%s [options] list\n"
+"%s [options] exit\n"
+"%s [options] upload-sample FILENAME [NAME]\n"
+"%s [options] play-sample NAME [SINK]\n"
+"%s [options] remove-sample NAME\n"
+"%s [options] move-sink-input SINKINPUT SINK\n"
+"%s [options] move-source-output SOURCEOUTPUT SOURCE\n"
+"%s [options] load-module NAME [ARGS ...]\n"
+"%s [options] unload-module MODULE\n"
+"%s [options] suspend-sink SINK 1|0\n"
+"%s [options] suspend-source SOURCE 1|0\n"
+"%s [options] set-card-profile CARD PROFILE\n"
+"%s [options] set-sink-port SINK PORT\n"
+"%s [options] set-source-port SOURCE PORT\n"
+"%s [options] set-sink-volume SINK VOLUME\n"
+"%s [options] set-source-volume SOURCE VOLUME\n"
+"%s [options] set-sink-input-volume SINKINPUT VOLUME\n"
+"%s [options] set-sink-mute SINK 1|0\n"
+"%s [options] set-source-mute SOURCE 1|0\n"
+"%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"\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"
+msgstr ""
+"%s [valitsimet] stat\n"
+"%s [valitsimet] list\n"
+"%s [valitsimet] exit\n"
+"%s [valitsimet] upload-sample TIEDOSTONIMI [NIMI]\n"
+"%s [valitsimet] play-sample NIMI [NIELU]\n"
+"%s [valitsimet] remove-sample NIMI\n"
+"%s [valitsimet] move-sink-input NIELUSISÄÄNMENO NIELU\n"
+"%s [valitsimet] move-source-output LÄHDEULOSTULO LÄHDE\n"
+"%s [valitsimet] load-module NIMI [ARGUMENTIT ...]\n"
+"%s [valitsimet] unload-module MODUULI\n"
+"%s [valitsimet] suspend-sink NIELU 1|0\n"
+"%s [valitsimet] suspend-source LÄHDE 1|0\n"
+"%s [valitsimet] set-card-profile KORTTI PROFIILI\n"
+"%s [valitsimet] set-sink-port NIELU PORTTI\n"
+"%s [valitsimet] set-source-port LÄHDE PORTTI\n"
+"%s [valitsimet] set-sink-volume NIELU VOIMAKKUUS\n"
+"%s [valitsimet] set-source-volume LÄHDE VOIMAKKUUS\n"
+"%s [valitsimet] set-sink-input-volume NIELUSISÄÄNMENO VOIMAKKUUS\n"
+"%s [valitsimet] set-sink-mute NIELU 1|0\n"
+"%s [valitsimet] set-source-mute LÄHDE 1|0\n"
+"%s [valitsimet] set-sink-input-mute NIELUSISÄÄNMENO 1|0\n"
+"\n"
+"  -h, --help                            Näytä tämä ohje\n"
+"      --version                         Näytä versio\n"
+"\n"
+"  -s, --server=PALVELIN                 Sen palvelimen nimi, johon "
+"yhdistetään\n"
+"  -n, --client-name=NIMI                Kuinka tätä asiakasohjelmaa "
+"kutsutaan palvelimella\n"
+
+#: ../src/utils/pactl.c:933
+#, c-format
+msgid ""
+"pactl %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
+msgstr ""
+"pactl %s\n"
+"Käännetty libpulsen versiolle %s\n"
+"Linkitetty libpulsen versiolle %s\n"
+
+#: ../src/utils/pactl.c:979
+msgid "Please specify a sample file to load"
+msgstr "Anna ladattava näytetiedosto"
+
+#: ../src/utils/pactl.c:992
+msgid "Failed to open sound file."
+msgstr "Äänitiedoston avaaminen epäonnistui."
+
+#: ../src/utils/pactl.c:1004
+msgid "Warning: Failed to determine sample specification from file."
+msgstr "Varoitus: näytemäärityksen selvitys tiedostosta epäonnistui."
+
+#: ../src/utils/pactl.c:1014
+msgid "You have to specify a sample name to play"
+msgstr "Soitettavan näytteen nimi on annettava"
+
+#: ../src/utils/pactl.c:1026
+msgid "You have to specify a sample name to remove"
+msgstr "Poistettavan näytteen nimi on annettava"
+
+#: ../src/utils/pactl.c:1035
+msgid "You have to specify a sink input index and a sink"
+msgstr "Nielun syöteindeksi ja nielu on annettava"
+
+#: ../src/utils/pactl.c:1045
+msgid "You have to specify a source output index and a source"
+msgstr "Lähteen ulostuloindeksi ja lähde on annettava"
+
+#: ../src/utils/pactl.c:1060
+msgid "You have to specify a module name and arguments."
+msgstr "Moduulin nimi ja argumentit on annettava."
+
+#: ../src/utils/pactl.c:1080
+msgid "You have to specify a module index"
+msgstr "Moduulin indeksi on annettava"
+
+#: ../src/utils/pactl.c:1090
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
+msgstr "Ei voi antaa enempää kuin yhden nielun. Totuusarvo on annettava."
+
+#: ../src/utils/pactl.c:1103
+msgid ""
+"You may not specify more than one source. You have to specify a boolean "
+"value."
+msgstr "Ei voi antaa enempää kuin yhden lähteen. Totuusarvo on annettava."
+
+#: ../src/utils/pactl.c:1115
+msgid "You have to specify a card name/index and a profile name"
+msgstr "Kortin nimi/indeksi ja profiilin nimi on annettava"
+
+#: ../src/utils/pactl.c:1126
+msgid "You have to specify a sink name/index and a port name"
+msgstr "Nielun nimi/indeksi ja portin nimi on annettava"
+
+#: ../src/utils/pactl.c:1137
+msgid "You have to specify a source name/index and a port name"
+msgstr "Lähteen nimi/indeksi ja portin nimi on annettava"
+
+#: ../src/utils/pactl.c:1149
+msgid "You have to specify a sink name/index and a volume"
+msgstr "Nielun nimi/indeksi ja portin nimi on annettava"
+
+#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
+#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
+#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+msgid "Invalid volume specification"
+msgstr "Virheellinen äänenvoimakkuuden määritys"
+
+#: ../src/utils/pactl.c:1166
+msgid "You have to specify a source name/index and a volume"
+msgstr "Lähteen nimi/indeksi ja äänenvoimakkuus on annettava"
+
+#: ../src/utils/pactl.c:1183
+msgid "You have to specify a sink input index and a volume"
+msgstr "Nielun syöteindeksi ja äänenvoimakkuus on annettava"
+
+#: ../src/utils/pactl.c:1188
+msgid "Invalid sink input index"
+msgstr "Virheellinen nielun syöteindeksi"
 
-#: ../src/pavucontrol.cc:235
-msgid "pa_ext_stream_restore_read() failed"
-msgstr "pa_ext_stream_restore_read() epäonnistui"
+#: ../src/utils/pactl.c:1204
+msgid "You have to specify a sink name/index and a mute boolean"
+msgstr "Nielun nimi/indeksi ja vaimennuksen totuusarvo on annettava"
 
-#: ../src/pavucontrol.cc:252
-msgid "pa_context_get_sink_info_by_index() failed"
-msgstr "pa_context_get_sink_info_by_index() epäonnistui"
+#: ../src/utils/pactl.c:1221
+msgid "You have to specify a source name/index and a mute boolean"
+msgstr "Lähteen nimi/indeksi ja vaimennuksen totuusarvo on annettava"
 
-#: ../src/pavucontrol.cc:265
-msgid "pa_context_get_source_info_by_index() failed"
-msgstr "pa_context_get_source_info_by_index() epäonnistui"
+#: ../src/utils/pactl.c:1238
+msgid "You have to specify a sink input index and a mute boolean"
+msgstr "Nielun syöteindeksi ja vaimennuksen totuusarvo on annettava"
 
-#: ../src/pavucontrol.cc:278 ../src/pavucontrol.cc:291
-msgid "pa_context_get_sink_input_info() failed"
-msgstr "pa_context_get_sink_input_info() epäonnistui"
+#: ../src/utils/pactl.c:1243
+msgid "Invalid sink input index specification"
+msgstr "Virheellinen nielun syöteindeksin määritys"
 
-#: ../src/pavucontrol.cc:304
-msgid "pa_context_get_client_info() failed"
-msgstr "pa_context_get_client_info() epäonnistui"
+#: ../src/utils/pactl.c:1262
+msgid "No valid command specified."
+msgstr "Mitään kelvollista komentoa ei annettu."
 
-#: ../src/pavucontrol.cc:314 ../src/pavucontrol.cc:371
-msgid "pa_context_get_server_info() failed"
-msgstr "pa_context_get_server_info() epäonnistui"
+#: ../src/utils/pax11publish.c:61
+#, c-format
+msgid ""
+"%s [-D display] [-S server] [-O sink] [-I source] [-c file]  [-d|-e|-i|-r]\n"
+"\n"
+" -d    Show current PulseAudio data attached to X11 display (default)\n"
+" -e    Export local PulseAudio data to X11 display\n"
+" -i    Import PulseAudio data from X11 display to local environment "
+"variables and cookie file.\n"
+" -r    Remove PulseAudio data from X11 display\n"
+msgstr ""
+"%s [-D näyttö] [-S palvelin] [-O nielu] [-I lähde] [-c tiedosto]  [-d|-e|-i|-"
+"r]\n"
+"\n"
+" -d    Näytä nykyiseen X11-näyttöön yhdistetyn PulseAudion tiedot (oletus)\n"
+" -e    Vie paikalliset PulseAudio-tiedot X11-näytölle\n"
+" -i    Tuo PulseAudio-tiedot X11-näytöltä paikallisiin ympäristömuuttujiin "
+"ja\n"
+"       evästetiedostoon.\n"
+" -r    Poista PulseAudio-tiedostot X11-näytöltä\n"
+
+#: ../src/utils/pax11publish.c:94
+#, c-format
+msgid "Failed to parse command line.\n"
+msgstr "Komentorivin jäsentäminen epäonnistui.\n"
+
+#: ../src/utils/pax11publish.c:108
+#, c-format
+msgid "Server: %s\n"
+msgstr "Palvelin: %s\n"
+
+#: ../src/utils/pax11publish.c:110
+#, c-format
+msgid "Source: %s\n"
+msgstr "Lähde: %s\n"
 
-#: ../src/pavucontrol.cc:327
-msgid "pa_context_get_card_info_by_index() failed"
-msgstr "pa_context_get_card_info_by_index() epäonnistui"
+#: ../src/utils/pax11publish.c:112
+#, c-format
+msgid "Sink: %s\n"
+msgstr "Nielu: %s\n"
 
-#: ../src/pavucontrol.cc:362
-msgid "pa_context_subscribe() failed"
-msgstr "pa_context_subscribe() epäonnistui"
+#: ../src/utils/pax11publish.c:114
+#, c-format
+msgid "Cookie: %s\n"
+msgstr "Eväste: %s\n"
 
-#: ../src/pavucontrol.cc:378
-msgid "pa_context_client_info_list() failed"
-msgstr "pa_context_client_info_list() epäonnistui"
+#: ../src/utils/pax11publish.c:132
+#, c-format
+msgid "Failed to parse cookie data\n"
+msgstr "Evästetietojen jäsennys epäonnistui\n"
 
-#: ../src/pavucontrol.cc:385
-msgid "pa_context_get_card_info_list() failed"
-msgstr "pa_context_get_card_info_list() epäonnistui"
+#: ../src/utils/pax11publish.c:137
+#, c-format
+msgid "Failed to save cookie data\n"
+msgstr "Evästetietojen tallennus epäonnistui\n"
 
-#: ../src/pavucontrol.cc:392
-msgid "pa_context_get_sink_info_list() failed"
-msgstr "pa_context_get_sink_info_list() epäonnistui"
+#: ../src/utils/pax11publish.c:152
+#, c-format
+msgid "Failed to load client configuration file.\n"
+msgstr "Asiakasohjelman asetustiedoston lataaminen epäonnistui.\n"
 
-#: ../src/pavucontrol.cc:399
-msgid "pa_context_get_source_info_list() failed"
-msgstr "pa_context_get_source_info_list() epäonnistui"
+#: ../src/utils/pax11publish.c:157
+#, c-format
+msgid "Failed to read environment configuration data.\n"
+msgstr "Ympäristön asetustietojen lukeminen epäonnistui.\n"
 
-#: ../src/pavucontrol.cc:406
-msgid "pa_context_get_sink_input_info_list() failed"
-msgstr "pa_context_get_sink_input_info_list() epäonnistui"
+#: ../src/utils/pax11publish.c:174
+#, c-format
+msgid "Failed to get FQDN.\n"
+msgstr "Verkkonimen saaminen epäonnistui.\n"
 
-#: ../src/pavucontrol.cc:413
-msgid "pa_context_get_source_output_info_list() failed"
-msgstr "pa_context_get_source_output_info_list() epäonnistui"
+#: ../src/utils/pax11publish.c:194
+#, c-format
+msgid "Failed to load cookie data\n"
+msgstr "Evästetietojen lataaminen epäonnistui\n"
 
-#: ../src/pavucontrol.cc:437
-msgid "Connection failed"
-msgstr "Yhteys epäonnistui"
+#: ../src/utils/pax11publish.c:211
+#, c-format
+msgid "Not yet implemented.\n"
+msgstr "Toteutusta ei vielä ole.\n"
 
-#: ../src/cardwidget.cc:87
-msgid "pa_context_set_card_profile_by_index() failed"
-msgstr "pa_context_set_card_profile_by_index() epäonnistui"
+#: ../src/utils/pacmd.c:69
+msgid "No PulseAudio daemon running, or not running as session daemon."
+msgstr ""
+"PulseAudio-taustaprosessi ei ole käynnissä eikä PulseAudiota suoriteta "
+"istunnon taustaprosessina."
 
-#: ../src/channelwidget.cc:104
-msgid "<small>Silence</small>"
-msgstr "<small>Hiljaisuus</small>"
+#: ../src/utils/pacmd.c:74
+#, c-format
+msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
+msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/channelwidget.cc:104
-msgid "<small>Min</small>"
-msgstr "<small>Minimi</small>"
+#: ../src/utils/pacmd.c:91
+#, c-format
+msgid "connect(): %s"
+msgstr "connect(): %s"
 
-#: ../src/channelwidget.cc:105
-msgid "<small>Max</small>"
-msgstr "<small>Maksimi</small>"
+#: ../src/utils/pacmd.c:99
+msgid "Failed to kill PulseAudio daemon."
+msgstr "PulseAudio-taustaprosessin lopettaminen epäonnistui."
 
-#: ../src/channelwidget.cc:109
-msgid "<small><i>Base</i></small>"
-msgstr "<small><i>Perus</i></small>"
+#: ../src/utils/pacmd.c:107
+msgid "Daemon not responding."
+msgstr "Taustaprosessi ei vastaa."
 
-#: ../src/mainwindow.cc:269
-msgid "Failed to read data from stream"
-msgstr "Datan lukeminen virrasta epäonnistui"
+#: ../src/utils/pacmd.c:161
+#, c-format
+msgid "poll(): %s"
+msgstr "poll(): %s"
 
-#: ../src/mainwindow.cc:304 ../src/mainwindow.cc:341
-msgid "Peak detect"
-msgstr "Huipun tunnistus"
+#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#, c-format
+msgid "read(): %s"
+msgstr "read(): %s"
 
-#: ../src/mainwindow.cc:305 ../src/mainwindow.cc:342
-msgid "Failed to create monitoring stream"
-msgstr "Tarkkailuvirran luonti epäonnistui"
+#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#, c-format
+msgid "write(): %s"
+msgstr "write(): %s"
 
-#: ../src/mainwindow.cc:313 ../src/mainwindow.cc:351
-msgid "Failed to connect monitoring stream"
-msgstr "Tarkkailuvirtaan yhdistäminen epäonnistui"
+#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+msgid "Cannot access autospawn lock."
+msgstr "Automaattisen käynnistyksen lukkoa ei voida käyttää."
 
-#: ../src/mainwindow.cc:466
+#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
+#, c-format
+msgid ""
+"ALSA woke us up to write new data to the device, but there was actually "
+"nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
+msgstr ""
+"ALSA herätti taustaprosessin kirjoittamaan uutta dataa laitteelle, mutta "
+"mitään kirjoitettavaa ei ollut!\n"
+"Tämä on luultavasti ohjelmavirhe ALSA-ajurissa ”%s”. Raportoi tästä "
+"ongelmasta ALSA-kehittäjille. Taustaprosessi herätettiin POLLOUT "
+"asetettuna,  snd_pcm_avail() palautti kuitenkin 0 tai jonkin muun arvon, "
+"joka on < min_avail."
+
+#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
+#, c-format
 msgid ""
-"Ignoring sink-input due to it being designated as an event and thus handled "
-"by the Event widget"
+"ALSA woke us up to read new data from the device, but there was actually "
+"nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
+msgstr ""
+"ALSA herätti taustaprosessin lukemaan uutta dataa laitteelta, mutta mitään "
+"luettavaa ei ollut!\n"
+"Tämä on luultavasti ohjelmavirhe ALSA-ajurissa ”%s”. Raportoi tästä "
+"ongelmasta ALSA-kehittäjille. Taustaprosessi herätettiin POLLIN asetettuna,  "
+"snd_pcm_avail() palautti kuitenkin 0 tai jonkin muun arvon, on < min_avail."
+
+#: ../src/modules/alsa/module-alsa-card.c:152
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
+#: ../src/modules/alsa/alsa-mixer.c:2931
+msgid "Off"
+msgstr "Poissa"
+
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+msgid "High Fidelity Playback (A2DP)"
+msgstr "Korkean äänenlaadun toisto (A2DP)"
+
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+msgid "High Fidelity Capture (A2DP)"
+msgstr "Korkean äänenlaadun tallennus (A2DP)"
+
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+msgid "Telephony Duplex (HSP/HFP)"
+msgstr ""
+
+#: ../src/modules/reserve-wrap.c:151
+msgid "PulseAudio Sound Server"
+msgstr "PulseAudio-äänipalvelin"
+
+#: ../src/modules/module-rygel-media-server.c:569
+#: ../src/modules/module-rygel-media-server.c:583
+msgid "Output Devices"
+msgstr ""
+
+#: ../src/modules/module-rygel-media-server.c:570
+#: ../src/modules/module-rygel-media-server.c:584
+#, fuzzy
+msgid "Input Devices"
+msgstr "Sisääntulo %s"
+
+#: ../src/modules/module-rygel-media-server.c:774
+msgid "Audio on @HOSTNAME@"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1701
+#, fuzzy
+msgid "Input"
+msgstr "Sisääntulo %s"
+
+#: ../src/modules/alsa/alsa-mixer.c:1702
+msgid "Docking Station Input"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1703
+msgid "Docking Station Microphone"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1704
+msgid "Line-In"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1705
+msgid "Microphone"
 msgstr ""
-"Ohitetaan nielusisäänmeno, koska se on määrätty tapahtumaksi ja siksi sen "
-"käsittelee Event-elementti"
 
-#: ../src/mainwindow.cc:618
-msgid "System Sounds"
-msgstr "Järjestelmän äänet"
+#: ../src/modules/alsa/alsa-mixer.c:1706
+msgid "External Microphone"
+msgstr ""
 
-#: ../src/rolewidget.cc:71
-msgid "pa_ext_stream_restore_write() failed"
-msgstr "pa_ext_stream_restore_write() epäonnistui"
+#: ../src/modules/alsa/alsa-mixer.c:1707
+#, fuzzy
+msgid "Internal Microphone"
+msgstr "Sisäinen äänentoisto"
 
-#: ../src/sinkinputwidget.cc:35
-msgid "on"
-msgstr "päällä"
+#: ../src/modules/alsa/alsa-mixer.c:1708
+msgid "Radio"
+msgstr ""
 
-#: ../src/sinkinputwidget.cc:38
-msgid "Terminate Playback"
-msgstr "Lopeta toisto"
+#: ../src/modules/alsa/alsa-mixer.c:1709
+msgid "Video"
+msgstr ""
 
-#: ../src/sinkinputwidget.cc:61
-msgid "Unknown output"
-msgstr "Tuntematon ulostulo"
+#: ../src/modules/alsa/alsa-mixer.c:1710
+msgid "Automatic Gain Control"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1711
+msgid "No Automatic Gain Control"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1712
+msgid "Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1713
+msgid "No Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1714
+msgid "Amplifier"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1715
+msgid "No Amplifier"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1773
+#, fuzzy
+msgid "Analog Input"
+msgstr "Analoginen mono"
+
+#: ../src/modules/alsa/alsa-mixer.c:1774
+#, fuzzy
+msgid "Analog Microphone"
+msgstr "Analoginen mono"
+
+#: ../src/modules/alsa/alsa-mixer.c:1775
+#, fuzzy
+msgid "Analog Line-In"
+msgstr "Analoginen mono"
+
+#: ../src/modules/alsa/alsa-mixer.c:1776
+#, fuzzy
+msgid "Analog Radio"
+msgstr "Analoginen mono"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
+#, fuzzy
+msgid "Analog Video"
+msgstr "Analoginen stereo"
+
+#: ../src/modules/alsa/alsa-mixer.c:1778
+#, fuzzy
+msgid "Analog Output"
+msgstr "Tyhjä ulostulo"
+
+#: ../src/modules/alsa/alsa-mixer.c:1779
+#, fuzzy
+msgid "Analog Headphones"
+msgstr "Analoginen mono"
+
+#: ../src/modules/alsa/alsa-mixer.c:1780
+msgid "Analog Output (LFE)"
+msgstr ""
 
-#: ../src/sinkinputwidget.cc:72
-msgid "pa_context_set_sink_input_volume() failed"
-msgstr "pa_context_set_sink_input_volume() epäonnistui"
+#: ../src/modules/alsa/alsa-mixer.c:1781
+#, fuzzy
+msgid "Analog Mono Output"
+msgstr "Analoginen mono"
+
+#: ../src/modules/alsa/alsa-mixer.c:1981
+#, fuzzy, c-format
+msgid "%s+%s"
+msgstr "%s %s"
+
+#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#, fuzzy, c-format
+msgid "%s / %s"
+msgstr "%s %s"
+
+#: ../src/modules/alsa/alsa-mixer.c:2790
+msgid "Analog Mono"
+msgstr "Analoginen mono"
+
+#: ../src/modules/alsa/alsa-mixer.c:2791
+msgid "Analog Stereo"
+msgstr "Analoginen stereo"
+
+#: ../src/modules/alsa/alsa-mixer.c:2792
+#, fuzzy
+msgid "Analog Surround 2.1"
+msgstr "Analoginen tilaääni 4.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:2793
+#, fuzzy
+msgid "Analog Surround 3.0"
+msgstr "Analoginen tilaääni 4.0"
 
-#: ../src/sinkinputwidget.cc:87
-msgid "pa_context_set_sink_input_mute() failed"
-msgstr "pa_context_set_sink_input_mute() epäonnistui"
+#: ../src/modules/alsa/alsa-mixer.c:2794
+#, fuzzy
+msgid "Analog Surround 3.1"
+msgstr "Analoginen tilaääni 4.1"
 
-#: ../src/sinkinputwidget.cc:97
-msgid "pa_context_kill_sink_input() failed"
-msgstr "pa_context_kill_sink_input() epäonnistui"
+#: ../src/modules/alsa/alsa-mixer.c:2795
+msgid "Analog Surround 4.0"
+msgstr "Analoginen tilaääni 4.0"
 
-#: ../src/sinkinputwidget.cc:133
-msgid "pa_context_move_sink_input_by_index() failed"
-msgstr "pa_context_move_sink_input_by_index() epäonnistui"
+#: ../src/modules/alsa/alsa-mixer.c:2796
+msgid "Analog Surround 4.1"
+msgstr "Analoginen tilaääni 4.1"
 
-#: ../src/sinkwidget.cc:48
-msgid "pa_context_set_sink_volume_by_index() failed"
-msgstr "pa_context_set_sink_volume_by_index() epäonnistui"
+#: ../src/modules/alsa/alsa-mixer.c:2797
+msgid "Analog Surround 5.0"
+msgstr "Analoginen tilaääni 5.0"
 
-#: ../src/sinkwidget.cc:63
-msgid "Volume Control Feedback Sound"
-msgstr "Äänenvoimakkuuden säädön palauteääni"
+#: ../src/modules/alsa/alsa-mixer.c:2798
+msgid "Analog Surround 5.1"
+msgstr "Analoginen tilaääni 5.1"
 
-#: ../src/sinkwidget.cc:80
-msgid "pa_context_set_sink_mute_by_index() failed"
-msgstr "pa_context_set_sink_mute_by_index() epäonnistui"
+#: ../src/modules/alsa/alsa-mixer.c:2799
+#, fuzzy
+msgid "Analog Surround 6.0"
+msgstr "Analoginen tilaääni 4.0"
 
-#: ../src/sinkwidget.cc:94
-msgid "pa_context_set_default_sink() failed"
-msgstr "pa_context_set_default_sink() epäonnistui"
+#: ../src/modules/alsa/alsa-mixer.c:2800
+#, fuzzy
+msgid "Analog Surround 6.1"
+msgstr "Analoginen tilaääni 4.1"
 
-#: ../src/sinkwidget.cc:114
-msgid "pa_context_set_sink_port_by_index() failed"
-msgstr "pa_context_set_sink_port_by_index() epäonnistui"
+#: ../src/modules/alsa/alsa-mixer.c:2801
+#, fuzzy
+msgid "Analog Surround 7.0"
+msgstr "Analoginen tilaääni 4.0"
 
-#: ../src/sourceoutputwidget.cc:35
-msgid "from"
-msgstr "lähteestä"
+#: ../src/modules/alsa/alsa-mixer.c:2802
+msgid "Analog Surround 7.1"
+msgstr "Analoginen tilaääni 7.1"
 
-#: ../src/sourceoutputwidget.cc:38
-msgid "Terminate Recording"
-msgstr "Lopeta nauhoitus"
+#: ../src/modules/alsa/alsa-mixer.c:2803
+msgid "Digital Stereo (IEC958)"
+msgstr "Digitaalinen stereo (IEC958)"
 
-#: ../src/sourceoutputwidget.cc:61
-msgid "Unknown input"
-msgstr "Tuntematon sisääntulo"
+#: ../src/modules/alsa/alsa-mixer.c:2804
+#, fuzzy
+msgid "Digital Surround 4.0 (IEC958)"
+msgstr "Digitaalinen tilaääni 4.0 (IEC958/AC3)"
 
-#: ../src/sourceoutputwidget.cc:71
-msgid "pa_context_kill_source_output() failed"
-msgstr "pa_context_kill_source_output() epäonnistui"
+#: ../src/modules/alsa/alsa-mixer.c:2805
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr "Digitaalinen tilaääni 4.0 (IEC958/AC3)"
 
-#: ../src/sourceoutputwidget.cc:108
-msgid "pa_context_move_source_output_by_index() failed"
-msgstr "pa_context_move_source_output_by_index() epäonnistui"
+#: ../src/modules/alsa/alsa-mixer.c:2806
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr "Digitaalinen tilaääni 5.1 (IEC958/AC3)"
 
-#: ../src/sourcewidget.cc:44
-msgid "pa_context_set_source_volume_by_index() failed"
-msgstr "pa_context_set_source_volume_by_index() epäonnistui"
+#: ../src/modules/alsa/alsa-mixer.c:2807
+msgid "Digital Stereo (HDMI)"
+msgstr "Digitaalinen stereo (HDMI)"
 
-#: ../src/sourcewidget.cc:59
-msgid "pa_context_set_source_mute_by_index() failed"
-msgstr "pa_context_set_source_mute_by_index() epäonnistui"
+#: ../src/modules/alsa/alsa-mixer.c:2928
+#, fuzzy
+msgid "Analog Mono Duplex"
+msgstr "Analoginen mono"
 
-#: ../src/sourcewidget.cc:73
-msgid "pa_context_set_default_source() failed"
-msgstr "pa_context_set_default_source() epäonnistui"
+#: ../src/modules/alsa/alsa-mixer.c:2929
+#, fuzzy
+msgid "Analog Stereo Duplex"
+msgstr "Analoginen stereo"
 
-#: ../src/sourcewidget.cc:95
-msgid "pa_context_set_source_port_by_index() failed"
-msgstr "pa_context_set_source_port_by_index() epäonnistui"
+#: ../src/modules/alsa/alsa-mixer.c:2930
+#, fuzzy
+msgid "Digital Stereo Duplex (IEC958)"
+msgstr "Digitaalinen stereo (IEC958)"
 
-#: ../src/streamwidget.cc:45
-msgid "Terminate"
-msgstr "Lopeta"
+#~ msgid "Invalid client name '%s'\n"
+#~ msgstr "Virheellinen asiakasohjelman nimi ”%s”\n"
+
+#~ msgid "Failed to determine sample specification from file.\n"
+#~ msgstr "Näytemäärityksen selvitys tiedostosta epäonnistui: %s\n"
+
+#~ msgid "select(): %s"
+#~ msgstr "select(): %s"
+
+#~ msgid "Cannot connect to system bus: %s"
+#~ msgstr "Järjestelmäväylään ei voida yhdistää: %s"
+
+#~ msgid "Cannot get caller from PID: %s"
+#~ msgstr "Kutsujaa ei saada PID:stä: %s"
+
+#~ msgid "Cannot set UID on caller object."
+#~ msgstr "UID:tä ei voida asettaa kutsujaobjektille."
+
+#~ msgid "Failed to get CK session."
+#~ msgstr "CK-istunnon saaminen epäonnistui."
+
+#~ msgid "Cannot set UID on session object."
+#~ msgstr "UID:tä ei voida asettaa istunto-objektille."
+
+#~ msgid "Cannot allocate PolKitAction."
+#~ msgstr "Ei voida varata PolKitActionia."
+
+#~ msgid "Cannot set action_id"
+#~ msgstr "Ei voida asettaa action_id:tä"
+
+#~ msgid "Cannot allocate PolKitContext."
+#~ msgstr "Ei voida varata PolKitContextia."
+
+#~ msgid "Cannot initialize PolKitContext: %s"
+#~ msgstr "Ei voida alustaa PolKitContextia: %s"
+
+#~ msgid "Could not determine whether caller is authorized: %s"
+#~ msgstr "Ei voida päätellä onko kutsujalla käyttöoikeus: %s"
+
+#~ msgid "Cannot obtain auth: %s"
+#~ msgstr "Tunnistautumista ei saada: %s"
+
+#~ msgid "PolicyKit responded with '%s'"
+#~ msgstr "PolicyKit vastasi ”%s”"
 
-#~ msgid "Open menu"
-#~ msgstr "Avaa valikko"
+#~ msgid ""
+#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio "
+#~ "daemon"
+#~ msgstr ""
+#~ "Korkean prioriteetin ajoitus (negatiivinen Unix-nice-taso) PulseAudio-"
+#~ "taustajärjestelmälle"
 
-#~ msgid "_Move Stream..."
-#~ msgstr "_Siirrä virta"
+#~ msgid "Real-time scheduling for the PulseAudio daemon"
+#~ msgstr "Reaaliaikainen ajoitus PulseAudio-taustajärjestelmälle"
 
-#~ msgid "_Default"
-#~ msgstr "_Oletus"
+#~ msgid ""
+#~ "System policy prevents PulseAudio from acquiring high-priority scheduling."
+#~ msgstr ""
+#~ "Järjestelmäkäytäntö estää PulseAudiota saamasta korkean prioriteetin "
+#~ "ajoitusta."
+
+#~ msgid ""
+#~ "System policy prevents PulseAudio from acquiring real-time scheduling."
+#~ msgstr ""
+#~ "Järjestelmäkäytäntö estää PulseAudiota saamasta reaaliaikaista ajoitusta."
+
+#~ msgid "read() failed: %s\n"
+#~ msgstr "read() epäonnistui: %s\n"
+
+#, fuzzy
+#~ msgid "pa_context_connect() failed: %s\n"
+#~ msgstr "pa_context_connect() epäonnistui: %s"
+
+#~ msgid "We're in the group '%s', allowing high-priority scheduling."
+#~ msgstr "Ollaan ryhmässä ”%s”, korkean prioriteetin ajoitus on sallittua."
+
+#~ msgid "We're in the group '%s', allowing real-time scheduling."
+#~ msgstr "Ollaan ryhmässä ”%s”, tosiaikainen vuorottaminen on sallittua."
+
+#~ msgid "PolicyKit grants us acquire-high-priority privilege."
+#~ msgstr "PolicyKit myöntää acquire-high-priority-oikeuden."
+
+#~ msgid "PolicyKit refuses acquire-high-priority privilege."
+#~ msgstr "PolicyKit ei myönnä acquire-high-priority-oikeutta."
+
+#~ msgid "PolicyKit grants us acquire-real-time privilege."
+#~ msgstr "PolicyKit myöntää acquire-real-time-oikeuden."
+
+#~ msgid "PolicyKit refuses acquire-real-time privilege."
+#~ msgstr "PolicyKit ei myönnä acquire-real-time-oikeutta."
+
+#~ 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 '%s', 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 '%s', or increase "
+#~ "the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user."
+#~ msgstr ""
+#~ "Ohjelmaa kutsuttiin SUID-rootina ja reaaliaikaista ja/tai korkean "
+#~ "prioriteetin ajoitusta pyydettiin asetuksissa. Tarvittavat oikeudet "
+#~ "kuitenkin puuttuvat:\n"
+#~ "Ei olla ryhmässä ”%s”, PolicyKit ei myönnä pyydettyjä oikeuksia ja "
+#~ "RLIMIT_NICE/RLIMIT_RTPRIO-resurssirajoja ei ole kasvatettu.\n"
+#~ "Hanki riittävät PolicyKit-oikeudet, liity ryhmään ”%s” tai kasvata tämän "
+#~ "käyttäjän RLIMIT_NICE/RLIMIT_RTPRIO-resurssirajoja reaaliaikaisen ja/tai "
+#~ "korkean prioriteetin ajoituksen ottamiseksi käyttöön."
+
+#~ msgid ""
+#~ "High-priority scheduling enabled in configuration but not allowed by "
+#~ "policy."
+#~ msgstr ""
+#~ "Korkean prioriteetin ajoitus otettu käyttöön asetuksissa, mutta käytännöt "
+#~ "eivät salli sitä."
+
+#~ msgid "Successfully increased RLIMIT_RTPRIO"
+#~ msgstr "RLIMIT_RTPRIO:n kasvatus onnistui"
+
+#~ msgid "RLIMIT_RTPRIO failed: %s"
+#~ msgstr "RLIMIT_RTPRIO epäonnistui: %s"
+
+#~ msgid "Giving up CAP_NICE"
+#~ msgstr "Luovutaan CAP_NICE:stä"
+
+#~ 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ä."
+
+#~ msgid "Limited capabilities successfully to CAP_SYS_NICE."
+#~ msgstr "Oikeuksien rajoittaminen CAP_SYS_NICEen onnistui."
+
+#~ msgid "time_new() failed.\n"
+#~ msgstr "time_new() epäonnistui.\n"
+
+#~ msgid "Output %s + Input %s"
+#~ msgstr "Ulostulo %s + Sisääntulo %s"
+
+#~ msgid "Stream successfully created\n"
+#~ msgstr "Virran luonti onnistui\n"
+
+#~ msgid "Stream errror: %s\n"
+#~ msgstr "Virtavirhe: %s\n"
+
+#~ msgid "Connection established.\n"
+#~ msgstr "Yhteys muodostetettu.\n"
+
+#~ msgid ""
+#~ "%s [options] [FILE]\n"
+#~ "\n"
+#~ "  -h, --help                            Show this help\n"
+#~ "      --version                         Show version\n"
+#~ "\n"
+#~ "  -v, --verbose                         Enable verbose operation\n"
+#~ "\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"
+#~ "      --channel-map=CHANNELMAP          Set the channel map to the use\n"
+#~ msgstr ""
+#~ "%s [valitsimet] [TIEDOSTO]\n"
+#~ "\n"
+#~ "  -h, --help                            Näytä tämä ohje\n"
+#~ "      --version                         Näytä tiedostot\n"
+#~ "\n"
+#~ "  -v, --verbose                         Yksityiskohtaiset tulosteet\n"
+#~ "\n"
+#~ "  -s, --server=PALVELIN                 Sen palvelimen nimi, johon\n"
+#~ "                                        yhdistetään\n"
+#~ "  -d, --device=LAITE                    Sen nielun nimi, johon "
+#~ "yhdistetään\n"
+#~ "  -n, --client-name=NIMI                Kuinka tätä asiakasohjelmaa "
+#~ "kutsutaan\n"
+#~ "                                        palvelimella\n"
+#~ "      --stream-name=NIMI                Kuinka tätä virtaa kutsutaan\n"
+#~ "                                        palvelimella\n"
+#~ "      --volume=ÄÄNENVOIMAKKUUS          Määritä (lineaarinen) "
+#~ "aloitusäänen-\n"
+#~ "                                        voimakkuus väliltä 0...65536\n"
+#~ "      --channel-map=KANAVAKARTTA        Aseta käytettävä kanavakartta\n"
+
+#~ msgid ""
+#~ "paplay %s\n"
+#~ "Compiled with libpulse %s\n"
+#~ "Linked with libpulse %s\n"
+#~ msgstr ""
+#~ "paplay %s\n"
+#~ "Käännetty libpulsen versiolle %s\n"
+#~ "Linkitetty libpulsen versiolle %s\n"
+
+#~ msgid "Invalid channel map\n"
+#~ msgstr "Virheellinen kanavakartta\n"
+
+#~ msgid "Failed to open file '%s'\n"
+#~ msgstr "Tiedoston ”%s” avaaminen epäonnistui\n"
+
+#~ msgid "Channel map doesn't match file.\n"
+#~ msgstr "Kanavakartta ei täsmää tiedostoon.\n"
+
+#~ msgid "Using sample spec '%s'\n"
+#~ msgstr "Käytetään näytemäärittelyä ”%s”\n"
+
+#~ msgid "muted"
+#~ msgstr "vaimennettu"
+
+#~ msgid ""
+#~ "*** Autoload Entry #%u ***\n"
+#~ "Name: %s\n"
+#~ "Type: %s\n"
+#~ "Module: %s\n"
+#~ "Argument: %s\n"
+#~ msgstr ""
+#~ "*** Automaattilataustietue #%u ***\n"
+#~ "Nimi: %s\n"
+#~ "Tyyppi: %s\n"
+#~ "Moduuli: %s\n"
+#~ "Argumentto: %s\n"
+
+#~ msgid "sink"
+#~ msgstr "nielu"
+
+#~ msgid "source"
+#~ msgstr "lähde"

commit 3bfaa87d43fae773364cb2e776fdb988786e6551
Author: vpv <vpv at fedoraproject.org>
Date:   Mon Nov 9 13:17:22 2009 +0000

    Sending translation for Finnish

diff --git a/po/fi.po b/po/fi.po
index 515def3..cfb1437 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -8,7 +8,7 @@ msgstr ""
 "Project-Id-Version: git trunk\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-15 13:24+0300\n"
+"PO-Revision-Date: 2009-11-09 15:16+0200\n"
 "Last-Translator: Ville-Pekka Vainio <vpivaini at cs.helsinki.fi>\n"
 "Language-Team: Finnish <laatu at lokalisointi.org>\n"
 "MIME-Version: 1.0\n"
@@ -2378,133 +2378,122 @@ msgstr "PulseAudio-äänipalvelin"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "Ulostulolaitteet"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
-#, fuzzy
 msgid "Input Devices"
-msgstr "Sisääntulo %s"
+msgstr "Sisääntulolaitteet"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "Ääni koneella @HOSTNAME@"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
-#, fuzzy
 msgid "Input"
-msgstr "Sisääntulo %s"
+msgstr "Sisääntulo"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "Telakan sisääntulo"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "Telakan mikrofoni"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "Linjasisääntulo"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "Mikrofoni"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "Ulkoinen mikrofoni"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "Sisäinen äänentoisto"
+msgstr "Sisäinen mikrofoni"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "Radio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "Video"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "Automaattinen äänenvoimakkuuden säätö"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "Ei automaattista äänenvoimakkuuden säätöä"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "Vahvistus"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "Ei vahvistusta"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "Vahvistin"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "Ei vahvistinta"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
-#, fuzzy
 msgid "Analog Input"
-msgstr "Analoginen mono"
+msgstr "Analoginen sisääntulo"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
-#, fuzzy
 msgid "Analog Microphone"
-msgstr "Analoginen mono"
+msgstr "Analoginen mikrofoni"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
-#, fuzzy
 msgid "Analog Line-In"
-msgstr "Analoginen mono"
+msgstr "Analoginen linjasisääntulo"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
-#, fuzzy
 msgid "Analog Radio"
-msgstr "Analoginen mono"
+msgstr "Analoginen radio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
-#, fuzzy
 msgid "Analog Video"
-msgstr "Analoginen stereo"
+msgstr "Analoginen video"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "Tyhjä ulostulo"
+msgstr "Analoginen ulostulo"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
-#, fuzzy
 msgid "Analog Headphones"
-msgstr "Analoginen mono"
+msgstr "Analoginen kuulokeliitäntä"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "Analoginen ulostulo (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
-#, fuzzy
 msgid "Analog Mono Output"
-msgstr "Analoginen mono"
+msgstr "Analoginen monoulostulo"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
@@ -2515,19 +2504,16 @@ msgid "Analog Stereo"
 msgstr "Analoginen stereo"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "Analoginen tilaääni 4.1"
+msgstr "Analoginen tilaääni 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "Analoginen tilaääni 4.0"
+msgstr "Analoginen tilaääni 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "Analoginen tilaääni 4.1"
+msgstr "Analoginen tilaääni 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Surround 4.0"
@@ -2546,19 +2532,16 @@ msgid "Analog Surround 5.1"
 msgstr "Analoginen tilaääni 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "Analoginen tilaääni 4.0"
+msgstr "Analoginen tilaääni 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "Analoginen tilaääni 4.1"
+msgstr "Analoginen tilaääni 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "Analoginen tilaääni 4.0"
+msgstr "Analoginen tilaääni 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 7.1"
@@ -2569,9 +2552,8 @@ msgid "Digital Stereo (IEC958)"
 msgstr "Digitaalinen stereo (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
-#, fuzzy
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr "Digitaalinen tilaääni 4.0 (IEC958/AC3)"
+msgstr "Digitaalinen tilaääni 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"

commit 3cc8d518899d9a0ff1dcebf68dd90fe4bcb726f6
Author: kkrothap <kkrothap at fedoraproject.org>
Date:   Thu Nov 12 12:24:19 2009 +0000

    Sending translation for Telugu

diff --git a/po/te.po b/po/te.po
index 31fa09a..ca99a27 100644
--- a/po/te.po
+++ b/po/te.po
@@ -7,15 +7,15 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.te\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-21 17:28+0530\n"
+"POT-Creation-Date: 2009-11-12 04:07+0000\n"
+"PO-Revision-Date: 2009-11-12 13:10+0530\n"
 "Last-Translator: Krishna Babu K <kkrothap at redhat.com>\n"
 "Language-Team: Telugu <en at li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11.4\n"
-"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n\n"
 "\n"
 "\n"
 "\n"
@@ -1520,8 +1520,7 @@ msgstr "హెచ్చరిక: ప్రసారమార్గ మాప్
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "%s స్ట్రీమ్‌ను మాదిరి విశదీకరణ '%s' మరియు ప్రసారమార్గ మాప్ '%s'తో తెరుచుచున్నది."
 
 #: ../src/utils/pacat.c:1009
@@ -2111,17 +2110,14 @@ msgid "You have to specify a module index"
 msgstr "మీరు మాడ్యూల్ విషయసూచిక తెలుపవలసి వుంది"
 
 #: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
-msgstr ""
-"మీరు వొక సింకు కన్నా యెక్కువ తెలుపవలసి వుండకపోవచ్చు. మీరు బూలియన్ విలువను తెలుపవలసి వుంది."
+msgid "You may not specify more than one sink. You have to specify a boolean value."
+msgstr "మీరు వొక సింకు కన్నా యెక్కువ తెలుపవలసి వుండకపోవచ్చు. మీరు బూలియన్ విలువను తెలుపవలసి వుంది."
 
 #: ../src/utils/pactl.c:1103
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr ""
-"మీరు వొక మూలము కన్నా యెక్కువ తెలుపవలసి వుండకపోవచ్చు. మీరు బూలియన్ విలువను తెలుపవలసి వుంది."
+msgstr "మీరు వొక మూలము కన్నా యెక్కువ తెలుపవలసి వుండకపోవచ్చు. మీరు బూలియన్ విలువను తెలుపవలసి వుంది."
 
 #: ../src/utils/pactl.c:1115
 msgid "You have to specify a card name/index and a profile name"
@@ -2354,217 +2350,204 @@ msgstr "పల్స్ ఆడియో సౌండ్ సేవిక"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "అవుట్పుట్ పరికరములు"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "ఇన్పుట్ పరికరములు"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "@HOSTNAME@ పై ఆడియో"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "ఇన్పుట్"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "డాకింగ్ స్టేషన్ ఇన్పుట్"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "డాకింగ్ స్టేషన్ మైక్రోఫోన్"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "లైన్-యిన్"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "మైక్రోఫోన్"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "బహిర్గత మైక్రోఫోన్"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "అంతర్గత ఆడియో"
+msgstr "అంతర్గత మైక్రోఫోన్"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "రేడియో"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "వీడియో"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "స్వయంచాలకంగా పొందు నియంత్రణ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "స్వయంచాలకంగా పొందు ఏ నియంత్రణ లేదు"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "బూస్ట్"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "బూస్ట్ లేదు"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "ఎంప్లిఫైర్"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "ఎంప్లిఫైర్ లేదు"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "ఎనలాగ్ యిన్పుట్"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "ఎనలాగ్ మైక్రోఫోన్"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "ఎనలాగ్ లైన్-యిన్"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "ఎనలాగ్ రేడియో"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "ఎనలాగ్ వీడియో"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "Null అవుట్పుట్"
+msgstr "ఎనలాగ్ అవుట్పుట్"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "ఎనలాగ్ హెడ్‌ఫోన్స్"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "ఎనలాగ్ అవుట్పుట్ (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "ఎనలాగ్ మోనో అవుట్పుట్"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "ఎనలాగ్ మోనో"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
-#, fuzzy
 msgid "Analog Stereo"
-msgstr "స్టీరియో"
+msgstr "ఎనలాగ్ స్టీరియో"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "సరౌండ్ 4.1"
+msgstr "ఎనలాగ్ సరౌండ్ 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "సరౌండ్ 4.0"
+msgstr "ఎనలాగ్ సరౌండ్ 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "సరౌండ్ 4.1"
+msgstr "ఎనలాగ్ సరౌండ్ 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
-#, fuzzy
 msgid "Analog Surround 4.0"
-msgstr "సరౌండ్ 4.0"
+msgstr "ఎనలాగ్ సరౌండ్ 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
-#, fuzzy
 msgid "Analog Surround 4.1"
-msgstr "సరౌండ్ 4.1"
+msgstr "ఎనలాగ్ సరౌండ్ 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
-#, fuzzy
 msgid "Analog Surround 5.0"
-msgstr "సరౌండ్ 5.0"
+msgstr "ఎనలాగ్ సరౌండ్ 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
-#, fuzzy
 msgid "Analog Surround 5.1"
-msgstr "సరౌండ్ 5.1"
+msgstr "ఎనలాగ్ సరౌండ్ 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "సరౌండ్ 4.0"
+msgstr "ఎనలాగ్ సరౌండ్ 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "సరౌండ్ 4.1"
+msgstr "ఎనలాగ్ సరౌండ్ 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "సరౌండ్ 4.0"
+msgstr "ఎనలాగ్ సరౌండ్ 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
-#, fuzzy
 msgid "Analog Surround 7.1"
-msgstr "సరౌండ్ 7.1"
+msgstr "ఎనలాగ్ సరౌండ్ 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "డిజిటల్ స్టీరియో (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "డిజిటల్ సరౌండ్ 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "డిజిటల్ సరౌండ్ 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "డిజిటల్ సరౌండ్ 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "డిజిటల్ స్టీరియో (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "ఎనలాగ్ మోనో డుప్లెక్స్"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "ఎనలాగ్ స్టీరియో డుప్లెక్స్"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "డిజిటల్ స్టీరియో డుప్లెక్స్ (IEC958)"
+

commit 5c9c4e1d48131a21c17ee211f43e9b70b55db971
Author: rajesh <rajesh at fedoraproject.org>
Date:   Fri Nov 13 10:19:18 2009 +0000

    Sending translation for Hindi

diff --git a/po/hi.po b/po/hi.po
index 2e313ba..5ebd929 100644
--- a/po/hi.po
+++ b/po/hi.po
@@ -7,15 +7,15 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-21 16:29+0530\n"
+"POT-Creation-Date: 2009-11-13 03:15+0000\n"
+"PO-Revision-Date: 2009-11-13 15:42+0530\n"
 "Last-Translator: Rajesh Ranjan <rajesh672 at gmail.com>\n"
 "Language-Team: Hindi <hindi.sf.net>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11.4\n"
-"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n\n"
 "\n"
 "\n"
 "\n"
@@ -208,8 +208,7 @@ msgstr "डेमॉन हटाने में विफल: %s"
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
-msgstr ""
-"यह प्रोग्राम बतौर रूट चलाने के लिए इच्छित नहीं है (unless --system is specified)."
+msgstr "यह प्रोग्राम बतौर रूट चलाने के लिए इच्छित नहीं है (unless --system is specified)."
 
 #: ../src/daemon/main.c:573
 msgid "Root privileges required."
@@ -385,8 +384,7 @@ msgstr "ताज़ा उच्च विभेदन टाइमर उप
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
-msgstr ""
-"आपका कर्नेल बुरी स्थिति में है! सलाह है कि उच्च विभेदन युक्त लिनक्स सक्रिय किया जाना चाहिए!"
+msgstr "आपका कर्नेल बुरी स्थिति में है! सलाह है कि उच्च विभेदन युक्त लिनक्स सक्रिय किया जाना चाहिए!"
 
 #: ../src/daemon/main.c:844
 msgid "pa_core_new() failed."
@@ -1524,8 +1522,7 @@ msgstr "चेतावनी: फ़ाइल में चैनल मैप
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "किसी %s स्ट्रीम को किसी नमूना विनिर्दिष्ता '%s' और चैनल मैप '%s' से खोल रहा है."
 
 #: ../src/utils/pacat.c:1009
@@ -2115,10 +2112,8 @@ msgid "You have to specify a module index"
 msgstr "आपको किसी मॉड्यूल सूची को निर्दिष्ट करना है"
 
 #: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
-msgstr ""
-"आप एक सिंक से अधिक निर्दिष्ट नहीं कर सकते हैं. आपको किसी बुलियन मान को निर्दिष्ट करना है."
+msgid "You may not specify more than one sink. You have to specify a boolean value."
+msgstr "आप एक सिंक से अधिक निर्दिष्ट नहीं कर सकते हैं. आपको किसी बुलियन मान को निर्दिष्ट करना है."
 
 #: ../src/utils/pactl.c:1103
 msgid ""
@@ -2361,217 +2356,204 @@ msgstr "पल्सऑडियो ध्वनि सर्वर"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "आउटपुट युक्ति"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "इनपुट युक्ति"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "@HOSTNAME@ पर ऑडियो"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "इनपुट"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "डॉकिंग स्टेशन इनपुट"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "डॉकिंग स्टेशन माइक्रोफोन"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "लाइन इन"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "माइक्रोफोन"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "बाहरी माइक्रोफोन"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "आंतरिक ऑडियो"
+msgstr "आंतरिक माइक्रोफोन"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "रेडियो"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "वीडियो"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "स्वचालित प्राप्ति नियंत्रण"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "कोई स्वचालित प्राप्ति नियंत्रण नहीं"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "बूस्ट"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "कोई बढ़ावा नहीं"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "एंप्लीफायर"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "कोई एंप्लीफायर नहीं"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "एनालॉग इनपुट"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "एनालॉग माइक्रोफोन"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "एनालॉग लाइन इन"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "एनालॉग रेडियो"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "एनालॉग वीडियो"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "रिक्त आउटपुट"
+msgstr "एनालॉग आउटपुट"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "एनालॉग हेडफोन"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "एनालॉग आउटपुट (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "एनालॉग एकल आउटपुट"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "एनालॉग मोनो"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
-#, fuzzy
 msgid "Analog Stereo"
-msgstr "स्टीरियो"
+msgstr "एनालॉग स्टीरियो"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "सर्राउंड 4.1"
+msgstr "एनालॉग सर्राउंड 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "सर्राउंड 4.0"
+msgstr "एनालॉग सर्राउंड 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "सर्राउंड 4.1"
+msgstr "एनालॉग सर्राउंड 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
-#, fuzzy
 msgid "Analog Surround 4.0"
-msgstr "सर्राउंड 4.0"
+msgstr "एनालॉग सर्राउंड 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
-#, fuzzy
 msgid "Analog Surround 4.1"
-msgstr "सर्राउंड 4.1"
+msgstr "एनालॉग सर्राउंड 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
-#, fuzzy
 msgid "Analog Surround 5.0"
-msgstr "सर्राउंड 5.0"
+msgstr "एनालॉग सर्राउंड 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
-#, fuzzy
 msgid "Analog Surround 5.1"
-msgstr "सर्राउंड 5.1"
+msgstr "एनालॉग सर्राउंड 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "सर्राउंड 4.0"
+msgstr "एनालॉग सर्राउंड 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "सर्राउंड 4.1"
+msgstr "एनालॉग सर्राउंड 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "सर्राउंड 4.0"
+msgstr "एनालॉग सर्राउंड 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
-#, fuzzy
 msgid "Analog Surround 7.1"
-msgstr "सर्राउंड 7.1"
+msgstr "एनालॉग सर्राउंड 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "डिजिटल स्टीरियो (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "डिजिटल सर्राउंड 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "डिजिटल सर्राउंड 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "डिजिटल सर्राउंड 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "डिजिटल सेटअप (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "एनालॉग एकल डुप्लेक्स"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "एनालॉग स्टीरियो डुप्लेक्स"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "डिजिटल स्टीरियो डुप्लेक्स (IEC958)"
+

commit 46c591992489fcb4f3aebe7bce1d63680fa25655
Author: ifelix <ifelix at fedoraproject.org>
Date:   Fri Nov 13 11:27:52 2009 +0000

    Sending translation for Tamil

diff --git a/po/ta.po b/po/ta.po
index 000b559..1a88bf2 100644
--- a/po/ta.po
+++ b/po/ta.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.ta\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-18 13:43+0530\n"
+"POT-Creation-Date: 2009-11-13 08:56+0000\n"
+"PO-Revision-Date: 2009-11-13 16:54+0530\n"
 "Last-Translator: I. Felix <ifelix at redhat.com>\n"
 "Language-Team: Tamil <fedora-trans-ta at redhat.com>\n"
 "MIME-Version: 1.0\n"
@@ -37,6 +37,7 @@ msgstr ""
 "\n"
 "\n"
 "\n"
+"\n"
 
 #: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
 #, c-format
@@ -241,8 +242,7 @@ msgstr "கணினி முறைமையில் இயங்குகி
 
 #: ../src/daemon/main.c:586
 msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr ""
-"கணினி முறைமையில் இயங்குகிறது, ஆனால் --disallow-module-loading அமைக்கப்படவில்லை!"
+msgstr "கணினி முறைமையில் இயங்குகிறது, ஆனால் --disallow-module-loading அமைக்கப்படவில்லை!"
 
 #: ../src/daemon/main.c:589
 msgid "Running in system mode, forcibly disabling SHM mode!"
@@ -1524,8 +1524,7 @@ msgstr "ஒலி கோப்பினை திறக்க முடியவ
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
-msgstr ""
-"எச்சரிக்கை: கோப்பிலிருந்து குறிப்பீட்டுடன் குறிக்கிட்ட மாதிரி குறிப்பீடு மேலெழுதப்படலாம்."
+msgstr "எச்சரிக்கை: கோப்பிலிருந்து குறிப்பீட்டுடன் குறிக்கிட்ட மாதிரி குறிப்பீடு மேலெழுதப்படலாம்."
 
 #: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
 msgid "Failed to determine sample specification from file."
@@ -1545,10 +1544,8 @@ msgstr "எச்சரிக்கை: கோப்புக்கு சேன
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr ""
-"ஒரு %s ஸ்டீரம் மாதிரி குறிப்பீட்டை '%s' மற்றும் சேனல் வரைபட்டம் '%s' உடன் திறக்கிறது."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr "ஒரு %s ஸ்டீரம் மாதிரி குறிப்பீட்டை '%s' மற்றும் சேனல் வரைபட்டம் '%s' உடன் திறக்கிறது."
 
 #: ../src/utils/pacat.c:1009
 msgid "recording"
@@ -1680,8 +1677,7 @@ msgstr "தற்போது பயனிலுள்ளது: %u தொகு
 #: ../src/utils/pactl.c:144
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
-msgstr ""
-"வாழ்க்கை முழுவதும் ஒதுக்கப்பட்டது: %u தொகுதிகள் %s பைட்களை மொத்தமாக கொண்டுள்ளது.\n"
+msgstr "வாழ்க்கை முழுவதும் ஒதுக்கப்பட்டது: %u தொகுதிகள் %s பைட்களை மொத்தமாக கொண்டுள்ளது.\n"
 
 #: ../src/utils/pactl.c:147
 #, c-format
@@ -2137,17 +2133,14 @@ msgid "You have to specify a module index"
 msgstr "தொகுதி அட்டவணையை நீங்கள் குறிப்பிட வேண்டும்"
 
 #: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
-msgstr ""
-"ஒரு சிங்கிற்கு மேல் நீங்கள் குறிப்பிடக் கூடாது. பூலியன் மதிப்பை நீங்கள் குறிப்பிட வேண்டும்."
+msgid "You may not specify more than one sink. You have to specify a boolean value."
+msgstr "ஒரு சிங்கிற்கு மேல் நீங்கள் குறிப்பிடக் கூடாது. பூலியன் மதிப்பை நீங்கள் குறிப்பிட வேண்டும்."
 
 #: ../src/utils/pactl.c:1103
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr ""
-"ஒரு மூலத்திற்கு மேல் நீங்கள் குறிப்பிடக் கூடாது. பூலியன் மதிப்பை நீங்கள் குறிப்பிட வேண்டும்."
+msgstr "ஒரு மூலத்திற்கு மேல் நீங்கள் குறிப்பிடக் கூடாது. பூலியன் மதிப்பை நீங்கள் குறிப்பிட வேண்டும்."
 
 #: ../src/utils/pactl.c:1115
 msgid "You have to specify a card name/index and a profile name"
@@ -2382,217 +2375,204 @@ msgstr "PulseAudio ஒலி சேவையகம்"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "வெளிப்பாடு சாதனங்கள்"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "உள்ளீடு சாதனங்கள்"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "@HOSTNAME@இல் ஆடியோ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "உள்ளீடு"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "டாக்கிங் ஸ்டேஷன் உள்ளீடு"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "டாக்கிங் ஸ்டேஷன் மைக்ரோஃபோன்"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "லைன்இன்"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "மைக்ரோஃபோன்"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "வெளியார்ந்த மைக்ரோஃபோன்"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "உட்புற ஆடியோ"
+msgstr "உட்புற மைக்ரோஃபோன்"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "ரேடியோ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "வீடியோ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "தானியக்க லாப கட்டுப்பாடு"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "தானியக்க லாப கட்டுப்பாடு எதுவுமில்லை"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "பூஸ்ட்"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "பூஸ்ட் இல்லை"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "ஆம்பிளிஃபையர்"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "ஆம்ப்ளிஃபையர் இல்லை"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "அனலாக் உள்ளிடு"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "அனலாக் மைக்ரோஃபோன்"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "அனலாக் லைன்இன்"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "அனலாக் ரேடியோ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "அனலாக் வீடியோ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "பூஜ்ஜிய வெளிப்பாடு"
+msgstr "அனலாக் வெளிப்பாடு"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "அனலாக் ஹெட்ஃபோன்கள்"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "அனலாக் வெளிப்பாடு (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "அனலாக் மோனோ வெளிப்பாடு"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "அனலாக் மோனோ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
-#, fuzzy
 msgid "Analog Stereo"
-msgstr "ஸ்டிரியோ"
+msgstr "அனலாக் ஸ்டிரியோ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "Surround 4.1"
+msgstr "Analog Surround 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "Surround 4.0"
+msgstr "Analog Surround 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "Surround 4.1"
+msgstr "Analog Surround 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
-#, fuzzy
 msgid "Analog Surround 4.0"
-msgstr "Surround 4.0"
+msgstr "Analog Surround 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
-#, fuzzy
 msgid "Analog Surround 4.1"
-msgstr "Surround 4.1"
+msgstr "Analog Surround 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
-#, fuzzy
 msgid "Analog Surround 5.0"
-msgstr "Surround 5.0"
+msgstr "Analog Surround 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
-#, fuzzy
 msgid "Analog Surround 5.1"
-msgstr "Surround 5.1"
+msgstr "Analog Surround 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "Surround 4.0"
+msgstr "Analog Surround 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "Surround 4.1"
+msgstr "Analog Surround 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "Surround 4.0"
+msgstr "Analog Surround 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
-#, fuzzy
 msgid "Analog Surround 7.1"
-msgstr "Surround 7.1"
+msgstr "Analog Surround 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "Digital Stereo (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "Digital Surround 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "Digital Surround 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "Digital Surround 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "Digital Stereo (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "Analog Mono Duplex"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "Analog Stereo Duplex"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "Digital Stereo Duplex (IEC958)"
+

commit 72759593e3669fc61ff8058b33734f878b4d2e63
Author: mgiri <mgiri at fedoraproject.org>
Date:   Sat Nov 14 10:11:13 2009 +0000

    Sending translation for Oriya

diff --git a/po/or.po b/po/or.po
index c4a8d19..4efdc1f 100644
--- a/po/or.po
+++ b/po/or.po
@@ -7,15 +7,15 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.or\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-11 12:56+0530\n"
+"POT-Creation-Date: 2009-11-14 08:57+0000\n"
+"PO-Revision-Date: 2009-11-14 15:33+0530\n"
 "Last-Translator: Manoj Kumar Giri <mgiri at redhat.com>\n"
 "Language-Team: Oriya <oriya-it at googlegroups.com>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11.4\n"
-"Plural-Forms:  nplurals=2; plural=(n!=1);\n"
+"Plural-Forms:  nplurals=2; plural=(n!=1);\n\n"
 "\n"
 "\n"
 "\n"
@@ -1530,8 +1530,7 @@ msgstr "ଚେତାବନୀ: ଚ୍ୟାନେଲ ମ୍ୟାପକୁ ଫ
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "ନମୁନା ବିଶେଷ ଲକ୍ଷଣ '%s' ଏବଂ ଚ୍ୟାନେଲ ମ୍ୟାପ '%s' ସହିତ ଗୋଟିଏ %s ଧାରାକୁ ଖୋଲୁଅଛି।"
 
 #: ../src/utils/pacat.c:1009
@@ -2118,17 +2117,14 @@ msgid "You have to specify a module index"
 msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ଏକକାଂଶ ଅନୁକ୍ରମଣିକାକୁ ଉଲ୍ଲେଖ କରିବା ଉଚିତ ନୁହଁ"
 
 #: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
-msgstr ""
-"ଆପଣଙ୍କୁ ଗୋଟିଏରୁ ଅଧିକ ସିଙ୍କ ଉଲ୍ଲେଖ କରିବାକୁ ପଡ଼ିନପାରେ। ଆପଣଙ୍କୁ ଗୋଟିଏ ବୁଲିଆନ ମୂଲ୍ୟ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ।"
+msgid "You may not specify more than one sink. You have to specify a boolean value."
+msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏରୁ ଅଧିକ ସିଙ୍କ ଉଲ୍ଲେଖ କରିବାକୁ ପଡ଼ିନପାରେ। ଆପଣଙ୍କୁ ଗୋଟିଏ ବୁଲିଆନ ମୂଲ୍ୟ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ।"
 
 #: ../src/utils/pactl.c:1103
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr ""
-"ଆପଣଙ୍କୁ ଗୋଟିଏରୁ ଅଧିକ ଉତ୍ସ ଉଲ୍ଲେଖ କରିବାକୁ ପଡ଼ିନପାରେ। ଆପଣଙ୍କୁ ଗୋଟିଏ ବୁଲିଆନ ମୂଲ୍ୟ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ।"
+msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏରୁ ଅଧିକ ଉତ୍ସ ଉଲ୍ଲେଖ କରିବାକୁ ପଡ଼ିନପାରେ। ଆପଣଙ୍କୁ ଗୋଟିଏ ବୁଲିଆନ ମୂଲ୍ୟ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ।"
 
 #: ../src/utils/pactl.c:1115
 msgid "You have to specify a card name/index and a profile name"
@@ -2362,217 +2358,204 @@ msgstr "PulseAudio ଧ୍ୱନି ସର୍ଭର"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "ଫଳାଫଳ ଉପକରଣ"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "ନିବେଶ ଉପକରଣ"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "@HOSTNAME@ ରେ ଧ୍ୱନି"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "ନିବେଶ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "ଡକିଙ୍ଗ ଷ୍ଟେସନ ନିବେଶ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "ଡକିଙ୍ଗ ଷ୍ଟେସନ ମାଇକ୍ରୋଫୋନ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "ଲାଇନ-ଇନ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "ମାଇକ୍ରୋଫୋନ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "ବାହ୍ୟ ମାଇକ୍ରୋଫୋନ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "ଆଭ୍ୟନ୍ତରୀଣ ଧ୍ୱନି"
+msgstr "ଆଭ୍ୟନ୍ତରୀଣ ମାଇକ୍ରୋଫୋନ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "ରେଡିଓ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "ଭିଡ଼ିଓ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "ସ୍ୱୟଂଚାଳିତ ଲାଭ ନିୟନ୍ତ୍ରଣ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "କୌଣସି ସ୍ୱୟଂଚାଳିତ ଲାଭ ନିୟନ୍ତ୍ରଣ ନାହିଁ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "ବୃଦ୍ଧି"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "ବୃଦ୍ଧି ନାହିଁ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "ଏମ୍ପ୍ଲିଫାୟର"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "ଏମ୍ପ୍ଲିଫାୟର ନାହିଁ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "ଏନାଲୋଗ ନିବେଶ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "ଏନାଲୋଗ ମାଇକ୍ରୋଫୋନ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "ଏନାଲୋଗ ଲାଇନ-ଇନ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "ଏନାଲୋଗ ରେଡ଼ିଓ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "ଏନାଲୋଗ ଭିଡ଼ିଓ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "ଶୂନ୍ୟ ଫଳାଫଳ"
+msgstr "ଏନାଲୋଗ ଫଳାଫଳ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "ଏନାଲୋଗ ହେଡ଼ଫୋନଗୁଡ଼ିକ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "ଏନାଲୋଗ ଫଳାଫଳ (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "ଏନାଲୋଗ ମୋନୋ ଫଳାଫଳ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "ଏନାଲୋଗ ମୋନୋ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
-#, fuzzy
 msgid "Analog Stereo"
-msgstr "ଷ୍ଟେରିଓ"
+msgstr "ଏନାଲୋଗ ଷ୍ଟେରିଓ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.1"
+msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.0"
+msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.1"
+msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
-#, fuzzy
 msgid "Analog Surround 4.0"
-msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.0"
+msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
-#, fuzzy
 msgid "Analog Surround 4.1"
-msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.1"
+msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
-#, fuzzy
 msgid "Analog Surround 5.0"
-msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 5.0"
+msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
-#, fuzzy
 msgid "Analog Surround 5.1"
-msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 5.1"
+msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.0"
+msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.1"
+msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 4.0"
+msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
-#, fuzzy
 msgid "Analog Surround 7.1"
-msgstr "ଚତୁଃ ପାର୍ଶ୍ୱ 7.1"
+msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "ଡିଜିଟାଲ ଷ୍ଟେରିଓ (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "ଡିଜିଟାଲ ଚତୁଃ ପାର୍ଶ୍ୱ 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "ଡିଜିଟାଲ ଚତୁଃ ପାର୍ଶ୍ୱ 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "ଡିଜିଟାଲ ଚତୁଃ ପାର୍ଶ୍ୱ 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "ଡିଜିଟାଲ ଷ୍ଟେରିଓ (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "ଏନାଲୋଗ ମୋନୋ ଡ଼ୁପ୍ଲେକ୍ସ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "ଏନାଲୋଗ ଷ୍ଟେରିଓ ଡ଼ୁପ୍ଲେକ୍ସ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "ଡିଜିଟାଲ ଷ୍ଟେରିଓ ଡ଼ୁପ୍ଲେକ୍ସ (IEC958)"
+

commit f4e18f7d01886301ecbf419a641c1561f1dbd845
Author: swkothar <swkothar at fedoraproject.org>
Date:   Mon Dec 7 11:54:08 2009 +0000

    Sending translation for Gujarati

diff --git a/po/gu.po b/po/gu.po
index e174451..2486027 100644
--- a/po/gu.po
+++ b/po/gu.po
@@ -1,14 +1,14 @@
-# translation of PulseAudio-up.po to Gujarati
+# translation of PulseAudio.po to Gujarati
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 #
 # Sweta Kothari <swkothar at redhat.com>, 2009.
 msgid ""
 msgstr ""
-"Project-Id-Version: PulseAudio-up\n"
+"Project-Id-Version: PulseAudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-11 13:02+0530\n"
+"POT-Creation-Date: 2009-12-07 08:36+0000\n"
+"PO-Revision-Date: 2009-12-07 17:22+0530\n"
 "Last-Translator: Sweta Kothari <swkothar at redhat.com>\n"
 "Language-Team: Gujarati\n"
 "MIME-Version: 1.0\n"
@@ -203,8 +203,7 @@ msgstr "ડિમનને મારવાનું નિષ્ફળ: %s"
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
-msgstr ""
-"આ પ્રક્રિયાને રુટ તરીકે ચલાવવા માટે વિચાર થયેલ નથી (નહિં તો --system એ સ્પષ્ટ થયેલ છે)."
+msgstr "આ પ્રક્રિયાને રુટ તરીકે ચલાવવા માટે વિચાર થયેલ નથી (નહિં તો --system એ સ્પષ્ટ થયેલ છે)."
 
 #: ../src/daemon/main.c:573
 msgid "Root privileges required."
@@ -732,8 +731,7 @@ msgstr "રૂપરેખાંકન ફાઇલને ખોલવાનુ
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
-msgstr ""
-"સ્પષ્ટ થયેલ મૂળભૂત ચેનલ મેપ પાસે સ્પષ્ટ થયેલ ચેનલોની મૂળભૂત સંખ્યા કરતા વિવિધ ચેનલોની સંખ્યા છે."
+msgstr "સ્પષ્ટ થયેલ મૂળભૂત ચેનલ મેપ પાસે સ્પષ્ટ થયેલ ચેનલોની મૂળભૂત સંખ્યા કરતા વિવિધ ચેનલોની સંખ્યા છે."
 
 #: ../src/daemon/daemon-conf.c:638
 #, c-format
@@ -1511,8 +1509,7 @@ msgstr "ચેતણી: ફાઇલમાં ચેનલ મેપને લ
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "નમૂના સ્પષ્ટીકરણ '%s' અને ચેનલ નક્ષા '%s' સાથે %s સ્ટ્રીમને ખોલી રહ્યા છે."
 
 #: ../src/utils/pacat.c:1009
@@ -2101,17 +2098,14 @@ msgid "You have to specify a module index"
 msgstr "તમારે મોડ્યુલ અનુક્રમણિકાને સ્પષ્ટ કરવુ જ પડશે"
 
 #: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
-msgstr ""
-"તમે એક સિંક કરતા વધારે સ્પષ્ટ કરી શકશો નહિં. તમારે બુલિયન કિંમતને સ્પષ્ટ કરવુ જ પડશે."
+msgid "You may not specify more than one sink. You have to specify a boolean value."
+msgstr "તમે એક સિંક કરતા વધારે સ્પષ્ટ કરી શકશો નહિં. તમારે બુલિયન કિંમતને સ્પષ્ટ કરવુ જ પડશે."
 
 #: ../src/utils/pactl.c:1103
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr ""
-"તમે એક સ્ત્રોત કરતા વધારે સ્પષ્ટ કરી શકશો નહિં. તમારે બુલિયન કિંમતને સ્પષ્ટ કરવુ જ પડશે."
+msgstr "તમે એક સ્ત્રોત કરતા વધારે સ્પષ્ટ કરી શકશો નહિં. તમારે બુલિયન કિંમતને સ્પષ્ટ કરવુ જ પડશે."
 
 #: ../src/utils/pactl.c:1115
 msgid "You have to specify a card name/index and a profile name"
@@ -2346,217 +2340,204 @@ msgstr "PulseAudio સાઉન્ડ સર્વર"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "આઉટપુટ ઉપકરણો"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "ઇનપુટ ઉપકરણો"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "@HOSTNAME@ પર ઓડિયો"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "ઇનપુટ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "ડોકિંગ સ્ટેશન ઇનપુટ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "ડોકિંગ સ્ટેશન માઇક્રોફોન"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "લાઇન-ઇન"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "માઇક્રોફોન"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "બહારનાં માઇક્રોફોન"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "આંતરિક ઓડિયો"
+msgstr "આંતરિક માઇક્રોફોન"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "રેડિયો"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "વિડિયો"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "Automatic Gain Control"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "Automatic Gain Control નથી"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "બુસ્ટ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "બુસ્ટ નથી"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "પરિવર્ધક"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "પરિવર્ધક નથી"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "ઍનલૉગ ઇનપુટ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "ઍનલૉગ માઇક્રોફોન"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "ઍનલૉગ લાઇન-ઇન"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "ઍનલૉગ રેડિયો"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "ઍનલૉગ વિડિયો"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "શૂન્ય આઉટપુટ"
+msgstr "ઍનલૉગ આઉટપુટ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "ઍનલૉગ હૅડફોનો"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "ઍનલૉગ આઉટપુટ (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "ઍનલૉગ મોનો આઉટપુટ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "ઍનલૉગ મોનો"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
-#, fuzzy
 msgid "Analog Stereo"
-msgstr "સ્ટેરિઓ"
+msgstr "ઍનલૉગ સ્ટેરિઓ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "સરાઉન્ડ 4.1"
+msgstr "ઍનલૉગ સરાઉન્ડ 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "સરાઉન્ડ 4.0"
+msgstr "ઍનલૉગ સરાઉન્ડ 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "સરાઉન્ડ 4.1"
+msgstr "ઍનલૉગ સરાઉન્ડ 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
-#, fuzzy
 msgid "Analog Surround 4.0"
-msgstr "સરાઉન્ડ 4.0"
+msgstr "ઍનલૉગ સરાઉન્ડ 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
-#, fuzzy
 msgid "Analog Surround 4.1"
-msgstr "સરાઉન્ડ 4.1"
+msgstr "ઍનલૉગ સરાઉન્ડ 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
-#, fuzzy
 msgid "Analog Surround 5.0"
-msgstr "સરાઉન્ડ 5.0"
+msgstr "ઍનલૉગ સરાઉન્ડ 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
-#, fuzzy
 msgid "Analog Surround 5.1"
-msgstr "સરાઉન્ડ 5.1"
+msgstr "ઍનલૉગ સરાઉન્ડ 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "સરાઉન્ડ 4.0"
+msgstr "ઍનલૉગ સરાઉન્ડ 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "સરાઉન્ડ 4.1"
+msgstr "ઍનલૉગ સરાઉન્ડ 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "સરાઉન્ડ 4.0"
+msgstr "ઍનલૉગ સરાઉન્ડ 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
-#, fuzzy
 msgid "Analog Surround 7.1"
-msgstr "સરાઉન્ડ 7.1"
+msgstr "ઍનલૉગ સરાઉન્ડ 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "ડિજિટલ સ્ટેરિઓ (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "ડિજિટલ સરાઉન્ડ 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "ડિજિટલ સરાઉન્ડ 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "ડિજિટલ સરાઉન્ડ 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "ડિજિટલ સ્ટેરિઓ (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "ઍનલૉગ મોનો ડુપ્લેક્ષ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "ઍનલૉગ સ્ટેરિઓ ડુપ્લેક્ષ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "ડિજિટલ સ્ટેરિઓ ડુપ્લેક્ષ (IEC958)"
+

commit 4f77643c859683f661425132b7246f98d8797c40
Author: hedda <hedda at fedoraproject.org>
Date:   Tue Dec 8 05:17:36 2009 +0000

    Sending translation for German

diff --git a/po/de.po b/po/de.po
index 38a5006..25b015b 100644
--- a/po/de.po
+++ b/po/de.po
@@ -1,23 +1,26 @@
+# translation of pulseaudio.master-tx.de.po to
 # German translation of pulseaudio
 # Copyright (C) 2008 pulseaudio
 # This file is distributed under the same license as the pulseaudio package.
 #
+#
 # Fabian Affolter <fab at fedoraproject.org>, 2008-2009.
 # Micha Pietsch <barney at fedoraproject.org>, 2008, 2009.
-#
+# Hedda Peters <hpeters at redhat.com>, 2009.
 msgid ""
 msgstr ""
-"Project-Id-Version: pulseaudio\n"
+"Project-Id-Version: pulseaudio.master-tx.de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-28 16:49+0100\n"
-"Last-Translator: Joerg (kital) Simon <jsimon at fedoraproject.org>\n"
-"Language-Team: German <fedora-trans-de at redhat.com>\n"
+"POT-Creation-Date: 2009-12-08 02:51+0000\n"
+"PO-Revision-Date: 2009-12-08 15:14+1000\n"
+"Last-Translator: Hedda Peters <hpeters at redhat.com>\n"
+"Language-Team: \n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Poedit-Language: German\n"
+"X-Generator: KBabel 1.11.4\n"
 
 #: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
 #, c-format
@@ -32,10 +35,10 @@ msgid ""
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 "to the ALSA developers."
 msgstr ""
-"snd_pcm_avail() gibt einen Wert zurück, welche außerordentlich groß ist: %lu "
+"snd_pcm_avail() gibt einen Wert zurück, der ausserordentlich gross ist: %lu "
 "bytes (%lu ms).\n"
 "Dies ist wahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie "
-"diesen Punkt den ALSA-Entwicklern."
+"dieses Problem den ALSA-Entwicklern."
 
 #: ../src/modules/alsa/alsa-util.c:1147
 #, c-format
@@ -45,10 +48,10 @@ msgid ""
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 "to the ALSA developers."
 msgstr ""
-"snd_pcm_delay() gibt einen Wert zurück, welche außerordentlich groß ist: %li "
+"snd_pcm_delay() gibt einen Wert zurück, der ausserordentlich gross ist: %li "
 "bytes (%s%lu ms).\n"
 "Dies ist wahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie "
-"diesen Punkt den ALSA-Entwicklern."
+"dieses Problem den ALSA-Entwicklern."
 
 #: ../src/modules/alsa/alsa-util.c:1194
 #, c-format
@@ -58,21 +61,20 @@ msgid ""
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 "to the ALSA developers."
 msgstr ""
-"snd_pcm_mmap_begin() gibt einen Wert zurück, welche außerordentlich groß "
+"snd_pcm_mmap_begin() gibt einen Wert zurück, der ausserordentlich gross "
 "ist: %lu bytes (%lu ms).\n"
 "Dies ist wahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie "
-"diesen Punkt den ALSA-Entwicklern."
+"dieses Problem den ALSA-Entwicklern."
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr ""
+msgstr "Hält stets einen Sink geladen, selbst wenn dies ein Null-Sink ist"
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
 msgstr "Dummy-Ausgabe"
 
 #: ../src/modules/module-ladspa-sink.c:49
-#, fuzzy
 msgid "Virtual LADSPA sink"
 msgstr "Virtueller LADSPA-Sink"
 
@@ -84,15 +86,17 @@ msgid ""
 "plugin name> label=<ladspa plugin label> control=<comma seperated list of "
 "input control values>"
 msgstr ""
+"sink_name=<Name des Sinks> sink_properties=<Eigenschaften des Sinks> "
+"master=<Name des zu filternden Sinks> format=<Sample-Format> rate=<Sample-Rate> "
+"channels=<Anzahl der Channels> channel_map=<Channel-Map> plugin=<ladspa Plugin-Name> label=<ladspa Plugin-Label> control=<kommagetrennte Liste von Eingabekontrollwerten>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
-msgstr ""
+msgstr "Clocked NULL Sink"
 
 #: ../src/modules/module-null-sink.c:291
-#, fuzzy
 msgid "Null Output"
-msgstr "Ausgang %s"
+msgstr "Null-Ausgabe"
 
 #: ../src/pulsecore/sink.c:2613
 msgid "Internal Audio"
@@ -409,7 +413,7 @@ msgid "Daemon terminated."
 msgstr "Daemon beendet."
 
 #: ../src/daemon/cmdline.c:115
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -489,8 +493,7 @@ 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"
+"      --cleanup-shm                     Bereinige veraltete Bereiche des gemeinsamen Speichers\n"
 "      --start                           Starte Daemon, falls noch nicht "
 "geschehen\n"
 "  -k  --kill                            Laufenden Daemon beenden\n"
@@ -501,7 +504,7 @@ msgstr ""
 "      --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"
+"      --high-priority[=BOOL]            Versuche höchste Priorität zu setzen\n"
 "                                        (Nur verfügbar als root, wenn SUID "
 "oder\n"
 "                                        mit erhöhtem RLIMIT_NICE)\n"
@@ -511,90 +514,93 @@ msgstr ""
 "oder\n"
 "                                        mit erhöhtem RLIMIT_RTPRIO)\n"
 "      --disallow-module-loading[=BOOL]  Verbiete (Ent-)laden durch Nutzer "
-"angeforderter\n"
+"angefordertere\n"
 "                                        Module nach dem Start\n"
 "      --disallow-exit[=BOOL]            Verbiete Beenden auf Anfrage des "
 "Nutzers\n"
-"      --exit-idle-time=SECS             Beende Daemon, wenn für diese Zeit \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"
+"geladene\n"
 "                                        Samples nach dieser Zeit\n"
-"      --log-level[=STUFE]               Grad der Ausführlichkeit angeben\n"
+"      --log-level[=LEVEL]               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"
-"                                        Objekte (Plugins)\n"
-"      --resample-method=METHODE          Nutze diese Resampling-Methode\n"
+"      --log-meta[=BOOL]                 Speicherort des Codes in Protokollnachrichten"
+"angeben\n"
+"      --log-time[=BOOL]                 Zeitstempel in Protokollnachrichten angeben\n"
+"      --log-backtrace=FRAMES            Backtrace in Protokollnachrichten angeben\n"
+"  -p, --dl-search-path=PATH             Suchpfad für dynamisch "
+"freigegebene\n"
+"                                        Objekte (Plugins) angeben\n"
+"      --resample-method=METHOD          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"
 "                                        Systemen nicht installieren.\n"
-"      --disable-shm[=BOOL]              Keine Unterstützung für Shared "
-"Memory.\n"
+"      --disable-shm[=BOOL]              Unterstützung für Shared "
+"Memory deaktivieren.\n"
 "\n"
-"STARTUP-SCRIPT:\n"
-"  -L, --load=\"MODUL-ARGUMENTE\"       Plugin-Modul mit diesen Parametern \n"
+"STARTUP SCRIPT:\n"
+"  -L, --load=\"MODULE ARGUMENTS\"         Plugin-Modul mit diesen Parametern\n"
 "                                        laden.\n"
-"  -F, --file=DATEINAMEN                   Dieses Skript ausführen\n"
-"  -C                                    Nach Start auf laufendem TTY \n"
+"  -F, --file=FILENAME                   Dieses Skript ausführen\n"
+"  -C                                    Nach Start auf laufendem TTY\n"
 "                                        eine Kommandozeile öffnen\n"
 "\n"
 "  -n                                    Standardskript nicht laden\n"
 
 #: ../src/daemon/cmdline.c:247
 msgid "--daemonize expects boolean argument"
-msgstr "Option --daemonize erfordert bool'schen Wert"
+msgstr "--daemonize erfordert Boolsche Variable"
 
 #: ../src/daemon/cmdline.c:254
 msgid "--fail expects boolean argument"
-msgstr "Option --fail erfordert bool'schen Wert"
+msgstr "--fail erfordert Boolsche Variable"
 
 #: ../src/daemon/cmdline.c:264
 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 "
+"--log-level erfordert Parameter für Grad der Protokollierung (entweder numerisch "
 "im Bereich 0..4 or einen dieser: debug, info, notice, warn, error)."
 
 #: ../src/daemon/cmdline.c:276
 msgid "--high-priority expects boolean argument"
-msgstr "Option --high-priority erfordert bool'schen Wert"
+msgstr "--high-priority erfordert Boolsche Variable"
 
 #: ../src/daemon/cmdline.c:283
 msgid "--realtime expects boolean argument"
-msgstr "Option --realtime erfordert bool'schen Wert"
+msgstr "--realtime erfordert Boolsche Variable"
 
 #: ../src/daemon/cmdline.c:290
 msgid "--disallow-module-loading expects boolean argument"
-msgstr "Option --disallow-module-loading erfordert bool'schen Wert"
+msgstr "--disallow-module-loading erfordert Boolsche Variable"
 
 #: ../src/daemon/cmdline.c:297
 msgid "--disallow-exit expects boolean argument"
-msgstr "--disallow-exit erfordert boolsches Argument"
+msgstr "--disallow-exit erfordert Boolsche Variable"
 
 #: ../src/daemon/cmdline.c:304
 msgid "--use-pid-file expects boolean argument"
-msgstr "Option --use-pid-file erfordert bool'schen Wert"
+msgstr "--use-pid-file erfordert Boolsche Variable"
 
 #: ../src/daemon/cmdline.c:321
 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:328
 msgid "--log-time expects boolean argument"
-msgstr "--realtime erfordert boolsches Argument"
+msgstr "--realtime erfordert Boolsche Variable"
 
 #: ../src/daemon/cmdline.c:335
 msgid "--log-meta expects boolean argument"
-msgstr "--log-meta erfordert boolschen Wert"
+msgstr "--log-meta erfordert Boolsche Variable"
 
 #: ../src/daemon/cmdline.c:354
 #, c-format
@@ -603,15 +609,15 @@ msgstr "Ungültige Resample-Methode '%s'."
 
 #: ../src/daemon/cmdline.c:361
 msgid "--system expects boolean argument"
-msgstr "--System erwartet Boolean-Argument"
+msgstr "--system erfordert Boolsche Variable"
 
 #: ../src/daemon/cmdline.c:368
 msgid "--no-cpu-limit expects boolean argument"
-msgstr "Option --no-cpu-limit erfordert bool'schen Wert"
+msgstr "--no-cpu-limit erfordert Boolsche Variable"
 
 #: ../src/daemon/cmdline.c:375
 msgid "--disable-shm expects boolean argument"
-msgstr "Option --disable-shm erfordert bool'schen Wert"
+msgstr "--disable-shm erfordert Boolsche Variable"
 
 #: ../src/daemon/dumpmodules.c:60
 #, c-format
@@ -649,9 +655,9 @@ msgid "Load Once: %s\n"
 msgstr "Lade einmalig: %s\n"
 
 #: ../src/daemon/dumpmodules.c:75
-#, fuzzy, c-format
+#, c-format
 msgid "DEPRECATION WARNING: %s\n"
-msgstr "DEPRECATION WARNING: %s\n"
+msgstr "WARNUNG (DEPRECATION): %s\n"
 
 #: ../src/daemon/dumpmodules.c:79
 #, c-format
@@ -988,7 +994,7 @@ msgstr "OK"
 
 #: ../src/pulse/error.c:44
 msgid "Access denied"
-msgstr "Zugriff abgelehnt"
+msgstr "Zugriff verweigert"
 
 #: ../src/pulse/error.c:45
 msgid "Unknown command"
@@ -996,7 +1002,7 @@ msgstr "Unbekannter Befehl"
 
 #: ../src/pulse/error.c:46
 msgid "Invalid argument"
-msgstr "Ungültiges Argument"
+msgstr "Ungültiger Parameter"
 
 #: ../src/pulse/error.c:47
 msgid "Entity exists"
@@ -1307,7 +1313,7 @@ msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() fehlgeschlagen: %s"
 
 #: ../src/utils/pacat.c:609
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1376,18 +1382,19 @@ msgstr ""
 "  -v, --verbose                         Ausführliche Meldungen\n"
 "\n"
 "  -s, --server=SERVER                   Name des zu verbindenden Servers\n"
-"  -d, --device=DEVICE                   Name zu verbindender Sink/Quelle\n"
+"  -d, --device=DEVICE                   Name des/der 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"
 "      --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, "
+"s24le, s24be,\n"
+"                                        s24-32le, s24-32be (Standard ist 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"
@@ -1404,6 +1411,11 @@ msgstr ""
 "      --latency=BYTES                   Diese Latenz verwenden.\n"
 "      --process-time=BYTES              Diese Prozesszeit pro Anfrage "
 "verwenden.\n"
+"      --property=PROPERTY=VALUE         Die angegebene Eigenschaft auf den"
+"spezifizierten Wert setzen.\n"
+"      --raw                             PCM-Rohdaten aufnehmen/wiedergeben.\n"
+"      --file-format=FFORMAT             Formatierte PCM-Daten aufnehmen/wiedergeben.\n"
+"      --list-file-formats               Verfügbare Dateiformate auflisten.\n"
 
 #: ../src/utils/pacat.c:731
 #, c-format
@@ -1501,10 +1513,8 @@ msgstr "Warnung: Schreiben der Kanalzuordnung in Datei fehlgeschlagen."
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr ""
-"Öffnen eines %s-Streams mit Sample-Angabe '%s' und Kanalzuordnung '%s'."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr "Öffnen eines %s-Streams mit Sample-Angabe '%s' und Kanalzuordnung '%s'."
 
 #: ../src/utils/pacat.c:1009
 msgid "recording"
@@ -1664,11 +1674,11 @@ msgstr ""
 "Name des Nutzers: %s\n"
 "Rechnername: %s\n"
 "Name des Servers: %s\n"
-"Version des Server: %s\n"
+"Version des Servers: %s\n"
 "Standard-Sample-Angabe: %s\n"
 "Standard-Kanal-Zuordnung: %s\n"
-"Standard-Ausgabe: %s\n"
-"-Standard-Quelle: %s\n"
+"Standard-Sink: %s\n"
+"Standard-Quelle: %s\n"
 "Cookie: %08x\n"
 
 #: ../src/utils/pactl.c:205
@@ -1697,19 +1707,19 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
-"Senke #%u\n"
+"Sink #%u\n"
 "\tStatus: %s\n"
 "\tName: %s\n"
 "\tBeschreibung: %s\n"
 "\tTreiber: %s\n"
 "\tSample-Angabe: %s\n"
 "\tKanalzuordnung: %s\n"
-"\tOwner-Modul: %u\n"
+"\tBesitzer-Modul: %u\n"
 "\tStumm: %s\n"
 "\tLautstärke: %s%s%s\n"
 "\t        Verteilung %0.2f\n"
 "\tBasis-Lautstärke: %s%s%s\n"
-"\tQuelle Monitor: %s\n"
+"\tQuellen-Monitor: %s\n"
 "\tLatenz: %0.0f usec, eingestellt %0.0f usec\n"
 "\tFlags: %s%s%s%s%s%s\n"
 "\tEigenschaften:\n"
@@ -1763,7 +1773,7 @@ msgstr ""
 "\tLautstärke: %s%s%s\n"
 "\t        Verteilung %0.2f\n"
 "\tBasis-Lautstärke: %s%s%s\n"
-"\tSenke-Monitor: %s\n"
+"\tSink-Monitor: %s\n"
 "\tLatenz: %0.0f usec, eingestellt %0.0f usec\n"
 "\tFlags: %s%s%s%s%s%s\n"
 "\tEigenschaften:\n"
@@ -1854,7 +1864,7 @@ msgstr "\tAktive Profile: %s\n"
 #: ../src/utils/pactl.c:496
 #, c-format
 msgid "Failed to get sink input information: %s"
-msgstr "Konnte Sink-Eingabe-Informationen nicht holen: %s"
+msgstr "Erhalten der Sink-Eingabe-Informationen fehlgeschlagen: %s"
 
 #: ../src/utils/pactl.c:515
 #, c-format
@@ -1876,9 +1886,9 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
-"Eingabe-Senke #%u\n"
+"Sink-Eingabe #%u\n"
 "\tTreiber: %s\n"
-"\tOwner-Modul: %s\n"
+"\tBesitzer-Modul: %s\n"
 "\tClient: %s\n"
 "\tSink: %u\n"
 "\tSample-Angabe: %s\n"
@@ -2079,8 +2089,7 @@ msgstr "Sie müssen einen Sink-Eingabe-Indexwert und einen Sink angeben"
 
 #: ../src/utils/pactl.c:1045
 msgid "You have to specify a source output index and a source"
-msgstr ""
-"Sie müssen eine Indexwert für die Quell-Ausgabe und eine Quelle angeben"
+msgstr "Sie müssen eine Indexwert für die Quell-Ausgabe und eine Quelle angeben"
 
 #: ../src/utils/pactl.c:1060
 msgid "You have to specify a module name and arguments."
@@ -2091,19 +2100,14 @@ msgid "You have to specify a module index"
 msgstr "Sie müssen einen Indexwert für ein Modul angeben"
 
 #: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
-msgstr ""
-"Sie sollten nur eine Senke angeben. Sie müssen zumindest einen bool'schen "
-"Wert übergeben."
+msgid "You may not specify more than one sink. You have to specify a boolean value."
+msgstr "Sie sollten nur einen Sink angeben. Sie müssen zumindest eine Boolsche Variable übergeben."
 
 #: ../src/utils/pactl.c:1103
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr ""
-"Sie sollten nur eine Quelle angeben. Sie müssen zumindest einen bool'schen "
-"Wert übergeben."
+msgstr "Sie sollten nur eine Quelle angeben. Sie müssen zumindest eine Boolsche Variable übergeben."
 
 #: ../src/utils/pactl.c:1115
 msgid "You have to specify a card name/index and a profile name"
@@ -2111,7 +2115,7 @@ msgstr "Sie müssen einen Karten-Name/Indexwert und einen Profilnamen angeben"
 
 #: ../src/utils/pactl.c:1126
 msgid "You have to specify a sink name/index and a port name"
-msgstr "Sie müssen einen Senkennamen/-Indexwert und einen Portnamen angeben"
+msgstr "Sie müssen einen Sink-Namen/-Indexwert und einen Portnamen angeben"
 
 #: ../src/utils/pactl.c:1137
 msgid "You have to specify a source name/index and a port name"
@@ -2119,7 +2123,7 @@ msgstr "Sie müssen einen Quellennamen/-Indexwert und einen Portnamen angeben"
 
 #: ../src/utils/pactl.c:1149
 msgid "You have to specify a sink name/index and a volume"
-msgstr "Sie müssen einen Senkennamen/-Indexwert und einen Portnamen angeben"
+msgstr "Sie müssen einen Sink-Namen/-Indexwert und eine Lautstärke angeben"
 
 #: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
 #: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
@@ -2133,7 +2137,7 @@ msgstr "Sie müssen einen Quellennamen/-Indexwert und einen Portnamen angeben"
 
 #: ../src/utils/pactl.c:1183
 msgid "You have to specify a sink input index and a volume"
-msgstr "Sie müssen einen Sink-Eingabe-Indexwert und einen Sink angeben"
+msgstr "Sie müssen einen Sink-Eingabe-Indexwert und eine Lautstärke angeben."
 
 #: ../src/utils/pactl.c:1188
 msgid "Invalid sink input index"
@@ -2141,15 +2145,15 @@ msgstr "Ungültiger Sink-Eingabe-Index"
 
 #: ../src/utils/pactl.c:1204
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr "Sie müssen einen Senkennamen/-Indexwert und einen Portnamen angeben"
+msgstr "Sie müssen einen Sink-Namen/-Indexwert und eine Boolsche Variable für Stummschaltung angeben"
 
 #: ../src/utils/pactl.c:1221
 msgid "You have to specify a source name/index and a mute boolean"
-msgstr "Sie müssen einen Quellennamen/-Indexwert und einen Portnamen angeben"
+msgstr "Sie müssen einen Quellennamen/-Indexwert und eine Boolsche Variable für Stummschaltung angeben"
 
 #: ../src/utils/pactl.c:1238
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr "Sie müssen einen Sink-Eingabe-Indexwert und einen Sink angeben"
+msgstr "Sie müssen einen Sink-Eingabe-Indexwert und eine Boolsche Variable für Stummschaltung angeben"
 
 #: ../src/utils/pactl.c:1243
 msgid "Invalid sink input index specification"
@@ -2206,7 +2210,7 @@ msgstr "Cookie: %s\n"
 #: ../src/utils/pax11publish.c:132
 #, c-format
 msgid "Failed to parse cookie data\n"
-msgstr "Paresen der Cookie-Daten fehlgeschlagen.\n"
+msgstr "Parsen der Cookie-Daten fehlgeschlagen.\n"
 
 #: ../src/utils/pax11publish.c:137
 #, c-format
@@ -2254,7 +2258,7 @@ msgstr "connect(): %s"
 
 #: ../src/utils/pacmd.c:99
 msgid "Failed to kill PulseAudio daemon."
-msgstr "Terminieren des PulseAudio-Daemon fehlgeschlagen."
+msgstr "Beenden des PulseAudio-Daemon fehlgeschlagen."
 
 #: ../src/utils/pacmd.c:107
 msgid "Daemon not responding."
@@ -2277,7 +2281,7 @@ msgstr "write(): %s"
 
 #: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
 msgid "Cannot access autospawn lock."
-msgstr "Fehler beim Zugriff auf Autostart -Sperre."
+msgstr "Fehler beim Zugriff auf Autostart-Sperre."
 
 #: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
 #, c-format
@@ -2289,6 +2293,10 @@ msgid ""
 "We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
 "returned 0 or another value < min_avail."
 msgstr ""
+"ALSA weckte uns auf, um neue Daten auf das Gerät zu schreiben, doch es gab nichts zum Schreiben!\n"
+"Dies ist höchstwahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie diesen Fehler den ALSA-Entwicklern.\n"
+"Wir wurden durch das POLLOUT-Set geweckt, allerdings lieferte ein anschliessender snd_pcm_avail() "
+"den Wert 0 oder einen anderen Wert < min_avail."
 
 #: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
 #, c-format
@@ -2300,6 +2308,10 @@ msgid ""
 "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
 "returned 0 or another value < min_avail."
 msgstr ""
+"ALSA weckte uns auf, um neue Daten vom Gerät zu lesen, doch es gab nichts zum Lesen!\n"
+"Dies ist höchstwahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie diesen Fehler den ALSA-Entwicklern.\n"
+"Wir wurden durch das POLLIN-Set geweckt, allerdings lieferte ein anschliessender snd_pcm_avail() "
+"den Wert 0 oder einen anderen Wert < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2228
@@ -2326,133 +2338,122 @@ msgstr "PulseAudio Sound Server"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "Ausgabegeräte"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
-#, fuzzy
 msgid "Input Devices"
-msgstr "Eingang %s"
+msgstr "Eingabegeräte"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "Audio auf @HOSTNAME@"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
-#, fuzzy
 msgid "Input"
-msgstr "Eingang %s"
+msgstr "Eingabe"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "Docking Station Eingabe"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "Docking Station Mikrofon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "Line-In"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "Mikrofon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "Externes Mikrofon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "Internes Audio"
+msgstr "Internes Mikrofon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "Radio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "Video"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "Automatische Verstärkungsregelung"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "Keine automatische Verstärkungsregelung"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "Boost"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "Kein Boost"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "Verstärker"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "Kein Verstärker"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
-#, fuzzy
 msgid "Analog Input"
-msgstr "Analog Mono"
+msgstr "Analoge Eingabe"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
-#, fuzzy
 msgid "Analog Microphone"
-msgstr "Analog Mono"
+msgstr "Analoges Mikrofon"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
-#, fuzzy
 msgid "Analog Line-In"
-msgstr "Analog Mono"
+msgstr "Analoges Line-In"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
-#, fuzzy
 msgid "Analog Radio"
-msgstr "Analog Mono"
+msgstr "Analoges Radio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
-#, fuzzy
 msgid "Analog Video"
-msgstr "Analog Stereo"
+msgstr "Analoges Video"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "Ausgang %s"
+msgstr "Analoge Ausgabe"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
-#, fuzzy
 msgid "Analog Headphones"
-msgstr "Analog Mono"
+msgstr "Analoge Kopfhörer"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "Analoge Ausgabe (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
-#, fuzzy
 msgid "Analog Mono Output"
-msgstr "Analog Mono"
+msgstr "Analoge Mono-Ausgabe"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
@@ -2463,19 +2464,16 @@ msgid "Analog Stereo"
 msgstr "Analog Stereo"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "Analog Surround 4.1"
+msgstr "Analog Surround 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "Analog Surround 4.0"
+msgstr "Analog Surround 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "Analog Surround 4.1"
+msgstr "Analog Surround 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Surround 4.0"
@@ -2494,19 +2492,16 @@ msgid "Analog Surround 5.1"
 msgstr "Analog Surround 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "Analog Surround 4.0"
+msgstr "Analog Surround 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "Analog Surround 4.1"
+msgstr "Analog Surround 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "Analog Surround 4.0"
+msgstr "Analog Surround 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 7.1"
@@ -2517,9 +2512,8 @@ msgid "Digital Stereo (IEC958)"
 msgstr "Digital Stereo (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
-#, fuzzy
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr "Digital Surround 4.0 (IEC958/AC3)"
+msgstr "Digital Surround 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
@@ -2534,276 +2528,14 @@ msgid "Digital Stereo (HDMI)"
 msgstr "Digital Stereo (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
-#, fuzzy
 msgid "Analog Mono Duplex"
-msgstr "Analog Mono"
+msgstr "Analog Mono Duplex"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
-#, fuzzy
 msgid "Analog Stereo Duplex"
-msgstr "Analog Stereo"
+msgstr "Analog Stereo Duplex"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
-#, fuzzy
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr "Digital Stereo (IEC958)"
-
-#~ msgid "Invalid client name '%s'\n"
-#~ msgstr "Ungültiger Client-Name '%s'\n"
-
-#~ msgid "Failed to determine sample specification from file.\n"
-#~ msgstr "Beziehen der Sample-Informationen der Datei fehlgeschlagen.\n"
-
-#~ msgid "select(): %s"
-#~ msgstr "select(): %s"
-
-#~ msgid "Cannot connect to system bus: %s"
-#~ msgstr "Kann nicht mit dem System-Bus verbinden: %s"
-
-#~ msgid "Cannot get caller from PID: %s"
-#~ msgstr "Kann Caller von PID nicht beziehen: %s"
-
-#~ msgid "Cannot set UID on caller object."
-#~ msgstr "Kann UID für Caller-Objekt nicht setzen."
-
-#~ msgid "Failed to get CK session."
-#~ msgstr "Kann CK-Session nicht beziehen."
-
-#~ msgid "Cannot set UID on session object."
-#~ msgstr "Kann UID für Session-Objekt nicht setzen."
-
-#~ msgid "Cannot allocate PolKitAction."
-#~ msgstr "Konnte PolKitAction nicht zuordnen."
-
-#~ msgid "Cannot set action_id"
-#~ msgstr "Kann action_id nicht setzen"
-
-#~ msgid "Cannot allocate PolKitContext."
-#~ msgstr "Konnte PolKitContext nicht zuordnen."
-
-#~ msgid "Cannot initialize PolKitContext: %s"
-#~ msgstr "Konnte PolKitContext nicht initialisieren: %s"
-
-#~ msgid "Could not determine whether caller is authorized: %s"
-#~ msgstr "Autorisierung des Callers konnte nicht sichergestellt werden: %s"
-
-#~ msgid "Cannot obtain auth: %s"
-#~ msgstr "Keine Authorisierung erhalten: %s"
-
-#~ msgid "PolicyKit responded with '%s'"
-#~ msgstr "PolicyKit antwortete mit '%s'"
-
-#, fuzzy
-#~ msgid ""
-#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio "
-#~ "daemon"
-#~ msgstr ""
-#~ "Hochprioritäts-Terminierung () (negative Unix nice level) für den "
-#~ "PulseAudio-Dienst"
-
-#~ msgid "Real-time scheduling for the PulseAudio daemon"
-#~ msgstr "Echtzeit-Terminierung des PulseAudio-Daemon"
-
-#~ msgid ""
-#~ "System policy prevents PulseAudio from acquiring high-priority scheduling."
-#~ msgstr ""
-#~ "System-Richtlinien verhindert PulseAudio beim Erlangen des high-priority "
-#~ "scheduling."
+msgstr "Digital Stereo Duplex (IEC958)"
 
-#~ msgid ""
-#~ "System policy prevents PulseAudio from acquiring real-time scheduling."
-#~ msgstr ""
-#~ "System-Richtlinien verhindert PulseAudio beim Erlangen der Echtzeit-"
-#~ "Terminierung."
-
-#~ msgid "read() failed: %s\n"
-#~ msgstr "read() fehlgeschlagen: %s\n"
-
-#~ msgid "pa_context_connect() failed: %s\n"
-#~ msgstr "pa_context_connect() fehlgeschlagen: %s\n"
-
-#~ 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."
-
-#~ msgid "We're in the group '%s', allowing real-time scheduling."
-#~ msgstr ""
-#~ "Wir befinden uns in der Gruppe '%s', was Echtzeit-Scheduling ermöglicht."
-
-#~ msgid "PolicyKit grants us acquire-high-priority privilege."
-#~ msgstr "Richtlinien gewähren das Recht aquire-high-priority."
-
-#~ msgid "PolicyKit refuses acquire-high-priority privilege."
-#~ msgstr "Richtlinien verweigern das Recht acquire-high-priority."
-
-#~ msgid "PolicyKit grants us acquire-real-time privilege."
-#~ msgstr "Richtlinien gewähren das Recht aquire-real-time."
-
-#~ msgid "PolicyKit refuses acquire-real-time privilege."
-#~ msgstr "Richtlinien verweigern das Recht acquire-real-time."
-
-#, 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"
-#~ "We are not in group '%s', 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 '%s', or increase "
-#~ "the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user."
-#~ 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 ""
-#~ "High-priority scheduling enabled in configuration but not allowed by "
-#~ "policy."
-#~ msgstr "Scheduling höchster Priorität konfiguriert, jedoch nicht erlaubt."
-
-#~ msgid "Successfully increased RLIMIT_RTPRIO"
-#~ msgstr "RLIMIT_RTPRIO erfolgreich erhöht"
-
-#~ msgid "RLIMIT_RTPRIO failed: %s"
-#~ msgstr "RLIMIT_RTPRIO fehlgeschlagen: %s"
-
-#~ msgid "Giving up CAP_NICE"
-#~ msgstr "Verwerfe CAP_NICE"
-
-#~ msgid ""
-#~ "Real-time scheduling enabled in configuration but not allowed by policy."
-#~ msgstr "Echtzeit-Scheduling konfiguriert, jedoch nicht erlaubt."
-
-#~ msgid "Limited capabilities successfully to CAP_SYS_NICE."
-#~ msgstr "Fähigkeiten erfolgreich auf CAP_SYS_NICE reduziert."
-
-#~ msgid "time_new() failed.\n"
-#~ msgstr "time_new() fehlgeschlagen.\n"
-
-#~ msgid "Output %s + Input %s"
-#~ msgstr "Ausgabe %s + Eingabe %s"
-
-#~ msgid "Stream successfully created\n"
-#~ msgstr "Stream erfolgreich erzeugt\n"
-
-#~ msgid "Stream errror: %s\n"
-#~ msgstr "Stream-Fehler: %s\n"
-
-#~ msgid "Connection established.\n"
-#~ msgstr "Verbindung hergestellt.\n"
-
-#~ msgid ""
-#~ "%s [options] [FILE]\n"
-#~ "\n"
-#~ "  -h, --help                            Show this help\n"
-#~ "      --version                         Show version\n"
-#~ "\n"
-#~ "  -v, --verbose                         Enable verbose operation\n"
-#~ "\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"
-#~ "      --channel-map=CHANNELMAP          Set the channel map to the use\n"
-#~ msgstr ""
-#~ "%s [options] [FILE]\n"
-#~ "\n"
-#~ "  -h, --help                            Zeige diese Hilfe\n"
-#~ "      --version                         Zeige Version\n"
-#~ "\n"
-#~ "  -v, --verbose                         Ausführliche Meldungen\n"
-#~ "\n"
-#~ "  -s, --server=SERVER                   Name des Zielservers\n"
-#~ "  -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"
-#~ "      --channel-map=CHANNELMAP          Diese Kanalzuordnung nutzen\n"
-
-#~ msgid ""
-#~ "paplay %s\n"
-#~ "Compiled with libpulse %s\n"
-#~ "Linked with libpulse %s\n"
-#~ msgstr ""
-#~ "paplay %s\n"
-#~ "Kompliert mit libpulse %s\n"
-#~ "Gelinkt mit libpulse %s\n"
-
-#~ msgid "Invalid channel map\n"
-#~ msgstr "Ungültige Kanal-Zuweisung\n"
-
-#~ msgid "Failed to open file '%s'\n"
-#~ msgstr "Öffnen der Datei '%s' fehlgeschlagen\n"
-
-#~ msgid "Channel map doesn't match file.\n"
-#~ msgstr "Kanal-Zuweisung stimmt mit Datei nicht überein.\n"
-
-#~ msgid "Using sample spec '%s'\n"
-#~ msgstr "Sampling-Angabe '%s' wird benutzt\n"
-
-#, 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"
-#~ "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"
-#~ "Wir befinden uns nicht in der Gruppe '"
-
-#~ msgid "--log-time boolean argument"
-#~ msgstr "--log-time erfordert bool'schen Wert"
-
-#~ 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"
-#~ "Type: %s\n"
-#~ "Module: %s\n"
-#~ "Argument: %s\n"
-#~ msgstr ""
-#~ "*** Autoload-Eintrag #%u ***\n"
-#~ "Name: %s\n"
-#~ "Typ: %s\n"
-#~ "Modul: %s\n"
-#~ "Argument: %s\n"
-
-#~ msgid "sink"
-#~ msgstr "Sink"
-
-#~ msgid "source"
-#~ msgstr "Quelle"
-
-#~ msgid "socketpair(): %s"
-#~ msgstr "socketpair(): %s"

commit 381be6496b97ac750ae1827c167200f7f1adf08f
Author: khasida <khasida at fedoraproject.org>
Date:   Tue Dec 8 08:58:17 2009 +0000

    Sending translation for Japanese

diff --git a/po/ja.po b/po/ja.po
index de7f605..bd6f8c2 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -1,19 +1,23 @@
+# translation of ja.po to Japanese
 # PulseAudio
 # Copyright (C) 2009.
 # This file is distributed under the same license as the PACKAGE package.
-# Hyu_gabaru Ryu_ichi <hyu_gabaru at yahoo.co.jp>, 2009.
 #
+# Hyu_gabaru Ryu_ichi <hyu_gabaru at yahoo.co.jp>, 2009.
+# Kiyoto Hashida <khashida at redhat.com>, 2009.
 msgid ""
 msgstr ""
-"Project-Id-Version: 1.0\n"
+"Project-Id-Version: ja\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-10 21:05+0900\n"
-"Last-Translator: Hyu_gabaru Ryu_ichi <hyu_gabaru at yahoo.co.jp>\n"
-"Language-Team: Japanese <fedora-trans-ja at redhat.com>\n"
+"POT-Creation-Date: 2009-12-08 02:51+0000\n"
+"PO-Revision-Date: 2009-12-08 17:48+0900\n"
+"Last-Translator: Kiyoto Hashida <khashida at redhat.com>\n"
+"Language-Team: Japanese <jp at li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: Plural-Forms: nplurals=1; plural=0;\n\n"
 
 #: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
 #, c-format
@@ -28,6 +32,10 @@ msgid ""
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 "to the ALSA developers."
 msgstr ""
+"snd_pcm_avail() は 例外的に大きな値を返しました: %lu バイト(%lu "
+"ms)。\n"
+"これは多分、ALSA ドライバー '%s' 内のバグです。この問題は ALSA 開発者宛に "
+"報告を提出して下さい。"
 
 #: ../src/modules/alsa/alsa-util.c:1147
 #, c-format
@@ -37,6 +45,10 @@ msgid ""
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 "to the ALSA developers."
 msgstr ""
+"snd_pcm_delay() は 例外的に大きな値を返しました: %li バイト(%s%lu"
+" ms)。\n"
+"これは多分、ALSA ドライバー '%s' 内のバグです。この問題は ALSA 開発者宛に "
+"報告を提出して下さい。"
 
 #: ../src/modules/alsa/alsa-util.c:1194
 #, c-format
@@ -46,18 +58,22 @@ msgid ""
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 "to the ALSA developers."
 msgstr ""
+"snd_pcm_mmap_begin() は 例外的に大きな値を返しました: %lu バイト(%lu "
+"ms)。\n"
+"これは多分、ALSA ドライバー '%s' 内のバグです。この問題は ALSA 開発者宛に "
+"報告を提出して下さい。"
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr ""
+msgstr "null である場合でも、常に最低でもシンクが1つロードされるように維持します"
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
-msgstr ""
+msgstr "ダミー出力"
 
 #: ../src/modules/module-ladspa-sink.c:49
 msgid "Virtual LADSPA sink"
-msgstr ""
+msgstr "仮想 LADSPA シンク"
 
 #: ../src/modules/module-ladspa-sink.c:53
 msgid ""
@@ -67,153 +83,160 @@ msgid ""
 "plugin name> label=<ladspa plugin label> control=<comma seperated list of "
 "input control values>"
 msgstr ""
+"sink_name=<シンクの名前> sink_properties=<シンクのプロパティ> "
+"master=<フィルタするシンク名> format=<サンプル形式> rate=<サンプルレート> "
+"channels=<チャンネル数> channel_map=<チャンネルマップ> plugin=<ladspa "
+"plugin の名前> label=<ladspa plugin のラベル> control=<コンマで隔離した入力制御値の "
+"一覧>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
-msgstr ""
+msgstr "クロック付き NULL シンク"
 
 #: ../src/modules/module-null-sink.c:291
 msgid "Null Output"
-msgstr ""
+msgstr "Null 出力"
 
 #: ../src/pulsecore/sink.c:2613
 msgid "Internal Audio"
-msgstr ""
+msgstr "内部オーディオ"
 
 #: ../src/pulsecore/sink.c:2618
 msgid "Modem"
-msgstr ""
+msgstr "モデム"
 
 #: ../src/daemon/ltdl-bind-now.c:124
 msgid "Failed to find original lt_dlopen loader."
-msgstr ""
+msgstr "オリジナルの lt_dlopen ローダーを見つけるのに失敗しました。"
 
 #: ../src/daemon/ltdl-bind-now.c:129
 msgid "Failed to allocate new dl loader."
-msgstr ""
+msgstr "新規の dl ローダーの割り当てに失敗しました。"
 
 #: ../src/daemon/ltdl-bind-now.c:142
 msgid "Failed to add bind-now-loader."
-msgstr ""
+msgstr "bind-now-loader の追加に失敗しました。"
 
 #: ../src/daemon/main.c:141
 #, c-format
 msgid "Got signal %s."
-msgstr ""
+msgstr "信号 %s を得ました。"
 
 #: ../src/daemon/main.c:168
 msgid "Exiting."
-msgstr ""
+msgstr "終了しています。"
 
 #: ../src/daemon/main.c:186
 #, c-format
 msgid "Failed to find user '%s'."
-msgstr ""
+msgstr "ユーザー '%s' が見付かりませんでした。"
 
 #: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find group '%s'."
-msgstr ""
+msgstr "グループ '%s' が見付かりませんでした。"
 
 #: ../src/daemon/main.c:195
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
-msgstr ""
+msgstr "ユーザー'%s' (UID %lu) とグループ  '%s' (GID %lu) を見つけました。"
 
 #: ../src/daemon/main.c:200
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
-msgstr ""
+msgstr "ユーザー'%s' と グループ '%s' の GID が一致しません。"
 
 #: ../src/daemon/main.c:205
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
-msgstr ""
+msgstr "ユーザー '%s' のホームディレクトリは '%s' ではありません。無視します。"
 
 #: ../src/daemon/main.c:208 ../src/daemon/main.c:213
 #, c-format
 msgid "Failed to create '%s': %s"
-msgstr ""
+msgstr "'%s' の作成に失敗しました: %s"
 
 #: ../src/daemon/main.c:220
 #, c-format
 msgid "Failed to change group list: %s"
-msgstr ""
+msgstr "グループ一覧の変更に失敗しました: %s"
 
 #: ../src/daemon/main.c:236
 #, c-format
 msgid "Failed to change GID: %s"
-msgstr ""
+msgstr "GID の変更に失敗しました: %s"
 
 #: ../src/daemon/main.c:252
 #, c-format
 msgid "Failed to change UID: %s"
-msgstr ""
+msgstr "UID の変更に失敗しました: %s"
 
 #: ../src/daemon/main.c:271
 msgid "Successfully dropped root privileges."
-msgstr ""
+msgstr "root の権限を正しく破棄しました。"
 
 #: ../src/daemon/main.c:279
 msgid "System wide mode unsupported on this platform."
-msgstr ""
+msgstr "このプラットフォームではシステム全域のモードはサポートがありません。"
 
 #: ../src/daemon/main.c:297
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
-msgstr ""
+msgstr "setrlimit(%s, (%u, %u)) は失敗: %s "
 
 #: ../src/daemon/main.c:474
 msgid "Failed to parse command line."
-msgstr ""
+msgstr "コマンドラインの構文解析に失敗しました。"
 
 #: ../src/daemon/main.c:541
 msgid "Daemon not running"
-msgstr ""
+msgstr "デーモンは稼働していません"
 
 #: ../src/daemon/main.c:543
 #, c-format
 msgid "Daemon running as PID %u"
-msgstr ""
+msgstr "デーモンは PID %u として稼働していません"
 
 #: ../src/daemon/main.c:553
 #, c-format
 msgid "Failed to kill daemon: %s"
-msgstr ""
+msgstr "デーモンのキルに失敗しました: %s"
 
 #: ../src/daemon/main.c:571
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
 msgstr ""
+"このプログラムは root として実行されるように意図されていません(--system を "
+"指定していない限り)。"
 
 #: ../src/daemon/main.c:573
 msgid "Root privileges required."
-msgstr ""
+msgstr "Root の権限が必要です。"
 
 #: ../src/daemon/main.c:578
 msgid "--start not supported for system instances."
-msgstr ""
+msgstr "--start はシステムインスタンスではサポートがありません。"
 
 #: ../src/daemon/main.c:583
 msgid "Running in system mode, but --disallow-exit not set!"
-msgstr ""
+msgstr "システムモードで実行中です、しかし --disallow-exit がセットされていません!"
 
 #: ../src/daemon/main.c:586
 msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr ""
+msgstr "システムモードで実行中です、しかし --disallow-module-loading がセットされていません!"
 
 #: ../src/daemon/main.c:589
 msgid "Running in system mode, forcibly disabling SHM mode!"
-msgstr ""
+msgstr "システムモードで実行中です、強制的に SHM モードを無効にしています!"
 
 #: ../src/daemon/main.c:594
 msgid "Running in system mode, forcibly disabling exit idle time!"
-msgstr ""
+msgstr "システムモードで実行中です、強制的に exit の遊び時間を無効にしています!"
 
 #: ../src/daemon/main.c:621
 msgid "Failed to acquire stdio."
-msgstr ""
+msgstr "stdio の取得に失敗しました。"
 
 #: ../src/daemon/main.c:627
 #, c-format
@@ -1364,8 +1387,7 @@ msgstr ""
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
 
 #: ../src/utils/pacat.c:1009
@@ -1812,8 +1834,7 @@ msgid "You have to specify a module index"
 msgstr ""
 
 #: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
+msgid "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 
 #: ../src/utils/pactl.c:1103
@@ -2144,14 +2165,14 @@ msgid "Analog Mono Output"
 msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
@@ -2236,3 +2257,4 @@ msgstr ""
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr ""
+

commit 8c2c80a0526507533dfa2045cc3258970aba619c
Author: runab <runab at fedoraproject.org>
Date:   Tue Dec 8 08:59:33 2009 +0000

    Sending translation for Bengali (India)

diff --git a/po/bn_IN.po b/po/bn_IN.po
index 45adef1..65b26cc 100644
--- a/po/bn_IN.po
+++ b/po/bn_IN.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.bn_IN\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-10 17:08+0530\n"
+"POT-Creation-Date: 2009-12-07 08:36+0000\n"
+"PO-Revision-Date: 2009-12-08 14:34+0530\n"
 "Last-Translator: Runa Bhattacharjee <runab at redhat.com>\n"
 "Language-Team: Bengali INDIA <anubad at lists.ankur.org.in>\n"
 "MIME-Version: 1.0\n"
@@ -61,8 +61,7 @@ msgstr ""
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr ""
-"সর্বদা অন্তত একটি sink লোড করে রাখা হবে, প্রয়োজনে null sink ব্যবহার করা হবে"
+msgstr "সর্বদা অন্তত একটি sink লোড করে রাখা হবে, প্রয়োজনে null sink ব্যবহার করা হবে"
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
@@ -146,8 +145,7 @@ msgstr "'%s' ব্যবহারকারীর ও '%s' দলের GID-র
 #: ../src/daemon/main.c:205
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
-msgstr ""
-"'%s' ব্যবহারকারী ব্যক্তিগত ডিরেক্টরি রূপে '%s' ধার্য করা হয়নি, অগ্রাহ্য করা হবে।"
+msgstr "'%s' ব্যবহারকারী ব্যক্তিগত ডিরেক্টরি রূপে '%s' ধার্য করা হয়নি, অগ্রাহ্য করা হবে।"
 
 #: ../src/daemon/main.c:208 ../src/daemon/main.c:213
 #, c-format
@@ -204,8 +202,7 @@ msgstr "ডেমন kill করতে ব্যর্থ: %s"
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
-msgstr ""
-"root পরিচয়ে এই প্রোগ্রামটি সঞ্চালিত হওয়া উচিত নয় (যদি না --system উল্লিখিত হয়)।"
+msgstr "root পরিচয়ে এই প্রোগ্রামটি সঞ্চালিত হওয়া উচিত নয় (যদি না --system উল্লিখিত হয়)।"
 
 #: ../src/daemon/main.c:573
 msgid "Root privileges required."
@@ -396,8 +393,7 @@ msgstr "ডেমন আরম্ভ করতে ব্যর্থ।"
 
 #: ../src/daemon/main.c:909
 msgid "Daemon startup without any loaded modules, refusing to work."
-msgstr ""
-"লোড করা মডিউল বিনা ডেমন আরম্ভ করা হয়েছে এবং কোনো কর্ম সঞ্চালন করা সম্ভব নয়।"
+msgstr "লোড করা মডিউল বিনা ডেমন আরম্ভ করা হয়েছে এবং কোনো কর্ম সঞ্চালন করা সম্ভব নয়।"
 
 #: ../src/daemon/main.c:926
 msgid "Daemon startup complete."
@@ -1099,11 +1095,11 @@ msgstr "ক্লায়েন্ট ফর্ক করা হয়েছে"
 
 #: ../src/pulse/error.c:68
 msgid "Input/Output error"
-msgstr ""
+msgstr "ইনপুট/আউটপুট ত্রুটি"
 
 #: ../src/pulse/error.c:69
 msgid "Device or resource busy"
-msgstr ""
+msgstr "ডিভাইস অথবা রিসোর্সটি ব্যস্ত"
 
 #: ../src/pulse/sample.c:172
 #, c-format
@@ -1539,8 +1535,7 @@ msgstr "সতর্কবার্তা: ফাইলের মধ্যে 
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
 "একটি %s স্ট্রিম খোলা হচ্ছে। এটির জন্য '%s'-র স্যাম্পেলের নির্ধারিত মান ও '%s' "
 "চ্যানেলের ম্যাপ প্রয়োগ করা হবে।"
@@ -1676,8 +1671,7 @@ msgstr "বর্তমানে ব্যবহৃত: %u ব্লকের 
 #: ../src/utils/pactl.c:144
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
-msgstr ""
-"সম্পূর্ণ কর্মকালের জন্য বরাদ্দ করা হয়েছে: %u ব্লকের মধ্যে উপস্থিত সর্বমোট %s বাইট।\n"
+msgstr "সম্পূর্ণ কর্মকালের জন্য বরাদ্দ করা হয়েছে: %u ব্লকের মধ্যে উপস্থিত সর্বমোট %s বাইট।\n"
 
 #: ../src/utils/pactl.c:147
 #, c-format
@@ -2135,8 +2129,7 @@ msgid "You have to specify a module index"
 msgstr "মডিউল ইন্ডেক্স নির্ধারণ করা আবশ্যক"
 
 #: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
+msgid "You may not specify more than one sink. You have to specify a boolean value."
 msgstr "একাধিক সিংক নির্ধারণ করা যাবে না। বুলিয়েন মান নির্ধারণ করা আবশ্যক।"
 
 #: ../src/utils/pactl.c:1103
@@ -2378,217 +2371,204 @@ msgstr "PulseAudio শব্দের সার্ভার"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "আউটপুট ডিভাইস"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "ইনপুট ডিভাইস"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "@HOSTNAME at -র মধ্যে অডিও"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "ইনপুট"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "ডকিং স্টেশন থেকে ইনপুট"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "ডকিং স্টেশনের মাইক্রোফোন"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "লাইন-ইন"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "মাইক্রোফোন"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "বহিস্থিত মাইক্রোফোন"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "অভ্যন্তরীণ অডিও"
+msgstr "অভ্যন্তরীণ মাইক্রোফোন"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "রেডিও"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "ভিডিও"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "স্বয়ংক্রিয় গেইন নিয়ন্ত্রণ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "স্বয়ংক্রিয় গেইন নিয়ন্ত্রণ প্রয়োগ করা হবে না"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "বুস্ট"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "বুস্ট প্রয়োগ করা হবে না"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "বিবর্ধক"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "বিবর্ধন প্রয়োগ করা হবে না"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "অ্যানালগ ইনপুট"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "অ্যানালগ মাইক্রোফোন"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "অ্যানালগ লাইন-ইন"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "অ্যানালগ রেডিও"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "অ্যানালগ ভিডিও"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "Null ফলাফল"
+msgstr "অ্যানালগ আউটপুট"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "অ্যানালগ হেড-ফোন"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "অ্যানালগ আউটপুট (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "অ্যানালগ মোনো আউটপুট"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "অ্যানালগ মোনো"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
-#, fuzzy
 msgid "Analog Stereo"
-msgstr "স্টিরিও"
+msgstr "অ্যানালগ স্টিরিও"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "সারাউন্ড ৪.১"
+msgstr "অ্যানালগ সারাউন্ড ২.১"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "সারাউন্ড ৪.০"
+msgstr "অ্যানালগ সারাউন্ড ৩.০"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "সারাউন্ড ৪.১"
+msgstr "অ্যানালগ সারাউন্ড ৩.১"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
-#, fuzzy
 msgid "Analog Surround 4.0"
-msgstr "সারাউন্ড ৪.০"
+msgstr "অ্যানালগ সারাউন্ড ৪.০"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
-#, fuzzy
 msgid "Analog Surround 4.1"
-msgstr "সারাউন্ড ৪.১"
+msgstr "অ্যানালগ সারাউন্ড ৪.১"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
-#, fuzzy
 msgid "Analog Surround 5.0"
-msgstr "সারাউন্ড ৫.০"
+msgstr "অ্যানালগ সারাউন্ড ৫.০"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
-#, fuzzy
 msgid "Analog Surround 5.1"
-msgstr "সারাউন্ড ৫.১"
+msgstr "অ্যানালগ সারাউন্ড ৫.১"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "সারাউন্ড ৪.০"
+msgstr "অ্যানালগ সারাউন্ড ৬.০"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "সারাউন্ড ৪.১"
+msgstr "অ্যানালগ সারাউন্ড ৬.১"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "সারাউন্ড ৪.০"
+msgstr "অ্যানালগ সারাউন্ড ৭.০"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
-#, fuzzy
 msgid "Analog Surround 7.1"
-msgstr "সারাউন্ড ৭.১"
+msgstr "অ্যানালগ সারাউন্ড ৭.১"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "ডিজিট্যাল স্টিরিও (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "ডিজিট্যাল সারাউন্ড ৪.০ (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "ডিজিট্যাল সারাউন্ড ৪.০ (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "ডিজিট্যাল সারাউন্ড ৫.১ (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "ডিজিট্যাল স্টিরিও (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "অ্যানালগ মোনো ডুপ্লে"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "অ্যানালগ স্টিরিও ডুপ্লে"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "ডিজিট্যাল স্টিরিও ডুপ্লে (IEC958)"
+

commit e6ffac775fdde7115c368f306eb0a77a24df375f
Author: jassy <jassy at fedoraproject.org>
Date:   Tue Dec 8 09:42:42 2009 +0000

    Sending translation for Punjabi

diff --git a/po/pa.po b/po/pa.po
index 16c5abe..ab97ac0 100644
--- a/po/pa.po
+++ b/po/pa.po
@@ -9,14 +9,14 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.pa\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-11 12:08+0530\n"
+"POT-Creation-Date: 2009-12-08 08:37+0000\n"
+"PO-Revision-Date: 2009-12-08 15:04+0530\n"
 "Last-Translator: Jaswinder Singh <jsingh at redhat.com>\n"
-"Language-Team: Punjabi <Punjabi-users at lists.sourceforge.net>\n"
+"Language-Team: Punjabi/Panjabi <kde-i18n-doc at kde.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.11.4\n"
+"X-Generator: Lokalize 1.0\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
 #: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
@@ -1514,8 +1514,7 @@ msgstr "ਇੱਕ %s ਸਟਰੀਮ ਨੂੰ ਸੈਂਪਲ ਹਦਾਇਤ '
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "ਇੱਕ %s ਸਟਰੀਮ ਨੂੰ ਸੈਂਪਲ ਹਦਾਇਤ '%s' ਅਤੇ ਚੈਨਲ ਮੈਪ '%s' ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ।"
 
 #: ../src/utils/pacat.c:1009
@@ -2105,8 +2104,7 @@ msgid "You have to specify a module index"
 msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਮੈਡੀਊਲ ਲਿਸਟ ਦੇਣੀ ਪਵੇਗੀ"
 
 #: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
+msgid "You may not specify more than one sink. You have to specify a boolean value."
 msgstr "ਤੁਸੀਂ ਇੱਕ ਤੋਂ ਵੱਧ ਸਿੰਕ ਨਹੀਂ ਦੇ ਸਕਦੇ। ਤੁਹਾਨੂੰ ਇੱਕ ਬੁਲੀਅਨ ਮੁੱਲ ਦੇਣਾ ਪਵੇਗਾ।"
 
 #: ../src/utils/pactl.c:1103
@@ -2348,217 +2346,202 @@ msgstr "ਪਲਸਆਡੀਓ ਸਾਊਂਡ ਡਰਾਇਵਰ"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "ਆਊਟਪੁੱਟ ਜੰਤਰ"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "ਇੰਪੁੱਟ ਜੰਤਰ"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "@HOSTNAME@ ਉੱਪਰ ਆਡੀਓ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "ਇੰਪੁੱਟ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "ਡੌਕਿੰਗ ਸਟੇਸ਼ਨ ਇੰਪੁੱਟ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "ਡੌਕਿੰਗ ਸਟੇਸ਼ਨ ਮਾਈਕਰੋਫੋਨ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "ਲਾਈਨ-ਇਨ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "ਮਾਈਕਰੋਫੋਨ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "ਬਾਹਰੀ ਮਾਈਕਰੋਫੋਨ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "ਅੰਦਰੂਨੀ ਆਡੀਓ"
+msgstr "ਅੰਦਰੂਨੀ ਮਾਈਕਰੋਫੋਨ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "ਰੇਡੀਓ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "ਵੀਡੀਓ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "ਆਟੋਮੈਟਿਕ ਗੇਨ ਕੰਟਰੋਲ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "ਕੋਈ ਆਟੋਮੈਟਿਕ ਗੇਨ ਕੰਟਰੋਲ ਨਹੀਂ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "ਬੂਸਟ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "ਕੋਈ ਬੂਸਟ ਨਹੀਂ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "ਐਂਪਲੀਫਾਇਰ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "ਕੋਈ ਐਂਪਲੀਫਾਇਰ ਨਹੀਂ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "ਐਨਾਲਾਗ ਇੰਪੁੱਟ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "ਐਨਾਲਾਗ ਮਾਈਕਰੋਫੋਨ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "ਐਨਾਲਾਗ ਲਾਈਨ-ਇਨ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "ਐਨਾਲਾਗ ਰੇਡੀਓ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "ਐਨਾਲਾਗ ਵੀਡੀਓ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "ਜ਼ੀਰੋ (Null) ਆਉਟਪੁੱਟ"
+msgstr "ਐਨਾਲਾਗ ਆਉਟਪੁੱਟ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "ਐਨਾਲਾਗ ਹੈੱਡਫੋਨ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "ਐਨਾਲਾਗ ਆਊਟਪੁੱਟ (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "ਐਨਾਲਾਗ ਮੋਨੋ ਆਊਟਪੁੱਟ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#: ../src/modules/alsa/alsa-mixer.c:1981, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "ਐਨਾਲਾਗ ਮੋਨੋ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
-#, fuzzy
 msgid "Analog Stereo"
-msgstr "ਸਟੀਰੀਓ"
+msgstr "ਐਨਾਲਾਗ ਸਟੀਰੀਓ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "ਸਰਾਊਂਡਿੰਗ 4.1"
+msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "ਸਰਾਊਂਡਿੰਗ 4.0"
+msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "ਸਰਾਊਂਡਿੰਗ 4.1"
+msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
-#, fuzzy
 msgid "Analog Surround 4.0"
-msgstr "ਸਰਾਊਂਡਿੰਗ 4.0"
+msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
-#, fuzzy
 msgid "Analog Surround 4.1"
-msgstr "ਸਰਾਊਂਡਿੰਗ 4.1"
+msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
-#, fuzzy
 msgid "Analog Surround 5.0"
-msgstr "ਸਰਾਊਂਡਿੰਗ 5.0"
+msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
-#, fuzzy
 msgid "Analog Surround 5.1"
-msgstr "ਸਰਾਊਂਡਿੰਗ 5.1"
+msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "ਸਰਾਊਂਡਿੰਗ 4.0"
+msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "ਸਰਾਊਂਡਿੰਗ 4.1"
+msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "ਸਰਾਊਂਡਿੰਗ 4.0"
+msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
-#, fuzzy
 msgid "Analog Surround 7.1"
-msgstr "ਸਰਾਊਂਡਿੰਗ 7.1"
+msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "ਡਿਜ਼ੀਟਲ ਸਟੀਰੀਓ (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "ਡਿਜ਼ੀਟਲ ਸਰਾਊਂਡ 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "ਡਿਜ਼ੀਟਲ ਸਰਾਊਂਡ 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "ਡਿਜ਼ੀਟਲ ਸਰਾਊਂਡ 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "ਡਿਜ਼ੀਟਲ ਸਟੀਰੀਓ (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "ਐਨਾਲਾਗ ਮੋਨੋ ਡੁਪਲੈਕਸ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "ਐਨਾਲਾਗ ਸਟੀਰੀਓ ਡੁਪਲੈਕਸ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "ਡਿਜ਼ੀਟਲ ਸਟੀਰੀਓ ਡੁਪਲੈਕਸ (IEC958)"
+

commit 257eabffeb109f6075fc0a0b10ad8c1dcdf39835
Author: leahliu <leahliu at fedoraproject.org>
Date:   Wed Dec 9 02:56:48 2009 +0000

    Sending translation for Chinese (Simplified)

diff --git a/po/zh_CN.po b/po/zh_CN.po
index a273066..bf3610f 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -11,8 +11,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-04-06 10:26+1000\n"
+"POT-Creation-Date: 2009-12-07 20:11+0000\n"
+"PO-Revision-Date: 2009-12-09 12:54+1000\n"
 "Last-Translator: Leah Liu <lliu at redhat.com>\n"
 "Language-Team: Simplified Chinese <zh at li.org>\n"
 "MIME-Version: 1.0\n"
@@ -23,7 +23,7 @@ msgstr ""
 #: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
 #, c-format
 msgid "%s %s"
-msgstr ""
+msgstr "%s %s"
 
 #: ../src/modules/alsa/alsa-util.c:1106
 #, c-format
@@ -60,15 +60,15 @@ msgstr ""
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr ""
+msgstr "总是保持至少载入一个漏,即使它是空的"
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
-msgstr ""
+msgstr "假输出"
 
 #: ../src/modules/module-ladspa-sink.c:49
 msgid "Virtual LADSPA sink"
-msgstr ""
+msgstr "虚拟 LDASPA 漏"
 
 #: ../src/modules/module-ladspa-sink.c:53
 msgid ""
@@ -78,15 +78,19 @@ msgid ""
 "plugin name> label=<ladspa plugin label> control=<comma seperated list of "
 "input control values>"
 msgstr ""
+"sink_name=<name for the sink> sink_properties=<properties for the sink> "
+"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
+"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
+"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
+"input control values>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
-msgstr ""
+msgstr "定时的空漏"
 
 #: ../src/modules/module-null-sink.c:291
-#, fuzzy
 msgid "Null Output"
-msgstr "输出 %s"
+msgstr "空输出"
 
 #: ../src/pulsecore/sink.c:2613
 msgid "Internal Audio"
@@ -323,9 +327,9 @@ msgid "Machine ID is %s."
 msgstr "machine ID是%s。"
 
 #: ../src/daemon/main.c:773
-#, fuzzy, c-format
+#, c-format
 msgid "Session ID is %s."
-msgstr "machine ID是%s。"
+msgstr "会话 ID %s。"
 
 #: ../src/daemon/main.c:779
 #, c-format
@@ -338,9 +342,9 @@ msgid "Using state directory %s."
 msgstr "正在使用状态文件夹%s。"
 
 #: ../src/daemon/main.c:787
-#, fuzzy, c-format
+#, c-format
 msgid "Using modules directory %s."
-msgstr "正在使用运行时文件夹%s。"
+msgstr "正在使用模块目录 %s。"
 
 #: ../src/daemon/main.c:789
 #, c-format
@@ -356,6 +360,9 @@ msgid ""
 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
 "explanation why system mode is usually a bad idea."
 msgstr ""
+"确定,那么您正在系统模式中运行 PA。请注意:您很可能不应该这样做。\n"
+"如果您无论如何都这样做了,那么出现意外情况就是您的问题。\n"
+"在文章 http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode 中解释了为什么系统模式通常不是个好主意。"
 
 #: ../src/daemon/main.c:809
 msgid "pa_pid_file_create() failed."
@@ -369,7 +376,7 @@ msgstr "新鲜的高分辨率计时器开锅了!吃个饱!"
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
-msgstr "老兄,你的内核真臭!现在流行的是启用了高分辩率计分器的Linux!"
+msgstr "老兄,您的内核真臭!现在流行的是启用了高分辩率计分器的Linux!"
 
 #: ../src/daemon/main.c:844
 msgid "pa_core_new() failed."
@@ -625,7 +632,7 @@ msgstr "加载一次:%s\n"
 #: ../src/daemon/dumpmodules.c:75
 #, c-format
 msgid "DEPRECATION WARNING: %s\n"
-msgstr ""
+msgstr "反对警告:%s\n"
 
 #: ../src/daemon/dumpmodules.c:79
 #, c-format
@@ -709,9 +716,8 @@ msgid "### Read from configuration file: %s ###\n"
 msgstr "### 从配置文件读取:%s ###\n"
 
 #: ../src/daemon/caps.c:62
-#, fuzzy
 msgid "Cleaning up privileges."
-msgstr "正在取消 root 特权。"
+msgstr "取消特权。"
 
 #: ../src/daemon/pulseaudio.desktop.in.h:1
 msgid "PulseAudio Sound System"
@@ -1057,11 +1063,11 @@ msgstr "客户端分支"
 
 #: ../src/pulse/error.c:68
 msgid "Input/Output error"
-msgstr ""
+msgstr "输入/输出错误"
 
 #: ../src/pulse/error.c:69
 msgid "Device or resource busy"
-msgstr ""
+msgstr "设备或者资源忙"
 
 #: ../src/pulse/sample.c:172
 #, c-format
@@ -1121,171 +1127,166 @@ msgid "Received message for unknown extension '%s'"
 msgstr "收到未知扩展'%s'的信息"
 
 #: ../src/utils/pacat.c:108
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to drain stream: %s"
-msgstr "排出流失败:%s\n"
+msgstr "排出流失败:%s"
 
 #: ../src/utils/pacat.c:113
-#, fuzzy
 msgid "Playback stream drained."
-msgstr "流播放完毕。\n"
+msgstr "回放流枯竭。"
 
 #: ../src/utils/pacat.c:123
-#, fuzzy
 msgid "Draining connection to server."
-msgstr "Draining 连接到服务器。\n"
+msgstr "到服务器的 Draining 连接。"
 
 #: ../src/utils/pacat.c:136
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_drain(): %s"
-msgstr "pa_stream_drain():%s\n"
+msgstr "pa_stream_drain(): %s"
 
 #: ../src/utils/pacat.c:159
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_write() failed: %s"
-msgstr "pa_stream_write()失败:%s\n"
+msgstr "pa_stream_write() failed: %s"
 
 #: ../src/utils/pacat.c:197
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_begin_write() failed: %s"
-msgstr "pa_stream_write()失败:%s\n"
+msgstr "pa_stream_begin_write() failed: %s"
 
 #: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_peek() failed: %s"
-msgstr "pa_stream_peek()失败:%s\n"
+msgstr "pa_stream_peek() failed: %s"
 
 #: ../src/utils/pacat.c:307
-#, fuzzy
 msgid "Stream successfully created."
-msgstr "流创建成功。\n"
+msgstr "流创建成功。"
 
 #: ../src/utils/pacat.c:310
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
-msgstr "pa_stream_get_buffer_attr()失败:%s\n"
+msgstr "pa_stream_get_buffer_attr() failed: %s"
 
 #: ../src/utils/pacat.c:314
-#, fuzzy, c-format
+#, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
-msgstr "缓冲计量:maxlength=%u,tlength=%u,prebuf=%u,minreq=%u\n"
+msgstr "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
 #: ../src/utils/pacat.c:317
-#, fuzzy, c-format
+#, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
-msgstr "缓冲计量:maxlength=%u,fragsize=%u\n"
+msgstr "Buffer metrics: maxlength=%u, fragsize=%u"
 
 #: ../src/utils/pacat.c:321
-#, fuzzy, c-format
+#, c-format
 msgid "Using sample spec '%s', channel map '%s'."
-msgstr "正在使用样品规格'%s',通道映射'%s'。\n"
+msgstr "正在使用样品规格 '%s',通道映射 '%s'。"
 
 #: ../src/utils/pacat.c:325
-#, fuzzy, c-format
+#, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
-msgstr "已连接至设备%s (%u,%s挂起)。\n"
+msgstr "已连接至设备 %s (%u,%s 挂起)。"
 
 #: ../src/utils/pacat.c:335
-#, fuzzy, c-format
+#, c-format
 msgid "Stream error: %s"
-msgstr "流错误:%s\n"
+msgstr "流错误:%s"
 
 #: ../src/utils/pacat.c:345
-#, fuzzy, c-format
+#, c-format
 msgid "Stream device suspended.%s"
-msgstr "流设备挂起。%s\n"
+msgstr "流设备挂起。%s"
 
 #: ../src/utils/pacat.c:347
-#, fuzzy, c-format
+#, c-format
 msgid "Stream device resumed.%s"
-msgstr "流设备恢复。%s\n"
+msgstr "流设备恢复。%s"
 
 #: ../src/utils/pacat.c:355
-#, fuzzy, c-format
+#, c-format
 msgid "Stream underrun.%s"
-msgstr "流欠载运行。%s\n"
+msgstr "流欠载运行。%s"
 
 #: ../src/utils/pacat.c:362
-#, fuzzy, c-format
+#, c-format
 msgid "Stream overrun.%s"
-msgstr "流超限运行。%s\n"
+msgstr "流超限运行。%s"
 
 #: ../src/utils/pacat.c:369
-#, fuzzy, c-format
+#, c-format
 msgid "Stream started.%s"
-msgstr "流已启动。%s\n"
+msgstr "流已启动。%s"
 
 #: ../src/utils/pacat.c:376
-#, fuzzy, c-format
+#, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
-msgstr "流移至设备%s (%u,%s挂起)。%s\n"
+msgstr "流移至设备 %s (%u,%s 挂起)。%s"
 
 #: ../src/utils/pacat.c:376
 msgid "not "
 msgstr "not "
 
 #: ../src/utils/pacat.c:383
-#, fuzzy, c-format
+#, c-format
 msgid "Stream buffer attributes changed.%s"
-msgstr "更改流换出属性。%s\n"
+msgstr "更改流缓冲属性。%s"
 
 #: ../src/utils/pacat.c:415
-#, fuzzy, c-format
+#, c-format
 msgid "Connection established.%s"
-msgstr "连接已建立。%s \n"
+msgstr "连接已建立。%s "
 
 #: ../src/utils/pacat.c:418
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_new() failed: %s"
-msgstr "pa_stream_new()失败:%s\n"
+msgstr "pa_stream_new() failed: %s"
 
 #: ../src/utils/pacat.c:450
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_connect_playback() failed: %s"
-msgstr "pa_stream_connect_playback()失败:%s\n"
+msgstr "pa_stream_connect_playback() failed: %s"
 
 #: ../src/utils/pacat.c:456
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_connect_record() failed: %s"
-msgstr "pa_stream_connect_playback()失败:%s\n"
+msgstr "pa_stream_connect_record() failed: %s"
 
 #: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
-#, fuzzy, c-format
+#, c-format
 msgid "Connection failure: %s"
-msgstr "连接失败:%s\n"
+msgstr "连接失败:%s"
 
 #: ../src/utils/pacat.c:503
-#, fuzzy
 msgid "Got EOF."
-msgstr "收到EOF。\n"
+msgstr "获得 EOF。"
 
 #: ../src/utils/pacat.c:540
-#, fuzzy, c-format
+#, c-format
 msgid "write() failed: %s"
-msgstr "write()失败:%s\n"
+msgstr "写入()失败:%s"
 
 #: ../src/utils/pacat.c:561
-#, fuzzy
 msgid "Got signal, exiting."
-msgstr "收到信号,正在退出。\n"
+msgstr "收到信号,正在退出。"
 
 #: ../src/utils/pacat.c:575
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get latency: %s"
-msgstr "获取传输延迟失败:%s\n"
+msgstr "获取传输延迟失败:%s"
 
 #: ../src/utils/pacat.c:580
-#, fuzzy, c-format
+#, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
-msgstr "时间:%0.3f秒;延迟:%0.0f 微秒。  \r"
+msgstr "时间:%0.3f 秒;延迟:%0.0f 微秒。"
 
 #: ../src/utils/pacat.c:599
-#, fuzzy, c-format
+#, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
-msgstr "pa_stream_update_timing_info()失败:%s\n"
+msgstr "pa_stream_update_timing_info() failed: %s"
 
 #: ../src/utils/pacat.c:609
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1346,7 +1347,7 @@ msgstr ""
 "%s [options]\n"
 "\n"
 "  -h, --help                            显示此帮助\n"
-"      --version                         显示版本号\n"
+"      --version                         显示版本\n"
 "\n"
 "  -r, --record                          为录制创建连接\n"
 "  -p, --playback                        为回放创建连接\n"
@@ -1354,24 +1355,24 @@ msgstr ""
 "  -v, --verbose                         启用详述操作\n"
 "\n"
 "  -s, --server=SERVER                   要连接的服务器名\n"
-"  -d, --device=DEVICE                   要连接的sink/source名\n"
-"  -n, --client-name=NAME                指定客户端在服务器上的名称\n"
-"      --stream-name=NAME                指定流在服务器上的名称\n"
+"  -d, --device=DEVICE                   要连接的漏/源名称\n"
+"  -n, --client-name=NAME                如何在服务器中调用此客户端\n"
+"      --stream-name=NAME                如何在服务器中调用这个流\n"
 "      --volume=VOLUME                   指定初始(线性)音量,取值在0...65536"
 "之间\n"
-"      --rate=SAMPLERATE                 采样频率(单位Hz,默认为44100)\n"
-"      --format=SAMPLEFORMAT             采样类型,从s16le,s16be,u8,"
-"float32le,\n"
-"                                        float32be,ulaw,alaw,s32le,s32be中"
-"取(默认为s16ne)\n"
+"      --rate=SAMPLERATE                 采样频率(单位 Hz,默认为44100)\n"
+"      --format=SAMPLEFORMAT             采样类型,s16le、s16be、u8、"
+"float32le 之一\n"
+"                                        float32be、ulaw、alaw、s32le、s32be 中"
+"取(默认为 s16ne)\n"
 "      --channels=CHANNELS               通道数,1为单声道,2为立体声(默认为"
 "2)\n"
 "      --channel-map=CHANNELMAP          取代默认值的通道映射表\n"
-"      --fix-format                      从流连接的音频出口处取采样格式。\n"
-"      --fix-rate                        从流连接的音频出口处取采样率。\n"
-"      --fix-channels                    从流连接的音频出口处取通道数和通道映"
+"      --fix-format                      从流连接的漏中提取采样格式。\n"
+"      --fix-rate                        从流连接的漏中提取采样率。\n"
+"      --fix-channels                    从流连接的漏中提取通道数和通道映"
 "射表。\n"
-"      --no-remix                        Don't upmix or downmix channels.\n"
+"      --no-remix                        不要对通道进行 upmix 或者 downmix 操作。\n"
 "      --no-remap                        根据下标而非名称来映射通道。\n"
 "      --latency=BYTES                   请求指定字节数的延迟。\n"
 "      --process-time=BYTES              每次请求指定字节数的处理时间。\n"
@@ -1388,102 +1389,92 @@ msgstr ""
 "Linked with libpulse %s\n"
 
 #: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid client name '%s'"
-msgstr "无效的通道映射描述'%s'\n"
+msgstr "无效客户端名称 '%s'"
 
 #: ../src/utils/pacat.c:779
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid stream name '%s'"
-msgstr "无效的重采样方法'%s'。"
+msgstr "无效流名称 '%s'"
 
 #: ../src/utils/pacat.c:816
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid channel map '%s'"
-msgstr "无效的通道映射描述'%s'\n"
+msgstr "无效通道映射 '%s'"
 
 #: ../src/utils/pacat.c:845
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid latency specification '%s'"
-msgstr "无效的延迟规格描述 %s'\n"
+msgstr "无效延迟说明 %s'"
 
 #: ../src/utils/pacat.c:852
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid process time specification '%s'"
-msgstr "无效的处理时间描述 '%s'\n"
+msgstr "无效处理时间说明 '%s'"
 
 #: ../src/utils/pacat.c:864
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid property '%s'"
-msgstr "无效的重采样方法'%s'。"
+msgstr "无效性能 '%s'"
 
 #: ../src/utils/pacat.c:881
 #, c-format
 msgid "Unknown file format %s."
-msgstr ""
+msgstr "未知文件格式 %s。"
 
 #: ../src/utils/pacat.c:900
-#, fuzzy
 msgid "Invalid sample specification"
-msgstr "无效的采样描述\n"
+msgstr "无效采样说明"
 
 #: ../src/utils/pacat.c:910
-#, fuzzy, c-format
+#, c-format
 msgid "open(): %s"
-msgstr "open():%s\n"
+msgstr "open(): %s"
 
 #: ../src/utils/pacat.c:915
-#, fuzzy, c-format
+#, c-format
 msgid "dup2(): %s"
-msgstr "dup2():%s\n"
+msgstr "dup2(): %s"
 
 #: ../src/utils/pacat.c:922
-#, fuzzy
 msgid "Too many arguments."
-msgstr "参数过多。\n"
+msgstr "参数过多。"
 
 #: ../src/utils/pacat.c:933
-#, fuzzy
 msgid "Failed to generate sample specification for file."
-msgstr "获取采样信息失败:%s\n"
+msgstr "为文件获取采样说明失败。"
 
 #: ../src/utils/pacat.c:953
-#, fuzzy
 msgid "Failed to open audio file."
-msgstr "打开声音文件失败。\n"
+msgstr "打开声音文件失败。"
 
 #: ../src/utils/pacat.c:959
-#, fuzzy
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
-msgstr "以采样规格'%s'打开%s流。\n"
+msgstr "警告:指定的采样说明将覆盖文件中的说明。"
 
 #: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
-#, fuzzy
 msgid "Failed to determine sample specification from file."
-msgstr "获取采样信息失败:%s\n"
+msgstr "从文件中确定采样说明失败。"
 
 #: ../src/utils/pacat.c:971
-#, fuzzy
 msgid "Warning: Failed to determine channel map from file."
-msgstr "以采样规格'%s'打开%s流。\n"
+msgstr "警告:从文件中确定通道映射失败。"
 
 #: ../src/utils/pacat.c:982
-#, fuzzy
 msgid "Channel map doesn't match sample specification"
-msgstr "通道映射与采样描述不匹配\n"
+msgstr "通道映射与采样说明不匹配"
 
 #: ../src/utils/pacat.c:993
-#, fuzzy
 msgid "Warning: failed to write channel map to file."
-msgstr "以采样规格'%s'打开%s流。\n"
+msgstr "警告:在文件中写入通道映射失败。"
 
 #: ../src/utils/pacat.c:1008
-#, fuzzy, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr "以采样规格'%s'打开%s流。\n"
+#, c-format
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr "使用采样说明 '%s' 和通道映射 '%s' 打开 %s 流。"
 
 #: ../src/utils/pacat.c:1009
 msgid "recording"
@@ -1494,19 +1485,16 @@ msgid "playback"
 msgstr "回放"
 
 #: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
-#, fuzzy
 msgid "pa_mainloop_new() failed."
-msgstr "pa_mainloop_new()失败。\n"
+msgstr "pa_mainloop_new() failed."
 
 #: ../src/utils/pacat.c:1054
-#, fuzzy
 msgid "io_new() failed."
-msgstr "io_new()失败。\n"
+msgstr "io_new() failed."
 
 #: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
-#, fuzzy
 msgid "pa_context_new() failed."
-msgstr "pa_context_new()失败。\n"
+msgstr "pa_context_new() failed."
 
 #: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
 #, c-format
@@ -1514,14 +1502,12 @@ msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect()失败:%s"
 
 #: ../src/utils/pacat.c:1075
-#, fuzzy
 msgid "pa_context_rttime_new() failed."
-msgstr "pa_context_new()失败。\n"
+msgstr "pa_context_rttime_new() failed."
 
 #: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
-#, fuzzy
 msgid "pa_mainloop_run() failed."
-msgstr "pa_mainloop_run()失败。\n"
+msgstr "pa_mainloop_run() failed."
 
 #: ../src/utils/pasuspender.c:81
 #, c-format
@@ -1608,9 +1594,9 @@ msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run()失败。\n"
 
 #: ../src/utils/pactl.c:135
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get statistics: %s"
-msgstr "获取统计数据失败:%s\n"
+msgstr "获取统计数据失败:%s"
 
 #: ../src/utils/pactl.c:141
 #, c-format
@@ -1628,9 +1614,9 @@ msgid "Sample cache size: %s\n"
 msgstr "采样缓存大小:%s\n"
 
 #: ../src/utils/pactl.c:156
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get server information: %s"
-msgstr "获取服务器信息失败:%s\n"
+msgstr "获取服务器信息失败:%s"
 
 #: ../src/utils/pactl.c:164
 #, c-format
@@ -1656,9 +1642,9 @@ msgstr ""
 "Cookie:%08x\n"
 
 #: ../src/utils/pactl.c:205
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get sink information: %s"
-msgstr "获取音频出口信息失败:%s\n"
+msgstr "获取音频出口信息失败:%s"
 
 #: ../src/utils/pactl.c:221
 #, c-format
@@ -1700,19 +1686,19 @@ msgstr ""
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
-#, fuzzy, c-format
+#, c-format
 msgid "\tPorts:\n"
-msgstr "\tProfiles:\n"
+msgstr "\tPorts:\n"
 
 #: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
-#, fuzzy, c-format
+#, c-format
 msgid "\tActive Port: %s\n"
-msgstr "\tActive Profile: %s\n"
+msgstr "\tActive Port: %s\n"
 
 #: ../src/utils/pactl.c:297
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get source information: %s"
-msgstr "获取音频入口信息失败:%s\n"
+msgstr "获取音频入口信息失败:%s"
 
 #: ../src/utils/pactl.c:313
 #, c-format
@@ -1762,9 +1748,9 @@ msgid "n/a"
 msgstr "n/a"
 
 #: ../src/utils/pactl.c:375
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get module information: %s"
-msgstr "获取模块信息失败:%s\n"
+msgstr "获取模块信息失败:%s"
 
 #: ../src/utils/pactl.c:393
 #, c-format
@@ -1784,9 +1770,9 @@ msgstr ""
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:412
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get client information: %s"
-msgstr "获取客户端信息失败:%s\n"
+msgstr "获取客户端信息失败:%s"
 
 #: ../src/utils/pactl.c:430
 #, c-format
@@ -1804,9 +1790,9 @@ msgstr ""
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:447
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get card information: %s"
-msgstr "获取声卡信息失败:%s\n"
+msgstr "获取声卡信息失败:%s"
 
 #: ../src/utils/pactl.c:465
 #, c-format
@@ -1836,9 +1822,9 @@ msgid "\tActive Profile: %s\n"
 msgstr "\tActive Profile: %s\n"
 
 #: ../src/utils/pactl.c:496
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get sink input information: %s"
-msgstr "获取音频出口输入信息失败:%s\n"
+msgstr "获取音频出口输入信息失败:%s"
 
 #: ../src/utils/pactl.c:515
 #, c-format
@@ -1878,9 +1864,9 @@ msgstr ""
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:554
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get source output information: %s"
-msgstr "获取音频入口输出信息失败:%s\n"
+msgstr "获取音频入口输出信息失败:%s"
 
 #: ../src/utils/pactl.c:574
 #, c-format
@@ -1912,9 +1898,9 @@ msgstr ""
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:605
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get sample information: %s"
-msgstr "获取采样信息失败:%s\n"
+msgstr "获取采样信息失败:%s"
 
 #: ../src/utils/pactl.c:623
 #, c-format
@@ -1948,27 +1934,25 @@ msgstr ""
 "\t\t%s\n"
 
 #: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
-#, fuzzy, c-format
+#, c-format
 msgid "Failure: %s"
-msgstr "失败:%s\n"
+msgstr "失败:%s"
 
 #: ../src/utils/pactl.c:687
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to upload sample: %s"
-msgstr "上传采样失败:%s\n"
+msgstr "上传采样失败:%s"
 
 #: ../src/utils/pactl.c:704
-#, fuzzy
 msgid "Premature end of file"
-msgstr "文件过早结束\n"
+msgstr "文件过早结束"
 
 #: ../src/utils/pactl.c:863
-#, fuzzy
 msgid "Got SIGINT, exiting."
-msgstr "收到SIGINT,正在退出。\n"
+msgstr "收到 SIGINT,正在退出。"
 
 #: ../src/utils/pactl.c:869
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2006,13 +1990,21 @@ msgstr ""
 "%s [options] upload-sample FILENAME [NAME]\n"
 "%s [options] play-sample NAME [SINK]\n"
 "%s [options] remove-sample NAME\n"
-"%s [options] move-sink-input ID SINK\n"
-"%s [options] move-source-output ID SOURCE\n"
+"%s [options] move-sink-input SINKINPUT SINK\n"
+"%s [options] move-source-output SOURCEOUTPUT SOURCE\n"
 "%s [options] load-module NAME [ARGS ...]\n"
-"%s [options] unload-module 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"
+"%s [options] unload-module MODULE\n"
+"%s [options] suspend-sink SINK 1|0\n"
+"%s [options] suspend-source SOURCE 1|0\n"
+"%s [options] set-card-profile CARD PROFILE\n"
+"%s [options] set-sink-port SINK PORT\n"
+"%s [options] set-source-port SOURCE PORT\n"
+"%s [options] set-sink-volume SINK VOLUME\n"
+"%s [options] set-source-volume SOURCE VOLUME\n"
+"%s [options] set-sink-input-volume SINKINPUT VOLUME\n"
+"%s [options] set-sink-mute SINK 1|0\n"
+"%s [options] set-source-mute SOURCE 1|0\n"
+"%s [options] set-sink-input-mute SINKINPUT 1|0\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2034,128 +2026,104 @@ msgstr ""
 "Linked with libpulse %s\n"
 
 #: ../src/utils/pactl.c:979
-#, fuzzy
 msgid "Please specify a sample file to load"
-msgstr "请指定要加载的采样文件\n"
+msgstr "请指定要加载的采样文件"
 
 #: ../src/utils/pactl.c:992
-#, fuzzy
 msgid "Failed to open sound file."
-msgstr "打开声音文件失败。\n"
+msgstr "打开声音文件失败。"
 
 #: ../src/utils/pactl.c:1004
-#, fuzzy
 msgid "Warning: Failed to determine sample specification from file."
-msgstr "以采样规格'%s'打开%s流。\n"
+msgstr "警告:从文件中确定采样说明失败。"
 
 #: ../src/utils/pactl.c:1014
-#, fuzzy
 msgid "You have to specify a sample name to play"
-msgstr "你必须指定要播放的采样名\n"
+msgstr "您必须指定要播放的采样名"
 
 #: ../src/utils/pactl.c:1026
-#, fuzzy
 msgid "You have to specify a sample name to remove"
-msgstr "你必须指定要删除的采样名\n"
+msgstr "您必须指定要删除的采样名"
 
 #: ../src/utils/pactl.c:1035
-#, fuzzy
 msgid "You have to specify a sink input index and a sink"
-msgstr "你必须指定音频出口索引和音频出口\n"
+msgstr "您必须指定漏输入索引和漏"
 
 #: ../src/utils/pactl.c:1045
-#, fuzzy
 msgid "You have to specify a source output index and a source"
-msgstr "你必须指定音频入口输出索引和音频入口\n"
+msgstr "您必须指定源输出索引和源"
 
 #: ../src/utils/pactl.c:1060
-#, fuzzy
 msgid "You have to specify a module name and arguments."
-msgstr "必须指定模块名和参数。\n"
+msgstr "必须指定模块名和参数。"
 
 #: ../src/utils/pactl.c:1080
-#, fuzzy
 msgid "You have to specify a module index"
-msgstr "必须指定模块索引\n"
+msgstr "必须指定模块索引"
 
 #: ../src/utils/pactl.c:1090
-#, fuzzy
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
-msgstr "不可指定多个音频出口。必须指定一个布尔值。\n"
+msgid "You may not specify more than one sink. You have to specify a boolean value."
+msgstr "不可指定多个漏。必须指定一个布尔值。"
 
 #: ../src/utils/pactl.c:1103
-#, fuzzy
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr "不可指定多个源。必须指定一个布尔值。\n"
+msgstr "不可指定多个源。必须指定一个布尔值。"
 
 #: ../src/utils/pactl.c:1115
-#, fuzzy
 msgid "You have to specify a card name/index and a profile name"
-msgstr "你必须指定声卡名称/索引和侧写名称\n"
+msgstr "您必须指定声卡名称/索引和侧写名称"
 
 #: ../src/utils/pactl.c:1126
-#, fuzzy
 msgid "You have to specify a sink name/index and a port name"
-msgstr "你必须指定声卡名称/索引和侧写名称\n"
+msgstr "您必须指定漏名称/索引和端口名称"
 
 #: ../src/utils/pactl.c:1137
-#, fuzzy
 msgid "You have to specify a source name/index and a port name"
-msgstr "你必须指定声卡名称/索引和侧写名称\n"
+msgstr "您必须指定源名称/索引和端口名称"
 
 #: ../src/utils/pactl.c:1149
-#, fuzzy
 msgid "You have to specify a sink name/index and a volume"
-msgstr "你必须指定声卡名称/索引和侧写名称\n"
+msgstr "您必须指定漏名称/索引和卷"
 
 #: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
 #: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
 #: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
-#, fuzzy
 msgid "Invalid volume specification"
-msgstr "无效的采样描述\n"
+msgstr "无效采样说明"
 
 #: ../src/utils/pactl.c:1166
-#, fuzzy
 msgid "You have to specify a source name/index and a volume"
-msgstr "你必须指定声卡名称/索引和侧写名称\n"
+msgstr "您必须指定源名称/索引和卷"
 
 #: ../src/utils/pactl.c:1183
-#, fuzzy
 msgid "You have to specify a sink input index and a volume"
-msgstr "你必须指定音频出口索引和音频出口\n"
+msgstr "您必须指定漏输入索引和卷"
 
 #: ../src/utils/pactl.c:1188
 msgid "Invalid sink input index"
-msgstr ""
+msgstr "无效露输入索引"
 
 #: ../src/utils/pactl.c:1204
-#, fuzzy
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr "你必须指定声卡名称/索引和侧写名称\n"
+msgstr "您必须指定漏名称/索引和静音布尔值"
 
 #: ../src/utils/pactl.c:1221
-#, fuzzy
 msgid "You have to specify a source name/index and a mute boolean"
-msgstr "你必须指定声卡名称/索引和侧写名称\n"
+msgstr "您必须指定源名称/索引和静音布尔值"
 
 #: ../src/utils/pactl.c:1238
-#, fuzzy
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr "你必须指定音频出口索引和音频出口\n"
+msgstr "您必须指定露输入索引和静音布尔值"
 
 #: ../src/utils/pactl.c:1243
-#, fuzzy
 msgid "Invalid sink input index specification"
-msgstr "无效的采样描述\n"
+msgstr "无效漏输入索引说明"
 
 #: ../src/utils/pactl.c:1262
-#, fuzzy
 msgid "No valid command specified."
-msgstr "未指定有效的命令。\n"
+msgstr "未指定有效的命令。"
 
 #: ../src/utils/pax11publish.c:61
 #, c-format
@@ -2237,7 +2205,7 @@ msgstr "尚未实现。\n"
 
 #: ../src/utils/pacmd.c:69
 msgid "No PulseAudio daemon running, or not running as session daemon."
-msgstr ""
+msgstr "没有 PulseAudio 守护进程在运行,或者没有作为会话守护进程运行。"
 
 #: ../src/utils/pacmd.c:74
 #, c-format
@@ -2258,9 +2226,9 @@ msgid "Daemon not responding."
 msgstr "后台程序未响应。"
 
 #: ../src/utils/pacmd.c:161
-#, fuzzy, c-format
+#, c-format
 msgid "poll(): %s"
-msgstr "fork():%s"
+msgstr "poll(): %s"
 
 #: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
 #, c-format
@@ -2319,9 +2287,8 @@ msgid "High Fidelity Playback (A2DP)"
 msgstr "高保真回放(A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2198
-#, fuzzy
 msgid "High Fidelity Capture (A2DP)"
-msgstr "高保真回放(A2DP)"
+msgstr "高保真采集(A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2213
 msgid "Telephony Duplex (HSP/HFP)"
@@ -2334,133 +2301,122 @@ msgstr "PulseAudio 声音服务器"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "输出设备"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
-#, fuzzy
 msgid "Input Devices"
-msgstr "输入 %s"
+msgstr "输入设备"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "@HOSTNAME@ 中的音频"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
-#, fuzzy
 msgid "Input"
-msgstr "输入 %s"
+msgstr "输入"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "扩展坞输入"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "扩展坞麦克风"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "Line-In"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "麦克风"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "外部麦克风"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "内部音频"
+msgstr "内部麦克风"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "无线电"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "视频"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "自动增益控制"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "无自动增益控制"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "加速器"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "无加速器"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "均衡器"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "无均衡器"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
-#, fuzzy
 msgid "Analog Input"
-msgstr "模拟单声道"
+msgstr "模拟输入"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
-#, fuzzy
 msgid "Analog Microphone"
-msgstr "模拟单声道"
+msgstr "模拟麦克风"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
-#, fuzzy
 msgid "Analog Line-In"
-msgstr "模拟单声道"
+msgstr "模拟 Line-In"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
-#, fuzzy
 msgid "Analog Radio"
-msgstr "模拟单声道"
+msgstr "模拟无线电"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
-#, fuzzy
 msgid "Analog Video"
-msgstr "模拟立体声"
+msgstr "模拟视频"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "输出 %s"
+msgstr "模拟输出 "
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
-#, fuzzy
 msgid "Analog Headphones"
-msgstr "模拟单声道"
+msgstr "模拟耳机"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "模拟输出(LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
-#, fuzzy
 msgid "Analog Mono Output"
-msgstr "模拟单声道"
+msgstr "模拟单声道输出"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
 #, c-format
 msgid "%s+%s"
-msgstr ""
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
 #, c-format
 msgid "%s / %s"
-msgstr ""
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
@@ -2471,19 +2427,16 @@ msgid "Analog Stereo"
 msgstr "模拟立体声"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "模拟环绕 4.1"
+msgstr "模拟环绕 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "模拟环绕 4.0"
+msgstr "模拟环绕 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "模拟环绕 4.1"
+msgstr "模拟环绕 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Surround 4.0"
@@ -2502,19 +2455,16 @@ msgid "Analog Surround 5.1"
 msgstr "模拟环绕 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "模拟环绕 4.0"
+msgstr "模拟环绕 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "模拟环绕 4.1"
+msgstr "模拟环绕 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "模拟环绕 4.0"
+msgstr "模拟环绕 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 7.1"
@@ -2525,9 +2475,8 @@ msgid "Digital Stereo (IEC958)"
 msgstr "数字立体声(IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
-#, fuzzy
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr "数字环绕 4.0(IEC958/AC3)"
+msgstr "数字环绕 4.0(IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
@@ -2542,214 +2491,14 @@ msgid "Digital Stereo (HDMI)"
 msgstr "数字立体声(HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
-#, fuzzy
 msgid "Analog Mono Duplex"
-msgstr "模拟单声道"
+msgstr "模拟单声道双工"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
-#, fuzzy
 msgid "Analog Stereo Duplex"
-msgstr "模拟立体声"
+msgstr "模拟立体声双工"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
-#, fuzzy
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr "数字立体声(IEC958)"
-
-#, fuzzy
-#~ msgid "Invalid client name '%s'\n"
-#~ msgstr "无效的通道映射描述'%s'\n"
-
-#, fuzzy
-#~ msgid "Failed to determine sample specification from file.\n"
-#~ msgstr "获取采样信息失败:%s\n"
-
-#~ msgid "select(): %s"
-#~ msgstr "select():%s"
-
-#~ msgid "Cannot connect to system bus: %s"
-#~ msgstr "无法连接到系统总线:%s"
-
-#~ msgid "Cannot get caller from PID: %s"
-#~ msgstr "无法从PID获取调用者:%s"
-
-#~ msgid "Cannot set UID on caller object."
-#~ msgstr "无法为调用者设定UID。"
-
-#~ msgid "Failed to get CK session."
-#~ msgstr "获取CK会话失败。"
-
-#~ msgid "Cannot set UID on session object."
-#~ msgstr "无法为会话对象设定UID。"
-
-#~ msgid "Cannot allocate PolKitAction."
-#~ msgstr "不能分配PolKitAction。"
-
-#~ msgid "Cannot set action_id"
-#~ msgstr "无法设定action_id"
-
-#~ msgid "Cannot allocate PolKitContext."
-#~ msgstr "无法分配PolKitContext。"
-
-#~ msgid "Cannot initialize PolKitContext: %s"
-#~ msgstr "无法初使化PolKitContext: %s"
-
-#~ msgid "Could not determine whether caller is authorized: %s"
-#~ msgstr "无法判断调用者是否已获得授权: %s"
-
-#~ msgid "Cannot obtain auth: %s"
-#~ msgstr "无法获取授权: %s"
-
-#~ msgid "PolicyKit responded with '%s'"
-#~ msgstr "PolicyKit回复'%s'"
-
-#~ msgid ""
-#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio "
-#~ "daemon"
-#~ msgstr "PulseAudio 守护进程的高优先调度(负的 Unix nic 等级)"
-
-#~ msgid "Real-time scheduling for the PulseAudio daemon"
-#~ msgstr "PulseAudio 守护进程的实时调度。"
-
-#~ msgid ""
-#~ "System policy prevents PulseAudio from acquiring high-priority scheduling."
-#~ msgstr "系统策略防止 PulseAudio 获得高优先调度。"
+msgstr "数字立体声双工(IEC958)"
 
-#~ msgid ""
-#~ "System policy prevents PulseAudio from acquiring real-time scheduling."
-#~ msgstr "系统策略防止 PulseAudio 获得实时调度。"
-
-#~ msgid "read() failed: %s\n"
-#~ msgstr "read()失败:%s\n"
-
-#, fuzzy
-#~ msgid "pa_context_connect() failed: %s\n"
-#~ msgstr "pa_context_connect()失败:%s"
-
-#~ msgid "We're in the group '%s', allowing high-priority scheduling."
-#~ msgstr "我们在'%s'组中,允许高优先级调度。"
-
-#~ msgid "We're in the group '%s', allowing real-time scheduling."
-#~ msgstr "我们在'%s'组中,允许实时调度。"
-
-#~ msgid "PolicyKit grants us acquire-high-priority privilege."
-#~ msgstr "PolicyKit授予我们“获取高优先级”权限。"
-
-#~ msgid "PolicyKit refuses acquire-high-priority privilege."
-#~ msgstr "PolicyKit拒绝“获取高优先级”权限。"
-
-#~ msgid "PolicyKit grants us acquire-real-time privilege."
-#~ msgstr "PolicyKit授予我们“获取实时”权限。"
-
-#~ msgid "PolicyKit refuses acquire-real-time privilege."
-#~ msgstr "PolicyKit拒绝我们“获取实时”权限。"
-
-#~ 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 '%s', 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 '%s', or increase "
-#~ "the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user."
-#~ msgstr ""
-#~ "配置中需要调用 SUID root、实时和/或者高优先调度。但是我们缺少必要的特"
-#~ "权:\n"
-#~ "我们不属于组群 '%s',PolicyKit 拒绝赋予我们要求的特权,而我们无法增加 "
-#~ "RLIMIT_NICE/RLIMIT_RTPRIO 资源限制。\n"
-#~ "要启用实时/高优先调度,请获得适当的 PolicyKit 特权,或者成为 '%s' 成员,也"
-#~ "可以为这个用户增加 RLIMIT_NICE/RLIMIT_RTPRIO 资源限制。"
-
-#~ msgid ""
-#~ "High-priority scheduling enabled in configuration but not allowed by "
-#~ "policy."
-#~ msgstr "配置中已启用高优先级调度,但策略未允许。"
-
-#~ msgid "Successfully increased RLIMIT_RTPRIO"
-#~ msgstr "提高RLIMIT_RTPRIO成功。"
-
-#~ msgid "RLIMIT_RTPRIO failed: %s"
-#~ msgstr "RLIMIT_RTPRIO失败:%s"
-
-#~ msgid "Giving up CAP_NICE"
-#~ msgstr "正在放弃CAP_NICE"
-
-#~ msgid ""
-#~ "Real-time scheduling enabled in configuration but not allowed by policy."
-#~ msgstr "配置中已启用实时调度,但策略未允许。"
-
-#~ msgid "Limited capabilities successfully to CAP_SYS_NICE."
-#~ msgstr "性能成功限制到CAP_SYS_NICE。"
-
-#~ msgid "time_new() failed.\n"
-#~ msgstr "time_new()失败。\n"
-
-#~ msgid "Output %s + Input %s"
-#~ msgstr "输出 %s + 输入 %s"
-
-#~ msgid "Stream successfully created\n"
-#~ msgstr "成功创建流\n"
-
-#~ msgid "Stream errror: %s\n"
-#~ msgstr "流错误:%s\n"
-
-#~ msgid "Connection established.\n"
-#~ msgstr "连接已建立。\n"
-
-#~ msgid ""
-#~ "%s [options] [FILE]\n"
-#~ "\n"
-#~ "  -h, --help                            Show this help\n"
-#~ "      --version                         Show version\n"
-#~ "\n"
-#~ "  -v, --verbose                         Enable verbose operation\n"
-#~ "\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"
-#~ "      --channel-map=CHANNELMAP          Set the channel map to the use\n"
-#~ msgstr ""
-#~ "%s [options] [FILE]\n"
-#~ "\n"
-#~ "  -h, --help                            显示此帮助\n"
-#~ "      --version                         显示版本\n"
-#~ "\n"
-#~ "  -v, --verbose                         启用详述操作\n"
-#~ "\n"
-#~ "  -s, --server=SERVER                   要连接的服务器名\n"
-#~ "  -d, --device=DEVICE                   要连接的音频出口名\n"
-#~ "  -n, --client-name=NAME                此客户端在服务器上的名称\n"
-#~ "      --stream-name=NAME                此流在服务器上的名称\n"
-#~ "      --volume=VOLUME                   指定初始(线性)音量,取值在"
-#~ "0...65536之间\n"
-#~ "      --channel-map=CHANNELMAP          设定使用的通道映射表\n"
-
-#~ msgid ""
-#~ "paplay %s\n"
-#~ "Compiled with libpulse %s\n"
-#~ "Linked with libpulse %s\n"
-#~ msgstr ""
-#~ "paplay %s\n"
-#~ "Compiled with libpulse %s\n"
-#~ "Linked with libpulse %s\n"
-
-#~ msgid "Invalid channel map\n"
-#~ msgstr "无效的通道映射表\n"
-
-#~ msgid "Failed to open file '%s'\n"
-#~ msgstr "打开文件'%s'失败\n"
-
-#~ msgid "Channel map doesn't match file.\n"
-#~ msgstr "通道映射表与文件不匹配。\n"
-
-#~ msgid "Using sample spec '%s'\n"
-#~ msgstr "正在使用采样规格'%s'\n"

commit da2da7a982079771451fcf34500e9979e3e4f5a2
Author: anipeter <anipeter at fedoraproject.org>
Date:   Wed Dec 9 07:17:01 2009 +0000

    Sending translation for Malayalam

diff --git a/po/ml.po b/po/ml.po
index 4a5cbf9..c8c557d 100644
--- a/po/ml.po
+++ b/po/ml.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.ml\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-21 20:54+0530\n"
+"POT-Creation-Date: 2009-12-08 08:37+0000\n"
+"PO-Revision-Date: 2009-12-09 12:18+0530\n"
 "Last-Translator: \n"
 "Language-Team:  <en at li.org>\n"
 "MIME-Version: 1.0\n"
@@ -216,8 +216,7 @@ msgstr "സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത
 
 #: ../src/daemon/main.c:586
 msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr ""
-"സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത്തിക്കുന്നു, പക്ഷേ --disallow-module-loading സജ്ജമാക്കിയിട്ടില്ല!"
+msgstr "സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത്തിക്കുന്നു, പക്ഷേ --disallow-module-loading സജ്ജമാക്കിയിട്ടില്ല!"
 
 #: ../src/daemon/main.c:589
 msgid "Running in system mode, forcibly disabling SHM mode!"
@@ -225,8 +224,7 @@ msgstr "സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത
 
 #: ../src/daemon/main.c:594
 msgid "Running in system mode, forcibly disabling exit idle time!"
-msgstr ""
-"സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത്തിക്കുന്നു, നിര്‍ബന്ധമായും എക്സിറ്റ് ഐഡില്‍ സമയം പ്രവര്‍ത്ത രഹിതമാക്കുന്നു!"
+msgstr "സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത്തിക്കുന്നു, നിര്‍ബന്ധമായും എക്സിറ്റ് ഐഡില്‍ സമയം പ്രവര്‍ത്ത രഹിതമാക്കുന്നു!"
 
 #: ../src/daemon/main.c:621
 msgid "Failed to acquire stdio."
@@ -1498,8 +1496,7 @@ msgstr "ഓ‍ഡിയോ ഫയല്‍ തുറക്കുന്നതി
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
-msgstr ""
-"മുന്നറിയിപ്പു്: ഫയലില്‍ നിന്നുള്ള വിവരണം വ്യക്തമാക്കിയിരിക്കുന്ന സാംപിള്‍ വിവരണം മാറ്റിയെഴുതുന്നു."
+msgstr "മുന്നറിയിപ്പു്: ഫയലില്‍ നിന്നുള്ള വിവരണം വ്യക്തമാക്കിയിരിക്കുന്ന സാംപിള്‍ വിവരണം മാറ്റിയെഴുതുന്നു."
 
 #: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
 msgid "Failed to determine sample specification from file."
@@ -1519,8 +1516,7 @@ msgstr "മുന്നറിയിപ്പു്: ഫയലിലേക്ക
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "%s സ്ട്രീം തുറക്കുന്നു. ഇതിന്റെ സാംപിള്‍ വിവരണം '%s'-ഉം ചാനല്‍ മാപ്പ് '%s'-ഉം ആണു്."
 
 #: ../src/utils/pacat.c:1009
@@ -2110,17 +2106,14 @@ msgid "You have to specify a module index"
 msgstr "ഒരു മൌഡ്യൂള്‍ ഇന്‍ഡക്സ് നല്‍കേണ്ടതുണ്ടു്"
 
 #: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
-msgstr ""
-"ഒരു സിങ്കില്‍ കൂടുതല്‍ നിങ്ങള്‍ നല്‍കേണ്ടതില്ല. കൂടാതെ, ഒരു ബൂളിയന്‍ മൂല്ല്യവും നിങ്ങള്‍ നല്‍കേണ്ടതാണു്."
+msgid "You may not specify more than one sink. You have to specify a boolean value."
+msgstr "ഒരു സിങ്കില്‍ കൂടുതല്‍ നിങ്ങള്‍ നല്‍കേണ്ടതില്ല. കൂടാതെ, ഒരു ബൂളിയന്‍ മൂല്ല്യവും നിങ്ങള്‍ നല്‍കേണ്ടതാണു്."
 
 #: ../src/utils/pactl.c:1103
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr ""
-"ഒരു സോഴ്സില്‍ കൂടുതല്‍ നിങ്ങള്‍ നല്‍കേണ്ടതില്ല. കൂടാതെ, ഒരു ബൂളിയന്‍ മൂല്ല്യവും നിങ്ങള്‍ നല്‍കേണ്ടതാണു്."
+msgstr "ഒരു സോഴ്സില്‍ കൂടുതല്‍ നിങ്ങള്‍ നല്‍കേണ്ടതില്ല. കൂടാതെ, ഒരു ബൂളിയന്‍ മൂല്ല്യവും നിങ്ങള്‍ നല്‍കേണ്ടതാണു്."
 
 #: ../src/utils/pactl.c:1115
 msgid "You have to specify a card name/index and a profile name"
@@ -2353,217 +2346,204 @@ msgstr "പള്‍സ്ഓഡിയോ സൌണ്ട് സര്‍വര
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "ഔട്ട്പുട്ട് ഡിവൈസുകള്‍"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "ഇന്‍പുട്ട് ഡിവൈസുകള്‍"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "@HOSTNAME at -ലുള്ള ഓഡിയോ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "ഇന്‍പുട്ട്"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "ഡോക്കിങ് സ്റ്റേഷന്‍ ഇന്‍പുട്ട്"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "ഡോക്കിങ് സ്റ്റേഷന്‍ മൈക്രോഫോണ്‍"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "ലൈന്‍-ഇന്‍"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "മൈക്രോഫോണ്‍"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "എക്സ്റ്റേണല്‍ മൈക്രോഫോണ്‍"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "ഇന്റേര്‍ണല്‍ ഓഡിയോ"
+msgstr "ഇന്റേണല്‍ മൈക്രോഫോണ്‍"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "റേഡിയോ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "വീഡിയോ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "ഓട്ടോമാറ്റിക് ഗെയിന്‍ കണ്ട്രോള്‍"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "ഓട്ടോമാറ്റിക് ഗെയിന്‍ കണ്ട്രോള്‍ ലഭ്യമല്ല"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "ബൂസ്റ്റ്"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "ബൂസ്റ്റ് ലഭ്യമല്ല"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "ആംപ്ലിഫയര്‍"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "ആംപ്ലിഫയര്‍ ലഭ്യമല്ല"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "അനലോഗ് ഇന്‍പുട്ട്"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "അനലോഗ് മൈക്രോഫോണ്‍"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "അനലോഗ് ലൈന്‍-ഇന്‍"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "അനലോഗ് റേഡിയോ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "അനലോഗ് വീഡിയോ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "നള്‍ ഔട്ട്പുട്ട്"
+msgstr "അനലോഗ് ഔട്ട്പുട്ട്"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "അനലോഗ് ഹെഡ്ഫോണുകള്‍"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "അനലോഗ് ഔട്ട്പുട്ട് (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "അനലോഗ് മോണോ ഔട്ട്പുട്ട്"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "അനലോഗ് മോണോ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
-#, fuzzy
 msgid "Analog Stereo"
-msgstr "സ്റ്റീരിയോ"
+msgstr "അനലോഗ് സ്റ്റീരിയോ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "സറൌണ്ട് 4.1"
+msgstr "അനലോഗ് സറൌണ്ട് 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "സറൌണ്ട് 4.0"
+msgstr "അനലോഗ് സറൌണ്ട് 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "സറൌണ്ട് 4.1"
+msgstr "അനലോഗ് സറൌണ്ട് 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
-#, fuzzy
 msgid "Analog Surround 4.0"
-msgstr "സറൌണ്ട് 4.0"
+msgstr "അനലോഗ് സറൌണ്ട് 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
-#, fuzzy
 msgid "Analog Surround 4.1"
-msgstr "സറൌണ്ട് 4.1"
+msgstr "അനലോഗ് സറൌണ്ട് 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
-#, fuzzy
 msgid "Analog Surround 5.0"
-msgstr "സറൌണ്ട് 5.0"
+msgstr "അനലോഗ് സറൌണ്ട് 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
-#, fuzzy
 msgid "Analog Surround 5.1"
-msgstr "സറൌണ്ട് 5.1"
+msgstr "അനലോഗ് സറൌണ്ട് 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "സറൌണ്ട് 4.0"
+msgstr "അനലോഗ് സറൌണ്ട് 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "സറൌണ്ട് 4.1"
+msgstr "അനലോഗ് സറൌണ്ട് 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "സറൌണ്ട് 4.0"
+msgstr "അനലോഗ് സറൌണ്ട് 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
-#, fuzzy
 msgid "Analog Surround 7.1"
-msgstr "സറൌണ്ട് 7.1"
+msgstr "അനലോഗ് സറൌണ്ട് 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "ഡിജിറ്റല്‍ സ്റ്റീരിയോ (IEC958) "
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "ഡിജിറ്റല്‍ സറൌണ്ട് 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "ഡിജിറ്റല്‍ സറൌണ്ട് 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "ഡിജിറ്റല്‍ സറൌണ്ട് 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "ഡിജിറ്റല്‍ സ്റ്റീരിയോ (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "അനലോഗ് മോണോ ഡ്യൂപ്ലെക്സ്"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "അനലോഗ് സ്റ്റീരിയോ ഡ്യൂപ്ലെക്സ്"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "ഡിജിറ്റല്‍ സ്റ്റീരിയോ ഡ്യൂപ്ലെക്സ് (IEC958)"
+

commit ef05cf75d1ce12d10390c14497dc3d048e9a92c4
Author: khasida <khasida at fedoraproject.org>
Date:   Wed Dec 9 09:23:46 2009 +0000

    Sending translation for Japanese

diff --git a/po/ja.po b/po/ja.po
index bd6f8c2..179aeac 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: ja\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2009-12-08 02:51+0000\n"
-"PO-Revision-Date: 2009-12-08 17:48+0900\n"
+"PO-Revision-Date: 2009-12-09 18:20+0900\n"
 "Last-Translator: Kiyoto Hashida <khashida at redhat.com>\n"
 "Language-Team: Japanese <jp at li.org>\n"
 "MIME-Version: 1.0\n"
@@ -241,122 +241,122 @@ msgstr "stdio の取得に失敗しました。"
 #: ../src/daemon/main.c:627
 #, c-format
 msgid "pipe failed: %s"
-msgstr ""
+msgstr "パイプは失敗: %s"
 
 #: ../src/daemon/main.c:632
 #, c-format
 msgid "fork() failed: %s"
-msgstr ""
+msgstr "fork() は失敗: %s"
 
 #: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
 #, c-format
 msgid "read() failed: %s"
-msgstr ""
+msgstr "read() は失敗: %s"
 
 #: ../src/daemon/main.c:652
 msgid "Daemon startup failed."
-msgstr ""
+msgstr "デーモン開始に失敗しました。"
 
 #: ../src/daemon/main.c:654
 msgid "Daemon startup successful."
-msgstr ""
+msgstr "デーモンが正常に開始しました。"
 
 #: ../src/daemon/main.c:731
 #, c-format
 msgid "This is PulseAudio %s"
-msgstr ""
+msgstr "これは PulseAudio %s です。"
 
 #: ../src/daemon/main.c:732
 #, c-format
 msgid "Compilation host: %s"
-msgstr ""
+msgstr "コンパイルホスト: %s"
 
 #: ../src/daemon/main.c:733
 #, c-format
 msgid "Compilation CFLAGS: %s"
-msgstr ""
+msgstr "コンパイル CFLAGS: %s"
 
 #: ../src/daemon/main.c:736
 #, c-format
 msgid "Running on host: %s"
-msgstr ""
+msgstr "ホスト上で実行中: %s"
 
 #: ../src/daemon/main.c:739
 #, c-format
 msgid "Found %u CPUs."
-msgstr ""
+msgstr "%u CPU を見つけました。"
 
 #: ../src/daemon/main.c:741
 #, c-format
 msgid "Page size is %lu bytes"
-msgstr ""
+msgstr "ページサイズは %lu バイトです"
 
 #: ../src/daemon/main.c:744
 msgid "Compiled with Valgrind support: yes"
-msgstr ""
+msgstr "Valgrind サポートでのコンパイル: はい"
 
 #: ../src/daemon/main.c:746
 msgid "Compiled with Valgrind support: no"
-msgstr ""
+msgstr "Valgrind サポートでのコンパイル: いいえ"
 
 #: ../src/daemon/main.c:749
 #, c-format
 msgid "Running in valgrind mode: %s"
-msgstr ""
+msgstr "valgrind モードで実行中: %s"
 
 #: ../src/daemon/main.c:752
 msgid "Optimized build: yes"
-msgstr ""
+msgstr "最適化したビルド: はい"
 
 #: ../src/daemon/main.c:754
 msgid "Optimized build: no"
-msgstr ""
+msgstr "最適化したビルド: いいえ"
 
 #: ../src/daemon/main.c:758
 msgid "NDEBUG defined, all asserts disabled."
-msgstr ""
+msgstr "NDEBUG は定義済みです。アサーションは全て無効です。"
 
 #: ../src/daemon/main.c:760
 msgid "FASTPATH defined, only fast path asserts disabled."
-msgstr ""
+msgstr "FASTPATH は定義済みです。ファーストパスアサーションのみが無効です。"
 
 #: ../src/daemon/main.c:762
 msgid "All asserts enabled."
-msgstr ""
+msgstr "アサーションは全て有効です。"
 
 #: ../src/daemon/main.c:766
 msgid "Failed to get machine ID"
-msgstr ""
+msgstr "マシン ID の取得に失敗"
 
 #: ../src/daemon/main.c:769
 #, c-format
 msgid "Machine ID is %s."
-msgstr ""
+msgstr "マシン ID は %s"
 
 #: ../src/daemon/main.c:773
 #, c-format
 msgid "Session ID is %s."
-msgstr ""
+msgstr "セッション ID は %s"
 
 #: ../src/daemon/main.c:779
 #, c-format
 msgid "Using runtime directory %s."
-msgstr ""
+msgstr "ランタイムディレクトリ %s を使用 "
 
 #: ../src/daemon/main.c:784
 #, c-format
 msgid "Using state directory %s."
-msgstr ""
+msgstr "状態ディレクトリ %s を使用"
 
 #: ../src/daemon/main.c:787
 #, c-format
 msgid "Using modules directory %s."
-msgstr ""
+msgstr "モジュールディレクトリ %s を使用"
 
 #: ../src/daemon/main.c:789
 #, c-format
 msgid "Running in system mode: %s"
-msgstr ""
+msgstr "システムモードで実行中: %s"
 
 #: ../src/daemon/main.c:792
 msgid ""
@@ -367,44 +367,52 @@ msgid ""
 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
 "explanation why system mode is usually a bad idea."
 msgstr ""
+"そうすると、ユーザーはシステムモードで PA を実行している訳です。その場合、 "
+"実際にはそうすべきでないことに注意して下さい。\n"
+"それでも実行するのでしたら、期待どおりに機能しなくても責任はユーザー自身に "
+"あります。\n"
+"システムモードの使用が通常は良くない方針であることの説明については、 "
+"http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode をお読み下さい。"
 
 #: ../src/daemon/main.c:809
 msgid "pa_pid_file_create() failed."
-msgstr ""
+msgstr "pa_pid_file_create() は失敗"
 
 #: ../src/daemon/main.c:819
 msgid "Fresh high-resolution timers available! Bon appetit!"
-msgstr ""
+msgstr "最新の高解像度タイマーが使用できます! 楽しんで下さい!"
 
 #: ../src/daemon/main.c:821
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
 msgstr ""
+"あらあら、ユーザーのカーネルはダメですよ! 今日のシェフのお薦めは高解像度タイマーが "
+"有効になっている Linux です!"
 
 #: ../src/daemon/main.c:844
 msgid "pa_core_new() failed."
-msgstr ""
+msgstr "pa_core_new() は失敗"
 
 #: ../src/daemon/main.c:904
 msgid "Failed to initialize daemon."
-msgstr ""
+msgstr "デーモンの初期化に失敗しました。"
 
 #: ../src/daemon/main.c:909
 msgid "Daemon startup without any loaded modules, refusing to work."
-msgstr ""
+msgstr "デーモンはモジュールの読み込みなしで開始しており、動作を拒否しています。"
 
 #: ../src/daemon/main.c:926
 msgid "Daemon startup complete."
-msgstr ""
+msgstr "デーモンの開始が完了です。"
 
 #: ../src/daemon/main.c:932
 msgid "Daemon shutdown initiated."
-msgstr ""
+msgstr "デーモンのシャットダウンが始まりました。"
 
 #: ../src/daemon/main.c:954
 msgid "Daemon terminated."
-msgstr ""
+msgstr "デーモンは取り消されました。"
 
 #: ../src/daemon/cmdline.c:115
 #, c-format
@@ -479,760 +487,825 @@ msgid ""
 "\n"
 "  -n                                    Don't load default script file\n"
 msgstr ""
+"%s [オプション]\n"
+"\n"
+"コマンド:\n"
+"  -h, --help                            このヘルプを表示\n"
+"      --version                         バージョンを表示\n"
+"      --dump-conf                       デフォルト設定をダンプ\n"
+"      --dump-modules                    使用可能なモジュール一覧をダンプ\n"
+"      --dump-resample-methods           使用可能な再サンプル方法をダンプ\n"
+"      --cleanup-shm                     古い共有メモリーセグメントをクリーンアップ \n"
+"      --start                           実行していない場合、デーモンを開始 \n"
+"  -k  --kill                            実行中のデーモンをキル\n"
+"      --check                           実行中のデーモンをチェック (退出コードを返すのみ)\n"
+"\n"
+"オプション:\n"
+"      --system[=BOOL]                   システム全域インスタンスとして実行\n"
+"  -D, --daemonize[=BOOL]                開始後デーモン化\n"
+"      --fail[=BOOL]                     開始失敗なら終了\n"
+"      --high-priority[=BOOL]            高度なナイスレベルの設定を試行\n"
+"                                        (root としてのみ可能, SUID の時、"
+"又は\n"
+"                                        昇格した RLIMIT_NICE で)\n"
+"      --realtime[=BOOL]                 リアルタイムスケジュールを有効にする試行\n"
+"                                        (root としてのみ可能, SUID の時、"
+"又は\n"
+"                                        昇格した RLIMIT_RTPRIO で)\n"
+"      --disallow-module-loading[=BOOL]  起動後のユーザー要求のモジュールの "
+"ロード/アンロードを 許可しない\n"
+"\n"
+"      --disallow-exit[=BOOL]            ユーザー要求の退出を許可しない\n"
+"      --exit-idle-time=SECS             遊休時と指定時間後にデーモンを終了 \n"
+"\n"
+"      --module-idle-time=SECS           遊休時と指定時間後に自動ロードモジュールをアンロード \n"
+"\n"
+"      --scache-idle-time=SECS           遊休時と指定時間後に自動ロードサンプルをアンロード \n"
+"\n"
+"      --log-level[=LEVEL]               詳細レベルを上げるか、又はセット\n"
+"  -v                                    詳細レベルを上げる \n"
+"--log-target={auto,syslog,stderr} ログターゲットを指定 \n"
+"--log-meta[=BOOL]                 ログメッセージ内にコードの場所を含む "
+"\n"
+"      --log-time[=BOOL]                 ログメッセージ内にタイムスタンプを含む\n "
+"     --log-backtrace=FRAMES            ログメッセージ内にバックトレースを含む\n"
+"  -p, --dl-search-path=PATH             動的共有オブジェクト(plugins)用に検索パスをセット\n"
+"\n"
+"      --resample-method=METHOD          指定した再サンプリング方法を使用\n"
+"                                        (使用可能な値は --dump-resample-methods で\n"
+"                                        参照)\n"
+"      --use-pid-file[=BOOL]             PID ファイルを作成\n"
+"      --no-cpu-limit[=BOOL]             サポート元のプラットフォームに CPU\n"
+"                                         ロードリミッターをインストールしない\n"
+"      --disable-shm[=BOOL]              共有メモリーサポートを無効にする\n"
+"\n"
+"スタートアップスクリプト:\n"
+"  -L, --load=\"MODULE ARGUMENTS\"         指定した引数で指定したプラグインモジュールを "
+"ロード\n"
+"\n"
+"  -F, --file=FILENAME                   指定したスクリプトを実行\n"
+"  -C                                    スタートアップ後に実行中の TTY 上でコマンドラインを "
+"開く\n"
+"\n"
+"  -n                                    デフォルトのスクリプトファイルをロードしない\n"
 
 #: ../src/daemon/cmdline.c:247
 msgid "--daemonize expects boolean argument"
-msgstr ""
+msgstr "--daemonize はブーリアン引数を予期します"
 
 #: ../src/daemon/cmdline.c:254
 msgid "--fail expects boolean argument"
-msgstr ""
+msgstr "--fail はブーリアン引数を予期します。"
 
 #: ../src/daemon/cmdline.c:264
 msgid ""
 "--log-level expects log level argument (either numeric in range 0..4 or one "
 "of debug, info, notice, warn, error)."
 msgstr ""
+"--log-level はログレベル引数を予期します(数値幅0〜4、又はデバグ、情報、注記、警告、エラーの "
+"中の1つ)"
 
 #: ../src/daemon/cmdline.c:276
 msgid "--high-priority expects boolean argument"
-msgstr ""
+msgstr "--high-priority は ブーリアン引数を予期します"
 
 #: ../src/daemon/cmdline.c:283
 msgid "--realtime expects boolean argument"
-msgstr ""
+msgstr "--realtime はブーリアン引数を予期します "
 
 #: ../src/daemon/cmdline.c:290
 msgid "--disallow-module-loading expects boolean argument"
-msgstr ""
+msgstr "--disallow-module-loading はブーリアン引数を予期します "
 
 #: ../src/daemon/cmdline.c:297
 msgid "--disallow-exit expects boolean argument"
-msgstr ""
+msgstr "--disallow-exit はブーリアン引数を予期します "
 
 #: ../src/daemon/cmdline.c:304
 msgid "--use-pid-file expects boolean argument"
-msgstr ""
+msgstr "--use-pid-file はブーリアン引数を予期します "
 
 #: ../src/daemon/cmdline.c:321
 msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
-msgstr ""
+msgstr "無効なログターゲット: 'syslog' か、 'stderr' か、'auto' を使用して下さい。"
 
 #: ../src/daemon/cmdline.c:328
 msgid "--log-time expects boolean argument"
-msgstr ""
+msgstr "--log-time ブーリアン引数を予期します "
 
 #: ../src/daemon/cmdline.c:335
 msgid "--log-meta expects boolean argument"
-msgstr ""
+msgstr "--log-meta ブーリアン引数を予期します "
 
 #: ../src/daemon/cmdline.c:354
 #, c-format
 msgid "Invalid resample method '%s'."
-msgstr ""
+msgstr "無効な再サンプル方法 '%s'"
 
 #: ../src/daemon/cmdline.c:361
 msgid "--system expects boolean argument"
-msgstr ""
+msgstr "--system はブーリアン引数を予期します"
 
 #: ../src/daemon/cmdline.c:368
 msgid "--no-cpu-limit expects boolean argument"
-msgstr ""
+msgstr "--no-cpu-limit はブーリアン引数を予期します"
 
 #: ../src/daemon/cmdline.c:375
 msgid "--disable-shm expects boolean argument"
-msgstr ""
+msgstr "--disable-shm はブーリアン引数を予期します"
 
 #: ../src/daemon/dumpmodules.c:60
 #, c-format
 msgid "Name: %s\n"
-msgstr ""
+msgstr "名前: %s\n"
 
 #: ../src/daemon/dumpmodules.c:63
 #, c-format
 msgid "No module information available\n"
-msgstr ""
+msgstr "モジュール情報が使用できません\n"
 
 #: ../src/daemon/dumpmodules.c:66
 #, c-format
 msgid "Version: %s\n"
-msgstr ""
+msgstr "バージョン: %s\n"
 
 #: ../src/daemon/dumpmodules.c:68
 #, c-format
 msgid "Description: %s\n"
-msgstr ""
+msgstr "説明: %s\n"
 
 #: ../src/daemon/dumpmodules.c:70
 #, c-format
 msgid "Author: %s\n"
-msgstr ""
+msgstr "著者: %s\n"
 
 #: ../src/daemon/dumpmodules.c:72
 #, c-format
 msgid "Usage: %s\n"
-msgstr ""
+msgstr "使用法: %s\n"
 
 #: ../src/daemon/dumpmodules.c:73
 #, c-format
 msgid "Load Once: %s\n"
-msgstr ""
+msgstr "1度だけロード: %s\n"
 
 #: ../src/daemon/dumpmodules.c:75
 #, c-format
 msgid "DEPRECATION WARNING: %s\n"
-msgstr ""
+msgstr "破棄の警告: %s\n"
 
 #: ../src/daemon/dumpmodules.c:79
 #, c-format
 msgid "Path: %s\n"
-msgstr ""
+msgstr "パス: %s\n"
 
 #: ../src/daemon/daemon-conf.c:232
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
-msgstr ""
+msgstr "[%s:%u] 無効なログターゲット '%s'"
 
 #: ../src/daemon/daemon-conf.c:248
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
-msgstr ""
+msgstr "[%s:%u] 無効なログレベル '%s'"
 
 #: ../src/daemon/daemon-conf.c:264
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
-msgstr ""
+msgstr "[%s:%u] 無効な再サンプル方法 '%s'"
 
 #: ../src/daemon/daemon-conf.c:287
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
-msgstr ""
+msgstr "[%s:%u] 無効な rlimit '%s'"
 
 #: ../src/daemon/daemon-conf.c:294
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
-msgstr ""
+msgstr "[%s:%u] rlimit はこのプラットフォームではサポートがありません。"
 
 #: ../src/daemon/daemon-conf.c:310
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
-msgstr ""
+msgstr "[%s:%u] 無効なサンプル形式 '%s'"
 
 #: ../src/daemon/daemon-conf.c:328
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
-msgstr ""
+msgstr "[%s:%u] 無効なサンプルレート '%s'"
 
 #: ../src/daemon/daemon-conf.c:352
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
-msgstr ""
+msgstr "[%s:%u] 無効なサンプルチャンネル '%s'"
 
 #: ../src/daemon/daemon-conf.c:370
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
-msgstr ""
+msgstr "[%s:%u] 無効なチャンネルマップ '%s'"
 
 #: ../src/daemon/daemon-conf.c:388
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
-msgstr ""
+msgstr "[%s:%u] 無効なフラグメントの数 '%s'"
 
 #: ../src/daemon/daemon-conf.c:406
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
-msgstr ""
+msgstr "[%s:%u] 無効なフラグメントサイズ '%s'"
 
 #: ../src/daemon/daemon-conf.c:424
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
-msgstr ""
+msgstr "[%s:%u] 無効なナイスレベル '%s'"
 
 #: ../src/daemon/daemon-conf.c:546
 #, c-format
 msgid "Failed to open configuration file: %s"
-msgstr ""
+msgstr "設定ファイルを開くのに失敗: %s"
 
 #: ../src/daemon/daemon-conf.c:562
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
 msgstr ""
+"指定されたデフォルトのチャンネルマップは、指定されたデフォルトの "
+"チャンネル数とは異なる チャンネル数を持っています。"
 
 #: ../src/daemon/daemon-conf.c:638
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
-msgstr ""
+msgstr "### 設定ファイルから読み込み: %s ###\n"
 
 #: ../src/daemon/caps.c:62
 msgid "Cleaning up privileges."
-msgstr ""
+msgstr "権限をクリーンアップ"
 
 #: ../src/daemon/pulseaudio.desktop.in.h:1
 msgid "PulseAudio Sound System"
-msgstr ""
+msgstr "PulseAudio サウンドシステム"
 
 #: ../src/daemon/pulseaudio.desktop.in.h:2
 msgid "Start the PulseAudio Sound System"
-msgstr ""
+msgstr "PulseAudio サウンドシステムを開始"
 
 #: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757
 msgid "Mono"
-msgstr ""
+msgstr "モノ"
 
 #: ../src/pulse/channelmap.c:107
 msgid "Front Center"
-msgstr ""
+msgstr "中央前"
 
 #: ../src/pulse/channelmap.c:108
 msgid "Front Left"
-msgstr ""
+msgstr "左前"
 
 #: ../src/pulse/channelmap.c:109
 msgid "Front Right"
-msgstr ""
+msgstr "右前"
 
 #: ../src/pulse/channelmap.c:111
 msgid "Rear Center"
-msgstr ""
+msgstr "中央後ろ"
 
 #: ../src/pulse/channelmap.c:112
 msgid "Rear Left"
-msgstr ""
+msgstr "左後ろ"
 
 #: ../src/pulse/channelmap.c:113
 msgid "Rear Right"
-msgstr ""
+msgstr "右後ろ"
 
 #: ../src/pulse/channelmap.c:115
 msgid "Low Frequency Emmiter"
-msgstr ""
+msgstr "低周波エミッタ"
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
-msgstr ""
+msgstr "中央の左前"
 
 #: ../src/pulse/channelmap.c:118
 msgid "Front Right-of-center"
-msgstr ""
+msgstr "中央の右前"
 
 #: ../src/pulse/channelmap.c:120
 msgid "Side Left"
-msgstr ""
+msgstr "左側"
 
 #: ../src/pulse/channelmap.c:121
 msgid "Side Right"
-msgstr ""
+msgstr "右側"
 
 #: ../src/pulse/channelmap.c:123
 msgid "Auxiliary 0"
-msgstr ""
+msgstr "補助 0"
 
 #: ../src/pulse/channelmap.c:124
 msgid "Auxiliary 1"
-msgstr ""
+msgstr "補助 1"
 
 #: ../src/pulse/channelmap.c:125
 msgid "Auxiliary 2"
-msgstr ""
+msgstr "補助 2"
 
 #: ../src/pulse/channelmap.c:126
 msgid "Auxiliary 3"
-msgstr ""
+msgstr "補助 3"
 
 #: ../src/pulse/channelmap.c:127
 msgid "Auxiliary 4"
-msgstr ""
+msgstr "補助 4"
 
 #: ../src/pulse/channelmap.c:128
 msgid "Auxiliary 5"
-msgstr ""
+msgstr "補助 5"
 
 #: ../src/pulse/channelmap.c:129
 msgid "Auxiliary 6"
-msgstr ""
+msgstr "補助 6"
 
 #: ../src/pulse/channelmap.c:130
 msgid "Auxiliary 7"
-msgstr ""
+msgstr "補助 7"
 
 #: ../src/pulse/channelmap.c:131
 msgid "Auxiliary 8"
-msgstr ""
+msgstr "補助 8"
 
 #: ../src/pulse/channelmap.c:132
 msgid "Auxiliary 9"
-msgstr ""
+msgstr "補助 9"
 
 #: ../src/pulse/channelmap.c:133
 msgid "Auxiliary 10"
-msgstr ""
+msgstr "補助 10"
 
 #: ../src/pulse/channelmap.c:134
 msgid "Auxiliary 11"
-msgstr ""
+msgstr "補助 11"
 
 #: ../src/pulse/channelmap.c:135
 msgid "Auxiliary 12"
-msgstr ""
+msgstr "補助 12"
 
 #: ../src/pulse/channelmap.c:136
 msgid "Auxiliary 13"
-msgstr ""
+msgstr "補助 13"
 
 #: ../src/pulse/channelmap.c:137
 msgid "Auxiliary 14"
-msgstr ""
+msgstr "補助 14"
 
 #: ../src/pulse/channelmap.c:138
 msgid "Auxiliary 15"
-msgstr ""
+msgstr "補助 15"
 
 #: ../src/pulse/channelmap.c:139
 msgid "Auxiliary 16"
-msgstr ""
+msgstr "補助 16"
 
 #: ../src/pulse/channelmap.c:140
 msgid "Auxiliary 17"
-msgstr ""
+msgstr "補助 17"
 
 #: ../src/pulse/channelmap.c:141
 msgid "Auxiliary 18"
-msgstr ""
+msgstr "補助 18"
 
 #: ../src/pulse/channelmap.c:142
 msgid "Auxiliary 19"
-msgstr ""
+msgstr "補助 19"
 
 #: ../src/pulse/channelmap.c:143
 msgid "Auxiliary 20"
-msgstr ""
+msgstr "補助 20"
 
 #: ../src/pulse/channelmap.c:144
 msgid "Auxiliary 21"
-msgstr ""
+msgstr "補助 21"
 
 #: ../src/pulse/channelmap.c:145
 msgid "Auxiliary 22"
-msgstr ""
+msgstr "補助 22"
 
 #: ../src/pulse/channelmap.c:146
 msgid "Auxiliary 23"
-msgstr ""
+msgstr "補助 23"
 
 #: ../src/pulse/channelmap.c:147
 msgid "Auxiliary 24"
-msgstr ""
+msgstr "補助 24"
 
 #: ../src/pulse/channelmap.c:148
 msgid "Auxiliary 25"
-msgstr ""
+msgstr "補助 25"
 
 #: ../src/pulse/channelmap.c:149
 msgid "Auxiliary 26"
-msgstr ""
+msgstr "補助 26"
 
 #: ../src/pulse/channelmap.c:150
 msgid "Auxiliary 27"
-msgstr ""
+msgstr "補助 27"
 
 #: ../src/pulse/channelmap.c:151
 msgid "Auxiliary 28"
-msgstr ""
+msgstr "補助 28"
 
 #: ../src/pulse/channelmap.c:152
 msgid "Auxiliary 29"
-msgstr ""
+msgstr "補助 29"
 
 #: ../src/pulse/channelmap.c:153
 msgid "Auxiliary 30"
-msgstr ""
+msgstr "補助 30"
 
 #: ../src/pulse/channelmap.c:154
 msgid "Auxiliary 31"
-msgstr ""
+msgstr "補助 31"
 
 #: ../src/pulse/channelmap.c:156
 msgid "Top Center"
-msgstr ""
+msgstr "上部中央"
 
 #: ../src/pulse/channelmap.c:158
 msgid "Top Front Center"
-msgstr ""
+msgstr "上部中央前"
 
 #: ../src/pulse/channelmap.c:159
 msgid "Top Front Left"
-msgstr ""
+msgstr "上部左前"
 
 #: ../src/pulse/channelmap.c:160
 msgid "Top Front Right"
-msgstr ""
+msgstr "上部右前"
 
 #: ../src/pulse/channelmap.c:162
 msgid "Top Rear Center"
-msgstr ""
+msgstr "上部中央後ろ"
 
 #: ../src/pulse/channelmap.c:163
 msgid "Top Rear Left"
-msgstr ""
+msgstr "上部左後ろ"
 
 #: ../src/pulse/channelmap.c:164
 msgid "Top Rear Right"
-msgstr ""
+msgstr "上部右後ろ"
 
 #: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170
 #: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321
 #: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371
 msgid "(invalid)"
-msgstr ""
+msgstr "無効)"
 
 #: ../src/pulse/channelmap.c:761
 msgid "Stereo"
-msgstr ""
+msgstr "ステレオ"
 
 #: ../src/pulse/channelmap.c:766
 msgid "Surround 4.0"
-msgstr ""
+msgstr "サラウンド 4.0"
 
 #: ../src/pulse/channelmap.c:772
 msgid "Surround 4.1"
-msgstr ""
+msgstr "サラウンド 4.1"
 
 #: ../src/pulse/channelmap.c:778
 msgid "Surround 5.0"
-msgstr ""
+msgstr "サラウンド 5.0"
 
 #: ../src/pulse/channelmap.c:784
 msgid "Surround 5.1"
-msgstr ""
+msgstr "サラウンド 5.1"
 
 #: ../src/pulse/channelmap.c:791
 msgid "Surround 7.1"
-msgstr ""
+msgstr "サラウンド 7.1"
 
 #: ../src/pulse/error.c:43
 msgid "OK"
-msgstr ""
+msgstr "OK"
 
 #: ../src/pulse/error.c:44
 msgid "Access denied"
-msgstr ""
+msgstr "アクセス拒否"
 
 #: ../src/pulse/error.c:45
 msgid "Unknown command"
-msgstr ""
+msgstr "不明なコマンド"
 
 #: ../src/pulse/error.c:46
 msgid "Invalid argument"
-msgstr ""
+msgstr "無効な引数"
 
 #: ../src/pulse/error.c:47
 msgid "Entity exists"
-msgstr ""
+msgstr "エンティティは存在します"
 
 #: ../src/pulse/error.c:48
 msgid "No such entity"
-msgstr ""
+msgstr "そのようなエンティティはありません"
 
 #: ../src/pulse/error.c:49
 msgid "Connection refused"
-msgstr ""
+msgstr "接続拒否"
 
 #: ../src/pulse/error.c:50
 msgid "Protocol error"
-msgstr ""
+msgstr "プロトコルエラー"
 
 #: ../src/pulse/error.c:51
 msgid "Timeout"
-msgstr ""
+msgstr "タイムアウト"
 
 #: ../src/pulse/error.c:52
 msgid "No authorization key"
-msgstr ""
+msgstr "認証キーがありません"
 
 #: ../src/pulse/error.c:53
 msgid "Internal error"
-msgstr ""
+msgstr "内部エラー"
 
 #: ../src/pulse/error.c:54
 msgid "Connection terminated"
-msgstr ""
+msgstr "接続切断"
 
 #: ../src/pulse/error.c:55
 msgid "Entity killed"
-msgstr ""
+msgstr "エンティティはキルされました"
 
 #: ../src/pulse/error.c:56
 msgid "Invalid server"
-msgstr ""
+msgstr "無効なサーバー"
 
 #: ../src/pulse/error.c:57
 msgid "Module initalization failed"
-msgstr ""
+msgstr "モジュール初期化失敗"
 
 #: ../src/pulse/error.c:58
 msgid "Bad state"
-msgstr ""
+msgstr "悪い状態"
 
 #: ../src/pulse/error.c:59
 msgid "No data"
-msgstr ""
+msgstr "データ無し"
 
 #: ../src/pulse/error.c:60
 msgid "Incompatible protocol version"
-msgstr ""
+msgstr "互換性のないプロトコルバージョン"
 
 #: ../src/pulse/error.c:61
 msgid "Too large"
-msgstr ""
+msgstr "大き過ぎます"
 
 #: ../src/pulse/error.c:62
 msgid "Not supported"
-msgstr ""
+msgstr "サポートがありません"
 
 #: ../src/pulse/error.c:63
 msgid "Unknown error code"
-msgstr ""
+msgstr "不明なエラーコード"
 
 #: ../src/pulse/error.c:64
 msgid "No such extension"
-msgstr ""
+msgstr "そのような拡張子はありません"
 
 #: ../src/pulse/error.c:65
 msgid "Obsolete functionality"
-msgstr ""
+msgstr "旧来の機能"
 
 #: ../src/pulse/error.c:66
 msgid "Missing implementation"
-msgstr ""
+msgstr "実装の欠如"
 
 #: ../src/pulse/error.c:67
 msgid "Client forked"
-msgstr ""
+msgstr "クライアントはフォークされています"
 
 #: ../src/pulse/error.c:68
 msgid "Input/Output error"
-msgstr ""
+msgstr "入力/出力 エラー"
 
 #: ../src/pulse/error.c:69
 msgid "Device or resource busy"
-msgstr ""
+msgstr "デバイスか、リソースがビジー"
 
 #: ../src/pulse/sample.c:172
 #, c-format
 msgid "%s %uch %uHz"
-msgstr ""
+msgstr "%s %uch %uHz"
 
 #: ../src/pulse/sample.c:184
 #, c-format
 msgid "%0.1f GiB"
-msgstr ""
+msgstr "%0.1f GiB"
 
 #: ../src/pulse/sample.c:186
 #, c-format
 msgid "%0.1f MiB"
-msgstr ""
+msgstr "%0.1f MiB"
 
 #: ../src/pulse/sample.c:188
 #, c-format
 msgid "%0.1f KiB"
-msgstr ""
+msgstr "%0.1f KiB"
 
 #: ../src/pulse/sample.c:190
 #, c-format
 msgid "%u B"
-msgstr ""
+msgstr "%u B"
 
 #: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100
 msgid "XOpenDisplay() failed"
-msgstr ""
+msgstr "XOpenDisplay() は失敗"
 
 #: ../src/pulse/client-conf-x11.c:93
 msgid "Failed to parse cookie data"
-msgstr ""
+msgstr "クッキーデータの構文解析に失敗"
 
 #: ../src/pulse/client-conf.c:111
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
-msgstr ""
+msgstr "設定ファイル'%s' を開くのに失敗: %s"
 
 #: ../src/pulse/context.c:550
 msgid "No cookie loaded. Attempting to connect without."
-msgstr ""
+msgstr "クッキーがロードされていません。無い状態で接続を試行"
 
 #: ../src/pulse/context.c:693
 #, c-format
 msgid "fork(): %s"
-msgstr ""
+msgstr "fork(): %s"
 
 #: ../src/pulse/context.c:748
 #, c-format
 msgid "waitpid(): %s"
-msgstr ""
+msgstr "waitpid(): %s"
 
 #: ../src/pulse/context.c:1438
 #, c-format
 msgid "Received message for unknown extension '%s'"
-msgstr ""
+msgstr "不明な拡張子 '%s' のメッセージを受信"
 
 #: ../src/utils/pacat.c:108
 #, c-format
 msgid "Failed to drain stream: %s"
-msgstr ""
+msgstr "ストリームの排出に失敗: %s"
 
 #: ../src/utils/pacat.c:113
 msgid "Playback stream drained."
-msgstr ""
+msgstr "排出したストリームを再生"
 
 #: ../src/utils/pacat.c:123
 msgid "Draining connection to server."
-msgstr ""
+msgstr "サーバーへの排出接続"
 
 #: ../src/utils/pacat.c:136
 #, c-format
 msgid "pa_stream_drain(): %s"
-msgstr ""
+msgstr "pa_stream_drain(): %s"
 
 #: ../src/utils/pacat.c:159
 #, c-format
 msgid "pa_stream_write() failed: %s"
-msgstr ""
+msgstr "pa_stream_write() は失敗: %s"
 
 #: ../src/utils/pacat.c:197
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
-msgstr ""
+msgstr "pa_stream_begin_write() は失敗: %s"
 
 #: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
 #, c-format
 msgid "pa_stream_peek() failed: %s"
-msgstr ""
+msgstr "pa_stream_peek() は失敗: %s"
 
 #: ../src/utils/pacat.c:307
 msgid "Stream successfully created."
-msgstr ""
+msgstr "ストリームは正常に作成完了"
 
 #: ../src/utils/pacat.c:310
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
-msgstr ""
+msgstr "pa_stream_get_buffer_attr() は失敗: %s"
 
 #: ../src/utils/pacat.c:314
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
-msgstr ""
+msgstr "バッファメトリックス: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
 #: ../src/utils/pacat.c:317
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
-msgstr ""
+msgstr "バッファメトリックス: maxlength=%u, fragsize=%u"
 
 #: ../src/utils/pacat.c:321
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
-msgstr ""
+msgstr "サンプル仕様 '%s' 、チャンネルマップ '%s' を使用。"
 
 #: ../src/utils/pacat.c:325
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
-msgstr ""
+msgstr "デバイス %s に接続 (%u, %ssuspended)"
 
 #: ../src/utils/pacat.c:335
 #, c-format
 msgid "Stream error: %s"
-msgstr ""
+msgstr "ストリームエラー: %s"
 
 #: ../src/utils/pacat.c:345
 #, c-format
 msgid "Stream device suspended.%s"
-msgstr ""
+msgstr "ストリームデバイス休止 %s"
 
 #: ../src/utils/pacat.c:347
 #, c-format
 msgid "Stream device resumed.%s"
-msgstr ""
+msgstr "ストリームデバイス復帰 %s"
 
 #: ../src/utils/pacat.c:355
 #, c-format
 msgid "Stream underrun.%s"
-msgstr ""
+msgstr "ストリームアンダーラン %s"
 
 #: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream overrun.%s"
-msgstr ""
+msgstr "ストリームオーバーラン %s"
 
 #: ../src/utils/pacat.c:369
 #, c-format
 msgid "Stream started.%s"
-msgstr ""
+msgstr "ストリーム開始 %s"
 
 #: ../src/utils/pacat.c:376
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
-msgstr ""
+msgstr "ストリームはデバイス %s へ移動 (%u, %ssuspended).%s"
 
 #: ../src/utils/pacat.c:376
 msgid "not "
-msgstr ""
+msgstr "not "
 
 #: ../src/utils/pacat.c:383
 #, c-format
 msgid "Stream buffer attributes changed.%s"
-msgstr ""
+msgstr "ストリームバッファの属性変更 %s"
 
 #: ../src/utils/pacat.c:415
 #, c-format
 msgid "Connection established.%s"
-msgstr ""
+msgstr "接続が確立 %s"
 
 #: ../src/utils/pacat.c:418
 #, c-format
 msgid "pa_stream_new() failed: %s"
-msgstr ""
+msgstr "pa_stream_new() は失敗: %s"
 
 #: ../src/utils/pacat.c:450
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
-msgstr ""
+msgstr "pa_stream_connect_playback() は失敗: %s"
 
 #: ../src/utils/pacat.c:456
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
-msgstr ""
+msgstr "pa_stream_connect_record() は失敗: %s"
 
 #: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
 #, c-format
 msgid "Connection failure: %s"
-msgstr ""
+msgstr "接続失敗: %s"
 
 #: ../src/utils/pacat.c:503
 msgid "Got EOF."
-msgstr ""
+msgstr "EOF 取得"
 
 #: ../src/utils/pacat.c:540
 #, c-format
 msgid "write() failed: %s"
-msgstr ""
+msgstr "write() は失敗: %s"
 
 #: ../src/utils/pacat.c:561
 msgid "Got signal, exiting."
-msgstr ""
+msgstr "信号取得、退出中"
 
 #: ../src/utils/pacat.c:575
 #, c-format
 msgid "Failed to get latency: %s"
-msgstr ""
+msgstr "レイテンシー取得に失敗: %s"
 
 #: ../src/utils/pacat.c:580
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
-msgstr ""
+msgstr "時間: %0.3f sec ; レイテンシー: %0.0f usec"
 
 #: ../src/utils/pacat.c:599
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
-msgstr ""
+msgstr "pa_stream_update_timing_info() は失敗: %s"
 
 #: ../src/utils/pacat.c:609
 #, c-format
@@ -1301,167 +1374,170 @@ msgid ""
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
 msgstr ""
+"pacat %s\n"
+"libpulse %s でコンパイル \n"
+"libpulse %s で接続\n"
 
 #: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
 #, c-format
 msgid "Invalid client name '%s'"
-msgstr ""
+msgstr "無効なクライアント名 '%s'"
 
 #: ../src/utils/pacat.c:779
 #, c-format
 msgid "Invalid stream name '%s'"
-msgstr ""
+msgstr "無効なストリーム名 '%s'"
 
 #: ../src/utils/pacat.c:816
 #, c-format
 msgid "Invalid channel map '%s'"
-msgstr ""
+msgstr "無効なチャンネルマップ '%s'"
 
 #: ../src/utils/pacat.c:845
 #, c-format
 msgid "Invalid latency specification '%s'"
-msgstr ""
+msgstr "無効なレイテンシー仕様 '%s'"
 
 #: ../src/utils/pacat.c:852
 #, c-format
 msgid "Invalid process time specification '%s'"
-msgstr ""
+msgstr "無効なプロセスタイム仕様 '%s'"
 
 #: ../src/utils/pacat.c:864
 #, c-format
 msgid "Invalid property '%s'"
-msgstr ""
+msgstr "無効なプロパティ '%s'"
 
 #: ../src/utils/pacat.c:881
 #, c-format
 msgid "Unknown file format %s."
-msgstr ""
+msgstr "不明なファイル形式 '%s'"
 
 #: ../src/utils/pacat.c:900
 msgid "Invalid sample specification"
-msgstr ""
+msgstr "無効なサンプル仕様"
 
 #: ../src/utils/pacat.c:910
 #, c-format
 msgid "open(): %s"
-msgstr ""
+msgstr "open(): %s"
 
 #: ../src/utils/pacat.c:915
 #, c-format
 msgid "dup2(): %s"
-msgstr ""
+msgstr "dup2(): %s"
 
 #: ../src/utils/pacat.c:922
 msgid "Too many arguments."
-msgstr ""
+msgstr "引数が多過ぎます。"
 
 #: ../src/utils/pacat.c:933
 msgid "Failed to generate sample specification for file."
-msgstr ""
+msgstr "ファイル用のサンプル仕様の生成に失敗しました。"
 
 #: ../src/utils/pacat.c:953
 msgid "Failed to open audio file."
-msgstr ""
+msgstr "オーディオファイルを開くのに失敗しました。"
 
 #: ../src/utils/pacat.c:959
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
-msgstr ""
+msgstr "警告: 指定されたサンプルの仕様はファイルからの仕様で上書きされます。"
 
 #: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
 msgid "Failed to determine sample specification from file."
-msgstr ""
+msgstr "ファイルからのサンプル仕様の決定に失敗しました。"
 
 #: ../src/utils/pacat.c:971
 msgid "Warning: Failed to determine channel map from file."
-msgstr ""
+msgstr "警告: ファイルからのチャンネルマップの決定に失敗しました。"
 
 #: ../src/utils/pacat.c:982
 msgid "Channel map doesn't match sample specification"
-msgstr ""
+msgstr "チャンネルマップはサンプル仕様に一致しません。"
 
 #: ../src/utils/pacat.c:993
 msgid "Warning: failed to write channel map to file."
-msgstr ""
+msgstr "警告: ファイルへのチャンネルマップ書き込みに失敗しました。"
 
 #: ../src/utils/pacat.c:1008
 #, c-format
 msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr ""
+msgstr "サンプル仕様 '%s' と チャンネルマップ '%s' で  %s ストリームを開いています。"
 
 #: ../src/utils/pacat.c:1009
 msgid "recording"
-msgstr ""
+msgstr "録音"
 
 #: ../src/utils/pacat.c:1009
 msgid "playback"
-msgstr ""
+msgstr "再生"
 
 #: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
 msgid "pa_mainloop_new() failed."
-msgstr ""
+msgstr "pa_mainloop_new() は失敗"
 
 #: ../src/utils/pacat.c:1054
 msgid "io_new() failed."
-msgstr ""
+msgstr "io_new() は失敗"
 
 #: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
 msgid "pa_context_new() failed."
-msgstr ""
+msgstr "pa_context_new() は失敗"
 
 #: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
 #, c-format
 msgid "pa_context_connect() failed: %s"
-msgstr ""
+msgstr "pa_context_connect() は失敗: %s"
 
 #: ../src/utils/pacat.c:1075
 msgid "pa_context_rttime_new() failed."
-msgstr ""
+msgstr "pa_context_rttime_new() は失敗"
 
 #: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
 msgid "pa_mainloop_run() failed."
-msgstr ""
+msgstr "pa_mainloop_run() は失敗"
 
 #: ../src/utils/pasuspender.c:81
 #, c-format
 msgid "fork(): %s\n"
-msgstr ""
+msgstr "fork(): %s\n"
 
 #: ../src/utils/pasuspender.c:92
 #, c-format
 msgid "execvp(): %s\n"
-msgstr ""
+msgstr "execvp(): %s\n"
 
 #: ../src/utils/pasuspender.c:109
 #, c-format
 msgid "Failure to suspend: %s\n"
-msgstr ""
+msgstr "休止の失敗: %s\n"
 
 #: ../src/utils/pasuspender.c:124
 #, c-format
 msgid "Failure to resume: %s\n"
-msgstr ""
+msgstr "復帰の失敗: %s\n"
 
 #: ../src/utils/pasuspender.c:147
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
-msgstr ""
+msgstr "警告: サウンドサーバーはローカルではありません。休止しません。\n"
 
 #: ../src/utils/pasuspender.c:159
 #, c-format
 msgid "Connection failure: %s\n"
-msgstr ""
+msgstr "接続失敗 : %s\n"
 
 #: ../src/utils/pasuspender.c:176
 #, c-format
 msgid "Got SIGINT, exiting.\n"
-msgstr ""
+msgstr "SIGINT 取得、退出中 \n"
 
 #: ../src/utils/pasuspender.c:194
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
-msgstr ""
+msgstr "警告: 子プロセスは信号 %u で終了しました\n"
 
 #: ../src/utils/pasuspender.c:212
 #, c-format
@@ -1474,6 +1550,13 @@ msgid ""
 "to\n"
 "\n"
 msgstr ""
+"%s [オプション] ... \n"
+"\n"
+"  -h, --help                            このヘルプを表示\n"
+"      --version                         バージョンを表示\n"
+"  -s, --server=SERVER                   接続先サーバーの名前 "
+"\n"
+"\n"
 
 #: ../src/utils/pasuspender.c:248
 #, c-format
@@ -1482,46 +1565,49 @@ msgid ""
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
 msgstr ""
+"pasuspender %s\n"
+"libpulse %s でコンパイル\n"
+"libpulse %s でリンク\n"
 
 #: ../src/utils/pasuspender.c:277
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
-msgstr ""
+msgstr "pa_mainloop_new() は失敗\n"
 
 #: ../src/utils/pasuspender.c:290
 #, c-format
 msgid "pa_context_new() failed.\n"
-msgstr ""
+msgstr "pa_context_new() は失敗\n"
 
 #: ../src/utils/pasuspender.c:298
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
-msgstr ""
+msgstr "pa_mainloop_run() は失敗\n"
 
 #: ../src/utils/pactl.c:135
 #, c-format
 msgid "Failed to get statistics: %s"
-msgstr ""
+msgstr "統計の取得に失敗しました: %s"
 
 #: ../src/utils/pactl.c:141
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
-msgstr ""
+msgstr "現在使用中: %u ブロックは合計 %s バイトを含む \n"
 
 #: ../src/utils/pactl.c:144
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
-msgstr ""
+msgstr "総寿命の期間中に割り当て: %u ブロックは合計  %s バイトを含む\n"
 
 #: ../src/utils/pactl.c:147
 #, c-format
 msgid "Sample cache size: %s\n"
-msgstr ""
+msgstr "サンプルのキャッシュサイズ: %s\n"
 
 #: ../src/utils/pactl.c:156
 #, c-format
 msgid "Failed to get server information: %s"
-msgstr ""
+msgstr "サーバー情報の取得に失敗 : %s"
 
 #: ../src/utils/pactl.c:164
 #, c-format
@@ -1536,11 +1622,20 @@ msgid ""
 "Default Source: %s\n"
 "Cookie: %08x\n"
 msgstr ""
+"ユーザー名: %s\n"
+"ホスト名: %s\n"
+"サーバー名: %s\n"
+"サーバーバージョン: %s\n"
+"デフォルトサンプル仕様: %s\n"
+"デフォルトチャンネルマップ: %s\n"
+"デフォルトシンク: %s\n"
+"デフォルトソース: %s\n"
+"クッキー: %08x\n"
 
 #: ../src/utils/pactl.c:205
 #, c-format
 msgid "Failed to get sink information: %s"
-msgstr ""
+msgstr "シンク情報の取得に失敗しました: %s"
 
 #: ../src/utils/pactl.c:221
 #, c-format
@@ -1563,21 +1658,38 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"シンク #%u\n"
+"\t状態: %s\n"
+"\t名前: %s\n"
+"\t説明: %s\n"
+"\tドライバー: %s\n"
+"\tサンプル仕様: %s\n"
+"\tチャンネルマップ: %s\n"
+"\tオーナーモジュール: %u\n"
+"\tミュート: %s\n"
+"\tボリューム: %s%s%s\n"
+"\t        バランス %0.2f\n"
+"\tベースボリューム: %s%s%s\n"
+"\tモニターソース: %s\n"
+"\tレイテンシー: %0.0f usec, 設定 %0.0f usec\n"
+"\tフラグ: %s%s%s%s%s%s\n"
+"\tプロパティ:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
 #, c-format
 msgid "\tPorts:\n"
-msgstr ""
+msgstr "\tポート:\n"
 
 #: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
 #, c-format
 msgid "\tActive Port: %s\n"
-msgstr ""
+msgstr "\t活動中ポート: %s\n"
 
 #: ../src/utils/pactl.c:297
 #, c-format
 msgid "Failed to get source information: %s"
-msgstr ""
+msgstr "ソース情報の取得に失敗しました: %s"
 
 #: ../src/utils/pactl.c:313
 #, c-format
@@ -1600,6 +1712,23 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"ソース #%u\n"
+"\t状態: %s\n"
+"\t名前: %s\n"
+"\t説明: %s\n"
+"\tドライバー: %s\n"
+"\tサンプル仕様: %s\n"
+"\tチャンネルマップ: %s\n"
+"\tオーナーモジュール: %u\n"
+"\tミュート: %s\n"
+"\tボリューム: %s%s%s\n"
+"\t        バランス %0.2f\n"
+"\tベースボリューム: %s%s%s\n"
+"\tシンクのモニター: %s\n"
+"\tレイテンシー: %0.0f usec, 設定 %0.0f usec\n"
+"\tフラグ: %s%s%s%s%s%s\n"
+"\tプロパティ:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
 #: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
@@ -1607,12 +1736,12 @@ msgstr ""
 #: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
 #: ../src/utils/pactl.c:645
 msgid "n/a"
-msgstr ""
+msgstr "n/a"
 
 #: ../src/utils/pactl.c:375
 #, c-format
 msgid "Failed to get module information: %s"
-msgstr ""
+msgstr "モジュール情報の取得に失敗しました: %s"
 
 #: ../src/utils/pactl.c:393
 #, c-format
@@ -1624,11 +1753,17 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"モジュール #%u\n"
+"\t名前: %s\n"
+"\t引数: %s\n"
+"\t使用度カウンター: %s\n"
+"\tプロパティ:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:412
 #, c-format
 msgid "Failed to get client information: %s"
-msgstr ""
+msgstr "クライアント情報の取得に失敗しました: %s"
 
 #: ../src/utils/pactl.c:430
 #, c-format
@@ -1639,11 +1774,16 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"クライアント #%u\n"
+"\tドライバー: %s\n"
+"\tオーナーモジュール: %s\n"
+"\tプロパティ:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:447
 #, c-format
 msgid "Failed to get card information: %s"
-msgstr ""
+msgstr "カード情報の取得に失敗しました: %s"
 
 #: ../src/utils/pactl.c:465
 #, c-format
@@ -1655,21 +1795,27 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"カード #%u\n"
+"\t名前: %s\n"
+"\tドライバー: %s\n"
+"\tモジュール: %s\n"
+"\tプロパティ:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:479
 #, c-format
 msgid "\tProfiles:\n"
-msgstr ""
+msgstr "\tプロフィール:\n"
 
 #: ../src/utils/pactl.c:485
 #, c-format
 msgid "\tActive Profile: %s\n"
-msgstr ""
+msgstr "\t有効なプロフィール: %s\n"
 
 #: ../src/utils/pactl.c:496
 #, c-format
 msgid "Failed to get sink input information: %s"
-msgstr ""
+msgstr "シンク入力情報の取得に失敗しました: %s"
 
 #: ../src/utils/pactl.c:515
 #, c-format
@@ -1691,11 +1837,27 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"シンク入力 #%u\n"
+"\tドライバー: %s\n"
+"\tオーナーモジュール: %s\n"
+"\tクライアント: %s\n"
+"\tシンク: %u\n"
+"\tサンプル仕様: %s\n"
+"\tチャンネルマップ: %s\n"
+"\tミュート: %s\n"
+"\tボリューム: %s\n"
+"\t        %s\n"
+"\t        バランス %0.2f\n"
+"\tバッファレイテンシー: %0.0f usec\n"
+"\tシンクレイテンシー: %0.0f usec\n"
+"\t再サンプル方法: %s\n"
+"\tプロパティ:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:554
 #, c-format
 msgid "Failed to get source output information: %s"
-msgstr ""
+msgstr "ソース出力情報の取得に失敗しました: %s"
 
 #: ../src/utils/pactl.c:574
 #, c-format
@@ -1713,11 +1875,23 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"ソース出力 #%u\n"
+"\tドライバー: %s\n"
+"\tオーナーモジュール: %s\n"
+"\tクライアント: %s\n"
+"\tソース: %u\n"
+"\tサンプル仕様: %s\n"
+"\tチャンネルマップ: %s\n"
+"\tバッファレイテンシー: %0.0f usec\n"
+"\tソースレイテンシー: %0.0f usec\n"
+"\t再サンプル方法: %s\n"
+"\tプロパティ:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:605
 #, c-format
 msgid "Failed to get sample information: %s"
-msgstr ""
+msgstr "サンプル情報の取得に失敗しました: %s"
 
 #: ../src/utils/pactl.c:623
 #, c-format
@@ -1736,24 +1910,37 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"サンプル #%u\n"
+"\t名前: %s\n"
+"\tサンプル仕様: %s\n"
+"\tチャンネルマップ: %s\n"
+"\tボリューム: %s\n"
+"\t        %s\n"
+"\t        バランス %0.2f\n"
+"\t継続期間: %0.1fs\n"
+"\tサイズ: %s\n"
+"\tレイジー: %s\n"
+"\tファイル名e: %s\n"
+"\tプロパティ:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
 #, c-format
 msgid "Failure: %s"
-msgstr ""
+msgstr "失敗: %s"
 
 #: ../src/utils/pactl.c:687
 #, c-format
 msgid "Failed to upload sample: %s"
-msgstr ""
+msgstr "サンプルのアップロードに失敗しました: %s"
 
 #: ../src/utils/pactl.c:704
 msgid "Premature end of file"
-msgstr ""
+msgstr "ファイルの早期終了"
 
 #: ../src/utils/pactl.c:863
 msgid "Got SIGINT, exiting."
-msgstr ""
+msgstr "SIGINT を取得、退出中"
 
 #: ../src/utils/pactl.c:869
 #, c-format

commit c118a3d8b91088a5e1785a5c4ce013b680560401
Author: sandeeps <sandeeps at fedoraproject.org>
Date:   Wed Dec 9 13:32:05 2009 +0000

    Sending translation for Marathi

diff --git a/po/mr.po b/po/mr.po
index 9f417fd..5c05cc5 100644
--- a/po/mr.po
+++ b/po/mr.po
@@ -8,8 +8,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-21 18:16+0530\n"
+"POT-Creation-Date: 2009-12-07 08:36+0000\n"
+"PO-Revision-Date: 2009-12-09 18:30+0530\n"
 "Last-Translator: Sandeep Shedmake <sshedmak at redhat.com>\n"
 "Language-Team: Marathi <fedora-trans-mr at redhat.com>\n"
 "MIME-Version: 1.0\n"
@@ -218,8 +218,7 @@ msgstr "प्रणाली पद्धती अंतर्गत कार
 
 #: ../src/daemon/main.c:586
 msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr ""
-"प्रणाली पद्धती अंतर्गत कार्यरत, परंतु --disallow-module-loading निश्चित केले नाही!"
+msgstr "प्रणाली पद्धती अंतर्गत कार्यरत, परंतु --disallow-module-loading निश्चित केले नाही!"
 
 #: ../src/daemon/main.c:589
 msgid "Running in system mode, forcibly disabling SHM mode!"
@@ -1521,8 +1520,7 @@ msgstr "सावधानता: वाहिनी नकाशा फाइ
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "%s स्ट्रीम चाचणी संयोजना '%s' व वाहिनी नकाशा '%s' सह उघडत आहे."
 
 #: ../src/utils/pacat.c:1009
@@ -2112,17 +2110,14 @@ msgid "You have to specify a module index"
 msgstr "तुम्हाला विभाग इंडेक्स् निश्चित करावे लागेल"
 
 #: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
-msgstr ""
-"तुम्ही एकापेक्षा जास्त सींक निश्चित करू शकत नाही. तुम्हाला बूलीयन मूल्य निश्चित करावे लागेल."
+msgid "You may not specify more than one sink. You have to specify a boolean value."
+msgstr "तुम्ही एकापेक्षा जास्त सींक निश्चित करू शकत नाही. तुम्हाला बूलीयन मूल्य निश्चित करावे लागेल."
 
 #: ../src/utils/pactl.c:1103
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr ""
-"तुम्ही एकापेक्षा जास्त स्रोत निश्चित करू शकत नाही. तुम्हाला बूलीयन मूल्य निश्चित करावे लागेल."
+msgstr "तुम्ही एकापेक्षा जास्त स्रोत निश्चित करू शकत नाही. तुम्हाला बूलीयन मूल्य निश्चित करावे लागेल."
 
 #: ../src/utils/pactl.c:1115
 msgid "You have to specify a card name/index and a profile name"
@@ -2353,217 +2348,204 @@ msgstr "PulseAudio आवाज सर्वर"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "आऊट साधणे"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "इंपुट साधणे"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "@HOSTNAME@ वरील ऑडिओ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "इंपुट"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "डॉकिंग स्टेशन इंपुट"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "डॉकिंग स्टेशन माइक्रोफोन"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "लाइन-इन"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "माइक्रोफोन"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "बाहेरील माइक्रोफोन"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "आंतरीक ऑडिओ"
+msgstr "आंतरीक माइक्रोफोन"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "रेडिओ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "विडिओ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "स्वयं गैन कंट्रोल"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "स्वयं गैन कंट्रोल अशक्य"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "बूस्ट"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "बूस्ट अशक्य"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "ऍमप्लिफायर"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "ऍमप्लिफायर अशक्य"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "ऍनलॉग इंपुट"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "ऍनलॉग माइक्रोफोन"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "ऍनलॉग लाइन-इन"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "ऍनलॉग रेडिओ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "ऍनलॉग विडीओ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "Null आऊटपुट"
+msgstr "ऍनलॉग आऊटपुट"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "ऍनलॉग हेडफोन्स्"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "ऍनलॉग आऊटपुट (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "ऍनलॉग मोनो आऊटपुट"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "ऍनलॉग मोनो"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
-#, fuzzy
 msgid "Analog Stereo"
-msgstr "स्टिरीओ"
+msgstr "ऍनलॉग स्टिरीओ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "सराऊन्ड 4.1"
+msgstr "ऍनलॉग सर्राउंड 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "सराऊन्ड 4.0"
+msgstr "ऍनलॉग सर्राउंड 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "सराऊन्ड 4.1"
+msgstr "ऍनलॉग सर्राउंड 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
-#, fuzzy
 msgid "Analog Surround 4.0"
-msgstr "सराऊन्ड 4.0"
+msgstr "ऍनलॉग सर्राउंड 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
-#, fuzzy
 msgid "Analog Surround 4.1"
-msgstr "सराऊन्ड 4.1"
+msgstr "ऍनलॉग सर्राउंड 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
-#, fuzzy
 msgid "Analog Surround 5.0"
-msgstr "सराऊन्ड 5.0"
+msgstr "ऍनलॉग सर्राउंड 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
-#, fuzzy
 msgid "Analog Surround 5.1"
-msgstr "सराऊन्ड 5.1"
+msgstr "ऍनलॉग सर्राउंड 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "सराऊन्ड 4.0"
+msgstr "ऍनलॉग सर्राउंड 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "सराऊन्ड 4.1"
+msgstr "ऍनलॉग सर्राउंड 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "सराऊन्ड 4.0"
+msgstr "ऍनलॉग सर्राउंड 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
-#, fuzzy
 msgid "Analog Surround 7.1"
-msgstr "सराऊन्ड 7.1"
+msgstr "ऍनलॉग सर्राउंड 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "डिजीटल स्टिरीओ (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "डिजीटल सर्राउंड 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "डिजीटल सर्राउंड 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "डिजीटल सर्राउंड 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "डिजीटल स्टिरीओ (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "ऍनलॉग मोनो ड्युप्लेक्स्"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "ऍनलॉग स्टिरीओ ड्युप्लेक्स्"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "डिजीटल स्टिरीओ ड्युप्लेक्स् (IEC958)"
+

commit 249956682c900bbe75c4196fa978c3dc33481cdc
Author: khasida <khasida at fedoraproject.org>
Date:   Thu Dec 10 02:52:26 2009 +0000

    Sending translation for Japanese

diff --git a/po/ja.po b/po/ja.po
index 179aeac..8e85a48 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -10,7 +10,7 @@ msgstr ""
 "Project-Id-Version: ja\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2009-12-08 02:51+0000\n"
-"PO-Revision-Date: 2009-12-09 18:20+0900\n"
+"PO-Revision-Date: 2009-12-10 11:49+0900\n"
 "Last-Translator: Kiyoto Hashida <khashida at redhat.com>\n"
 "Language-Team: Japanese <jp at li.org>\n"
 "MIME-Version: 1.0\n"
@@ -1366,6 +1366,60 @@ msgid ""
 "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
+"%s [options]\n"
+"\n"
+"  -h, --help                            このヘルプを表示\n"
+"      --version                         バージョンを表示\n"
+"\n"
+"  -r, --record                          録音用の接続を作成\n"
+"  -p, --playback                        再生用の接続を作成\n"
+"\n"
+"  -v, --verbose                         詳細操作を有効にする\n"
+"\n"
+"  -s, --server=SERVER                   接続先サーバーの名前 "
+"\n"
+"  -d, --device=DEVICE                   接続先シンク/ソースの名前 "
+"\n"
+"  -n, --client-name=NAME                サーバーでこのクライアントへのコール方法 "
+"\n"
+"      --stream-name=NAME                サーバー上でこのストリームへのコール方法"
+"\n"
+"      --volume=VOLUME                   初期 (リニア) ボリューム幅を指定 "
+" 0...65536\n"
+"      --rate=SAMPLERATE                 サンプルレートを Hz で表示 (デフォルトは "
+"44100)\n"
+"      --format=SAMPLEFORMAT             サンプルタイプ, 次の1つ s16le, "
+"s16be, u8, float32le,\n"
+"                                        float32be, ulaw, alaw, s32le, s32be, "
+"s24le, s24be,\n"
+"                                        s24-32le, s24-32be (デフォルトは "
+"s16ne)\n"
+"      --channels=CHANNELS               チャンネルの数, モノ用に1, "
+"ステレオ用に2\n"
+"                                        (デフォルトは 2)\n"
+"      --channel-map=CHANNELMAP          デフォルトの代わりに使用するチャンネルマップ "
+"\n"
+"      --fix-format                      ストリームの接続先であるシンクからサンプル形式を取る "
+"\n"
+"\n"
+"      --fix-rate                        ストリームの接続先であるシンクからサンプルレートを取る "
+"\n"
+"\n"
+"      --fix-channels                    ストリームの接続先であるシンクからチャンネル数と "
+"チャンネルマップを取る\n"
+"\n"
+"      --no-remix                         チャンネルのアップミックスやダウンミックスをしない\n"
+"      --no-remap                        名前の代わりにインデックスでチャンネルをマップする"
+"\n"
+"      --latency=BYTES                   指定レイテンシーをバイトで要求 "
+"\n"
+"      --process-time=BYTES              要求毎の指定プロセスタイムをバイトで要求 "
+"\n"
+"      --property=PROPERTY=VALUE         指定プロパティを指定値にセット"
+"\n"
+"      --raw                             録音/再生の生の PCM データ\n"
+"      --file-format=FFORMAT             録音/再生のフォーマットした PCM データ\n"
+"      --list-file-formats               利用可能なファイル形式を一覧表示\n"
 
 #: ../src/utils/pacat.c:731
 #, c-format
@@ -1975,6 +2029,35 @@ msgid ""
 "  -n, --client-name=NAME                How to call this client on the "
 "server\n"
 msgstr ""
+"%s [オプション] stat\n"
+"%s [オプション] list\n"
+"%s [オプション] exit\n"
+"%s [オプション] upload-sample FILENAME [NAME]\n"
+"%s [オプション] play-sample NAME [SINK]\n"
+"%s [オプション] remove-sample NAME\n"
+"%s [オプション] move-sink-input SINKINPUT SINK\n"
+"%s [オプション] move-source-output SOURCEOUTPUT SOURCE\n"
+"%s [オプション] load-module NAME [ARGS ...]\n"
+"%s [オプション] unload-module MODULE\n"
+"%s [オプション] suspend-sink SINK 1|0\n"
+"%s [オプション] suspend-source SOURCE 1|0\n"
+"%s [オプション] set-card-profile CARD PROFILE\n"
+"%s [オプション] set-sink-port SINK PORT\n"
+"%s [オプション] set-source-port SOURCE PORT\n"
+"%s [オプション] set-sink-volume SINK VOLUME\n"
+"%s [オプション] set-source-volume SOURCE VOLUME\n"
+"%s [オプション] set-sink-input-volume SINKINPUT VOLUME\n"
+"%s [オプション] set-sink-mute SINK 1|0\n"
+"%s [オプション] set-source-mute SOURCE 1|0\n"
+"%s [オプション] set-sink-input-mute SINKINPUT 1|0\n"
+"\n"
+"  -h, --help                            このヘルプを表示\n"
+"      --version                         バージョンを表示\n"
+"\n"
+"  -s, --server=SERVER                   接続先サーバーの名前 "
+"\n"
+"  -n, --client-name=NAME                サーバーでこのクライアントへのコール方法 "
+"\n"
 
 #: ../src/utils/pactl.c:933
 #, c-format
@@ -1983,106 +2066,109 @@ msgid ""
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
 msgstr ""
+"pactl %s\n"
+"libpulse %s でコンパイル\n"
+"libpulse %s でリンク\n"
 
 #: ../src/utils/pactl.c:979
 msgid "Please specify a sample file to load"
-msgstr ""
+msgstr "ロードするサンプルファイルを指定して下さい"
 
 #: ../src/utils/pactl.c:992
 msgid "Failed to open sound file."
-msgstr ""
+msgstr "サウンドファイルを開くのに失敗しました。"
 
 #: ../src/utils/pactl.c:1004
 msgid "Warning: Failed to determine sample specification from file."
-msgstr ""
+msgstr "警告: ファイルからサンプル仕様を決定するのに失敗しました。"
 
 #: ../src/utils/pactl.c:1014
 msgid "You have to specify a sample name to play"
-msgstr ""
+msgstr "再生するサンプル名を指定する必要があります"
 
 #: ../src/utils/pactl.c:1026
 msgid "You have to specify a sample name to remove"
-msgstr ""
+msgstr "削除するサンプル名を指定する必要があります。"
 
 #: ../src/utils/pactl.c:1035
 msgid "You have to specify a sink input index and a sink"
-msgstr ""
+msgstr "シンク入力インデックスとシンクを指定する必要があります"
 
 #: ../src/utils/pactl.c:1045
 msgid "You have to specify a source output index and a source"
-msgstr ""
+msgstr "ソース出力インデックスとソースを指定する必要があります"
 
 #: ../src/utils/pactl.c:1060
 msgid "You have to specify a module name and arguments."
-msgstr ""
+msgstr "モジュール名と引数を指定する必要があります"
 
 #: ../src/utils/pactl.c:1080
 msgid "You have to specify a module index"
-msgstr ""
+msgstr "モジュールインデックスを指定する必要があります"
 
 #: ../src/utils/pactl.c:1090
 msgid "You may not specify more than one sink. You have to specify a boolean value."
-msgstr ""
+msgstr "シンクは1つ以上は指定できません。ブーリアン値を1つ指定する必要があります。"
 
 #: ../src/utils/pactl.c:1103
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr ""
+msgstr "ソースは1つ以上は指定できません。ブーリアン値を1つ指定する必要があります。"
 
 #: ../src/utils/pactl.c:1115
 msgid "You have to specify a card name/index and a profile name"
-msgstr ""
+msgstr "カードの名前/インデックスとプロフィール名を指定する必要があります"
 
 #: ../src/utils/pactl.c:1126
 msgid "You have to specify a sink name/index and a port name"
-msgstr ""
+msgstr "シンクの名前/インデックスとポート名を指定する必要があります"
 
 #: ../src/utils/pactl.c:1137
 msgid "You have to specify a source name/index and a port name"
-msgstr ""
+msgstr "ソースの名前/インデックスとポート名を指定する必要があります"
 
 #: ../src/utils/pactl.c:1149
 msgid "You have to specify a sink name/index and a volume"
-msgstr ""
+msgstr "シンクの名前/インデックスとボリュームを指定する必要があります"
 
 #: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
 #: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
 #: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
 msgid "Invalid volume specification"
-msgstr ""
+msgstr "無効なボリューム仕様"
 
 #: ../src/utils/pactl.c:1166
 msgid "You have to specify a source name/index and a volume"
-msgstr ""
+msgstr "ソースの名前/インデックスとボリュームを指定する必要があります"
 
 #: ../src/utils/pactl.c:1183
 msgid "You have to specify a sink input index and a volume"
-msgstr ""
+msgstr "シンク入力インデックスとボリュームを指定する必要があります"
 
 #: ../src/utils/pactl.c:1188
 msgid "Invalid sink input index"
-msgstr ""
+msgstr "無効なシンク入力インデックス"
 
 #: ../src/utils/pactl.c:1204
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr ""
+msgstr "シンクの名前/インデックスとミュートブーリアンを指定する必要があります"
 
 #: ../src/utils/pactl.c:1221
 msgid "You have to specify a source name/index and a mute boolean"
-msgstr ""
+msgstr "ソースの名前/インデックスとミュートブーリアンを指定する必要があります"
 
 #: ../src/utils/pactl.c:1238
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr ""
+msgstr "シンク入力インデックスとミュートブーリアンを指定する必要があります"
 
 #: ../src/utils/pactl.c:1243
 msgid "Invalid sink input index specification"
-msgstr ""
+msgstr "無効なシンク入力インデックス仕様"
 
 #: ../src/utils/pactl.c:1262
 msgid "No valid command specified."
-msgstr ""
+msgstr "有効なコマンドが指定されていません"
 
 #: ../src/utils/pax11publish.c:61
 #, c-format
@@ -2095,75 +2181,82 @@ msgid ""
 "variables and cookie file.\n"
 " -r    Remove PulseAudio data from X11 display\n"
 msgstr ""
+"%s [-D display] [-S server] [-O sink] [-I source] [-c file]  [-d|-e|-i|-r]\n"
+"\n"
+" -d    X11 ディスプレイに接続した現在の PulseAudio のデータを表示 (デフォルト)\n"
+" -e    X11 ディスプレイにローカル PulseAudio データをエキスポート\n"
+" -i    X11 ディスプレイからローカル環境変数とクッキーに PulseAudio データをインポート "
+"\n"
+" -r    X11 ディスプレイから PulseAudio データを削除\n"
 
 #: ../src/utils/pax11publish.c:94
 #, c-format
 msgid "Failed to parse command line.\n"
-msgstr ""
+msgstr "コマンドラインの構文解析に失敗\n"
 
 #: ../src/utils/pax11publish.c:108
 #, c-format
 msgid "Server: %s\n"
-msgstr ""
+msgstr "サーバー: %s\n"
 
 #: ../src/utils/pax11publish.c:110
 #, c-format
 msgid "Source: %s\n"
-msgstr ""
+msgstr "ソース: %s\n"
 
 #: ../src/utils/pax11publish.c:112
 #, c-format
 msgid "Sink: %s\n"
-msgstr ""
+msgstr "シンク: %s\n"
 
 #: ../src/utils/pax11publish.c:114
 #, c-format
 msgid "Cookie: %s\n"
-msgstr ""
+msgstr "クッキー: %s\n"
 
 #: ../src/utils/pax11publish.c:132
 #, c-format
 msgid "Failed to parse cookie data\n"
-msgstr ""
+msgstr "クッキーデータの構文解析に失敗\n"
 
 #: ../src/utils/pax11publish.c:137
 #, c-format
 msgid "Failed to save cookie data\n"
-msgstr ""
+msgstr "クッキーデータの保存に失敗\n"
 
 #: ../src/utils/pax11publish.c:152
 #, c-format
 msgid "Failed to load client configuration file.\n"
-msgstr ""
+msgstr "クライアント設定ファイルのロードに失敗\n"
 
 #: ../src/utils/pax11publish.c:157
 #, c-format
 msgid "Failed to read environment configuration data.\n"
-msgstr ""
+msgstr "環境設定データの読み込みに失敗 \n"
 
 #: ../src/utils/pax11publish.c:174
 #, c-format
 msgid "Failed to get FQDN.\n"
-msgstr ""
+msgstr "FQDN の取得に失敗 \n"
 
 #: ../src/utils/pax11publish.c:194
 #, c-format
 msgid "Failed to load cookie data\n"
-msgstr ""
+msgstr "クッキーデータのロードに失敗\n"
 
 #: ../src/utils/pax11publish.c:211
 #, c-format
 msgid "Not yet implemented.\n"
-msgstr ""
+msgstr "まだ実装されていません\n"
 
 #: ../src/utils/pacmd.c:69
 msgid "No PulseAudio daemon running, or not running as session daemon."
-msgstr ""
+msgstr "PulseAudio デーモン自身が稼働していないか、又はセッションデーモンとして稼働していません。"
 
 #: ../src/utils/pacmd.c:74
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
-msgstr ""
+msgstr "ソケット (PF_UNIX, SOCK_STREAM, 0): %s"
 
 #: ../src/utils/pacmd.c:91
 #, c-format
@@ -2172,11 +2265,11 @@ msgstr "connect(): %s"
 
 #: ../src/utils/pacmd.c:99
 msgid "Failed to kill PulseAudio daemon."
-msgstr ""
+msgstr "PulseAudio のキルに失敗"
 
 #: ../src/utils/pacmd.c:107
 msgid "Daemon not responding."
-msgstr ""
+msgstr "デーモンが応答しません"
 
 #: ../src/utils/pacmd.c:161
 #, c-format
@@ -2195,7 +2288,7 @@ msgstr "write(): %s"
 
 #: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
 msgid "Cannot access autospawn lock."
-msgstr ""
+msgstr "autospawn ロックにアクセスできません"
 
 #: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
 #, c-format
@@ -2207,6 +2300,12 @@ msgid ""
 "We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
 "returned 0 or another value < min_avail."
 msgstr ""
+"ALSA が新規のデータをデバイスに書き込むように催促しましたが、書き込むことが "
+"ありません!\n"
+"これは多分、ALSA ドライバー '%s' 内のバグです。この問題を ALSA 開発者に "
+"報告して下さい。\n"
+"POLLOUT セットで呼び起こされましたが、その結果としての snd_pcm_avail() は "
+"0 又は 他の値 < min_avail を返しました。"
 
 #: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
 #, c-format
@@ -2218,6 +2317,12 @@ msgid ""
 "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
 "returned 0 or another value < min_avail."
 msgstr ""
+"ALSA はデバイスから新規データを読み込むように催促しましたが、読み込むものが "
+"ありません!\n"
+"これは多分、ALSA ドライバー'%s' 内のバグです。この問題を ALSA 開発者に "
+"報告して下さい。\n"
+"POLLIN セットで呼び起こされましたが、その結果としての snd_pcm_avail() は "
+"0 又は 他の値 < min_avail を返しました。"
 
 #: ../src/modules/alsa/module-alsa-card.c:152
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2228
@@ -2227,129 +2332,129 @@ msgstr "オフ"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2184
 msgid "High Fidelity Playback (A2DP)"
-msgstr ""
+msgstr "ハイファイ再生 (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2198
 msgid "High Fidelity Capture (A2DP)"
-msgstr ""
+msgstr "ハイファイキャプチャ (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2213
 msgid "Telephony Duplex (HSP/HFP)"
-msgstr ""
+msgstr "テレフォニーデュプレックス (HSP/HFP)"
 
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
-msgstr ""
+msgstr "PulseAudio サウンドサーバー"
 
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "出力デバイス"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "入力デバイス"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "@HOSTNAME@ 上のオーディオ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "入力"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "ドッキングステーション入力"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "ドッキングステーションマイクロフォン"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "ラインイン"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "マイクロフォン"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "外部マイクロフォン"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
 msgid "Internal Microphone"
-msgstr ""
+msgstr "内部マイクロフォン"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "ラジオ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "ビデオ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "自動ゲイン制御"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "自動ゲイン制御なし"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "ブースト"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "ブーストなし"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "アンプ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "アンプなし"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "アナログ入力"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "アナログマイクロフォン"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "アナログラインイン"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "アナログラジオ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "アナログビデオ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Output"
-msgstr ""
+msgstr "アナログ出力"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "アナログヘッドフォン"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "アナログ出力 (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "アナログモノ出力"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
 #, c-format
@@ -2363,85 +2468,85 @@ msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "アナログモノ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
 msgid "Analog Stereo"
-msgstr ""
+msgstr "アナログステレオ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
 msgid "Analog Surround 2.1"
-msgstr ""
+msgstr "アナログサラウンド 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
 msgid "Analog Surround 3.0"
-msgstr ""
+msgstr "アナログサラウンド 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
 msgid "Analog Surround 3.1"
-msgstr ""
+msgstr "アナログサラウンド 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Surround 4.0"
-msgstr ""
+msgstr "アナログサラウンド 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Surround 4.1"
-msgstr ""
+msgstr "アナログサラウンド 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 5.0"
-msgstr ""
+msgstr "アナログサラウンド 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 5.1"
-msgstr ""
+msgstr "アナログサラウンド 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 6.0"
-msgstr ""
+msgstr "アナログサラウンド 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 6.1"
-msgstr ""
+msgstr "アナログサラウンド 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 7.0"
-msgstr ""
+msgstr "アナログサラウンド 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 7.1"
-msgstr ""
+msgstr "アナログサラウンド 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "デジタルステレオ (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "デジタルサラウンド 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "デジタルサラウンド 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "デジタルサラウンド 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "デジタルステレオ (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "アナログモノデュプレックス"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "アナログステレオデュプレックス"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "デジタルステレオデュプレックス (IEC958)"
 

commit b33c5718accaf3bfe37a74ccf66b93043c11d460
Author: snowlet <snowlet at fedoraproject.org>
Date:   Thu Dec 10 04:19:07 2009 +0000

    Sending translation for po/zh_TW.po

diff --git a/po/zh_TW.po b/po/zh_TW.po
new file mode 100644
index 0000000..4f730f8
--- /dev/null
+++ b/po/zh_TW.po
@@ -0,0 +1,2243 @@
+# translation of pulseaudio.master-tx.pulseaudio.po to Traditional Chinese
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Chester Cheng <ccheng@紅帽子>, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: pulseaudio.master-tx.pulseaudio\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-10 02:33+0000\n"
+"PO-Revision-Date: 2009-12-10 14:18+1000\n"
+"Last-Translator: Chester Cheng <ccheng@紅帽子>\n"
+"Language-Team: Traditional Chinese <zh_TW at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#, c-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: ../src/modules/alsa/alsa-util.c:1106
+#, c-format
+msgid ""
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
+"ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1147
+#, c-format
+msgid ""
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
+"lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1194
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/module-always-sink.c:39
+msgid "Always keeps at least one sink loaded even if it's a null one"
+msgstr ""
+
+#: ../src/modules/module-always-sink.c:83
+msgid "Dummy Output"
+msgstr ""
+
+#: ../src/modules/module-ladspa-sink.c:49
+msgid "Virtual LADSPA sink"
+msgstr ""
+
+#: ../src/modules/module-ladspa-sink.c:53
+msgid ""
+"sink_name=<name for the sink> sink_properties=<properties for the sink> "
+"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
+"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
+"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
+"input control values>"
+msgstr ""
+"sink_name=<name for the sink> sink_properties=<properties for the sink> "
+"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
+"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
+"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
+"input control values>"
+
+#: ../src/modules/module-null-sink.c:55
+msgid "Clocked NULL sink"
+msgstr ""
+
+#: ../src/modules/module-null-sink.c:291
+msgid "Null Output"
+msgstr ""
+
+#: ../src/pulsecore/sink.c:2613
+msgid "Internal Audio"
+msgstr ""
+
+#: ../src/pulsecore/sink.c:2618
+msgid "Modem"
+msgstr ""
+
+#: ../src/daemon/ltdl-bind-now.c:124
+msgid "Failed to find original lt_dlopen loader."
+msgstr ""
+
+#: ../src/daemon/ltdl-bind-now.c:129
+msgid "Failed to allocate new dl loader."
+msgstr ""
+
+#: ../src/daemon/ltdl-bind-now.c:142
+msgid "Failed to add bind-now-loader."
+msgstr ""
+
+#: ../src/daemon/main.c:141
+#, c-format
+msgid "Got signal %s."
+msgstr ""
+
+#: ../src/daemon/main.c:168
+msgid "Exiting."
+msgstr ""
+
+#: ../src/daemon/main.c:186
+#, c-format
+msgid "Failed to find user '%s'."
+msgstr ""
+
+#: ../src/daemon/main.c:191
+#, c-format
+msgid "Failed to find group '%s'."
+msgstr ""
+
+#: ../src/daemon/main.c:195
+#, c-format
+msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
+msgstr ""
+
+#: ../src/daemon/main.c:200
+#, c-format
+msgid "GID of user '%s' and of group '%s' don't match."
+msgstr ""
+
+#: ../src/daemon/main.c:205
+#, c-format
+msgid "Home directory of user '%s' is not '%s', ignoring."
+msgstr ""
+
+#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#, c-format
+msgid "Failed to create '%s': %s"
+msgstr ""
+
+#: ../src/daemon/main.c:220
+#, c-format
+msgid "Failed to change group list: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:236
+#, c-format
+msgid "Failed to change GID: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:252
+#, c-format
+msgid "Failed to change UID: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:271
+msgid "Successfully dropped root privileges."
+msgstr ""
+
+#: ../src/daemon/main.c:279
+msgid "System wide mode unsupported on this platform."
+msgstr ""
+
+#: ../src/daemon/main.c:297
+#, c-format
+msgid "setrlimit(%s, (%u, %u)) failed: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:474
+msgid "Failed to parse command line."
+msgstr ""
+
+#: ../src/daemon/main.c:541
+msgid "Daemon not running"
+msgstr ""
+
+#: ../src/daemon/main.c:543
+#, c-format
+msgid "Daemon running as PID %u"
+msgstr ""
+
+#: ../src/daemon/main.c:553
+#, c-format
+msgid "Failed to kill daemon: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:571
+msgid ""
+"This program is not intended to be run as root (unless --system is "
+"specified)."
+msgstr ""
+
+#: ../src/daemon/main.c:573
+msgid "Root privileges required."
+msgstr ""
+
+#: ../src/daemon/main.c:578
+msgid "--start not supported for system instances."
+msgstr ""
+
+#: ../src/daemon/main.c:583
+msgid "Running in system mode, but --disallow-exit not set!"
+msgstr ""
+
+#: ../src/daemon/main.c:586
+msgid "Running in system mode, but --disallow-module-loading not set!"
+msgstr ""
+
+#: ../src/daemon/main.c:589
+msgid "Running in system mode, forcibly disabling SHM mode!"
+msgstr ""
+
+#: ../src/daemon/main.c:594
+msgid "Running in system mode, forcibly disabling exit idle time!"
+msgstr ""
+
+#: ../src/daemon/main.c:621
+msgid "Failed to acquire stdio."
+msgstr ""
+
+#: ../src/daemon/main.c:627
+#, c-format
+msgid "pipe failed: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:632
+#, c-format
+msgid "fork() failed: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#, c-format
+msgid "read() failed: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:652
+msgid "Daemon startup failed."
+msgstr ""
+
+#: ../src/daemon/main.c:654
+msgid "Daemon startup successful."
+msgstr ""
+
+#: ../src/daemon/main.c:731
+#, c-format
+msgid "This is PulseAudio %s"
+msgstr ""
+
+#: ../src/daemon/main.c:732
+#, c-format
+msgid "Compilation host: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:733
+#, c-format
+msgid "Compilation CFLAGS: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:736
+#, c-format
+msgid "Running on host: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:739
+#, c-format
+msgid "Found %u CPUs."
+msgstr ""
+
+#: ../src/daemon/main.c:741
+#, c-format
+msgid "Page size is %lu bytes"
+msgstr ""
+
+#: ../src/daemon/main.c:744
+msgid "Compiled with Valgrind support: yes"
+msgstr ""
+
+#: ../src/daemon/main.c:746
+msgid "Compiled with Valgrind support: no"
+msgstr ""
+
+#: ../src/daemon/main.c:749
+#, c-format
+msgid "Running in valgrind mode: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:752
+msgid "Optimized build: yes"
+msgstr ""
+
+#: ../src/daemon/main.c:754
+msgid "Optimized build: no"
+msgstr ""
+
+#: ../src/daemon/main.c:758
+msgid "NDEBUG defined, all asserts disabled."
+msgstr ""
+
+#: ../src/daemon/main.c:760
+msgid "FASTPATH defined, only fast path asserts disabled."
+msgstr ""
+
+#: ../src/daemon/main.c:762
+msgid "All asserts enabled."
+msgstr ""
+
+#: ../src/daemon/main.c:766
+msgid "Failed to get machine ID"
+msgstr ""
+
+#: ../src/daemon/main.c:769
+#, c-format
+msgid "Machine ID is %s."
+msgstr ""
+
+#: ../src/daemon/main.c:773
+#, c-format
+msgid "Session ID is %s."
+msgstr ""
+
+#: ../src/daemon/main.c:779
+#, c-format
+msgid "Using runtime directory %s."
+msgstr ""
+
+#: ../src/daemon/main.c:784
+#, c-format
+msgid "Using state directory %s."
+msgstr ""
+
+#: ../src/daemon/main.c:787
+#, c-format
+msgid "Using modules directory %s."
+msgstr ""
+
+#: ../src/daemon/main.c:789
+#, c-format
+msgid "Running in system mode: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:792
+msgid ""
+"OK, so you are running PA in system mode. Please note that you most likely "
+"shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as "
+"expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
+"explanation why system mode is usually a bad idea."
+msgstr ""
+
+#: ../src/daemon/main.c:809
+msgid "pa_pid_file_create() failed."
+msgstr ""
+
+#: ../src/daemon/main.c:819
+msgid "Fresh high-resolution timers available! Bon appetit!"
+msgstr ""
+
+#: ../src/daemon/main.c:821
+msgid ""
+"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
+"resolution timers enabled!"
+msgstr ""
+
+#: ../src/daemon/main.c:844
+msgid "pa_core_new() failed."
+msgstr ""
+
+#: ../src/daemon/main.c:904
+msgid "Failed to initialize daemon."
+msgstr ""
+
+#: ../src/daemon/main.c:909
+msgid "Daemon startup without any loaded modules, refusing to work."
+msgstr ""
+
+#: ../src/daemon/main.c:926
+msgid "Daemon startup complete."
+msgstr ""
+
+#: ../src/daemon/main.c:932
+msgid "Daemon shutdown initiated."
+msgstr ""
+
+#: ../src/daemon/main.c:954
+msgid "Daemon terminated."
+msgstr ""
+
+#: ../src/daemon/cmdline.c:115
+#, c-format
+msgid ""
+"%s [options]\n"
+"\n"
+"COMMANDS:\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"      --dump-conf                       Dump default configuration\n"
+"      --dump-modules                    Dump list of available modules\n"
+"      --dump-resample-methods           Dump available resample methods\n"
+"      --cleanup-shm                     Cleanup stale shared memory "
+"segments\n"
+"      --start                           Start the daemon if it is not "
+"running\n"
+"  -k  --kill                            Kill a running daemon\n"
+"      --check                           Check for a running daemon (only "
+"returns exit code)\n"
+"\n"
+"OPTIONS:\n"
+"      --system[=BOOL]                   Run as system-wide instance\n"
+"  -D, --daemonize[=BOOL]                Daemonize after startup\n"
+"      --fail[=BOOL]                     Quit when startup fails\n"
+"      --high-priority[=BOOL]            Try to set high nice level\n"
+"                                        (only available as root, when SUID "
+"or\n"
+"                                        with elevated RLIMIT_NICE)\n"
+"      --realtime[=BOOL]                 Try to enable realtime scheduling\n"
+"                                        (only available as root, when SUID "
+"or\n"
+"                                        with elevated RLIMIT_RTPRIO)\n"
+"      --disallow-module-loading[=BOOL]  Disallow module user requested "
+"module\n"
+"                                        loading/unloading after startup\n"
+"      --disallow-exit[=BOOL]            Disallow user requested exit\n"
+"      --exit-idle-time=SECS             Terminate the daemon when idle and "
+"this\n"
+"                                        time passed\n"
+"      --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"
+"                                        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-time[=BOOL]                 Include timestamps in log messages\n"
+"      --log-backtrace=FRAMES            Include a backtrace in log messages\n"
+"  -p, --dl-search-path=PATH             Set the search path for dynamic "
+"shared\n"
+"                                        objects (plugins)\n"
+"      --resample-method=METHOD          Use the specified resampling method\n"
+"                                        (See --dump-resample-methods for\n"
+"                                        possible values)\n"
+"      --use-pid-file[=BOOL]             Create a PID file\n"
+"      --no-cpu-limit[=BOOL]             Do not install CPU load limiter on\n"
+"                                        platforms that support it.\n"
+"      --disable-shm[=BOOL]              Disable shared memory support.\n"
+"\n"
+"STARTUP SCRIPT:\n"
+"  -L, --load=\"MODULE ARGUMENTS\"         Load the specified plugin module "
+"with\n"
+"                                        the specified argument\n"
+"  -F, --file=FILENAME                   Run the specified script\n"
+"  -C                                    Open a command line on the running "
+"TTY\n"
+"                                        after startup\n"
+"\n"
+"  -n                                    Don't load default script file\n"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:247
+msgid "--daemonize expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:254
+msgid "--fail expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:264
+msgid ""
+"--log-level expects log level argument (either numeric in range 0..4 or one "
+"of debug, info, notice, warn, error)."
+msgstr ""
+
+#: ../src/daemon/cmdline.c:276
+msgid "--high-priority expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:283
+msgid "--realtime expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:290
+msgid "--disallow-module-loading expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:297
+msgid "--disallow-exit expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:304
+msgid "--use-pid-file expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:321
+msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
+msgstr ""
+
+#: ../src/daemon/cmdline.c:328
+msgid "--log-time expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:335
+msgid "--log-meta expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:354
+#, c-format
+msgid "Invalid resample method '%s'."
+msgstr ""
+
+#: ../src/daemon/cmdline.c:361
+msgid "--system expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:368
+msgid "--no-cpu-limit expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:375
+msgid "--disable-shm expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:60
+#, c-format
+msgid "Name: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:63
+#, c-format
+msgid "No module information available\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:66
+#, c-format
+msgid "Version: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:68
+#, c-format
+msgid "Description: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:70
+#, c-format
+msgid "Author: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:72
+#, c-format
+msgid "Usage: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:73
+#, c-format
+msgid "Load Once: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:75
+#, c-format
+msgid "DEPRECATION WARNING: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:79
+#, c-format
+msgid "Path: %s\n"
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:232
+#, c-format
+msgid "[%s:%u] Invalid log target '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:248
+#, c-format
+msgid "[%s:%u] Invalid log level '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:264
+#, c-format
+msgid "[%s:%u] Invalid resample method '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:287
+#, c-format
+msgid "[%s:%u] Invalid rlimit '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:294
+#, c-format
+msgid "[%s:%u] rlimit not supported on this platform."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:310
+#, c-format
+msgid "[%s:%u] Invalid sample format '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:328
+#, c-format
+msgid "[%s:%u] Invalid sample rate '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:352
+#, c-format
+msgid "[%s:%u] Invalid sample channels '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:370
+#, c-format
+msgid "[%s:%u] Invalid channel map '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:388
+#, c-format
+msgid "[%s:%u] Invalid number of fragments '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:406
+#, c-format
+msgid "[%s:%u] Invalid fragment size '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:424
+#, c-format
+msgid "[%s:%u] Invalid nice level '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:546
+#, c-format
+msgid "Failed to open configuration file: %s"
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:562
+msgid ""
+"The specified default channel map has a different number of channels than "
+"the specified default number of channels."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:638
+#, c-format
+msgid "### Read from configuration file: %s ###\n"
+msgstr ""
+
+#: ../src/daemon/caps.c:62
+msgid "Cleaning up privileges."
+msgstr ""
+
+#: ../src/daemon/pulseaudio.desktop.in.h:1
+msgid "PulseAudio Sound System"
+msgstr ""
+
+#: ../src/daemon/pulseaudio.desktop.in.h:2
+msgid "Start the PulseAudio Sound System"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757
+msgid "Mono"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:107
+msgid "Front Center"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:108
+msgid "Front Left"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:109
+msgid "Front Right"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:111
+msgid "Rear Center"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:112
+msgid "Rear Left"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:113
+msgid "Rear Right"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:115
+msgid "Low Frequency Emmiter"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:117
+msgid "Front Left-of-center"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:118
+msgid "Front Right-of-center"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:120
+msgid "Side Left"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:121
+msgid "Side Right"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:123
+msgid "Auxiliary 0"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:124
+msgid "Auxiliary 1"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:125
+msgid "Auxiliary 2"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:126
+msgid "Auxiliary 3"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:127
+msgid "Auxiliary 4"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:128
+msgid "Auxiliary 5"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:129
+msgid "Auxiliary 6"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:130
+msgid "Auxiliary 7"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:131
+msgid "Auxiliary 8"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:132
+msgid "Auxiliary 9"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:133
+msgid "Auxiliary 10"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:134
+msgid "Auxiliary 11"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:135
+msgid "Auxiliary 12"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:136
+msgid "Auxiliary 13"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:137
+msgid "Auxiliary 14"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:138
+msgid "Auxiliary 15"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:139
+msgid "Auxiliary 16"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:140
+msgid "Auxiliary 17"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:141
+msgid "Auxiliary 18"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:142
+msgid "Auxiliary 19"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:143
+msgid "Auxiliary 20"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:144
+msgid "Auxiliary 21"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:145
+msgid "Auxiliary 22"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:146
+msgid "Auxiliary 23"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:147
+msgid "Auxiliary 24"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:148
+msgid "Auxiliary 25"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:149
+msgid "Auxiliary 26"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:150
+msgid "Auxiliary 27"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:151
+msgid "Auxiliary 28"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:152
+msgid "Auxiliary 29"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:153
+msgid "Auxiliary 30"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:154
+msgid "Auxiliary 31"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:156
+msgid "Top Center"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:158
+msgid "Top Front Center"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:159
+msgid "Top Front Left"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:160
+msgid "Top Front Right"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:162
+msgid "Top Rear Center"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:163
+msgid "Top Rear Left"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:164
+msgid "Top Rear Right"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170
+#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321
+#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371
+msgid "(invalid)"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:761
+msgid "Stereo"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:766
+msgid "Surround 4.0"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:772
+msgid "Surround 4.1"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:778
+msgid "Surround 5.0"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:784
+msgid "Surround 5.1"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:791
+msgid "Surround 7.1"
+msgstr ""
+
+#: ../src/pulse/error.c:43
+msgid "OK"
+msgstr ""
+
+#: ../src/pulse/error.c:44
+msgid "Access denied"
+msgstr ""
+
+#: ../src/pulse/error.c:45
+msgid "Unknown command"
+msgstr ""
+
+#: ../src/pulse/error.c:46
+msgid "Invalid argument"
+msgstr ""
+
+#: ../src/pulse/error.c:47
+msgid "Entity exists"
+msgstr ""
+
+#: ../src/pulse/error.c:48
+msgid "No such entity"
+msgstr ""
+
+#: ../src/pulse/error.c:49
+msgid "Connection refused"
+msgstr ""
+
+#: ../src/pulse/error.c:50
+msgid "Protocol error"
+msgstr ""
+
+#: ../src/pulse/error.c:51
+msgid "Timeout"
+msgstr ""
+
+#: ../src/pulse/error.c:52
+msgid "No authorization key"
+msgstr ""
+
+#: ../src/pulse/error.c:53
+msgid "Internal error"
+msgstr ""
+
+#: ../src/pulse/error.c:54
+msgid "Connection terminated"
+msgstr ""
+
+#: ../src/pulse/error.c:55
+msgid "Entity killed"
+msgstr ""
+
+#: ../src/pulse/error.c:56
+msgid "Invalid server"
+msgstr ""
+
+#: ../src/pulse/error.c:57
+msgid "Module initalization failed"
+msgstr ""
+
+#: ../src/pulse/error.c:58
+msgid "Bad state"
+msgstr ""
+
+#: ../src/pulse/error.c:59
+msgid "No data"
+msgstr ""
+
+#: ../src/pulse/error.c:60
+msgid "Incompatible protocol version"
+msgstr ""
+
+#: ../src/pulse/error.c:61
+msgid "Too large"
+msgstr ""
+
+#: ../src/pulse/error.c:62
+msgid "Not supported"
+msgstr ""
+
+#: ../src/pulse/error.c:63
+msgid "Unknown error code"
+msgstr ""
+
+#: ../src/pulse/error.c:64
+msgid "No such extension"
+msgstr ""
+
+#: ../src/pulse/error.c:65
+msgid "Obsolete functionality"
+msgstr ""
+
+#: ../src/pulse/error.c:66
+msgid "Missing implementation"
+msgstr ""
+
+#: ../src/pulse/error.c:67
+msgid "Client forked"
+msgstr ""
+
+#: ../src/pulse/error.c:68
+msgid "Input/Output error"
+msgstr ""
+
+#: ../src/pulse/error.c:69
+msgid "Device or resource busy"
+msgstr ""
+
+#: ../src/pulse/sample.c:172
+#, c-format
+msgid "%s %uch %uHz"
+msgstr ""
+
+#: ../src/pulse/sample.c:184
+#, c-format
+msgid "%0.1f GiB"
+msgstr ""
+
+#: ../src/pulse/sample.c:186
+#, c-format
+msgid "%0.1f MiB"
+msgstr ""
+
+#: ../src/pulse/sample.c:188
+#, c-format
+msgid "%0.1f KiB"
+msgstr ""
+
+#: ../src/pulse/sample.c:190
+#, c-format
+msgid "%u B"
+msgstr ""
+
+#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100
+msgid "XOpenDisplay() failed"
+msgstr ""
+
+#: ../src/pulse/client-conf-x11.c:93
+msgid "Failed to parse cookie data"
+msgstr ""
+
+#: ../src/pulse/client-conf.c:111
+#, c-format
+msgid "Failed to open configuration file '%s': %s"
+msgstr ""
+
+#: ../src/pulse/context.c:550
+msgid "No cookie loaded. Attempting to connect without."
+msgstr ""
+
+#: ../src/pulse/context.c:693
+#, c-format
+msgid "fork(): %s"
+msgstr ""
+
+#: ../src/pulse/context.c:748
+#, c-format
+msgid "waitpid(): %s"
+msgstr ""
+
+#: ../src/pulse/context.c:1438
+#, c-format
+msgid "Received message for unknown extension '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:108
+#, c-format
+msgid "Failed to drain stream: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:113
+msgid "Playback stream drained."
+msgstr ""
+
+#: ../src/utils/pacat.c:123
+msgid "Draining connection to server."
+msgstr ""
+
+#: ../src/utils/pacat.c:136
+#, c-format
+msgid "pa_stream_drain(): %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:159
+#, c-format
+msgid "pa_stream_write() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:197
+#, c-format
+msgid "pa_stream_begin_write() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#, c-format
+msgid "pa_stream_peek() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:307
+msgid "Stream successfully created."
+msgstr ""
+
+#: ../src/utils/pacat.c:310
+#, c-format
+msgid "pa_stream_get_buffer_attr() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:314
+#, c-format
+msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
+msgstr ""
+
+#: ../src/utils/pacat.c:317
+#, c-format
+msgid "Buffer metrics: maxlength=%u, fragsize=%u"
+msgstr ""
+
+#: ../src/utils/pacat.c:321
+#, c-format
+msgid "Using sample spec '%s', channel map '%s'."
+msgstr ""
+
+#: ../src/utils/pacat.c:325
+#, c-format
+msgid "Connected to device %s (%u, %ssuspended)."
+msgstr ""
+
+#: ../src/utils/pacat.c:335
+#, c-format
+msgid "Stream error: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:345
+#, c-format
+msgid "Stream device suspended.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:347
+#, c-format
+msgid "Stream device resumed.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:355
+#, c-format
+msgid "Stream underrun.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:362
+#, c-format
+msgid "Stream overrun.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:369
+#, c-format
+msgid "Stream started.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:376
+#, c-format
+msgid "Stream moved to device %s (%u, %ssuspended).%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:376
+msgid "not "
+msgstr ""
+
+#: ../src/utils/pacat.c:383
+#, c-format
+msgid "Stream buffer attributes changed.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:415
+#, c-format
+msgid "Connection established.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:418
+#, c-format
+msgid "pa_stream_new() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:450
+#, c-format
+msgid "pa_stream_connect_playback() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:456
+#, c-format
+msgid "pa_stream_connect_record() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#, c-format
+msgid "Connection failure: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:503
+msgid "Got EOF."
+msgstr ""
+
+#: ../src/utils/pacat.c:540
+#, c-format
+msgid "write() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:561
+msgid "Got signal, exiting."
+msgstr ""
+
+#: ../src/utils/pacat.c:575
+#, c-format
+msgid "Failed to get latency: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:580
+#, c-format
+msgid "Time: %0.3f sec; Latency: %0.0f usec."
+msgstr ""
+
+#: ../src/utils/pacat.c:599
+#, c-format
+msgid "pa_stream_update_timing_info() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:609
+#, c-format
+msgid ""
+"%s [options]\n"
+"\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"\n"
+"  -r, --record                          Create a connection for recording\n"
+"  -p, --playback                        Create a connection for playback\n"
+"\n"
+"  -v, --verbose                         Enable verbose operations\n"
+"\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
+"  -d, --device=DEVICE                   The name of the sink/source to "
+"connect to\n"
+"  -n, --client-name=NAME                How to call this client on the "
+"server\n"
+"      --stream-name=NAME                How to call this stream on the "
+"server\n"
+"      --volume=VOLUME                   Specify the initial (linear) volume "
+"in range 0...65536\n"
+"      --rate=SAMPLERATE                 The sample rate in Hz (defaults to "
+"44100)\n"
+"      --format=SAMPLEFORMAT             The sample type, one of s16le, "
+"s16be, u8, float32le,\n"
+"                                        float32be, ulaw, alaw, s32le, s32be, "
+"s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to "
+"s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, "
+"2 for stereo\n"
+"                                        (defaults to 2)\n"
+"      --channel-map=CHANNELMAP          Channel map to use instead of the "
+"default\n"
+"      --fix-format                      Take the sample format from the sink "
+"the stream is\n"
+"                                        being connected to.\n"
+"      --fix-rate                        Take the sampling rate from the sink "
+"the stream is\n"
+"                                        being connected to.\n"
+"      --fix-channels                    Take the number of channels and the "
+"channel map\n"
+"                                        from the sink the stream is being "
+"connected to.\n"
+"      --no-remix                        Don't upmix or downmix channels.\n"
+"      --no-remap                        Map channels by index instead of "
+"name.\n"
+"      --latency=BYTES                   Request the specified latency in "
+"bytes.\n"
+"      --process-time=BYTES              Request the specified process time "
+"per request in bytes.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the "
+"specified value.\n"
+"      --raw                             Record/play raw PCM data.\n"
+"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --list-file-formats               List available file formats.\n"
+msgstr ""
+
+#: ../src/utils/pacat.c:731
+#, c-format
+msgid ""
+"pacat %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
+msgstr ""
+
+#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#, c-format
+msgid "Invalid client name '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:779
+#, c-format
+msgid "Invalid stream name '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:816
+#, c-format
+msgid "Invalid channel map '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:845
+#, c-format
+msgid "Invalid latency specification '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:852
+#, c-format
+msgid "Invalid process time specification '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:864
+#, c-format
+msgid "Invalid property '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:881
+#, c-format
+msgid "Unknown file format %s."
+msgstr ""
+
+#: ../src/utils/pacat.c:900
+msgid "Invalid sample specification"
+msgstr ""
+
+#: ../src/utils/pacat.c:910
+#, c-format
+msgid "open(): %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:915
+#, c-format
+msgid "dup2(): %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:922
+msgid "Too many arguments."
+msgstr ""
+
+#: ../src/utils/pacat.c:933
+msgid "Failed to generate sample specification for file."
+msgstr ""
+
+#: ../src/utils/pacat.c:953
+msgid "Failed to open audio file."
+msgstr ""
+
+#: ../src/utils/pacat.c:959
+msgid ""
+"Warning: specified sample specification will be overwritten with "
+"specification from file."
+msgstr ""
+
+#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+msgid "Failed to determine sample specification from file."
+msgstr ""
+
+#: ../src/utils/pacat.c:971
+msgid "Warning: Failed to determine channel map from file."
+msgstr ""
+
+#: ../src/utils/pacat.c:982
+msgid "Channel map doesn't match sample specification"
+msgstr ""
+
+#: ../src/utils/pacat.c:993
+msgid "Warning: failed to write channel map to file."
+msgstr ""
+
+#: ../src/utils/pacat.c:1008
+#, c-format
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr ""
+
+#: ../src/utils/pacat.c:1009
+msgid "recording"
+msgstr ""
+
+#: ../src/utils/pacat.c:1009
+msgid "playback"
+msgstr ""
+
+#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+msgid "pa_mainloop_new() failed."
+msgstr ""
+
+#: ../src/utils/pacat.c:1054
+msgid "io_new() failed."
+msgstr ""
+
+#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+msgid "pa_context_new() failed."
+msgstr ""
+
+#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#, c-format
+msgid "pa_context_connect() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:1075
+msgid "pa_context_rttime_new() failed."
+msgstr ""
+
+#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+msgid "pa_mainloop_run() failed."
+msgstr ""
+
+#: ../src/utils/pasuspender.c:81
+#, c-format
+msgid "fork(): %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:92
+#, c-format
+msgid "execvp(): %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:109
+#, c-format
+msgid "Failure to suspend: %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:124
+#, c-format
+msgid "Failure to resume: %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:147
+#, c-format
+msgid "WARNING: Sound server is not local, not suspending.\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:159
+#, c-format
+msgid "Connection failure: %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:176
+#, c-format
+msgid "Got SIGINT, exiting.\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:194
+#, c-format
+msgid "WARNING: Child process terminated by signal %u\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:212
+#, c-format
+msgid ""
+"%s [options] ... \n"
+"\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
+"\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:248
+#, c-format
+msgid ""
+"pasuspender %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:277
+#, c-format
+msgid "pa_mainloop_new() failed.\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:290
+#, c-format
+msgid "pa_context_new() failed.\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:298
+#, c-format
+msgid "pa_mainloop_run() failed.\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:135
+#, c-format
+msgid "Failed to get statistics: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:141
+#, c-format
+msgid "Currently in use: %u blocks containing %s bytes total.\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:144
+#, c-format
+msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:147
+#, c-format
+msgid "Sample cache size: %s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:156
+#, c-format
+msgid "Failed to get server information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:164
+#, c-format
+msgid ""
+"User name: %s\n"
+"Host Name: %s\n"
+"Server Name: %s\n"
+"Server Version: %s\n"
+"Default Sample Specification: %s\n"
+"Default Channel Map: %s\n"
+"Default Sink: %s\n"
+"Default Source: %s\n"
+"Cookie: %08x\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:205
+#, c-format
+msgid "Failed to get sink information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:221
+#, c-format
+msgid ""
+"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:268 ../src/utils/pactl.c:360
+#, c-format
+msgid "\tPorts:\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#, c-format
+msgid "\tActive Port: %s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:297
+#, c-format
+msgid "Failed to get source information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:313
+#, c-format
+msgid ""
+"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:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
+#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
+#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
+#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
+#: ../src/utils/pactl.c:645
+msgid "n/a"
+msgstr ""
+
+#: ../src/utils/pactl.c:375
+#, c-format
+msgid "Failed to get module information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:393
+#, c-format
+msgid ""
+"Module #%u\n"
+"\tName: %s\n"
+"\tArgument: %s\n"
+"\tUsage counter: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:412
+#, c-format
+msgid "Failed to get client information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:430
+#, c-format
+msgid ""
+"Client #%u\n"
+"\tDriver: %s\n"
+"\tOwner Module: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:447
+#, c-format
+msgid "Failed to get card information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:465
+#, c-format
+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:479
+#, c-format
+msgid "\tProfiles:\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:485
+#, c-format
+msgid "\tActive Profile: %s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:496
+#, c-format
+msgid "Failed to get sink input information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:515
+#, c-format
+msgid ""
+"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:554
+#, c-format
+msgid "Failed to get source output information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:574
+#, c-format
+msgid ""
+"Source Output #%u\n"
+"\tDriver: %s\n"
+"\tOwner Module: %s\n"
+"\tClient: %s\n"
+"\tSource: %u\n"
+"\tSample Specification: %s\n"
+"\tChannel Map: %s\n"
+"\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:605
+#, c-format
+msgid "Failed to get sample information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:623
+#, c-format
+msgid ""
+"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:653 ../src/utils/pactl.c:663
+#, c-format
+msgid "Failure: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:687
+#, c-format
+msgid "Failed to upload sample: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:704
+msgid "Premature end of file"
+msgstr ""
+
+#: ../src/utils/pactl.c:863
+msgid "Got SIGINT, exiting."
+msgstr ""
+
+#: ../src/utils/pactl.c:869
+#, c-format
+msgid ""
+"%s [options] stat\n"
+"%s [options] list\n"
+"%s [options] exit\n"
+"%s [options] upload-sample FILENAME [NAME]\n"
+"%s [options] play-sample NAME [SINK]\n"
+"%s [options] remove-sample NAME\n"
+"%s [options] move-sink-input SINKINPUT SINK\n"
+"%s [options] move-source-output SOURCEOUTPUT SOURCE\n"
+"%s [options] load-module NAME [ARGS ...]\n"
+"%s [options] unload-module MODULE\n"
+"%s [options] suspend-sink SINK 1|0\n"
+"%s [options] suspend-source SOURCE 1|0\n"
+"%s [options] set-card-profile CARD PROFILE\n"
+"%s [options] set-sink-port SINK PORT\n"
+"%s [options] set-source-port SOURCE PORT\n"
+"%s [options] set-sink-volume SINK VOLUME\n"
+"%s [options] set-source-volume SOURCE VOLUME\n"
+"%s [options] set-sink-input-volume SINKINPUT VOLUME\n"
+"%s [options] set-sink-mute SINK 1|0\n"
+"%s [options] set-source-mute SOURCE 1|0\n"
+"%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"\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"
+msgstr ""
+
+#: ../src/utils/pactl.c:933
+#, c-format
+msgid ""
+"pactl %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:979
+msgid "Please specify a sample file to load"
+msgstr ""
+
+#: ../src/utils/pactl.c:992
+msgid "Failed to open sound file."
+msgstr ""
+
+#: ../src/utils/pactl.c:1004
+msgid "Warning: Failed to determine sample specification from file."
+msgstr ""
+
+#: ../src/utils/pactl.c:1014
+msgid "You have to specify a sample name to play"
+msgstr ""
+
+#: ../src/utils/pactl.c:1026
+msgid "You have to specify a sample name to remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:1035
+msgid "You have to specify a sink input index and a sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:1045
+msgid "You have to specify a source output index and a source"
+msgstr ""
+
+#: ../src/utils/pactl.c:1060
+msgid "You have to specify a module name and arguments."
+msgstr ""
+
+#: ../src/utils/pactl.c:1080
+msgid "You have to specify a module index"
+msgstr ""
+
+#: ../src/utils/pactl.c:1090
+msgid "You may not specify more than one sink. You have to specify a boolean value."
+msgstr ""
+
+#: ../src/utils/pactl.c:1103
+msgid ""
+"You may not specify more than one source. You have to specify a boolean "
+"value."
+msgstr ""
+
+#: ../src/utils/pactl.c:1115
+msgid "You have to specify a card name/index and a profile name"
+msgstr ""
+
+#: ../src/utils/pactl.c:1126
+msgid "You have to specify a sink name/index and a port name"
+msgstr ""
+
+#: ../src/utils/pactl.c:1137
+msgid "You have to specify a source name/index and a port name"
+msgstr ""
+
+#: ../src/utils/pactl.c:1149
+msgid "You have to specify a sink name/index and a volume"
+msgstr ""
+
+#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
+#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
+#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+msgid "Invalid volume specification"
+msgstr ""
+
+#: ../src/utils/pactl.c:1166
+msgid "You have to specify a source name/index and a volume"
+msgstr ""
+
+#: ../src/utils/pactl.c:1183
+msgid "You have to specify a sink input index and a volume"
+msgstr ""
+
+#: ../src/utils/pactl.c:1188
+msgid "Invalid sink input index"
+msgstr ""
+
+#: ../src/utils/pactl.c:1204
+msgid "You have to specify a sink name/index and a mute boolean"
+msgstr ""
+
+#: ../src/utils/pactl.c:1221
+msgid "You have to specify a source name/index and a mute boolean"
+msgstr ""
+
+#: ../src/utils/pactl.c:1238
+msgid "You have to specify a sink input index and a mute boolean"
+msgstr ""
+
+#: ../src/utils/pactl.c:1243
+msgid "Invalid sink input index specification"
+msgstr ""
+
+#: ../src/utils/pactl.c:1262
+msgid "No valid command specified."
+msgstr ""
+
+#: ../src/utils/pax11publish.c:61
+#, c-format
+msgid ""
+"%s [-D display] [-S server] [-O sink] [-I source] [-c file]  [-d|-e|-i|-r]\n"
+"\n"
+" -d    Show current PulseAudio data attached to X11 display (default)\n"
+" -e    Export local PulseAudio data to X11 display\n"
+" -i    Import PulseAudio data from X11 display to local environment "
+"variables and cookie file.\n"
+" -r    Remove PulseAudio data from X11 display\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:94
+#, c-format
+msgid "Failed to parse command line.\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:108
+#, c-format
+msgid "Server: %s\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:110
+#, c-format
+msgid "Source: %s\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:112
+#, c-format
+msgid "Sink: %s\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:114
+#, c-format
+msgid "Cookie: %s\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:132
+#, c-format
+msgid "Failed to parse cookie data\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:137
+#, c-format
+msgid "Failed to save cookie data\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:152
+#, c-format
+msgid "Failed to load client configuration file.\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:157
+#, c-format
+msgid "Failed to read environment configuration data.\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:174
+#, c-format
+msgid "Failed to get FQDN.\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:194
+#, c-format
+msgid "Failed to load cookie data\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:211
+#, c-format
+msgid "Not yet implemented.\n"
+msgstr ""
+
+#: ../src/utils/pacmd.c:69
+msgid "No PulseAudio daemon running, or not running as session daemon."
+msgstr ""
+
+#: ../src/utils/pacmd.c:74
+#, c-format
+msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
+msgstr ""
+
+#: ../src/utils/pacmd.c:91
+#, c-format
+msgid "connect(): %s"
+msgstr ""
+
+#: ../src/utils/pacmd.c:99
+msgid "Failed to kill PulseAudio daemon."
+msgstr ""
+
+#: ../src/utils/pacmd.c:107
+msgid "Daemon not responding."
+msgstr ""
+
+#: ../src/utils/pacmd.c:161
+#, c-format
+msgid "poll(): %s"
+msgstr ""
+
+#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#, c-format
+msgid "read(): %s"
+msgstr ""
+
+#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#, c-format
+msgid "write(): %s"
+msgstr ""
+
+#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+msgid "Cannot access autospawn lock."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
+#, c-format
+msgid ""
+"ALSA woke us up to write new data to the device, but there was actually "
+"nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
+#, c-format
+msgid ""
+"ALSA woke us up to read new data from the device, but there was actually "
+"nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
+msgstr ""
+
+#: ../src/modules/alsa/module-alsa-card.c:152
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
+#: ../src/modules/alsa/alsa-mixer.c:2931
+msgid "Off"
+msgstr ""
+
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+msgid "High Fidelity Playback (A2DP)"
+msgstr ""
+
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+msgid "High Fidelity Capture (A2DP)"
+msgstr ""
+
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+msgid "Telephony Duplex (HSP/HFP)"
+msgstr ""
+
+#: ../src/modules/reserve-wrap.c:151
+msgid "PulseAudio Sound Server"
+msgstr ""
+
+#: ../src/modules/module-rygel-media-server.c:569
+#: ../src/modules/module-rygel-media-server.c:583
+msgid "Output Devices"
+msgstr ""
+
+#: ../src/modules/module-rygel-media-server.c:570
+#: ../src/modules/module-rygel-media-server.c:584
+msgid "Input Devices"
+msgstr ""
+
+#: ../src/modules/module-rygel-media-server.c:774
+msgid "Audio on @HOSTNAME@"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1701
+msgid "Input"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1702
+msgid "Docking Station Input"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1703
+msgid "Docking Station Microphone"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1704
+msgid "Line-In"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1705
+msgid "Microphone"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1706
+msgid "External Microphone"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1707
+msgid "Internal Microphone"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1708
+msgid "Radio"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1709
+msgid "Video"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1710
+msgid "Automatic Gain Control"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1711
+msgid "No Automatic Gain Control"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1712
+msgid "Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1713
+msgid "No Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1714
+msgid "Amplifier"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1715
+msgid "No Amplifier"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1773
+msgid "Analog Input"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1774
+msgid "Analog Microphone"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1775
+msgid "Analog Line-In"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1776
+msgid "Analog Radio"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
+msgid "Analog Video"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1778
+msgid "Analog Output"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1779
+msgid "Analog Headphones"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1780
+msgid "Analog Output (LFE)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1781
+msgid "Analog Mono Output"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1981
+#, c-format
+msgid "%s+%s"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#, c-format
+msgid "%s / %s"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2790
+msgid "Analog Mono"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2791
+msgid "Analog Stereo"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2792
+msgid "Analog Surround 2.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2793
+msgid "Analog Surround 3.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2794
+msgid "Analog Surround 3.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2795
+msgid "Analog Surround 4.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2796
+msgid "Analog Surround 4.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2797
+msgid "Analog Surround 5.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2798
+msgid "Analog Surround 5.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2799
+msgid "Analog Surround 6.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2800
+msgid "Analog Surround 6.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2801
+msgid "Analog Surround 7.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2802
+msgid "Analog Surround 7.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2803
+msgid "Digital Stereo (IEC958)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2804
+msgid "Digital Surround 4.0 (IEC958)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2805
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2806
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2807
+msgid "Digital Stereo (HDMI)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2928
+msgid "Analog Mono Duplex"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2929
+msgid "Analog Stereo Duplex"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2930
+msgid "Digital Stereo Duplex (IEC958)"
+msgstr ""
+

commit 9fe8850951022159808df9c4a7bbe4117dae41e5
Author: shanky <shanky at fedoraproject.org>
Date:   Thu Dec 10 12:10:17 2009 +0000

    Sending translation for Kannada

diff --git a/po/kn.po b/po/kn.po
index 4b2750a..f11ef80 100644
--- a/po/kn.po
+++ b/po/kn.po
@@ -7,14 +7,14 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.kn\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-22 15:32+0530\n"
+"POT-Creation-Date: 2009-12-07 02:45+0000\n"
+"PO-Revision-Date: 2009-12-08 11:50+0530\n"
 "Last-Translator: Shankar Prasad <svenkate at redhat.com>\n"
-"Language-Team: Kannada <en at li.org>\n"
+"Language-Team: Kannada <kde-l10n-kn at kde.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.11.4\n"
+"X-Generator: Lokalize 1.0\n"
 "Plural-Forms:  nplurals=2; plural=(n != 1);\n"
 
 #: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
@@ -320,8 +320,7 @@ msgstr "NDEBUG ಅನ್ನು ಸೂಚಿಸಲಾಗಿದೆ, ಎಲ್ಲ
 
 #: ../src/daemon/main.c:760
 msgid "FASTPATH defined, only fast path asserts disabled."
-msgstr ""
-"FASTPATH ಅನ್ನು ಸೂಚಿಸಲಾಗಿದೆ, ಕೇವಲ ವೇಗ ಮಾರ್ಗದ ಪ್ರತಿಪಾದನೆಗಳನ್ನೂ ಅಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ."
+msgstr "FASTPATH ಅನ್ನು ಸೂಚಿಸಲಾಗಿದೆ, ಕೇವಲ ವೇಗ ಮಾರ್ಗದ ಪ್ರತಿಪಾದನೆಗಳನ್ನೂ ಅಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ."
 
 #: ../src/daemon/main.c:762
 msgid "All asserts enabled."
@@ -1512,8 +1511,7 @@ msgstr "ಧ್ವನಿ ಕಡತವನ್ನು ತೆರೆಯುವಲ್ಲ
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
-msgstr ""
-"ಎಚ್ಚರಿಕೆ: ಸೂಚಿಸಲಾದ ನಮೂನೆ ವಿವರಣೆಯನ್ನು ಕಡತದಲ್ಲಿನ ವಿವರಣೆಯಿಂದ ತಿದ್ದಿಬರೆಯಲಾಗುತ್ತದೆ."
+msgstr "ಎಚ್ಚರಿಕೆ: ಸೂಚಿಸಲಾದ ನಮೂನೆ ವಿವರಣೆಯನ್ನು ಕಡತದಲ್ಲಿನ ವಿವರಣೆಯಿಂದ ತಿದ್ದಿಬರೆಯಲಾಗುತ್ತದೆ."
 
 #: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
 msgid "Failed to determine sample specification from file."
@@ -1533,8 +1531,7 @@ msgstr "ಎಚ್ಚರಿಕೆ: ಕಡತಕ್ಕೆ ಚಾನಲ್ ನಕ
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
 "ಒಂದು %s ಸ್ಟ್ರೀಮ್‌ ಅನ್ನು ನಮೂನೆ ವಿವರಣೆ '%s' ಯೊಂದಿಗೆ ಹಾಗು ಚಾನಲ್ ನಕ್ಷೆ '%s' ಯೊಂದಿಗೆ "
 "ತೆರೆಯಲಾಗುತ್ತಿದೆ."
@@ -2126,8 +2123,7 @@ msgid "You have to specify a module index"
 msgstr "ನೀವು ಒಂದು ಘಟಕ ಸೂಚಿಯನ್ನು ಸೂಚಿಸಬೇಕು"
 
 #: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
+msgid "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 "ನೀವು ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಸಿಂಕನ್ನು ಸೂಚಿಸಲಾಗುವುದಿಲ್ಲ. ನೀವು ಒಂದು ಬೂಲಿಯನ್‌ ಮೌಲ್ಯವನ್ನು "
 "ಸೂಚಿಸಬೇಕಾಗುತ್ತದೆ."
@@ -2371,217 +2367,202 @@ msgstr "PulseAudio ಧ್ವನಿ ಪರಿಚಾರಕ"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "ಔಟ್‌ಪುಟ್ ಸಾಧನಗಳು"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "ಇನ್‌ಪುಟ್‌ ಸಾಧನಗಳು"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "@HOSTNAME@ ನಲ್ಲಿನ ಆಡಿಯೊ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "ಇನ್‌ಪುಟ್"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "ಡಾಕಿಂಗ್ ಸ್ಟೇಶನ್ ಇನ್‌ಪುಟ್"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "ಡಾಕಿಂಗ್ ಸ್ಟೇಶನ್ ಮೈಕ್ರೊಫೋನ್"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "ಲೈನ್-ಇನ್"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "ಮೈಕ್ರೊಫೋನ್"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "ಬಾಹ್ಯ ಮೈಕ್ರೊಫೋನ್"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "ಆಂತರಿಕ ಆಡಿಯೊ"
+msgstr "ಆಂತರಿಕ  ಮೈಕ್ರೊಫೋನ್"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "ರೇಡಿಯೊ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "ವೀಡಿಯೊ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "ಆಟೊಮ್ಯಾಟಿಕ್ ಗೇನ್ ಕಂಟ್ರೋಲ್"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "ಯಾವುದೆ ಆಟೊಮ್ಯಾಟಿಕ್ ಗೇನ್ ಕಂಟ್ರೋಲ್ ಇಲ್ಲ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "ಬೂಸ್ಟ್"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "ಯಾವುದೆ ಬೂಸ್ಟ್ ಇಲ್ಲ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "ಆಂಪ್ಲಿಫಯರ್"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "ಯಾವುದೆ ಆಂಪ್ಲಿಫಯರ್ ಇಲ್ಲ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "ಅನಲಾಗ್ ಇನ್‌ಪುಟ್"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "ಅನಲಾಗ್ ಮೈಕ್ರೊಫೋನ್"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "ಅನಲಾಗ್ ಲೈನ್-ಇನ್"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "ಅನಲಾಗ್ ರೇಡಿಯೊ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "ಅನಲಾಗ್ ವೀಡಿಯೊ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "ಶೂನ್ಯ ಔಟ್‌ಪುಟ್"
+msgstr "ಅನಲಾಗ್ ಔಟ್‌ಪುಟ್"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "ಅನಲಾಗ್ ಹೆಡ್‌ಫೋನ್‌ಗಳು"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "ಅನಲಾಗ್ ಔಟ್‌ಪುಟ್ (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "ಅನಲಾಗ್ ಮೊನೊ ಔಟ್‌ಪುಟ್"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#: ../src/modules/alsa/alsa-mixer.c:1981, c-format
 msgid "%s+%s"
-msgstr "%s %s"
+msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404, c-format
 msgid "%s / %s"
-msgstr "%s %s"
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "ಅನಲಾಗ್ ಮೊನೊ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
-#, fuzzy
 msgid "Analog Stereo"
-msgstr "ಸ್ಟೀರಿಯೋ"
+msgstr "ಅನಲಾಗ್ ಸ್ಟೀರಿಯೋ"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "ಸರೌಂಡ್‌ 4.1"
+msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "ಸರೌಂಡ್‌ 4.0"
+msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "ಸರೌಂಡ್‌ 4.1"
+msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
-#, fuzzy
 msgid "Analog Surround 4.0"
-msgstr "ಸರೌಂಡ್‌ 4.0"
+msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
-#, fuzzy
 msgid "Analog Surround 4.1"
-msgstr "ಸರೌಂಡ್‌ 4.1"
+msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
-#, fuzzy
 msgid "Analog Surround 5.0"
-msgstr "ಸರೌಂಡ್‌ 5.0"
+msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
-#, fuzzy
 msgid "Analog Surround 5.1"
-msgstr "ಸರೌಂಡ್‌ 5.1"
+msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "ಸರೌಂಡ್‌ 4.0"
+msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "ಸರೌಂಡ್‌ 4.1"
+msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "ಸರೌಂಡ್‌ 4.0"
+msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
-#, fuzzy
 msgid "Analog Surround 7.1"
-msgstr "ಸರೌಂಡ್‌ 7.1"
+msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "ಡಿಜಿಟಲ್ ಸ್ಟೀರಿಯೊ (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "ಡಿಜಿಟಲ್ ಸರೌಂಡ್ 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "ಡಿಜಿಟಲ್ ಸರೌಂಡ್ 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "ಡಿಜಿಟಲ್ ಸರೌಂಡ್ 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "ಡಿಜಿಟಲ್ ಸ್ಟೀರಿಯೊ (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "ಅನಲಾಗ್ ಮೊನೊ ಡ್ಯೂಪ್ಲೆಕ್ಸ್"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "ಅನಲಾಗ್ ಸ್ಟೀರಿಯೊ ಡ್ಯೂಪ್ಲೆಕ್ಸ್"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "ಅನಲಾಗ್ ಸ್ಟೀರಿಯೊ ಡ್ಯೂಪ್ಲೆಕ್ಸ್ (IEC958)"
+

commit aae0edeac60917c60147b10d3ad713b82f8c5ad8
Author: ypoyarko <ypoyarko at fedoraproject.org>
Date:   Fri Dec 11 00:44:53 2009 +0000

    Sending translation for Russian

diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 0000000..ef1918e
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,2239 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-10 20:05+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#, c-format
+msgid "%s %s"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1106
+#, c-format
+msgid ""
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
+"ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1147
+#, c-format
+msgid ""
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
+"lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1194
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/module-always-sink.c:39
+msgid "Always keeps at least one sink loaded even if it's a null one"
+msgstr ""
+
+#: ../src/modules/module-always-sink.c:83
+msgid "Dummy Output"
+msgstr ""
+
+#: ../src/modules/module-ladspa-sink.c:49
+msgid "Virtual LADSPA sink"
+msgstr ""
+
+#: ../src/modules/module-ladspa-sink.c:53
+msgid ""
+"sink_name=<name for the sink> sink_properties=<properties for the sink> "
+"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
+"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
+"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
+"input control values>"
+msgstr ""
+
+#: ../src/modules/module-null-sink.c:55
+msgid "Clocked NULL sink"
+msgstr ""
+
+#: ../src/modules/module-null-sink.c:291
+msgid "Null Output"
+msgstr ""
+
+#: ../src/pulsecore/sink.c:2613
+msgid "Internal Audio"
+msgstr ""
+
+#: ../src/pulsecore/sink.c:2618
+msgid "Modem"
+msgstr ""
+
+#: ../src/daemon/ltdl-bind-now.c:124
+msgid "Failed to find original lt_dlopen loader."
+msgstr ""
+
+#: ../src/daemon/ltdl-bind-now.c:129
+msgid "Failed to allocate new dl loader."
+msgstr ""
+
+#: ../src/daemon/ltdl-bind-now.c:142
+msgid "Failed to add bind-now-loader."
+msgstr ""
+
+#: ../src/daemon/main.c:141
+#, c-format
+msgid "Got signal %s."
+msgstr ""
+
+#: ../src/daemon/main.c:168
+msgid "Exiting."
+msgstr ""
+
+#: ../src/daemon/main.c:186
+#, c-format
+msgid "Failed to find user '%s'."
+msgstr ""
+
+#: ../src/daemon/main.c:191
+#, c-format
+msgid "Failed to find group '%s'."
+msgstr ""
+
+#: ../src/daemon/main.c:195
+#, c-format
+msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
+msgstr ""
+
+#: ../src/daemon/main.c:200
+#, c-format
+msgid "GID of user '%s' and of group '%s' don't match."
+msgstr ""
+
+#: ../src/daemon/main.c:205
+#, c-format
+msgid "Home directory of user '%s' is not '%s', ignoring."
+msgstr ""
+
+#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#, c-format
+msgid "Failed to create '%s': %s"
+msgstr ""
+
+#: ../src/daemon/main.c:220
+#, c-format
+msgid "Failed to change group list: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:236
+#, c-format
+msgid "Failed to change GID: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:252
+#, c-format
+msgid "Failed to change UID: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:271
+msgid "Successfully dropped root privileges."
+msgstr ""
+
+#: ../src/daemon/main.c:279
+msgid "System wide mode unsupported on this platform."
+msgstr ""
+
+#: ../src/daemon/main.c:297
+#, c-format
+msgid "setrlimit(%s, (%u, %u)) failed: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:474
+msgid "Failed to parse command line."
+msgstr ""
+
+#: ../src/daemon/main.c:541
+msgid "Daemon not running"
+msgstr ""
+
+#: ../src/daemon/main.c:543
+#, c-format
+msgid "Daemon running as PID %u"
+msgstr ""
+
+#: ../src/daemon/main.c:553
+#, c-format
+msgid "Failed to kill daemon: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:571
+msgid ""
+"This program is not intended to be run as root (unless --system is "
+"specified)."
+msgstr ""
+
+#: ../src/daemon/main.c:573
+msgid "Root privileges required."
+msgstr ""
+
+#: ../src/daemon/main.c:578
+msgid "--start not supported for system instances."
+msgstr ""
+
+#: ../src/daemon/main.c:583
+msgid "Running in system mode, but --disallow-exit not set!"
+msgstr ""
+
+#: ../src/daemon/main.c:586
+msgid "Running in system mode, but --disallow-module-loading not set!"
+msgstr ""
+
+#: ../src/daemon/main.c:589
+msgid "Running in system mode, forcibly disabling SHM mode!"
+msgstr ""
+
+#: ../src/daemon/main.c:594
+msgid "Running in system mode, forcibly disabling exit idle time!"
+msgstr ""
+
+#: ../src/daemon/main.c:621
+msgid "Failed to acquire stdio."
+msgstr ""
+
+#: ../src/daemon/main.c:627
+#, c-format
+msgid "pipe failed: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:632
+#, c-format
+msgid "fork() failed: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#, c-format
+msgid "read() failed: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:652
+msgid "Daemon startup failed."
+msgstr ""
+
+#: ../src/daemon/main.c:654
+msgid "Daemon startup successful."
+msgstr ""
+
+#: ../src/daemon/main.c:731
+#, c-format
+msgid "This is PulseAudio %s"
+msgstr ""
+
+#: ../src/daemon/main.c:732
+#, c-format
+msgid "Compilation host: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:733
+#, c-format
+msgid "Compilation CFLAGS: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:736
+#, c-format
+msgid "Running on host: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:739
+#, c-format
+msgid "Found %u CPUs."
+msgstr ""
+
+#: ../src/daemon/main.c:741
+#, c-format
+msgid "Page size is %lu bytes"
+msgstr ""
+
+#: ../src/daemon/main.c:744
+msgid "Compiled with Valgrind support: yes"
+msgstr ""
+
+#: ../src/daemon/main.c:746
+msgid "Compiled with Valgrind support: no"
+msgstr ""
+
+#: ../src/daemon/main.c:749
+#, c-format
+msgid "Running in valgrind mode: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:752
+msgid "Optimized build: yes"
+msgstr ""
+
+#: ../src/daemon/main.c:754
+msgid "Optimized build: no"
+msgstr ""
+
+#: ../src/daemon/main.c:758
+msgid "NDEBUG defined, all asserts disabled."
+msgstr ""
+
+#: ../src/daemon/main.c:760
+msgid "FASTPATH defined, only fast path asserts disabled."
+msgstr ""
+
+#: ../src/daemon/main.c:762
+msgid "All asserts enabled."
+msgstr ""
+
+#: ../src/daemon/main.c:766
+msgid "Failed to get machine ID"
+msgstr ""
+
+#: ../src/daemon/main.c:769
+#, c-format
+msgid "Machine ID is %s."
+msgstr ""
+
+#: ../src/daemon/main.c:773
+#, c-format
+msgid "Session ID is %s."
+msgstr ""
+
+#: ../src/daemon/main.c:779
+#, c-format
+msgid "Using runtime directory %s."
+msgstr ""
+
+#: ../src/daemon/main.c:784
+#, c-format
+msgid "Using state directory %s."
+msgstr ""
+
+#: ../src/daemon/main.c:787
+#, c-format
+msgid "Using modules directory %s."
+msgstr ""
+
+#: ../src/daemon/main.c:789
+#, c-format
+msgid "Running in system mode: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:792
+msgid ""
+"OK, so you are running PA in system mode. Please note that you most likely "
+"shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as "
+"expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
+"explanation why system mode is usually a bad idea."
+msgstr ""
+
+#: ../src/daemon/main.c:809
+msgid "pa_pid_file_create() failed."
+msgstr ""
+
+#: ../src/daemon/main.c:819
+msgid "Fresh high-resolution timers available! Bon appetit!"
+msgstr ""
+
+#: ../src/daemon/main.c:821
+msgid ""
+"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
+"resolution timers enabled!"
+msgstr ""
+
+#: ../src/daemon/main.c:844
+msgid "pa_core_new() failed."
+msgstr ""
+
+#: ../src/daemon/main.c:904
+msgid "Failed to initialize daemon."
+msgstr ""
+
+#: ../src/daemon/main.c:909
+msgid "Daemon startup without any loaded modules, refusing to work."
+msgstr ""
+
+#: ../src/daemon/main.c:926
+msgid "Daemon startup complete."
+msgstr ""
+
+#: ../src/daemon/main.c:932
+msgid "Daemon shutdown initiated."
+msgstr ""
+
+#: ../src/daemon/main.c:954
+msgid "Daemon terminated."
+msgstr ""
+
+#: ../src/daemon/cmdline.c:115
+#, c-format
+msgid ""
+"%s [options]\n"
+"\n"
+"COMMANDS:\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"      --dump-conf                       Dump default configuration\n"
+"      --dump-modules                    Dump list of available modules\n"
+"      --dump-resample-methods           Dump available resample methods\n"
+"      --cleanup-shm                     Cleanup stale shared memory "
+"segments\n"
+"      --start                           Start the daemon if it is not "
+"running\n"
+"  -k  --kill                            Kill a running daemon\n"
+"      --check                           Check for a running daemon (only "
+"returns exit code)\n"
+"\n"
+"OPTIONS:\n"
+"      --system[=BOOL]                   Run as system-wide instance\n"
+"  -D, --daemonize[=BOOL]                Daemonize after startup\n"
+"      --fail[=BOOL]                     Quit when startup fails\n"
+"      --high-priority[=BOOL]            Try to set high nice level\n"
+"                                        (only available as root, when SUID "
+"or\n"
+"                                        with elevated RLIMIT_NICE)\n"
+"      --realtime[=BOOL]                 Try to enable realtime scheduling\n"
+"                                        (only available as root, when SUID "
+"or\n"
+"                                        with elevated RLIMIT_RTPRIO)\n"
+"      --disallow-module-loading[=BOOL]  Disallow module user requested "
+"module\n"
+"                                        loading/unloading after startup\n"
+"      --disallow-exit[=BOOL]            Disallow user requested exit\n"
+"      --exit-idle-time=SECS             Terminate the daemon when idle and "
+"this\n"
+"                                        time passed\n"
+"      --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"
+"                                        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-time[=BOOL]                 Include timestamps in log messages\n"
+"      --log-backtrace=FRAMES            Include a backtrace in log messages\n"
+"  -p, --dl-search-path=PATH             Set the search path for dynamic "
+"shared\n"
+"                                        objects (plugins)\n"
+"      --resample-method=METHOD          Use the specified resampling method\n"
+"                                        (See --dump-resample-methods for\n"
+"                                        possible values)\n"
+"      --use-pid-file[=BOOL]             Create a PID file\n"
+"      --no-cpu-limit[=BOOL]             Do not install CPU load limiter on\n"
+"                                        platforms that support it.\n"
+"      --disable-shm[=BOOL]              Disable shared memory support.\n"
+"\n"
+"STARTUP SCRIPT:\n"
+"  -L, --load=\"MODULE ARGUMENTS\"         Load the specified plugin module "
+"with\n"
+"                                        the specified argument\n"
+"  -F, --file=FILENAME                   Run the specified script\n"
+"  -C                                    Open a command line on the running "
+"TTY\n"
+"                                        after startup\n"
+"\n"
+"  -n                                    Don't load default script file\n"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:247
+msgid "--daemonize expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:254
+msgid "--fail expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:264
+msgid ""
+"--log-level expects log level argument (either numeric in range 0..4 or one "
+"of debug, info, notice, warn, error)."
+msgstr ""
+
+#: ../src/daemon/cmdline.c:276
+msgid "--high-priority expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:283
+msgid "--realtime expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:290
+msgid "--disallow-module-loading expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:297
+msgid "--disallow-exit expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:304
+msgid "--use-pid-file expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:321
+msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
+msgstr ""
+
+#: ../src/daemon/cmdline.c:328
+msgid "--log-time expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:335
+msgid "--log-meta expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:354
+#, c-format
+msgid "Invalid resample method '%s'."
+msgstr ""
+
+#: ../src/daemon/cmdline.c:361
+msgid "--system expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:368
+msgid "--no-cpu-limit expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:375
+msgid "--disable-shm expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:60
+#, c-format
+msgid "Name: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:63
+#, c-format
+msgid "No module information available\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:66
+#, c-format
+msgid "Version: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:68
+#, c-format
+msgid "Description: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:70
+#, c-format
+msgid "Author: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:72
+#, c-format
+msgid "Usage: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:73
+#, c-format
+msgid "Load Once: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:75
+#, c-format
+msgid "DEPRECATION WARNING: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:79
+#, c-format
+msgid "Path: %s\n"
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:232
+#, c-format
+msgid "[%s:%u] Invalid log target '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:248
+#, c-format
+msgid "[%s:%u] Invalid log level '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:264
+#, c-format
+msgid "[%s:%u] Invalid resample method '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:287
+#, c-format
+msgid "[%s:%u] Invalid rlimit '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:294
+#, c-format
+msgid "[%s:%u] rlimit not supported on this platform."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:310
+#, c-format
+msgid "[%s:%u] Invalid sample format '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:328
+#, c-format
+msgid "[%s:%u] Invalid sample rate '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:352
+#, c-format
+msgid "[%s:%u] Invalid sample channels '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:370
+#, c-format
+msgid "[%s:%u] Invalid channel map '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:388
+#, c-format
+msgid "[%s:%u] Invalid number of fragments '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:406
+#, c-format
+msgid "[%s:%u] Invalid fragment size '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:424
+#, c-format
+msgid "[%s:%u] Invalid nice level '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:546
+#, c-format
+msgid "Failed to open configuration file: %s"
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:562
+msgid ""
+"The specified default channel map has a different number of channels than "
+"the specified default number of channels."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:638
+#, c-format
+msgid "### Read from configuration file: %s ###\n"
+msgstr ""
+
+#: ../src/daemon/caps.c:62
+msgid "Cleaning up privileges."
+msgstr ""
+
+#: ../src/daemon/pulseaudio.desktop.in.h:1
+msgid "PulseAudio Sound System"
+msgstr ""
+
+#: ../src/daemon/pulseaudio.desktop.in.h:2
+msgid "Start the PulseAudio Sound System"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757
+msgid "Mono"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:107
+msgid "Front Center"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:108
+msgid "Front Left"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:109
+msgid "Front Right"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:111
+msgid "Rear Center"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:112
+msgid "Rear Left"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:113
+msgid "Rear Right"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:115
+msgid "Low Frequency Emmiter"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:117
+msgid "Front Left-of-center"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:118
+msgid "Front Right-of-center"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:120
+msgid "Side Left"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:121
+msgid "Side Right"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:123
+msgid "Auxiliary 0"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:124
+msgid "Auxiliary 1"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:125
+msgid "Auxiliary 2"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:126
+msgid "Auxiliary 3"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:127
+msgid "Auxiliary 4"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:128
+msgid "Auxiliary 5"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:129
+msgid "Auxiliary 6"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:130
+msgid "Auxiliary 7"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:131
+msgid "Auxiliary 8"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:132
+msgid "Auxiliary 9"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:133
+msgid "Auxiliary 10"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:134
+msgid "Auxiliary 11"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:135
+msgid "Auxiliary 12"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:136
+msgid "Auxiliary 13"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:137
+msgid "Auxiliary 14"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:138
+msgid "Auxiliary 15"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:139
+msgid "Auxiliary 16"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:140
+msgid "Auxiliary 17"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:141
+msgid "Auxiliary 18"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:142
+msgid "Auxiliary 19"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:143
+msgid "Auxiliary 20"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:144
+msgid "Auxiliary 21"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:145
+msgid "Auxiliary 22"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:146
+msgid "Auxiliary 23"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:147
+msgid "Auxiliary 24"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:148
+msgid "Auxiliary 25"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:149
+msgid "Auxiliary 26"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:150
+msgid "Auxiliary 27"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:151
+msgid "Auxiliary 28"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:152
+msgid "Auxiliary 29"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:153
+msgid "Auxiliary 30"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:154
+msgid "Auxiliary 31"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:156
+msgid "Top Center"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:158
+msgid "Top Front Center"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:159
+msgid "Top Front Left"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:160
+msgid "Top Front Right"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:162
+msgid "Top Rear Center"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:163
+msgid "Top Rear Left"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:164
+msgid "Top Rear Right"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170
+#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321
+#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371
+msgid "(invalid)"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:761
+msgid "Stereo"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:766
+msgid "Surround 4.0"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:772
+msgid "Surround 4.1"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:778
+msgid "Surround 5.0"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:784
+msgid "Surround 5.1"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:791
+msgid "Surround 7.1"
+msgstr ""
+
+#: ../src/pulse/error.c:43
+msgid "OK"
+msgstr ""
+
+#: ../src/pulse/error.c:44
+msgid "Access denied"
+msgstr ""
+
+#: ../src/pulse/error.c:45
+msgid "Unknown command"
+msgstr ""
+
+#: ../src/pulse/error.c:46
+msgid "Invalid argument"
+msgstr ""
+
+#: ../src/pulse/error.c:47
+msgid "Entity exists"
+msgstr ""
+
+#: ../src/pulse/error.c:48
+msgid "No such entity"
+msgstr ""
+
+#: ../src/pulse/error.c:49
+msgid "Connection refused"
+msgstr ""
+
+#: ../src/pulse/error.c:50
+msgid "Protocol error"
+msgstr ""
+
+#: ../src/pulse/error.c:51
+msgid "Timeout"
+msgstr ""
+
+#: ../src/pulse/error.c:52
+msgid "No authorization key"
+msgstr ""
+
+#: ../src/pulse/error.c:53
+msgid "Internal error"
+msgstr ""
+
+#: ../src/pulse/error.c:54
+msgid "Connection terminated"
+msgstr ""
+
+#: ../src/pulse/error.c:55
+msgid "Entity killed"
+msgstr ""
+
+#: ../src/pulse/error.c:56
+msgid "Invalid server"
+msgstr ""
+
+#: ../src/pulse/error.c:57
+msgid "Module initalization failed"
+msgstr ""
+
+#: ../src/pulse/error.c:58
+msgid "Bad state"
+msgstr ""
+
+#: ../src/pulse/error.c:59
+msgid "No data"
+msgstr ""
+
+#: ../src/pulse/error.c:60
+msgid "Incompatible protocol version"
+msgstr ""
+
+#: ../src/pulse/error.c:61
+msgid "Too large"
+msgstr ""
+
+#: ../src/pulse/error.c:62
+msgid "Not supported"
+msgstr ""
+
+#: ../src/pulse/error.c:63
+msgid "Unknown error code"
+msgstr ""
+
+#: ../src/pulse/error.c:64
+msgid "No such extension"
+msgstr ""
+
+#: ../src/pulse/error.c:65
+msgid "Obsolete functionality"
+msgstr ""
+
+#: ../src/pulse/error.c:66
+msgid "Missing implementation"
+msgstr ""
+
+#: ../src/pulse/error.c:67
+msgid "Client forked"
+msgstr ""
+
+#: ../src/pulse/error.c:68
+msgid "Input/Output error"
+msgstr ""
+
+#: ../src/pulse/error.c:69
+msgid "Device or resource busy"
+msgstr ""
+
+#: ../src/pulse/sample.c:172
+#, c-format
+msgid "%s %uch %uHz"
+msgstr ""
+
+#: ../src/pulse/sample.c:184
+#, c-format
+msgid "%0.1f GiB"
+msgstr ""
+
+#: ../src/pulse/sample.c:186
+#, c-format
+msgid "%0.1f MiB"
+msgstr ""
+
+#: ../src/pulse/sample.c:188
+#, c-format
+msgid "%0.1f KiB"
+msgstr ""
+
+#: ../src/pulse/sample.c:190
+#, c-format
+msgid "%u B"
+msgstr ""
+
+#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100
+msgid "XOpenDisplay() failed"
+msgstr ""
+
+#: ../src/pulse/client-conf-x11.c:93
+msgid "Failed to parse cookie data"
+msgstr ""
+
+#: ../src/pulse/client-conf.c:111
+#, c-format
+msgid "Failed to open configuration file '%s': %s"
+msgstr ""
+
+#: ../src/pulse/context.c:550
+msgid "No cookie loaded. Attempting to connect without."
+msgstr ""
+
+#: ../src/pulse/context.c:693
+#, c-format
+msgid "fork(): %s"
+msgstr ""
+
+#: ../src/pulse/context.c:748
+#, c-format
+msgid "waitpid(): %s"
+msgstr ""
+
+#: ../src/pulse/context.c:1438
+#, c-format
+msgid "Received message for unknown extension '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:108
+#, c-format
+msgid "Failed to drain stream: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:113
+msgid "Playback stream drained."
+msgstr ""
+
+#: ../src/utils/pacat.c:123
+msgid "Draining connection to server."
+msgstr ""
+
+#: ../src/utils/pacat.c:136
+#, c-format
+msgid "pa_stream_drain(): %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:159
+#, c-format
+msgid "pa_stream_write() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:197
+#, c-format
+msgid "pa_stream_begin_write() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#, c-format
+msgid "pa_stream_peek() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:307
+msgid "Stream successfully created."
+msgstr ""
+
+#: ../src/utils/pacat.c:310
+#, c-format
+msgid "pa_stream_get_buffer_attr() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:314
+#, c-format
+msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
+msgstr ""
+
+#: ../src/utils/pacat.c:317
+#, c-format
+msgid "Buffer metrics: maxlength=%u, fragsize=%u"
+msgstr ""
+
+#: ../src/utils/pacat.c:321
+#, c-format
+msgid "Using sample spec '%s', channel map '%s'."
+msgstr ""
+
+#: ../src/utils/pacat.c:325
+#, c-format
+msgid "Connected to device %s (%u, %ssuspended)."
+msgstr ""
+
+#: ../src/utils/pacat.c:335
+#, c-format
+msgid "Stream error: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:345
+#, c-format
+msgid "Stream device suspended.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:347
+#, c-format
+msgid "Stream device resumed.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:355
+#, c-format
+msgid "Stream underrun.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:362
+#, c-format
+msgid "Stream overrun.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:369
+#, c-format
+msgid "Stream started.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:376
+#, c-format
+msgid "Stream moved to device %s (%u, %ssuspended).%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:376
+msgid "not "
+msgstr ""
+
+#: ../src/utils/pacat.c:383
+#, c-format
+msgid "Stream buffer attributes changed.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:415
+#, c-format
+msgid "Connection established.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:418
+#, c-format
+msgid "pa_stream_new() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:450
+#, c-format
+msgid "pa_stream_connect_playback() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:456
+#, c-format
+msgid "pa_stream_connect_record() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#, c-format
+msgid "Connection failure: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:503
+msgid "Got EOF."
+msgstr ""
+
+#: ../src/utils/pacat.c:540
+#, c-format
+msgid "write() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:561
+msgid "Got signal, exiting."
+msgstr ""
+
+#: ../src/utils/pacat.c:575
+#, c-format
+msgid "Failed to get latency: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:580
+#, c-format
+msgid "Time: %0.3f sec; Latency: %0.0f usec."
+msgstr ""
+
+#: ../src/utils/pacat.c:599
+#, c-format
+msgid "pa_stream_update_timing_info() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:609
+#, c-format
+msgid ""
+"%s [options]\n"
+"\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"\n"
+"  -r, --record                          Create a connection for recording\n"
+"  -p, --playback                        Create a connection for playback\n"
+"\n"
+"  -v, --verbose                         Enable verbose operations\n"
+"\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
+"  -d, --device=DEVICE                   The name of the sink/source to "
+"connect to\n"
+"  -n, --client-name=NAME                How to call this client on the "
+"server\n"
+"      --stream-name=NAME                How to call this stream on the "
+"server\n"
+"      --volume=VOLUME                   Specify the initial (linear) volume "
+"in range 0...65536\n"
+"      --rate=SAMPLERATE                 The sample rate in Hz (defaults to "
+"44100)\n"
+"      --format=SAMPLEFORMAT             The sample type, one of s16le, "
+"s16be, u8, float32le,\n"
+"                                        float32be, ulaw, alaw, s32le, s32be, "
+"s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to "
+"s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, "
+"2 for stereo\n"
+"                                        (defaults to 2)\n"
+"      --channel-map=CHANNELMAP          Channel map to use instead of the "
+"default\n"
+"      --fix-format                      Take the sample format from the sink "
+"the stream is\n"
+"                                        being connected to.\n"
+"      --fix-rate                        Take the sampling rate from the sink "
+"the stream is\n"
+"                                        being connected to.\n"
+"      --fix-channels                    Take the number of channels and the "
+"channel map\n"
+"                                        from the sink the stream is being "
+"connected to.\n"
+"      --no-remix                        Don't upmix or downmix channels.\n"
+"      --no-remap                        Map channels by index instead of "
+"name.\n"
+"      --latency=BYTES                   Request the specified latency in "
+"bytes.\n"
+"      --process-time=BYTES              Request the specified process time "
+"per request in bytes.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the "
+"specified value.\n"
+"      --raw                             Record/play raw PCM data.\n"
+"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --list-file-formats               List available file formats.\n"
+msgstr ""
+
+#: ../src/utils/pacat.c:731
+#, c-format
+msgid ""
+"pacat %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
+msgstr ""
+
+#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#, c-format
+msgid "Invalid client name '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:779
+#, c-format
+msgid "Invalid stream name '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:816
+#, c-format
+msgid "Invalid channel map '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:845
+#, c-format
+msgid "Invalid latency specification '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:852
+#, c-format
+msgid "Invalid process time specification '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:864
+#, c-format
+msgid "Invalid property '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:881
+#, c-format
+msgid "Unknown file format %s."
+msgstr ""
+
+#: ../src/utils/pacat.c:900
+msgid "Invalid sample specification"
+msgstr ""
+
+#: ../src/utils/pacat.c:910
+#, c-format
+msgid "open(): %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:915
+#, c-format
+msgid "dup2(): %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:922
+msgid "Too many arguments."
+msgstr ""
+
+#: ../src/utils/pacat.c:933
+msgid "Failed to generate sample specification for file."
+msgstr ""
+
+#: ../src/utils/pacat.c:953
+msgid "Failed to open audio file."
+msgstr ""
+
+#: ../src/utils/pacat.c:959
+msgid ""
+"Warning: specified sample specification will be overwritten with "
+"specification from file."
+msgstr ""
+
+#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+msgid "Failed to determine sample specification from file."
+msgstr ""
+
+#: ../src/utils/pacat.c:971
+msgid "Warning: Failed to determine channel map from file."
+msgstr ""
+
+#: ../src/utils/pacat.c:982
+msgid "Channel map doesn't match sample specification"
+msgstr ""
+
+#: ../src/utils/pacat.c:993
+msgid "Warning: failed to write channel map to file."
+msgstr ""
+
+#: ../src/utils/pacat.c:1008
+#, c-format
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr ""
+
+#: ../src/utils/pacat.c:1009
+msgid "recording"
+msgstr ""
+
+#: ../src/utils/pacat.c:1009
+msgid "playback"
+msgstr ""
+
+#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+msgid "pa_mainloop_new() failed."
+msgstr ""
+
+#: ../src/utils/pacat.c:1054
+msgid "io_new() failed."
+msgstr ""
+
+#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+msgid "pa_context_new() failed."
+msgstr ""
+
+#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#, c-format
+msgid "pa_context_connect() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:1075
+msgid "pa_context_rttime_new() failed."
+msgstr ""
+
+#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+msgid "pa_mainloop_run() failed."
+msgstr ""
+
+#: ../src/utils/pasuspender.c:81
+#, c-format
+msgid "fork(): %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:92
+#, c-format
+msgid "execvp(): %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:109
+#, c-format
+msgid "Failure to suspend: %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:124
+#, c-format
+msgid "Failure to resume: %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:147
+#, c-format
+msgid "WARNING: Sound server is not local, not suspending.\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:159
+#, c-format
+msgid "Connection failure: %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:176
+#, c-format
+msgid "Got SIGINT, exiting.\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:194
+#, c-format
+msgid "WARNING: Child process terminated by signal %u\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:212
+#, c-format
+msgid ""
+"%s [options] ... \n"
+"\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
+"\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:248
+#, c-format
+msgid ""
+"pasuspender %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:277
+#, c-format
+msgid "pa_mainloop_new() failed.\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:290
+#, c-format
+msgid "pa_context_new() failed.\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:298
+#, c-format
+msgid "pa_mainloop_run() failed.\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:135
+#, c-format
+msgid "Failed to get statistics: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:141
+#, c-format
+msgid "Currently in use: %u blocks containing %s bytes total.\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:144
+#, c-format
+msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:147
+#, c-format
+msgid "Sample cache size: %s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:156
+#, c-format
+msgid "Failed to get server information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:164
+#, c-format
+msgid ""
+"User name: %s\n"
+"Host Name: %s\n"
+"Server Name: %s\n"
+"Server Version: %s\n"
+"Default Sample Specification: %s\n"
+"Default Channel Map: %s\n"
+"Default Sink: %s\n"
+"Default Source: %s\n"
+"Cookie: %08x\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:205
+#, c-format
+msgid "Failed to get sink information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:221
+#, c-format
+msgid ""
+"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:268 ../src/utils/pactl.c:360
+#, c-format
+msgid "\tPorts:\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#, c-format
+msgid "\tActive Port: %s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:297
+#, c-format
+msgid "Failed to get source information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:313
+#, c-format
+msgid ""
+"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:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
+#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
+#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
+#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
+#: ../src/utils/pactl.c:645
+msgid "n/a"
+msgstr ""
+
+#: ../src/utils/pactl.c:375
+#, c-format
+msgid "Failed to get module information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:393
+#, c-format
+msgid ""
+"Module #%u\n"
+"\tName: %s\n"
+"\tArgument: %s\n"
+"\tUsage counter: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:412
+#, c-format
+msgid "Failed to get client information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:430
+#, c-format
+msgid ""
+"Client #%u\n"
+"\tDriver: %s\n"
+"\tOwner Module: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:447
+#, c-format
+msgid "Failed to get card information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:465
+#, c-format
+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:479
+#, c-format
+msgid "\tProfiles:\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:485
+#, c-format
+msgid "\tActive Profile: %s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:496
+#, c-format
+msgid "Failed to get sink input information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:515
+#, c-format
+msgid ""
+"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:554
+#, c-format
+msgid "Failed to get source output information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:574
+#, c-format
+msgid ""
+"Source Output #%u\n"
+"\tDriver: %s\n"
+"\tOwner Module: %s\n"
+"\tClient: %s\n"
+"\tSource: %u\n"
+"\tSample Specification: %s\n"
+"\tChannel Map: %s\n"
+"\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:605
+#, c-format
+msgid "Failed to get sample information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:623
+#, c-format
+msgid ""
+"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:653 ../src/utils/pactl.c:663
+#, c-format
+msgid "Failure: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:687
+#, c-format
+msgid "Failed to upload sample: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:704
+msgid "Premature end of file"
+msgstr ""
+
+#: ../src/utils/pactl.c:863
+msgid "Got SIGINT, exiting."
+msgstr ""
+
+#: ../src/utils/pactl.c:869
+#, c-format
+msgid ""
+"%s [options] stat\n"
+"%s [options] list\n"
+"%s [options] exit\n"
+"%s [options] upload-sample FILENAME [NAME]\n"
+"%s [options] play-sample NAME [SINK]\n"
+"%s [options] remove-sample NAME\n"
+"%s [options] move-sink-input SINKINPUT SINK\n"
+"%s [options] move-source-output SOURCEOUTPUT SOURCE\n"
+"%s [options] load-module NAME [ARGS ...]\n"
+"%s [options] unload-module MODULE\n"
+"%s [options] suspend-sink SINK 1|0\n"
+"%s [options] suspend-source SOURCE 1|0\n"
+"%s [options] set-card-profile CARD PROFILE\n"
+"%s [options] set-sink-port SINK PORT\n"
+"%s [options] set-source-port SOURCE PORT\n"
+"%s [options] set-sink-volume SINK VOLUME\n"
+"%s [options] set-source-volume SOURCE VOLUME\n"
+"%s [options] set-sink-input-volume SINKINPUT VOLUME\n"
+"%s [options] set-sink-mute SINK 1|0\n"
+"%s [options] set-source-mute SOURCE 1|0\n"
+"%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"\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"
+msgstr ""
+
+#: ../src/utils/pactl.c:933
+#, c-format
+msgid ""
+"pactl %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:979
+msgid "Please specify a sample file to load"
+msgstr ""
+
+#: ../src/utils/pactl.c:992
+msgid "Failed to open sound file."
+msgstr ""
+
+#: ../src/utils/pactl.c:1004
+msgid "Warning: Failed to determine sample specification from file."
+msgstr ""
+
+#: ../src/utils/pactl.c:1014
+msgid "You have to specify a sample name to play"
+msgstr ""
+
+#: ../src/utils/pactl.c:1026
+msgid "You have to specify a sample name to remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:1035
+msgid "You have to specify a sink input index and a sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:1045
+msgid "You have to specify a source output index and a source"
+msgstr ""
+
+#: ../src/utils/pactl.c:1060
+msgid "You have to specify a module name and arguments."
+msgstr ""
+
+#: ../src/utils/pactl.c:1080
+msgid "You have to specify a module index"
+msgstr ""
+
+#: ../src/utils/pactl.c:1090
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
+msgstr ""
+
+#: ../src/utils/pactl.c:1103
+msgid ""
+"You may not specify more than one source. You have to specify a boolean "
+"value."
+msgstr ""
+
+#: ../src/utils/pactl.c:1115
+msgid "You have to specify a card name/index and a profile name"
+msgstr ""
+
+#: ../src/utils/pactl.c:1126
+msgid "You have to specify a sink name/index and a port name"
+msgstr ""
+
+#: ../src/utils/pactl.c:1137
+msgid "You have to specify a source name/index and a port name"
+msgstr ""
+
+#: ../src/utils/pactl.c:1149
+msgid "You have to specify a sink name/index and a volume"
+msgstr ""
+
+#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
+#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
+#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+msgid "Invalid volume specification"
+msgstr ""
+
+#: ../src/utils/pactl.c:1166
+msgid "You have to specify a source name/index and a volume"
+msgstr ""
+
+#: ../src/utils/pactl.c:1183
+msgid "You have to specify a sink input index and a volume"
+msgstr ""
+
+#: ../src/utils/pactl.c:1188
+msgid "Invalid sink input index"
+msgstr ""
+
+#: ../src/utils/pactl.c:1204
+msgid "You have to specify a sink name/index and a mute boolean"
+msgstr ""
+
+#: ../src/utils/pactl.c:1221
+msgid "You have to specify a source name/index and a mute boolean"
+msgstr ""
+
+#: ../src/utils/pactl.c:1238
+msgid "You have to specify a sink input index and a mute boolean"
+msgstr ""
+
+#: ../src/utils/pactl.c:1243
+msgid "Invalid sink input index specification"
+msgstr ""
+
+#: ../src/utils/pactl.c:1262
+msgid "No valid command specified."
+msgstr ""
+
+#: ../src/utils/pax11publish.c:61
+#, c-format
+msgid ""
+"%s [-D display] [-S server] [-O sink] [-I source] [-c file]  [-d|-e|-i|-r]\n"
+"\n"
+" -d    Show current PulseAudio data attached to X11 display (default)\n"
+" -e    Export local PulseAudio data to X11 display\n"
+" -i    Import PulseAudio data from X11 display to local environment "
+"variables and cookie file.\n"
+" -r    Remove PulseAudio data from X11 display\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:94
+#, c-format
+msgid "Failed to parse command line.\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:108
+#, c-format
+msgid "Server: %s\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:110
+#, c-format
+msgid "Source: %s\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:112
+#, c-format
+msgid "Sink: %s\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:114
+#, c-format
+msgid "Cookie: %s\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:132
+#, c-format
+msgid "Failed to parse cookie data\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:137
+#, c-format
+msgid "Failed to save cookie data\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:152
+#, c-format
+msgid "Failed to load client configuration file.\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:157
+#, c-format
+msgid "Failed to read environment configuration data.\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:174
+#, c-format
+msgid "Failed to get FQDN.\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:194
+#, c-format
+msgid "Failed to load cookie data\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:211
+#, c-format
+msgid "Not yet implemented.\n"
+msgstr ""
+
+#: ../src/utils/pacmd.c:69
+msgid "No PulseAudio daemon running, or not running as session daemon."
+msgstr ""
+
+#: ../src/utils/pacmd.c:74
+#, c-format
+msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
+msgstr ""
+
+#: ../src/utils/pacmd.c:91
+#, c-format
+msgid "connect(): %s"
+msgstr ""
+
+#: ../src/utils/pacmd.c:99
+msgid "Failed to kill PulseAudio daemon."
+msgstr ""
+
+#: ../src/utils/pacmd.c:107
+msgid "Daemon not responding."
+msgstr ""
+
+#: ../src/utils/pacmd.c:161
+#, c-format
+msgid "poll(): %s"
+msgstr ""
+
+#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#, c-format
+msgid "read(): %s"
+msgstr ""
+
+#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#, c-format
+msgid "write(): %s"
+msgstr ""
+
+#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+msgid "Cannot access autospawn lock."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
+#, c-format
+msgid ""
+"ALSA woke us up to write new data to the device, but there was actually "
+"nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
+#, c-format
+msgid ""
+"ALSA woke us up to read new data from the device, but there was actually "
+"nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
+msgstr ""
+
+#: ../src/modules/alsa/module-alsa-card.c:152
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
+#: ../src/modules/alsa/alsa-mixer.c:2931
+msgid "Off"
+msgstr ""
+
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+msgid "High Fidelity Playback (A2DP)"
+msgstr ""
+
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+msgid "High Fidelity Capture (A2DP)"
+msgstr ""
+
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+msgid "Telephony Duplex (HSP/HFP)"
+msgstr ""
+
+#: ../src/modules/reserve-wrap.c:151
+msgid "PulseAudio Sound Server"
+msgstr ""
+
+#: ../src/modules/module-rygel-media-server.c:569
+#: ../src/modules/module-rygel-media-server.c:583
+msgid "Output Devices"
+msgstr ""
+
+#: ../src/modules/module-rygel-media-server.c:570
+#: ../src/modules/module-rygel-media-server.c:584
+msgid "Input Devices"
+msgstr ""
+
+#: ../src/modules/module-rygel-media-server.c:774
+msgid "Audio on @HOSTNAME@"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1701
+msgid "Input"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1702
+msgid "Docking Station Input"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1703
+msgid "Docking Station Microphone"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1704
+msgid "Line-In"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1705
+msgid "Microphone"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1706
+msgid "External Microphone"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1707
+msgid "Internal Microphone"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1708
+msgid "Radio"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1709
+msgid "Video"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1710
+msgid "Automatic Gain Control"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1711
+msgid "No Automatic Gain Control"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1712
+msgid "Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1713
+msgid "No Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1714
+msgid "Amplifier"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1715
+msgid "No Amplifier"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1773
+msgid "Analog Input"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1774
+msgid "Analog Microphone"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1775
+msgid "Analog Line-In"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1776
+msgid "Analog Radio"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
+msgid "Analog Video"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1778
+msgid "Analog Output"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1779
+msgid "Analog Headphones"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1780
+msgid "Analog Output (LFE)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1781
+msgid "Analog Mono Output"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1981
+#, c-format
+msgid "%s+%s"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#, c-format
+msgid "%s / %s"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2790
+msgid "Analog Mono"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2791
+msgid "Analog Stereo"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2792
+msgid "Analog Surround 2.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2793
+msgid "Analog Surround 3.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2794
+msgid "Analog Surround 3.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2795
+msgid "Analog Surround 4.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2796
+msgid "Analog Surround 4.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2797
+msgid "Analog Surround 5.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2798
+msgid "Analog Surround 5.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2799
+msgid "Analog Surround 6.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2800
+msgid "Analog Surround 6.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2801
+msgid "Analog Surround 7.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2802
+msgid "Analog Surround 7.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2803
+msgid "Digital Stereo (IEC958)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2804
+msgid "Digital Surround 4.0 (IEC958)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2805
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2806
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2807
+msgid "Digital Stereo (HDMI)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2928
+msgid "Analog Mono Duplex"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2929
+msgid "Analog Stereo Duplex"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:2930
+msgid "Digital Stereo Duplex (IEC958)"
+msgstr ""

commit 2d5f61be7281e3ba4c4834508276605cc683c852
Author: amitakhya <amitakhya at fedoraproject.org>
Date:   Fri Dec 11 11:56:19 2009 +0000

    Sending translation for Assamese

diff --git a/po/as.po b/po/as.po
index f7b2dee..9586cba 100644
--- a/po/as.po
+++ b/po/as.po
@@ -7,14 +7,14 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.as\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-09-08 21:04+0530\n"
+"POT-Creation-Date: 2009-12-07 08:36+0000\n"
+"PO-Revision-Date: 2009-12-11 17:11+0530\n"
 "Last-Translator: Amitakhya Phukan <aphukan at fedoraproject.org>\n"
-"Language-Team: Assamese\n"
+"Language-Team: Assamese <>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.11.4\n"
+"X-Generator: Lokalize 0.2\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 
 #: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
@@ -60,15 +60,15 @@ msgstr ""
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr ""
+msgstr "সদায়ে অন্তত এটা sink লোড কৰি ৰখা হ'ব, প্ৰয়োজনত null sink ব্যৱহাৰ কৰা হ'ব"
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
-msgstr ""
+msgstr "ডামি নিৰ্গম"
 
 #: ../src/modules/module-ladspa-sink.c:49
 msgid "Virtual LADSPA sink"
-msgstr "ভার্চুয়াল LADSPA sink"
+msgstr "ভাৰ্চুয়াল LADSPA sink"
 
 #: ../src/modules/module-ladspa-sink.c:53
 msgid ""
@@ -86,11 +86,11 @@ msgstr ""
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
-msgstr ""
+msgstr "NULL sink ৰ সময় নিৰ্ধাৰণ"
 
 #: ../src/modules/module-null-sink.c:291
 msgid "Null Output"
-msgstr ""
+msgstr "Null ফলাফল"
 
 #: ../src/pulsecore/sink.c:2613
 msgid "Internal Audio"
@@ -110,7 +110,7 @@ msgstr "নতুন dl loader বিতৰণ কৰিবলৈ বিফল 
 
 #: ../src/daemon/ltdl-bind-now.c:142
 msgid "Failed to add bind-now-loader."
-msgstr "bind-now-loader যোগ কৰিবলৈ বিফল ।"
+msgstr "bind now loader যোগ কৰিবলৈ বিফল ।"
 
 #: ../src/daemon/main.c:141
 #, c-format
@@ -202,23 +202,23 @@ msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
 msgstr ""
-"root পৰিচয়ে এই প্ৰোগ্ৰাম সঞ্চালিত হোৱা উচিত নহয় (ন'হ'লে --system উল্লিখিত হয়) ।"
+"root পৰিচয়ে এই প্ৰোগ্ৰাম সঞ্চালিত হোৱা উচিত নহয় (ন'হ'লে   system উল্লিখিত হয়) ।"
 
 #: ../src/daemon/main.c:573
 msgid "Root privileges required."
-msgstr "Root-ৰ অধিকাৰ আৱশ্যক ।"
+msgstr "Root ৰ অধিকাৰ আৱশ্যক ।"
 
 #: ../src/daemon/main.c:578
 msgid "--start not supported for system instances."
-msgstr "প্ৰণালী চানেকিৰ ক্ষেত্ৰত --start সমৰ্থিত নহয় ।"
+msgstr "প্ৰণালী চানেকিৰ ক্ষেত্ৰত   start সমৰ্থিত নহয় ।"
 
 #: ../src/daemon/main.c:583
 msgid "Running in system mode, but --disallow-exit not set!"
-msgstr "প্ৰণালী মোডত চলিছে, কিন্তু --disallow-exit নিৰ্ধাৰিত নহয়!"
+msgstr "প্ৰণালী মোডত চলিছে, কিন্তু   disallow exit নিৰ্ধাৰিত নহয়!"
 
 #: ../src/daemon/main.c:586
 msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr "প্ৰণালী মোডত চলিছে, কিন্তু --disallow-module-loading নিৰ্ধাৰিত নহয়!"
+msgstr "প্ৰণালী মোডত চলিছে, কিন্তু   disallow module loading নিৰ্ধাৰিত নহয়!"
 
 #: ../src/daemon/main.c:589
 msgid "Running in system mode, forcibly disabling SHM mode!"
@@ -336,7 +336,7 @@ msgstr "সেশান ID হল %s।"
 #: ../src/daemon/main.c:779
 #, c-format
 msgid "Using runtime directory %s."
-msgstr "ৰান-টাইম পঞ্জিকা %s ব্যৱহাৰ কৰা হৈছে ।"
+msgstr "ৰান টাইম পঞ্জিকা %s ব্যৱহাৰ কৰা হৈছে ।"
 
 #: ../src/daemon/main.c:784
 #, c-format
@@ -346,7 +346,7 @@ msgstr "অৱস্থাসূচক পঞ্জিকা %s ব্যৱহ
 #: ../src/daemon/main.c:787
 #, c-format
 msgid "Using modules directory %s."
-msgstr "মডিউল ডিরেক্টরি %s ব্যবহার করা হচ্ছে।"
+msgstr "মডিউল ডিৰেক্টৰি %s ব্যৱহাৰ কৰা হচ্ছে।"
 
 #: ../src/daemon/main.c:789
 #, c-format
@@ -362,9 +362,9 @@ msgid ""
 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
 "explanation why system mode is usually a bad idea."
 msgstr ""
-"আপনি সিস্টেম মোডে PA সঞ্চালিত করছেন এবং এটি না করাই বাঞ্ছনীয়।\n"
-"এর ফলে প্রত্যাশামত ফলাফল না পাওয়ার সম্ভাবনা রয়েছে।\n"
-"সিস্টেম মোডে ব্যবহারের সমস্যা সম্পর্কে জানতে হলে http://pulseaudio.org/wiki/"
+"আপনি সিস্টেম মোডে PA সঞ্চালিত কৰছেন এবং এটি না কৰাই বাঞ্ছনীয়।\n"
+"এৰ ফলে প্ৰত্যাশামত ফলাফল না পাওয়াৰ সম্ভাবনা ৰয়েছে।\n"
+"সিস্টেম মোডে ব্যৱহাৰেৰ সমস্যা সম্পৰ্কে জানতে হলে http://pulseaudio.org/wiki/"
 "WhatIsWrongWithSystemMode দেখুন।"
 
 #: ../src/daemon/main.c:809
@@ -373,14 +373,14 @@ msgstr "pa_pid_file_create() ব্যৰ্থ ।"
 
 #: ../src/daemon/main.c:819
 msgid "Fresh high-resolution timers available! Bon appetit!"
-msgstr "নতুন high-resolution timers পোৱা হয়! অভিনন্দন!"
+msgstr "নতুন high resolution timers পোৱা হয়! অভিনন্দন!"
 
 #: ../src/daemon/main.c:821
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
 msgstr ""
-"শ্ৰীমান, আপোনাৰ কাৰ্ণেল পূৰণি! high-resolution timer সক্ৰিয় থকা Linux ক আজি "
+"শ্ৰীমান, আপোনাৰ কাৰ্ণেল পূৰণি! high resolution timer সক্ৰিয় থকা Linux ক আজি "
 "উপদেশ দিয়া হয়!"
 
 #: ../src/daemon/main.c:844
@@ -484,108 +484,108 @@ msgstr ""
 "%s [options]\n"
 "\n"
 "COMMANDS:\n"
-"  -h, --help                            Show this help\n"
-"      --version                         Show version\n"
-"      --dump-conf                       Dump default configuration\n"
-"      --dump-modules                    Dump list of available modules\n"
-"      --dump-resample-methods           Dump available resample methods\n"
-"      --cleanup-shm                     Cleanup stale shared memory "
+"   h,   help                            Show this help\n"
+"        version                         Show version\n"
+"        dump conf                       Dump default configuration\n"
+"        dump modules                    Dump list of available modules\n"
+"        dump resample methods           Dump available resample methods\n"
+"        cleanup shm                     Cleanup stale shared memory "
 "segments\n"
-"      --start                           Start the daemon if it is not "
+"        start                           Start the daemon if it is not "
 "running\n"
-"  -k  --kill                            Kill a running daemon\n"
-"      --check                           Check for a running daemon (only "
+"   k    kill                            Kill a running daemon\n"
+"        check                           Check for a running daemon (only "
 "returns exit code)\n"
 "\n"
 "OPTIONS:\n"
-"      --system[=BOOL]                   Run as system-wide instance\n"
-"  -D, --daemonize[=BOOL]                Daemonize after startup\n"
-"      --fail[=BOOL]                     Quit when startup fails\n"
-"      --high-priority[=BOOL]            Try to set high nice level\n"
+"        system[=BOOL]                   Run as system wide instance\n"
+"   D,   daemonize[=BOOL]                Daemonize after startup\n"
+"        fail[=BOOL]                     Quit when startup fails\n"
+"        high priority[=BOOL]            Try to set high nice level\n"
 "                                        (only available as root, when SUID "
 "or\n"
 "                                        with elevated RLIMIT_NICE)\n"
-"      --realtime[=BOOL]                 Try to enable realtime scheduling\n"
+"        realtime[=BOOL]                 Try to enable realtime scheduling\n"
 "                                        (only available as root, when SUID "
 "or\n"
 "                                        with elevated RLIMIT_RTPRIO)\n"
-"      --disallow-module-loading[=BOOL]  Disallow module user requested "
+"        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 "
+"        disallow exit[=BOOL]            Disallow user requested exit\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 "
+"        module idle time=SECS           Unload autoloaded modules when idle "
 "and\n"
 "                                        this time passed\n"
-"      --scache-idle-time=SECS           Unload autoloaded samples when idle "
+"        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 "
+"        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-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 "
+"        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"
+"        resample method=METHOD          Use the specified resampling method\n"
+"                                        (See   dump resample methods for\n"
 "                                        possible values)\n"
-"      --use-pid-file[=BOOL]             Create a PID file\n"
-"      --no-cpu-limit[=BOOL]             Do not install CPU load limiter on\n"
+"        use pid file[=BOOL]             Create a PID file\n"
+"        no cpu limit[=BOOL]             Do not install CPU load limiter on\n"
 "                                        platforms that support it.\n"
-"      --disable-shm[=BOOL]              Disable shared memory support.\n"
+"        disable shm[=BOOL]              Disable shared memory support.\n"
 "\n"
 "STARTUP SCRIPT:\n"
-"  -L, --load=\"MODULE ARGUMENTS\"         Load the specified plugin module "
+"   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 "
+"   F,   file=FILENAME                   Run the specified script\n"
+"   C                                    Open a command line on the running "
 "TTY\n"
 "                                        after startup\n"
 "\n"
-"  -n                                    Don't load default script file\n"
+"   n                                    Don't load default script file\n"
 
 #: ../src/daemon/cmdline.c:247
 msgid "--daemonize expects boolean argument"
-msgstr "--daemonize দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
+msgstr "  daemonize দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
 
 #: ../src/daemon/cmdline.c:254
 msgid "--fail expects boolean argument"
-msgstr "--fail দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
+msgstr "  fail দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
 
 #: ../src/daemon/cmdline.c:264
 msgid ""
 "--log-level expects log level argument (either numeric in range 0..4 or one "
 "of debug, info, notice, warn, error)."
 msgstr ""
-"--log-level ৰ কাৰণে লগ স্তৰৰ তৰ্ক প্ৰত্যাশিত (হয় সংখ্যা ০..৪ ৰ সীমাত বা debug, "
+"  log level ৰ কাৰণে লগ স্তৰৰ তৰ্ক প্ৰত্যাশিত (হয় সংখ্যা ০..৪ ৰ সীমাত বা debug, "
 "info, notice, warn, error ৰ যিকোনো এটা) ।"
 
 #: ../src/daemon/cmdline.c:276
 msgid "--high-priority expects boolean argument"
-msgstr "--high-priority দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
+msgstr "  high priority দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
 
 #: ../src/daemon/cmdline.c:283
 msgid "--realtime expects boolean argument"
-msgstr "--realtime দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
+msgstr "  realtime দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
 
 #: ../src/daemon/cmdline.c:290
 msgid "--disallow-module-loading expects boolean argument"
-msgstr "--disallow-module-loading দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
+msgstr "  disallow module loading দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
 
 #: ../src/daemon/cmdline.c:297
 msgid "--disallow-exit expects boolean argument"
-msgstr "--disallow-exit দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
+msgstr "  disallow exit দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
 
 #: ../src/daemon/cmdline.c:304
 msgid "--use-pid-file expects boolean argument"
-msgstr "--use-pid-file দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
+msgstr "  use pid file দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
 
 #: ../src/daemon/cmdline.c:321
 msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
@@ -593,11 +593,11 @@ msgstr "অবৈধ লগ লক্ষ্য: 'syslog', 'stderr' বা 'auto'
 
 #: ../src/daemon/cmdline.c:328
 msgid "--log-time expects boolean argument"
-msgstr "--log-time দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
+msgstr "  log time দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
 
 #: ../src/daemon/cmdline.c:335
 msgid "--log-meta expects boolean argument"
-msgstr "--log-meta দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
+msgstr "  log meta দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
 
 #: ../src/daemon/cmdline.c:354
 #, c-format
@@ -606,15 +606,15 @@ msgstr "resample পদ্ধতি '%s' বৈধ নহয় ।"
 
 #: ../src/daemon/cmdline.c:361
 msgid "--system expects boolean argument"
-msgstr "--system দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
+msgstr "  system দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
 
 #: ../src/daemon/cmdline.c:368
 msgid "--no-cpu-limit expects boolean argument"
-msgstr "--no-cpu-limit দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
+msgstr "  no cpu limit দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
 
 #: ../src/daemon/cmdline.c:375
 msgid "--disable-shm expects boolean argument"
-msgstr "--disable-shm দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
+msgstr "  disable shm দ্বাৰা বুলিয়েন তৰ্ক প্ৰত্যাশিত"
 
 #: ../src/daemon/dumpmodules.c:60
 #, c-format
@@ -654,7 +654,7 @@ msgstr "এবাৰ তুলি লোৱা হ'ব: %s\n"
 #: ../src/daemon/dumpmodules.c:75
 #, c-format
 msgid "DEPRECATION WARNING: %s\n"
-msgstr "অবচিত করার সতর্কবার্তা: %s\n"
+msgstr "অবচিত কৰাৰ সতৰ্কবাৰ্তা: %s\n"
 
 #: ../src/daemon/dumpmodules.c:79
 #, c-format
@@ -741,7 +741,7 @@ msgstr "### চিহ্নিত বিন্যাস নথিপত্ৰৰ
 
 #: ../src/daemon/caps.c:62
 msgid "Cleaning up privileges."
-msgstr "অধিকার বর্জন করা হচ্ছে।"
+msgstr "অধিকাৰ বৰ্জন কৰা হচ্ছে।"
 
 #: ../src/daemon/pulseaudio.desktop.in.h:1
 msgid "PulseAudio Sound System"
@@ -785,11 +785,11 @@ msgstr "Low Frequency Emmiter"
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
-msgstr "সন্মুখত কেন্দ্ৰৰ-বাওঁফালে"
+msgstr "সন্মুখত কেন্দ্ৰৰ বাওঁফালে"
 
 #: ../src/pulse/channelmap.c:118
 msgid "Front Right-of-center"
-msgstr "সন্মুখত কেন্দ্ৰৰ-সোঁফালে"
+msgstr "সন্মুখত কেন্দ্ৰৰ সোঁফালে"
 
 #: ../src/pulse/channelmap.c:120
 msgid "Side Left"
@@ -963,7 +963,7 @@ msgstr "(অবৈধ)"
 
 #: ../src/pulse/channelmap.c:761
 msgid "Stereo"
-msgstr "স্টিৰিও"
+msgstr "স্টিৰিঅ'"
 
 #: ../src/pulse/channelmap.c:766
 msgid "Surround 4.0"
@@ -1023,7 +1023,7 @@ msgstr "সময়সীমা"
 
 #: ../src/pulse/error.c:52
 msgid "No authorization key"
-msgstr "কোনো অনুমোদনৰ-কি নাই"
+msgstr "কোনো অনুমোদনৰ কি নাই"
 
 #: ../src/pulse/error.c:53
 msgid "Internal error"
@@ -1087,11 +1087,11 @@ msgstr "গ্ৰাহক ফৰ্ক কৰা হৈছে"
 
 #: ../src/pulse/error.c:68
 msgid "Input/Output error"
-msgstr ""
+msgstr "নিবেশ/নিৰ্গম ত্ৰুটি"
 
 #: ../src/pulse/error.c:69
 msgid "Device or resource busy"
-msgstr ""
+msgstr "যন্ত্ৰ বা সম্পদ ব্যস্ত"
 
 #: ../src/pulse/sample.c:172
 #, c-format
@@ -1148,20 +1148,20 @@ msgstr "waitpid(): %s"
 #: ../src/pulse/context.c:1438
 #, c-format
 msgid "Received message for unknown extension '%s'"
-msgstr "অজানা এক্সটেনশন '%s'-ৰ বাবে বাৰ্তা প্ৰাপ্ত হৈছে"
+msgstr "অজানা এক্সটেনশন '%s' ৰ বাবে বাৰ্তা প্ৰাপ্ত হৈছে"
 
 #: ../src/utils/pacat.c:108
 #, c-format
 msgid "Failed to drain stream: %s"
-msgstr "স্ট্রিম ড্রেইন (অর্থাৎ ফাঁকা) করতে ব্যর্থ: %s"
+msgstr "স্ট্ৰিম ড্ৰেইন (অৰ্থাৎ ফাঁকা) কৰতে ব্যৰ্থ: %s"
 
 #: ../src/utils/pacat.c:113
 msgid "Playback stream drained."
-msgstr "প্লে-ব্যাক স্ট্রিম ফাঁকা করা হয়েছে।"
+msgstr "প্লে ব্যাক স্ট্ৰিম ফাঁকা কৰা হয়েছে।"
 
 #: ../src/utils/pacat.c:123
 msgid "Draining connection to server."
-msgstr "সার্ভারের সাথে স্থাপিত সংযোগ ফাঁকা করা হচ্ছে।"
+msgstr "সাৰ্ভাৰেৰ সাথে স্থাপিত সংযোগ ফাঁকা কৰা হচ্ছে।"
 
 #: ../src/utils/pacat.c:136
 #, c-format
@@ -1171,81 +1171,81 @@ msgstr "pa_stream_drain(): %s"
 #: ../src/utils/pacat.c:159
 #, c-format
 msgid "pa_stream_write() failed: %s"
-msgstr "pa_stream_write() ব্যর্থ: %s"
+msgstr "pa_stream_write() ব্যৰ্থ: %s"
 
 #: ../src/utils/pacat.c:197
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
-msgstr "pa_stream_write() ব্যর্থ: %s"
+msgstr "pa_stream_write() ব্যৰ্থ: %s"
 
 #: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
 #, c-format
 msgid "pa_stream_peek() failed: %s"
-msgstr "pa_stream_peek() ব্যর্থ: %s"
+msgstr "pa_stream_peek() ব্যৰ্থ: %s"
 
 #: ../src/utils/pacat.c:307
 msgid "Stream successfully created."
-msgstr "সাফল্যের সাথে স্ট্রিম নির্মিত হয়েছে।"
+msgstr "সাফল্যেৰ সাথে স্ট্ৰিম নিৰ্মিত হয়েছে।"
 
 #: ../src/utils/pacat.c:310
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
-msgstr "pa_stream_get_buffer_attr() ব্যর্থ: %s"
+msgstr "pa_stream_get_buffer_attr() ব্যৰ্থ: %s"
 
 #: ../src/utils/pacat.c:314
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
-msgstr "বাফারের মাপ: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
+msgstr "বাফাৰেৰ মাপ: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
 #: ../src/utils/pacat.c:317
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
-msgstr "বাফারের মাপ: maxlength=%u, fragsize=%u"
+msgstr "বাফাৰেৰ মাপ: maxlength=%u, fragsize=%u"
 
 #: ../src/utils/pacat.c:321
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
-msgstr "স্যাম্পেলের spec '%s', ও চ্যানেল ম্যাপ '%s' ব্যবহার করা হচ্ছে।"
+msgstr "স্যাম্পেলেৰ spec '%s', ও চ্যানেল ম্যাপ '%s' ব্যৱহাৰ কৰা হচ্ছে।"
 
 #: ../src/utils/pacat.c:325
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
-msgstr "ডিভাইস %s-র সাথে সংযোগ করা হয়েছে (%u, %ssuspended)।"
+msgstr "যন্ত্ৰ %s ৰ সাথে সংযোগ কৰা হয়েছে (%u, %ssuspended)।"
 
 #: ../src/utils/pacat.c:335
 #, c-format
 msgid "Stream error: %s"
-msgstr "ষ্ট্রিম সংক্রান্ত ত্রুটি: %s"
+msgstr "ষ্ট্ৰিম সংক্ৰান্ত ত্ৰুটি: %s"
 
 #: ../src/utils/pacat.c:345
 #, c-format
 msgid "Stream device suspended.%s"
-msgstr "স্ট্রিম ডিভাইস স্থগিত করা হয়েছে। %s"
+msgstr "স্ট্ৰিম যন্ত্ৰ স্থগিত কৰা হয়েছে। %s"
 
 #: ../src/utils/pacat.c:347
 #, c-format
 msgid "Stream device resumed.%s"
-msgstr "স্ট্রিম ডিভাইস পুনরারম্ভ করা হয়েছে। %s"
+msgstr "স্ট্ৰিম যন্ত্ৰ পুনৰাৰম্ভ কৰা হয়েছে। %s"
 
 #: ../src/utils/pacat.c:355
 #, c-format
 msgid "Stream underrun.%s"
-msgstr "ধীর গতির স্ট্রিম.%s"
+msgstr "ধীৰ গতিৰ স্ট্ৰিম.%s"
 
 #: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream overrun.%s"
-msgstr "স্ট্রিম মাত্রা অতিক্রম করেছে।%s"
+msgstr "স্ট্ৰিম মাত্ৰা অতিক্ৰম কৰিছে।%s"
 
 #: ../src/utils/pacat.c:369
 #, c-format
 msgid "Stream started.%s"
-msgstr "স্ট্রিম আরম্ভ করা হয়েছে। %s"
+msgstr "স্ট্ৰিম আৰম্ভ কৰা হয়েছে। %s"
 
 #: ../src/utils/pacat.c:376
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
-msgstr "%s ডিভাইসে স্ট্রিম স্থানান্তর করা হয়েছে (%u, %ssuspended)।%s"
+msgstr "%s যন্ত্ৰে স্ট্ৰিম স্থানান্তৰ কৰা হয়েছে (%u, %ssuspended)।%s"
 
 #: ../src/utils/pacat.c:376
 msgid "not "
@@ -1254,7 +1254,7 @@ msgstr "not "
 #: ../src/utils/pacat.c:383
 #, c-format
 msgid "Stream buffer attributes changed.%s"
-msgstr "স্ট্রিম বাফারের অ্যাট্রিবিউট পরিবর্তিত হয়েছে। %s"
+msgstr "স্ট্ৰিম বাফাৰেৰ এট্ৰিবিউট পৰিবৰ্তিত হয়েছে। %s"
 
 #: ../src/utils/pacat.c:415
 #, c-format
@@ -1264,17 +1264,17 @@ msgstr "সংযোগ স্থাপিত হয়েছে।%s"
 #: ../src/utils/pacat.c:418
 #, c-format
 msgid "pa_stream_new() failed: %s"
-msgstr "pa_stream_new() ব্যর্থ: %s"
+msgstr "pa_stream_new() ব্যৰ্থ: %s"
 
 #: ../src/utils/pacat.c:450
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
-msgstr "pa_stream_connect_playback() ব্যর্থ: %s"
+msgstr "pa_stream_connect_playback() ব্যৰ্থ: %s"
 
 #: ../src/utils/pacat.c:456
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
-msgstr "pa_stream_connect_record() ব্যর্থ: %s"
+msgstr "pa_stream_connect_record() ব্যৰ্থ: %s"
 
 #: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
 #, c-format
@@ -1283,31 +1283,31 @@ msgstr "সংযোগ বিফল: %s"
 
 #: ../src/utils/pacat.c:503
 msgid "Got EOF."
-msgstr "ফাইলের সমাপ্তি সনাক্ত হয়েছে।"
+msgstr "ফাইলেৰ সমাপ্তি সনাক্ত হয়েছে।"
 
 #: ../src/utils/pacat.c:540
 #, c-format
 msgid "write() failed: %s"
-msgstr "write() ব্যর্থ: %s"
+msgstr "write() ব্যৰ্থ: %s"
 
 #: ../src/utils/pacat.c:561
 msgid "Got signal, exiting."
-msgstr "সিগন্যাল প্রাপ্ত হয়েছে, প্রস্থান করা হবে।"
+msgstr "সিগন্যাল প্ৰাপ্ত হয়েছে, প্ৰস্থান কৰা হ'ব।"
 
 #: ../src/utils/pacat.c:575
 #, c-format
 msgid "Failed to get latency: %s"
-msgstr "লেটেন্সির পরিমাণ প্রাপ্ত করতে ব্যর্থ: %s"
+msgstr "লেটেন্সিৰ পৰিমাণ প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
 #: ../src/utils/pacat.c:580
-#, fuzzy, c-format
+#, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
-msgstr "সময়: %0.3f sec; Latency: %0.0f usec.  \r"
+msgstr "সময়: %0.3f ছেকেণ্ড; লেটেন্সি: %0.0f usec ।"
 
 #: ../src/utils/pacat.c:599
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
-msgstr "pa_stream_update_timing_info() ব্যর্থ: %s"
+msgstr "pa_stream_update_timing_info() ব্যৰ্থ: %s"
 
 #: ../src/utils/pacat.c:609
 #, c-format
@@ -1370,59 +1370,59 @@ msgid ""
 msgstr ""
 "%s [options]\n"
 "\n"
-"  -h, --help                            Show this help\n"
-"      --version                         Show version\n"
+"   h,   help                            Show this help\n"
+"        version                         Show version\n"
 "\n"
-"  -r, --record                          Create a connection for recording\n"
-"  -p, --playback                        Create a connection for playback\n"
+"   r,   record                          Create a connection for recording\n"
+"   p,   playback                        Create a connection for playback\n"
 "\n"
-"  -v, --verbose                         Enable verbose operations\n"
+"   v,   verbose                         Enable verbose operations\n"
 "\n"
-"  -s, --server=SERVER                   The name of the server to connect "
+"   s,   server=SERVER                   The name of the server to connect "
 "to\n"
-"  -d, --device=DEVICE                   The name of the sink/source to "
+"   d,   device=DEVICE                   The name of the sink/source to "
 "connect to\n"
-"  -n, --client-name=NAME                How to call this client on the "
+"   n,   client name=NAME                How to call this client on the "
 "server\n"
-"      --stream-name=NAME                How to call this stream on the "
+"        stream name=NAME                How to call this stream on the "
 "server\n"
-"      --volume=VOLUME                   Specify the initial (linear) volume "
+"        volume=VOLUME                   Specify the initial (linear) volume "
 "in range 0...65536\n"
-"      --rate=SAMPLERATE                 The sample rate in Hz (defaults to "
+"        rate=SAMPLERATE                 The sample rate in Hz (defaults to "
 "44100)\n"
-"      --format=SAMPLEFORMAT             The sample type, one of s16le, "
+"        format=SAMPLEFORMAT             The sample type, one of s16le, "
 "s16be, u8, float32le,\n"
 "                                        float32be, ulaw, alaw, s32le, s32be, "
 "s24le, s24be,\n"
-"                                        s24-32le, s24-32be (defaults to "
+"                                        s24 32le, s24 32be (defaults to "
 "s16ne)\n"
-"      --channels=CHANNELS               The number of channels, 1 for mono, "
+"        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 "
+"        channel map=CHANNELMAP          Channel map to use instead of the "
 "default\n"
-"      --fix-format                      Take the sample format from the sink "
+"        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 "
+"        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 "
+"        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 "
+"        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 "
+"        latency=BYTES                   Request the specified latency in "
 "bytes.\n"
-"      --process-time=BYTES              Request the specified process time "
+"        process time=BYTES              Request the specified process time "
 "per request in bytes.\n"
-"      --property=PROPERTY=VALUE         Set the specified property to the "
+"        property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
-"      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
-"      --list-file-formats               List available file formats.\n"
+"        raw                             Record/play raw PCM data.\n"
+"        file format=FFORMAT             Record/play formatted PCM data.\n"
+"        list file formats               List available file formats.\n"
 
 #: ../src/utils/pacat.c:731
 #, c-format
@@ -1438,12 +1438,12 @@ msgstr ""
 #: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
 #, c-format
 msgid "Invalid client name '%s'"
-msgstr "ক্লায়েন্টের নাম '%s' বৈধ নয়"
+msgstr "ক্লায়েন্টেৰ নাম '%s' বৈধ নয়"
 
 #: ../src/utils/pacat.c:779
 #, c-format
 msgid "Invalid stream name '%s'"
-msgstr "স্ট্রিমের নাম '%s' বৈধ নয়।"
+msgstr "স্ট্ৰিমেৰ নাম '%s' বৈধ নয়।"
 
 #: ../src/utils/pacat.c:816
 #, c-format
@@ -1453,12 +1453,12 @@ msgstr "চ্যানেল ম্যাপ '%s' বৈধ নয়"
 #: ../src/utils/pacat.c:845
 #, c-format
 msgid "Invalid latency specification '%s'"
-msgstr "লেটেন্সির জন্য নির্ধারিত বৈশিষ্ট্য '%s' বৈধ নয়"
+msgstr "লেটেন্সিৰ জন্য নিৰ্ধাৰিত বৈশিষ্ট্য '%s' বৈধ নয়"
 
 #: ../src/utils/pacat.c:852
 #, c-format
 msgid "Invalid process time specification '%s'"
-msgstr "প্রসেসের সময়ের বৈশিষ্ট্য '%s' বৈধ নয়"
+msgstr "প্ৰসেসেৰ সময়েৰ বৈশিষ্ট্য '%s' বৈধ নয়"
 
 #: ../src/utils/pacat.c:864
 #, c-format
@@ -1468,11 +1468,11 @@ msgstr "বৈশিষ্ট্য '%s' বৈধ নয়।"
 #: ../src/utils/pacat.c:881
 #, c-format
 msgid "Unknown file format %s."
-msgstr "ফাইলের অজানা বিন্যাস %s।"
+msgstr "ফাইলেৰ অজানা বিন্যাস %s।"
 
 #: ../src/utils/pacat.c:900
 msgid "Invalid sample specification"
-msgstr "অবৈধ স্যাম্পেল নির্ধারিত"
+msgstr "অবৈধ স্যাম্পেল নিৰ্ধাৰিত"
 
 #: ../src/utils/pacat.c:910
 #, c-format
@@ -1486,47 +1486,46 @@ msgstr "dup2(): %s"
 
 #: ../src/utils/pacat.c:922
 msgid "Too many arguments."
-msgstr "অত্যাধিক আর্গুমেন্ট।"
+msgstr "অত্যাধিক আৰ্গুমেন্ট।"
 
 #: ../src/utils/pacat.c:933
 msgid "Failed to generate sample specification for file."
-msgstr "স্যাম্পেলের মান নির্ধারণের ফাইল নির্মাণ করতে ব্যর্থ"
+msgstr "স্যাম্পেলেৰ মান নিৰ্ধাৰণেৰ ফাইল নিৰ্মাণ কৰতে ব্যৰ্থ"
 
 #: ../src/utils/pacat.c:953
 msgid "Failed to open audio file."
-msgstr "শব্দের ফাইল খুলতে ব্যর্থ।"
+msgstr "শব্দেৰ ফাইল খুলতে ব্যৰ্থ।"
 
 #: ../src/utils/pacat.c:959
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
 msgstr ""
-"সতর্কবার্তা: চিহ্নিত স্যাম্পেল নির্ধারণের ফাইলটির তথ্য, এই ফাইলের থেকে উপলব্ধ তথ্য "
-"দ্বারা প্রতিস্থাপিত হবে।"
+"সতৰ্কবাৰ্তা: চিহ্নিত স্যাম্পেল নিৰ্ধাৰণেৰ ফাইলটিৰ তথ্য, এই ফাইলেৰৰ পৰা উপলব্ধ তথ্য "
+"দ্বাৰা প্ৰতিস্থাপিত হ'ব।"
 
 #: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
 msgid "Failed to determine sample specification from file."
-msgstr "ফাইল থেকে স্যাম্পেল সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ।"
+msgstr "ফাইলৰ পৰা স্যাম্পেল সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ।"
 
 #: ../src/utils/pacat.c:971
 msgid "Warning: Failed to determine channel map from file."
-msgstr "সতর্কবার্তা: ফাইল থেকে চ্যানেলের ম্যাপ নির্ধারণ করতে ব্যর্থ।"
+msgstr "সতৰ্কবাৰ্তা: ফাইলৰ পৰা চ্যানেলেৰ ম্যাপ নিৰ্ধাৰণ কৰতে ব্যৰ্থ।"
 
 #: ../src/utils/pacat.c:982
 msgid "Channel map doesn't match sample specification"
-msgstr "চ্যানেলের ম্যাপ ও স্যাম্পেলের নির্ধারিত মানে গরমিল"
+msgstr "চ্যানেলেৰ ম্যাপ ও স্যাম্পেলেৰ নিৰ্ধাৰিত মানে গৰমিল"
 
 #: ../src/utils/pacat.c:993
 msgid "Warning: failed to write channel map to file."
-msgstr "সতর্কবার্তা: ফাইলের মধ্যে চ্যানেলের ম্যাপ লিখতে ব্যর্থ।"
+msgstr "সতৰ্কবাৰ্তা: ফাইলেত চ্যানেলেৰ ম্যাপ লিখতে ব্যৰ্থ।"
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
-"একটি %s স্ট্রিম খোলা হচ্ছে। এটির জন্য '%s'-র স্যাম্পেলের নির্ধারিত মান ও '%s' "
-"চ্যানেলের ম্যাপ প্রয়োগ করা হবে।"
+"এটা %s স্ট্ৰিম খোলা হচ্ছে। এটিৰ জন্য '%s' ৰ স্যাম্পেলেৰ নিৰ্ধাৰিত মান ও '%s' "
+"চ্যানেলেৰ ম্যাপ প্ৰয়োগ কৰা হ'ব।"
 
 #: ../src/utils/pacat.c:1009
 msgid "recording"
@@ -1534,19 +1533,19 @@ msgstr "ৰেকৰ্ড কৰা হৈছে"
 
 #: ../src/utils/pacat.c:1009
 msgid "playback"
-msgstr "প্লে-বেক"
+msgstr "প্লে বেক"
 
 #: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
 msgid "pa_mainloop_new() failed."
-msgstr "pa_mainloop_new() ব্যর্থ।"
+msgstr "pa_mainloop_new() ব্যৰ্থ।"
 
 #: ../src/utils/pacat.c:1054
 msgid "io_new() failed."
-msgstr "io_new() ব্যর্থ।"
+msgstr "io_new() ব্যৰ্থ।"
 
 #: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
 msgid "pa_context_new() failed."
-msgstr "pa_context_new() ব্যর্থ।"
+msgstr "pa_context_new() ব্যৰ্থ।"
 
 #: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
 #, c-format
@@ -1555,11 +1554,11 @@ msgstr "pa_context_connect() ব্যৰ্থ: %s"
 
 #: ../src/utils/pacat.c:1075
 msgid "pa_context_rttime_new() failed."
-msgstr "pa_context_rttime_new() ব্যর্থ।"
+msgstr "pa_context_rttime_new() ব্যৰ্থ।"
 
 #: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
 msgid "pa_mainloop_run() failed."
-msgstr "pa_mainloop_run() ব্যর্থ।"
+msgstr "pa_mainloop_run() ব্যৰ্থ।"
 
 #: ../src/utils/pasuspender.c:81
 #, c-format
@@ -1614,9 +1613,9 @@ msgid ""
 msgstr ""
 "%s [options] ... \n"
 "\n"
-"  -h, --help                            Show this help\n"
-"      --version                         Show version\n"
-"  -s, --server=SERVER                   The name of the server to connect "
+"   h,   help                            Show this help\n"
+"        version                         Show version\n"
+"   s,   server=SERVER                   The name of the server to connect "
 "to\n"
 "\n"
 
@@ -1649,7 +1648,7 @@ msgstr "pa_mainloop_run() ব্যৰ্থ ।\n"
 #: ../src/utils/pactl.c:135
 #, c-format
 msgid "Failed to get statistics: %s"
-msgstr "পরিসংখ্যান প্রাপ্ত করতে ব্যর্থ: %s"
+msgstr "পৰিসংখ্যান প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
 #: ../src/utils/pactl.c:141
 #, c-format
@@ -1669,7 +1668,7 @@ msgstr "চানেকি কেশ্বৰ মাপ: %s\n"
 #: ../src/utils/pactl.c:156
 #, c-format
 msgid "Failed to get server information: %s"
-msgstr "সার্ভার সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
+msgstr "সাৰ্ভাৰ সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
 #: ../src/utils/pactl.c:164
 #, c-format
@@ -1697,7 +1696,7 @@ msgstr ""
 #: ../src/utils/pactl.c:205
 #, c-format
 msgid "Failed to get sink information: %s"
-msgstr "sink সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
+msgstr "sink সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
 #: ../src/utils/pactl.c:221
 #, c-format
@@ -1741,17 +1740,17 @@ msgstr ""
 #: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
 #, c-format
 msgid "\tPorts:\n"
-msgstr "\tপোর্ট:\n"
+msgstr "\tপোৰ্ট:\n"
 
 #: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
 #, c-format
 msgid "\tActive Port: %s\n"
-msgstr "\tসক্রিয় পোর্ট: %s\n"
+msgstr "\tসক্ৰিয় পোৰ্ট: %s\n"
 
 #: ../src/utils/pactl.c:297
 #, c-format
 msgid "Failed to get source information: %s"
-msgstr "উৎস সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
+msgstr "উৎস সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
 #: ../src/utils/pactl.c:313
 #, c-format
@@ -1803,7 +1802,7 @@ msgstr "n/a"
 #: ../src/utils/pactl.c:375
 #, c-format
 msgid "Failed to get module information: %s"
-msgstr "মডিউল সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
+msgstr "মডিউল সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
 #: ../src/utils/pactl.c:393
 #, c-format
@@ -1825,7 +1824,7 @@ msgstr ""
 #: ../src/utils/pactl.c:412
 #, c-format
 msgid "Failed to get client information: %s"
-msgstr "ক্লায়েন্ট সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
+msgstr "ক্লায়েন্ট সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
 #: ../src/utils/pactl.c:430
 #, c-format
@@ -1845,7 +1844,7 @@ msgstr ""
 #: ../src/utils/pactl.c:447
 #, c-format
 msgid "Failed to get card information: %s"
-msgstr "কার্ড সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
+msgstr "কাৰ্ড সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
 #: ../src/utils/pactl.c:465
 #, c-format
@@ -1877,7 +1876,7 @@ msgstr "\tসক্ৰিয় পাৰ্শ্বৰূপ: %s\n"
 #: ../src/utils/pactl.c:496
 #, c-format
 msgid "Failed to get sink input information: %s"
-msgstr "sink ইনপুট সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
+msgstr "sink নিবেশ সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
 #: ../src/utils/pactl.c:515
 #, c-format
@@ -1919,7 +1918,7 @@ msgstr ""
 #: ../src/utils/pactl.c:554
 #, c-format
 msgid "Failed to get source output information: %s"
-msgstr "উৎস আউটপুট সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
+msgstr "উৎস নিৰ্গম সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
 #: ../src/utils/pactl.c:574
 #, c-format
@@ -1953,7 +1952,7 @@ msgstr ""
 #: ../src/utils/pactl.c:605
 #, c-format
 msgid "Failed to get sample information: %s"
-msgstr "স্যাম্পেল সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
+msgstr "স্যাম্পেল সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
 #: ../src/utils/pactl.c:623
 #, c-format
@@ -1989,20 +1988,20 @@ msgstr ""
 #: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
 #, c-format
 msgid "Failure: %s"
-msgstr "ব্যর্থতা: %s"
+msgstr "ব্যৰ্থতা: %s"
 
 #: ../src/utils/pactl.c:687
 #, c-format
 msgid "Failed to upload sample: %s"
-msgstr "স্যাম্পেল আপলোড করতে ব্যর্থ: %s"
+msgstr "স্যাম্পেল আপলোড কৰতে ব্যৰ্থ: %s"
 
 #: ../src/utils/pactl.c:704
 msgid "Premature end of file"
-msgstr "সম্পূর্ণ হওয়ার পূর্বে ফাইল সমাপ্ত হয়েছে"
+msgstr "সম্পূৰ্ণ হওয়াৰ পূৰ্বে ফাইল সমাপ্ত হয়েছে"
 
 #: ../src/utils/pactl.c:863
 msgid "Got SIGINT, exiting."
-msgstr "SIGINT প্রাপ্ত হয়েছে, প্রস্থান করা হয়েছে।"
+msgstr "SIGINT প্ৰাপ্ত হয়েছে, প্ৰস্থান কৰা হয়েছে।"
 
 #: ../src/utils/pactl.c:869
 #, c-format
@@ -2040,31 +2039,31 @@ msgstr ""
 "%s [options] stat\n"
 "%s [options] list\n"
 "%s [options] exit\n"
-"%s [options] upload-sample FILENAME [NAME]\n"
-"%s [options] play-sample NAME [SINK]\n"
-"%s [options] remove-sample NAME\n"
-"%s [options] move-sink-input SINKINPUT SINK\n"
-"%s [options] move-source-output SOURCEOUTPUT SOURCE\n"
-"%s [options] load-module NAME [ARGS ...]\n"
-"%s [options] unload-module MODULE\n"
-"%s [options] suspend-sink SINK 1|0\n"
-"%s [options] suspend-source SOURCE 1|0\n"
-"%s [options] set-card-profile CARD PROFILE\n"
-"%s [options] set-sink-port SINK PORT\n"
-"%s [options] set-source-port SOURCE PORT\n"
-"%s [options] set-sink-volume SINK VOLUME\n"
-"%s [options] set-source-volume SOURCE VOLUME\n"
-"%s [options] set-sink-input-volume SINKINPUT VOLUME\n"
-"%s [options] set-sink-mute SINK 1|0\n"
-"%s [options] set-source-mute SOURCE 1|0\n"
-"%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] upload sample FILENAME [NAME]\n"
+"%s [options] play sample NAME [SINK]\n"
+"%s [options] remove sample NAME\n"
+"%s [options] move sink input SINKINPUT SINK\n"
+"%s [options] move source output SOURCEOUTPUT SOURCE\n"
+"%s [options] load module NAME [ARGS ...]\n"
+"%s [options] unload module MODULE\n"
+"%s [options] suspend sink SINK 1|0\n"
+"%s [options] suspend source SOURCE 1|0\n"
+"%s [options] set card profile CARD PROFILE\n"
+"%s [options] set sink port SINK PORT\n"
+"%s [options] set source port SOURCE PORT\n"
+"%s [options] set sink volume SINK VOLUME\n"
+"%s [options] set source volume SOURCE VOLUME\n"
+"%s [options] set sink input volume SINKINPUT VOLUME\n"
+"%s [options] set sink mute SINK 1|0\n"
+"%s [options] set source mute SOURCE 1|0\n"
+"%s [options] set sink input mute SINKINPUT 1|0\n"
 "\n"
-"  -h, --help                            Show this help\n"
-"      --version                         Show version\n"
+"   h,   help                            Show this help\n"
+"        version                         Show version\n"
 "\n"
-"  -s, --server=SERVER                   The name of the server to connect "
+"   s,   server=SERVER                   The name of the server to connect "
 "to\n"
-"  -n, --client-name=NAME                How to call this client on the "
+"   n,   client name=NAME                How to call this client on the "
 "server\n"
 
 #: ../src/utils/pactl.c:933
@@ -2076,108 +2075,107 @@ msgid ""
 msgstr ""
 "pactl %s\n"
 "libpulseৰ সৈতে সঙ্কলন কৰা %s\n"
-"libpulse-ৰ সৈতে যুক্ত %s\n"
+"libpulse ৰ সৈতে যুক্ত %s\n"
 
 #: ../src/utils/pactl.c:979
 msgid "Please specify a sample file to load"
-msgstr "লোড করার উদ্দেশ্যে অনুগ্রহ করে একটি স্যাম্পেল ফাইল উল্লেখ করুন"
+msgstr "লোড কৰাৰ উদ্দেশ্যে অনুগ্ৰহ কৰি এটা স্যাম্পেল ফাইল উল্লেখ কৰুন"
 
 #: ../src/utils/pactl.c:992
 msgid "Failed to open sound file."
-msgstr "শব্দের ফাইল খুলতে ব্যর্থ।"
+msgstr "শব্দেৰ ফাইল খুলতে ব্যৰ্থ।"
 
 #: ../src/utils/pactl.c:1004
 msgid "Warning: Failed to determine sample specification from file."
-msgstr "সতর্কবার্তা: ফাইল থেকে স্যাম্পেলের নির্ধারিত মাপ নির্মাণ করতে ব্যর্থ।"
+msgstr "সতৰ্কবাৰ্তা: ফাইলৰ পৰা স্যাম্পেলেৰ নিৰ্ধাৰিত মাপ নিৰ্মাণ কৰতে ব্যৰ্থ।"
 
 #: ../src/utils/pactl.c:1014
 msgid "You have to specify a sample name to play"
-msgstr "বাজানোর উদ্দেশ্যে একটি স্যাম্পেল ফাইল উল্লেখ করা আবশ্যক"
+msgstr "বাজানোৰ উদ্দেশ্যে এটা স্যাম্পেল ফাইল উল্লেখ কৰা আবশ্যক"
 
 #: ../src/utils/pactl.c:1026
 msgid "You have to specify a sample name to remove"
-msgstr "অপসারণের উদ্দেশ্যে একটি স্যাম্পেল ফাইল উল্লেখ করা আবশ্যক"
+msgstr "অপসাৰণেৰ উদ্দেশ্যে এটা স্যাম্পেল ফাইল উল্লেখ কৰা আবশ্যক"
 
 #: ../src/utils/pactl.c:1035
 msgid "You have to specify a sink input index and a sink"
-msgstr "সিংক ইনপুট ইন্ডেক্স ও একটি সিংক নির্ধারণ করা আবশ্যক"
+msgstr "সিংক নিবেশ ইন্ডেক্স ও এটা সিংক নিৰ্ধাৰণ কৰা আবশ্যক"
 
 #: ../src/utils/pactl.c:1045
 msgid "You have to specify a source output index and a source"
-msgstr "সোর্স আউটপুট ইন্ডেক্স ও একটি সোর্স নির্ধারণ করা আবশ্যক"
+msgstr "সোৰ্স নিৰ্গম ইন্ডেক্স ও এটা সোৰ্স নিৰ্ধাৰণ কৰা আবশ্যক"
 
 #: ../src/utils/pactl.c:1060
 msgid "You have to specify a module name and arguments."
-msgstr "মডিউলের নাম ও আর্গুমেন্ট নির্ধারণ করা আবশ্যক।"
+msgstr "মডিউলেৰ নাম ও আৰ্গুমেন্ট নিৰ্ধাৰণ কৰা আবশ্যক।"
 
 #: ../src/utils/pactl.c:1080
 msgid "You have to specify a module index"
-msgstr "মডিউল ইন্ডেক্স নির্ধারণ করা আবশ্যক"
+msgstr "মডিউল ইন্ডেক্স নিৰ্ধাৰণ কৰা আবশ্যক"
 
 #: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
-msgstr "একাধিক সিংক নির্ধারণ করা যাবে না। বুলিয়েন মান নির্ধারণ করা আবশ্যক।"
+msgid "You may not specify more than one sink. You have to specify a boolean value."
+msgstr "একাধিক সিংক নিৰ্ধাৰণ কৰা যাবে না। বুলিয়েন মান নিৰ্ধাৰণ কৰা আবশ্যক।"
 
 #: ../src/utils/pactl.c:1103
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr "একাধিক সোর্স নির্ধারণ করা যাবে না। বুলিয়েন মান নির্ধারণ করা আবশ্যক।"
+msgstr "একাধিক সোৰ্স নিৰ্ধাৰণ কৰা যাবে না। বুলিয়েন মান নিৰ্ধাৰণ কৰা আবশ্যক।"
 
 #: ../src/utils/pactl.c:1115
 msgid "You have to specify a card name/index and a profile name"
-msgstr "কার্ডের নাম/ইন্ডেক্স ও একটি প্রোফাইলের নাম উল্লেখ করা আবশ্যক"
+msgstr "কাৰ্ডেৰ নাম/ইন্ডেক্স ও এটা প্ৰোফাইলেৰ নাম উল্লেখ কৰা আবশ্যক"
 
 #: ../src/utils/pactl.c:1126
 msgid "You have to specify a sink name/index and a port name"
-msgstr "sink-র নাম/ইন্ডেক্স ও একটি পোর্টের নাম উল্লেখ করা আবশ্যক"
+msgstr "sink ৰ নাম/ইন্ডেক্স ও এটা পোৰ্টেৰ নাম উল্লেখ কৰা আবশ্যক"
 
 #: ../src/utils/pactl.c:1137
 msgid "You have to specify a source name/index and a port name"
-msgstr "উৎসের নাম/ইন্ডেক্স ও একটি পোর্টে নাম উল্লেখ করা আবশ্যক"
+msgstr "উৎসেৰ নাম/ইন্ডেক্স ও এটা পোৰ্টে নাম উল্লেখ কৰা আবশ্যক"
 
 #: ../src/utils/pactl.c:1149
 msgid "You have to specify a sink name/index and a volume"
-msgstr "sink-র নাম/ইন্ডেক্স ও একটি পোর্টের নাম উল্লেখ করা আবশ্যক"
+msgstr "sink ৰ নাম/ইন্ডেক্স ও এটা পোৰ্টেৰ নাম উল্লেখ কৰা আবশ্যক"
 
 #: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
 #: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
 #: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
 msgid "Invalid volume specification"
-msgstr "অবৈধ শব্দের মাত্রা নির্ধারিত"
+msgstr "অবৈধ শব্দেৰ মাত্ৰা নিৰ্ধাৰিত"
 
 #: ../src/utils/pactl.c:1166
 msgid "You have to specify a source name/index and a volume"
-msgstr "উৎসের নাম/ইন্ডেক্স ও একটি শব্দের মাত্রা উল্লেখ করা আবশ্যক"
+msgstr "উৎসেৰ নাম/ইন্ডেক্স ও এটা শব্দেৰ মাত্ৰা উল্লেখ কৰা আবশ্যক"
 
 #: ../src/utils/pactl.c:1183
 msgid "You have to specify a sink input index and a volume"
-msgstr "সিংক ইনপুট ইন্ডেক্স ও শব্দের মাত্রা নির্ধারণ করা আবশ্যক"
+msgstr "সিংক নিবেশ ইন্ডেক্স ও শব্দেৰ মাত্ৰা নিৰ্ধাৰণ কৰা আবশ্যক"
 
 #: ../src/utils/pactl.c:1188
 msgid "Invalid sink input index"
-msgstr "সিংক ইনপুট ইন্ডেক্স বৈধ নয়"
+msgstr "সিংক নিবেশ ইন্ডেক্স বৈধ নয়"
 
 #: ../src/utils/pactl.c:1204
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr "sink-র নাম/ইন্ডেক্স ও একটি নিঃশব্দতার বুলিয়ান উল্লেখ করা আবশ্যক"
+msgstr "sink ৰ নাম/ইন্ডেক্স ও এটা নিঃশব্দতাৰ বুলিয়ান উল্লেখ কৰা আবশ্যক"
 
 #: ../src/utils/pactl.c:1221
 msgid "You have to specify a source name/index and a mute boolean"
-msgstr "উৎসের নাম/ইন্ডেক্স ও নিঃশব্দতার বুলিয়ান উল্লেখ করা আবশ্যক"
+msgstr "উৎসেৰ নাম/ইন্ডেক্স ও নিঃশব্দতাৰ বুলিয়ান উল্লেখ কৰা আবশ্যক"
 
 #: ../src/utils/pactl.c:1238
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr "সিংক ইনপুট ইন্ডেক্স ও নিঃশব্দতার বুলিয়ান নির্ধারণ করা আবশ্যক"
+msgstr "সিংক নিবেশ ইন্ডেক্স ও নিঃশব্দতাৰ বুলিয়ান নিৰ্ধাৰণ কৰা আবশ্যক"
 
 #: ../src/utils/pactl.c:1243
 msgid "Invalid sink input index specification"
-msgstr "অবৈধ সিংক ইনপুট ইন্ডেক্স নির্ধারিত"
+msgstr "অবৈধ সিংক নিবেশ ইন্ডেক্স নিৰ্ধাৰিত"
 
 #: ../src/utils/pactl.c:1262
 msgid "No valid command specified."
-msgstr "কোনো বৈধ কমান্ড নির্ধারিত হয়নি।"
+msgstr "কোনো বৈধ কমান্ড নিৰ্ধাৰিত হয়নি।"
 
 #: ../src/utils/pax11publish.c:61
 #, c-format
@@ -2190,18 +2188,18 @@ msgid ""
 "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"
+"%s [ D display] [ S server] [ O sink] [ I source] [ c file]  [ d| e| i| r]\n"
 "\n"
-" -d    Show current PulseAudio data attached to X11 display (default)\n"
-" -e    Export local PulseAudio data to X11 display\n"
-" -i    Import PulseAudio data from X11 display to local environment "
+"  d    Show current PulseAudio data attached to X11 display (default)\n"
+"  e    Export local PulseAudio data to X11 display\n"
+"  i    Import PulseAudio data from X11 display to local environment "
 "variables and cookie file.\n"
-" -r    Remove PulseAudio data from X11 display\n"
+"  r    Remove PulseAudio data from X11 display\n"
 
 #: ../src/utils/pax11publish.c:94
 #, c-format
 msgid "Failed to parse command line.\n"
-msgstr "আদেশ-শাৰী বিশ্লেষণ কৰিবলৈ ব্যৰ্থ ।\n"
+msgstr "আদেশ শাৰী বিশ্লেষণ কৰিবলৈ ব্যৰ্থ ।\n"
 
 #: ../src/utils/pax11publish.c:108
 #, c-format
@@ -2260,7 +2258,7 @@ msgstr "এতিয়াও বাস্তবায়িত নহয় ।\n"
 
 #: ../src/utils/pacmd.c:69
 msgid "No PulseAudio daemon running, or not running as session daemon."
-msgstr "PulseAudio ডেমন চলছে না অথবা সেশানের ডেমন রূপে চলছে না।"
+msgstr "PulseAudio ডেমন চলছে না বা সেশানৰ ডেমন ৰূপে চলছে না।"
 
 #: ../src/utils/pacmd.c:74
 #, c-format
@@ -2312,7 +2310,7 @@ msgstr ""
 "ALSA ই আমাক যন্ত্ৰৰ পৰা নতুন তথ্য লিখিবলৈ উথালে, কিন্তু একো লিখিবলৈ নাছিল!\n"
 "অতি সম্ভৱ এইটো ALSA চালক '%s' ৰ এটা বাগ । অনুগ্ৰহ কৰি এই সমস্যা ALSA বিকাশকক "
 "জনাওক ।\n"
-"POLLOUT নিৰ্ধাৰিত হোৱাৰি পিছতো আমি উথিলো -- কিন্তু তাৰ পিছৰ snd_pcm_avail() এ ০ "
+"POLLOUT নিৰ্ধাৰিত হোৱাৰি পিছতো আমি উথিলো    কিন্তু তাৰ পিছৰ snd_pcm_avail() এ ০ "
 "দিলে বা অন্য এটা মান < min_avail."
 
 #: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
@@ -2328,7 +2326,7 @@ msgstr ""
 "ALSA ই আমাক যন্ত্ৰৰ পৰা নতুন তথ্য পঢ়িবলৈ উথালে, কিন্তু একো পঢ়িবলৈ নাছিল!\n"
 "অতি সম্ভৱ এইটো ALSA চালক '%s' ৰ এটা বাগ । অনুগ্ৰহ কৰি এই সমস্যা ALSA বিকাশকক "
 "জনাওক ।\n"
-"POLLIN নিৰ্ধাৰিত হোৱাৰি পিছতো আমি উথিলো -- কিন্তু তাৰ পিছৰ snd_pcm_avail() এ ০ "
+"POLLIN নিৰ্ধাৰিত হোৱাৰি পিছতো আমি উথিলো    কিন্তু তাৰ পিছৰ snd_pcm_avail() এ ০ "
 "দিলে বা অন্য এটা মান < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
@@ -2343,7 +2341,7 @@ msgstr "High Fidelity Playback (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2198
 msgid "High Fidelity Capture (A2DP)"
-msgstr "হাই-ফিডেলিটি ক্যাপচার (A2DP)"
+msgstr "হাই ফিডেলিটি ক্যাপচাৰ (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2213
 msgid "Telephony Duplex (HSP/HFP)"
@@ -2356,216 +2354,204 @@ msgstr "PulseAudio ধ্বনি সেৱক"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "নিৰ্গম যন্ত্ৰ"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "নিবেশ যন্ত্ৰ"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "@HOSTNAME@ ত অ'ডিঅ'"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "নিবেশ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "ডকিং স্টেছনৰ পৰা নিবেশ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "ডকিং স্টেছনৰ মাইক্ৰোফোন"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "লাইন ইন"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "মাইক্ৰোফোন"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "বহিস্থিত মাইক্ৰোফোন"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "আভ্যন্তৰীণ অ'ডিঅ'"
+msgstr "অভ্যন্তৰীণ মাইক্ৰোফোন"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "ৰেডিঅ'"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "ভিডিঅ'"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "স্বয়ংক্ৰিয় গেইন নিয়ন্ত্ৰণ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "স্বয়ংক্ৰিয় গেইন নিয়ন্ত্ৰণ প্ৰয়োগ কৰা ন'হ'ব"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "বুস্ট"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "বুস্ট প্ৰয়োগ কৰা ন'হ'ব"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "বিবৰ্ধক"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "বিবৰ্ধন প্ৰয়োগ কৰা ন'হ'ব"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "এনালগ নিবেশ"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "এনালগ মাইক্ৰোফোন"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "এনালগ লাইন ইন"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "এনালগ ৰেডিও"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "এনালগ ভিডিঅ'"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Output"
-msgstr ""
+msgstr "এনালগ নিৰ্গম"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "এনালগ হেড ফোন"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "এনালগ নিৰ্গম (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "এনালগ মোনো নিৰ্গম"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
-#, fuzzy, c-format
+#, c-format
 msgid "%s+%s"
 msgstr "%s %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
-#, fuzzy, c-format
+#, c-format
 msgid "%s / %s"
 msgstr "%s %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "এনালগ মোনো"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
-#, fuzzy
 msgid "Analog Stereo"
-msgstr "স্টিৰিও"
+msgstr "এনালগ স্টিৰিঅ'"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "ছাৰাউণ্ড ৪.১"
+msgstr "এনালগ ছাৰাউন্ড ২.১"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "ছাৰাউণ্ড ৪.০"
+msgstr "এনালগ ছাৰাউন্ড ৩.০"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "ছাৰাউণ্ড ৪.১"
+msgstr "এনালগ ছাৰাউন্ড ৩.১"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
-#, fuzzy
 msgid "Analog Surround 4.0"
-msgstr "ছাৰাউণ্ড ৪.০"
+msgstr "এনালগ ছাৰাউন্ড ৪.০"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
-#, fuzzy
 msgid "Analog Surround 4.1"
-msgstr "ছাৰাউণ্ড ৪.১"
+msgstr "এনালগ ছাৰাউন্ড ৪.১"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
-#, fuzzy
 msgid "Analog Surround 5.0"
-msgstr "ছাৰাউণ্ড ৫.০"
+msgstr "এনালগ ছাৰাউন্ড ৫.০"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
-#, fuzzy
 msgid "Analog Surround 5.1"
-msgstr "ছাৰাউণ্ড ৫.১"
+msgstr "এনালগ ছাৰাউন্ড ৫.১"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "ছাৰাউণ্ড ৪.০"
+msgstr "এনালগ ছাৰাউন্ড ৬.০"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "ছাৰাউণ্ড ৪.১"
+msgstr "এনালগ ছাৰাউন্ড ৬.১"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "ছাৰাউণ্ড ৪.০"
+msgstr "এনালগ ছাৰাউন্ড ৭.০"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
-#, fuzzy
 msgid "Analog Surround 7.1"
-msgstr "ছাৰাউণ্ড ৭.১"
+msgstr "এনালগ ছাৰাউন্ড ৭.১"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "ডিজিটেল স্টিৰিঅ' (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "ডিজিটেল ছাৰাউন্ড ৪.০ (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "ডিজিটেল ছাৰাউন্ড ৪.০ (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "ডিজিটেল ছাৰাউন্ড ৫.১ (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "ডিজিটেল স্টিৰিঅ' (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "এনালগ মোনো ডুপ্লেক্স"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "এনালগ স্টিৰিঅ' ডুপ্লেক্স"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "ডিজিটেল স্টিৰিঅ' ডুপ্লেক্স (IEC958)"
+

commit 2a322d425096316b2c1a451f818c5bb9720264db
Author: mrtom <mrtom at fedoraproject.org>
Date:   Tue Dec 15 07:58:41 2009 +0000

    Sending translation for French

diff --git a/po/fr.po b/po/fr.po
index 1cdea52..89d27d7 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -1,29 +1,31 @@
 # French translation of pulseaudio.
 # Copyright (C) 2006-2008 Lennart Poettering
 # This file is distributed under the same license as the pulseaudio package.
+#
+#
 # Robert-André Mauchin <zebob.m at pengzone.org>, 2008.
 # Michaël Ughetto <telimektar esraonline com>, 2008.
 # Pablo Martin-Gomez <pablo.martin-gomez at laposte.net>, 2008.
 # Corentin Perard <corentin.perard at gmail.com>, 2009.
-#
-#
+# Thomas Canniot <mrtom at fedoraproject.org>, 2009.
 msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio trunk\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-04-26 17:22+0200\n"
-"Last-Translator: Corentin Perard <corentin.perard at gmail.com>\n"
+"POT-Creation-Date: 2009-12-04 13:02+0000\n"
+"PO-Revision-Date: 2009-12-09 21:40+0100\n"
+"Last-Translator: Thomas Canniot <mrtom at fedoraproject.org>\n"
 "Language-Team: French <fedora-trans-fr at redhat.com>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n>1;\n"
+"X-Generator: Lokalize 1.0\n"
 
 #: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
 #, c-format
 msgid "%s %s"
-msgstr ""
+msgstr "%s %s"
 
 #: ../src/modules/alsa/alsa-util.c:1106
 #, c-format
@@ -66,15 +68,15 @@ msgstr ""
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr ""
+msgstr "Garde toujours au moins une destination même si elle est vide"
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
-msgstr ""
+msgstr "Sortie obsolète"
 
 #: ../src/modules/module-ladspa-sink.c:49
 msgid "Virtual LADSPA sink"
-msgstr ""
+msgstr "Destination virtuelle LADSPA"
 
 #: ../src/modules/module-ladspa-sink.c:53
 msgid ""
@@ -84,15 +86,21 @@ msgid ""
 "plugin name> label=<ladspa plugin label> control=<comma seperated list of "
 "input control values>"
 msgstr ""
+"sink_name=<nom de la destination> sink_properties=<propriétés de la "
+"destination> "
+"master=<nom de la destination à filter> format=<format de l'échantillon> "
+"rate=<taux d'échantillonage> "
+"channels=<nombre de canaux> channel_map=<plan des canaux> plugin=<nom de "
+"l'extension ladspa> label=<étiquette de l'extension ladspa> control=<liste des "
+"valeurs de contrôle de l'entrée séparées par des virgules>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
-msgstr ""
+msgstr "Horloge de la destination vide"
 
 #: ../src/modules/module-null-sink.c:291
-#, fuzzy
 msgid "Null Output"
-msgstr "Sortie %s"
+msgstr "Sortie vide"
 
 #: ../src/pulsecore/sink.c:2613
 msgid "Internal Audio"
@@ -337,10 +345,9 @@ msgstr "Échec lors de l'obtention de l'ID de la machine"
 msgid "Machine ID is %s."
 msgstr "L'ID de la machine est %s."
 
-#: ../src/daemon/main.c:773
-#, fuzzy, c-format
+#: ../src/daemon/main.c:773, c-format
 msgid "Session ID is %s."
-msgstr "L'ID de la machine est %s."
+msgstr "L'ID de la session est %s."
 
 #: ../src/daemon/main.c:779
 #, c-format
@@ -352,10 +359,9 @@ msgstr "Utilisation du répertoire d'exécution %s."
 msgid "Using state directory %s."
 msgstr "Utilisation du répertoire d'état %s."
 
-#: ../src/daemon/main.c:787
-#, fuzzy, c-format
+#: ../src/daemon/main.c:787, c-format
 msgid "Using modules directory %s."
-msgstr "Utilisation du répertoire d'exécution %s."
+msgstr "Utilisation du répertoire des modules %s."
 
 #: ../src/daemon/main.c:789
 #, c-format
@@ -371,6 +377,12 @@ msgid ""
 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
 "explanation why system mode is usually a bad idea."
 msgstr ""
+"Vous exécutez PA dans un mode système. Sachez que vous ne devriez pas faire "
+"cela.\n"
+"Si vous choisissez malgré tout de le faire, vous êtes responsable de tout "
+"dysfonctionnement inattendu.\n"
+"Veuillez lire http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode pour "
+"comprendre pourquoi le mode système est généralement une mauvaise idée."
 
 #: ../src/daemon/main.c:809
 msgid "pa_pid_file_create() failed."
@@ -677,7 +689,7 @@ msgstr "Chargement unique : %s\n"
 #: ../src/daemon/dumpmodules.c:75
 #, c-format
 msgid "DEPRECATION WARNING: %s\n"
-msgstr ""
+msgstr "AVERTISSEMENT D'OBSOLESCENCE : %s\n"
 
 #: ../src/daemon/dumpmodules.c:79
 #, c-format
@@ -764,9 +776,8 @@ msgid "### Read from configuration file: %s ###\n"
 msgstr "### Lecture à partir du fichier de configuration : %s ###\n"
 
 #: ../src/daemon/caps.c:62
-#, fuzzy
 msgid "Cleaning up privileges."
-msgstr "Abandon des privilèges root."
+msgstr "Nettoyage des privilèges."
 
 #: ../src/daemon/pulseaudio.desktop.in.h:1
 msgid "PulseAudio Sound System"
@@ -1112,11 +1123,11 @@ msgstr "Le client s'est divisé (Client forked)"
 
 #: ../src/pulse/error.c:68
 msgid "Input/Output error"
-msgstr ""
+msgstr "Erreur d'entrée/sortie"
 
 #: ../src/pulse/error.c:69
 msgid "Device or resource busy"
-msgstr ""
+msgstr "Périphérique ou ressource occupé"
 
 #: ../src/pulse/sample.c:172
 #, c-format
@@ -1175,178 +1186,145 @@ msgstr "waitpid() : %s"
 msgid "Received message for unknown extension '%s'"
 msgstr "Message reçu pour une extension inconnue « %s »"
 
-#: ../src/utils/pacat.c:108
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:108, c-format
 msgid "Failed to drain stream: %s"
-msgstr "Échec lors du vidage du flux : %s\n"
+msgstr "Échec lors du vidage du flux : %s"
 
 #: ../src/utils/pacat.c:113
-#, fuzzy
 msgid "Playback stream drained."
-msgstr "Flux de lecture vidé.\n"
+msgstr "Flux de lecture vidé."
 
 #: ../src/utils/pacat.c:123
-#, fuzzy
 msgid "Draining connection to server."
-msgstr "Vidage de la connexion au serveur.\n"
+msgstr "Vidage de la connexion au serveur."
 
-#: ../src/utils/pacat.c:136
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:136, c-format
 msgid "pa_stream_drain(): %s"
-msgstr "pa_stream_drain() : %s\n"
+msgstr "pa_stream_drain() : %s"
 
-#: ../src/utils/pacat.c:159
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:159, c-format
 msgid "pa_stream_write() failed: %s"
-msgstr "Échec de pa_stream_write() : %s\n"
+msgstr "Échec de pa_stream_write() : %s"
 
-#: ../src/utils/pacat.c:197
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:197, c-format
 msgid "pa_stream_begin_write() failed: %s"
-msgstr "Échec de pa_stream_write() : %s\n"
+msgstr "Échec de pa_stream_begin_write() : %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267, c-format
 msgid "pa_stream_peek() failed: %s"
-msgstr "Échec de pa_stream_peek() : %s\n"
+msgstr "Échec de pa_stream_peek() : %s"
 
 #: ../src/utils/pacat.c:307
-#, fuzzy
 msgid "Stream successfully created."
-msgstr "Création du flux réussie.\n"
+msgstr "Création du flux réussie."
 
-#: ../src/utils/pacat.c:310
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:310, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
-msgstr "Échec de pa_stream_get_buffer_attr() : %s\n"
+msgstr "Échec de pa_stream_get_buffer_attr() : %s"
 
-#: ../src/utils/pacat.c:314
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:314, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
-msgstr "Mesures du tampon : maxlength=%u, tlength=%u, prebuf=%u, minreq=%u\n"
+msgstr "Mesures du tampon : maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:317, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
-msgstr "Mesures du tampon : maxlength=%u, fragsize=%u\n"
+msgstr "Mesures du tampon : maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:321, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr ""
-"Utilisation de la spécification d'échantillon « %s », plan des canaux « %s ».\n"
+"Utilisation de la spécification d'échantillon « %s », plan des canaux « %s »."
 
 # l'espace manquant entre %s et suspended est voulu
-#: ../src/utils/pacat.c:325
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:325, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
-msgstr "Connecté au périphérique %s (%u, %ssuspendu).\n"
+msgstr "Connecté au périphérique %s (%u, %ssuspendu)."
 
-#: ../src/utils/pacat.c:335
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:335, c-format
 msgid "Stream error: %s"
-msgstr "Erreur du flux : %s\n"
+msgstr "Erreur du flux : %s"
 
-#: ../src/utils/pacat.c:345
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:345, c-format
 msgid "Stream device suspended.%s"
-msgstr "Périphérique de flux suspendu %s \n"
+msgstr "Périphérique de flux suspendu.%s"
 
-#: ../src/utils/pacat.c:347
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:347, c-format
 msgid "Stream device resumed.%s"
-msgstr "Périphérique de flux repris %s \n"
+msgstr "Périphérique de flux repris.%s"
 
-#: ../src/utils/pacat.c:355
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:355, c-format
 msgid "Stream underrun.%s"
-msgstr "Flux vide %s \n"
+msgstr "Flux vide.%s"
 
-#: ../src/utils/pacat.c:362
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:362, c-format
 msgid "Stream overrun.%s"
-msgstr "Flux saturé %s \n"
+msgstr "Flux saturé.%s"
 
-#: ../src/utils/pacat.c:369
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:369, c-format
 msgid "Stream started.%s"
-msgstr "Flux démarré %s \n"
+msgstr "Flux démarré.%s"
 
-#: ../src/utils/pacat.c:376
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:376, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
-msgstr "Flux déplacé vers le périphérique %s (%u, %ssuspendu).%s \n"
+msgstr "Flux déplacé vers le périphérique %s (%u, %ssuspendu).%s"
 
 # suspendu ou non suspendu
 #: ../src/utils/pacat.c:376
 msgid "not "
 msgstr "non "
 
-#: ../src/utils/pacat.c:383
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:383, c-format
 msgid "Stream buffer attributes changed.%s"
-msgstr "Des attributs du tampon de flux ont changé. %s \n"
+msgstr "Des attributs du tampon de flux ont changé.%s"
 
-#: ../src/utils/pacat.c:415
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:415, c-format
 msgid "Connection established.%s"
-msgstr "Connection établie.%s \n"
+msgstr "Connexion établie.%s"
 
-#: ../src/utils/pacat.c:418
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:418, c-format
 msgid "pa_stream_new() failed: %s"
-msgstr "Échec de pa_stream_new() : %s\n"
+msgstr "Échec de pa_stream_new() : %s"
 
-#: ../src/utils/pacat.c:450
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:450, c-format
 msgid "pa_stream_connect_playback() failed: %s"
-msgstr "Échec de pa_stream_connect_playback() : %s\n"
+msgstr "Échec de pa_stream_connect_playback() : %s"
 
-#: ../src/utils/pacat.c:456
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:456, c-format
 msgid "pa_stream_connect_record() failed: %s"
-msgstr "Échec de pa_stream_connect_record() : %s\n"
+msgstr "Échec de pa_stream_connect_record() : %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857, c-format
 msgid "Connection failure: %s"
-msgstr "Échec lors de la connexion : %s\n"
+msgstr "Échec lors de la connexion : %s"
 
 #: ../src/utils/pacat.c:503
-#, fuzzy
 msgid "Got EOF."
-msgstr "EOF obtenu.\n"
+msgstr "EOF obtenu."
 
-#: ../src/utils/pacat.c:540
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:540, c-format
 msgid "write() failed: %s"
-msgstr "Échec de write() : %s\n"
+msgstr "Échec de write() : %s"
 
 #: ../src/utils/pacat.c:561
-#, fuzzy
 msgid "Got signal, exiting."
-msgstr "Signal obtenu, fermeture.\n"
+msgstr "Signal obtenu, fermeture."
 
-#: ../src/utils/pacat.c:575
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:575, c-format
 msgid "Failed to get latency: %s"
-msgstr "Échec lors de l'obtention de la latence : %s\n"
+msgstr "Échec lors de l'obtention de la latence : %s"
 
-#: ../src/utils/pacat.c:580
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:580, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
-msgstr "Durée : %0.3f s ; Latency : %0.0f µs.  \r"
+msgstr "Durée : %0.3f sec. ; Latence : %0.0f µsec."
 
-#: ../src/utils/pacat.c:599
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:599, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
-msgstr "Échec de pa_stream_update_timing_info() : %s\n"
+msgstr "Échec de pa_stream_update_timing_info() : %s"
 
 # 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:609
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:609, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1455,6 +1433,14 @@ msgstr ""
 "octets.\n"
 "      --process-time=OCTETS             Demande le temps de traitement "
 "indiqué par requête en octets.\n"
+"      --property=PROPRIÉTÉ=VALEUR         Attribut la propriété définie à la "
+"valeur définie.\n"
+"      --raw                             Enregistre/lit les données PCM brutes."
+"\n"
+"      --file-format=FFORMAT             Enregistre/lit les données PCM "
+"formatées.\n"
+"      --list-file-formats               Liste les formats de fichiers "
+"disponibles.\n"
 
 #: ../src/utils/pacat.c:731
 #, c-format
@@ -1467,104 +1453,92 @@ msgstr ""
 "Compilé avec libpulse %s\n"
 "Lié avec libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953, c-format
 msgid "Invalid client name '%s'"
-msgstr "Plan des canaux invalide « %s »\n"
+msgstr "Nom du client invalide « %s »"
 
-#: ../src/utils/pacat.c:779
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:779, c-format
 msgid "Invalid stream name '%s'"
-msgstr "Méthode de rééchantillonnage invalide « %s »."
+msgstr "Nom du flux invalide « %s »"
 
-#: ../src/utils/pacat.c:816
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:816, c-format
 msgid "Invalid channel map '%s'"
-msgstr "Plan des canaux invalide « %s »\n"
+msgstr "Plan des canaux invalide « %s »"
 
-#: ../src/utils/pacat.c:845
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:845, c-format
 msgid "Invalid latency specification '%s'"
-msgstr "Spécification de latence invalide « %s »\n"
+msgstr "Spécification de latence invalide « %s »"
 
-#: ../src/utils/pacat.c:852
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:852, c-format
 msgid "Invalid process time specification '%s'"
-msgstr "Spécification de temps de traitement invalide « %s »\n"
+msgstr "Spécification de temps de traitement invalide « %s »"
 
-#: ../src/utils/pacat.c:864
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:864, c-format
 msgid "Invalid property '%s'"
-msgstr "Méthode de rééchantillonnage invalide « %s »."
+msgstr "Propriété invalide « %s »"
 
 #: ../src/utils/pacat.c:881
 #, c-format
 msgid "Unknown file format %s."
-msgstr ""
+msgstr "Format de fichier inconnu %s."
 
 #: ../src/utils/pacat.c:900
-#, fuzzy
 msgid "Invalid sample specification"
-msgstr "Spécification d'échantillon invalide\n"
+msgstr "Spécification d'échantillon invalide"
 
-#: ../src/utils/pacat.c:910
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:910, c-format
 msgid "open(): %s"
-msgstr "open() : %s\n"
+msgstr "open() : %s"
 
-#: ../src/utils/pacat.c:915
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:915, c-format
 msgid "dup2(): %s"
-msgstr "dup2() : %s\n"
+msgstr "dup2() : %s"
 
 #: ../src/utils/pacat.c:922
-#, fuzzy
 msgid "Too many arguments."
-msgstr "Trop de paramètres.\n"
+msgstr "Trop de paramètres."
 
 #: ../src/utils/pacat.c:933
-#, fuzzy
 msgid "Failed to generate sample specification for file."
-msgstr "Échec lors de l'obtention des informations de l'échantillon : %s\n"
+msgstr ""
+"Échec lors de la génération des informations de l'échantillon du fichier."
 
 #: ../src/utils/pacat.c:953
-#, fuzzy
 msgid "Failed to open audio file."
-msgstr "Échec lors de l'ouverture du fichier audio.\n"
+msgstr "Échec lors de l'ouverture du fichier audio."
 
 #: ../src/utils/pacat.c:959
-#, fuzzy
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
-msgstr "Ouverture d'un flux %s avec une spécification d'échantillon « %s ».\n"
+msgstr ""
+"Avertissement : les spécifications de l'échantillon spécifié seront écrasées "
+"par celles du fichier."
 
 #: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
-#, fuzzy
 msgid "Failed to determine sample specification from file."
-msgstr "Échec lors de l'obtention des informations de l'échantillon : %s\n"
+msgstr "Échec lors de l'obtention des informations de l'échantillon du fichier."
 
 #: ../src/utils/pacat.c:971
-#, fuzzy
 msgid "Warning: Failed to determine channel map from file."
-msgstr "Ouverture d'un flux %s avec une spécification d'échantillon « %s ».\n"
+msgstr ""
+"Avertissement : échec lors de l'obtention des informations du plan des canaux "
+"du fichier."
 
 #: ../src/utils/pacat.c:982
-#, fuzzy
 msgid "Channel map doesn't match sample specification"
-msgstr ""
-"Le plan des canaux ne correspond pas à la spécification d'échantillon\n"
+msgstr "Le plan des canaux ne correspond pas à la spécification d'échantillon"
 
 #: ../src/utils/pacat.c:993
-#, fuzzy
 msgid "Warning: failed to write channel map to file."
-msgstr "Ouverture d'un flux %s avec une spécification d'échantillon « %s ».\n"
+msgstr ""
+"Avertissement : Échec lors de l'écriture du plan des canaux dans le fichier."
 
-#: ../src/utils/pacat.c:1008
-#, fuzzy, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr "Ouverture d'un flux %s avec une spécification d'échantillon « %s ».\n"
+#: ../src/utils/pacat.c:1008, c-format
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr ""
+"Ouverture d'un flux %s avec une spécification d'échantillon « %s » et un plan "
+"des canaux « %s »."
 
 #: ../src/utils/pacat.c:1009
 msgid "recording"
@@ -1575,19 +1549,16 @@ msgid "playback"
 msgstr "lecture"
 
 #: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
-#, fuzzy
 msgid "pa_mainloop_new() failed."
-msgstr "Échec de pa_mainloop_new().\n"
+msgstr "Échec de pa_mainloop_new()."
 
 #: ../src/utils/pacat.c:1054
-#, fuzzy
 msgid "io_new() failed."
-msgstr "Échec de io_new().\n"
+msgstr "Échec de io_new()."
 
 #: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
-#, fuzzy
 msgid "pa_context_new() failed."
-msgstr "Échec de pa_context_new().\n"
+msgstr "Échec de pa_context_new()."
 
 #: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
 #, c-format
@@ -1595,14 +1566,12 @@ msgid "pa_context_connect() failed: %s"
 msgstr "Échec de pa_context_connect() : %s"
 
 #: ../src/utils/pacat.c:1075
-#, fuzzy
 msgid "pa_context_rttime_new() failed."
-msgstr "Échec de pa_context_new().\n"
+msgstr "Échec de pa_context_rttime_new()."
 
 #: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
-#, fuzzy
 msgid "pa_mainloop_run() failed."
-msgstr "Échec de pa_mainloop_run().\n"
+msgstr "Échec de pa_mainloop_run()."
 
 #: ../src/utils/pasuspender.c:81
 #, c-format
@@ -1627,8 +1596,7 @@ msgstr "Échec lors de la reprise : %s\n"
 #: ../src/utils/pasuspender.c:147
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
-msgstr ""
-"AVERTISSEMENT : le serveur de son n'est pas local, suspension annulée.\n"
+msgstr "AVERTISSEMENT : le serveur de son n'est pas local, suspension annulée.\n"
 
 #: ../src/utils/pasuspender.c:159
 #, c-format
@@ -1690,10 +1658,9 @@ msgstr "Échec de pa_context_new().\n"
 msgid "pa_mainloop_run() failed.\n"
 msgstr "Échec de pa_mainloop_run().\n"
 
-#: ../src/utils/pactl.c:135
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:135, c-format
 msgid "Failed to get statistics: %s"
-msgstr "Échec lors de l'obtention des statistiques : %s\n"
+msgstr "Échec lors de l'obtention des statistiques : %s"
 
 #: ../src/utils/pactl.c:141
 #, c-format
@@ -1712,10 +1679,9 @@ msgstr ""
 msgid "Sample cache size: %s\n"
 msgstr "Taille du cache de l'échantillon : %s\n"
 
-#: ../src/utils/pactl.c:156
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:156, c-format
 msgid "Failed to get server information: %s"
-msgstr "Échec lors de l'obtention des informations du serveur : %s\n"
+msgstr "Échec lors de l'obtention des informations du serveur : %s"
 
 #: ../src/utils/pactl.c:164
 #, c-format
@@ -1740,10 +1706,9 @@ msgstr ""
 "Source par défaut : %s\n"
 "Cookie : %08x\n"
 
-#: ../src/utils/pactl.c:205
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:205, c-format
 msgid "Failed to get sink information: %s"
-msgstr "Échec lors de l'obtention des informations sur la destination : %s\n"
+msgstr "Échec lors de l'obtention des informations sur la destination : %s"
 
 # demander à Lennart s'il s'agit de monitor of source
 #: ../src/utils/pactl.c:221
@@ -1785,20 +1750,17 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360, c-format
 msgid "\tPorts:\n"
-msgstr "\tProfils :\n"
+msgstr "\tPorts :\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366, c-format
 msgid "\tActive Port: %s\n"
-msgstr "\tProfil actif : %s\n"
+msgstr "\tPort actif : %s\n"
 
-#: ../src/utils/pactl.c:297
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:297, c-format
 msgid "Failed to get source information: %s"
-msgstr "Échec lors de l'obtention des informations sur la source : %s\n"
+msgstr "Échec lors de l'obtention des informations sur la source : %s"
 
 #: ../src/utils/pactl.c:313
 #, c-format
@@ -1847,10 +1809,9 @@ msgstr ""
 msgid "n/a"
 msgstr "n/d"
 
-#: ../src/utils/pactl.c:375
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:375, c-format
 msgid "Failed to get module information: %s"
-msgstr "Échec lors de l'obtention des informations du module : %s\n"
+msgstr "Échec lors de l'obtention des informations du module : %s"
 
 #: ../src/utils/pactl.c:393
 #, c-format
@@ -1869,10 +1830,9 @@ msgstr ""
 "\tPropriétés : \n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:412, c-format
 msgid "Failed to get client information: %s"
-msgstr "Échec lors de l'obtention des informations du client : %s\n"
+msgstr "Échec lors de l'obtention des informations du client : %s"
 
 #: ../src/utils/pactl.c:430
 #, c-format
@@ -1889,10 +1849,9 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:447, c-format
 msgid "Failed to get card information: %s"
-msgstr "Impossible d'obtenir des informations sur la carte : %s\n"
+msgstr "Impossible d'obtenir des informations sur la carte : %s"
 
 #: ../src/utils/pactl.c:465
 #, c-format
@@ -1921,12 +1880,10 @@ msgstr "\tProfils :\n"
 msgid "\tActive Profile: %s\n"
 msgstr "\tProfil actif : %s\n"
 
-#: ../src/utils/pactl.c:496
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:496, c-format
 msgid "Failed to get sink input information: %s"
 msgstr ""
-"Échec lors de l'obtention des informations de l'entrée de la destination : %"
-"s\n"
+"Échec lors de l'obtention des informations de l'entrée de la destination : %s"
 
 #: ../src/utils/pactl.c:515
 #, c-format
@@ -1965,11 +1922,10 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:554, c-format
 msgid "Failed to get source output information: %s"
 msgstr ""
-"Échec lors de l'obtention des informations de la sortie de la source : %s\n"
+"Échec lors de l'obtention des informations de la sortie de la source : %s"
 
 #: ../src/utils/pactl.c:574
 #, c-format
@@ -2000,10 +1956,9 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:605, c-format
 msgid "Failed to get sample information: %s"
-msgstr "Échec lors de l'obtention des informations de l'échantillon : %s\n"
+msgstr "Échec lors de l'obtention des informations de l'échantillon : %s"
 
 # Lazy ?
 # load-sample-lazy = Create a new entry in the sample cache, but don't load
@@ -2039,28 +1994,23 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663, c-format
 msgid "Failure: %s"
-msgstr "Échec : %s\n"
+msgstr "Échec : %s"
 
-#: ../src/utils/pactl.c:687
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:687, c-format
 msgid "Failed to upload sample: %s"
-msgstr "Échec lors de l'envoi de l'échantillon : %s\n"
+msgstr "Échec lors de l'envoi de l'échantillon : %s"
 
 #: ../src/utils/pactl.c:704
-#, fuzzy
 msgid "Premature end of file"
-msgstr "Fin prématurée du fichier\n"
+msgstr "Fin prématurée du fichier"
 
 #: ../src/utils/pactl.c:863
-#, fuzzy
 msgid "Got SIGINT, exiting."
-msgstr "SIGINT reçu, fermeture.\n"
+msgstr "SIGINT reçu, fermeture."
 
-#: ../src/utils/pactl.c:869
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:869, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2105,6 +2055,14 @@ msgstr ""
 "%s [options] suspend-sink [DEST] 1|0\n"
 "%s [options] suspend-source [SOURCE] 1|0\n"
 "%s·[options]·set-card-profile·[CARTE]·[PROFIL]·\n"
+"%s [options] set-sink-port DEST PORT\n"
+"%s [options] set-source-port SOURCE PORT\n"
+"%s [options] set-sink-volume DEST VOLUME\n"
+"%s [options] set-source-volume SOURCE VOLUME\n"
+"%s [options] set-sink-input-volume ENTREEDEST VOLUME\n"
+"%s [options] set-sink-mute DEST 1|0\n"
+"%s [options] set-source-mute SOURCE 1|0\n"
+"%s [options] set-sink-input-mute ENTREEDEST 1|0\n"
 "\n"
 "  -h, --help                            Affiche cette aide\n"
 "      --version                         Affiche la version\n"
@@ -2126,135 +2084,111 @@ msgstr ""
 "Lié avec libpulse %s\n"
 
 #: ../src/utils/pactl.c:979
-#, fuzzy
 msgid "Please specify a sample file to load"
-msgstr "Veuillez indiquer un fichier d'échantillon à charger\n"
+msgstr "Veuillez indiquer un fichier d'échantillon à charger"
 
 #: ../src/utils/pactl.c:992
-#, fuzzy
 msgid "Failed to open sound file."
-msgstr "Échec lors de l'ouverture du fichier audio.\n"
+msgstr "Échec lors de l'ouverture du fichier audio."
 
 #: ../src/utils/pactl.c:1004
-#, fuzzy
 msgid "Warning: Failed to determine sample specification from file."
-msgstr "Ouverture d'un flux %s avec une spécification d'échantillon « %s ».\n"
+msgstr ""
+"Avertissement : Échec lors de l'obtention des spécifications de l'échantillon "
+"du fichier."
 
 #: ../src/utils/pactl.c:1014
-#, fuzzy
 msgid "You have to specify a sample name to play"
-msgstr "Vous devez indiquer un nom d'échantillon à lire\n"
+msgstr "Vous devez indiquer un nom d'échantillon à lire"
 
 #: ../src/utils/pactl.c:1026
-#, fuzzy
 msgid "You have to specify a sample name to remove"
-msgstr "Vous devez indiquer un nom d'échantillon à supprimer\n"
+msgstr "Vous devez indiquer un nom d'échantillon à supprimer"
 
 #: ../src/utils/pactl.c:1035
-#, fuzzy
 msgid "You have to specify a sink input index and a sink"
-msgstr ""
-"Vous devez indiquer un index de sortie de destination et une destination\n"
+msgstr "Vous devez indiquer un index d'entrée de destination et une destination"
 
 #: ../src/utils/pactl.c:1045
-#, fuzzy
 msgid "You have to specify a source output index and a source"
-msgstr "Vous devez indiquer un index de sortie de source et une source\n"
+msgstr "Vous devez indiquer un index de sortie de source et une source"
 
 #: ../src/utils/pactl.c:1060
-#, fuzzy
 msgid "You have to specify a module name and arguments."
-msgstr "Vous devez indiquer un nom de module et des paramètres.\n"
+msgstr "Vous devez indiquer un nom de module et des paramètres."
 
 #: ../src/utils/pactl.c:1080
-#, fuzzy
 msgid "You have to specify a module index"
-msgstr "Vous devez indiquer un index de module\n"
+msgstr "Vous devez indiquer un index de module"
 
 #: ../src/utils/pactl.c:1090
-#, fuzzy
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 "Vous ne pouvez pas indiquer plus d'une destination. Vous devez indiquer une "
-"valeur booléenne.\n"
+"valeur booléenne."
 
 #: ../src/utils/pactl.c:1103
-#, fuzzy
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
 msgstr ""
 "Vous ne pouvez pas indiquer plus d'une source. Vous devez indiquer une "
-"valeur booléenne.\n"
+"valeur booléenne."
 
 #: ../src/utils/pactl.c:1115
-#, fuzzy
 msgid "You have to specify a card name/index and a profile name"
-msgstr "Vous devez indiquer un nom/un index de carte et un nom de profil\n"
+msgstr "Vous devez indiquer un nom/un index de carte et un nom de profil"
 
 #: ../src/utils/pactl.c:1126
-#, fuzzy
 msgid "You have to specify a sink name/index and a port name"
-msgstr "Vous devez indiquer un nom/un index de carte et un nom de profil\n"
+msgstr "Vous devez indiquer un nom/un index de destination et un nom de port"
 
 #: ../src/utils/pactl.c:1137
-#, fuzzy
 msgid "You have to specify a source name/index and a port name"
-msgstr "Vous devez indiquer un nom/un index de carte et un nom de profil\n"
+msgstr "Vous devez indiquer un nom/un index de source et un nom de port"
 
 #: ../src/utils/pactl.c:1149
-#, fuzzy
 msgid "You have to specify a sink name/index and a volume"
-msgstr "Vous devez indiquer un nom/un index de carte et un nom de profil\n"
+msgstr "Vous devez indiquer un nom/un index de destination et un volume"
 
 #: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
 #: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
 #: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
-#, fuzzy
 msgid "Invalid volume specification"
-msgstr "Spécification d'échantillon invalide\n"
+msgstr "Spécification de volume invalide"
 
 #: ../src/utils/pactl.c:1166
-#, fuzzy
 msgid "You have to specify a source name/index and a volume"
-msgstr "Vous devez indiquer un nom/un index de carte et un nom de profil\n"
+msgstr "Vous devez indiquer un nom/un index de source et un volume"
 
 #: ../src/utils/pactl.c:1183
-#, fuzzy
 msgid "You have to specify a sink input index and a volume"
-msgstr ""
-"Vous devez indiquer un index de sortie de destination et une destination\n"
+msgstr "Vous devez indiquer un index d'entrée de destination et un volume"
 
 #: ../src/utils/pactl.c:1188
 msgid "Invalid sink input index"
-msgstr ""
+msgstr "Index invalide d'entrée de la destination"
 
 #: ../src/utils/pactl.c:1204
-#, fuzzy
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr "Vous devez indiquer un nom/un index de carte et un nom de profil\n"
+msgstr "Vous devez indiquer un nom/un index de destination et un booléen muet"
 
 #: ../src/utils/pactl.c:1221
-#, fuzzy
 msgid "You have to specify a source name/index and a mute boolean"
-msgstr "Vous devez indiquer un nom/un index de carte et un nom de profil\n"
+msgstr "Vous devez indiquer un nom/un index de source et un booléen muet"
 
 #: ../src/utils/pactl.c:1238
-#, fuzzy
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr ""
-"Vous devez indiquer un index de sortie de destination et une destination\n"
+msgstr "Vous devez indiquer un index d'entrée de destination et un booléen muet"
 
 #: ../src/utils/pactl.c:1243
-#, fuzzy
 msgid "Invalid sink input index specification"
-msgstr "Spécification d'échantillon invalide\n"
+msgstr "Spécification d'index d'entrée de la destination invalide"
 
 #: ../src/utils/pactl.c:1262
-#, fuzzy
 msgid "No valid command specified."
-msgstr "Aucune commande valide indiquée.\n"
+msgstr "Aucune commande valide indiquée."
 
 #: ../src/utils/pax11publish.c:61
 #, c-format
@@ -2342,6 +2276,8 @@ msgstr "Pas encore implémenté.\n"
 #: ../src/utils/pacmd.c:69
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
+"Aucun démon PulseAudio en cours d'exécution, ou ne s'exécutant pas "
+"dans une session de type démon."
 
 #: ../src/utils/pacmd.c:74
 #, c-format
@@ -2361,10 +2297,9 @@ msgstr "Impossible de tuer le démon PulseAudio."
 msgid "Daemon not responding."
 msgstr "Le démon ne répond pas."
 
-#: ../src/utils/pacmd.c:161
-#, fuzzy, c-format
+#: ../src/utils/pacmd.c:161, c-format
 msgid "poll(): %s"
-msgstr "fork() : %s"
+msgstr "poll() : %s"
 
 #: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
 #, c-format
@@ -2425,9 +2360,8 @@ msgid "High Fidelity Playback (A2DP)"
 msgstr "Lecture haute fidélité (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2198
-#, fuzzy
 msgid "High Fidelity Capture (A2DP)"
-msgstr "Lecture haute fidélité (A2DP)"
+msgstr "Capture haute fidélité (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2213
 msgid "Telephony Duplex (HSP/HFP)"
@@ -2440,133 +2374,122 @@ msgstr "Serveur de son PulseAudio"
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "Périphériques de sortie"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
-#, fuzzy
 msgid "Input Devices"
-msgstr "Entrée %s"
+msgstr "Périphériques d'entrée"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "Audio sur @HOSTNAME@"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
-#, fuzzy
 msgid "Input"
-msgstr "Entrée %s"
+msgstr "Entrée"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "Entrée de la station d'accueil"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "Microphone de la station d'accueil"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "Entrée-ligne"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "Microphone"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "Microphone externe"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "Audio interne"
+msgstr "Microphone interne"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "Radio"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "Vidéo"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "Contrôle automatique du gain"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "Pas de contrôle automatique du gain"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "Boost"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "Pas de boost"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "Amplificateur"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "Pas d'amplificateur"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
-#, fuzzy
 msgid "Analog Input"
-msgstr "Mono analogique"
+msgstr "Entrée analogique"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
-#, fuzzy
 msgid "Analog Microphone"
-msgstr "Mono analogique"
+msgstr "Microphone analogique"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
-#, fuzzy
 msgid "Analog Line-In"
-msgstr "Mono analogique"
+msgstr "Entrée-ligne analogique"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
-#, fuzzy
 msgid "Analog Radio"
-msgstr "Mono analogique"
+msgstr "Radio analogique"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
-#, fuzzy
 msgid "Analog Video"
-msgstr "Stéréo analogique"
+msgstr "Vidéo analogique"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "Sortie %s"
+msgstr "Sortie analogique"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
-#, fuzzy
 msgid "Analog Headphones"
-msgstr "Mono analogique"
+msgstr "Casques analogiques"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "Sortie analogique (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
-#, fuzzy
 msgid "Analog Mono Output"
-msgstr "Mono analogique"
+msgstr "Sortie mono analogique"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
 #, c-format
 msgid "%s+%s"
-msgstr ""
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
 #, c-format
 msgid "%s / %s"
-msgstr ""
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
@@ -2577,19 +2500,16 @@ msgid "Analog Stereo"
 msgstr "Stéréo analogique"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "Surround analogique 4.1"
+msgstr "Surround analogique 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "Surround analogique 4.0"
+msgstr "Surround analogique 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "Surround analogique 4.1"
+msgstr "Surround analogique 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Surround 4.0"
@@ -2608,19 +2528,16 @@ msgid "Analog Surround 5.1"
 msgstr "Surround analogique 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "Surround analogique 4.0"
+msgstr "Surround analogique 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "Surround analogique 4.1"
+msgstr "Surround analogique 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "Surround analogique 4.0"
+msgstr "Surround analogique 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 7.1"
@@ -2631,9 +2548,8 @@ msgid "Digital Stereo (IEC958)"
 msgstr "Stéréo numérique (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
-#, fuzzy
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr "Surround numérique 4.0 (IEC958/AC3)"
+msgstr "Surround numérique 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
@@ -2648,19 +2564,16 @@ msgid "Digital Stereo (HDMI)"
 msgstr "Stéréo numérique (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
-#, fuzzy
 msgid "Analog Mono Duplex"
-msgstr "Mono analogique"
+msgstr "Duplex Mono analogique"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
-#, fuzzy
 msgid "Analog Stereo Duplex"
-msgstr "Stéréo analogique"
+msgstr "Duplex stéréo analogique"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
-#, fuzzy
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr "Stéréo numérique (IEC958)"
+msgstr "Duplex stéréo numérique (IEC958)"
 
 #, fuzzy
 #~ msgid "Invalid client name '%s'\n"

commit c3a14cbfc2090d02ed42c34e7686a159583cc9ec
Author: vpv <vpv at fedoraproject.org>
Date:   Wed Dec 23 21:47:14 2009 +0000

    Sending translation for Finnish

diff --git a/po/fi.po b/po/fi.po
index cfb1437..00bfda9 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: git trunk\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
-"PO-Revision-Date: 2009-11-09 15:16+0200\n"
+"POT-Creation-Date: 2009-12-23 17:25+0000\n"
+"PO-Revision-Date: 2009-12-23 23:45+0200\n"
 "Last-Translator: Ville-Pekka Vainio <vpivaini at cs.helsinki.fi>\n"
 "Language-Team: Finnish <laatu at lokalisointi.org>\n"
 "MIME-Version: 1.0\n"
@@ -2369,7 +2369,7 @@ msgstr "Korkean äänenlaadun tallennus (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2213
 msgid "Telephony Duplex (HSP/HFP)"
-msgstr ""
+msgstr "Puhelut, molemmat suunnat (HSP/HFP)"
 
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
@@ -2568,19 +2568,16 @@ msgid "Digital Stereo (HDMI)"
 msgstr "Digitaalinen stereo (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
-#, fuzzy
 msgid "Analog Mono Duplex"
-msgstr "Analoginen mono"
+msgstr "Analoginen mono, molemmat suunnat"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
-#, fuzzy
 msgid "Analog Stereo Duplex"
-msgstr "Analoginen stereo"
+msgstr "Analoginen stereo, molemmat suunnat"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
-#, fuzzy
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr "Digitaalinen stereo (IEC958)"
+msgstr "Digitaalinen stereo, molemmat suunnat (IEC958)"
 
 #~ msgid "Invalid client name '%s'\n"
 #~ msgstr "Virheellinen asiakasohjelman nimi ”%s”\n"

commit 8ace563246ce98802fe4607cc1cb0043d09b9e68
Author: elad <elad at fedoraproject.org>
Date:   Wed Dec 30 16:21:51 2009 +0000

    Sending translation for po/he.po

diff --git a/po/he.po b/po/he.po
new file mode 100644
index 0000000..e1e3c08
--- /dev/null
+++ b/po/he.po
@@ -0,0 +1,2203 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: pulseaudio\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-12-29 12:48+0000\n"
+"PO-Revision-Date: \n"
+"Last-Translator: Elad <el.il at doom.co.il>\n"
+"Language-Team: Hebrew <fedora-he-list at redhat.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Poedit-Language: Hebrew\n"
+"X-Poedit-Country: Israel\n"
+
+#: ../src/modules/alsa/alsa-util.c:858
+#: ../src/pulsecore/sink.c:2629
+#, c-format
+msgid "%s %s"
+msgstr "%s %s"
+
+#: ../src/modules/alsa/alsa-util.c:1106
+#, c-format
+msgid ""
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1147
+#, c-format
+msgid ""
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1194
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/module-always-sink.c:39
+msgid "Always keeps at least one sink loaded even if it's a null one"
+msgstr ""
+
+#: ../src/modules/module-always-sink.c:83
+msgid "Dummy Output"
+msgstr ""
+
+#: ../src/modules/module-ladspa-sink.c:49
+msgid "Virtual LADSPA sink"
+msgstr ""
+
+#: ../src/modules/module-ladspa-sink.c:53
+msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
+msgstr ""
+
+#: ../src/modules/module-null-sink.c:55
+msgid "Clocked NULL sink"
+msgstr ""
+
+#: ../src/modules/module-null-sink.c:291
+msgid "Null Output"
+msgstr ""
+
+#: ../src/pulsecore/sink.c:2613
+msgid "Internal Audio"
+msgstr "צליל פנימי"
+
+#: ../src/pulsecore/sink.c:2618
+msgid "Modem"
+msgstr "מודם"
+
+#: ../src/daemon/ltdl-bind-now.c:124
+msgid "Failed to find original lt_dlopen loader."
+msgstr ""
+
+#: ../src/daemon/ltdl-bind-now.c:129
+msgid "Failed to allocate new dl loader."
+msgstr ""
+
+#: ../src/daemon/ltdl-bind-now.c:142
+msgid "Failed to add bind-now-loader."
+msgstr ""
+
+#: ../src/daemon/main.c:141
+#, c-format
+msgid "Got signal %s."
+msgstr ""
+
+#: ../src/daemon/main.c:168
+msgid "Exiting."
+msgstr "יוצא."
+
+#: ../src/daemon/main.c:186
+#, c-format
+msgid "Failed to find user '%s'."
+msgstr ""
+
+#: ../src/daemon/main.c:191
+#, c-format
+msgid "Failed to find group '%s'."
+msgstr ""
+
+#: ../src/daemon/main.c:195
+#, c-format
+msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
+msgstr ""
+
+#: ../src/daemon/main.c:200
+#, c-format
+msgid "GID of user '%s' and of group '%s' don't match."
+msgstr ""
+
+#: ../src/daemon/main.c:205
+#, c-format
+msgid "Home directory of user '%s' is not '%s', ignoring."
+msgstr ""
+
+#: ../src/daemon/main.c:208
+#: ../src/daemon/main.c:213
+#, c-format
+msgid "Failed to create '%s': %s"
+msgstr ""
+
+#: ../src/daemon/main.c:220
+#, c-format
+msgid "Failed to change group list: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:236
+#, c-format
+msgid "Failed to change GID: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:252
+#, c-format
+msgid "Failed to change UID: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:271
+msgid "Successfully dropped root privileges."
+msgstr ""
+
+#: ../src/daemon/main.c:279
+msgid "System wide mode unsupported on this platform."
+msgstr ""
+
+#: ../src/daemon/main.c:297
+#, c-format
+msgid "setrlimit(%s, (%u, %u)) failed: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:474
+msgid "Failed to parse command line."
+msgstr ""
+
+#: ../src/daemon/main.c:541
+msgid "Daemon not running"
+msgstr ""
+
+#: ../src/daemon/main.c:543
+#, c-format
+msgid "Daemon running as PID %u"
+msgstr ""
+
+#: ../src/daemon/main.c:553
+#, c-format
+msgid "Failed to kill daemon: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:571
+msgid "This program is not intended to be run as root (unless --system is specified)."
+msgstr ""
+
+#: ../src/daemon/main.c:573
+msgid "Root privileges required."
+msgstr ""
+
+#: ../src/daemon/main.c:578
+msgid "--start not supported for system instances."
+msgstr ""
+
+#: ../src/daemon/main.c:583
+msgid "Running in system mode, but --disallow-exit not set!"
+msgstr ""
+
+#: ../src/daemon/main.c:586
+msgid "Running in system mode, but --disallow-module-loading not set!"
+msgstr ""
+
+#: ../src/daemon/main.c:589
+msgid "Running in system mode, forcibly disabling SHM mode!"
+msgstr ""
+
+#: ../src/daemon/main.c:594
+msgid "Running in system mode, forcibly disabling exit idle time!"
+msgstr ""
+
+#: ../src/daemon/main.c:621
+msgid "Failed to acquire stdio."
+msgstr ""
+
+#: ../src/daemon/main.c:627
+#, c-format
+msgid "pipe failed: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:632
+#, c-format
+msgid "fork() failed: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:646
+#: ../src/utils/pacat.c:508
+#, c-format
+msgid "read() failed: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:652
+msgid "Daemon startup failed."
+msgstr ""
+
+#: ../src/daemon/main.c:654
+msgid "Daemon startup successful."
+msgstr ""
+
+#: ../src/daemon/main.c:731
+#, c-format
+msgid "This is PulseAudio %s"
+msgstr ""
+
+#: ../src/daemon/main.c:732
+#, c-format
+msgid "Compilation host: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:733
+#, c-format
+msgid "Compilation CFLAGS: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:736
+#, c-format
+msgid "Running on host: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:739
+#, c-format
+msgid "Found %u CPUs."
+msgstr ""
+
+#: ../src/daemon/main.c:741
+#, c-format
+msgid "Page size is %lu bytes"
+msgstr ""
+
+#: ../src/daemon/main.c:744
+msgid "Compiled with Valgrind support: yes"
+msgstr ""
+
+#: ../src/daemon/main.c:746
+msgid "Compiled with Valgrind support: no"
+msgstr ""
+
+#: ../src/daemon/main.c:749
+#, c-format
+msgid "Running in valgrind mode: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:752
+msgid "Optimized build: yes"
+msgstr ""
+
+#: ../src/daemon/main.c:754
+msgid "Optimized build: no"
+msgstr ""
+
+#: ../src/daemon/main.c:758
+msgid "NDEBUG defined, all asserts disabled."
+msgstr ""
+
+#: ../src/daemon/main.c:760
+msgid "FASTPATH defined, only fast path asserts disabled."
+msgstr ""
+
+#: ../src/daemon/main.c:762
+msgid "All asserts enabled."
+msgstr ""
+
+#: ../src/daemon/main.c:766
+msgid "Failed to get machine ID"
+msgstr ""
+
+#: ../src/daemon/main.c:769
+#, c-format
+msgid "Machine ID is %s."
+msgstr ""
+
+#: ../src/daemon/main.c:773
+#, c-format
+msgid "Session ID is %s."
+msgstr ""
+
+#: ../src/daemon/main.c:779
+#, c-format
+msgid "Using runtime directory %s."
+msgstr ""
+
+#: ../src/daemon/main.c:784
+#, c-format
+msgid "Using state directory %s."
+msgstr ""
+
+#: ../src/daemon/main.c:787
+#, c-format
+msgid "Using modules directory %s."
+msgstr ""
+
+#: ../src/daemon/main.c:789
+#, c-format
+msgid "Running in system mode: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:792
+msgid ""
+"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."
+msgstr ""
+
+#: ../src/daemon/main.c:809
+msgid "pa_pid_file_create() failed."
+msgstr ""
+
+#: ../src/daemon/main.c:819
+msgid "Fresh high-resolution timers available! Bon appetit!"
+msgstr ""
+
+#: ../src/daemon/main.c:821
+msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
+msgstr ""
+
+#: ../src/daemon/main.c:844
+msgid "pa_core_new() failed."
+msgstr ""
+
+#: ../src/daemon/main.c:904
+msgid "Failed to initialize daemon."
+msgstr ""
+
+#: ../src/daemon/main.c:909
+msgid "Daemon startup without any loaded modules, refusing to work."
+msgstr ""
+
+#: ../src/daemon/main.c:926
+msgid "Daemon startup complete."
+msgstr ""
+
+#: ../src/daemon/main.c:932
+msgid "Daemon shutdown initiated."
+msgstr ""
+
+#: ../src/daemon/main.c:954
+msgid "Daemon terminated."
+msgstr ""
+
+#: ../src/daemon/cmdline.c:115
+#, c-format
+msgid ""
+"%s [options]\n"
+"\n"
+"COMMANDS:\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"      --dump-conf                       Dump default configuration\n"
+"      --dump-modules                    Dump list of available modules\n"
+"      --dump-resample-methods           Dump available resample methods\n"
+"      --cleanup-shm                     Cleanup stale shared memory segments\n"
+"      --start                           Start the daemon if it is not running\n"
+"  -k  --kill                            Kill a running daemon\n"
+"      --check                           Check for a running daemon (only returns exit code)\n"
+"\n"
+"OPTIONS:\n"
+"      --system[=BOOL]                   Run as system-wide instance\n"
+"  -D, --daemonize[=BOOL]                Daemonize after startup\n"
+"      --fail[=BOOL]                     Quit when startup fails\n"
+"      --high-priority[=BOOL]            Try to set high nice level\n"
+"                                        (only available as root, when SUID or\n"
+"                                        with elevated RLIMIT_NICE)\n"
+"      --realtime[=BOOL]                 Try to enable realtime scheduling\n"
+"                                        (only available as root, when SUID or\n"
+"                                        with elevated RLIMIT_RTPRIO)\n"
+"      --disallow-module-loading[=BOOL]  Disallow module user requested module\n"
+"                                        loading/unloading after startup\n"
+"      --disallow-exit[=BOOL]            Disallow user requested exit\n"
+"      --exit-idle-time=SECS             Terminate the daemon when idle and this\n"
+"                                        time passed\n"
+"      --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"
+"                                        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-time[=BOOL]                 Include timestamps in log messages\n"
+"      --log-backtrace=FRAMES            Include a backtrace in log messages\n"
+"  -p, --dl-search-path=PATH             Set the search path for dynamic shared\n"
+"                                        objects (plugins)\n"
+"      --resample-method=METHOD          Use the specified resampling method\n"
+"                                        (See --dump-resample-methods for\n"
+"                                        possible values)\n"
+"      --use-pid-file[=BOOL]             Create a PID file\n"
+"      --no-cpu-limit[=BOOL]             Do not install CPU load limiter on\n"
+"                                        platforms that support it.\n"
+"      --disable-shm[=BOOL]              Disable shared memory support.\n"
+"\n"
+"STARTUP SCRIPT:\n"
+"  -L, --load=\"MODULE ARGUMENTS\"         Load the specified plugin module with\n"
+"                                        the specified argument\n"
+"  -F, --file=FILENAME                   Run the specified script\n"
+"  -C                                    Open a command line on the running TTY\n"
+"                                        after startup\n"
+"\n"
+"  -n                                    Don't load default script file\n"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:247
+msgid "--daemonize expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:254
+msgid "--fail expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:264
+msgid "--log-level expects log level argument (either numeric in range 0..4 or one of debug, info, notice, warn, error)."
+msgstr ""
+
+#: ../src/daemon/cmdline.c:276
+msgid "--high-priority expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:283
+msgid "--realtime expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:290
+msgid "--disallow-module-loading expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:297
+msgid "--disallow-exit expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:304
+msgid "--use-pid-file expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:321
+msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
+msgstr ""
+
+#: ../src/daemon/cmdline.c:328
+msgid "--log-time expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:335
+msgid "--log-meta expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:354
+#, c-format
+msgid "Invalid resample method '%s'."
+msgstr ""
+
+#: ../src/daemon/cmdline.c:361
+msgid "--system expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:368
+msgid "--no-cpu-limit expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/cmdline.c:375
+msgid "--disable-shm expects boolean argument"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:60
+#, c-format
+msgid "Name: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:63
+#, c-format
+msgid "No module information available\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:66
+#, c-format
+msgid "Version: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:68
+#, c-format
+msgid "Description: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:70
+#, c-format
+msgid "Author: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:72
+#, c-format
+msgid "Usage: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:73
+#, c-format
+msgid "Load Once: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:75
+#, c-format
+msgid "DEPRECATION WARNING: %s\n"
+msgstr ""
+
+#: ../src/daemon/dumpmodules.c:79
+#, c-format
+msgid "Path: %s\n"
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:232
+#, c-format
+msgid "[%s:%u] Invalid log target '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:248
+#, c-format
+msgid "[%s:%u] Invalid log level '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:264
+#, c-format
+msgid "[%s:%u] Invalid resample method '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:287
+#, c-format
+msgid "[%s:%u] Invalid rlimit '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:294
+#, c-format
+msgid "[%s:%u] rlimit not supported on this platform."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:310
+#, c-format
+msgid "[%s:%u] Invalid sample format '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:328
+#, c-format
+msgid "[%s:%u] Invalid sample rate '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:352
+#, c-format
+msgid "[%s:%u] Invalid sample channels '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:370
+#, c-format
+msgid "[%s:%u] Invalid channel map '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:388
+#, c-format
+msgid "[%s:%u] Invalid number of fragments '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:406
+#, c-format
+msgid "[%s:%u] Invalid fragment size '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:424
+#, c-format
+msgid "[%s:%u] Invalid nice level '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:546
+#, c-format
+msgid "Failed to open configuration file: %s"
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:562
+msgid "The specified default channel map has a different number of channels than the specified default number of channels."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:638
+#, c-format
+msgid "### Read from configuration file: %s ###\n"
+msgstr ""
+
+#: ../src/daemon/caps.c:62
+msgid "Cleaning up privileges."
+msgstr ""
+
+#: ../src/daemon/pulseaudio.desktop.in.h:1
+msgid "PulseAudio Sound System"
+msgstr "מערכת הקול PulseAudio"
+
+#: ../src/daemon/pulseaudio.desktop.in.h:2
+msgid "Start the PulseAudio Sound System"
+msgstr "התחל את מערכת הקול PulseAudio"
+
+#: ../src/pulse/channelmap.c:105
+#: ../src/pulse/channelmap.c:757
+msgid "Mono"
+msgstr "מונו"
+
+#: ../src/pulse/channelmap.c:107
+msgid "Front Center"
+msgstr "מרכזי קדמי"
+
+#: ../src/pulse/channelmap.c:108
+msgid "Front Left"
+msgstr "שמאלי קדמי"
+
+#: ../src/pulse/channelmap.c:109
+msgid "Front Right"
+msgstr "ימני קדמי"
+
+#: ../src/pulse/channelmap.c:111
+msgid "Rear Center"
+msgstr "מרכזי אחורי"
+
+#: ../src/pulse/channelmap.c:112
+msgid "Rear Left"
+msgstr "שמאלי אחורי"
+
+#: ../src/pulse/channelmap.c:113
+msgid "Rear Right"
+msgstr "ימני אחורי"
+
+#: ../src/pulse/channelmap.c:115
+msgid "Low Frequency Emmiter"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:117
+msgid "Front Left-of-center"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:118
+msgid "Front Right-of-center"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:120
+msgid "Side Left"
+msgstr "צד שמאל"
+
+#: ../src/pulse/channelmap.c:121
+msgid "Side Right"
+msgstr "צד ימין"
+
+#: ../src/pulse/channelmap.c:123
+msgid "Auxiliary 0"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:124
+msgid "Auxiliary 1"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:125
+msgid "Auxiliary 2"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:126
+msgid "Auxiliary 3"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:127
+msgid "Auxiliary 4"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:128
+msgid "Auxiliary 5"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:129
+msgid "Auxiliary 6"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:130
+msgid "Auxiliary 7"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:131
+msgid "Auxiliary 8"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:132
+msgid "Auxiliary 9"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:133
+msgid "Auxiliary 10"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:134
+msgid "Auxiliary 11"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:135
+msgid "Auxiliary 12"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:136
+msgid "Auxiliary 13"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:137
+msgid "Auxiliary 14"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:138
+msgid "Auxiliary 15"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:139
+msgid "Auxiliary 16"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:140
+msgid "Auxiliary 17"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:141
+msgid "Auxiliary 18"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:142
+msgid "Auxiliary 19"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:143
+msgid "Auxiliary 20"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:144
+msgid "Auxiliary 21"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:145
+msgid "Auxiliary 22"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:146
+msgid "Auxiliary 23"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:147
+msgid "Auxiliary 24"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:148
+msgid "Auxiliary 25"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:149
+msgid "Auxiliary 26"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:150
+msgid "Auxiliary 27"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:151
+msgid "Auxiliary 28"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:152
+msgid "Auxiliary 29"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:153
+msgid "Auxiliary 30"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:154
+msgid "Auxiliary 31"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:156
+msgid "Top Center"
+msgstr "מרכזי עליון"
+
+#: ../src/pulse/channelmap.c:158
+msgid "Top Front Center"
+msgstr "מרכזי עליון קדמי"
+
+#: ../src/pulse/channelmap.c:159
+msgid "Top Front Left"
+msgstr "עליון שמאלי קדמי"
+
+#: ../src/pulse/channelmap.c:160
+msgid "Top Front Right"
+msgstr "עליון ימני קדמי"
+
+#: ../src/pulse/channelmap.c:162
+msgid "Top Rear Center"
+msgstr "עליון מרכזי אחורי"
+
+#: ../src/pulse/channelmap.c:163
+msgid "Top Rear Left"
+msgstr "עליון שמאלי אחורי"
+
+#: ../src/pulse/channelmap.c:164
+msgid "Top Rear Right"
+msgstr "עליון ימני אחורי"
+
+#: ../src/pulse/channelmap.c:484
+#: ../src/pulse/sample.c:170
+#: ../src/pulse/volume.c:295
+#: ../src/pulse/volume.c:321
+#: ../src/pulse/volume.c:341
+#: ../src/pulse/volume.c:371
+msgid "(invalid)"
+msgstr "(לא תקף)"
+
+#: ../src/pulse/channelmap.c:761
+msgid "Stereo"
+msgstr "סטראו"
+
+#: ../src/pulse/channelmap.c:766
+msgid "Surround 4.0"
+msgstr "סראונד 4.0"
+
+#: ../src/pulse/channelmap.c:772
+msgid "Surround 4.1"
+msgstr "סראונד 4.1"
+
+#: ../src/pulse/channelmap.c:778
+msgid "Surround 5.0"
+msgstr "סראונד 5.0"
+
+#: ../src/pulse/channelmap.c:784
+msgid "Surround 5.1"
+msgstr "סראונד 5.1"
+
+#: ../src/pulse/channelmap.c:791
+msgid "Surround 7.1"
+msgstr "סראונד 7.1"
+
+#: ../src/pulse/error.c:43
+msgid "OK"
+msgstr "אישור"
+
+#: ../src/pulse/error.c:44
+msgid "Access denied"
+msgstr "הגישה נדחתה"
+
+#: ../src/pulse/error.c:45
+msgid "Unknown command"
+msgstr ""
+
+#: ../src/pulse/error.c:46
+msgid "Invalid argument"
+msgstr ""
+
+#: ../src/pulse/error.c:47
+msgid "Entity exists"
+msgstr ""
+
+#: ../src/pulse/error.c:48
+msgid "No such entity"
+msgstr ""
+
+#: ../src/pulse/error.c:49
+msgid "Connection refused"
+msgstr "החיבור נדחה"
+
+#: ../src/pulse/error.c:50
+msgid "Protocol error"
+msgstr "שגיאת פרוטוקול"
+
+#: ../src/pulse/error.c:51
+msgid "Timeout"
+msgstr ""
+
+#: ../src/pulse/error.c:52
+msgid "No authorization key"
+msgstr ""
+
+#: ../src/pulse/error.c:53
+msgid "Internal error"
+msgstr "שגיאה פנימית"
+
+#: ../src/pulse/error.c:54
+msgid "Connection terminated"
+msgstr ""
+
+#: ../src/pulse/error.c:55
+msgid "Entity killed"
+msgstr ""
+
+#: ../src/pulse/error.c:56
+msgid "Invalid server"
+msgstr ""
+
+#: ../src/pulse/error.c:57
+msgid "Module initalization failed"
+msgstr ""
+
+#: ../src/pulse/error.c:58
+msgid "Bad state"
+msgstr ""
+
+#: ../src/pulse/error.c:59
+msgid "No data"
+msgstr ""
+
+#: ../src/pulse/error.c:60
+msgid "Incompatible protocol version"
+msgstr ""
+
+#: ../src/pulse/error.c:61
+msgid "Too large"
+msgstr "גדול מדי"
+
+#: ../src/pulse/error.c:62
+msgid "Not supported"
+msgstr "לא נתמך"
+
+#: ../src/pulse/error.c:63
+msgid "Unknown error code"
+msgstr "קוד שגיאה לא מוכר"
+
+#: ../src/pulse/error.c:64
+msgid "No such extension"
+msgstr ""
+
+#: ../src/pulse/error.c:65
+msgid "Obsolete functionality"
+msgstr ""
+
+#: ../src/pulse/error.c:66
+msgid "Missing implementation"
+msgstr ""
+
+#: ../src/pulse/error.c:67
+msgid "Client forked"
+msgstr ""
+
+#: ../src/pulse/error.c:68
+msgid "Input/Output error"
+msgstr "שגיאת קלט/פלט"
+
+#: ../src/pulse/error.c:69
+msgid "Device or resource busy"
+msgstr "התקן או משאב עסוקים"
+
+#: ../src/pulse/sample.c:172
+#, c-format
+msgid "%s %uch %uHz"
+msgstr ""
+
+#: ../src/pulse/sample.c:184
+#, c-format
+msgid "%0.1f GiB"
+msgstr ""
+
+#: ../src/pulse/sample.c:186
+#, c-format
+msgid "%0.1f MiB"
+msgstr ""
+
+#: ../src/pulse/sample.c:188
+#, c-format
+msgid "%0.1f KiB"
+msgstr ""
+
+#: ../src/pulse/sample.c:190
+#, c-format
+msgid "%u B"
+msgstr ""
+
+#: ../src/pulse/client-conf-x11.c:55
+#: ../src/utils/pax11publish.c:100
+msgid "XOpenDisplay() failed"
+msgstr ""
+
+#: ../src/pulse/client-conf-x11.c:93
+msgid "Failed to parse cookie data"
+msgstr ""
+
+#: ../src/pulse/client-conf.c:111
+#, c-format
+msgid "Failed to open configuration file '%s': %s"
+msgstr ""
+
+#: ../src/pulse/context.c:550
+msgid "No cookie loaded. Attempting to connect without."
+msgstr ""
+
+#: ../src/pulse/context.c:693
+#, c-format
+msgid "fork(): %s"
+msgstr ""
+
+#: ../src/pulse/context.c:748
+#, c-format
+msgid "waitpid(): %s"
+msgstr ""
+
+#: ../src/pulse/context.c:1438
+#, c-format
+msgid "Received message for unknown extension '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:108
+#, c-format
+msgid "Failed to drain stream: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:113
+msgid "Playback stream drained."
+msgstr ""
+
+#: ../src/utils/pacat.c:123
+msgid "Draining connection to server."
+msgstr ""
+
+#: ../src/utils/pacat.c:136
+#, c-format
+msgid "pa_stream_drain(): %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:159
+#, c-format
+msgid "pa_stream_write() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:197
+#, c-format
+msgid "pa_stream_begin_write() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:237
+#: ../src/utils/pacat.c:267
+#, c-format
+msgid "pa_stream_peek() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:307
+msgid "Stream successfully created."
+msgstr ""
+
+#: ../src/utils/pacat.c:310
+#, c-format
+msgid "pa_stream_get_buffer_attr() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:314
+#, c-format
+msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
+msgstr ""
+
+#: ../src/utils/pacat.c:317
+#, c-format
+msgid "Buffer metrics: maxlength=%u, fragsize=%u"
+msgstr ""
+
+#: ../src/utils/pacat.c:321
+#, c-format
+msgid "Using sample spec '%s', channel map '%s'."
+msgstr ""
+
+#: ../src/utils/pacat.c:325
+#, c-format
+msgid "Connected to device %s (%u, %ssuspended)."
+msgstr ""
+
+#: ../src/utils/pacat.c:335
+#, c-format
+msgid "Stream error: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:345
+#, c-format
+msgid "Stream device suspended.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:347
+#, c-format
+msgid "Stream device resumed.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:355
+#, c-format
+msgid "Stream underrun.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:362
+#, c-format
+msgid "Stream overrun.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:369
+#, c-format
+msgid "Stream started.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:376
+#, c-format
+msgid "Stream moved to device %s (%u, %ssuspended).%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:376
+msgid "not "
+msgstr "לא"
+
+#: ../src/utils/pacat.c:383
+#, c-format
+msgid "Stream buffer attributes changed.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:415
+#, c-format
+msgid "Connection established.%s"
+msgstr ""
+
+#: ../src/utils/pacat.c:418
+#, c-format
+msgid "pa_stream_new() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:450
+#, c-format
+msgid "pa_stream_connect_playback() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:456
+#, c-format
+msgid "pa_stream_connect_record() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:470
+#: ../src/utils/pactl.c:857
+#, c-format
+msgid "Connection failure: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:503
+msgid "Got EOF."
+msgstr ""
+
+#: ../src/utils/pacat.c:540
+#, c-format
+msgid "write() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:561
+msgid "Got signal, exiting."
+msgstr ""
+
+#: ../src/utils/pacat.c:575
+#, c-format
+msgid "Failed to get latency: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:580
+#, c-format
+msgid "Time: %0.3f sec; Latency: %0.0f usec."
+msgstr ""
+
+#: ../src/utils/pacat.c:599
+#, c-format
+msgid "pa_stream_update_timing_info() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:609
+#, c-format
+msgid ""
+"%s [options]\n"
+"\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"\n"
+"  -r, --record                          Create a connection for recording\n"
+"  -p, --playback                        Create a connection for playback\n"
+"\n"
+"  -v, --verbose                         Enable verbose operations\n"
+"\n"
+"  -s, --server=SERVER                   The name of the server to connect to\n"
+"  -d, --device=DEVICE                   The name of the sink/source to connect to\n"
+"  -n, --client-name=NAME                How to call this client on the server\n"
+"      --stream-name=NAME                How to call this stream on the server\n"
+"      --volume=VOLUME                   Specify the initial (linear) volume in range 0...65536\n"
+"      --rate=SAMPLERATE                 The sample rate in Hz (defaults to 44100)\n"
+"      --format=SAMPLEFORMAT             The sample type, one of s16le, s16be, u8, float32le,\n"
+"                                        float32be, ulaw, alaw, s32le, s32be, s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, 2 for stereo\n"
+"                                        (defaults to 2)\n"
+"      --channel-map=CHANNELMAP          Channel map to use instead of the default\n"
+"      --fix-format                      Take the sample format from the sink the stream is\n"
+"                                        being connected to.\n"
+"      --fix-rate                        Take the sampling rate from the sink the stream is\n"
+"                                        being connected to.\n"
+"      --fix-channels                    Take the number of channels and the channel map\n"
+"                                        from the sink the stream is being connected to.\n"
+"      --no-remix                        Don't upmix or downmix channels.\n"
+"      --no-remap                        Map channels by index instead of name.\n"
+"      --latency=BYTES                   Request the specified latency in bytes.\n"
+"      --process-time=BYTES              Request the specified process time per request in bytes.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
+"      --raw                             Record/play raw PCM data.\n"
+"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --list-file-formats               List available file formats.\n"
+msgstr ""
+
+#: ../src/utils/pacat.c:731
+#, c-format
+msgid ""
+"pacat %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
+msgstr ""
+
+#: ../src/utils/pacat.c:764
+#: ../src/utils/pactl.c:953
+#, c-format
+msgid "Invalid client name '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:779
+#, c-format
+msgid "Invalid stream name '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:816
+#, c-format
+msgid "Invalid channel map '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:845
+#, c-format
+msgid "Invalid latency specification '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:852
+#, c-format
+msgid "Invalid process time specification '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:864
+#, c-format
+msgid "Invalid property '%s'"
+msgstr ""
+
+#: ../src/utils/pacat.c:881
+#, c-format
+msgid "Unknown file format %s."
+msgstr ""
+
+#: ../src/utils/pacat.c:900
+msgid "Invalid sample specification"
+msgstr ""
+
+#: ../src/utils/pacat.c:910
+#, c-format
+msgid "open(): %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:915
+#, c-format
+msgid "dup2(): %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:922
+msgid "Too many arguments."
+msgstr ""
+
+#: ../src/utils/pacat.c:933
+msgid "Failed to generate sample specification for file."
+msgstr ""
+
+#: ../src/utils/pacat.c:953
+msgid "Failed to open audio file."
+msgstr ""
+
+#: ../src/utils/pacat.c:959
+msgid "Warning: specified sample specification will be overwritten with specification from file."
+msgstr ""
+
+#: ../src/utils/pacat.c:962
+#: ../src/utils/pactl.c:997
+msgid "Failed to determine sample specification from file."
+msgstr ""
+
+#: ../src/utils/pacat.c:971
+msgid "Warning: Failed to determine channel map from file."
+msgstr ""
+
+#: ../src/utils/pacat.c:982
+msgid "Channel map doesn't match sample specification"
+msgstr ""
+
+#: ../src/utils/pacat.c:993
+msgid "Warning: failed to write channel map to file."
+msgstr ""
+
+#: ../src/utils/pacat.c:1008
+#, c-format
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr ""
+
+#: ../src/utils/pacat.c:1009
+msgid "recording"
+msgstr "מקליט"
+
+#: ../src/utils/pacat.c:1009
+msgid "playback"
+msgstr "× ×’×™× ×”"
+
+#: ../src/utils/pacat.c:1035
+#: ../src/utils/pactl.c:1267
+msgid "pa_mainloop_new() failed."
+msgstr ""
+
+#: ../src/utils/pacat.c:1054
+msgid "io_new() failed."
+msgstr ""
+
+#: ../src/utils/pacat.c:1061
+#: ../src/utils/pactl.c:1279
+msgid "pa_context_new() failed."
+msgstr ""
+
+#: ../src/utils/pacat.c:1069
+#: ../src/utils/pactl.c:1285
+#, c-format
+msgid "pa_context_connect() failed: %s"
+msgstr ""
+
+#: ../src/utils/pacat.c:1075
+msgid "pa_context_rttime_new() failed."
+msgstr ""
+
+#: ../src/utils/pacat.c:1082
+#: ../src/utils/pactl.c:1290
+msgid "pa_mainloop_run() failed."
+msgstr ""
+
+#: ../src/utils/pasuspender.c:81
+#, c-format
+msgid "fork(): %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:92
+#, c-format
+msgid "execvp(): %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:109
+#, c-format
+msgid "Failure to suspend: %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:124
+#, c-format
+msgid "Failure to resume: %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:147
+#, c-format
+msgid "WARNING: Sound server is not local, not suspending.\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:159
+#, c-format
+msgid "Connection failure: %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:176
+#, c-format
+msgid "Got SIGINT, exiting.\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:194
+#, c-format
+msgid "WARNING: Child process terminated by signal %u\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:212
+#, c-format
+msgid ""
+"%s [options] ... \n"
+"\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"  -s, --server=SERVER                   The name of the server to connect to\n"
+"\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:248
+#, c-format
+msgid ""
+"pasuspender %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:277
+#, c-format
+msgid "pa_mainloop_new() failed.\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:290
+#, c-format
+msgid "pa_context_new() failed.\n"
+msgstr ""
+
+#: ../src/utils/pasuspender.c:298
+#, c-format
+msgid "pa_mainloop_run() failed.\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:135
+#, c-format
+msgid "Failed to get statistics: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:141
+#, c-format
+msgid "Currently in use: %u blocks containing %s bytes total.\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:144
+#, c-format
+msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:147
+#, c-format
+msgid "Sample cache size: %s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:156
+#, c-format
+msgid "Failed to get server information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:164
+#, c-format
+msgid ""
+"User name: %s\n"
+"Host Name: %s\n"
+"Server Name: %s\n"
+"Server Version: %s\n"
+"Default Sample Specification: %s\n"
+"Default Channel Map: %s\n"
+"Default Sink: %s\n"
+"Default Source: %s\n"
+"Cookie: %08x\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:205
+#, c-format
+msgid "Failed to get sink information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:221
+#, c-format
+msgid ""
+"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:268
+#: ../src/utils/pactl.c:360
+#, c-format
+msgid "\tPorts:\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:274
+#: ../src/utils/pactl.c:366
+#, c-format
+msgid "\tActive Port: %s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:297
+#, c-format
+msgid "Failed to get source information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:313
+#, c-format
+msgid ""
+"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:345
+#: ../src/utils/pactl.c:401
+#: ../src/utils/pactl.c:436
+#: ../src/utils/pactl.c:473
+#: ../src/utils/pactl.c:532
+#: ../src/utils/pactl.c:533
+#: ../src/utils/pactl.c:543
+#: ../src/utils/pactl.c:587
+#: ../src/utils/pactl.c:588
+#: ../src/utils/pactl.c:594
+#: ../src/utils/pactl.c:637
+#: ../src/utils/pactl.c:638
+#: ../src/utils/pactl.c:645
+msgid "n/a"
+msgstr "לא זמין"
+
+#: ../src/utils/pactl.c:375
+#, c-format
+msgid "Failed to get module information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:393
+#, c-format
+msgid ""
+"Module #%u\n"
+"\tName: %s\n"
+"\tArgument: %s\n"
+"\tUsage counter: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:412
+#, c-format
+msgid "Failed to get client information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:430
+#, c-format
+msgid ""
+"Client #%u\n"
+"\tDriver: %s\n"
+"\tOwner Module: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:447
+#, c-format
+msgid "Failed to get card information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:465
+#, c-format
+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:479
+#, c-format
+msgid "\tProfiles:\n"
+msgstr "\tפרופילים:\n"
+
+#: ../src/utils/pactl.c:485
+#, c-format
+msgid "\tActive Profile: %s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:496
+#, c-format
+msgid "Failed to get sink input information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:515
+#, c-format
+msgid ""
+"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:554
+#, c-format
+msgid "Failed to get source output information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:574
+#, c-format
+msgid ""
+"Source Output #%u\n"
+"\tDriver: %s\n"
+"\tOwner Module: %s\n"
+"\tClient: %s\n"
+"\tSource: %u\n"
+"\tSample Specification: %s\n"
+"\tChannel Map: %s\n"
+"\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:605
+#, c-format
+msgid "Failed to get sample information: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:623
+#, c-format
+msgid ""
+"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:653
+#: ../src/utils/pactl.c:663
+#, c-format
+msgid "Failure: %s"
+msgstr "כשל: %s"
+
+#: ../src/utils/pactl.c:687
+#, c-format
+msgid "Failed to upload sample: %s"
+msgstr ""
+
+#: ../src/utils/pactl.c:704
+msgid "Premature end of file"
+msgstr ""
+
+#: ../src/utils/pactl.c:863
+msgid "Got SIGINT, exiting."
+msgstr ""
+
+#: ../src/utils/pactl.c:869
+#, c-format
+msgid ""
+"%s [options] stat\n"
+"%s [options] list\n"
+"%s [options] exit\n"
+"%s [options] upload-sample FILENAME [NAME]\n"
+"%s [options] play-sample NAME [SINK]\n"
+"%s [options] remove-sample NAME\n"
+"%s [options] move-sink-input SINKINPUT SINK\n"
+"%s [options] move-source-output SOURCEOUTPUT SOURCE\n"
+"%s [options] load-module NAME [ARGS ...]\n"
+"%s [options] unload-module MODULE\n"
+"%s [options] suspend-sink SINK 1|0\n"
+"%s [options] suspend-source SOURCE 1|0\n"
+"%s [options] set-card-profile CARD PROFILE\n"
+"%s [options] set-sink-port SINK PORT\n"
+"%s [options] set-source-port SOURCE PORT\n"
+"%s [options] set-sink-volume SINK VOLUME\n"
+"%s [options] set-source-volume SOURCE VOLUME\n"
+"%s [options] set-sink-input-volume SINKINPUT VOLUME\n"
+"%s [options] set-sink-mute SINK 1|0\n"
+"%s [options] set-source-mute SOURCE 1|0\n"
+"%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"\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"
+msgstr ""
+
+#: ../src/utils/pactl.c:933
+#, c-format
+msgid ""
+"pactl %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:979
+msgid "Please specify a sample file to load"
+msgstr ""
+
+#: ../src/utils/pactl.c:992
+msgid "Failed to open sound file."
+msgstr ""
+
+#: ../src/utils/pactl.c:1004
+msgid "Warning: Failed to determine sample specification from file."
+msgstr ""
+
+#: ../src/utils/pactl.c:1014
+msgid "You have to specify a sample name to play"
+msgstr ""
+
+#: ../src/utils/pactl.c:1026
+msgid "You have to specify a sample name to remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:1035
+msgid "You have to specify a sink input index and a sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:1045
+msgid "You have to specify a source output index and a source"
+msgstr ""
+
+#: ../src/utils/pactl.c:1060
+msgid "You have to specify a module name and arguments."
+msgstr ""
+
+#: ../src/utils/pactl.c:1080
+msgid "You have to specify a module index"
+msgstr ""
+
+#: ../src/utils/pactl.c:1090
+msgid "You may not specify more than one sink. You have to specify a boolean value."
+msgstr ""
+
+#: ../src/utils/pactl.c:1103
+msgid "You may not specify more than one source. You have to specify a boolean value."
+msgstr ""
+
+#: ../src/utils/pactl.c:1115
+msgid "You have to specify a card name/index and a profile name"
+msgstr ""
+
+#: ../src/utils/pactl.c:1126
+msgid "You have to specify a sink name/index and a port name"
+msgstr ""
+
+#: ../src/utils/pactl.c:1137
+msgid "You have to specify a source name/index and a port name"
+msgstr ""
+
+#: ../src/utils/pactl.c:1149
+msgid "You have to specify a sink name/index and a volume"
+msgstr ""
+
+#: ../src/utils/pactl.c:1154
+#: ../src/utils/pactl.c:1171
+#: ../src/utils/pactl.c:1193
+#: ../src/utils/pactl.c:1209
+#: ../src/utils/pactl.c:1226
+#: ../src/utils/pactl.c:1248
+msgid "Invalid volume specification"
+msgstr ""
+
+#: ../src/utils/pactl.c:1166
+msgid "You have to specify a source name/index and a volume"
+msgstr ""
+
+#: ../src/utils/pactl.c:1183
+msgid "You have to specify a sink input index and a volume"
+msgstr ""
+
+#: ../src/utils/pactl.c:1188
+msgid "Invalid sink input index"
+msgstr ""
+
+#: ../src/utils/pactl.c:1204
+msgid "You have to specify a sink name/index and a mute boolean"
+msgstr ""
+
+#: ../src/utils/pactl.c:1221
+msgid "You have to specify a source name/index and a mute boolean"
+msgstr ""
+
+#: ../src/utils/pactl.c:1238
+msgid "You have to specify a sink input index and a mute boolean"
+msgstr ""
+
+#: ../src/utils/pactl.c:1243
+msgid "Invalid sink input index specification"
+msgstr ""
+
+#: ../src/utils/pactl.c:1262
+msgid "No valid command specified."
+msgstr ""
+
+#: ../src/utils/pax11publish.c:61
+#, c-format
+msgid ""
+"%s [-D display] [-S server] [-O sink] [-I source] [-c file]  [-d|-e|-i|-r]\n"
+"\n"
+" -d    Show current PulseAudio data attached to X11 display (default)\n"
+" -e    Export local PulseAudio data to X11 display\n"
+" -i    Import PulseAudio data from X11 display to local environment variables and cookie file.\n"
+" -r    Remove PulseAudio data from X11 display\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:94
+#, c-format
+msgid "Failed to parse command line.\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:108
+#, c-format
+msgid "Server: %s\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:110
+#, c-format
+msgid "Source: %s\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:112
+#, c-format
+msgid "Sink: %s\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:114
+#, c-format
+msgid "Cookie: %s\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:132
+#, c-format
+msgid "Failed to parse cookie data\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:137
+#, c-format
+msgid "Failed to save cookie data\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:152
+#, c-format
+msgid "Failed to load client configuration file.\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:157
+#, c-format
+msgid "Failed to read environment configuration data.\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:174
+#, c-format
+msgid "Failed to get FQDN.\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:194
+#, c-format
+msgid "Failed to load cookie data\n"
+msgstr ""
+
+#: ../src/utils/pax11publish.c:211
+#, c-format
+msgid "Not yet implemented.\n"
+msgstr ""
+
+#: ../src/utils/pacmd.c:69
+msgid "No PulseAudio daemon running, or not running as session daemon."
+msgstr ""
+
+#: ../src/utils/pacmd.c:74
+#, c-format
+msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
+msgstr ""
+
+#: ../src/utils/pacmd.c:91
+#, c-format
+msgid "connect(): %s"
+msgstr ""
+
+#: ../src/utils/pacmd.c:99
+msgid "Failed to kill PulseAudio daemon."
+msgstr ""
+
+#: ../src/utils/pacmd.c:107
+msgid "Daemon not responding."
+msgstr ""
+
+#: ../src/utils/pacmd.c:161
+#, c-format
+msgid "poll(): %s"
+msgstr ""
+
+#: ../src/utils/pacmd.c:171
+#: ../src/utils/pacmd.c:188
+#, c-format
+msgid "read(): %s"
+msgstr ""
+
+#: ../src/utils/pacmd.c:207
+#: ../src/utils/pacmd.c:223
+#, c-format
+msgid "write(): %s"
+msgstr ""
+
+#: ../src/pulsecore/lock-autospawn.c:136
+#: ../src/pulsecore/lock-autospawn.c:219
+msgid "Cannot access autospawn lock."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-sink.c:530
+#: ../src/modules/alsa/alsa-sink.c:689
+#, c-format
+msgid ""
+"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-source.c:506
+#: ../src/modules/alsa/alsa-source.c:656
+#, c-format
+msgid ""
+"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
+msgstr ""
+
+#: ../src/modules/alsa/module-alsa-card.c:152
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
+#: ../src/modules/alsa/alsa-mixer.c:2931
+msgid "Off"
+msgstr "מכובה"
+
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+msgid "High Fidelity Playback (A2DP)"
+msgstr ""
+
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+msgid "High Fidelity Capture (A2DP)"
+msgstr ""
+
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+msgid "Telephony Duplex (HSP/HFP)"
+msgstr ""
+
+#: ../src/modules/reserve-wrap.c:151
+msgid "PulseAudio Sound Server"
+msgstr "שרת הקול PulseAudio"
+
+#: ../src/modules/module-rygel-media-server.c:569
+#: ../src/modules/module-rygel-media-server.c:583
+msgid "Output Devices"
+msgstr "התקני פלט"
+
+#: ../src/modules/module-rygel-media-server.c:570
+#: ../src/modules/module-rygel-media-server.c:584
+msgid "Input Devices"
+msgstr "התקני קלט"
+
+#: ../src/modules/module-rygel-media-server.c:774
+msgid "Audio on @HOSTNAME@"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1701
+msgid "Input"
+msgstr "פלט"
+
+#: ../src/modules/alsa/alsa-mixer.c:1702
+msgid "Docking Station Input"
+msgstr "קלט של תחנת עגינה"
+
+#: ../src/modules/alsa/alsa-mixer.c:1703
+msgid "Docking Station Microphone"
+msgstr "מיקרופון של תחנת עגינה"
+
+#: ../src/modules/alsa/alsa-mixer.c:1704
+msgid "Line-In"
+msgstr "קו נכנס"
+
+#: ../src/modules/alsa/alsa-mixer.c:1705
+msgid "Microphone"
+msgstr "מיקרופון"
+
+#: ../src/modules/alsa/alsa-mixer.c:1706
+msgid "External Microphone"
+msgstr "מיקרופון חיצוני"
+
+#: ../src/modules/alsa/alsa-mixer.c:1707
+msgid "Internal Microphone"
+msgstr "מיקרופון פנימי"
+
+#: ../src/modules/alsa/alsa-mixer.c:1708
+msgid "Radio"
+msgstr "רדיו"
+
+#: ../src/modules/alsa/alsa-mixer.c:1709
+msgid "Video"
+msgstr "וידאו"
+
+#: ../src/modules/alsa/alsa-mixer.c:1710
+msgid "Automatic Gain Control"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1711
+msgid "No Automatic Gain Control"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1712
+msgid "Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1713
+msgid "No Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1714
+msgid "Amplifier"
+msgstr "מגבר"
+
+#: ../src/modules/alsa/alsa-mixer.c:1715
+msgid "No Amplifier"
+msgstr "אין מגבר"
+
+#: ../src/modules/alsa/alsa-mixer.c:1773
+msgid "Analog Input"
+msgstr "קלט אנלוגי"
+
+#: ../src/modules/alsa/alsa-mixer.c:1774
+msgid "Analog Microphone"
+msgstr "מיקרופון אנלוגי"
+
+#: ../src/modules/alsa/alsa-mixer.c:1775
+msgid "Analog Line-In"
+msgstr "קו נכנס אנלוגי"
+
+#: ../src/modules/alsa/alsa-mixer.c:1776
+msgid "Analog Radio"
+msgstr "רדיו אנלוגי"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
+msgid "Analog Video"
+msgstr "וידאו אנלוגי"
+
+#: ../src/modules/alsa/alsa-mixer.c:1778
+msgid "Analog Output"
+msgstr "פלט אנלוגי"
+
+#: ../src/modules/alsa/alsa-mixer.c:1779
+msgid "Analog Headphones"
+msgstr "אוזניות אנלוגיות"
+
+#: ../src/modules/alsa/alsa-mixer.c:1780
+msgid "Analog Output (LFE)"
+msgstr "פלט אנלוגי (LFE)"
+
+#: ../src/modules/alsa/alsa-mixer.c:1781
+msgid "Analog Mono Output"
+msgstr "פלט מונו אנלוגי"
+
+#: ../src/modules/alsa/alsa-mixer.c:1981
+#, c-format
+msgid "%s+%s"
+msgstr "%s+%s"
+
+#: ../src/modules/alsa/alsa-mixer.c:1984
+#: ../src/modules/alsa/alsa-mixer.c:3404
+#, c-format
+msgid "%s / %s"
+msgstr "%s / %s"
+
+#: ../src/modules/alsa/alsa-mixer.c:2790
+msgid "Analog Mono"
+msgstr "מונו אנלוגי"
+
+#: ../src/modules/alsa/alsa-mixer.c:2791
+msgid "Analog Stereo"
+msgstr "סטראו אנלוגי"
+
+#: ../src/modules/alsa/alsa-mixer.c:2792
+msgid "Analog Surround 2.1"
+msgstr "סראונד אנלוגי 2.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:2793
+msgid "Analog Surround 3.0"
+msgstr "סראונד אנלוגי 3.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:2794
+msgid "Analog Surround 3.1"
+msgstr "סראונד אנלוגי 3.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:2795
+msgid "Analog Surround 4.0"
+msgstr "סראונד אנלוגי 4.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:2796
+msgid "Analog Surround 4.1"
+msgstr "סראונד אנלוגי 4.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:2797
+msgid "Analog Surround 5.0"
+msgstr "סראונד אנלוגי 5.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:2798
+msgid "Analog Surround 5.1"
+msgstr "סראונד אנלוגי 5.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:2799
+msgid "Analog Surround 6.0"
+msgstr "סראונד אנלוגי 6.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:2800
+msgid "Analog Surround 6.1"
+msgstr "סראונד אנלוגי 6.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:2801
+msgid "Analog Surround 7.0"
+msgstr "סראונד אנלוגי 7.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:2802
+msgid "Analog Surround 7.1"
+msgstr "סראונד אנלוגי 7.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:2803
+msgid "Digital Stereo (IEC958)"
+msgstr "סטראו דיגיטלי (IEC958)"
+
+#: ../src/modules/alsa/alsa-mixer.c:2804
+msgid "Digital Surround 4.0 (IEC958)"
+msgstr "סראונד דיגיטלי 4.0 (IEC958)"
+
+#: ../src/modules/alsa/alsa-mixer.c:2805
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr "סראונד דיגיטלי 4.0 (IEC958/AC3)"
+
+#: ../src/modules/alsa/alsa-mixer.c:2806
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr "סראונד דיגיטלי 5.1 (IEC958/AC3)"
+
+#: ../src/modules/alsa/alsa-mixer.c:2807
+msgid "Digital Stereo (HDMI)"
+msgstr "סטראו דיגיטלי (HDMI)"
+
+#: ../src/modules/alsa/alsa-mixer.c:2928
+msgid "Analog Mono Duplex"
+msgstr "מונו אנלוגי משולב"
+
+#: ../src/modules/alsa/alsa-mixer.c:2929
+msgid "Analog Stereo Duplex"
+msgstr "סטראו אנלוגי משולב"
+
+#: ../src/modules/alsa/alsa-mixer.c:2930
+msgid "Digital Stereo Duplex (IEC958)"
+msgstr "סטראו דיגיטלי משולב (IEC958)"
+

commit a3a9c176bb24bf8671074116ea39810289d7217a
Author: Dimitris Glezos <glezos at indifex.com>
Date:   Fri Jan 15 15:47:10 2010 +0000

    l10n: Updates to Greek (el) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/el.po b/po/el.po
index d9b2a4d..01334a4 100644
--- a/po/el.po
+++ b/po/el.po
@@ -1,24 +1,23 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
-#
+# 
 # Dimitris Glezos <dimitris at glezos.com>, 2008.
 # Thalia Papoutsaki <saliyath at gmail.com>, 2009.
 msgid ""
 msgstr ""
 "Project-Id-Version: el\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-26 09:45+0000\n"
+"POT-Creation-Date: 2010-01-15 06:45+0000\n"
 "PO-Revision-Date: 2009-10-26 17:15+0200\n"
 "Last-Translator: Thalia Papoutsaki <saliyath at gmail.com>\n"
 "Language-Team: Greek <fedora-trans-el at redhat.com>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KAider 0.1\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: KAider 0.1\n"
 
-#: ../src/modules/alsa/alsa-util.c:858
-#: ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
@@ -70,7 +69,7 @@ msgstr ""
 
 #: ../src/pulsecore/sink.c:2613
 msgid "Internal Audio"
-msgstr ""
+msgstr "Εσωτερικός ήχος"
 
 #: ../src/pulsecore/sink.c:2618
 msgid "Modem"
@@ -91,7 +90,7 @@ msgstr ""
 #: ../src/daemon/main.c:141
 #, c-format
 msgid "Got signal %s."
-msgstr ""
+msgstr "Έγινε λήψη σήματος %s."
 
 #: ../src/daemon/main.c:168
 msgid "Exiting."
@@ -122,8 +121,7 @@ msgstr ""
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr ""
 
-#: ../src/daemon/main.c:208
-#: ../src/daemon/main.c:213
+#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr ""
@@ -216,8 +214,7 @@ msgstr ""
 msgid "fork() failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:646
-#: ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
 #, c-format
 msgid "read() failed: %s"
 msgstr ""
@@ -623,8 +620,7 @@ msgstr ""
 msgid "Start the PulseAudio Sound System"
 msgstr ""
 
-#: ../src/pulse/channelmap.c:105
-#: ../src/pulse/channelmap.c:757
+#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757
 msgid "Mono"
 msgstr "Mono"
 
@@ -828,12 +824,9 @@ msgstr ""
 msgid "Top Rear Right"
 msgstr ""
 
-#: ../src/pulse/channelmap.c:484
-#: ../src/pulse/sample.c:170
-#: ../src/pulse/volume.c:295
-#: ../src/pulse/volume.c:321
-#: ../src/pulse/volume.c:341
-#: ../src/pulse/volume.c:371
+#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170
+#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321
+#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371
 msgid "(invalid)"
 msgstr "(μη έγκυρο)"
 
@@ -994,8 +987,7 @@ msgstr "%0.1f KiB"
 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 ""
 
@@ -1055,8 +1047,7 @@ msgstr ""
 msgid "pa_stream_begin_write() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:237
-#: ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr ""
@@ -1154,8 +1145,7 @@ msgstr ""
 msgid "pa_stream_connect_record() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:470
-#: ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Αποτυχία σύνδεσης: %s"
@@ -1237,8 +1227,7 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:764
-#: ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr ""
@@ -1303,8 +1292,7 @@ msgstr ""
 msgid "Warning: specified sample specification will be overwritten with specification from file."
 msgstr ""
 
-#: ../src/utils/pacat.c:962
-#: ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
 msgid "Failed to determine sample specification from file."
 msgstr ""
 
@@ -1333,8 +1321,7 @@ msgstr ""
 msgid "playback"
 msgstr ""
 
-#: ../src/utils/pacat.c:1035
-#: ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
 msgid "pa_mainloop_new() failed."
 msgstr ""
 
@@ -1342,13 +1329,11 @@ msgstr ""
 msgid "io_new() failed."
 msgstr ""
 
-#: ../src/utils/pacat.c:1061
-#: ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
 msgid "pa_context_new() failed."
 msgstr ""
 
-#: ../src/utils/pacat.c:1069
-#: ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr ""
@@ -1357,8 +1342,7 @@ msgstr ""
 msgid "pa_context_rttime_new() failed."
 msgstr ""
 
-#: ../src/utils/pacat.c:1082
-#: ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
 msgid "pa_mainloop_run() failed."
 msgstr ""
 
@@ -1502,14 +1486,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:268
-#: ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
 #, c-format
 msgid "\tPorts:\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:274
-#: ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr ""
@@ -1541,18 +1523,10 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:345
-#: ../src/utils/pactl.c:401
-#: ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473
-#: ../src/utils/pactl.c:532
-#: ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543
-#: ../src/utils/pactl.c:587
-#: ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594
-#: ../src/utils/pactl.c:637
-#: ../src/utils/pactl.c:638
+#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
+#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
+#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
+#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
 #: ../src/utils/pactl.c:645
 msgid "n/a"
 msgstr ""
@@ -1685,8 +1659,7 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:653
-#: ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
 #, c-format
 msgid "Failure: %s"
 msgstr "Αποτυχία: %s"
@@ -1804,12 +1777,9 @@ msgstr ""
 msgid "You have to specify a sink name/index and a volume"
 msgstr ""
 
-#: ../src/utils/pactl.c:1154
-#: ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193
-#: ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226
-#: ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
+#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
+#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
 msgid "Invalid volume specification"
 msgstr ""
 
@@ -1943,25 +1913,21 @@ msgstr ""
 msgid "poll(): %s"
 msgstr ""
 
-#: ../src/utils/pacmd.c:171
-#: ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
 #, c-format
 msgid "read(): %s"
 msgstr ""
 
-#: ../src/utils/pacmd.c:207
-#: ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
 #, c-format
 msgid "write(): %s"
 msgstr ""
 
-#: ../src/pulsecore/lock-autospawn.c:136
-#: ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
 msgid "Cannot access autospawn lock."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-sink.c:530
-#: ../src/modules/alsa/alsa-sink.c:689
+#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
 #, c-format
 msgid ""
 "ALSA woke us up to write new data to the device, but there was actually nothing to write!\n"
@@ -1969,8 +1935,7 @@ msgid ""
 "We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-source.c:506
-#: ../src/modules/alsa/alsa-source.c:656
+#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
 #, c-format
 msgid ""
 "ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
@@ -2115,8 +2080,7 @@ msgstr "Analog Mono Output"
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984
-#: ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
@@ -2204,4 +2168,3 @@ msgstr "Analog Stereo Duplex"
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Digital Stereo Duplex (IEC958)"
-

commit c47773a1f3754ce640e49d19a06c7912fe0a7c1c
Author: Pascal Terjan <pterjan at gmail.com>
Date:   Sun Jan 17 09:43:36 2010 +0000

    l10n: Updates to French (fr) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/fr.po b/po/fr.po
index 89d27d7..771bd96 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -1,8 +1,8 @@
 # French translation of pulseaudio.
 # Copyright (C) 2006-2008 Lennart Poettering
 # This file is distributed under the same license as the pulseaudio package.
-#
-#
+# 
+# 
 # Robert-André Mauchin <zebob.m at pengzone.org>, 2008.
 # Michaël Ughetto <telimektar esraonline com>, 2008.
 # Pablo Martin-Gomez <pablo.martin-gomez at laposte.net>, 2008.
@@ -12,7 +12,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio trunk\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-04 13:02+0000\n"
+"POT-Creation-Date: 2010-01-17 06:48+0000\n"
 "PO-Revision-Date: 2009-12-09 21:40+0100\n"
 "Last-Translator: Thomas Canniot <mrtom at fedoraproject.org>\n"
 "Language-Team: French <fedora-trans-fr at redhat.com>\n"
@@ -30,41 +30,29 @@ msgstr "%s %s"
 #: ../src/modules/alsa/alsa-util.c:1106
 #, c-format
 msgid ""
-"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
-"ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
-"snd_pcm_avail() a retourné une valeur qui est exceptionnellement large : %lu "
-"octets (%lu ms).\n"
-"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez "
-"rapporter ce problème aux développeurs d'ALSA."
+"snd_pcm_avail() a retourné une valeur qui est exceptionnellement large : %lu octets (%lu ms).\n"
+"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez rapporter ce problème aux développeurs d'ALSA."
 
 #: ../src/modules/alsa/alsa-util.c:1147
 #, c-format
 msgid ""
-"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
-"lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
-"snd_pcm_delay() a retourné une valeur qui est exceptionnellement large : %li "
-"octets (%s%lu ms).\n"
-"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez "
-"rapporter ce problème aux développeurs d'ALSA."
+"snd_pcm_delay() a retourné une valeur qui est exceptionnellement large : %li octets (%s%lu ms).\n"
+"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez rapporter ce problème aux développeurs d'ALSA."
 
 #: ../src/modules/alsa/alsa-util.c:1194
 #, c-format
 msgid ""
-"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
-"(%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
-"snd_pcm_mmap_begin() a retourné une valeur qui est exceptionnellement "
-"large : %lu octets (%lu·ms).\n"
-"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez "
-"rapporter ce problème aux développeurs d'ALSA."
+"snd_pcm_mmap_begin() a retourné une valeur qui est exceptionnellement large : %lu octets (%lu·ms).\n"
+"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez rapporter ce problème aux développeurs d'ALSA."
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
@@ -79,20 +67,8 @@ msgid "Virtual LADSPA sink"
 msgstr "Destination virtuelle LADSPA"
 
 #: ../src/modules/module-ladspa-sink.c:53
-msgid ""
-"sink_name=<name for the sink> sink_properties=<properties for the sink> "
-"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
-"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
-"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
-"input control values>"
-msgstr ""
-"sink_name=<nom de la destination> sink_properties=<propriétés de la "
-"destination> "
-"master=<nom de la destination à filter> format=<format de l'échantillon> "
-"rate=<taux d'échantillonage> "
-"channels=<nombre de canaux> channel_map=<plan des canaux> plugin=<nom de "
-"l'extension ladspa> label=<étiquette de l'extension ladspa> control=<liste des "
-"valeurs de contrôle de l'entrée séparées par des virgules>"
+msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
+msgstr "sink_name=<nom de la destination> sink_properties=<propriétés de la destination> master=<nom de la destination à filter> format=<format de l'échantillon> rate=<taux d'échantillonage> channels=<nombre de canaux> channel_map=<plan des canaux> plugin=<nom de l'extension ladspa> label=<étiquette de l'extension ladspa> control=<liste des valeurs de contrôle de l'entrée séparées par des virgules>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
@@ -149,8 +125,7 @@ msgstr "Utilisateur « %s ” (UID %lu) et groupe « %s » (GID %lu) trouvé
 #: ../src/daemon/main.c:200
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
-msgstr ""
-"Le GID de l'utilisateur « %s » et du groupe « %s » ne sont pas identiques."
+msgstr "Le GID de l'utilisateur « %s » et du groupe « %s » ne sont pas identiques."
 
 #: ../src/daemon/main.c:205
 #, c-format
@@ -209,12 +184,8 @@ msgid "Failed to kill daemon: %s"
 msgstr "Impossible de tuer le démon : %s"
 
 #: ../src/daemon/main.c:571
-msgid ""
-"This program is not intended to be run as root (unless --system is "
-"specified)."
-msgstr ""
-"Le programme n'est pas conçu pour être lancé en tant que root (sauf si --"
-"system est renseigné)."
+msgid "This program is not intended to be run as root (unless --system is specified)."
+msgstr "Le programme n'est pas conçu pour être lancé en tant que root (sauf si --system est renseigné)."
 
 #: ../src/daemon/main.c:573
 msgid "Root privileges required."
@@ -226,14 +197,11 @@ msgstr "--start n'est pas pris en charge pour les instances système."
 
 #: ../src/daemon/main.c:583
 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."
+msgstr "Le démon s'exécute en mode système, mais --disallow-exit n'est pas défini."
 
 #: ../src/daemon/main.c:586
 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."
+msgstr "Le démon s'exécute en mode système, mais --disallow-module-loading n'est pas défini."
 
 #: ../src/daemon/main.c:589
 msgid "Running in system mode, forcibly disabling SHM mode!"
@@ -241,9 +209,7 @@ msgstr "Le démon s'exécute en mode système, désactivation forcée du mode SH
 
 #: ../src/daemon/main.c:594
 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é."
+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:621
 msgid "Failed to acquire stdio."
@@ -329,8 +295,7 @@ msgstr "NDEBUG défini, tous les messages d'erreur sont désactivés."
 
 #: ../src/daemon/main.c:760
 msgid "FASTPATH defined, only fast path asserts disabled."
-msgstr ""
-"FASTPATH défini, seuls les messages d'erreur fastpath ont été désactivés."
+msgstr "FASTPATH défini, seuls les messages d'erreur fastpath ont été désactivés."
 
 #: ../src/daemon/main.c:762
 msgid "All asserts enabled."
@@ -345,7 +310,8 @@ msgstr "Échec lors de l'obtention de l'ID de la machine"
 msgid "Machine ID is %s."
 msgstr "L'ID de la machine est %s."
 
-#: ../src/daemon/main.c:773, c-format
+#: ../src/daemon/main.c:773
+#, c-format
 msgid "Session ID is %s."
 msgstr "L'ID de la session est %s."
 
@@ -359,7 +325,8 @@ msgstr "Utilisation du répertoire d'exécution %s."
 msgid "Using state directory %s."
 msgstr "Utilisation du répertoire d'état %s."
 
-#: ../src/daemon/main.c:787, c-format
+#: ../src/daemon/main.c:787
+#, c-format
 msgid "Using modules directory %s."
 msgstr "Utilisation du répertoire des modules %s."
 
@@ -370,19 +337,13 @@ msgstr "Exécution en mode système : %s"
 
 #: ../src/daemon/main.c:792
 msgid ""
-"OK, so you are running PA in system mode. Please note that you most likely "
-"shouldn't be doing that.\n"
-"If you do it nonetheless then it's your own fault if things don't work as "
-"expected.\n"
-"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
-"explanation why system mode is usually a bad idea."
+"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."
 msgstr ""
-"Vous exécutez PA dans un mode système. Sachez que vous ne devriez pas faire "
-"cela.\n"
-"Si vous choisissez malgré tout de le faire, vous êtes responsable de tout "
-"dysfonctionnement inattendu.\n"
-"Veuillez lire http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode pour "
-"comprendre pourquoi le mode système est généralement une mauvaise idée."
+"Vous exécutez PA dans un mode système. Sachez que vous ne devriez pas faire cela.\n"
+"Si vous choisissez malgré tout de le faire, vous êtes responsable de tout dysfonctionnement inattendu.\n"
+"Veuillez lire http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode pour comprendre pourquoi le mode système est généralement une mauvaise idée."
 
 #: ../src/daemon/main.c:809
 msgid "pa_pid_file_create() failed."
@@ -390,16 +351,11 @@ msgstr "Échec de pa_pid_file_create()."
 
 #: ../src/daemon/main.c:819
 msgid "Fresh high-resolution timers available! Bon appetit!"
-msgstr ""
-"De nouvelles horloges à haute résolution sont disponibles ! Bon appétit !"
+msgstr "De nouvelles horloges à haute résolution sont disponibles ! Bon appétit !"
 
 #: ../src/daemon/main.c:821
-msgid ""
-"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
-"resolution timers enabled!"
-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."
+msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
+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:844
 msgid "pa_core_new() failed."
@@ -436,48 +392,37 @@ 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"
@@ -488,12 +433,10 @@ 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"
@@ -504,87 +447,56 @@ msgstr ""
 "  -h, --help                            Affiche cette aide\n"
 "      --version                         Affiche la version\n"
 "      --dump-conf                       Affiche la configuration par défaut\n"
-"      --dump-modules                    Affiche la liste des modules "
-"disponibles\n"
-"      --dump-resample-methods           Affiche la liste des méthodes "
-"d'échantillonnage disponibles\n"
-"      --cleanup-shm                     Nettoie les segments de mémoire "
-"partagée périmés\n"
-"      --start                           Démarre le démon s'il n'est pas "
-"lancé\n"
+"      --dump-modules                    Affiche la liste des modules disponibles\n"
+"      --dump-resample-methods           Affiche la liste des méthodes d'échantillonnage disponibles\n"
+"      --cleanup-shm                     Nettoie les segments de mémoire partagée périmés\n"
+"      --start                           Démarre le démon s'il n'est pas lancé\n"
 "  -k  --kill                            Tue un démon en cours d'exécution\n"
-"      --check                           Vérifie s'il existe un démon en "
-"cours d'exécution (ne retourne que le code de sortie)\n"
+"      --check                           Vérifie s'il existe un démon en cours d'exécution (ne retourne que le code de sortie)\n"
 "\n"
 "OPTIONS :\n"
-"      --system[=BOOL]                   Exécuter en tant qu'instance "
-"système\n"
-"  -D, --daemonize[=BOOL]                Définir en tant que démon après le "
-"démarrage\n"
+"      --system[=BOOL]                   Exécuter en tant qu'instance système\n"
+"  -D, --daemonize[=BOOL]                Définir en tant que démon après le démarrage\n"
 "      --fail[=BOOL]                     Quitte quand le démarrage échoue\n"
-"      --high-priority[=BOOL]            Tente de définir un niveau nice plus "
-"élevé\n"
-"                                        (seulement disponible en tant que "
-"root, avec le SUID ou\n"
+"      --high-priority[=BOOL]            Tente de définir un niveau nice plus élevé\n"
+"                                        (seulement disponible en tant que root, avec le SUID ou\n"
 "                                        avec un RLIMIT_NICE élevé)\n"
-"      --realtime[=BOOL]                 Tente d'activer une planification en "
-"temps réel\n"
-"                                        (seulement disponible en tant que "
-"root, avec le SUID ou\n"
+"      --realtime[=BOOL]                 Tente d'activer une planification en temps réel\n"
+"                                        (seulement disponible en tant que root, avec le SUID ou\n"
 "                                        ave un RLIMIT_RTPRIO élevé)\n"
-"      --disallow-module-loading[=BOOL]  Empêche les chargements/"
-"déchargements de module\n"
-"                                        demandés par l'utilisateur après le "
-"démarrage\n"
-"      --disallow-exit[=BOOL]            Empêche les fermetures demandées par "
-"l'utilisateur\n"
-"      --exit-idle-time=SECS             Termine le démon quand la durée "
-"d'inactivité \n"
+"      --disallow-module-loading[=BOOL]  Empêche les chargements/déchargements de module\n"
+"                                        demandés par l'utilisateur après le démarrage\n"
+"      --disallow-exit[=BOOL]            Empêche les fermetures demandées par l'utilisateur\n"
+"      --exit-idle-time=SECS             Termine le démon quand la durée d'inactivité \n"
 "                                        et ce temps se sont écoulés\n"
-"      --module-idle-time=SECS           Décharge les modules chargés "
-"automatiquement \n"
-"                                        quand la durée d'inactivité et ce "
-"temps se sont écoulés\n"
-"      --scache-idle-time=SECS           Décharge les échantillons chargés "
-"automatiquement \n"
-"                                        quand la durée d'inactivité et ce "
-"temps se sont écoulés\n"
-"      --log-level[=NIVEAU]              Augmente ou définit le niveau de "
-"verbosité\n"
+"      --module-idle-time=SECS           Décharge les modules chargés automatiquement \n"
+"                                        quand la durée d'inactivité et ce temps se sont écoulés\n"
+"      --scache-idle-time=SECS           Décharge les échantillons chargés automatiquement \n"
+"                                        quand la durée d'inactivité et ce temps se sont écoulés\n"
+"      --log-level[=NIVEAU]              Augmente ou définit le niveau de verbosité\n"
 "  -v                                    Augmente le niveau de verbosité\n"
 "      --log-target={auto,syslog,stderr} Indique la cible du journal\n"
-"      --log-meta[=BOOL]                 Inclure la position du code dans les "
-"messages ·du journal\n"
-"      --log-time[=BOOL]                 Inclure la date dans les messages du "
-"journal\n"
-"      --log-backtrace=TRAMES            Inclure un traçage de la pile dans "
-"les messages du journal\n"
-"  -p, --dl-search-path=CHEMIN           Définit le chemin de recherche pour "
-"les objets dynamiques\n"
+"      --log-meta[=BOOL]                 Inclure la position du code dans les messages ·du journal\n"
+"      --log-time[=BOOL]                 Inclure la date dans les messages du journal\n"
+"      --log-backtrace=TRAMES            Inclure un traçage de la pile dans les messages du journal\n"
+"  -p, --dl-search-path=CHEMIN           Définit le chemin de recherche pour les objets dynamiques\n"
 "                                        partagés (extensions)\n"
-"      --resample-method=MÉTHODE         Utilise la méthode de "
-"rééchantillonnage indiquée\n"
+"      --resample-method=MÉTHODE         Utilise la méthode de rééchantillonnage indiquée\n"
 "                                        (Voir --dump-resample-methods pour\n"
 "                                        les valeurs possibles)\n"
 "      --use-pid-file[=BOOL]             Crée un fichier PID\n"
-"      --no-cpu-limit[=BOOL]             Ne pas installer de limiteur de "
-"charge CPU\n"
-"                                        sur les plateformes qui le "
-"supportent.\n"
-"      --disable-shm[=BOOL]              Désactive la prise en charge de la "
-"mémoire partagée.\n"
+"      --no-cpu-limit[=BOOL]             Ne pas installer de limiteur de charge CPU\n"
+"                                        sur les plateformes qui le supportent.\n"
+"      --disable-shm[=BOOL]              Désactive la prise en charge de la mémoire partagée.\n"
 "\n"
 "SCRIPT DE DÉMARRAGE :\n"
-"  -L, --load=\"PARAMÈTRES DU MODULE\"   Charge le module d'extension indiqué "
-"avec\n"
+"  -L, --load=\"PARAMÈTRES DU MODULE\"   Charge le module d'extension indiqué avec\n"
 "                                        le paramètre indiqué\n"
 "  -F, --file=NOMDEFICHIER               Exécute le script indiqué\n"
-"  -C                                    Ouvre une ligne de commande sur le "
-"TTY en cours \n"
+"  -C                                    Ouvre une ligne de commande sur le TTY en cours \n"
 "                                        après le démarrage\n"
 "\n"
-"  -n                                    Ne pas charger les fichiers de "
-"scripts par défaut\n"
+"  -n                                    Ne pas charger les fichiers de scripts par défaut\n"
 
 #: ../src/daemon/cmdline.c:247
 msgid "--daemonize expects boolean argument"
@@ -595,12 +507,8 @@ msgid "--fail expects boolean argument"
 msgstr "--fail requiert un paramètre booléen"
 
 #: ../src/daemon/cmdline.c:264
-msgid ""
-"--log-level expects log level argument (either numeric in range 0..4 or one "
-"of debug, info, notice, warn, error)."
-msgstr ""
-"--log-level requiert un paramètre de niveau de journal (soit numérique entre "
-"0 et 4, soit de débogage : 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 requiert un paramètre de niveau de journal (soit numérique entre 0 et 4, soit de débogage : info, notice, warn , error)."
 
 #: ../src/daemon/cmdline.c:276
 msgid "--high-priority expects boolean argument"
@@ -763,12 +671,8 @@ msgid "Failed to open configuration file: %s"
 msgstr "Échec lors de l'ouverture du fichier de configuration : %s"
 
 #: ../src/daemon/daemon-conf.c:562
-msgid ""
-"The specified default channel map has a different number of channels than "
-"the specified default number of channels."
-msgstr ""
-"Le plan de canaux spécifié par défaut a un nombre de canaux différent du "
-"nombre spécifié par défaut."
+msgid "The specified default channel map has a different number of channels than the specified default number of channels."
+msgstr "Le plan de canaux spécifié par défaut a un nombre de canaux différent du nombre spécifié par défaut."
 
 #: ../src/daemon/daemon-conf.c:638
 #, c-format
@@ -1186,7 +1090,8 @@ msgstr "waitpid() : %s"
 msgid "Received message for unknown extension '%s'"
 msgstr "Message reçu pour une extension inconnue « %s »"
 
-#: ../src/utils/pacat.c:108, c-format
+#: ../src/utils/pacat.c:108
+#, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Échec lors du vidage du flux : %s"
 
@@ -1198,19 +1103,23 @@ msgstr "Flux de lecture vidé."
 msgid "Draining connection to server."
 msgstr "Vidage de la connexion au serveur."
 
-#: ../src/utils/pacat.c:136, c-format
+#: ../src/utils/pacat.c:136
+#, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain() : %s"
 
-#: ../src/utils/pacat.c:159, c-format
+#: ../src/utils/pacat.c:159
+#, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "Échec de pa_stream_write() : %s"
 
-#: ../src/utils/pacat.c:197, c-format
+#: ../src/utils/pacat.c:197
+#, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "Échec de pa_stream_begin_write() : %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267, c-format
+#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "Échec de pa_stream_peek() : %s"
 
@@ -1218,53 +1127,64 @@ msgstr "Échec de pa_stream_peek() : %s"
 msgid "Stream successfully created."
 msgstr "Création du flux réussie."
 
-#: ../src/utils/pacat.c:310, c-format
+#: ../src/utils/pacat.c:310
+#, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "Échec de pa_stream_get_buffer_attr() : %s"
 
-#: ../src/utils/pacat.c:314, c-format
+#: ../src/utils/pacat.c:314
+#, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Mesures du tampon : maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317, c-format
+#: ../src/utils/pacat.c:317
+#, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Mesures du tampon : maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321, c-format
+#: ../src/utils/pacat.c:321
+#, c-format
 msgid "Using sample spec '%s', channel map '%s'."
-msgstr ""
-"Utilisation de la spécification d'échantillon « %s », plan des canaux « %s »."
+msgstr "Utilisation de la spécification d'échantillon « %s », plan des canaux « %s »."
 
 # l'espace manquant entre %s et suspended est voulu
-#: ../src/utils/pacat.c:325, c-format
+#: ../src/utils/pacat.c:325
+#, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Connecté au périphérique %s (%u, %ssuspendu)."
 
-#: ../src/utils/pacat.c:335, c-format
+#: ../src/utils/pacat.c:335
+#, c-format
 msgid "Stream error: %s"
 msgstr "Erreur du flux : %s"
 
-#: ../src/utils/pacat.c:345, c-format
+#: ../src/utils/pacat.c:345
+#, c-format
 msgid "Stream device suspended.%s"
 msgstr "Périphérique de flux suspendu.%s"
 
-#: ../src/utils/pacat.c:347, c-format
+#: ../src/utils/pacat.c:347
+#, c-format
 msgid "Stream device resumed.%s"
 msgstr "Périphérique de flux repris.%s"
 
-#: ../src/utils/pacat.c:355, c-format
+#: ../src/utils/pacat.c:355
+#, c-format
 msgid "Stream underrun.%s"
 msgstr "Flux vide.%s"
 
-#: ../src/utils/pacat.c:362, c-format
+#: ../src/utils/pacat.c:362
+#, c-format
 msgid "Stream overrun.%s"
 msgstr "Flux saturé.%s"
 
-#: ../src/utils/pacat.c:369, c-format
+#: ../src/utils/pacat.c:369
+#, c-format
 msgid "Stream started.%s"
 msgstr "Flux démarré.%s"
 
-#: ../src/utils/pacat.c:376, c-format
+#: ../src/utils/pacat.c:376
+#, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Flux déplacé vers le périphérique %s (%u, %ssuspendu).%s"
 
@@ -1273,27 +1193,33 @@ msgstr "Flux déplacé vers le périphérique %s (%u, %ssuspendu).%s"
 msgid "not "
 msgstr "non "
 
-#: ../src/utils/pacat.c:383, c-format
+#: ../src/utils/pacat.c:383
+#, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Des attributs du tampon de flux ont changé.%s"
 
-#: ../src/utils/pacat.c:415, c-format
+#: ../src/utils/pacat.c:415
+#, c-format
 msgid "Connection established.%s"
 msgstr "Connexion établie.%s"
 
-#: ../src/utils/pacat.c:418, c-format
+#: ../src/utils/pacat.c:418
+#, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "Échec de pa_stream_new() : %s"
 
-#: ../src/utils/pacat.c:450, c-format
+#: ../src/utils/pacat.c:450
+#, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "Échec de pa_stream_connect_playback() : %s"
 
-#: ../src/utils/pacat.c:456, c-format
+#: ../src/utils/pacat.c:456
+#, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "Échec de pa_stream_connect_record() : %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857, c-format
+#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#, c-format
 msgid "Connection failure: %s"
 msgstr "Échec lors de la connexion : %s"
 
@@ -1301,7 +1227,8 @@ msgstr "Échec lors de la connexion : %s"
 msgid "Got EOF."
 msgstr "EOF obtenu."
 
-#: ../src/utils/pacat.c:540, c-format
+#: ../src/utils/pacat.c:540
+#, c-format
 msgid "write() failed: %s"
 msgstr "Échec de write() : %s"
 
@@ -1309,22 +1236,26 @@ msgstr "Échec de write() : %s"
 msgid "Got signal, exiting."
 msgstr "Signal obtenu, fermeture."
 
-#: ../src/utils/pacat.c:575, c-format
+#: ../src/utils/pacat.c:575
+#, c-format
 msgid "Failed to get latency: %s"
 msgstr "Échec lors de l'obtention de la latence : %s"
 
-#: ../src/utils/pacat.c:580, c-format
+#: ../src/utils/pacat.c:580
+#, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Durée : %0.3f sec. ; Latence : %0.0f µsec."
 
-#: ../src/utils/pacat.c:599, c-format
+#: ../src/utils/pacat.c:599
+#, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "Échec de pa_stream_update_timing_info() : %s"
 
 # 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:609, c-format
+#: ../src/utils/pacat.c:609
+#, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1336,48 +1267,29 @@ 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, "
-"s24le, s24be,\n"
-"                                        s24-32le, s24-32be (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, s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, 2 for stereo\n"
 "                                        (defaults to 2)\n"
-"      --channel-map=CHANNELMAP          Channel map to use instead of the "
-"default\n"
-"      --fix-format                      Take the sample format from the sink "
-"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"
-"      --property=PROPERTY=VALUE         Set the specified property to the "
-"specified value.\n"
+"      --no-remap                        Map channels by index instead of name.\n"
+"      --latency=BYTES                   Request the specified latency in bytes.\n"
+"      --process-time=BYTES              Request the specified process time per request in bytes.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
 "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
@@ -1387,60 +1299,36 @@ msgstr ""
 "  -h, --help                            Affiche cette aide\n"
 "      --version                         Affiche la version\n"
 "\n"
-"  -r, --record                          Crée une connexion pour "
-"l'enregistrement\n"
-"  -p, --playback                        Crée une connexion pour la "
-"relecture\n"
+"  -r, --record                          Crée une connexion pour l'enregistrement\n"
+"  -p, --playback                        Crée une connexion pour la relecture\n"
 "\n"
 "  -v, --verbose                         Active le mode verbeux\n"
 "\n"
-"  -s, --server=SERVEUR                  Le nom du serveur auquel se "
-"connecter\n"
-"  -d, --device=PÉRIPHÉRIQUE             Le nom de la destination/source à "
-"laquelle se connecter\n"
-"  -n, --client-name=NOM                 Définit le nom de ce client sur le "
-"serveur\n"
-"      --stream-name=NOM                 Définit le nom de ce flux sur le "
-"serveur\n"
-"      --volume=VOLUME                   Indique le volume initial (linéaire) "
-"entre 0 et 65536\n"
-"      --rate=TAUXDÉCHANTILLONNAGE       Le taux d'échantillonnage en Hz (par "
-"défaut 44100)\n"
-"      --format=FORMATDELÉCHANTILLON     Le type de l'échantillon, parmi : "
-"s16le, s16be, u8, float32le,\n"
-"                                        float32be, ulaw, alaw (par défaut "
-"s16ne)\n"
-"      --channels=CANAUX                 Le nombre de canaux, 1 pour mono, 2 "
-"pour stéréo\n"
+"  -s, --server=SERVEUR                  Le nom du serveur auquel se connecter\n"
+"  -d, --device=PÉRIPHÉRIQUE             Le nom de la destination/source à laquelle se connecter\n"
+"  -n, --client-name=NOM                 Définit le nom de ce client sur le serveur\n"
+"      --stream-name=NOM                 Définit le nom de ce flux sur le serveur\n"
+"      --volume=VOLUME                   Indique le volume initial (linéaire) entre 0 et 65536\n"
+"      --rate=TAUXDÉCHANTILLONNAGE       Le taux d'échantillonnage en Hz (par défaut 44100)\n"
+"      --format=FORMATDELÉCHANTILLON     Le type de l'échantillon, parmi : s16le, s16be, u8, float32le,\n"
+"                                        float32be, ulaw, alaw (par défaut s16ne)\n"
+"      --channels=CANAUX                 Le nombre de canaux, 1 pour mono, 2 pour stéréo\n"
 "                                        (par défaut 2)\n"
-"      --channel-map=PLANDESCANAUX       Plan des canaux à utiliser au lieu "
-"de celui par défaut\n"
-"      --fix-format                      Prend le format de l'échantillon de "
-"la destination où le flux\n"
+"      --channel-map=PLANDESCANAUX       Plan des canaux à utiliser au lieu de celui par défaut\n"
+"      --fix-format                      Prend le format de l'échantillon de la destination où le flux\n"
 "                                        est en train de se connecter.\n"
-"      --fix-rate                        Prend le taux d'échantillonnage de "
-"la destination où le flux\n"
+"      --fix-rate                        Prend le taux d'échantillonnage de la destination où le flux\n"
 "                                        est en train de se connecter.\n"
-"      --fix-channels                    Prend le nombre et le plan des "
-"canaux de la destination \n"
-"                                        où le flux est en train de se "
-"connecter.\n"
-"      --no-remix                        Ne pas augmenter ou diminuer le "
-"nombre de canaux par mixage.\n"
-"      --no-remap                        Créer le plan des canaux par index "
-"et non par nom.\n"
-"      --latency=OCTETS                  Demande la latence indiquée en "
-"octets.\n"
-"      --process-time=OCTETS             Demande le temps de traitement "
-"indiqué par requête en octets.\n"
-"      --property=PROPRIÉTÉ=VALEUR         Attribut la propriété définie à la "
-"valeur définie.\n"
-"      --raw                             Enregistre/lit les données PCM brutes."
-"\n"
-"      --file-format=FFORMAT             Enregistre/lit les données PCM "
-"formatées.\n"
-"      --list-file-formats               Liste les formats de fichiers "
-"disponibles.\n"
+"      --fix-channels                    Prend le nombre et le plan des canaux de la destination \n"
+"                                        où le flux est en train de se connecter.\n"
+"      --no-remix                        Ne pas augmenter ou diminuer le nombre de canaux par mixage.\n"
+"      --no-remap                        Créer le plan des canaux par index et non par nom.\n"
+"      --latency=OCTETS                  Demande la latence indiquée en octets.\n"
+"      --process-time=OCTETS             Demande le temps de traitement indiqué par requête en octets.\n"
+"      --property=PROPRIÉTÉ=VALEUR         Attribut la propriété définie à la valeur définie.\n"
+"      --raw                             Enregistre/lit les données PCM brutes.\n"
+"      --file-format=FFORMAT             Enregistre/lit les données PCM formatées.\n"
+"      --list-file-formats               Liste les formats de fichiers disponibles.\n"
 
 #: ../src/utils/pacat.c:731
 #, c-format
@@ -1453,27 +1341,33 @@ msgstr ""
 "Compilé avec libpulse %s\n"
 "Lié avec libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953, c-format
+#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#, c-format
 msgid "Invalid client name '%s'"
 msgstr "Nom du client invalide « %s »"
 
-#: ../src/utils/pacat.c:779, c-format
+#: ../src/utils/pacat.c:779
+#, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Nom du flux invalide « %s »"
 
-#: ../src/utils/pacat.c:816, c-format
+#: ../src/utils/pacat.c:816
+#, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Plan des canaux invalide « %s »"
 
-#: ../src/utils/pacat.c:845, c-format
+#: ../src/utils/pacat.c:845
+#, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Spécification de latence invalide « %s »"
 
-#: ../src/utils/pacat.c:852, c-format
+#: ../src/utils/pacat.c:852
+#, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Spécification de temps de traitement invalide « %s »"
 
-#: ../src/utils/pacat.c:864, c-format
+#: ../src/utils/pacat.c:864
+#, c-format
 msgid "Invalid property '%s'"
 msgstr "Propriété invalide « %s »"
 
@@ -1486,11 +1380,13 @@ msgstr "Format de fichier inconnu %s."
 msgid "Invalid sample specification"
 msgstr "Spécification d'échantillon invalide"
 
-#: ../src/utils/pacat.c:910, c-format
+#: ../src/utils/pacat.c:910
+#, c-format
 msgid "open(): %s"
 msgstr "open() : %s"
 
-#: ../src/utils/pacat.c:915, c-format
+#: ../src/utils/pacat.c:915
+#, c-format
 msgid "dup2(): %s"
 msgstr "dup2() : %s"
 
@@ -1500,20 +1396,15 @@ msgstr "Trop de paramètres."
 
 #: ../src/utils/pacat.c:933
 msgid "Failed to generate sample specification for file."
-msgstr ""
-"Échec lors de la génération des informations de l'échantillon du fichier."
+msgstr "Échec lors de la génération des informations de l'échantillon du fichier."
 
 #: ../src/utils/pacat.c:953
 msgid "Failed to open audio file."
 msgstr "Échec lors de l'ouverture du fichier audio."
 
 #: ../src/utils/pacat.c:959
-msgid ""
-"Warning: specified sample specification will be overwritten with "
-"specification from file."
-msgstr ""
-"Avertissement : les spécifications de l'échantillon spécifié seront écrasées "
-"par celles du fichier."
+msgid "Warning: specified sample specification will be overwritten with specification from file."
+msgstr "Avertissement : les spécifications de l'échantillon spécifié seront écrasées par celles du fichier."
 
 #: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
 msgid "Failed to determine sample specification from file."
@@ -1521,9 +1412,7 @@ msgstr "Échec lors de l'obtention des informations de l'échantillon du fichier
 
 #: ../src/utils/pacat.c:971
 msgid "Warning: Failed to determine channel map from file."
-msgstr ""
-"Avertissement : échec lors de l'obtention des informations du plan des canaux "
-"du fichier."
+msgstr "Avertissement : échec lors de l'obtention des informations du plan des canaux du fichier."
 
 #: ../src/utils/pacat.c:982
 msgid "Channel map doesn't match sample specification"
@@ -1531,14 +1420,12 @@ msgstr "Le plan des canaux ne correspond pas à la spécification d'échantillon
 
 #: ../src/utils/pacat.c:993
 msgid "Warning: failed to write channel map to file."
-msgstr ""
-"Avertissement : Échec lors de l'écriture du plan des canaux dans le fichier."
+msgstr "Avertissement : Échec lors de l'écriture du plan des canaux dans le fichier."
 
-#: ../src/utils/pacat.c:1008, c-format
+#: ../src/utils/pacat.c:1008
+#, c-format
 msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr ""
-"Ouverture d'un flux %s avec une spécification d'échantillon « %s » et un plan "
-"des canaux « %s »."
+msgstr "Ouverture d'un flux %s avec une spécification d'échantillon « %s » et un plan des canaux « %s »."
 
 #: ../src/utils/pacat.c:1009
 msgid "recording"
@@ -1620,16 +1507,14 @@ 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"
 "\n"
 "  -h, --help                            Affiche cette aide\n"
 "      --version                         Affiche la version\n"
-"  -s, --server=SERVEUR                  Le nom du serveur auquel se "
-"connecter\n"
+"  -s, --server=SERVEUR                  Le nom du serveur auquel se connecter\n"
 "\n"
 
 #: ../src/utils/pasuspender.c:248
@@ -1658,7 +1543,8 @@ msgstr "Échec de pa_context_new().\n"
 msgid "pa_mainloop_run() failed.\n"
 msgstr "Échec de pa_mainloop_run().\n"
 
-#: ../src/utils/pactl.c:135, c-format
+#: ../src/utils/pactl.c:135
+#, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Échec lors de l'obtention des statistiques : %s"
 
@@ -1670,16 +1556,15 @@ msgstr "En cours d'utilisation : %u blocs contenant au total %s octets.\n"
 #: ../src/utils/pactl.c:144
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
-msgstr ""
-"Alloué pendant l'ensemble de la durée d'exécution : %u blocs contenant au "
-"total %s octets.\n"
+msgstr "Alloué pendant l'ensemble de la durée d'exécution : %u blocs contenant au total %s octets.\n"
 
 #: ../src/utils/pactl.c:147
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Taille du cache de l'échantillon : %s\n"
 
-#: ../src/utils/pactl.c:156, c-format
+#: ../src/utils/pactl.c:156
+#, c-format
 msgid "Failed to get server information: %s"
 msgstr "Échec lors de l'obtention des informations du serveur : %s"
 
@@ -1706,7 +1591,8 @@ msgstr ""
 "Source par défaut : %s\n"
 "Cookie : %08x\n"
 
-#: ../src/utils/pactl.c:205, c-format
+#: ../src/utils/pactl.c:205
+#, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Échec lors de l'obtention des informations sur la destination : %s"
 
@@ -1750,15 +1636,18 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360, c-format
+#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#, c-format
 msgid "\tPorts:\n"
 msgstr "\tPorts :\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366, c-format
+#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tPort actif : %s\n"
 
-#: ../src/utils/pactl.c:297, c-format
+#: ../src/utils/pactl.c:297
+#, c-format
 msgid "Failed to get source information: %s"
 msgstr "Échec lors de l'obtention des informations sur la source : %s"
 
@@ -1809,7 +1698,8 @@ msgstr ""
 msgid "n/a"
 msgstr "n/d"
 
-#: ../src/utils/pactl.c:375, c-format
+#: ../src/utils/pactl.c:375
+#, c-format
 msgid "Failed to get module information: %s"
 msgstr "Échec lors de l'obtention des informations du module : %s"
 
@@ -1830,7 +1720,8 @@ msgstr ""
 "\tPropriétés : \n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412, c-format
+#: ../src/utils/pactl.c:412
+#, c-format
 msgid "Failed to get client information: %s"
 msgstr "Échec lors de l'obtention des informations du client : %s"
 
@@ -1849,7 +1740,8 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447, c-format
+#: ../src/utils/pactl.c:447
+#, c-format
 msgid "Failed to get card information: %s"
 msgstr "Impossible d'obtenir des informations sur la carte : %s"
 
@@ -1880,10 +1772,10 @@ msgstr "\tProfils :\n"
 msgid "\tActive Profile: %s\n"
 msgstr "\tProfil actif : %s\n"
 
-#: ../src/utils/pactl.c:496, c-format
+#: ../src/utils/pactl.c:496
+#, c-format
 msgid "Failed to get sink input information: %s"
-msgstr ""
-"Échec lors de l'obtention des informations de l'entrée de la destination : %s"
+msgstr "Échec lors de l'obtention des informations de l'entrée de la destination : %s"
 
 #: ../src/utils/pactl.c:515
 #, c-format
@@ -1922,10 +1814,10 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554, c-format
+#: ../src/utils/pactl.c:554
+#, c-format
 msgid "Failed to get source output information: %s"
-msgstr ""
-"Échec lors de l'obtention des informations de la sortie de la source : %s"
+msgstr "Échec lors de l'obtention des informations de la sortie de la source : %s"
 
 #: ../src/utils/pactl.c:574
 #, c-format
@@ -1956,7 +1848,8 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605, c-format
+#: ../src/utils/pactl.c:605
+#, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Échec lors de l'obtention des informations de l'échantillon : %s"
 
@@ -1994,11 +1887,13 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663, c-format
+#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#, c-format
 msgid "Failure: %s"
 msgstr "Échec : %s"
 
-#: ../src/utils/pactl.c:687, c-format
+#: ../src/utils/pactl.c:687
+#, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Échec lors de l'envoi de l'échantillon : %s"
 
@@ -2010,7 +1905,8 @@ msgstr "Fin prématurée du fichier"
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT reçu, fermeture."
 
-#: ../src/utils/pactl.c:869, c-format
+#: ../src/utils/pactl.c:869
+#, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2037,10 +1933,8 @@ 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"
@@ -2067,10 +1961,8 @@ msgstr ""
 "  -h, --help                            Affiche cette aide\n"
 "      --version                         Affiche la version\n"
 "\n"
-"  -s, --server=SERVEUR                  Le nom du serveur auquel se "
-"connecter\n"
-"  -n, --client-name=NOM                 Définit le nom de ce client sur le "
-"serveur\n"
+"  -s, --server=SERVEUR                  Le nom du serveur auquel se connecter\n"
+"  -n, --client-name=NOM                 Définit le nom de ce client sur le serveur\n"
 
 #: ../src/utils/pactl.c:933
 #, c-format
@@ -2093,9 +1985,7 @@ msgstr "Échec lors de l'ouverture du fichier audio."
 
 #: ../src/utils/pactl.c:1004
 msgid "Warning: Failed to determine sample specification from file."
-msgstr ""
-"Avertissement : Échec lors de l'obtention des spécifications de l'échantillon "
-"du fichier."
+msgstr "Avertissement : Échec lors de l'obtention des spécifications de l'échantillon du fichier."
 
 #: ../src/utils/pactl.c:1014
 msgid "You have to specify a sample name to play"
@@ -2122,19 +2012,12 @@ msgid "You have to specify a module index"
 msgstr "Vous devez indiquer un index de module"
 
 #: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
-msgstr ""
-"Vous ne pouvez pas indiquer plus d'une destination. Vous devez indiquer une "
-"valeur booléenne."
+msgid "You may not specify more than one sink. You have to specify a boolean value."
+msgstr "Vous ne pouvez pas indiquer plus d'une destination. Vous devez indiquer une valeur booléenne."
 
 #: ../src/utils/pactl.c:1103
-msgid ""
-"You may not specify more than one source. You have to specify a boolean "
-"value."
-msgstr ""
-"Vous ne pouvez pas indiquer plus d'une source. Vous devez indiquer une "
-"valeur booléenne."
+msgid "You may not specify more than one source. You have to specify a boolean value."
+msgstr "Vous ne pouvez pas indiquer plus d'une source. Vous devez indiquer une valeur booléenne."
 
 #: ../src/utils/pactl.c:1115
 msgid "You have to specify a card name/index and a profile name"
@@ -2197,18 +2080,14 @@ 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 visuel] [-S serveur] [-O destination] [-I source] [-c fichier]  [-d|-"
-"e|-i|-r]\n"
+"%s [-D visuel] [-S serveur] [-O destination] [-I source] [-c fichier]  [-d|-e|-i|-r]\n"
 "\n"
-" -d    Affiche les données PulseAudio actuelles attachées au visuel X11 (par "
-"défaut)\n"
+" -d    Affiche les données PulseAudio actuelles attachées au visuel X11 (par défaut)\n"
 " -e    Exporte les données PulseAudio locales vers le visuel X11\n"
-" -i    Importe les données PulseAudio depuis le visuel X11 vers les "
-"variables de l'environnement local et le fichier de cookie.\n"
+" -i    Importe les données PulseAudio depuis le visuel X11 vers les variables de l'environnement local et le fichier de cookie.\n"
 " -r    Enlève les données PulseAudio du visuel X11\n"
 
 #: ../src/utils/pax11publish.c:94
@@ -2254,8 +2133,7 @@ msgstr "Échec lors du chargement du fichier de configuration du client.\n"
 #: ../src/utils/pax11publish.c:157
 #, c-format
 msgid "Failed to read environment configuration data.\n"
-msgstr ""
-"Échec lors de la lecture des données de configuration de l'environnement.\n"
+msgstr "Échec lors de la lecture des données de configuration de l'environnement.\n"
 
 # Fully Qualified Domain Name
 #: ../src/utils/pax11publish.c:174
@@ -2275,9 +2153,7 @@ msgstr "Pas encore implémenté.\n"
 
 #: ../src/utils/pacmd.c:69
 msgid "No PulseAudio daemon running, or not running as session daemon."
-msgstr ""
-"Aucun démon PulseAudio en cours d'exécution, ou ne s'exécutant pas "
-"dans une session de type démon."
+msgstr "Aucun démon PulseAudio en cours d'exécution, ou ne s'exécutant pas dans une session de type démon."
 
 #: ../src/utils/pacmd.c:74
 #, c-format
@@ -2297,7 +2173,8 @@ msgstr "Impossible de tuer le démon PulseAudio."
 msgid "Daemon not responding."
 msgstr "Le démon ne répond pas."
 
-#: ../src/utils/pacmd.c:161, c-format
+#: ../src/utils/pacmd.c:161
+#, c-format
 msgid "poll(): %s"
 msgstr "poll() : %s"
 
@@ -2318,36 +2195,24 @@ msgstr "Impossible d'accèder au verrou autonome."
 #: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
 #, c-format
 msgid ""
-"ALSA woke us up to write new data to the device, but there was actually "
-"nothing to write!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers.\n"
-"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
-"returned 0 or another value < min_avail."
+"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
 msgstr ""
-"ALSA nous a réveillé pour lire de nouvelles données à partir du "
-"périphérique, mais il n'y avait en fait rien à écrire !\n"
-"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez "
-"rapporter ce problème aux développeurs d'ALSA.Nous avons été réveillés avec "
-"le jeu POLLOUT -- cependant un snd_pcm_avail() ultérieur a retourné 0 ou une "
-"autre valeur < min_avail."
+"ALSA nous a réveillé pour écrire de nouvelles données à partir du périphérique, mais il n'y avait en fait rien à écrire !\n"
+"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez rapporter ce problème aux développeurs d'ALSA.\n"
+"Nous avons été réveillés avec POLLOUT actif, cependant un snd_pcm_avail() ultérieur a retourné 0 ou une autre valeur < min_avail."
 
 #: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
 #, c-format
 msgid ""
-"ALSA woke us up to read new data from the device, but there was actually "
-"nothing to read!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers.\n"
-"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
-"returned 0 or another value < min_avail."
+"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
 msgstr ""
-"ALSA nous a réveillé pour lire de nouvelles données à partir du "
-"périphérique, mais il n'y avait en fait rien à lire !\n"
-"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez "
-"rapporter ce problème aux développeurs d'ALSA.Nous avons été réveillés avec "
-"le jeu POLLIN -- cependant un snd_pcm_avail() ultérieur a retourné 0 ou une "
-"autre valeur < min_avail."
+"ALSA nous a réveillé pour lire de nouvelles données à partir du périphérique, mais il n'y avait en fait rien à lire !\n"
+"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez rapporter ce problème aux développeurs d'ALSA.\n"
+"Nous avons été réveillés avec POLLIN actif, cependant un snd_pcm_avail() ultérieur a retourné 0 ou une autre valeur < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2228
@@ -2575,11 +2440,9 @@ msgstr "Duplex stéréo analogique"
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Duplex stéréo numérique (IEC958)"
 
-#, fuzzy
 #~ msgid "Invalid client name '%s'\n"
 #~ msgstr "Plan des canaux invalide « %s »\n"
 
-#, fuzzy
 #~ msgid "Failed to determine sample specification from file.\n"
 #~ msgstr "Échec lors de l'obtention des informations de l'échantillon : %s\n"
 
@@ -2622,48 +2485,32 @@ msgstr "Duplex stéréo numérique (IEC958)"
 #~ msgid "PolicyKit responded with '%s'"
 #~ msgstr "PolicyKit a renvoyé « %s »"
 
-#~ msgid ""
-#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio "
-#~ "daemon"
-#~ msgstr ""
-#~ "Ordonnancement haute priorité (niveau Unix « nice » négatif) pour le démon "
-#~ "PulseAudio"
+#~ msgid "High-priority scheduling (negative Unix nice level) for the PulseAudio daemon"
+#~ msgstr "Ordonnancement haute priorité (niveau Unix « nice » négatif) pour le démon PulseAudio"
 
 #~ msgid "Real-time scheduling for the PulseAudio daemon"
 #~ msgstr "Ordonnancement en temps réel pour le démon PulseAudio"
 
-#~ msgid ""
-#~ "System policy prevents PulseAudio from acquiring high-priority scheduling."
-#~ msgstr ""
-#~ "La politique du système empêche PulseAudio d'acquérir un ordonnancement "
-#~ "haute priorité"
+#~ msgid "System policy prevents PulseAudio from acquiring high-priority scheduling."
+#~ msgstr "La politique du système empêche PulseAudio d'acquérir un ordonnancement haute priorité"
 
-#~ msgid ""
-#~ "System policy prevents PulseAudio from acquiring real-time scheduling."
-#~ msgstr ""
-#~ "La politique du système empêche PulseAudio d'acquérir un ordonnancement "
-#~ "en temps réel"
+#~ msgid "System policy prevents PulseAudio from acquiring real-time scheduling."
+#~ msgstr "La politique du système empêche PulseAudio d'acquérir un ordonnancement en temps réel"
 
 #~ msgid "read() failed: %s\n"
 #~ msgstr "Échec de read() : %s\n"
 
-#, fuzzy
 #~ msgid "pa_context_connect() failed: %s\n"
 #~ msgstr "Échec de pa_context_connect() : %s"
 
 #~ msgid "We're in the group '%s', allowing high-priority scheduling."
-#~ msgstr ""
-#~ "Nous sommes dans le groupe « %s », permettant une planification à haute "
-#~ "priorité."
+#~ msgstr "Nous sommes dans le groupe « %s », permettant une planification à haute priorité."
 
 #~ msgid "We're in the group '%s', allowing real-time scheduling."
-#~ msgstr ""
-#~ "Nous sommes dans le groupe « %s », permettant un ordonnancement en temps "
-#~ "réel."
+#~ msgstr "Nous sommes dans le groupe « %s », permettant un ordonnancement en temps réel."
 
 #~ msgid "PolicyKit grants us acquire-high-priority privilege."
-#~ msgstr ""
-#~ "PolicyKit a accordé l'acquisition des permissions de haute priorité."
+#~ msgstr "PolicyKit a accordé l'acquisition des permissions de haute priorité."
 
 #~ msgid "PolicyKit refuses acquire-high-priority privilege."
 #~ msgstr "PolicyKit a refusé l'acquisition des permissions de haute priorité."
@@ -2675,33 +2522,16 @@ msgstr "Duplex stéréo numérique (IEC958)"
 #~ msgstr "PolicyKit a refusé l'acquisition des permissions de temps réel."
 
 #~ 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 '%s', 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 '%s', or increase "
-#~ "the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user."
+#~ "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 '%s', 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 '%s', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user."
 #~ msgstr ""
-#~ "Le SUID root et l'ordonnancement en temps réel et/ou haute priorité ont "
-#~ "été spécifiés dans la configuration. Cependant, il nous manque les "
-#~ "privilèges nécessaires :\n"
-#~ "Nous ne sommes pas dans le groupe « %s », PolicyKit refuse de nous "
-#~ "accorder les privilèges demandés et nous devons augmenter les limites de "
-#~ "ressources RLIMIT_NICE/RLIMIT_RTPRIO.\n"
-#~ "Pour activer l'ordonnancement en temps réel/haute priorité, veuillez "
-#~ "acquérir les privilèges PolicyKit apropriés, ou devenir membre de « %s », "
-#~ "ou augmenter les limites de ressources RLIMIT_NICE/RLIMIT_RTPRIO pour cet "
-#~ "utilisateur."
+#~ "Le SUID root et l'ordonnancement en temps réel et/ou haute priorité ont été spécifiés dans la configuration. Cependant, il nous manque les privilèges nécessaires :\n"
+#~ "Nous ne sommes pas dans le groupe « %s », PolicyKit refuse de nous accorder les privilèges demandés et nous devons augmenter les limites de ressources RLIMIT_NICE/RLIMIT_RTPRIO.\n"
+#~ "Pour activer l'ordonnancement en temps réel/haute priorité, veuillez acquérir les privilèges PolicyKit apropriés, ou devenir membre de « %s », ou augmenter les limites de ressources RLIMIT_NICE/RLIMIT_RTPRIO pour cet utilisateur."
 
-#~ 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."
+#~ 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."
 
 #~ msgid "Successfully increased RLIMIT_RTPRIO"
 #~ msgstr "Augmentation de RLIMIT_RTPRIO réussie"
@@ -2712,11 +2542,8 @@ msgstr "Duplex stéréo numérique (IEC958)"
 #~ msgid "Giving up CAP_NICE"
 #~ msgstr "Abandon de CAP_NICE"
 
-#~ 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."
+#~ 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."
 
 #~ msgid "Limited capabilities successfully to CAP_SYS_NICE."
 #~ msgstr "Limitation des capacités à CAP_SYS_NICE réussie."
@@ -2744,16 +2571,11 @@ msgstr "Duplex stéréo numérique (IEC958)"
 #~ "\n"
 #~ "  -v, --verbose                         Enable verbose operation\n"
 #~ "\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"
+#~ "  -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"
 #~ "      --channel-map=CHANNELMAP          Set the channel map to the use\n"
 #~ msgstr ""
 #~ "%s [options] [FICHIER]\n"
@@ -2763,18 +2585,12 @@ msgstr "Duplex stéréo numérique (IEC958)"
 #~ "\n"
 #~ "  -v, --verbose                         Active le mode verbeux\n"
 #~ "\n"
-#~ "  -s, --server=SERVEUR                  Le nom du serveur auquel se "
-#~ "connecter\n"
-#~ "  -d, --device=PÉRIPHÉRIQUE             Le nom de la destination à "
-#~ "laquelle se connecter\n"
-#~ "  -n, --client-name=NOM                 Définit le nom de ce client sur "
-#~ "le serveur\n"
-#~ "      --stream-name=NOM                 Définit le nom de ce flux sur le "
-#~ "serveur\n"
-#~ "      --volume=VOLUME                   Définit le volume initial "
-#~ "(linéaire) entre 0 et 65536\n"
-#~ "      --channel-map=PLANDESCANAUX       Définit le plan des canaux à "
-#~ "utiliser\n"
+#~ "  -s, --server=SERVEUR                  Le nom du serveur auquel se connecter\n"
+#~ "  -d, --device=PÉRIPHÉRIQUE             Le nom de la destination à laquelle se connecter\n"
+#~ "  -n, --client-name=NOM                 Définit le nom de ce client sur le serveur\n"
+#~ "      --stream-name=NOM                 Définit le nom de ce flux sur le serveur\n"
+#~ "      --volume=VOLUME                   Définit le volume initial (linéaire) entre 0 et 65536\n"
+#~ "      --channel-map=PLANDESCANAUX       Définit le plan des canaux à utiliser\n"
 
 #~ msgid ""
 #~ "paplay %s\n"
@@ -2797,26 +2613,18 @@ msgstr "Duplex stéréo numérique (IEC958)"
 #~ msgid "Using sample spec '%s'\n"
 #~ msgstr "Utilisation de la spécification de l'échantillon « %s »\n"
 
-#, 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 ""
-#~ "Le SUID root a été appelé et la planification à haute priorité/en temps "
-#~ "réel demandée dans la configuration. Néanmoins nous n'avons pas les "
-#~ "permissions nécessaires :\n"
+#~ "Le SUID root a été appelé et la planification à haute priorité/en temps réel demandée dans la configuration. Néanmoins nous n'avons pas les permissions nécessaires :\n"
 #~ "nous ne somme pas dans le groupe "
 
-#, fuzzy
 #~ msgid "--log-time boolean argument"
 #~ msgstr "--disallow-exit requiert un paramètre booléen"
 
 #~ msgid "Default sink name (%s) does not exist in name register."
-#~ msgstr ""
-#~ "Le nom de la destination par défaut (%s) n'existe pas dans le registre "
-#~ "des noms."
+#~ msgstr "Le nom de la destination par défaut (%s) n'existe pas dans le registre des noms."
 
 #~ msgid "Buffer overrun, dropping incoming data\n"
 #~ msgstr "Saturation du tampon, abandon des données entrantes\n"
@@ -2848,20 +2656,13 @@ msgstr "Duplex stéréo numérique (IEC958)"
 
 #~ 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 '"
+#~ "For enabling real-time scheduling please acquire the appropriate PolicyKit priviliges, or become a member of '"
 #~ msgstr ""
-#~ " et PolicyKit refuse de nous accorder les permissions. Abandon du SUID à "
-#~ "nouveau.\n"
-#~ "Pour activer la planification en temps réel, veuillez aquérir les "
-#~ "permissions PolicyKit appropriées, ou devenez membre de "
+#~ " et PolicyKit refuse de nous accorder les permissions. Abandon du SUID à nouveau.\n"
+#~ "Pour activer la planification en temps réel, veuillez aquérir les permissions PolicyKit appropriées, ou devenez membre de "
 
-#~ msgid ""
-#~ "', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this "
-#~ "user."
-#~ msgstr ""
-#~ ", ou augmentez les limites de ressource RLIMIT_NICE/RLIMIT_RTPRIO pour "
-#~ "cet utilisateur."
+#~ msgid "', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user."
+#~ msgstr ", ou augmentez les limites de ressource RLIMIT_NICE/RLIMIT_RTPRIO pour cet utilisateur."
 
 #~ msgid "socketpair(): %s"
 #~ msgstr "socketpair() : %s"

commit 4e2e32b84825d4b2bfa3b4dbcb63e3453e3b7180
Author: Pascal Terjan <pterjan at gmail.com>
Date:   Sun Jan 17 09:46:16 2010 +0000

    l10n: Updates to French (fr) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/fr.po b/po/fr.po
index 771bd96..5c2cd78 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -60,7 +60,7 @@ msgstr "Garde toujours au moins une destination même si elle est vide"
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
-msgstr "Sortie obsolète"
+msgstr "Sortie factice"
 
 #: ../src/modules/module-ladspa-sink.c:49
 msgid "Virtual LADSPA sink"

commit f8d1e2668d125377c9adca643f43e357f739bfda
Author: Leonid Kurbatov <llenchikk at rambler.ru>
Date:   Sun Jan 24 12:46:55 2010 +0000

    l10n: Updates to Russian (ru) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/ru.po b/po/ru.po
index ef1918e..cf25744 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -1,25 +1,25 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+# Russian translation of pulseaudio.
+# Copyright (C) 2010 pulseaudio
+# This file is distributed under the same license as the pulseaudio package.
+# Leonid Kurbatov <llenchikk at rambler.ru>, 2010.
+#
 #
-#, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
+"Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-10 20:05+0000\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
-"Language-Team: LANGUAGE <LL at li.org>\n"
+"POT-Creation-Date: 2010-01-24 06:51+0000\n"
+"PO-Revision-Date: 2010-01-24 15:46+0300\n"
+"Last-Translator: Leonid Kurbatov <llenchikk at rambler.ru>\n"
+"Language-Team: Russian <->\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=CHARSET\n"
-"Content-Transfer-Encoding: 8bit\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: -\n"
 
 #: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
 #, c-format
 msgid "%s %s"
-msgstr ""
+msgstr "%s %s"
 
 #: ../src/modules/alsa/alsa-util.c:1106
 #, c-format

commit e62685708c28cbcb717f239ed4153b8f5040ae25
Author: Leonid Kurbatov <llenchikk at rambler.ru>
Date:   Sun Jan 24 12:52:13 2010 +0000

    l10n: Updates to Russian (ru) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/ru.po b/po/ru.po
index cf25744..195a4e8 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -2,8 +2,8 @@
 # Copyright (C) 2010 pulseaudio
 # This file is distributed under the same license as the pulseaudio package.
 # Leonid Kurbatov <llenchikk at rambler.ru>, 2010.
-#
-#
+# 
+# 
 msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
@@ -24,28 +24,24 @@ msgstr "%s %s"
 #: ../src/modules/alsa/alsa-util.c:1106
 #, c-format
 msgid ""
-"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
-"ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
+"snd_pcm_avail() возвращает значение, которое является исключительно большим: %lu байт (%lu мс).\n"
+"Вероятно, это ошибка в драйвере ALSA '%s'. Пожалуйста, сообщите об этой проблеме разработчикам ALSA."
 
 #: ../src/modules/alsa/alsa-util.c:1147
 #, c-format
 msgid ""
-"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
-"lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
 
 #: ../src/modules/alsa/alsa-util.c:1194
 #, c-format
 msgid ""
-"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
-"(%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
 
 #: ../src/modules/module-always-sink.c:39
@@ -61,12 +57,7 @@ msgid "Virtual LADSPA sink"
 msgstr ""
 
 #: ../src/modules/module-ladspa-sink.c:53
-msgid ""
-"sink_name=<name for the sink> sink_properties=<properties for the sink> "
-"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
-"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
-"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
-"input control values>"
+msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
 msgstr ""
 
 #: ../src/modules/module-null-sink.c:55
@@ -183,9 +174,7 @@ msgid "Failed to kill daemon: %s"
 msgstr ""
 
 #: ../src/daemon/main.c:571
-msgid ""
-"This program is not intended to be run as root (unless --system is "
-"specified)."
+msgid "This program is not intended to be run as root (unless --system is specified)."
 msgstr ""
 
 #: ../src/daemon/main.c:573
@@ -338,12 +327,9 @@ msgstr ""
 
 #: ../src/daemon/main.c:792
 msgid ""
-"OK, so you are running PA in system mode. Please note that you most likely "
-"shouldn't be doing that.\n"
-"If you do it nonetheless then it's your own fault if things don't work as "
-"expected.\n"
-"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
-"explanation why system mode is usually a bad idea."
+"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."
 msgstr ""
 
 #: ../src/daemon/main.c:809
@@ -355,9 +341,7 @@ msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr ""
 
 #: ../src/daemon/main.c:821
-msgid ""
-"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
-"resolution timers enabled!"
+msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
 msgstr ""
 
 #: ../src/daemon/main.c:844
@@ -395,48 +379,37 @@ 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"
@@ -447,12 +420,10 @@ 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"
@@ -467,9 +438,7 @@ msgid "--fail expects boolean argument"
 msgstr ""
 
 #: ../src/daemon/cmdline.c:264
-msgid ""
-"--log-level expects log level argument (either numeric in range 0..4 or one "
-"of 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 ""
 
 #: ../src/daemon/cmdline.c:276
@@ -632,9 +601,7 @@ msgid "Failed to open configuration file: %s"
 msgstr ""
 
 #: ../src/daemon/daemon-conf.c:562
-msgid ""
-"The specified default channel map has a different number of channels than "
-"the specified default number of channels."
+msgid "The specified default channel map has a different number of channels than the specified default number of channels."
 msgstr ""
 
 #: ../src/daemon/daemon-conf.c:638
@@ -1225,48 +1192,29 @@ 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, "
-"s24le, s24be,\n"
-"                                        s24-32le, s24-32be (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, s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, 2 for stereo\n"
 "                                        (defaults to 2)\n"
-"      --channel-map=CHANNELMAP          Channel map to use instead of the "
-"default\n"
-"      --fix-format                      Take the sample format from the sink "
-"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"
-"      --property=PROPERTY=VALUE         Set the specified property to the "
-"specified value.\n"
+"      --no-remap                        Map channels by index instead of name.\n"
+"      --latency=BYTES                   Request the specified latency in bytes.\n"
+"      --process-time=BYTES              Request the specified process time per request in bytes.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
 "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
@@ -1342,9 +1290,7 @@ msgid "Failed to open audio file."
 msgstr ""
 
 #: ../src/utils/pacat.c:959
-msgid ""
-"Warning: specified sample specification will be overwritten with "
-"specification from file."
+msgid "Warning: specified sample specification will be overwritten with specification from file."
 msgstr ""
 
 #: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
@@ -1365,8 +1311,7 @@ msgstr ""
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid ""
-"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
 
 #: ../src/utils/pacat.c:1009
@@ -1449,8 +1394,7 @@ 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 ""
 
@@ -1762,10 +1706,8 @@ 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 ""
 
 #: ../src/utils/pactl.c:933
@@ -1813,14 +1755,11 @@ msgid "You have to specify a module index"
 msgstr ""
 
 #: ../src/utils/pactl.c:1090
-msgid ""
-"You may not specify more than one sink. You have to specify a boolean value."
+msgid "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 
 #: ../src/utils/pactl.c:1103
-msgid ""
-"You may not specify more than one source. You have to specify a boolean "
-"value."
+msgid "You may not specify more than one source. You have to specify a boolean value."
 msgstr ""
 
 #: ../src/utils/pactl.c:1115
@@ -1884,8 +1823,7 @@ 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 ""
 
@@ -1993,23 +1931,17 @@ msgstr ""
 #: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
 #, c-format
 msgid ""
-"ALSA woke us up to write new data to the device, but there was actually "
-"nothing to write!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers.\n"
-"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
-"returned 0 or another value < min_avail."
+"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
 msgstr ""
 
 #: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
 #, c-format
 msgid ""
-"ALSA woke us up to read new data from the device, but there was actually "
-"nothing to read!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers.\n"
-"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
-"returned 0 or another value < min_avail."
+"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
 msgstr ""
 
 #: ../src/modules/alsa/module-alsa-card.c:152

commit 85194fca012048f17f52c91da9d2931218afc8b0
Author: Leonid Kurbatov <llenchikk at rambler.ru>
Date:   Sun Jan 24 12:55:22 2010 +0000

    l10n: Updates to Russian (ru) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/ru.po b/po/ru.po
index 195a4e8..0353300 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -36,6 +36,8 @@ msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
+"snd_pcm_delay() возвращает значение, которое является исключительно большим: %li байт (%s%lu мс).\n"
+"Вероятно, это ошибка в драйвере ALSA '%s'. Пожалуйста, сообщите об этой проблеме разработчикам ALSA."
 
 #: ../src/modules/alsa/alsa-util.c:1194
 #, c-format
@@ -43,6 +45,8 @@ msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
+"snd_pcm_mmap_begin() возвращает значение, которое является исключительно большим: %lu байт (%lu мс).\n"
+"Вероятно, это ошибка в драйвере ALSA '%s'. Пожалуйста, сообщите об этой проблеме разработчикам ALSA."
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"

commit 43167fa0c4e4739639b4300cdebe201c5decdf55
Author: Leonid Kurbatov <llenchikk at rambler.ru>
Date:   Sun Jan 24 12:56:40 2010 +0000

    l10n: Updates to Russian (ru) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/ru.po b/po/ru.po
index 0353300..915dfc4 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -50,19 +50,19 @@ msgstr ""
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr ""
+msgstr "Всегда держать хотя бы один аудиоприёмник загруженным, даже если он неопределён."
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
-msgstr ""
+msgstr "Фиктивный выход"
 
 #: ../src/modules/module-ladspa-sink.c:49
 msgid "Virtual LADSPA sink"
-msgstr ""
+msgstr "Виртуальный LADSPA аудиоприёмник"
 
 #: ../src/modules/module-ladspa-sink.c:53
 msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
-msgstr ""
+msgstr "sink_name=<имя аудиоприёмника> sink_properties=<свойства аудиоприёмника> master=<имя аудиоприёмника для фильтрации> format=<формат> rate=<частота> channels=<число каналов> channel_map=<схема каналов> plugin=<имя плагина ladspa> label=<метка плагина ladspa> control=<список входных значений, разделённый запятыми>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"

commit d2ec7e8797c039e01e2816ece6a763d2818c91e7
Author: Leonid Kurbatov <llenchikk at rambler.ru>
Date:   Sun Jan 24 12:58:29 2010 +0000

    l10n: Updates to Russian (ru) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/ru.po b/po/ru.po
index 915dfc4..4d4fd64 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -66,55 +66,55 @@ msgstr "sink_name=<имя аудиоприёмника> sink_properties=<сво
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
-msgstr ""
+msgstr "Синхронизированный NULL аудиоприёмник"
 
 #: ../src/modules/module-null-sink.c:291
 msgid "Null Output"
-msgstr ""
+msgstr "Пустой выход"
 
 #: ../src/pulsecore/sink.c:2613
 msgid "Internal Audio"
-msgstr ""
+msgstr "Встроенное аудио"
 
 #: ../src/pulsecore/sink.c:2618
 msgid "Modem"
-msgstr ""
+msgstr "Модем"
 
 #: ../src/daemon/ltdl-bind-now.c:124
 msgid "Failed to find original lt_dlopen loader."
-msgstr ""
+msgstr "Не удалось найти оригинальный lt_dlopen загрузчик."
 
 #: ../src/daemon/ltdl-bind-now.c:129
 msgid "Failed to allocate new dl loader."
-msgstr ""
+msgstr "Не удалось выделить новый dl загрузчик."
 
 #: ../src/daemon/ltdl-bind-now.c:142
 msgid "Failed to add bind-now-loader."
-msgstr ""
+msgstr "Не удалось добавить bind-now-загрузчик."
 
 #: ../src/daemon/main.c:141
 #, c-format
 msgid "Got signal %s."
-msgstr ""
+msgstr "Получен сигнал %s."
 
 #: ../src/daemon/main.c:168
 msgid "Exiting."
-msgstr ""
+msgstr "Выход."
 
 #: ../src/daemon/main.c:186
 #, c-format
 msgid "Failed to find user '%s'."
-msgstr ""
+msgstr "Не удалось найти пользователя '%s'."
 
 #: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find group '%s'."
-msgstr ""
+msgstr "Не удалось найти группу '%s'."
 
 #: ../src/daemon/main.c:195
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
-msgstr ""
+msgstr "Найден пользователь '%s' (UID %lu) и группа '%s' (GID %lu)."
 
 #: ../src/daemon/main.c:200
 #, c-format

commit dc1872a5fbb4a81c51596aebe6d5f6c9252192c9
Author: Leonid Kurbatov <llenchikk at rambler.ru>
Date:   Sun Jan 24 14:37:32 2010 +0000

    l10n: Updates to Russian (ru) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/ru.po b/po/ru.po
index 4d4fd64..b743f49 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -119,91 +119,91 @@ msgstr "Найден пользователь '%s' (UID %lu) и группа '%s
 #: ../src/daemon/main.c:200
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
-msgstr ""
+msgstr "Идентификаторы групп пользователя '%s' и группы '%s' не совпадают."
 
 #: ../src/daemon/main.c:205
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
-msgstr ""
+msgstr "Домашняя папка пользователя '%s' не является '%s', игнорирование."
 
 #: ../src/daemon/main.c:208 ../src/daemon/main.c:213
 #, c-format
 msgid "Failed to create '%s': %s"
-msgstr ""
+msgstr "Не удалось создать '%s': %s"
 
 #: ../src/daemon/main.c:220
 #, c-format
 msgid "Failed to change group list: %s"
-msgstr ""
+msgstr "Ошибка при изменении списка групп: %s"
 
 #: ../src/daemon/main.c:236
 #, c-format
 msgid "Failed to change GID: %s"
-msgstr ""
+msgstr "Не удалось изменить идентификатор группы GID: %s"
 
 #: ../src/daemon/main.c:252
 #, c-format
 msgid "Failed to change UID: %s"
-msgstr ""
+msgstr "Не удалось изменить идентификатор пользователя UID: %s"
 
 #: ../src/daemon/main.c:271
 msgid "Successfully dropped root privileges."
-msgstr ""
+msgstr "Успешное удаление привилегий администратора."
 
 #: ../src/daemon/main.c:279
 msgid "System wide mode unsupported on this platform."
-msgstr ""
+msgstr "Расширенный режим не поддерживается на этой платформе."
 
 #: ../src/daemon/main.c:297
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
-msgstr ""
+msgstr "setrlimit(%s, (%u, %u)) не удалось: %s"
 
 #: ../src/daemon/main.c:474
 msgid "Failed to parse command line."
-msgstr ""
+msgstr "Ошибка разбора командной строки."
 
 #: ../src/daemon/main.c:541
 msgid "Daemon not running"
-msgstr ""
+msgstr "Демон не запущен"
 
 #: ../src/daemon/main.c:543
 #, c-format
 msgid "Daemon running as PID %u"
-msgstr ""
+msgstr "Демон запущен как PID %u"
 
 #: ../src/daemon/main.c:553
 #, c-format
 msgid "Failed to kill daemon: %s"
-msgstr ""
+msgstr "Не удалось убить демон: %s"
 
 #: ../src/daemon/main.c:571
 msgid "This program is not intended to be run as root (unless --system is specified)."
-msgstr ""
+msgstr "Эта программа не предназначена для запуска с правами администратора (если не указано в системе)."
 
 #: ../src/daemon/main.c:573
 msgid "Root privileges required."
-msgstr ""
+msgstr "Необходимы права администратора."
 
 #: ../src/daemon/main.c:578
 msgid "--start not supported for system instances."
-msgstr ""
+msgstr "--start не поддерживается для элементов системы."
 
 #: ../src/daemon/main.c:583
 msgid "Running in system mode, but --disallow-exit not set!"
-msgstr ""
+msgstr "Запущен в системном режиме, но --disallow-exit не задан!"
 
 #: ../src/daemon/main.c:586
 msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr ""
+msgstr "Запущен в системном режиме, но --disallow-module-loading не задан!"
 
 #: ../src/daemon/main.c:589
 msgid "Running in system mode, forcibly disabling SHM mode!"
-msgstr ""
+msgstr "Запущен в системном режиме с принудительным отключением режима SHM!"
 
 #: ../src/daemon/main.c:594
 msgid "Running in system mode, forcibly disabling exit idle time!"
-msgstr ""
+msgstr "Запущен в системном режиме с принудительным отключением времени выхода после простоя!"
 
 #: ../src/daemon/main.c:621
 msgid "Failed to acquire stdio."

commit dd8f33ddcc0442bbb606e180dc11d3cc57bfc4d5
Author: Leonid Kurbatov <llenchikk at rambler.ru>
Date:   Sun Jan 24 15:35:08 2010 +0000

    l10n: Updates to Russian (ru) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/ru.po b/po/ru.po
index b743f49..8b91498 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -207,127 +207,127 @@ msgstr "Запущен в системном режиме с принудите
 
 #: ../src/daemon/main.c:621
 msgid "Failed to acquire stdio."
-msgstr ""
+msgstr "Не удалось запросить stdio."
 
 #: ../src/daemon/main.c:627
 #, c-format
 msgid "pipe failed: %s"
-msgstr ""
+msgstr "Канал не удался: %s"
 
 #: ../src/daemon/main.c:632
 #, c-format
 msgid "fork() failed: %s"
-msgstr ""
+msgstr "fork() ветвь не удалась: %s"
 
 #: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
 #, c-format
 msgid "read() failed: %s"
-msgstr ""
+msgstr "read() чтение не удалось: %s"
 
 #: ../src/daemon/main.c:652
 msgid "Daemon startup failed."
-msgstr ""
+msgstr "Запуск демона не удался."
 
 #: ../src/daemon/main.c:654
 msgid "Daemon startup successful."
-msgstr ""
+msgstr "Успешный запуск демона."
 
 #: ../src/daemon/main.c:731
 #, c-format
 msgid "This is PulseAudio %s"
-msgstr ""
+msgstr "PulseAudio %s"
 
 #: ../src/daemon/main.c:732
 #, c-format
 msgid "Compilation host: %s"
-msgstr ""
+msgstr "Хост компиляции: %s"
 
 #: ../src/daemon/main.c:733
 #, c-format
 msgid "Compilation CFLAGS: %s"
-msgstr ""
+msgstr "Компиляция CFLAGS: %s"
 
 #: ../src/daemon/main.c:736
 #, c-format
 msgid "Running on host: %s"
-msgstr ""
+msgstr "Запущен на хосте: %s"
 
 #: ../src/daemon/main.c:739
 #, c-format
 msgid "Found %u CPUs."
-msgstr ""
+msgstr "Найдено процессоров: %u."
 
 #: ../src/daemon/main.c:741
 #, c-format
 msgid "Page size is %lu bytes"
-msgstr ""
+msgstr "Размер страницы: %lu байт"
 
 #: ../src/daemon/main.c:744
 msgid "Compiled with Valgrind support: yes"
-msgstr ""
+msgstr "Скомпилировано с поддержкой Valgrind: да"
 
 #: ../src/daemon/main.c:746
 msgid "Compiled with Valgrind support: no"
-msgstr ""
+msgstr "Скомпилировано с поддержкой Valgrind: нет"
 
 #: ../src/daemon/main.c:749
 #, c-format
 msgid "Running in valgrind mode: %s"
-msgstr ""
+msgstr "Запуск в режиме Valgrind: %s"
 
 #: ../src/daemon/main.c:752
 msgid "Optimized build: yes"
-msgstr ""
+msgstr "Оптимизированная сборка: да"
 
 #: ../src/daemon/main.c:754
 msgid "Optimized build: no"
-msgstr ""
+msgstr "Оптимизированная сборка: нет"
 
 #: ../src/daemon/main.c:758
 msgid "NDEBUG defined, all asserts disabled."
-msgstr ""
+msgstr "NDEBUG задан, все ассерты запрещены."
 
 #: ../src/daemon/main.c:760
 msgid "FASTPATH defined, only fast path asserts disabled."
-msgstr ""
+msgstr "FASTPATH задан, запрещены только fast path ассерты."
 
 #: ../src/daemon/main.c:762
 msgid "All asserts enabled."
-msgstr ""
+msgstr "Все ассерты разрешены."
 
 #: ../src/daemon/main.c:766
 msgid "Failed to get machine ID"
-msgstr ""
+msgstr "Не удалось получить ID машины"
 
 #: ../src/daemon/main.c:769
 #, c-format
 msgid "Machine ID is %s."
-msgstr ""
+msgstr "ID машины %s."
 
 #: ../src/daemon/main.c:773
 #, c-format
 msgid "Session ID is %s."
-msgstr ""
+msgstr "ID сессии %s."
 
 #: ../src/daemon/main.c:779
 #, c-format
 msgid "Using runtime directory %s."
-msgstr ""
+msgstr "Использование каталога изолированного окружения %s."
 
 #: ../src/daemon/main.c:784
 #, c-format
 msgid "Using state directory %s."
-msgstr ""
+msgstr "Использование заданного каталога %s."
 
 #: ../src/daemon/main.c:787
 #, c-format
 msgid "Using modules directory %s."
-msgstr ""
+msgstr "Использование каталога модулей %s."
 
 #: ../src/daemon/main.c:789
 #, c-format
 msgid "Running in system mode: %s"
-msgstr ""
+msgstr "Запуск в системном режиме: %s"
 
 #: ../src/daemon/main.c:792
 msgid ""
@@ -335,42 +335,46 @@ msgid ""
 "If you do it nonetheless then it's your own fault if things don't work as expected.\n"
 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."
 msgstr ""
+"Итак, вы запускаете PA в системном режиме. Помните, что вам, скорее всего, не следует делать этого.\n"
+"Если вы это всё равно делаете, то ваша вина, что вещи не работают как ожидалось.\n"
+"Пожалуйста прочитайте http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode для объяснения, почему системный режим обычно является плохой идеей."
 
 #: ../src/daemon/main.c:809
 msgid "pa_pid_file_create() failed."
-msgstr ""
+msgstr "pa_pid_file_create() не удалось."
 
 #: ../src/daemon/main.c:819
 msgid "Fresh high-resolution timers available! Bon appetit!"
-msgstr ""
+msgstr "Доступен свежий таймер высокого разрешения! Приятного аппетита!"
 
 #: ../src/daemon/main.c:821
 msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
-msgstr ""
+msgstr "Братан, твоё ядро воняет! Сегодняшняя рекомендация шефа - ядро с включенным таймером высокого разрешения!"
 
 #: ../src/daemon/main.c:844
 msgid "pa_core_new() failed."
-msgstr ""
+msgstr "pa_core_new() не удалась."
 
 #: ../src/daemon/main.c:904
+#, fuzzy
 msgid "Failed to initialize daemon."
-msgstr ""
+msgstr "Ошибка инициализации демона."
 
 #: ../src/daemon/main.c:909
 msgid "Daemon startup without any loaded modules, refusing to work."
-msgstr ""
+msgstr "Запуск демона без каких-либо загружемых модули, отказ от работы."
 
 #: ../src/daemon/main.c:926
 msgid "Daemon startup complete."
-msgstr ""
+msgstr "Запуск демона завершён."
 
 #: ../src/daemon/main.c:932
 msgid "Daemon shutdown initiated."
-msgstr ""
+msgstr "Завершение демона инициализировано."
 
 #: ../src/daemon/main.c:954
 msgid "Daemon terminated."
-msgstr ""
+msgstr "Демон завершён."
 
 #: ../src/daemon/cmdline.c:115
 #, c-format
@@ -435,11 +439,11 @@ msgstr ""
 
 #: ../src/daemon/cmdline.c:247
 msgid "--daemonize expects boolean argument"
-msgstr ""
+msgstr "--daemonize ожидает логический аргумент"
 
 #: ../src/daemon/cmdline.c:254
 msgid "--fail expects boolean argument"
-msgstr ""
+msgstr "--fail ожидает логический аргумент"
 
 #: ../src/daemon/cmdline.c:264
 msgid "--log-level expects log level argument (either numeric in range 0..4 or one of debug, info, notice, warn, error)."

commit 4abfa17f0c983ec10f489b19fa513d355526ee61
Author: Leonid Kurbatov <llenchikk at rambler.ru>
Date:   Sun Jan 24 16:13:23 2010 +0000

    l10n: Updates to Russian (ru) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/ru.po b/po/ru.po
index 8b91498..95b994a 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -356,7 +356,6 @@ msgid "pa_core_new() failed."
 msgstr "pa_core_new() не удалась."
 
 #: ../src/daemon/main.c:904
-#, fuzzy
 msgid "Failed to initialize daemon."
 msgstr "Ошибка инициализации демона."
 
@@ -447,161 +446,161 @@ msgstr "--fail ожидает логический аргумент"
 
 #: ../src/daemon/cmdline.c:264
 msgid "--log-level expects log level argument (either numeric in range 0..4 or one of debug, info, notice, warn, error)."
-msgstr ""
+msgstr "--log-level ожидает аргумент протоколирования (или числовой в диапазоне 0..4 или одному из debug, info, notice, warn, error)."
 
 #: ../src/daemon/cmdline.c:276
 msgid "--high-priority expects boolean argument"
-msgstr ""
+msgstr "--high-priority ожидает логический аргумент"
 
 #: ../src/daemon/cmdline.c:283
 msgid "--realtime expects boolean argument"
-msgstr ""
+msgstr "--realtime ожидает логический аргумент"
 
 #: ../src/daemon/cmdline.c:290
 msgid "--disallow-module-loading expects boolean argument"
-msgstr ""
+msgstr "--disallow-module-loading ожидает логический аргумент"
 
 #: ../src/daemon/cmdline.c:297
 msgid "--disallow-exit expects boolean argument"
-msgstr ""
+msgstr "--disallow-exit ожидает логический аргумент"
 
 #: ../src/daemon/cmdline.c:304
 msgid "--use-pid-file expects boolean argument"
-msgstr ""
+msgstr "--use-pid-file ожидает логический аргумент"
 
 #: ../src/daemon/cmdline.c:321
 msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
-msgstr ""
+msgstr "Неверный журнал: используйте либо 'syslog', 'stderr' или 'auto'."
 
 #: ../src/daemon/cmdline.c:328
 msgid "--log-time expects boolean argument"
-msgstr ""
+msgstr "--log-time ожидает логический аргумент"
 
 #: ../src/daemon/cmdline.c:335
 msgid "--log-meta expects boolean argument"
-msgstr ""
+msgstr "--log-meta ожидает логический аргумент"
 
 #: ../src/daemon/cmdline.c:354
 #, c-format
 msgid "Invalid resample method '%s'."
-msgstr ""
+msgstr "Неверный метод перевыборки '%s'."
 
 #: ../src/daemon/cmdline.c:361
 msgid "--system expects boolean argument"
-msgstr ""
+msgstr "--system ожидает логический аргумент"
 
 #: ../src/daemon/cmdline.c:368
 msgid "--no-cpu-limit expects boolean argument"
-msgstr ""
+msgstr "--no-cpu-limit ожидает логический аргумент"
 
 #: ../src/daemon/cmdline.c:375
 msgid "--disable-shm expects boolean argument"
-msgstr ""
+msgstr "--disable-shm ожидает логический аргумент"
 
 #: ../src/daemon/dumpmodules.c:60
 #, c-format
 msgid "Name: %s\n"
-msgstr ""
+msgstr "Имя: %s\n"
 
 #: ../src/daemon/dumpmodules.c:63
 #, c-format
 msgid "No module information available\n"
-msgstr ""
+msgstr "Нет информации о модулях\n"
 
 #: ../src/daemon/dumpmodules.c:66
 #, c-format
 msgid "Version: %s\n"
-msgstr ""
+msgstr "Версия: %s\n"
 
 #: ../src/daemon/dumpmodules.c:68
 #, c-format
 msgid "Description: %s\n"
-msgstr ""
+msgstr "Описание: %s\n"
 
 #: ../src/daemon/dumpmodules.c:70
 #, c-format
 msgid "Author: %s\n"
-msgstr ""
+msgstr "Автор: %s\n"
 
 #: ../src/daemon/dumpmodules.c:72
 #, c-format
 msgid "Usage: %s\n"
-msgstr ""
+msgstr "Использование: %s\n"
 
 #: ../src/daemon/dumpmodules.c:73
 #, c-format
 msgid "Load Once: %s\n"
-msgstr ""
+msgstr "Загружен раз: %s\n"
 
 #: ../src/daemon/dumpmodules.c:75
 #, c-format
 msgid "DEPRECATION WARNING: %s\n"
-msgstr ""
+msgstr "DEPRECATION WARNING: %s\n"
 
 #: ../src/daemon/dumpmodules.c:79
 #, c-format
 msgid "Path: %s\n"
-msgstr ""
+msgstr "Путь: %s\n"
 
 #: ../src/daemon/daemon-conf.c:232
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
-msgstr ""
+msgstr "[%s:%u] Неверный журнал '%s'."
 
 #: ../src/daemon/daemon-conf.c:248
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
-msgstr ""
+msgstr "[%s:%u] Неверный аргумент протоколирования '%s'."
 
 #: ../src/daemon/daemon-conf.c:264
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
-msgstr ""
+msgstr "[%s:%u] Неверный метод перевыборки '%s'."
 
 #: ../src/daemon/daemon-conf.c:287
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
-msgstr ""
+msgstr "[%s:%u] Неверный rlimit '%s'."
 
 #: ../src/daemon/daemon-conf.c:294
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
-msgstr ""
+msgstr "[%s:%u] rlimit не поддерживается на этой платформе."
 
 #: ../src/daemon/daemon-conf.c:310
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
-msgstr ""
+msgstr "[%s:%u] Неверный формат сэмпла '%s'."
 
 #: ../src/daemon/daemon-conf.c:328
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
-msgstr ""
+msgstr "[%s:%u] Неверная частота дискретизации '%s'."
 
 #: ../src/daemon/daemon-conf.c:352
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
-msgstr ""
+msgstr "[%s:%u] Неверные сэмпл-каналы '%s'."
 
 #: ../src/daemon/daemon-conf.c:370
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
-msgstr ""
+msgstr "[%s:%u] Неверная схема каналов '%s'."
 
 #: ../src/daemon/daemon-conf.c:388
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
-msgstr ""
+msgstr "[%s:%u] Неверное число фрагментов '%s'."
 
 #: ../src/daemon/daemon-conf.c:406
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
-msgstr ""
+msgstr "[%s:%u] Неверный размер фрагмента '%s'."
 
 #: ../src/daemon/daemon-conf.c:424
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
-msgstr ""
+msgstr "[%s:%u] Неверный точный уровень '%s'."
 
 #: ../src/daemon/daemon-conf.c:546
 #, c-format

commit fd5b87e289f88702e3fcbceecec1d97b2a1c6250
Author: Leonid Kurbatov <llenchikk at rambler.ru>
Date:   Sun Jan 24 20:33:56 2010 +0000

    l10n: Updates to Russian (ru) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/ru.po b/po/ru.po
index 95b994a..4c408f0 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -2,14 +2,14 @@
 # Copyright (C) 2010 pulseaudio
 # This file is distributed under the same license as the pulseaudio package.
 # Leonid Kurbatov <llenchikk at rambler.ru>, 2010.
-# 
-# 
+#
+#
 msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-01-24 06:51+0000\n"
-"PO-Revision-Date: 2010-01-24 15:46+0300\n"
+"PO-Revision-Date: 2010-01-24 23:33+0300\n"
 "Last-Translator: Leonid Kurbatov <llenchikk at rambler.ru>\n"
 "Language-Team: Russian <->\n"
 "MIME-Version: 1.0\n"
@@ -24,33 +24,47 @@ msgstr "%s %s"
 #: ../src/modules/alsa/alsa-util.c:1106
 #, c-format
 msgid ""
-"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
+"ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
-"snd_pcm_avail() возвращает значение, которое является исключительно большим: %lu байт (%lu мс).\n"
-"Вероятно, это ошибка в драйвере ALSA '%s'. Пожалуйста, сообщите об этой проблеме разработчикам ALSA."
+"snd_pcm_avail() возвращает значение, которое является исключительно большим: "
+"%lu байт (%lu мс).\n"
+"Вероятно, это ошибка в драйвере ALSA '%s'. Пожалуйста, сообщите об этой "
+"проблеме разработчикам ALSA."
 
 #: ../src/modules/alsa/alsa-util.c:1147
 #, c-format
 msgid ""
-"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
+"lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
-"snd_pcm_delay() возвращает значение, которое является исключительно большим: %li байт (%s%lu мс).\n"
-"Вероятно, это ошибка в драйвере ALSA '%s'. Пожалуйста, сообщите об этой проблеме разработчикам ALSA."
+"snd_pcm_delay() возвращает значение, которое является исключительно большим: "
+"%li байт (%s%lu мс).\n"
+"Вероятно, это ошибка в драйвере ALSA '%s'. Пожалуйста, сообщите об этой "
+"проблеме разработчикам ALSA."
 
 #: ../src/modules/alsa/alsa-util.c:1194
 #, c-format
 msgid ""
-"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
-"snd_pcm_mmap_begin() возвращает значение, которое является исключительно большим: %lu байт (%lu мс).\n"
-"Вероятно, это ошибка в драйвере ALSA '%s'. Пожалуйста, сообщите об этой проблеме разработчикам ALSA."
+"snd_pcm_mmap_begin() возвращает значение, которое является исключительно "
+"большим: %lu байт (%lu мс).\n"
+"Вероятно, это ошибка в драйвере ALSA '%s'. Пожалуйста, сообщите об этой "
+"проблеме разработчикам ALSA."
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr "Всегда держать хотя бы один аудиоприёмник загруженным, даже если он неопределён."
+msgstr ""
+"Всегда оставлять хотя бы один аудиовыход загруженным, даже если он "
+"неопределён."
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
@@ -58,15 +72,25 @@ msgstr "Фиктивный выход"
 
 #: ../src/modules/module-ladspa-sink.c:49
 msgid "Virtual LADSPA sink"
-msgstr "Виртуальный LADSPA аудиоприёмник"
+msgstr "Виртуальный LADSPA аудиовыход"
 
 #: ../src/modules/module-ladspa-sink.c:53
-msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
-msgstr "sink_name=<имя аудиоприёмника> sink_properties=<свойства аудиоприёмника> master=<имя аудиоприёмника для фильтрации> format=<формат> rate=<частота> channels=<число каналов> channel_map=<схема каналов> plugin=<имя плагина ladspa> label=<метка плагина ladspa> control=<список входных значений, разделённый запятыми>"
+msgid ""
+"sink_name=<name for the sink> sink_properties=<properties for the sink> "
+"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
+"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
+"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
+"input control values>"
+msgstr ""
+"sink_name=<имя аудиовыхода> sink_properties=<свойства аудиовыхода> "
+"master=<имя аудиовыхода для фильтрации> format=<формат> rate=<частота> "
+"channels=<число каналов> channel_map=<схема каналов> plugin=<имя плагина "
+"ladspa> label=<метка плагина ladspa> control=<список входных значений, "
+"разделённый запятыми>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
-msgstr "Синхронизированный NULL аудиоприёмник"
+msgstr "Синхронизированный NULL аудиовыход"
 
 #: ../src/modules/module-null-sink.c:291
 msgid "Null Output"
@@ -178,8 +202,12 @@ msgid "Failed to kill daemon: %s"
 msgstr "Не удалось убить демон: %s"
 
 #: ../src/daemon/main.c:571
-msgid "This program is not intended to be run as root (unless --system is specified)."
-msgstr "Эта программа не предназначена для запуска с правами администратора (если не указано в системе)."
+msgid ""
+"This program is not intended to be run as root (unless --system is "
+"specified)."
+msgstr ""
+"Эта программа не предназначена для запуска с правами администратора (если не "
+"указано в системе)."
 
 #: ../src/daemon/main.c:573
 msgid "Root privileges required."
@@ -203,7 +231,9 @@ msgstr "Запущен в системном режиме с принудите
 
 #: ../src/daemon/main.c:594
 msgid "Running in system mode, forcibly disabling exit idle time!"
-msgstr "Запущен в системном режиме с принудительным отключением времени выхода после простоя!"
+msgstr ""
+"Запущен в системном режиме с принудительным отключением времени выхода после "
+"простоя!"
 
 #: ../src/daemon/main.c:621
 msgid "Failed to acquire stdio."
@@ -331,13 +361,19 @@ msgstr "Запуск в системном режиме: %s"
 
 #: ../src/daemon/main.c:792
 msgid ""
-"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
-"If you do it nonetheless then it's your own fault if things don't work as expected.\n"
-"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."
-msgstr ""
-"Итак, вы запускаете PA в системном режиме. Помните, что вам, скорее всего, не следует делать этого.\n"
-"Если вы это всё равно делаете, то ваша вина, что вещи не работают как ожидалось.\n"
-"Пожалуйста прочитайте http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode для объяснения, почему системный режим обычно является плохой идеей."
+"OK, so you are running PA in system mode. Please note that you most likely "
+"shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as "
+"expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
+"explanation why system mode is usually a bad idea."
+msgstr ""
+"Итак, вы запускаете PA в системном режиме. Помните, что вам, скорее всего, "
+"не следует делать этого.\n"
+"Если вы это всё равно делаете, то ваша вина, что вещи не работают как "
+"ожидалось.\n"
+"Пожалуйста прочитайте http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode "
+"для объяснения, почему системный режим обычно является плохой идеей."
 
 #: ../src/daemon/main.c:809
 msgid "pa_pid_file_create() failed."
@@ -348,8 +384,12 @@ msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Доступен свежий таймер высокого разрешения! Приятного аппетита!"
 
 #: ../src/daemon/main.c:821
-msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
-msgstr "Братан, твоё ядро воняет! Сегодняшняя рекомендация шефа - ядро с включенным таймером высокого разрешения!"
+msgid ""
+"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
+"resolution timers enabled!"
+msgstr ""
+"Братан, твоё ядро воняет! Сегодняшняя рекомендация шефа - ядро с включенным "
+"таймером высокого разрешения!"
 
 #: ../src/daemon/main.c:844
 msgid "pa_core_new() failed."
@@ -361,7 +401,7 @@ msgstr "Ошибка инициализации демона."
 
 #: ../src/daemon/main.c:909
 msgid "Daemon startup without any loaded modules, refusing to work."
-msgstr "Запуск демона без каких-либо загружемых модули, отказ от работы."
+msgstr "Запуск демона без каких-либо загружаемых модулей, отказ от работы."
 
 #: ../src/daemon/main.c:926
 msgid "Daemon startup complete."
@@ -386,37 +426,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"
@@ -427,14 +478,85 @@ 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"
 msgstr ""
+"%s [options]\n"
+"\n"
+"COMMANDS:\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"      --dump-conf                       Dump default configuration\n"
+"      --dump-modules                    Dump list of available modules\n"
+"      --dump-resample-methods           Dump available resample methods\n"
+"      --cleanup-shm                     Cleanup stale shared memory "
+"segments\n"
+"      --start                           Start the daemon if it is not "
+"running\n"
+"  -k  --kill                            Kill a running daemon\n"
+"      --check                           Check for a running daemon (only "
+"returns exit code)\n"
+"\n"
+"OPTIONS:\n"
+"      --system[=BOOL]                   Run as system-wide instance\n"
+"  -D, --daemonize[=BOOL]                Daemonize after startup\n"
+"      --fail[=BOOL]                     Quit when startup fails\n"
+"      --high-priority[=BOOL]            Try to set high nice level\n"
+"                                        (only available as root, when SUID "
+"or\n"
+"                                        with elevated RLIMIT_NICE)\n"
+"      --realtime[=BOOL]                 Try to enable realtime scheduling\n"
+"                                        (only available as root, when SUID "
+"or\n"
+"                                        with elevated RLIMIT_RTPRIO)\n"
+"      --disallow-module-loading[=BOOL]  Disallow module user requested "
+"module\n"
+"                                        loading/unloading after startup\n"
+"      --disallow-exit[=BOOL]            Disallow user requested exit\n"
+"      --exit-idle-time=SECS             Terminate the daemon when idle and "
+"this\n"
+"                                        time passed\n"
+"      --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"
+"                                        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-time[=BOOL]                 Include timestamps in log messages\n"
+"      --log-backtrace=FRAMES            Include a backtrace in log messages\n"
+"  -p, --dl-search-path=PATH             Set the search path for dynamic "
+"shared\n"
+"                                        objects (plugins)\n"
+"      --resample-method=METHOD          Use the specified resampling method\n"
+"                                        (See --dump-resample-methods for\n"
+"                                        possible values)\n"
+"      --use-pid-file[=BOOL]             Create a PID file\n"
+"      --no-cpu-limit[=BOOL]             Do not install CPU load limiter on\n"
+"                                        platforms that support it.\n"
+"      --disable-shm[=BOOL]              Disable shared memory support.\n"
+"\n"
+"STARTUP SCRIPT:\n"
+"  -L, --load=\"MODULE ARGUMENTS\"         Load the specified plugin module "
+"with\n"
+"                                        the specified argument\n"
+"  -F, --file=FILENAME                   Run the specified script\n"
+"  -C                                    Open a command line on the running "
+"TTY\n"
+"                                        after startup\n"
+"\n"
+"  -n                                    Don't load default script file\n"
 
 #: ../src/daemon/cmdline.c:247
 msgid "--daemonize expects boolean argument"
@@ -445,8 +567,12 @@ msgid "--fail expects boolean argument"
 msgstr "--fail ожидает логический аргумент"
 
 #: ../src/daemon/cmdline.c:264
-msgid "--log-level expects log level argument (either numeric in range 0..4 or one of debug, info, notice, warn, error)."
-msgstr "--log-level ожидает аргумент протоколирования (или числовой в диапазоне 0..4 или одному из debug, info, notice, warn, error)."
+msgid ""
+"--log-level expects log level argument (either numeric in range 0..4 or one "
+"of debug, info, notice, warn, error)."
+msgstr ""
+"--log-level ожидает аргумент протоколирования (или числовой в диапазоне 0..4 "
+"или одному из debug, info, notice, warn, error)."
 
 #: ../src/daemon/cmdline.c:276
 msgid "--high-priority expects boolean argument"
@@ -470,7 +596,7 @@ msgstr "--use-pid-file ожидает логический аргумент"
 
 #: ../src/daemon/cmdline.c:321
 msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
-msgstr "Неверный журнал: используйте либо 'syslog', 'stderr' или 'auto'."
+msgstr "Недопустимый журнал: используйте либо 'syslog', 'stderr' или 'auto'."
 
 #: ../src/daemon/cmdline.c:328
 msgid "--log-time expects boolean argument"
@@ -483,7 +609,7 @@ msgstr "--log-meta ожидает логический аргумент"
 #: ../src/daemon/cmdline.c:354
 #, c-format
 msgid "Invalid resample method '%s'."
-msgstr "Неверный метод перевыборки '%s'."
+msgstr "Недопустимый метод ресэмплирования '%s'."
 
 #: ../src/daemon/cmdline.c:361
 msgid "--system expects boolean argument"
@@ -545,22 +671,22 @@ msgstr "Путь: %s\n"
 #: ../src/daemon/daemon-conf.c:232
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
-msgstr "[%s:%u] Неверный журнал '%s'."
+msgstr "[%s:%u] Недопустимый журнал '%s'."
 
 #: ../src/daemon/daemon-conf.c:248
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
-msgstr "[%s:%u] Неверный аргумент протоколирования '%s'."
+msgstr "[%s:%u] Недопустимый аргумент протоколирования '%s'."
 
 #: ../src/daemon/daemon-conf.c:264
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
-msgstr "[%s:%u] Неверный метод перевыборки '%s'."
+msgstr "[%s:%u] Недопустимый метод ресэмплирования '%s'."
 
 #: ../src/daemon/daemon-conf.c:287
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
-msgstr "[%s:%u] Неверный rlimit '%s'."
+msgstr "[%s:%u] Недопустимый rlimit '%s'."
 
 #: ../src/daemon/daemon-conf.c:294
 #, c-format
@@ -570,7 +696,7 @@ msgstr "[%s:%u] rlimit не поддерживается на этой плат
 #: ../src/daemon/daemon-conf.c:310
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
-msgstr "[%s:%u] Неверный формат сэмпла '%s'."
+msgstr "[%s:%u] Недопустимый формат сэмпла '%s'."
 
 #: ../src/daemon/daemon-conf.c:328
 #, c-format
@@ -595,596 +721,600 @@ msgstr "[%s:%u] Неверное число фрагментов '%s'."
 #: ../src/daemon/daemon-conf.c:406
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
-msgstr "[%s:%u] Неверный размер фрагмента '%s'."
+msgstr "[%s:%u] Недопустимый размер фрагмента '%s'."
 
 #: ../src/daemon/daemon-conf.c:424
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
-msgstr "[%s:%u] Неверный точный уровень '%s'."
+msgstr "[%s:%u] Недопустимый точный уровень '%s'."
 
 #: ../src/daemon/daemon-conf.c:546
 #, c-format
 msgid "Failed to open configuration file: %s"
-msgstr ""
+msgstr "Не удалось открыть файл конфигурации: %s"
 
 #: ../src/daemon/daemon-conf.c:562
-msgid "The specified default channel map has a different number of channels than the specified default number of channels."
+msgid ""
+"The specified default channel map has a different number of channels than "
+"the specified default number of channels."
 msgstr ""
+"В указанной схеме каналов число каналов отличается от числа каналов по-"
+"умолчанию."
 
 #: ../src/daemon/daemon-conf.c:638
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
-msgstr ""
+msgstr "### Прочитать из файла конфигурации: %s ###\n"
 
 #: ../src/daemon/caps.c:62
 msgid "Cleaning up privileges."
-msgstr ""
+msgstr "Очистка привилегий."
 
 #: ../src/daemon/pulseaudio.desktop.in.h:1
 msgid "PulseAudio Sound System"
-msgstr ""
+msgstr "Звуковая система PulseAudio"
 
 #: ../src/daemon/pulseaudio.desktop.in.h:2
 msgid "Start the PulseAudio Sound System"
-msgstr ""
+msgstr "Запуск звуковой системы PulseAudio"
 
 #: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757
 msgid "Mono"
-msgstr ""
+msgstr "Моно"
 
 #: ../src/pulse/channelmap.c:107
 msgid "Front Center"
-msgstr ""
+msgstr "Фронт центр"
 
 #: ../src/pulse/channelmap.c:108
 msgid "Front Left"
-msgstr ""
+msgstr "Фронт лево"
 
 #: ../src/pulse/channelmap.c:109
 msgid "Front Right"
-msgstr ""
+msgstr "Фронт право"
 
 #: ../src/pulse/channelmap.c:111
 msgid "Rear Center"
-msgstr ""
+msgstr "Сзади центр"
 
 #: ../src/pulse/channelmap.c:112
 msgid "Rear Left"
-msgstr ""
+msgstr "Сзади лево"
 
 #: ../src/pulse/channelmap.c:113
 msgid "Rear Right"
-msgstr ""
+msgstr "Сзади право"
 
 #: ../src/pulse/channelmap.c:115
 msgid "Low Frequency Emmiter"
-msgstr ""
+msgstr "Сабвуфер"
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
-msgstr ""
+msgstr "Фронт левее центра"
 
 #: ../src/pulse/channelmap.c:118
 msgid "Front Right-of-center"
-msgstr ""
+msgstr "Фронт правее центра"
 
 #: ../src/pulse/channelmap.c:120
 msgid "Side Left"
-msgstr ""
+msgstr "Левая сторона"
 
 #: ../src/pulse/channelmap.c:121
 msgid "Side Right"
-msgstr ""
+msgstr "Правая сторона"
 
 #: ../src/pulse/channelmap.c:123
 msgid "Auxiliary 0"
-msgstr ""
+msgstr "Дополнительный 0"
 
 #: ../src/pulse/channelmap.c:124
 msgid "Auxiliary 1"
-msgstr ""
+msgstr "Дополнительный 1"
 
 #: ../src/pulse/channelmap.c:125
 msgid "Auxiliary 2"
-msgstr ""
+msgstr "Дополнительный 2"
 
 #: ../src/pulse/channelmap.c:126
 msgid "Auxiliary 3"
-msgstr ""
+msgstr "Дополнительный 3"
 
 #: ../src/pulse/channelmap.c:127
 msgid "Auxiliary 4"
-msgstr ""
+msgstr "Дополнительный 4"
 
 #: ../src/pulse/channelmap.c:128
 msgid "Auxiliary 5"
-msgstr ""
+msgstr "Дополнительный 5"
 
 #: ../src/pulse/channelmap.c:129
 msgid "Auxiliary 6"
-msgstr ""
+msgstr "Дополнительный 6"
 
 #: ../src/pulse/channelmap.c:130
 msgid "Auxiliary 7"
-msgstr ""
+msgstr "Дополнительный 7"
 
 #: ../src/pulse/channelmap.c:131
 msgid "Auxiliary 8"
-msgstr ""
+msgstr "Дополнительный 8"
 
 #: ../src/pulse/channelmap.c:132
 msgid "Auxiliary 9"
-msgstr ""
+msgstr "Дополнительный 9"
 
 #: ../src/pulse/channelmap.c:133
 msgid "Auxiliary 10"
-msgstr ""
+msgstr "Дополнительный 10"
 
 #: ../src/pulse/channelmap.c:134
 msgid "Auxiliary 11"
-msgstr ""
+msgstr "Дополнительный 11"
 
 #: ../src/pulse/channelmap.c:135
 msgid "Auxiliary 12"
-msgstr ""
+msgstr "Дополнительный 12"
 
 #: ../src/pulse/channelmap.c:136
 msgid "Auxiliary 13"
-msgstr ""
+msgstr "Дополнительный 13"
 
 #: ../src/pulse/channelmap.c:137
 msgid "Auxiliary 14"
-msgstr ""
+msgstr "Дополнительный 14"
 
 #: ../src/pulse/channelmap.c:138
 msgid "Auxiliary 15"
-msgstr ""
+msgstr "Дополнительный 15"
 
 #: ../src/pulse/channelmap.c:139
 msgid "Auxiliary 16"
-msgstr ""
+msgstr "Дополнительный 16"
 
 #: ../src/pulse/channelmap.c:140
 msgid "Auxiliary 17"
-msgstr ""
+msgstr "Дополнительный 17"
 
 #: ../src/pulse/channelmap.c:141
 msgid "Auxiliary 18"
-msgstr ""
+msgstr "Дополнительный 18"
 
 #: ../src/pulse/channelmap.c:142
 msgid "Auxiliary 19"
-msgstr ""
+msgstr "Дополнительный 19"
 
 #: ../src/pulse/channelmap.c:143
 msgid "Auxiliary 20"
-msgstr ""
+msgstr "Дополнительный 20"
 
 #: ../src/pulse/channelmap.c:144
 msgid "Auxiliary 21"
-msgstr ""
+msgstr "Дополнительный 21"
 
 #: ../src/pulse/channelmap.c:145
 msgid "Auxiliary 22"
-msgstr ""
+msgstr "Дополнительный 22"
 
 #: ../src/pulse/channelmap.c:146
 msgid "Auxiliary 23"
-msgstr ""
+msgstr "Дополнительный 23"
 
 #: ../src/pulse/channelmap.c:147
 msgid "Auxiliary 24"
-msgstr ""
+msgstr "Дополнительный 24"
 
 #: ../src/pulse/channelmap.c:148
 msgid "Auxiliary 25"
-msgstr ""
+msgstr "Дополнительный 25"
 
 #: ../src/pulse/channelmap.c:149
 msgid "Auxiliary 26"
-msgstr ""
+msgstr "Дополнительный 26"
 
 #: ../src/pulse/channelmap.c:150
 msgid "Auxiliary 27"
-msgstr ""
+msgstr "Дополнительный 27"
 
 #: ../src/pulse/channelmap.c:151
 msgid "Auxiliary 28"
-msgstr ""
+msgstr "Дополнительный 28"
 
 #: ../src/pulse/channelmap.c:152
 msgid "Auxiliary 29"
-msgstr ""
+msgstr "Дополнительный 29"
 
 #: ../src/pulse/channelmap.c:153
 msgid "Auxiliary 30"
-msgstr ""
+msgstr "Дополнительный 30"
 
 #: ../src/pulse/channelmap.c:154
 msgid "Auxiliary 31"
-msgstr ""
+msgstr "Дополнительный 31"
 
 #: ../src/pulse/channelmap.c:156
 msgid "Top Center"
-msgstr ""
+msgstr "Верх центр"
 
 #: ../src/pulse/channelmap.c:158
 msgid "Top Front Center"
-msgstr ""
+msgstr "Верх фронт центр"
 
 #: ../src/pulse/channelmap.c:159
 msgid "Top Front Left"
-msgstr ""
+msgstr "Верх фронт лево"
 
 #: ../src/pulse/channelmap.c:160
 msgid "Top Front Right"
-msgstr ""
+msgstr "Верх фронт право"
 
 #: ../src/pulse/channelmap.c:162
 msgid "Top Rear Center"
-msgstr ""
+msgstr "Верх сзади центр"
 
 #: ../src/pulse/channelmap.c:163
 msgid "Top Rear Left"
-msgstr ""
+msgstr "Верх сзади лево"
 
 #: ../src/pulse/channelmap.c:164
 msgid "Top Rear Right"
-msgstr ""
+msgstr "Верх сзади право"
 
 #: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170
 #: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321
 #: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371
 msgid "(invalid)"
-msgstr ""
+msgstr "(недействительно)"
 
 #: ../src/pulse/channelmap.c:761
 msgid "Stereo"
-msgstr ""
+msgstr "Стерео"
 
 #: ../src/pulse/channelmap.c:766
 msgid "Surround 4.0"
-msgstr ""
+msgstr "Объёмный 4.0"
 
 #: ../src/pulse/channelmap.c:772
 msgid "Surround 4.1"
-msgstr ""
+msgstr "Объёмный 4.1"
 
 #: ../src/pulse/channelmap.c:778
 msgid "Surround 5.0"
-msgstr ""
+msgstr "Объёмный 5.0"
 
 #: ../src/pulse/channelmap.c:784
 msgid "Surround 5.1"
-msgstr ""
+msgstr "Объёмный 5.1"
 
 #: ../src/pulse/channelmap.c:791
 msgid "Surround 7.1"
-msgstr ""
+msgstr "Объёмный 7.1"
 
 #: ../src/pulse/error.c:43
 msgid "OK"
-msgstr ""
+msgstr "OK"
 
 #: ../src/pulse/error.c:44
 msgid "Access denied"
-msgstr ""
+msgstr "Нет доступа"
 
 #: ../src/pulse/error.c:45
 msgid "Unknown command"
-msgstr ""
+msgstr "Неизвестная команда"
 
 #: ../src/pulse/error.c:46
 msgid "Invalid argument"
-msgstr ""
+msgstr "Недействительный аргумент"
 
 #: ../src/pulse/error.c:47
 msgid "Entity exists"
-msgstr ""
+msgstr "Объект существует"
 
 #: ../src/pulse/error.c:48
 msgid "No such entity"
-msgstr ""
+msgstr "Нет такого объекта"
 
 #: ../src/pulse/error.c:49
 msgid "Connection refused"
-msgstr ""
+msgstr "Отказ в подключении"
 
 #: ../src/pulse/error.c:50
 msgid "Protocol error"
-msgstr ""
+msgstr "Ошибка протокола"
 
 #: ../src/pulse/error.c:51
 msgid "Timeout"
-msgstr ""
+msgstr "Тайм-аут"
 
 #: ../src/pulse/error.c:52
 msgid "No authorization key"
-msgstr ""
+msgstr "Нет ключа авторизации"
 
 #: ../src/pulse/error.c:53
 msgid "Internal error"
-msgstr ""
+msgstr "Внутренняя ошибка"
 
 #: ../src/pulse/error.c:54
 msgid "Connection terminated"
-msgstr ""
+msgstr "Соединение завершено"
 
 #: ../src/pulse/error.c:55
 msgid "Entity killed"
-msgstr ""
+msgstr "Объект уничтожен"
 
 #: ../src/pulse/error.c:56
 msgid "Invalid server"
-msgstr ""
+msgstr "Неверный сервер"
 
 #: ../src/pulse/error.c:57
 msgid "Module initalization failed"
-msgstr ""
+msgstr "Инициализация модуля не удалась"
 
 #: ../src/pulse/error.c:58
 msgid "Bad state"
-msgstr ""
+msgstr "Неисправное состояние"
 
 #: ../src/pulse/error.c:59
 msgid "No data"
-msgstr ""
+msgstr "Нет данных"
 
 #: ../src/pulse/error.c:60
 msgid "Incompatible protocol version"
-msgstr ""
+msgstr "Несовместимая версия протокола"
 
 #: ../src/pulse/error.c:61
 msgid "Too large"
-msgstr ""
+msgstr "Слишком большой"
 
 #: ../src/pulse/error.c:62
 msgid "Not supported"
-msgstr ""
+msgstr "Не поддерживается"
 
 #: ../src/pulse/error.c:63
 msgid "Unknown error code"
-msgstr ""
+msgstr "Неизвестный код ошибки"
 
 #: ../src/pulse/error.c:64
 msgid "No such extension"
-msgstr ""
+msgstr "Нет такого расширения"
 
 #: ../src/pulse/error.c:65
 msgid "Obsolete functionality"
-msgstr ""
+msgstr "Устаревшая функциональность"
 
 #: ../src/pulse/error.c:66
 msgid "Missing implementation"
-msgstr ""
+msgstr "Отсутствующая реализация"
 
 #: ../src/pulse/error.c:67
 msgid "Client forked"
-msgstr ""
+msgstr "Клиент разветвлён"
 
 #: ../src/pulse/error.c:68
 msgid "Input/Output error"
-msgstr ""
+msgstr "Ошибка ввода/вывода"
 
 #: ../src/pulse/error.c:69
 msgid "Device or resource busy"
-msgstr ""
+msgstr "Устройство или ресурс занято"
 
 #: ../src/pulse/sample.c:172
 #, c-format
 msgid "%s %uch %uHz"
-msgstr ""
+msgstr "%s %uch %uГц"
 
 #: ../src/pulse/sample.c:184
 #, c-format
 msgid "%0.1f GiB"
-msgstr ""
+msgstr "%0.1f Гб"
 
 #: ../src/pulse/sample.c:186
 #, c-format
 msgid "%0.1f MiB"
-msgstr ""
+msgstr "%0.1f Мб"
 
 #: ../src/pulse/sample.c:188
 #, c-format
 msgid "%0.1f KiB"
-msgstr ""
+msgstr "%0.1f Кб"
 
 #: ../src/pulse/sample.c:190
 #, c-format
 msgid "%u B"
-msgstr ""
+msgstr "%u Б"
 
 #: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100
 msgid "XOpenDisplay() failed"
-msgstr ""
+msgstr "XOpenDisplay() не удалось"
 
 #: ../src/pulse/client-conf-x11.c:93
 msgid "Failed to parse cookie data"
-msgstr ""
+msgstr "Не удалось разобрать данные cookie"
 
 #: ../src/pulse/client-conf.c:111
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
-msgstr ""
+msgstr "Не удалось открыть файл конфигурации '%s': %s"
 
 #: ../src/pulse/context.c:550
 msgid "No cookie loaded. Attempting to connect without."
-msgstr ""
+msgstr "Cookie не загружены. Попытка подключения без них."
 
 #: ../src/pulse/context.c:693
 #, c-format
 msgid "fork(): %s"
-msgstr ""
+msgstr "fork(): %s"
 
 #: ../src/pulse/context.c:748
 #, c-format
 msgid "waitpid(): %s"
-msgstr ""
+msgstr "waitpid(): %s"
 
 #: ../src/pulse/context.c:1438
 #, c-format
 msgid "Received message for unknown extension '%s'"
-msgstr ""
+msgstr "Получено сообщение для неизвестного расширения '%s'"
 
 #: ../src/utils/pacat.c:108
 #, c-format
 msgid "Failed to drain stream: %s"
-msgstr ""
+msgstr "Не удалось создать туннель для потока: %s"
 
 #: ../src/utils/pacat.c:113
 msgid "Playback stream drained."
-msgstr ""
+msgstr "Поток воспроизведения туннелирован."
 
 #: ../src/utils/pacat.c:123
 msgid "Draining connection to server."
-msgstr ""
+msgstr "Туннелирование соединения с сервером."
 
 #: ../src/utils/pacat.c:136
 #, c-format
 msgid "pa_stream_drain(): %s"
-msgstr ""
+msgstr "pa_stream_drain(): %s"
 
 #: ../src/utils/pacat.c:159
 #, c-format
 msgid "pa_stream_write() failed: %s"
-msgstr ""
+msgstr "pa_stream_write() не удалось: %s"
 
 #: ../src/utils/pacat.c:197
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
-msgstr ""
+msgstr "pa_stream_begin_write() не удалось: %s"
 
 #: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
 #, c-format
 msgid "pa_stream_peek() failed: %s"
-msgstr ""
+msgstr "pa_stream_peek() не удалось: %s"
 
 #: ../src/utils/pacat.c:307
 msgid "Stream successfully created."
-msgstr ""
+msgstr "Поток успешно создан."
 
 #: ../src/utils/pacat.c:310
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
-msgstr ""
+msgstr "pa_stream_get_buffer_attr() не удалось: %s"
 
 #: ../src/utils/pacat.c:314
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
-msgstr ""
+msgstr "Показатели буфера: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
 #: ../src/utils/pacat.c:317
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
-msgstr ""
+msgstr "Показатели буфера: maxlength=%u, fragsize=%u"
 
 #: ../src/utils/pacat.c:321
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
-msgstr ""
+msgstr "Использование семплов '%s', схемы каналов '%s'."
 
 #: ../src/utils/pacat.c:325
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
-msgstr ""
+msgstr "Соединён с устройством %s (%u, %sожидание)."
 
 #: ../src/utils/pacat.c:335
 #, c-format
 msgid "Stream error: %s"
-msgstr ""
+msgstr "Ошибка потока: %s"
 
 #: ../src/utils/pacat.c:345
 #, c-format
 msgid "Stream device suspended.%s"
-msgstr ""
+msgstr "Поток приостановлен.%s"
 
 #: ../src/utils/pacat.c:347
 #, c-format
 msgid "Stream device resumed.%s"
-msgstr ""
+msgstr "Поток возобновлён.%s"
 
 #: ../src/utils/pacat.c:355
 #, c-format
 msgid "Stream underrun.%s"
-msgstr ""
+msgstr "Поток недогружен.%s"
 
 #: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream overrun.%s"
-msgstr ""
+msgstr "Поток переполнен.%s"
 
 #: ../src/utils/pacat.c:369
 #, c-format
 msgid "Stream started.%s"
-msgstr ""
+msgstr "Поток запущен.%s"
 
 #: ../src/utils/pacat.c:376
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
-msgstr ""
+msgstr "Поток перемещён на устройство %s (%u, %sожидание).%s"
 
 #: ../src/utils/pacat.c:376
 msgid "not "
-msgstr ""
+msgstr "not "
 
 #: ../src/utils/pacat.c:383
 #, c-format
 msgid "Stream buffer attributes changed.%s"
-msgstr ""
+msgstr "Атрибуты буфера потока изменены.%s"
 
 #: ../src/utils/pacat.c:415
 #, c-format
 msgid "Connection established.%s"
-msgstr ""
+msgstr "Соединение установлено.%s"
 
 #: ../src/utils/pacat.c:418
 #, c-format
 msgid "pa_stream_new() failed: %s"
-msgstr ""
+msgstr "pa_stream_new() не удалось: %s"
 
 #: ../src/utils/pacat.c:450
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
-msgstr ""
+msgstr "pa_stream_connect_playback() не удалось: %s"
 
 #: ../src/utils/pacat.c:456
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
-msgstr ""
+msgstr "pa_stream_connect_record() не удалось: %s"
 
 #: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
 #, c-format
 msgid "Connection failure: %s"
-msgstr ""
+msgstr "Ошибка подключения: %s"
 
 #: ../src/utils/pacat.c:503
 msgid "Got EOF."
-msgstr ""
+msgstr "Достигнут конец файла."
 
 #: ../src/utils/pacat.c:540
 #, c-format
 msgid "write() failed: %s"
-msgstr ""
+msgstr "write() не удалось: %s"
 
 #: ../src/utils/pacat.c:561
 msgid "Got signal, exiting."
-msgstr ""
+msgstr "Сигнал получен, выход."
 
 #: ../src/utils/pacat.c:575
 #, c-format
 msgid "Failed to get latency: %s"
-msgstr ""
+msgstr "Не удалось получить задержку: %s"
 
 #: ../src/utils/pacat.c:580
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
-msgstr ""
+msgstr "Время: %0.3f с; задержка: %0.0f мкс."
 
 #: ../src/utils/pacat.c:599
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
-msgstr ""
+msgstr "pa_stream_update_timing_info() не удалось: %s"
 
 #: ../src/utils/pacat.c:609
 #, c-format
@@ -1199,33 +1329,107 @@ 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, s24le, s24be,\n"
-"                                        s24-32le, s24-32be (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, "
+"s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to "
+"s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, "
+"2 for stereo\n"
 "                                        (defaults to 2)\n"
-"      --channel-map=CHANNELMAP          Channel map to use instead of the default\n"
-"      --fix-format                      Take the sample format from the sink 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"
-"      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
+"      --no-remap                        Map channels by index instead of "
+"name.\n"
+"      --latency=BYTES                   Request the specified latency in "
+"bytes.\n"
+"      --process-time=BYTES              Request the specified process time "
+"per request in bytes.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the "
+"specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
 "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
+"%s [options]\n"
+"\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"\n"
+"  -r, --record                          Create a connection for recording\n"
+"  -p, --playback                        Create a connection for playback\n"
+"\n"
+"  -v, --verbose                         Enable verbose operations\n"
+"\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
+"  -d, --device=DEVICE                   The name of the sink/source to "
+"connect to\n"
+"  -n, --client-name=NAME                How to call this client on the "
+"server\n"
+"      --stream-name=NAME                How to call this stream on the "
+"server\n"
+"      --volume=VOLUME                   Specify the initial (linear) volume "
+"in range 0...65536\n"
+"      --rate=SAMPLERATE                 The sample rate in Hz (defaults to "
+"44100)\n"
+"      --format=SAMPLEFORMAT             The sample type, one of s16le, "
+"s16be, u8, float32le,\n"
+"                                        float32be, ulaw, alaw, s32le, s32be, "
+"s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to "
+"s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, "
+"2 for stereo\n"
+"                                        (defaults to 2)\n"
+"      --channel-map=CHANNELMAP          Channel map to use instead of the "
+"default\n"
+"      --fix-format                      Take the sample format from the sink "
+"the stream is\n"
+"                                        being connected to.\n"
+"      --fix-rate                        Take the sampling rate from the sink "
+"the stream is\n"
+"                                        being connected to.\n"
+"      --fix-channels                    Take the number of channels and the "
+"channel map\n"
+"                                        from the sink the stream is being "
+"connected to.\n"
+"      --no-remix                        Don't upmix or downmix channels.\n"
+"      --no-remap                        Map channels by index instead of "
+"name.\n"
+"      --latency=BYTES                   Request the specified latency in "
+"bytes.\n"
+"      --process-time=BYTES              Request the specified process time "
+"per request in bytes.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the "
+"specified value.\n"
+"      --raw                             Record/play raw PCM data.\n"
+"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --list-file-formats               List available file formats.\n"
 
 #: ../src/utils/pacat.c:731
 #, c-format
@@ -1234,165 +1438,175 @@ msgid ""
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
 msgstr ""
+"pacat %s\n"
+"Скомпилировано с libpulse %s\n"
+"Связано с libpulse %s\n"
 
 #: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
 #, c-format
 msgid "Invalid client name '%s'"
-msgstr ""
+msgstr "Неверное имя клиента '%s'"
 
 #: ../src/utils/pacat.c:779
 #, c-format
 msgid "Invalid stream name '%s'"
-msgstr ""
+msgstr "Неверное имя потока '%s'"
 
 #: ../src/utils/pacat.c:816
 #, c-format
 msgid "Invalid channel map '%s'"
-msgstr ""
+msgstr "Неверная схема каналов '%s'"
 
 #: ../src/utils/pacat.c:845
 #, c-format
 msgid "Invalid latency specification '%s'"
-msgstr ""
+msgstr "Неверное значение задержки '%s'"
 
 #: ../src/utils/pacat.c:852
 #, c-format
 msgid "Invalid process time specification '%s'"
-msgstr ""
+msgstr "Неверная спецификация времени процесса '%s'"
 
 #: ../src/utils/pacat.c:864
 #, c-format
 msgid "Invalid property '%s'"
-msgstr ""
+msgstr "Неверное свойство '%s'"
 
 #: ../src/utils/pacat.c:881
 #, c-format
 msgid "Unknown file format %s."
-msgstr ""
+msgstr "Неизвестный формат файла %s."
 
 #: ../src/utils/pacat.c:900
 msgid "Invalid sample specification"
-msgstr ""
+msgstr "Неверная спецификация сэмпла"
 
 #: ../src/utils/pacat.c:910
 #, c-format
 msgid "open(): %s"
-msgstr ""
+msgstr "open(): %s"
 
 #: ../src/utils/pacat.c:915
 #, c-format
 msgid "dup2(): %s"
-msgstr ""
+msgstr "dup2(): %s"
 
 #: ../src/utils/pacat.c:922
 msgid "Too many arguments."
-msgstr ""
+msgstr "Слишком много аргументов."
 
 #: ../src/utils/pacat.c:933
 msgid "Failed to generate sample specification for file."
-msgstr ""
+msgstr "Ошибка создания спецификации сэмпла для файла."
 
 #: ../src/utils/pacat.c:953
 msgid "Failed to open audio file."
-msgstr ""
+msgstr "Не удалось открыть аудио файл."
 
 #: ../src/utils/pacat.c:959
-msgid "Warning: specified sample specification will be overwritten with specification from file."
+msgid ""
+"Warning: specified sample specification will be overwritten with "
+"specification from file."
 msgstr ""
+"Предупреждение: заданная спецификация сэмпла будет перезаписана "
+"спецификацией из файла."
 
 #: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
 msgid "Failed to determine sample specification from file."
-msgstr ""
+msgstr "Не удалось определить спецификацию сэмпла из файла."
 
 #: ../src/utils/pacat.c:971
 msgid "Warning: Failed to determine channel map from file."
-msgstr ""
+msgstr "Предупреждение: не удалось определить схему каналов из файла."
 
 #: ../src/utils/pacat.c:982
 msgid "Channel map doesn't match sample specification"
-msgstr ""
+msgstr "Схема каналов не соответствует спецификации сэмпла"
 
 #: ../src/utils/pacat.c:993
 msgid "Warning: failed to write channel map to file."
-msgstr ""
+msgstr "Предупреждение: не удалось записать схему каналов в файл."
 
 #: ../src/utils/pacat.c:1008
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
+"Открытие потока %s со спецификацией сэмплов '%s' и схемой каналов '%s'."
 
 #: ../src/utils/pacat.c:1009
 msgid "recording"
-msgstr ""
+msgstr "запись"
 
 #: ../src/utils/pacat.c:1009
 msgid "playback"
-msgstr ""
+msgstr "воспроизведение"
 
 #: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
 msgid "pa_mainloop_new() failed."
-msgstr ""
+msgstr "pa_mainloop_new() не удалось."
 
 #: ../src/utils/pacat.c:1054
 msgid "io_new() failed."
-msgstr ""
+msgstr "io_new() не удалось."
 
 #: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
 msgid "pa_context_new() failed."
-msgstr ""
+msgstr "pa_context_new() не удалось."
 
 #: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
 #, c-format
 msgid "pa_context_connect() failed: %s"
-msgstr ""
+msgstr "pa_context_connect() не удалось: %s"
 
 #: ../src/utils/pacat.c:1075
 msgid "pa_context_rttime_new() failed."
-msgstr ""
+msgstr "pa_context_rttime_new() не удалось."
 
 #: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
 msgid "pa_mainloop_run() failed."
-msgstr ""
+msgstr "pa_mainloop_run() не удалось."
 
 #: ../src/utils/pasuspender.c:81
 #, c-format
 msgid "fork(): %s\n"
-msgstr ""
+msgstr "fork(): %s\n"
 
 #: ../src/utils/pasuspender.c:92
 #, c-format
 msgid "execvp(): %s\n"
-msgstr ""
+msgstr "execvp(): %s\n"
 
 #: ../src/utils/pasuspender.c:109
 #, c-format
 msgid "Failure to suspend: %s\n"
-msgstr ""
+msgstr "Не удаётся приостановить: %s\n"
 
 #: ../src/utils/pasuspender.c:124
 #, c-format
 msgid "Failure to resume: %s\n"
-msgstr ""
+msgstr "Не удаётся возобновить: %s\n"
 
 #: ../src/utils/pasuspender.c:147
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr ""
+"ПРЕДУПРЕЖДЕНИЕ: Аудио сервер не является локальным, не приостанавливается.\n"
 
 #: ../src/utils/pasuspender.c:159
 #, c-format
 msgid "Connection failure: %s\n"
-msgstr ""
+msgstr "Ошибка соединения: %s\n"
 
 #: ../src/utils/pasuspender.c:176
 #, c-format
 msgid "Got SIGINT, exiting.\n"
-msgstr ""
+msgstr "Получен сигнал для остановки, выход.\n"
 
 #: ../src/utils/pasuspender.c:194
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
-msgstr ""
+msgstr "ПРЕДУПРЕЖДЕНИЕ: Дочерний процесс отменён по сигналу %u\n"
 
 #: ../src/utils/pasuspender.c:212
 #, c-format
@@ -1401,9 +1615,17 @@ 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"
+"\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
+"\n"
 
 #: ../src/utils/pasuspender.c:248
 #, c-format
@@ -1412,46 +1634,49 @@ msgid ""
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
 msgstr ""
+"pasuspender %s\n"
+"Скомпилировано с libpulse %s\n"
+"Связано с libpulse %s\n"
 
 #: ../src/utils/pasuspender.c:277
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
-msgstr ""
+msgstr "pa_mainloop_new() не удалось.\n"
 
 #: ../src/utils/pasuspender.c:290
 #, c-format
 msgid "pa_context_new() failed.\n"
-msgstr ""
+msgstr "pa_context_new() не удалось.\n"
 
 #: ../src/utils/pasuspender.c:298
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
-msgstr ""
+msgstr "pa_mainloop_run() не удалось.\n"
 
 #: ../src/utils/pactl.c:135
 #, c-format
 msgid "Failed to get statistics: %s"
-msgstr ""
+msgstr "Не удалось получить статистику: %s"
 
 #: ../src/utils/pactl.c:141
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
-msgstr ""
+msgstr "Сейчас используется: %u блоков содержащих всего %s байт.\n"
 
 #: ../src/utils/pactl.c:144
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
-msgstr ""
+msgstr "Выделено за всё время: %u блоков содержащих всего %s байт.\n"
 
 #: ../src/utils/pactl.c:147
 #, c-format
 msgid "Sample cache size: %s\n"
-msgstr ""
+msgstr "Размер кэша сэмплов: %s\n"
 
 #: ../src/utils/pactl.c:156
 #, c-format
 msgid "Failed to get server information: %s"
-msgstr ""
+msgstr "Не удалось получить информацию о сервере: %s"
 
 #: ../src/utils/pactl.c:164
 #, c-format
@@ -1466,11 +1691,20 @@ msgid ""
 "Default Source: %s\n"
 "Cookie: %08x\n"
 msgstr ""
+"Имя пользователя: %s\n"
+"Имя хоста: %s\n"
+"Имя сервера: %s\n"
+"Версия сервера: %s\n"
+"Спецификация сэмплов по-умолчанию: %s\n"
+"Схема каналов по-умолчанию: %s\n"
+"Аудиовыход по-умолчанию: %s\n"
+"Источник по-умолчанию: %s\n"
+"Cookie: %08x\n"
 
 #: ../src/utils/pactl.c:205
 #, c-format
 msgid "Failed to get sink information: %s"
-msgstr ""
+msgstr "Не удалось получить информацию об аудиовыходе: %s"
 
 #: ../src/utils/pactl.c:221
 #, c-format
@@ -1493,21 +1727,38 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"Аудиовыход #%u\n"
+"\tСостояние: %s\n"
+"\tИмя: %s\n"
+"\tОписание: %s\n"
+"\tДрайвер: %s\n"
+"\tСпецификация сэмплов: %s\n"
+"\tСхема каналов: %s\n"
+"\tРодительский модуль: %u\n"
+"\tВыключить: %s\n"
+"\tГромкость: %s%s%s\n"
+"\t        баланс %0.2f\n"
+"\tБазовая громкость: %s%s%s\n"
+"\tМонитор источника: %s\n"
+"\tЗадержка: %0.0f мкс, настроить %0.0f мкс\n"
+"\tФлаги: %s%s%s%s%s%s\n"
+"\tСвойства:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
 #, c-format
 msgid "\tPorts:\n"
-msgstr ""
+msgstr "\tПорты:\n"
 
 #: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
 #, c-format
 msgid "\tActive Port: %s\n"
-msgstr ""
+msgstr "\tАктивный порт: %s\n"
 
 #: ../src/utils/pactl.c:297
 #, c-format
 msgid "Failed to get source information: %s"
-msgstr ""
+msgstr "Не удалось получить информацию об источнике: %s"
 
 #: ../src/utils/pactl.c:313
 #, c-format
@@ -1530,6 +1781,23 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"Источник #%u\n"
+"\tСостояние: %s\n"
+"\tИмя: %s\n"
+"\tОписание: %s\n"
+"\tДрайвер: %s\n"
+"\tСпецификация сэмплов: %s\n"
+"\tСхема каналов: %s\n"
+"\tРодительский модуль: %u\n"
+"\tВыключить: %s\n"
+"\tГромкость: %s%s%s\n"
+"\t        баланс %0.2f\n"
+"\tБазовая громкость: %s%s%s\n"
+"\tМонитор аудиовыхода: %s\n"
+"\tЗадержка: %0.0f мкс, настроить %0.0f мкс\n"
+"\tФлаги: %s%s%s%s%s%s\n"
+"\tСвойства:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
 #: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
@@ -1537,12 +1805,12 @@ msgstr ""
 #: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
 #: ../src/utils/pactl.c:645
 msgid "n/a"
-msgstr ""
+msgstr "н/д"
 
 #: ../src/utils/pactl.c:375
 #, c-format
 msgid "Failed to get module information: %s"
-msgstr ""
+msgstr "Не удалось получить информацию о модуле: %s"
 
 #: ../src/utils/pactl.c:393
 #, c-format
@@ -1554,11 +1822,17 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"Модуль #%u\n"
+"\tИмя: %s\n"
+"\tАргумент: %s\n"
+"\tСчётчик использования: %s\n"
+"\tСвойства:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:412
 #, c-format
 msgid "Failed to get client information: %s"
-msgstr ""
+msgstr "Не удалось получить информацию о клиенте: %s"
 
 #: ../src/utils/pactl.c:430
 #, c-format
@@ -1569,11 +1843,16 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"Клиент #%u\n"
+"\tДрайвер: %s\n"
+"\tРодительский модуль: %s\n"
+"\tСвойства:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:447
 #, c-format
 msgid "Failed to get card information: %s"
-msgstr ""
+msgstr "Не удалось получить информацию о карте: %s"
 
 #: ../src/utils/pactl.c:465
 #, c-format
@@ -1585,21 +1864,27 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"Карта #%u\n"
+"\tИмя: %s\n"
+"\tДрайвер: %s\n"
+"\tРодительский модуль: %s\n"
+"\tСвойства:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:479
 #, c-format
 msgid "\tProfiles:\n"
-msgstr ""
+msgstr "\tПрофили:\n"
 
 #: ../src/utils/pactl.c:485
 #, c-format
 msgid "\tActive Profile: %s\n"
-msgstr ""
+msgstr "\tАктивный профиль: %s\n"
 
 #: ../src/utils/pactl.c:496
 #, c-format
 msgid "Failed to get sink input information: %s"
-msgstr ""
+msgstr "Не удалось получить информацию о вводе аудиовыхода: %s"
 
 #: ../src/utils/pactl.c:515
 #, c-format
@@ -1621,11 +1906,27 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"Ввод аудиовыхода #%u\n"
+"\tДрайвер: %s\n"
+"\tРодительский модуль: %s\n"
+"\tКлиент: %s\n"
+"\tАудиовыход: %u\n"
+"\tСпецификация сэмплов: %s\n"
+"\tСхема каналов: %s\n"
+"\tВыключить: %s\n"
+"\tГромкость: %s\n"
+"\t        %s\n"
+"\t        баланс %0.2f\n"
+"\tЗадержка буфера: %0.0f мкс\n"
+"\tЗадержка аудиовыхода: %0.0f usec\n"
+"\tМетод ресэмплирования: %s\n"
+"\tСвойства:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:554
 #, c-format
 msgid "Failed to get source output information: %s"
-msgstr ""
+msgstr "Не удалось получить информацию о выходе источника: %s"
 
 #: ../src/utils/pactl.c:574
 #, c-format
@@ -1643,11 +1944,23 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"Выход источника #%u\n"
+"\tДрайвер: %s\n"
+"\tРодительский модуль: %s\n"
+"\tКлиент: %s\n"
+"\tИсточник: %u\n"
+"\tСпецификация сэмплов: %s\n"
+"\tСхема каналов: %s\n"
+"\tЗадержка буфера: %0.0f мкс\n"
+"\tЗадержка источника: %0.0f мкс\n"
+"\tМетод ресэмплирования: %s\n"
+"\tСвойства:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:605
 #, c-format
 msgid "Failed to get sample information: %s"
-msgstr ""
+msgstr "Не удалось получить информацию о сэмпле: %s"
 
 #: ../src/utils/pactl.c:623
 #, c-format
@@ -1666,24 +1979,37 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
+"Сэмпл #%u\n"
+"\tИмя: %s\n"
+"\tСпецификация сэмпла: %s\n"
+"\tСхема каналов: %s\n"
+"\tГромкость: %s\n"
+"\t        %s\n"
+"\t        баланс %0.2f\n"
+"\tДлительность: %0.1fs\n"
+"\tРазмер: %s\n"
+"\tОтложенный (lazy): %s\n"
+"\tИмя файла: %s\n"
+"\tСвойства:\n"
+"\t\t%s\n"
 
 #: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
 #, c-format
 msgid "Failure: %s"
-msgstr ""
+msgstr "Не удалось: %s"
 
 #: ../src/utils/pactl.c:687
 #, c-format
 msgid "Failed to upload sample: %s"
-msgstr ""
+msgstr "Не удалось загрузить сэмпл: %s"
 
 #: ../src/utils/pactl.c:704
 msgid "Premature end of file"
-msgstr ""
+msgstr "Преждевременный конец файла"
 
 #: ../src/utils/pactl.c:863
 msgid "Got SIGINT, exiting."
-msgstr ""
+msgstr "Получен сигнал для остановки, выход."
 
 #: ../src/utils/pactl.c:869
 #, c-format
@@ -1713,9 +2039,40 @@ 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"
+"%s [options] exit\n"
+"%s [options] upload-sample FILENAME [NAME]\n"
+"%s [options] play-sample NAME [SINK]\n"
+"%s [options] remove-sample NAME\n"
+"%s [options] move-sink-input SINKINPUT SINK\n"
+"%s [options] move-source-output SOURCEOUTPUT SOURCE\n"
+"%s [options] load-module NAME [ARGS ...]\n"
+"%s [options] unload-module MODULE\n"
+"%s [options] suspend-sink SINK 1|0\n"
+"%s [options] suspend-source SOURCE 1|0\n"
+"%s [options] set-card-profile CARD PROFILE\n"
+"%s [options] set-sink-port SINK PORT\n"
+"%s [options] set-source-port SOURCE PORT\n"
+"%s [options] set-sink-volume SINK VOLUME\n"
+"%s [options] set-source-volume SOURCE VOLUME\n"
+"%s [options] set-sink-input-volume SINKINPUT VOLUME\n"
+"%s [options] set-sink-mute SINK 1|0\n"
+"%s [options] set-source-mute SOURCE 1|0\n"
+"%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"\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"
 
 #: ../src/utils/pactl.c:933
 #, c-format
@@ -1724,104 +2081,114 @@ msgid ""
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
 msgstr ""
+"pactl %s\n"
+"Скомпилировано с libpulse %s\n"
+"Связано с libpulse %s\n"
 
 #: ../src/utils/pactl.c:979
 msgid "Please specify a sample file to load"
-msgstr ""
+msgstr "Пожалуйста укажите файл сэмпла для загрузки"
 
 #: ../src/utils/pactl.c:992
 msgid "Failed to open sound file."
-msgstr ""
+msgstr "Не удалось открыть звуковой файл."
 
 #: ../src/utils/pactl.c:1004
 msgid "Warning: Failed to determine sample specification from file."
-msgstr ""
+msgstr "Предупреждение: не удалось определить спецификации сэмплов из файла."
 
 #: ../src/utils/pactl.c:1014
 msgid "You have to specify a sample name to play"
-msgstr ""
+msgstr "Вы должны указать имя сэмпла для воспроизведения"
 
 #: ../src/utils/pactl.c:1026
 msgid "You have to specify a sample name to remove"
-msgstr ""
+msgstr "Вы должны указать имя сэмпла для удаления"
 
 #: ../src/utils/pactl.c:1035
 msgid "You have to specify a sink input index and a sink"
-msgstr ""
+msgstr "Вы должны указать индекс ввода аудиовыхода и аудиовыход"
 
 #: ../src/utils/pactl.c:1045
 msgid "You have to specify a source output index and a source"
-msgstr ""
+msgstr "Вы должны указать индекс вывода источника и источник"
 
 #: ../src/utils/pactl.c:1060
 msgid "You have to specify a module name and arguments."
-msgstr ""
+msgstr "Вы должны указать имя модуля и аргументы"
 
 #: ../src/utils/pactl.c:1080
 msgid "You have to specify a module index"
-msgstr ""
+msgstr "Вы должны указать индекс модуля"
 
 #: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
+"Вы не можете указать более одного аудиовыхода. Вы должны указать логическое "
+"значение."
 
 #: ../src/utils/pactl.c:1103
-msgid "You may not specify more than one source. You have to specify a boolean value."
+msgid ""
+"You may not specify more than one source. You have to specify a boolean "
+"value."
 msgstr ""
+"Вы не можете указать более одного источника. Вы должны указать логическое "
+"значение."
 
 #: ../src/utils/pactl.c:1115
 msgid "You have to specify a card name/index and a profile name"
-msgstr ""
+msgstr "Вы должны указать имя/индекс карты и имя профиля"
 
 #: ../src/utils/pactl.c:1126
 msgid "You have to specify a sink name/index and a port name"
-msgstr ""
+msgstr "Вы должны указать имя/индекс аудиовыхода и имя порта"
 
 #: ../src/utils/pactl.c:1137
 msgid "You have to specify a source name/index and a port name"
-msgstr ""
+msgstr "Вы должны указать имя/индекс источника и имя порта"
 
 #: ../src/utils/pactl.c:1149
 msgid "You have to specify a sink name/index and a volume"
-msgstr ""
+msgstr "Вы должны указать имя/индекс аудиовыхода и громкость"
 
 #: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
 #: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
 #: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
 msgid "Invalid volume specification"
-msgstr ""
+msgstr "Неверное значение громкости"
 
 #: ../src/utils/pactl.c:1166
 msgid "You have to specify a source name/index and a volume"
-msgstr ""
+msgstr "Вы должны указать имя/индекс источника и громкость"
 
 #: ../src/utils/pactl.c:1183
 msgid "You have to specify a sink input index and a volume"
-msgstr ""
+msgstr "Вы должны указать индекс ввода аудиовыхода и громкость"
 
 #: ../src/utils/pactl.c:1188
 msgid "Invalid sink input index"
-msgstr ""
+msgstr "Неверный индекс ввода аудиовыхода"
 
 #: ../src/utils/pactl.c:1204
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr ""
+msgstr "Вы должны указать имя/индекс аудиовыхода и выключить логический"
 
 #: ../src/utils/pactl.c:1221
 msgid "You have to specify a source name/index and a mute boolean"
-msgstr ""
+msgstr "Вы должны указать имя/индекс источника и выключить логический"
 
 #: ../src/utils/pactl.c:1238
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr ""
+msgstr "Вы должны указать индекс ввода аудиовыхода и выключить логический"
 
 #: ../src/utils/pactl.c:1243
 msgid "Invalid sink input index specification"
-msgstr ""
+msgstr "Неверная спецификация индекса ввода аудиовыхода"
 
 #: ../src/utils/pactl.c:1262
 msgid "No valid command specified."
-msgstr ""
+msgstr "Не указаны правильные команды."
 
 #: ../src/utils/pax11publish.c:61
 #, c-format
@@ -1830,349 +2197,377 @@ 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    Show current PulseAudio data attached to X11 display (default)\n"
+" -e    Export local PulseAudio data to X11 display\n"
+" -i    Import PulseAudio data from X11 display to local environment "
+"variables and cookie file.\n"
+" -r    Remove PulseAudio data from X11 display\n"
 
 #: ../src/utils/pax11publish.c:94
 #, c-format
 msgid "Failed to parse command line.\n"
-msgstr ""
+msgstr "Ошибка разбора командной строки.\n"
 
 #: ../src/utils/pax11publish.c:108
 #, c-format
 msgid "Server: %s\n"
-msgstr ""
+msgstr "Сервер: %s\n"
 
 #: ../src/utils/pax11publish.c:110
 #, c-format
 msgid "Source: %s\n"
-msgstr ""
+msgstr "Источник: %s\n"
 
 #: ../src/utils/pax11publish.c:112
 #, c-format
 msgid "Sink: %s\n"
-msgstr ""
+msgstr "Аудиовыход: %s\n"
 
 #: ../src/utils/pax11publish.c:114
 #, c-format
 msgid "Cookie: %s\n"
-msgstr ""
+msgstr "Cookie: %s\n"
 
 #: ../src/utils/pax11publish.c:132
 #, c-format
 msgid "Failed to parse cookie data\n"
-msgstr ""
+msgstr "Не удалось разобрать данные cookie\n"
 
 #: ../src/utils/pax11publish.c:137
 #, c-format
 msgid "Failed to save cookie data\n"
-msgstr ""
+msgstr "Не удалось сохранить данные cookie\n"
 
 #: ../src/utils/pax11publish.c:152
 #, c-format
 msgid "Failed to load client configuration file.\n"
-msgstr ""
+msgstr "Не удалось загрузить файл конфигурации клиента.\n"
 
 #: ../src/utils/pax11publish.c:157
 #, c-format
 msgid "Failed to read environment configuration data.\n"
-msgstr ""
+msgstr "Не удалось прочитать данные конфигурации окружения.\n"
 
 #: ../src/utils/pax11publish.c:174
 #, c-format
 msgid "Failed to get FQDN.\n"
-msgstr ""
+msgstr "Не удалось получить имя домена (FQDN).\n"
 
 #: ../src/utils/pax11publish.c:194
 #, c-format
 msgid "Failed to load cookie data\n"
-msgstr ""
+msgstr "Не удалось загрузить данные cookie\n"
 
 #: ../src/utils/pax11publish.c:211
 #, c-format
 msgid "Not yet implemented.\n"
-msgstr ""
+msgstr "Ещё не выполнено.\n"
 
 #: ../src/utils/pacmd.c:69
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
+"Нет запущенного демона PulseAudio или не запущен в качестве сессионного "
+"демона."
 
 #: ../src/utils/pacmd.c:74
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
-msgstr ""
+msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
 #: ../src/utils/pacmd.c:91
 #, c-format
 msgid "connect(): %s"
-msgstr ""
+msgstr "connect(): %s"
 
 #: ../src/utils/pacmd.c:99
 msgid "Failed to kill PulseAudio daemon."
-msgstr ""
+msgstr "Не удалось убить демон PulseAudio."
 
 #: ../src/utils/pacmd.c:107
 msgid "Daemon not responding."
-msgstr ""
+msgstr "Демон не отвечает."
 
 #: ../src/utils/pacmd.c:161
 #, c-format
 msgid "poll(): %s"
-msgstr ""
+msgstr "poll(): %s"
 
 #: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
 #, c-format
 msgid "read(): %s"
-msgstr ""
+msgstr "read(): %s"
 
 #: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
 #, c-format
 msgid "write(): %s"
-msgstr ""
+msgstr "write(): %s"
 
 #: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
 msgid "Cannot access autospawn lock."
-msgstr ""
+msgstr "Cannot access autospawn lock."
 
 #: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
 #, c-format
 msgid ""
-"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
-"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
-msgstr ""
+"ALSA woke us up to write new data to the device, but there was actually "
+"nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
+msgstr ""
+"ALSA разбудила нас для записи новых данных в устройство, но на самом деле "
+"писать было нечего!\n"
+"Скорее всего это ошибка в драйвере ALSA '%s'. Пожалуйста сообщите об этой "
+"проблеме разработчикам ALSA.\n"
+"Мы проснулись с POLLOUT set -- однако последующее snd_pcm_avail() вернуло 0 "
+"или другое значение < min_avail."
 
 #: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
 #, c-format
 msgid ""
-"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
-"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
-msgstr ""
+"ALSA woke us up to read new data from the device, but there was actually "
+"nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
+msgstr ""
+"ALSA разбудила нас для чтения новых данных из устройства, но на самом деле "
+"читать было нечего!\n"
+"Скорее всего это ошибка в драйвере ALSA '%s'. Пожалуйста сообщите об этой "
+"проблеме разработчикам ALSA.\n"
+"Мы проснулись с POLLOUT set -- однако последующее snd_pcm_avail() вернуло 0 "
+"или другое значение < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2228
 #: ../src/modules/alsa/alsa-mixer.c:2931
 msgid "Off"
-msgstr ""
+msgstr "Выключено"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2184
 msgid "High Fidelity Playback (A2DP)"
-msgstr ""
+msgstr "Воспроизведение высокой точности (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2198
 msgid "High Fidelity Capture (A2DP)"
-msgstr ""
+msgstr "Запись высокой точности (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2213
 msgid "Telephony Duplex (HSP/HFP)"
-msgstr ""
+msgstr "Дуплексная телефония (HSP/HFP)"
 
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
-msgstr ""
+msgstr "Звуковой сервер PulseAudio"
 
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
 msgid "Output Devices"
-msgstr ""
+msgstr "Устройства вывода"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
 msgid "Input Devices"
-msgstr ""
+msgstr "Устройства ввода"
 
 #: ../src/modules/module-rygel-media-server.c:774
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "Аудио на @HOSTNAME@"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
 msgid "Input"
-msgstr ""
+msgstr "Ввод"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
-msgstr ""
+msgstr "Док-станция ввода"
 
 #: ../src/modules/alsa/alsa-mixer.c:1703
 msgid "Docking Station Microphone"
-msgstr ""
+msgstr "Док-станция микрофон"
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
 msgid "Line-In"
-msgstr ""
+msgstr "Линейный вход"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "Микрофон"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "Внешний микрофон"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
 msgid "Internal Microphone"
-msgstr ""
+msgstr "Встроенный микрофон"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "Радио"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "Видео"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "Автоматическая регулировка усиления"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "Нет автоматической регулировки усиления"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "Усиление"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "Нет усиления"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "Усилитель"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "Нет усилителя"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
-msgstr ""
+msgstr "Аналоговый ввод"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
 msgid "Analog Microphone"
-msgstr ""
+msgstr "Аналоговый микрофон"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
 msgid "Analog Line-In"
-msgstr ""
+msgstr "Аналоговый линейный вход"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
 msgid "Analog Radio"
-msgstr ""
+msgstr "Аналоговое радио"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Video"
-msgstr ""
+msgstr "Аналоговое видео"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Output"
-msgstr ""
+msgstr "Аналоговый вывод"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Headphones"
-msgstr ""
+msgstr "Аналоговые наушники"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "Аналоговый вывод (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "Аналоговый вывод моно"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
 #, c-format
 msgid "%s+%s"
-msgstr ""
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
 #, c-format
 msgid "%s / %s"
-msgstr ""
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "Аналоговое моно"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
 msgid "Analog Stereo"
-msgstr ""
+msgstr "Аналоговое стерео"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
 msgid "Analog Surround 2.1"
-msgstr ""
+msgstr "Аналоговый объёмный 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
 msgid "Analog Surround 3.0"
-msgstr ""
+msgstr "Аналоговый объёмный 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
 msgid "Analog Surround 3.1"
-msgstr ""
+msgstr "Аналоговый объёмный 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Surround 4.0"
-msgstr ""
+msgstr "Аналоговый объёмный 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Surround 4.1"
-msgstr ""
+msgstr "Аналоговый объёмный 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 5.0"
-msgstr ""
+msgstr "Аналоговый объёмный 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 5.1"
-msgstr ""
+msgstr "Аналоговый объёмный 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 6.0"
-msgstr ""
+msgstr "Аналоговый объёмный 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 6.1"
-msgstr ""
+msgstr "Аналоговый объёмный 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 7.0"
-msgstr ""
+msgstr "Аналоговый объёмный 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 7.1"
-msgstr ""
+msgstr "Аналоговый объёмный 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "Цифровое стерео (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "Цифровой объёмный 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "Цифровой объёмный 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "Цифровой объёмный 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "Цифровое стерео (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "Аналоговый моно дуплекс"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "Аналоговый стерео дуплекс"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "Цифровой стерео дуплекс (IEC958)"

commit c72c90bc71091fbace6f967c63e7a9dc8af8f264
Author: Leonid Kurbatov <llenchikk at rambler.ru>
Date:   Sun Jan 24 20:48:27 2010 +0000

    l10n: Updates to Russian (ru) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/ru.po b/po/ru.po
index 4c408f0..010eb12 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -9,7 +9,7 @@ msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-01-24 06:51+0000\n"
-"PO-Revision-Date: 2010-01-24 23:33+0300\n"
+"PO-Revision-Date: 2010-01-24 23:47+0300\n"
 "Last-Translator: Leonid Kurbatov <llenchikk at rambler.ru>\n"
 "Language-Team: Russian <->\n"
 "MIME-Version: 1.0\n"
@@ -738,7 +738,7 @@ msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
 msgstr ""
-"В указанной схеме каналов число каналов отличается от числа каналов по-"
+"В указанной схеме каналов число каналов отличается от числа каналов по "
 "умолчанию."
 
 #: ../src/daemon/daemon-conf.c:638
@@ -1695,10 +1695,10 @@ msgstr ""
 "Имя хоста: %s\n"
 "Имя сервера: %s\n"
 "Версия сервера: %s\n"
-"Спецификация сэмплов по-умолчанию: %s\n"
-"Схема каналов по-умолчанию: %s\n"
-"Аудиовыход по-умолчанию: %s\n"
-"Источник по-умолчанию: %s\n"
+"Спецификация сэмплов по умолчанию: %s\n"
+"Схема каналов по умолчанию: %s\n"
+"Аудиовыход по умолчанию: %s\n"
+"Источник по умолчанию: %s\n"
 "Cookie: %08x\n"
 
 #: ../src/utils/pactl.c:205

commit a8a5c39b93727685a5b4f8a686f9c7bac7cccdc9
Author: Leonid Kurbatov <llenchikk at rambler.ru>
Date:   Sun Jan 24 21:09:52 2010 +0000

    l10n: Updates to Russian (ru) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/ru.po b/po/ru.po
index 010eb12..d800df4 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -9,7 +9,7 @@ msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-01-24 06:51+0000\n"
-"PO-Revision-Date: 2010-01-24 23:47+0300\n"
+"PO-Revision-Date: 2010-01-25 00:09+0300\n"
 "Last-Translator: Leonid Kurbatov <llenchikk at rambler.ru>\n"
 "Language-Team: Russian <->\n"
 "MIME-Version: 1.0\n"
@@ -2354,11 +2354,11 @@ msgstr "Выключено"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2184
 msgid "High Fidelity Playback (A2DP)"
-msgstr "Воспроизведение высокой точности (A2DP)"
+msgstr "Воспроизведение высокого качества (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2198
 msgid "High Fidelity Capture (A2DP)"
-msgstr "Запись высокой точности (A2DP)"
+msgstr "Запись высокого качества (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2213
 msgid "Telephony Duplex (HSP/HFP)"

commit acb1773dfcff8c6d378e2003b1c4006f206921ab
Author: Leonid Kurbatov <llenchikk at rambler.ru>
Date:   Sun Jan 24 21:20:17 2010 +0000

    l10n: Updates to Russian (ru) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/ru.po b/po/ru.po
index d800df4..1927254 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -9,7 +9,7 @@ msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-01-24 06:51+0000\n"
-"PO-Revision-Date: 2010-01-25 00:09+0300\n"
+"PO-Revision-Date: 2010-01-25 00:19+0300\n"
 "Last-Translator: Leonid Kurbatov <llenchikk at rambler.ru>\n"
 "Language-Team: Russian <->\n"
 "MIME-Version: 1.0\n"
@@ -176,7 +176,7 @@ msgstr "Успешное удаление привилегий админист
 
 #: ../src/daemon/main.c:279
 msgid "System wide mode unsupported on this platform."
-msgstr "Расширенный режим не поддерживается на этой платформе."
+msgstr "Расширенный системный режим не поддерживается на этой платформе."
 
 #: ../src/daemon/main.c:297
 #, c-format
@@ -215,7 +215,7 @@ msgstr "Необходимы права администратора."
 
 #: ../src/daemon/main.c:578
 msgid "--start not supported for system instances."
-msgstr "--start не поддерживается для элементов системы."
+msgstr "--start не поддерживается для системных элементов."
 
 #: ../src/daemon/main.c:583
 msgid "Running in system mode, but --disallow-exit not set!"

commit 8b27e2c1fb620ecdf137490af1743ba25b72c857
Author: Leonid Kurbatov <llenchikk at rambler.ru>
Date:   Sun Jan 31 12:49:55 2010 +0000

    l10n: Updates to Russian (ru) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/ru.po b/po/ru.po
index 1927254..cb109ef 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -9,7 +9,7 @@ msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-01-24 06:51+0000\n"
-"PO-Revision-Date: 2010-01-25 00:19+0300\n"
+"PO-Revision-Date: 2010-01-31 15:49+0300\n"
 "Last-Translator: Leonid Kurbatov <llenchikk at rambler.ru>\n"
 "Language-Team: Russian <->\n"
 "MIME-Version: 1.0\n"
@@ -63,7 +63,7 @@ msgstr ""
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
 msgstr ""
-"Всегда оставлять хотя бы один аудиовыход загруженным, даже если он "
+"Всегда оставлять хотя бы один аудиоприёмник загруженным, даже если он "
 "неопределён."
 
 #: ../src/modules/module-always-sink.c:83
@@ -72,7 +72,7 @@ msgstr "Фиктивный выход"
 
 #: ../src/modules/module-ladspa-sink.c:49
 msgid "Virtual LADSPA sink"
-msgstr "Виртуальный LADSPA аудиовыход"
+msgstr "Виртуальный LADSPA аудиоприёмник"
 
 #: ../src/modules/module-ladspa-sink.c:53
 msgid ""
@@ -82,15 +82,15 @@ msgid ""
 "plugin name> label=<ladspa plugin label> control=<comma seperated list of "
 "input control values>"
 msgstr ""
-"sink_name=<имя аудиовыхода> sink_properties=<свойства аудиовыхода> "
-"master=<имя аудиовыхода для фильтрации> format=<формат> rate=<частота> "
+"sink_name=<имя аудиоприёмника> sink_properties=<свойства аудиоприёмника> "
+"master=<имя аудиоприёмника для фильтрации> format=<формат> rate=<частота> "
 "channels=<число каналов> channel_map=<схема каналов> plugin=<имя плагина "
 "ladspa> label=<метка плагина ladspa> control=<список входных значений, "
 "разделённый запятыми>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
-msgstr "Синхронизированный NULL аудиовыход"
+msgstr "Синхронизированный NULL аудиоприёмник"
 
 #: ../src/modules/module-null-sink.c:291
 msgid "Null Output"
@@ -1697,14 +1697,14 @@ msgstr ""
 "Версия сервера: %s\n"
 "Спецификация сэмплов по умолчанию: %s\n"
 "Схема каналов по умолчанию: %s\n"
-"Аудиовыход по умолчанию: %s\n"
+"Аудиоприёмник по умолчанию: %s\n"
 "Источник по умолчанию: %s\n"
 "Cookie: %08x\n"
 
 #: ../src/utils/pactl.c:205
 #, c-format
 msgid "Failed to get sink information: %s"
-msgstr "Не удалось получить информацию об аудиовыходе: %s"
+msgstr "Не удалось получить информацию об аудиоприёмнике: %s"
 
 #: ../src/utils/pactl.c:221
 #, c-format
@@ -1727,7 +1727,7 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
-"Аудиовыход #%u\n"
+"Аудиоприёмник #%u\n"
 "\tСостояние: %s\n"
 "\tИмя: %s\n"
 "\tОписание: %s\n"
@@ -1793,7 +1793,7 @@ msgstr ""
 "\tГромкость: %s%s%s\n"
 "\t        баланс %0.2f\n"
 "\tБазовая громкость: %s%s%s\n"
-"\tМонитор аудиовыхода: %s\n"
+"\tМонитор аудиоприёмника: %s\n"
 "\tЗадержка: %0.0f мкс, настроить %0.0f мкс\n"
 "\tФлаги: %s%s%s%s%s%s\n"
 "\tСвойства:\n"
@@ -1884,7 +1884,7 @@ msgstr "\tАктивный профиль: %s\n"
 #: ../src/utils/pactl.c:496
 #, c-format
 msgid "Failed to get sink input information: %s"
-msgstr "Не удалось получить информацию о вводе аудиовыхода: %s"
+msgstr "Не удалось получить информацию о вводе аудиоприёмника: %s"
 
 #: ../src/utils/pactl.c:515
 #, c-format
@@ -1906,11 +1906,11 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
-"Ввод аудиовыхода #%u\n"
+"Ввод аудиоприёмника #%u\n"
 "\tДрайвер: %s\n"
 "\tРодительский модуль: %s\n"
 "\tКлиент: %s\n"
-"\tАудиовыход: %u\n"
+"\tАудиоприёмник: %u\n"
 "\tСпецификация сэмплов: %s\n"
 "\tСхема каналов: %s\n"
 "\tВыключить: %s\n"
@@ -1918,7 +1918,7 @@ msgstr ""
 "\t        %s\n"
 "\t        баланс %0.2f\n"
 "\tЗадержка буфера: %0.0f мкс\n"
-"\tЗадержка аудиовыхода: %0.0f usec\n"
+"\tЗадержка аудиоприёмника: %0.0f usec\n"
 "\tМетод ресэмплирования: %s\n"
 "\tСвойства:\n"
 "\t\t%s\n"
@@ -2107,7 +2107,7 @@ msgstr "Вы должны указать имя сэмпла для удален
 
 #: ../src/utils/pactl.c:1035
 msgid "You have to specify a sink input index and a sink"
-msgstr "Вы должны указать индекс ввода аудиовыхода и аудиовыход"
+msgstr "Вы должны указать индекс ввода аудиоприёмника и аудиоприёмник"
 
 #: ../src/utils/pactl.c:1045
 msgid "You have to specify a source output index and a source"
@@ -2125,8 +2125,8 @@ msgstr "Вы должны указать индекс модуля"
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
-"Вы не можете указать более одного аудиовыхода. Вы должны указать логическое "
-"значение."
+"Вы не можете указать более одного аудиоприёмника. Вы должны указать "
+"логическое значение."
 
 #: ../src/utils/pactl.c:1103
 msgid ""
@@ -2142,7 +2142,7 @@ msgstr "Вы должны указать имя/индекс карты и им
 
 #: ../src/utils/pactl.c:1126
 msgid "You have to specify a sink name/index and a port name"
-msgstr "Вы должны указать имя/индекс аудиовыхода и имя порта"
+msgstr "Вы должны указать имя/индекс аудиоприёмника и имя порта"
 
 #: ../src/utils/pactl.c:1137
 msgid "You have to specify a source name/index and a port name"
@@ -2150,7 +2150,7 @@ msgstr "Вы должны указать имя/индекс источника
 
 #: ../src/utils/pactl.c:1149
 msgid "You have to specify a sink name/index and a volume"
-msgstr "Вы должны указать имя/индекс аудиовыхода и громкость"
+msgstr "Вы должны указать имя/индекс аудиоприёмника и громкость"
 
 #: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
 #: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
@@ -2164,15 +2164,15 @@ msgstr "Вы должны указать имя/индекс источника
 
 #: ../src/utils/pactl.c:1183
 msgid "You have to specify a sink input index and a volume"
-msgstr "Вы должны указать индекс ввода аудиовыхода и громкость"
+msgstr "Вы должны указать индекс ввода аудиоприёмника и громкость"
 
 #: ../src/utils/pactl.c:1188
 msgid "Invalid sink input index"
-msgstr "Неверный индекс ввода аудиовыхода"
+msgstr "Неверный индекс ввода аудиоприёмника"
 
 #: ../src/utils/pactl.c:1204
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr "Вы должны указать имя/индекс аудиовыхода и выключить логический"
+msgstr "Вы должны указать имя/индекс аудиоприёмника и выключить логический"
 
 #: ../src/utils/pactl.c:1221
 msgid "You have to specify a source name/index and a mute boolean"
@@ -2180,11 +2180,11 @@ msgstr "Вы должны указать имя/индекс источника
 
 #: ../src/utils/pactl.c:1238
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr "Вы должны указать индекс ввода аудиовыхода и выключить логический"
+msgstr "Вы должны указать индекс ввода аудиоприёмника и выключить логический"
 
 #: ../src/utils/pactl.c:1243
 msgid "Invalid sink input index specification"
-msgstr "Неверная спецификация индекса ввода аудиовыхода"
+msgstr "Неверная спецификация индекса ввода аудиоприёмника"
 
 #: ../src/utils/pactl.c:1262
 msgid "No valid command specified."
@@ -2227,7 +2227,7 @@ msgstr "Источник: %s\n"
 #: ../src/utils/pax11publish.c:112
 #, c-format
 msgid "Sink: %s\n"
-msgstr "Аудиовыход: %s\n"
+msgstr "Аудиоприёмник: %s\n"
 
 #: ../src/utils/pax11publish.c:114
 #, c-format

commit f9af65bba3f8222931671e0287456be4b12c6087
Author: zerng07 <pswo10680 at gmail.com>
Date:   Fri Feb 5 13:34:24 2010 +0000

    l10n: Updates to Chinese (Taiwan) (zh_TW) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/zh_TW.po b/po/zh_TW.po
index 4f730f8..37aa062 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -1,51 +1,46 @@
-# translation of pulseaudio.master-tx.pulseaudio.po to Traditional Chinese
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
 #
-# Chester Cheng <ccheng@紅帽子>, 2009.
+# Cheng-Chia Tseng <pswo10680 at gmail.com>, 2009.
 msgid ""
 msgstr ""
-"Project-Id-Version: pulseaudio.master-tx.pulseaudio\n"
+"Project-Id-Version: upstream-translations.pulseaudio.zh_TW\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-10 02:33+0000\n"
-"PO-Revision-Date: 2009-12-10 14:18+1000\n"
-"Last-Translator: Chester Cheng <ccheng@紅帽子>\n"
-"Language-Team: Traditional Chinese <zh_TW at li.org>\n"
+"POT-Creation-Date: 2010-02-05 08:05+0000\n"
+"PO-Revision-Date: 2010-02-05 21:33+0800\n"
+"Last-Translator: Cheng-Chia Tseng <pswo10680 at gmail.com>\n"
+"Language-Team: Chinese Traditional <>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.11.4\n"
+"X-Generator: Lokalize 0.3\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:858
+#: ../src/pulsecore/sink.c:2629
 #, c-format
 msgid "%s %s"
-msgstr "%s %s"
+msgstr ""
 
 #: ../src/modules/alsa/alsa-util.c:1106
 #, c-format
 msgid ""
-"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
-"ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
 
 #: ../src/modules/alsa/alsa-util.c:1147
 #, c-format
 msgid ""
-"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
-"lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
 
 #: ../src/modules/alsa/alsa-util.c:1194
 #, c-format
 msgid ""
-"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
-"(%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
 msgstr ""
 
 #: ../src/modules/module-always-sink.c:39
@@ -61,65 +56,56 @@ msgid "Virtual LADSPA sink"
 msgstr ""
 
 #: ../src/modules/module-ladspa-sink.c:53
-msgid ""
-"sink_name=<name for the sink> sink_properties=<properties for the sink> "
-"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
-"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
-"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
-"input control values>"
-msgstr ""
-"sink_name=<name for the sink> sink_properties=<properties for the sink> "
-"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
-"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
-"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
-"input control values>"
+msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
+msgstr ""
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
 msgstr ""
 
 #: ../src/modules/module-null-sink.c:291
+#, fuzzy
 msgid "Null Output"
-msgstr ""
+msgstr "輸出端 %s"
 
 #: ../src/pulsecore/sink.c:2613
 msgid "Internal Audio"
-msgstr ""
+msgstr "內部音效"
 
 #: ../src/pulsecore/sink.c:2618
 msgid "Modem"
-msgstr ""
+msgstr "數據機"
 
 #: ../src/daemon/ltdl-bind-now.c:124
 msgid "Failed to find original lt_dlopen loader."
-msgstr ""
+msgstr "無法尋找到原始的 lt_dlopen 載入器。"
 
 #: ../src/daemon/ltdl-bind-now.c:129
 msgid "Failed to allocate new dl loader."
-msgstr ""
+msgstr "無法分配新的 dl 載入器。"
 
 #: ../src/daemon/ltdl-bind-now.c:142
 msgid "Failed to add bind-now-loader."
-msgstr ""
+msgstr "無加入 bind-now-loader。"
 
 #: ../src/daemon/main.c:141
 #, c-format
 msgid "Got signal %s."
-msgstr ""
+msgstr "取得信號 %s。"
 
 #: ../src/daemon/main.c:168
 msgid "Exiting."
-msgstr ""
+msgstr "正在離開中。"
 
 #: ../src/daemon/main.c:186
 #, c-format
 msgid "Failed to find user '%s'."
-msgstr ""
+msgstr "找不到使用者「%s」。"
 
 #: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find group '%s'."
-msgstr ""
+msgstr "找不到群組「%s」。"
 
 #: ../src/daemon/main.c:195
 #, c-format
@@ -136,66 +122,65 @@ msgstr ""
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr ""
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:208
+#: ../src/daemon/main.c:213
 #, c-format
 msgid "Failed to create '%s': %s"
-msgstr ""
+msgstr "無法建立「%s」:%s"
 
 #: ../src/daemon/main.c:220
 #, c-format
 msgid "Failed to change group list: %s"
-msgstr ""
+msgstr "無法變更群組清單:%s"
 
 #: ../src/daemon/main.c:236
 #, c-format
 msgid "Failed to change GID: %s"
-msgstr ""
+msgstr "無法變更群組 ID:%s"
 
 #: ../src/daemon/main.c:252
 #, c-format
 msgid "Failed to change UID: %s"
-msgstr ""
+msgstr "無法變更使用者 ID:%s"
 
 #: ../src/daemon/main.c:271
 msgid "Successfully dropped root privileges."
-msgstr ""
+msgstr "成功地去除 root 權力。"
 
 #: ../src/daemon/main.c:279
 msgid "System wide mode unsupported on this platform."
-msgstr ""
+msgstr "在此平台上尚未支援系統全域模式。"
 
 #: ../src/daemon/main.c:297
-#, c-format
+#, fuzzy, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
-msgstr ""
+msgstr "磁碟分割失敗:%s"
 
 #: ../src/daemon/main.c:474
 msgid "Failed to parse command line."
-msgstr ""
+msgstr "解析命令列失敗。"
 
 #: ../src/daemon/main.c:541
 msgid "Daemon not running"
-msgstr ""
+msgstr "幕後程式尚未執行中"
 
 #: ../src/daemon/main.c:543
 #, c-format
 msgid "Daemon running as PID %u"
-msgstr ""
+msgstr "幕後程式正在以 PID %u  執行中"
 
 #: ../src/daemon/main.c:553
 #, c-format
 msgid "Failed to kill daemon: %s"
-msgstr ""
+msgstr "無法終止幕後程式:%s"
 
 #: ../src/daemon/main.c:571
-msgid ""
-"This program is not intended to be run as root (unless --system is "
-"specified)."
+msgid "This program is not intended to be run as root (unless --system is specified)."
 msgstr ""
 
 #: ../src/daemon/main.c:573
 msgid "Root privileges required."
-msgstr ""
+msgstr "需要 root 權力。"
 
 #: ../src/daemon/main.c:578
 msgid "--start not supported for system instances."
@@ -218,41 +203,43 @@ msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 
 #: ../src/daemon/main.c:621
+#, fuzzy
 msgid "Failed to acquire stdio."
-msgstr ""
+msgstr "讀取目錄 %s 失敗:%m"
 
 #: ../src/daemon/main.c:627
-#, c-format
+#, fuzzy, c-format
 msgid "pipe failed: %s"
-msgstr ""
+msgstr "磁碟分割失敗:%s"
 
 #: ../src/daemon/main.c:632
-#, c-format
+#, fuzzy, c-format
 msgid "fork() failed: %s"
-msgstr ""
+msgstr "磁碟分割失敗:%s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
-#, c-format
+#: ../src/daemon/main.c:646
+#: ../src/utils/pacat.c:508
+#, fuzzy, c-format
 msgid "read() failed: %s"
-msgstr ""
+msgstr "讀取目錄 %s 失敗:%m"
 
 #: ../src/daemon/main.c:652
 msgid "Daemon startup failed."
-msgstr ""
+msgstr "幕後程式啟動失敗。"
 
 #: ../src/daemon/main.c:654
 msgid "Daemon startup successful."
-msgstr ""
+msgstr "幕後程式啟動成功。"
 
 #: ../src/daemon/main.c:731
 #, c-format
 msgid "This is PulseAudio %s"
-msgstr ""
+msgstr "這是 PulseAudio %s"
 
 #: ../src/daemon/main.c:732
-#, c-format
+#, fuzzy, c-format
 msgid "Compilation host: %s"
-msgstr ""
+msgstr "主機(host:port)"
 
 #: ../src/daemon/main.c:733
 #, c-format
@@ -260,14 +247,14 @@ msgid "Compilation CFLAGS: %s"
 msgstr ""
 
 #: ../src/daemon/main.c:736
-#, c-format
+#, fuzzy, c-format
 msgid "Running on host: %s"
-msgstr ""
+msgstr "%s %s 安裝在主機 %s"
 
 #: ../src/daemon/main.c:739
 #, c-format
 msgid "Found %u CPUs."
-msgstr ""
+msgstr "找到 %u 個 CPU。"
 
 #: ../src/daemon/main.c:741
 #, c-format
@@ -276,24 +263,24 @@ msgstr ""
 
 #: ../src/daemon/main.c:744
 msgid "Compiled with Valgrind support: yes"
-msgstr ""
+msgstr "以 Valgrind 支援進行編譯:是"
 
 #: ../src/daemon/main.c:746
 msgid "Compiled with Valgrind support: no"
-msgstr ""
+msgstr "以 Valgrind 支援進行編譯:否"
 
 #: ../src/daemon/main.c:749
 #, c-format
 msgid "Running in valgrind mode: %s"
-msgstr ""
+msgstr "正在以 valgrind 模式執行中:%s"
 
 #: ../src/daemon/main.c:752
 msgid "Optimized build: yes"
-msgstr ""
+msgstr "最佳化的建構版本:是"
 
 #: ../src/daemon/main.c:754
 msgid "Optimized build: no"
-msgstr ""
+msgstr "最佳化的建構版本:否"
 
 #: ../src/daemon/main.c:758
 msgid "NDEBUG defined, all asserts disabled."
@@ -304,51 +291,49 @@ msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr ""
 
 #: ../src/daemon/main.c:762
+#, fuzzy
 msgid "All asserts enabled."
-msgstr ""
+msgstr "未啟用任何軟體套件庫"
 
 #: ../src/daemon/main.c:766
 msgid "Failed to get machine ID"
-msgstr ""
+msgstr "無法取得機器 ID"
 
 #: ../src/daemon/main.c:769
 #, c-format
 msgid "Machine ID is %s."
-msgstr ""
+msgstr "機器 ID 為 %s。"
 
 #: ../src/daemon/main.c:773
 #, c-format
 msgid "Session ID is %s."
-msgstr ""
+msgstr "作業階段 ID 為 %s。"
 
 #: ../src/daemon/main.c:779
-#, c-format
+#, fuzzy, c-format
 msgid "Using runtime directory %s."
-msgstr ""
+msgstr "存放映像檔的目錄:"
 
 #: ../src/daemon/main.c:784
-#, c-format
+#, fuzzy, c-format
 msgid "Using state directory %s."
-msgstr ""
+msgstr "存放映像檔的目錄:"
 
 #: ../src/daemon/main.c:787
-#, c-format
+#, fuzzy, c-format
 msgid "Using modules directory %s."
-msgstr ""
+msgstr "存放映像檔的目錄:"
 
 #: ../src/daemon/main.c:789
-#, c-format
+#, fuzzy, c-format
 msgid "Running in system mode: %s"
-msgstr ""
+msgstr "在命令列模式不可有一個問號!"
 
 #: ../src/daemon/main.c:792
 msgid ""
-"OK, so you are running PA in system mode. Please note that you most likely "
-"shouldn't be doing that.\n"
-"If you do it nonetheless then it's your own fault if things don't work as "
-"expected.\n"
-"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
-"explanation why system mode is usually a bad idea."
+"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."
 msgstr ""
 
 #: ../src/daemon/main.c:809
@@ -360,9 +345,7 @@ msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr ""
 
 #: ../src/daemon/main.c:821
-msgid ""
-"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
-"resolution timers enabled!"
+msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
 msgstr ""
 
 #: ../src/daemon/main.c:844
@@ -371,7 +354,7 @@ msgstr ""
 
 #: ../src/daemon/main.c:904
 msgid "Failed to initialize daemon."
-msgstr ""
+msgstr "初始化幕後程式失敗。"
 
 #: ../src/daemon/main.c:909
 msgid "Daemon startup without any loaded modules, refusing to work."
@@ -379,15 +362,15 @@ msgstr ""
 
 #: ../src/daemon/main.c:926
 msgid "Daemon startup complete."
-msgstr ""
+msgstr "幕後程式啟動完成。"
 
 #: ../src/daemon/main.c:932
 msgid "Daemon shutdown initiated."
-msgstr ""
+msgstr "已開始關閉幕後程式。"
 
 #: ../src/daemon/main.c:954
 msgid "Daemon terminated."
-msgstr ""
+msgstr "幕後程式已終止。"
 
 #: ../src/daemon/cmdline.c:115
 #, c-format
@@ -400,48 +383,37 @@ 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"
@@ -452,12 +424,10 @@ 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"
@@ -472,9 +442,7 @@ msgid "--fail expects boolean argument"
 msgstr ""
 
 #: ../src/daemon/cmdline.c:264
-msgid ""
-"--log-level expects log level argument (either numeric in range 0..4 or one "
-"of 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 ""
 
 #: ../src/daemon/cmdline.c:276
@@ -499,7 +467,7 @@ msgstr ""
 
 #: ../src/daemon/cmdline.c:321
 msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
-msgstr ""
+msgstr "無效的紀錄目標:請使用「syslog」、「stderr」或是「auto」。"
 
 #: ../src/daemon/cmdline.c:328
 msgid "--log-time expects boolean argument"
@@ -512,7 +480,7 @@ msgstr ""
 #: ../src/daemon/cmdline.c:354
 #, c-format
 msgid "Invalid resample method '%s'."
-msgstr ""
+msgstr "無效的重新取樣方法「%s」。"
 
 #: ../src/daemon/cmdline.c:361
 msgid "--system expects boolean argument"
@@ -529,67 +497,67 @@ msgstr ""
 #: ../src/daemon/dumpmodules.c:60
 #, c-format
 msgid "Name: %s\n"
-msgstr ""
+msgstr "名稱:%s\n"
 
 #: ../src/daemon/dumpmodules.c:63
 #, c-format
 msgid "No module information available\n"
-msgstr ""
+msgstr "沒有可用的模組資訊\n"
 
 #: ../src/daemon/dumpmodules.c:66
 #, c-format
 msgid "Version: %s\n"
-msgstr ""
+msgstr "版本:%s\n"
 
 #: ../src/daemon/dumpmodules.c:68
 #, c-format
 msgid "Description: %s\n"
-msgstr ""
+msgstr "描述:%s\n"
 
 #: ../src/daemon/dumpmodules.c:70
 #, c-format
 msgid "Author: %s\n"
-msgstr ""
+msgstr "作者:%s\n"
 
 #: ../src/daemon/dumpmodules.c:72
 #, c-format
 msgid "Usage: %s\n"
-msgstr ""
+msgstr "使用率:%s\n"
 
 #: ../src/daemon/dumpmodules.c:73
-#, c-format
+#, fuzzy, c-format
 msgid "Load Once: %s\n"
-msgstr ""
+msgstr "載入另一張碟片"
 
 #: ../src/daemon/dumpmodules.c:75
-#, c-format
+#, fuzzy, c-format
 msgid "DEPRECATION WARNING: %s\n"
-msgstr ""
+msgstr "磁碟分割警告"
 
 #: ../src/daemon/dumpmodules.c:79
 #, c-format
 msgid "Path: %s\n"
-msgstr ""
+msgstr "路徑:%s\n"
 
 #: ../src/daemon/daemon-conf.c:232
-#, c-format
+#, fuzzy, c-format
 msgid "[%s:%u] Invalid log target '%s'."
-msgstr ""
+msgstr "設成預設開機目標 (_T)"
 
 #: ../src/daemon/daemon-conf.c:248
-#, c-format
+#, fuzzy, c-format
 msgid "[%s:%u] Invalid log level '%s'."
-msgstr ""
+msgstr "無效的錯誤資訊"
 
 #: ../src/daemon/daemon-conf.c:264
-#, c-format
+#, fuzzy, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
-msgstr ""
+msgstr "未知的 Url 方法 %s"
 
 #: ../src/daemon/daemon-conf.c:287
-#, c-format
+#, fuzzy, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
-msgstr ""
+msgstr "無效的金鑰"
 
 #: ../src/daemon/daemon-conf.c:294
 #, c-format
@@ -597,49 +565,47 @@ msgid "[%s:%u] rlimit not supported on this platform."
 msgstr ""
 
 #: ../src/daemon/daemon-conf.c:310
-#, c-format
+#, fuzzy, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
-msgstr ""
+msgstr "要格式化為 Swap 分割區嗎?"
 
 #: ../src/daemon/daemon-conf.c:328
-#, c-format
+#, fuzzy, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
-msgstr ""
+msgstr "無效的錯誤資訊"
 
 #: ../src/daemon/daemon-conf.c:352
-#, c-format
+#, fuzzy, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
-msgstr ""
+msgstr "無效的錯誤資訊"
 
 #: ../src/daemon/daemon-conf.c:370
-#, c-format
+#, fuzzy, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
-msgstr ""
+msgstr "無效的錯誤資訊"
 
 #: ../src/daemon/daemon-conf.c:388
-#, c-format
+#, fuzzy, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
-msgstr ""
+msgstr "無效的錯誤資訊"
 
 #: ../src/daemon/daemon-conf.c:406
-#, c-format
+#, fuzzy, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
-msgstr ""
+msgstr "輸入的分割區大小無效"
 
 #: ../src/daemon/daemon-conf.c:424
-#, c-format
+#, fuzzy, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
-msgstr ""
+msgstr "無效的錯誤資訊"
 
 #: ../src/daemon/daemon-conf.c:546
-#, c-format
+#, fuzzy, c-format
 msgid "Failed to open configuration file: %s"
-msgstr ""
+msgstr "從檔案載入驅動程式碟片失敗。"
 
 #: ../src/daemon/daemon-conf.c:562
-msgid ""
-"The specified default channel map has a different number of channels than "
-"the specified default number of channels."
+msgid "The specified default channel map has a different number of channels than the specified default number of channels."
 msgstr ""
 
 #: ../src/daemon/daemon-conf.c:638
@@ -648,20 +614,22 @@ msgid "### Read from configuration file: %s ###\n"
 msgstr ""
 
 #: ../src/daemon/caps.c:62
+#, fuzzy
 msgid "Cleaning up privileges."
-msgstr ""
+msgstr "設定套件庫時發生錯誤"
 
 #: ../src/daemon/pulseaudio.desktop.in.h:1
 msgid "PulseAudio Sound System"
-msgstr ""
+msgstr "PulseAudio 音效系統"
 
 #: ../src/daemon/pulseaudio.desktop.in.h:2
 msgid "Start the PulseAudio Sound System"
-msgstr ""
+msgstr "啟動 PulseAudio 音效系統"
 
-#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757
+#: ../src/pulse/channelmap.c:105
+#: ../src/pulse/channelmap.c:757
 msgid "Mono"
-msgstr ""
+msgstr "單聲道"
 
 #: ../src/pulse/channelmap.c:107
 msgid "Front Center"
@@ -709,7 +677,7 @@ msgstr ""
 
 #: ../src/pulse/channelmap.c:123
 msgid "Auxiliary 0"
-msgstr ""
+msgstr "輔助輸入 0"
 
 #: ../src/pulse/channelmap.c:124
 msgid "Auxiliary 1"
@@ -863,83 +831,87 @@ msgstr ""
 msgid "Top Rear Right"
 msgstr ""
 
-#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170
-#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321
-#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371
+#: ../src/pulse/channelmap.c:484
+#: ../src/pulse/sample.c:170
+#: ../src/pulse/volume.c:295
+#: ../src/pulse/volume.c:321
+#: ../src/pulse/volume.c:341
+#: ../src/pulse/volume.c:371
 msgid "(invalid)"
-msgstr ""
+msgstr "(無效)"
 
 #: ../src/pulse/channelmap.c:761
 msgid "Stereo"
-msgstr ""
+msgstr "立體聲"
 
 #: ../src/pulse/channelmap.c:766
 msgid "Surround 4.0"
-msgstr ""
+msgstr "環繞音效 4.0"
 
 #: ../src/pulse/channelmap.c:772
 msgid "Surround 4.1"
-msgstr ""
+msgstr "環繞音效 4.1"
 
 #: ../src/pulse/channelmap.c:778
 msgid "Surround 5.0"
-msgstr ""
+msgstr "環繞音效 5.0"
 
 #: ../src/pulse/channelmap.c:784
 msgid "Surround 5.1"
-msgstr ""
+msgstr "環繞音效 5.1"
 
 #: ../src/pulse/channelmap.c:791
 msgid "Surround 7.1"
-msgstr ""
+msgstr "環繞音效 7.1"
 
 #: ../src/pulse/error.c:43
 msgid "OK"
-msgstr ""
+msgstr "確認"
 
 #: ../src/pulse/error.c:44
 msgid "Access denied"
-msgstr ""
+msgstr "存取受拒"
 
 #: ../src/pulse/error.c:45
 msgid "Unknown command"
-msgstr ""
+msgstr "未知的指令"
 
 #: ../src/pulse/error.c:46
 msgid "Invalid argument"
-msgstr ""
+msgstr "無效的參數"
 
 #: ../src/pulse/error.c:47
 msgid "Entity exists"
 msgstr ""
 
 #: ../src/pulse/error.c:48
+#, fuzzy
 msgid "No such entity"
-msgstr ""
+msgstr "沒有可用的網路"
 
 #: ../src/pulse/error.c:49
 msgid "Connection refused"
-msgstr ""
+msgstr "連接受拒"
 
 #: ../src/pulse/error.c:50
 msgid "Protocol error"
-msgstr ""
+msgstr "協定錯誤"
 
 #: ../src/pulse/error.c:51
 msgid "Timeout"
-msgstr ""
+msgstr "逾時"
 
 #: ../src/pulse/error.c:52
 msgid "No authorization key"
-msgstr ""
+msgstr "沒有授權金鑰"
 
 #: ../src/pulse/error.c:53
 msgid "Internal error"
-msgstr ""
+msgstr "內部錯誤"
 
 #: ../src/pulse/error.c:54
 msgid "Connection terminated"
-msgstr ""
+msgstr "連接已終止"
 
 #: ../src/pulse/error.c:55
 msgid "Entity killed"
@@ -947,55 +919,61 @@ msgstr ""
 
 #: ../src/pulse/error.c:56
 msgid "Invalid server"
-msgstr ""
+msgstr "無效的伺服器"
 
 #: ../src/pulse/error.c:57
 msgid "Module initalization failed"
-msgstr ""
+msgstr "模組初始化失敗"
 
 #: ../src/pulse/error.c:58
 msgid "Bad state"
-msgstr ""
+msgstr "不良的狀態"
 
 #: ../src/pulse/error.c:59
 msgid "No data"
-msgstr ""
+msgstr "無資料"
 
 #: ../src/pulse/error.c:60
 msgid "Incompatible protocol version"
-msgstr ""
+msgstr "不相容的協定版本"
 
 #: ../src/pulse/error.c:61
 msgid "Too large"
-msgstr ""
+msgstr "太大"
 
 #: ../src/pulse/error.c:62
 msgid "Not supported"
-msgstr ""
+msgstr "未支援"
 
 #: ../src/pulse/error.c:63
 msgid "Unknown error code"
-msgstr ""
+msgstr "未知的錯誤碼"
 
 #: ../src/pulse/error.c:64
+#, fuzzy
 msgid "No such extension"
-msgstr ""
+msgstr "沒有可用的網路"
 
 #: ../src/pulse/error.c:65
 msgid "Obsolete functionality"
-msgstr ""
+msgstr "棄用的功能"
 
 #: ../src/pulse/error.c:66
+#, fuzzy
 msgid "Missing implementation"
-msgstr ""
+msgstr "找不到套件"
 
 #: ../src/pulse/error.c:67
 msgid "Client forked"
 msgstr ""
 
 #: ../src/pulse/error.c:68
+#, fuzzy
 msgid "Input/Output error"
 msgstr ""
+"重新設調整分割區 %s 的大小時發生錯誤。\n"
+"\n"
+"%s"
 
 #: ../src/pulse/error.c:69
 msgid "Device or resource busy"
@@ -1026,18 +1004,20 @@ msgstr ""
 msgid "%u B"
 msgstr ""
 
-#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100
+#: ../src/pulse/client-conf-x11.c:55
+#: ../src/utils/pax11publish.c:100
+#, fuzzy
 msgid "XOpenDisplay() failed"
-msgstr ""
+msgstr "磁碟分割失敗:%s"
 
 #: ../src/pulse/client-conf-x11.c:93
 msgid "Failed to parse cookie data"
 msgstr ""
 
 #: ../src/pulse/client-conf.c:111
-#, c-format
+#, fuzzy, c-format
 msgid "Failed to open configuration file '%s': %s"
-msgstr ""
+msgstr "從檔案載入驅動程式碟片失敗。"
 
 #: ../src/pulse/context.c:550
 msgid "No cookie loaded. Attempting to connect without."
@@ -1059,17 +1039,18 @@ msgid "Received message for unknown extension '%s'"
 msgstr ""
 
 #: ../src/utils/pacat.c:108
-#, c-format
+#, fuzzy, c-format
 msgid "Failed to drain stream: %s"
-msgstr ""
+msgstr "讀取目錄 %s 失敗:%m"
 
 #: ../src/utils/pacat.c:113
 msgid "Playback stream drained."
 msgstr ""
 
 #: ../src/utils/pacat.c:123
+#, fuzzy
 msgid "Draining connection to server."
-msgstr ""
+msgstr "傳送至遠端伺服器(scp)"
 
 #: ../src/utils/pacat.c:136
 #, c-format
@@ -1086,14 +1067,16 @@ msgstr ""
 msgid "pa_stream_begin_write() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:237
+#: ../src/utils/pacat.c:267
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr ""
 
 #: ../src/utils/pacat.c:307
+#, fuzzy
 msgid "Stream successfully created."
-msgstr ""
+msgstr "串流已成功建立\n"
 
 #: ../src/utils/pacat.c:310
 #, c-format
@@ -1111,39 +1094,39 @@ msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr ""
 
 #: ../src/utils/pacat.c:321
-#, c-format
+#, fuzzy, c-format
 msgid "Using sample spec '%s', channel map '%s'."
-msgstr ""
+msgstr "正使用取樣規格「%s」\n"
 
 #: ../src/utils/pacat.c:325
-#, c-format
+#, fuzzy, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
-msgstr ""
+msgstr "選取要載入的裝置驅動程式"
 
 #: ../src/utils/pacat.c:335
-#, c-format
+#, fuzzy, c-format
 msgid "Stream error: %s"
-msgstr ""
+msgstr "設定分割區錯誤"
 
 #: ../src/utils/pacat.c:345
-#, c-format
+#, fuzzy, c-format
 msgid "Stream device suspended.%s"
-msgstr ""
+msgstr "編輯 RAID 裝置"
 
 #: ../src/utils/pacat.c:347
-#, c-format
+#, fuzzy, c-format
 msgid "Stream device resumed.%s"
-msgstr ""
+msgstr "編輯 RAID 裝置"
 
 #: ../src/utils/pacat.c:355
-#, c-format
+#, fuzzy, c-format
 msgid "Stream underrun.%s"
-msgstr ""
+msgstr "串流錯誤:%s\n"
 
 #: ../src/utils/pacat.c:362
-#, c-format
+#, fuzzy, c-format
 msgid "Stream overrun.%s"
-msgstr ""
+msgstr "串流錯誤:%s\n"
 
 #: ../src/utils/pacat.c:369
 #, c-format
@@ -1156,8 +1139,9 @@ msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr ""
 
 #: ../src/utils/pacat.c:376
+#, fuzzy
 msgid "not "
-msgstr ""
+msgstr "找不到 %s"
 
 #: ../src/utils/pacat.c:383
 #, c-format
@@ -1165,9 +1149,9 @@ msgid "Stream buffer attributes changed.%s"
 msgstr ""
 
 #: ../src/utils/pacat.c:415
-#, c-format
+#, fuzzy, c-format
 msgid "Connection established.%s"
-msgstr ""
+msgstr "正在等候 telnet 連線..."
 
 #: ../src/utils/pacat.c:418
 #, c-format
@@ -1184,28 +1168,31 @@ msgstr ""
 msgid "pa_stream_connect_record() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
-#, c-format
+#: ../src/utils/pacat.c:470
+#: ../src/utils/pactl.c:857
+#, fuzzy, c-format
 msgid "Connection failure: %s"
-msgstr ""
+msgstr "指令稿小程式失敗"
 
 #: ../src/utils/pacat.c:503
+#, fuzzy
 msgid "Got EOF."
-msgstr ""
+msgstr "取得檔案結尾 (EOF)。\n"
 
 #: ../src/utils/pacat.c:540
-#, c-format
+#, fuzzy, c-format
 msgid "write() failed: %s"
-msgstr ""
+msgstr "磁碟分割失敗:%s"
 
 #: ../src/utils/pacat.c:561
+#, fuzzy
 msgid "Got signal, exiting."
-msgstr ""
+msgstr "取得訊號,正在離開。\n"
 
 #: ../src/utils/pacat.c:575
-#, c-format
+#, fuzzy, c-format
 msgid "Failed to get latency: %s"
-msgstr ""
+msgstr "讀取目錄 %s 失敗:%m"
 
 #: ../src/utils/pacat.c:580
 #, c-format
@@ -1230,48 +1217,29 @@ 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, "
-"s24le, s24be,\n"
-"                                        s24-32le, s24-32be (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, s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, 2 for stereo\n"
 "                                        (defaults to 2)\n"
-"      --channel-map=CHANNELMAP          Channel map to use instead of the "
-"default\n"
-"      --fix-format                      Take the sample format from the sink "
-"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"
-"      --property=PROPERTY=VALUE         Set the specified property to the "
-"specified value.\n"
+"      --no-remap                        Map channels by index instead of name.\n"
+"      --latency=BYTES                   Request the specified latency in bytes.\n"
+"      --process-time=BYTES              Request the specified process time per request in bytes.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
 "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
@@ -1285,44 +1253,46 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
-#, c-format
+#: ../src/utils/pacat.c:764
+#: ../src/utils/pactl.c:953
+#, fuzzy, c-format
 msgid "Invalid client name '%s'"
-msgstr ""
+msgstr "Initiator 名稱無效"
 
 #: ../src/utils/pacat.c:779
-#, c-format
+#, fuzzy, c-format
 msgid "Invalid stream name '%s'"
-msgstr ""
+msgstr "Initiator 名稱無效"
 
 #: ../src/utils/pacat.c:816
-#, c-format
+#, fuzzy, c-format
 msgid "Invalid channel map '%s'"
-msgstr ""
+msgstr "無效的錯誤資訊"
 
 #: ../src/utils/pacat.c:845
-#, c-format
+#, fuzzy, c-format
 msgid "Invalid latency specification '%s'"
-msgstr ""
+msgstr "無效的錯誤資訊"
 
 #: ../src/utils/pacat.c:852
-#, c-format
+#, fuzzy, c-format
 msgid "Invalid process time specification '%s'"
-msgstr ""
+msgstr "無效的重新取樣方法「%s」。"
 
 #: ../src/utils/pacat.c:864
-#, c-format
+#, fuzzy, c-format
 msgid "Invalid property '%s'"
-msgstr ""
+msgstr "無效的金鑰"
 
 #: ../src/utils/pacat.c:881
-#, c-format
+#, fuzzy, c-format
 msgid "Unknown file format %s."
-msgstr ""
+msgstr "要格式化為 Swap 分割區嗎?"
 
 #: ../src/utils/pacat.c:900
+#, fuzzy
 msgid "Invalid sample specification"
-msgstr ""
+msgstr "無效的錯誤資訊"
 
 #: ../src/utils/pacat.c:910
 #, c-format
@@ -1335,34 +1305,38 @@ msgid "dup2(): %s"
 msgstr ""
 
 #: ../src/utils/pacat.c:922
+#, fuzzy
 msgid "Too many arguments."
-msgstr ""
+msgstr "太多備援磁碟機"
 
 #: ../src/utils/pacat.c:933
+#, fuzzy
 msgid "Failed to generate sample specification for file."
-msgstr ""
+msgstr "無法載入客戶端配置檔。\n"
 
 #: ../src/utils/pacat.c:953
+#, fuzzy
 msgid "Failed to open audio file."
-msgstr ""
+msgstr "從檔案載入驅動程式碟片失敗。"
 
 #: ../src/utils/pacat.c:959
-msgid ""
-"Warning: specified sample specification will be overwritten with "
-"specification from file."
+msgid "Warning: specified sample specification will be overwritten with specification from file."
 msgstr ""
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:962
+#: ../src/utils/pactl.c:997
+#, fuzzy
 msgid "Failed to determine sample specification from file."
-msgstr ""
+msgstr "無法載入客戶端配置檔。\n"
 
 #: ../src/utils/pacat.c:971
 msgid "Warning: Failed to determine channel map from file."
 msgstr ""
 
 #: ../src/utils/pacat.c:982
+#, fuzzy
 msgid "Channel map doesn't match sample specification"
-msgstr ""
+msgstr "頻道對應表不符合檔案。\n"
 
 #: ../src/utils/pacat.c:993
 msgid "Warning: failed to write channel map to file."
@@ -1375,25 +1349,29 @@ msgstr ""
 
 #: ../src/utils/pacat.c:1009
 msgid "recording"
-msgstr ""
+msgstr "正在錄製"
 
 #: ../src/utils/pacat.c:1009
 msgid "playback"
-msgstr ""
+msgstr "播放控制"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1035
+#: ../src/utils/pactl.c:1267
 msgid "pa_mainloop_new() failed."
 msgstr ""
 
 #: ../src/utils/pacat.c:1054
+#, fuzzy
 msgid "io_new() failed."
-msgstr ""
+msgstr "LVM 操作失敗"
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1061
+#: ../src/utils/pactl.c:1279
 msgid "pa_context_new() failed."
 msgstr ""
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1069
+#: ../src/utils/pactl.c:1285
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr ""
@@ -1402,7 +1380,8 @@ msgstr ""
 msgid "pa_context_rttime_new() failed."
 msgstr ""
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1082
+#: ../src/utils/pactl.c:1290
 msgid "pa_mainloop_run() failed."
 msgstr ""
 
@@ -1417,14 +1396,14 @@ msgid "execvp(): %s\n"
 msgstr ""
 
 #: ../src/utils/pasuspender.c:109
-#, c-format
+#, fuzzy, c-format
 msgid "Failure to suspend: %s\n"
-msgstr ""
+msgstr "無法登入"
 
 #: ../src/utils/pasuspender.c:124
-#, c-format
+#, fuzzy, c-format
 msgid "Failure to resume: %s\n"
-msgstr ""
+msgstr "無法登入"
 
 #: ../src/utils/pasuspender.c:147
 #, c-format
@@ -1432,9 +1411,9 @@ msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr ""
 
 #: ../src/utils/pasuspender.c:159
-#, c-format
+#, fuzzy, c-format
 msgid "Connection failure: %s\n"
-msgstr ""
+msgstr "指令稿小程式失敗"
 
 #: ../src/utils/pasuspender.c:176
 #, c-format
@@ -1453,8 +1432,7 @@ 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 ""
 
@@ -1482,9 +1460,9 @@ msgid "pa_mainloop_run() failed.\n"
 msgstr ""
 
 #: ../src/utils/pactl.c:135
-#, c-format
+#, fuzzy, c-format
 msgid "Failed to get statistics: %s"
-msgstr ""
+msgstr "讀取目錄 %s 失敗:%m"
 
 #: ../src/utils/pactl.c:141
 #, c-format
@@ -1497,14 +1475,14 @@ msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr ""
 
 #: ../src/utils/pactl.c:147
-#, c-format
+#, fuzzy, c-format
 msgid "Sample cache size: %s\n"
-msgstr ""
+msgstr "額外的大小選項"
 
 #: ../src/utils/pactl.c:156
-#, c-format
+#, fuzzy, c-format
 msgid "Failed to get server information: %s"
-msgstr ""
+msgstr "無法取得機器 ID"
 
 #: ../src/utils/pactl.c:164
 #, c-format
@@ -1521,9 +1499,9 @@ msgid ""
 msgstr ""
 
 #: ../src/utils/pactl.c:205
-#, c-format
+#, fuzzy, c-format
 msgid "Failed to get sink information: %s"
-msgstr ""
+msgstr "無法取得機器 ID"
 
 #: ../src/utils/pactl.c:221
 #, c-format
@@ -1547,20 +1525,22 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:268
+#: ../src/utils/pactl.c:360
 #, c-format
 msgid "\tPorts:\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
-#, c-format
+#: ../src/utils/pactl.c:274
+#: ../src/utils/pactl.c:366
+#, fuzzy, c-format
 msgid "\tActive Port: %s\n"
-msgstr ""
+msgstr "主機(host:port)"
 
 #: ../src/utils/pactl.c:297
-#, c-format
+#, fuzzy, c-format
 msgid "Failed to get source information: %s"
-msgstr ""
+msgstr "無法變更群組清單:%s"
 
 #: ../src/utils/pactl.c:313
 #, c-format
@@ -1584,18 +1564,26 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
+#: ../src/utils/pactl.c:345
+#: ../src/utils/pactl.c:401
+#: ../src/utils/pactl.c:436
+#: ../src/utils/pactl.c:473
+#: ../src/utils/pactl.c:532
+#: ../src/utils/pactl.c:533
+#: ../src/utils/pactl.c:543
+#: ../src/utils/pactl.c:587
+#: ../src/utils/pactl.c:588
+#: ../src/utils/pactl.c:594
+#: ../src/utils/pactl.c:637
+#: ../src/utils/pactl.c:638
 #: ../src/utils/pactl.c:645
 msgid "n/a"
-msgstr ""
+msgstr "不存在"
 
 #: ../src/utils/pactl.c:375
-#, c-format
+#, fuzzy, c-format
 msgid "Failed to get module information: %s"
-msgstr ""
+msgstr "無法變更群組清單:%s"
 
 #: ../src/utils/pactl.c:393
 #, c-format
@@ -1609,9 +1597,9 @@ msgid ""
 msgstr ""
 
 #: ../src/utils/pactl.c:412
-#, c-format
+#, fuzzy, c-format
 msgid "Failed to get client information: %s"
-msgstr ""
+msgstr "無法載入客戶端配置檔。\n"
 
 #: ../src/utils/pactl.c:430
 #, c-format
@@ -1624,9 +1612,9 @@ msgid ""
 msgstr ""
 
 #: ../src/utils/pactl.c:447
-#, c-format
+#, fuzzy, c-format
 msgid "Failed to get card information: %s"
-msgstr ""
+msgstr "無法取得機器 ID"
 
 #: ../src/utils/pactl.c:465
 #, c-format
@@ -1650,9 +1638,9 @@ msgid "\tActive Profile: %s\n"
 msgstr ""
 
 #: ../src/utils/pactl.c:496
-#, c-format
+#, fuzzy, c-format
 msgid "Failed to get sink input information: %s"
-msgstr ""
+msgstr "無法終止幕後程式:%s"
 
 #: ../src/utils/pactl.c:515
 #, c-format
@@ -1676,9 +1664,9 @@ msgid ""
 msgstr ""
 
 #: ../src/utils/pactl.c:554
-#, c-format
+#, fuzzy, c-format
 msgid "Failed to get source output information: %s"
-msgstr ""
+msgstr "無法變更群組清單:%s"
 
 #: ../src/utils/pactl.c:574
 #, c-format
@@ -1698,9 +1686,9 @@ msgid ""
 msgstr ""
 
 #: ../src/utils/pactl.c:605
-#, c-format
+#, fuzzy, c-format
 msgid "Failed to get sample information: %s"
-msgstr ""
+msgstr "無法上傳取樣:%s\n"
 
 #: ../src/utils/pactl.c:623
 #, c-format
@@ -1720,23 +1708,26 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
-#, c-format
+#: ../src/utils/pactl.c:653
+#: ../src/utils/pactl.c:663
+#, fuzzy, c-format
 msgid "Failure: %s"
-msgstr ""
+msgstr "指令稿小程式失敗"
 
 #: ../src/utils/pactl.c:687
-#, c-format
+#, fuzzy, c-format
 msgid "Failed to upload sample: %s"
-msgstr ""
+msgstr "讀取目錄 %s 失敗:%m"
 
 #: ../src/utils/pactl.c:704
+#, fuzzy
 msgid "Premature end of file"
-msgstr ""
+msgstr "未經正常程序關機(Dirty)的檔案系統"
 
 #: ../src/utils/pactl.c:863
+#, fuzzy
 msgid "Got SIGINT, exiting."
-msgstr ""
+msgstr "取得訊號,正在離開。\n"
 
 #: ../src/utils/pactl.c:869
 #, c-format
@@ -1766,10 +1757,8 @@ 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 ""
 
 #: ../src/utils/pactl.c:933
@@ -1781,104 +1770,126 @@ msgid ""
 msgstr ""
 
 #: ../src/utils/pactl.c:979
+#, fuzzy
 msgid "Please specify a sample file to load"
-msgstr ""
+msgstr "請指定一份樣本檔以載入\n"
 
 #: ../src/utils/pactl.c:992
+#, fuzzy
 msgid "Failed to open sound file."
-msgstr ""
+msgstr "從檔案載入驅動程式碟片失敗。"
 
 #: ../src/utils/pactl.c:1004
 msgid "Warning: Failed to determine sample specification from file."
 msgstr ""
 
 #: ../src/utils/pactl.c:1014
+#, fuzzy
 msgid "You have to specify a sample name to play"
-msgstr ""
+msgstr "您必須指定要播放的樣本名稱\n"
 
 #: ../src/utils/pactl.c:1026
+#, fuzzy
 msgid "You have to specify a sample name to remove"
-msgstr ""
+msgstr "您必須指定要移除的樣本名稱\n"
 
 #: ../src/utils/pactl.c:1035
+#, fuzzy
 msgid "You have to specify a sink input index and a sink"
-msgstr ""
+msgstr "您必須指定一個來源索引以及一個來源\n"
 
 #: ../src/utils/pactl.c:1045
+#, fuzzy
 msgid "You have to specify a source output index and a source"
-msgstr ""
+msgstr "您必須指定一個來源索引以及一個來源\n"
 
 #: ../src/utils/pactl.c:1060
+#, fuzzy
 msgid "You have to specify a module name and arguments."
-msgstr ""
+msgstr "您必須指定一個模組名稱與參數。\n"
 
 #: ../src/utils/pactl.c:1080
+#, fuzzy
 msgid "You have to specify a module index"
-msgstr ""
+msgstr "您必須指定一個模組索引\n"
 
 #: ../src/utils/pactl.c:1090
+#, fuzzy
 msgid "You may not specify more than one sink. You have to specify a boolean value."
-msgstr ""
+msgstr "你可能無法指定一個以上的來源。您必須指定一個布林值。\n"
 
 #: ../src/utils/pactl.c:1103
-msgid ""
-"You may not specify more than one source. You have to specify a boolean "
-"value."
-msgstr ""
+#, fuzzy
+msgid "You may not specify more than one source. You have to specify a boolean value."
+msgstr "你可能無法指定一個以上的來源。您必須指定一個布林值。\n"
 
 #: ../src/utils/pactl.c:1115
+#, fuzzy
 msgid "You have to specify a card name/index and a profile name"
-msgstr ""
+msgstr "您必須指定一個模組名稱與參數。\n"
 
 #: ../src/utils/pactl.c:1126
+#, fuzzy
 msgid "You have to specify a sink name/index and a port name"
-msgstr ""
+msgstr "您必須指定一個來源索引以及一個來源\n"
 
 #: ../src/utils/pactl.c:1137
+#, fuzzy
 msgid "You have to specify a source name/index and a port name"
-msgstr ""
+msgstr "您必須指定一個來源索引以及一個來源\n"
 
 #: ../src/utils/pactl.c:1149
+#, fuzzy
 msgid "You have to specify a sink name/index and a volume"
-msgstr ""
-
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+msgstr "您必須指定一個來源索引以及一個來源\n"
+
+#: ../src/utils/pactl.c:1154
+#: ../src/utils/pactl.c:1171
+#: ../src/utils/pactl.c:1193
+#: ../src/utils/pactl.c:1209
+#: ../src/utils/pactl.c:1226
+#: ../src/utils/pactl.c:1248
+#, fuzzy
 msgid "Invalid volume specification"
-msgstr ""
+msgstr "邏輯卷冊名稱:"
 
 #: ../src/utils/pactl.c:1166
+#, fuzzy
 msgid "You have to specify a source name/index and a volume"
-msgstr ""
+msgstr "您必須指定一個來源索引以及一個來源\n"
 
 #: ../src/utils/pactl.c:1183
+#, fuzzy
 msgid "You have to specify a sink input index and a volume"
-msgstr ""
+msgstr "您必須指定一個來源索引以及一個來源\n"
 
 #: ../src/utils/pactl.c:1188
 msgid "Invalid sink input index"
 msgstr ""
 
 #: ../src/utils/pactl.c:1204
+#, fuzzy
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr ""
+msgstr "您必須指定要播放的樣本名稱\n"
 
 #: ../src/utils/pactl.c:1221
+#, fuzzy
 msgid "You have to specify a source name/index and a mute boolean"
-msgstr ""
+msgstr "您必須指定一個來源索引以及一個來源\n"
 
 #: ../src/utils/pactl.c:1238
+#, fuzzy
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr ""
+msgstr "您必須指定一個來源索引以及一個來源\n"
 
 #: ../src/utils/pactl.c:1243
 msgid "Invalid sink input index specification"
 msgstr ""
 
 #: ../src/utils/pactl.c:1262
+#, fuzzy
 msgid "No valid command specified."
-msgstr ""
+msgstr "在網路指令中指定了不良的 bootproto %s"
 
 #: ../src/utils/pax11publish.c:61
 #, c-format
@@ -1887,25 +1898,24 @@ 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 ""
 
 #: ../src/utils/pax11publish.c:94
 #, c-format
 msgid "Failed to parse command line.\n"
-msgstr ""
+msgstr "無法分析命令列。\n"
 
 #: ../src/utils/pax11publish.c:108
 #, c-format
 msgid "Server: %s\n"
-msgstr ""
+msgstr "伺服器:%s\n"
 
 #: ../src/utils/pax11publish.c:110
 #, c-format
 msgid "Source: %s\n"
-msgstr ""
+msgstr "來源:%s\n"
 
 #: ../src/utils/pax11publish.c:112
 #, c-format
@@ -1920,37 +1930,37 @@ msgstr ""
 #: ../src/utils/pax11publish.c:132
 #, c-format
 msgid "Failed to parse cookie data\n"
-msgstr ""
+msgstr "無法解析 cookie 資料\n"
 
 #: ../src/utils/pax11publish.c:137
 #, c-format
 msgid "Failed to save cookie data\n"
-msgstr ""
+msgstr "無法儲存 cookie 資料\n"
 
 #: ../src/utils/pax11publish.c:152
 #, c-format
 msgid "Failed to load client configuration file.\n"
-msgstr ""
+msgstr "無法載入客戶端配置檔。\n"
 
 #: ../src/utils/pax11publish.c:157
 #, c-format
 msgid "Failed to read environment configuration data.\n"
-msgstr ""
+msgstr "無法讀取環境配置資料。\n"
 
 #: ../src/utils/pax11publish.c:174
 #, c-format
 msgid "Failed to get FQDN.\n"
-msgstr ""
+msgstr "無法取得 FQDN。\n"
 
 #: ../src/utils/pax11publish.c:194
 #, c-format
 msgid "Failed to load cookie data\n"
-msgstr ""
+msgstr "無法載入 cookie 資料\n"
 
 #: ../src/utils/pax11publish.c:211
 #, c-format
 msgid "Not yet implemented.\n"
-msgstr ""
+msgstr "尚未實現。\n"
 
 #: ../src/utils/pacmd.c:69
 msgid "No PulseAudio daemon running, or not running as session daemon."
@@ -1968,92 +1978,96 @@ msgstr ""
 
 #: ../src/utils/pacmd.c:99
 msgid "Failed to kill PulseAudio daemon."
-msgstr ""
+msgstr "無法結束 PulseAudio 幕後程式。"
 
 #: ../src/utils/pacmd.c:107
 msgid "Daemon not responding."
-msgstr ""
+msgstr "幕後程式目前沒有回應。"
 
 #: ../src/utils/pacmd.c:161
 #, c-format
 msgid "poll(): %s"
 msgstr ""
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
-#, c-format
+#: ../src/utils/pacmd.c:171
+#: ../src/utils/pacmd.c:188
+#, fuzzy, c-format
 msgid "read(): %s"
-msgstr ""
+msgstr "唯讀"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:207
+#: ../src/utils/pacmd.c:223
 #, c-format
 msgid "write(): %s"
 msgstr ""
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:136
+#: ../src/pulsecore/lock-autospawn.c:219
 msgid "Cannot access autospawn lock."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
+#: ../src/modules/alsa/alsa-sink.c:530
+#: ../src/modules/alsa/alsa-sink.c:689
 #, c-format
 msgid ""
-"ALSA woke us up to write new data to the device, but there was actually "
-"nothing to write!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers.\n"
-"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
-"returned 0 or another value < min_avail."
+"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
+#: ../src/modules/alsa/alsa-source.c:506
+#: ../src/modules/alsa/alsa-source.c:656
 #, c-format
 msgid ""
-"ALSA woke us up to read new data from the device, but there was actually "
-"nothing to read!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers.\n"
-"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
-"returned 0 or another value < min_avail."
+"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
 msgstr ""
 
 #: ../src/modules/alsa/module-alsa-card.c:152
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2228
 #: ../src/modules/alsa/alsa-mixer.c:2931
 msgid "Off"
-msgstr ""
+msgstr "關閉"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2184
 msgid "High Fidelity Playback (A2DP)"
-msgstr ""
+msgstr "高傳真播放 (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#, fuzzy
 msgid "High Fidelity Capture (A2DP)"
-msgstr ""
+msgstr "高傳真播放 (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2213
 msgid "Telephony Duplex (HSP/HFP)"
-msgstr ""
+msgstr "電話雙絞線 (HSP/HFP)"
 
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
-msgstr ""
+msgstr "PulseAudio 音效伺服器"
 
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
+#, fuzzy
 msgid "Output Devices"
-msgstr ""
+msgstr "找不到裝置"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
+#, fuzzy
 msgid "Input Devices"
-msgstr ""
+msgstr "找不到裝置"
 
 #: ../src/modules/module-rygel-media-server.c:774
+#, fuzzy
 msgid "Audio on @HOSTNAME@"
-msgstr ""
+msgstr "主機名稱錯誤"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
+#, fuzzy
 msgid "Input"
-msgstr ""
+msgstr "輸入端 %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
@@ -2064,8 +2078,9 @@ msgid "Docking Station Microphone"
 msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
+#, fuzzy
 msgid "Line-In"
-msgstr ""
+msgstr "正在進行...   "
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
@@ -2076,8 +2091,9 @@ msgid "External Microphone"
 msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
+#, fuzzy
 msgid "Internal Microphone"
-msgstr ""
+msgstr "內部音效"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
@@ -2088,8 +2104,9 @@ msgid "Video"
 msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
+#, fuzzy
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "自動分割磁碟發生錯誤"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
@@ -2100,144 +2117,200 @@ msgid "Boost"
 msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
+#, fuzzy
 msgid "No Boost"
-msgstr ""
+msgstr "無密碼"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
 msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
+#, fuzzy
 msgid "No Amplifier"
-msgstr ""
+msgstr "無密碼"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
+#, fuzzy
 msgid "Analog Input"
-msgstr ""
+msgstr "類比單聲道"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
+#, fuzzy
 msgid "Analog Microphone"
-msgstr ""
+msgstr "類比單聲道"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
+#, fuzzy
 msgid "Analog Line-In"
-msgstr ""
+msgstr "此分割區正被安裝程式使用。"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
+#, fuzzy
 msgid "Analog Radio"
-msgstr ""
+msgstr "類比單聲道"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
+#, fuzzy
 msgid "Analog Video"
-msgstr ""
+msgstr "類比立體聲"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
+#, fuzzy
 msgid "Analog Output"
-msgstr ""
+msgstr "類比立體聲"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
+#, fuzzy
 msgid "Analog Headphones"
-msgstr ""
+msgstr "類比單聲道"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
 msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
+#, fuzzy
 msgid "Analog Mono Output"
-msgstr ""
+msgstr "類比單聲道"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
 #, c-format
 msgid "%s+%s"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1984
+#: ../src/modules/alsa/alsa-mixer.c:3404
 #, c-format
 msgid "%s / %s"
 msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"
-msgstr ""
+msgstr "類比單聲道"
 
 #: ../src/modules/alsa/alsa-mixer.c:2791
 msgid "Analog Stereo"
-msgstr ""
+msgstr "類比立體聲"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
+#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr ""
+msgstr "類比環繞聲 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
+#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr ""
+msgstr "類比環繞聲 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
+#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr ""
+msgstr "類比環繞聲 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Surround 4.0"
-msgstr ""
+msgstr "類比環繞聲 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Surround 4.1"
-msgstr ""
+msgstr "類比環繞聲 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 5.0"
-msgstr ""
+msgstr "類比環繞聲 5.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 5.1"
-msgstr ""
+msgstr "類比環繞聲 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
+#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr ""
+msgstr "類比環繞聲 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
+#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr ""
+msgstr "類比環繞聲 4.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
+#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr ""
+msgstr "類比環繞聲 4.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 7.1"
-msgstr ""
+msgstr "類比環繞聲 7.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Digital Stereo (IEC958)"
-msgstr ""
+msgstr "數位立體聲 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
+#, fuzzy
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr ""
+msgstr "數位環繞聲 4.0  (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr ""
+msgstr "數位環繞聲 4.0  (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr ""
+msgstr "數位環繞聲 5.1 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Digital Stereo (HDMI)"
-msgstr ""
+msgstr "數位立體聲 (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
+#, fuzzy
 msgid "Analog Mono Duplex"
-msgstr ""
+msgstr "類比單聲道"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
+#, fuzzy
 msgid "Analog Stereo Duplex"
-msgstr ""
+msgstr "類比立體聲"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
+#, fuzzy
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr ""
+msgstr "數位立體聲 (IEC958)"
+
+#~ msgid "Cannot connect to system bus: %s"
+#~ msgstr "無法連接到系統 bus: %s"
+#~ msgid "Cannot get caller from PID: %s"
+#~ msgstr "無法取得來自 PID 的呼叫程式:%s"
+#~ msgid "Cannot set UID on caller object."
+#~ msgstr "無法對呼叫程式器物件設定 UID。"
+#~ msgid "Failed to get CK session."
+#~ msgstr "無法取得 CK 作業階段。"
+#~ msgid "Cannot set UID on session object."
+#~ msgstr "無法在作業階段物件上設定 UID。"
+#~ msgid "Cannot allocate PolKitAction."
+#~ msgstr "無法分配 PolKitAction。"
+#~ msgid "Cannot set action_id"
+#~ msgstr "無法設定 action_id"
+#~ msgid "Cannot allocate PolKitContext."
+#~ msgstr "無法分配 PolKitContext。"
+#~ msgid "Cannot initialize PolKitContext: %s"
+#~ msgstr "無法初始化 PolKitContext:%s"
+#~ msgid "Could not determine whether caller is authorized: %s"
+#~ msgstr "無法決定呼叫程式是否取得授權:%s"
+#~ msgid "Cannot obtain auth: %s"
+#~ msgstr "無法取得權力:%s"
+#~ msgid "PolicyKit responded with '%s'"
+#~ msgstr "PolicyKit 回應了「%s」"
+#~ msgid "Successfully increased RLIMIT_RTPRIO"
+#~ msgstr "成功地增加 RLIMIT_RTPRIO"
+#~ msgid "RLIMIT_RTPRIO failed: %s"
+#~ msgstr "RLIMIT_RTPRIO 失敗:%s"
+#~ msgid "Giving up CAP_NICE"
+#~ msgstr "正在放棄 CAP_NICE"
+#~ msgid "Failed to open file '%s'\n"
+#~ msgstr "無法開啟檔案「%s」\n"
+#~ msgid "Output %s + Input %s"
+#~ msgstr "輸出端 %s + 輸入端 %s"
 

commit c7b284bb8a76ae06ccce2ad526643ca401c0331b
Author: Cheng-Chia Tseng <pswo10680 at gmail.com>
Date:   Fri Feb 19 11:43:57 2010 +0000

    l10n: Updates to Chinese (Taiwan) (zh_TW) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/zh_TW.po b/po/zh_TW.po
index 37aa062..1a08823 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -1,20 +1,21 @@
+# SOME DESCRIPTIVE TITLE.
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
 #
-# Cheng-Chia Tseng <pswo10680 at gmail.com>, 2009.
 msgid ""
 msgstr ""
-"Project-Id-Version: upstream-translations.pulseaudio.zh_TW\n"
+"Project-Id-Version: PulseAudio Volume Control\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-02-05 08:05+0000\n"
-"PO-Revision-Date: 2010-02-05 21:33+0800\n"
+"PO-Revision-Date: 2010-02-19 19:41+0800\n"
 "Last-Translator: Cheng-Chia Tseng <pswo10680 at gmail.com>\n"
-"Language-Team: Chinese Traditional <>\n"
+"Language-Team: zh_TW\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 0.3\n"
-"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Poedit-Language: Chinese\n"
+"X-Poedit-Country: TAIWAN\n"
 
 #: ../src/modules/alsa/alsa-util.c:858
 #: ../src/pulsecore/sink.c:2629
@@ -64,9 +65,8 @@ msgid "Clocked NULL sink"
 msgstr ""
 
 #: ../src/modules/module-null-sink.c:291
-#, fuzzy
 msgid "Null Output"
-msgstr "輸出端 %s"
+msgstr ""
 
 #: ../src/pulsecore/sink.c:2613
 msgid "Internal Audio"
@@ -78,34 +78,34 @@ msgstr "數據機"
 
 #: ../src/daemon/ltdl-bind-now.c:124
 msgid "Failed to find original lt_dlopen loader."
-msgstr "無法尋找到原始的 lt_dlopen 載入器。"
+msgstr ""
 
 #: ../src/daemon/ltdl-bind-now.c:129
 msgid "Failed to allocate new dl loader."
-msgstr "無法分配新的 dl 載入器。"
+msgstr ""
 
 #: ../src/daemon/ltdl-bind-now.c:142
 msgid "Failed to add bind-now-loader."
-msgstr "無加入 bind-now-loader。"
+msgstr ""
 
 #: ../src/daemon/main.c:141
 #, c-format
 msgid "Got signal %s."
-msgstr "取得信號 %s。"
+msgstr ""
 
 #: ../src/daemon/main.c:168
 msgid "Exiting."
-msgstr "正在離開中。"
+msgstr ""
 
 #: ../src/daemon/main.c:186
 #, c-format
 msgid "Failed to find user '%s'."
-msgstr "找不到使用者「%s」。"
+msgstr ""
 
 #: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find group '%s'."
-msgstr "找不到群組「%s」。"
+msgstr ""
 
 #: ../src/daemon/main.c:195
 #, c-format
@@ -126,53 +126,53 @@ msgstr ""
 #: ../src/daemon/main.c:213
 #, c-format
 msgid "Failed to create '%s': %s"
-msgstr "無法建立「%s」:%s"
+msgstr ""
 
 #: ../src/daemon/main.c:220
 #, c-format
 msgid "Failed to change group list: %s"
-msgstr "無法變更群組清單:%s"
+msgstr ""
 
 #: ../src/daemon/main.c:236
 #, c-format
 msgid "Failed to change GID: %s"
-msgstr "無法變更群組 ID:%s"
+msgstr ""
 
 #: ../src/daemon/main.c:252
 #, c-format
 msgid "Failed to change UID: %s"
-msgstr "無法變更使用者 ID:%s"
+msgstr ""
 
 #: ../src/daemon/main.c:271
 msgid "Successfully dropped root privileges."
-msgstr "成功地去除 root 權力。"
+msgstr ""
 
 #: ../src/daemon/main.c:279
 msgid "System wide mode unsupported on this platform."
-msgstr "在此平台上尚未支援系統全域模式。"
+msgstr ""
 
 #: ../src/daemon/main.c:297
-#, fuzzy, c-format
+#, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
-msgstr "磁碟分割失敗:%s"
+msgstr ""
 
 #: ../src/daemon/main.c:474
 msgid "Failed to parse command line."
-msgstr "解析命令列失敗。"
+msgstr ""
 
 #: ../src/daemon/main.c:541
 msgid "Daemon not running"
-msgstr "幕後程式尚未執行中"
+msgstr "幕後程式沒有在執行中"
 
 #: ../src/daemon/main.c:543
 #, c-format
 msgid "Daemon running as PID %u"
-msgstr "幕後程式正在以 PID %u  執行中"
+msgstr ""
 
 #: ../src/daemon/main.c:553
 #, c-format
 msgid "Failed to kill daemon: %s"
-msgstr "無法終止幕後程式:%s"
+msgstr ""
 
 #: ../src/daemon/main.c:571
 msgid "This program is not intended to be run as root (unless --system is specified)."
@@ -180,7 +180,7 @@ msgstr ""
 
 #: ../src/daemon/main.c:573
 msgid "Root privileges required."
-msgstr "需要 root 權力。"
+msgstr ""
 
 #: ../src/daemon/main.c:578
 msgid "--start not supported for system instances."
@@ -203,43 +203,42 @@ msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 
 #: ../src/daemon/main.c:621
-#, fuzzy
 msgid "Failed to acquire stdio."
-msgstr "讀取目錄 %s 失敗:%m"
+msgstr ""
 
 #: ../src/daemon/main.c:627
-#, fuzzy, c-format
+#, c-format
 msgid "pipe failed: %s"
-msgstr "磁碟分割失敗:%s"
+msgstr ""
 
 #: ../src/daemon/main.c:632
-#, fuzzy, c-format
+#, c-format
 msgid "fork() failed: %s"
-msgstr "磁碟分割失敗:%s"
+msgstr ""
 
 #: ../src/daemon/main.c:646
 #: ../src/utils/pacat.c:508
-#, fuzzy, c-format
+#, c-format
 msgid "read() failed: %s"
-msgstr "讀取目錄 %s 失敗:%m"
+msgstr ""
 
 #: ../src/daemon/main.c:652
 msgid "Daemon startup failed."
-msgstr "幕後程式啟動失敗。"
+msgstr ""
 
 #: ../src/daemon/main.c:654
 msgid "Daemon startup successful."
-msgstr "幕後程式啟動成功。"
+msgstr ""
 
 #: ../src/daemon/main.c:731
 #, c-format
 msgid "This is PulseAudio %s"
-msgstr "這是 PulseAudio %s"
+msgstr ""
 
 #: ../src/daemon/main.c:732
-#, fuzzy, c-format
+#, c-format
 msgid "Compilation host: %s"
-msgstr "主機(host:port)"
+msgstr ""
 
 #: ../src/daemon/main.c:733
 #, c-format
@@ -247,14 +246,14 @@ msgid "Compilation CFLAGS: %s"
 msgstr ""
 
 #: ../src/daemon/main.c:736
-#, fuzzy, c-format
+#, c-format
 msgid "Running on host: %s"
-msgstr "%s %s 安裝在主機 %s"
+msgstr ""
 
 #: ../src/daemon/main.c:739
 #, c-format
 msgid "Found %u CPUs."
-msgstr "找到 %u 個 CPU。"
+msgstr ""
 
 #: ../src/daemon/main.c:741
 #, c-format
@@ -263,24 +262,24 @@ msgstr ""
 
 #: ../src/daemon/main.c:744
 msgid "Compiled with Valgrind support: yes"
-msgstr "以 Valgrind 支援進行編譯:是"
+msgstr ""
 
 #: ../src/daemon/main.c:746
 msgid "Compiled with Valgrind support: no"
-msgstr "以 Valgrind 支援進行編譯:否"
+msgstr ""
 
 #: ../src/daemon/main.c:749
 #, c-format
 msgid "Running in valgrind mode: %s"
-msgstr "正在以 valgrind 模式執行中:%s"
+msgstr ""
 
 #: ../src/daemon/main.c:752
 msgid "Optimized build: yes"
-msgstr "最佳化的建構版本:是"
+msgstr ""
 
 #: ../src/daemon/main.c:754
 msgid "Optimized build: no"
-msgstr "最佳化的建構版本:否"
+msgstr ""
 
 #: ../src/daemon/main.c:758
 msgid "NDEBUG defined, all asserts disabled."
@@ -291,43 +290,42 @@ msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr ""
 
 #: ../src/daemon/main.c:762
-#, fuzzy
 msgid "All asserts enabled."
-msgstr "未啟用任何軟體套件庫"
+msgstr ""
 
 #: ../src/daemon/main.c:766
 msgid "Failed to get machine ID"
-msgstr "無法取得機器 ID"
+msgstr ""
 
 #: ../src/daemon/main.c:769
 #, c-format
 msgid "Machine ID is %s."
-msgstr "機器 ID 為 %s。"
+msgstr ""
 
 #: ../src/daemon/main.c:773
 #, c-format
 msgid "Session ID is %s."
-msgstr "作業階段 ID 為 %s。"
+msgstr ""
 
 #: ../src/daemon/main.c:779
-#, fuzzy, c-format
+#, c-format
 msgid "Using runtime directory %s."
-msgstr "存放映像檔的目錄:"
+msgstr ""
 
 #: ../src/daemon/main.c:784
-#, fuzzy, c-format
+#, c-format
 msgid "Using state directory %s."
-msgstr "存放映像檔的目錄:"
+msgstr ""
 
 #: ../src/daemon/main.c:787
-#, fuzzy, c-format
+#, c-format
 msgid "Using modules directory %s."
-msgstr "存放映像檔的目錄:"
+msgstr ""
 
 #: ../src/daemon/main.c:789
-#, fuzzy, c-format
+#, c-format
 msgid "Running in system mode: %s"
-msgstr "在命令列模式不可有一個問號!"
+msgstr ""
 
 #: ../src/daemon/main.c:792
 msgid ""
@@ -354,7 +352,7 @@ msgstr ""
 
 #: ../src/daemon/main.c:904
 msgid "Failed to initialize daemon."
-msgstr "初始化幕後程式失敗。"
+msgstr ""
 
 #: ../src/daemon/main.c:909
 msgid "Daemon startup without any loaded modules, refusing to work."
@@ -362,15 +360,15 @@ msgstr ""
 
 #: ../src/daemon/main.c:926
 msgid "Daemon startup complete."
-msgstr "幕後程式啟動完成。"
+msgstr ""
 
 #: ../src/daemon/main.c:932
 msgid "Daemon shutdown initiated."
-msgstr "已開始關閉幕後程式。"
+msgstr ""
 
 #: ../src/daemon/main.c:954
 msgid "Daemon terminated."
-msgstr "幕後程式已終止。"
+msgstr ""
 
 #: ../src/daemon/cmdline.c:115
 #, c-format
@@ -467,7 +465,7 @@ msgstr ""
 
 #: ../src/daemon/cmdline.c:321
 msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
-msgstr "無效的紀錄目標:請使用「syslog」、「stderr」或是「auto」。"
+msgstr ""
 
 #: ../src/daemon/cmdline.c:328
 msgid "--log-time expects boolean argument"
@@ -480,7 +478,7 @@ msgstr ""
 #: ../src/daemon/cmdline.c:354
 #, c-format
 msgid "Invalid resample method '%s'."
-msgstr "無效的重新取樣方法「%s」。"
+msgstr ""
 
 #: ../src/daemon/cmdline.c:361
 msgid "--system expects boolean argument"
@@ -497,67 +495,67 @@ msgstr ""
 #: ../src/daemon/dumpmodules.c:60
 #, c-format
 msgid "Name: %s\n"
-msgstr "名稱:%s\n"
+msgstr ""
 
 #: ../src/daemon/dumpmodules.c:63
 #, c-format
 msgid "No module information available\n"
-msgstr "沒有可用的模組資訊\n"
+msgstr ""
 
 #: ../src/daemon/dumpmodules.c:66
 #, c-format
 msgid "Version: %s\n"
-msgstr "版本:%s\n"
+msgstr ""
 
 #: ../src/daemon/dumpmodules.c:68
 #, c-format
 msgid "Description: %s\n"
-msgstr "描述:%s\n"
+msgstr ""
 
 #: ../src/daemon/dumpmodules.c:70
 #, c-format
 msgid "Author: %s\n"
-msgstr "作者:%s\n"
+msgstr ""
 
 #: ../src/daemon/dumpmodules.c:72
 #, c-format
 msgid "Usage: %s\n"
-msgstr "使用率:%s\n"
+msgstr ""
 
 #: ../src/daemon/dumpmodules.c:73
-#, fuzzy, c-format
+#, c-format
 msgid "Load Once: %s\n"
-msgstr "載入另一張碟片"
+msgstr ""
 
 #: ../src/daemon/dumpmodules.c:75
-#, fuzzy, c-format
+#, c-format
 msgid "DEPRECATION WARNING: %s\n"
-msgstr "磁碟分割警告"
+msgstr ""
 
 #: ../src/daemon/dumpmodules.c:79
 #, c-format
 msgid "Path: %s\n"
-msgstr "路徑:%s\n"
+msgstr ""
 
 #: ../src/daemon/daemon-conf.c:232
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid log target '%s'."
-msgstr "設成預設開機目標 (_T)"
+msgstr ""
 
 #: ../src/daemon/daemon-conf.c:248
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid log level '%s'."
-msgstr "無效的錯誤資訊"
+msgstr ""
 
 #: ../src/daemon/daemon-conf.c:264
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
-msgstr "未知的 Url 方法 %s"
+msgstr ""
 
 #: ../src/daemon/daemon-conf.c:287
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
-msgstr "無效的金鑰"
+msgstr ""
 
 #: ../src/daemon/daemon-conf.c:294
 #, c-format
@@ -565,44 +563,44 @@ msgid "[%s:%u] rlimit not supported on this platform."
 msgstr ""
 
 #: ../src/daemon/daemon-conf.c:310
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
-msgstr "要格式化為 Swap 分割區嗎?"
+msgstr ""
 
 #: ../src/daemon/daemon-conf.c:328
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
-msgstr "無效的錯誤資訊"
+msgstr ""
 
 #: ../src/daemon/daemon-conf.c:352
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
-msgstr "無效的錯誤資訊"
+msgstr ""
 
 #: ../src/daemon/daemon-conf.c:370
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
-msgstr "無效的錯誤資訊"
+msgstr ""
 
 #: ../src/daemon/daemon-conf.c:388
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
-msgstr "無效的錯誤資訊"
+msgstr ""
 
 #: ../src/daemon/daemon-conf.c:406
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
-msgstr "輸入的分割區大小無效"
+msgstr ""
 
 #: ../src/daemon/daemon-conf.c:424
-#, fuzzy, c-format
+#, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
-msgstr "無效的錯誤資訊"
+msgstr ""
 
 #: ../src/daemon/daemon-conf.c:546
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to open configuration file: %s"
-msgstr "從檔案載入驅動程式碟片失敗。"
+msgstr ""
 
 #: ../src/daemon/daemon-conf.c:562
 msgid "The specified default channel map has a different number of channels than the specified default number of channels."
@@ -614,17 +612,16 @@ msgid "### Read from configuration file: %s ###\n"
 msgstr ""
 
 #: ../src/daemon/caps.c:62
-#, fuzzy
 msgid "Cleaning up privileges."
-msgstr "設定套件庫時發生錯誤"
+msgstr ""
 
 #: ../src/daemon/pulseaudio.desktop.in.h:1
 msgid "PulseAudio Sound System"
-msgstr "PulseAudio 音效系統"
+msgstr ""
 
 #: ../src/daemon/pulseaudio.desktop.in.h:2
 msgid "Start the PulseAudio Sound System"
-msgstr "啟動 PulseAudio 音效系統"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:105
 #: ../src/pulse/channelmap.c:757
@@ -633,203 +630,203 @@ msgstr "單聲道"
 
 #: ../src/pulse/channelmap.c:107
 msgid "Front Center"
-msgstr ""
+msgstr "前方中央"
 
 #: ../src/pulse/channelmap.c:108
 msgid "Front Left"
-msgstr ""
+msgstr "前方左側"
 
 #: ../src/pulse/channelmap.c:109
 msgid "Front Right"
-msgstr ""
+msgstr "前方右側"
 
 #: ../src/pulse/channelmap.c:111
 msgid "Rear Center"
-msgstr ""
+msgstr "後方中央"
 
 #: ../src/pulse/channelmap.c:112
 msgid "Rear Left"
-msgstr ""
+msgstr "後方左側"
 
 #: ../src/pulse/channelmap.c:113
 msgid "Rear Right"
-msgstr ""
+msgstr "後方右側"
 
 #: ../src/pulse/channelmap.c:115
 msgid "Low Frequency Emmiter"
-msgstr ""
+msgstr "低頻率揚聲器"
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
-msgstr ""
+msgstr "前方中央偏左"
 
 #: ../src/pulse/channelmap.c:118
 msgid "Front Right-of-center"
-msgstr ""
+msgstr "前方中央偏右"
 
 #: ../src/pulse/channelmap.c:120
 msgid "Side Left"
-msgstr ""
+msgstr "左側"
 
 #: ../src/pulse/channelmap.c:121
 msgid "Side Right"
-msgstr ""
+msgstr "右側"
 
 #: ../src/pulse/channelmap.c:123
 msgid "Auxiliary 0"
-msgstr "輔助輸入 0"
+msgstr "輔助 0"
 
 #: ../src/pulse/channelmap.c:124
 msgid "Auxiliary 1"
-msgstr ""
+msgstr "輔助 1"
 
 #: ../src/pulse/channelmap.c:125
 msgid "Auxiliary 2"
-msgstr ""
+msgstr "輔助 2"
 
 #: ../src/pulse/channelmap.c:126
 msgid "Auxiliary 3"
-msgstr ""
+msgstr "輔助 3"
 
 #: ../src/pulse/channelmap.c:127
 msgid "Auxiliary 4"
-msgstr ""
+msgstr "輔助 4"
 
 #: ../src/pulse/channelmap.c:128
 msgid "Auxiliary 5"
-msgstr ""
+msgstr "輔助 5"
 
 #: ../src/pulse/channelmap.c:129
 msgid "Auxiliary 6"
-msgstr ""
+msgstr "輔助 6"
 
 #: ../src/pulse/channelmap.c:130
 msgid "Auxiliary 7"
-msgstr ""
+msgstr "輔助 7"
 
 #: ../src/pulse/channelmap.c:131
 msgid "Auxiliary 8"
-msgstr ""
+msgstr "輔助 8"
 
 #: ../src/pulse/channelmap.c:132
 msgid "Auxiliary 9"
-msgstr ""
+msgstr "輔助 9"
 
 #: ../src/pulse/channelmap.c:133
 msgid "Auxiliary 10"
-msgstr ""
+msgstr "輔助 10"
 
 #: ../src/pulse/channelmap.c:134
 msgid "Auxiliary 11"
-msgstr ""
+msgstr "輔助 11"
 
 #: ../src/pulse/channelmap.c:135
 msgid "Auxiliary 12"
-msgstr ""
+msgstr "輔助 12"
 
 #: ../src/pulse/channelmap.c:136
 msgid "Auxiliary 13"
-msgstr ""
+msgstr "輔助 13"
 
 #: ../src/pulse/channelmap.c:137
 msgid "Auxiliary 14"
-msgstr ""
+msgstr "輔助 14"
 
 #: ../src/pulse/channelmap.c:138
 msgid "Auxiliary 15"
-msgstr ""
+msgstr "輔助 15"
 
 #: ../src/pulse/channelmap.c:139
 msgid "Auxiliary 16"
-msgstr ""
+msgstr "輔助 16"
 
 #: ../src/pulse/channelmap.c:140
 msgid "Auxiliary 17"
-msgstr ""
+msgstr "輔助 17"
 
 #: ../src/pulse/channelmap.c:141
 msgid "Auxiliary 18"
-msgstr ""
+msgstr "輔助 18"
 
 #: ../src/pulse/channelmap.c:142
 msgid "Auxiliary 19"
-msgstr ""
+msgstr "輔助 19"
 
 #: ../src/pulse/channelmap.c:143
 msgid "Auxiliary 20"
-msgstr ""
+msgstr "輔助 20"
 
 #: ../src/pulse/channelmap.c:144
 msgid "Auxiliary 21"
-msgstr ""
+msgstr "輔助 21"
 
 #: ../src/pulse/channelmap.c:145
 msgid "Auxiliary 22"
-msgstr ""
+msgstr "輔助 22"
 
 #: ../src/pulse/channelmap.c:146
 msgid "Auxiliary 23"
-msgstr ""
+msgstr "輔助 23"
 
 #: ../src/pulse/channelmap.c:147
 msgid "Auxiliary 24"
-msgstr ""
+msgstr "輔助 24"
 
 #: ../src/pulse/channelmap.c:148
 msgid "Auxiliary 25"
-msgstr ""
+msgstr "輔助 25"
 
 #: ../src/pulse/channelmap.c:149
 msgid "Auxiliary 26"
-msgstr ""
+msgstr "輔助 26"
 
 #: ../src/pulse/channelmap.c:150
 msgid "Auxiliary 27"
-msgstr ""
+msgstr "輔助 27"
 
 #: ../src/pulse/channelmap.c:151
 msgid "Auxiliary 28"
-msgstr ""
+msgstr "輔助 28"
 
 #: ../src/pulse/channelmap.c:152
 msgid "Auxiliary 29"
-msgstr ""
+msgstr "輔助 29"
 
 #: ../src/pulse/channelmap.c:153
 msgid "Auxiliary 30"
-msgstr ""
+msgstr "輔助 30"
 
 #: ../src/pulse/channelmap.c:154
 msgid "Auxiliary 31"
-msgstr ""
+msgstr "輔助 31"
 
 #: ../src/pulse/channelmap.c:156
 msgid "Top Center"
-msgstr ""
+msgstr "頂端中央"
 
 #: ../src/pulse/channelmap.c:158
 msgid "Top Front Center"
-msgstr ""
+msgstr "頂端前方中央"
 
 #: ../src/pulse/channelmap.c:159
 msgid "Top Front Left"
-msgstr ""
+msgstr "頂端前方左側"
 
 #: ../src/pulse/channelmap.c:160
 msgid "Top Front Right"
-msgstr ""
+msgstr "頂端前方右側"
 
 #: ../src/pulse/channelmap.c:162
 msgid "Top Rear Center"
-msgstr ""
+msgstr "頂端後方中央"
 
 #: ../src/pulse/channelmap.c:163
 msgid "Top Rear Left"
-msgstr ""
+msgstr "頂端後方左側"
 
 #: ../src/pulse/channelmap.c:164
 msgid "Top Rear Right"
-msgstr ""
+msgstr "頂端後方右側"
 
 #: ../src/pulse/channelmap.c:484
 #: ../src/pulse/sample.c:170
@@ -846,72 +843,71 @@ msgstr "立體聲"
 
 #: ../src/pulse/channelmap.c:766
 msgid "Surround 4.0"
-msgstr "環繞音效 4.0"
+msgstr "環繞聲 4.0"
 
 #: ../src/pulse/channelmap.c:772
 msgid "Surround 4.1"
-msgstr "環繞音效 4.1"
+msgstr "環繞聲 4.1"
 
 #: ../src/pulse/channelmap.c:778
 msgid "Surround 5.0"
-msgstr "環繞音效 5.0"
+msgstr "環繞聲 5.0"
 
 #: ../src/pulse/channelmap.c:784
 msgid "Surround 5.1"
-msgstr "環繞音效 5.1"
+msgstr "環繞聲 5.1"
 
 #: ../src/pulse/channelmap.c:791
 msgid "Surround 7.1"
-msgstr "環繞音效 7.1"
+msgstr "環繞聲 7.1"
 
 #: ../src/pulse/error.c:43
 msgid "OK"
-msgstr "確認"
+msgstr "確定"
 
 #: ../src/pulse/error.c:44
 msgid "Access denied"
-msgstr "存取受拒"
+msgstr ""
 
 #: ../src/pulse/error.c:45
 msgid "Unknown command"
-msgstr "未知的指令"
+msgstr ""
 
 #: ../src/pulse/error.c:46
 msgid "Invalid argument"
-msgstr "無效的參數"
+msgstr ""
 
 #: ../src/pulse/error.c:47
 msgid "Entity exists"
 msgstr ""
 
 #: ../src/pulse/error.c:48
-#, fuzzy
 msgid "No such entity"
-msgstr "沒有可用的網路"
+msgstr ""
 
 #: ../src/pulse/error.c:49
 msgid "Connection refused"
-msgstr "連接受拒"
+msgstr ""
 
 #: ../src/pulse/error.c:50
 msgid "Protocol error"
-msgstr "協定錯誤"
+msgstr ""
 
 #: ../src/pulse/error.c:51
 msgid "Timeout"
-msgstr "逾時"
+msgstr ""
 
 #: ../src/pulse/error.c:52
 msgid "No authorization key"
-msgstr "沒有授權金鑰"
+msgstr ""
 
 #: ../src/pulse/error.c:53
 msgid "Internal error"
-msgstr "內部錯誤"
+msgstr ""
 
 #: ../src/pulse/error.c:54
 msgid "Connection terminated"
-msgstr "連接已終止"
+msgstr ""
 
 #: ../src/pulse/error.c:55
 msgid "Entity killed"
@@ -919,61 +915,55 @@ msgstr ""
 
 #: ../src/pulse/error.c:56
 msgid "Invalid server"
-msgstr "無效的伺服器"
+msgstr ""
 
 #: ../src/pulse/error.c:57
 msgid "Module initalization failed"
-msgstr "模組初始化失敗"
+msgstr ""
 
 #: ../src/pulse/error.c:58
 msgid "Bad state"
-msgstr "不良的狀態"
+msgstr ""
 
 #: ../src/pulse/error.c:59
 msgid "No data"
-msgstr "無資料"
+msgstr ""
 
 #: ../src/pulse/error.c:60
 msgid "Incompatible protocol version"
-msgstr "不相容的協定版本"
+msgstr ""
 
 #: ../src/pulse/error.c:61
 msgid "Too large"
-msgstr "太大"
+msgstr ""
 
 #: ../src/pulse/error.c:62
 msgid "Not supported"
-msgstr "未支援"
+msgstr ""
 
 #: ../src/pulse/error.c:63
 msgid "Unknown error code"
-msgstr "未知的錯誤碼"
+msgstr ""
 
 #: ../src/pulse/error.c:64
-#, fuzzy
 msgid "No such extension"
-msgstr "沒有可用的網路"
+msgstr ""
 
 #: ../src/pulse/error.c:65
 msgid "Obsolete functionality"
-msgstr "棄用的功能"
+msgstr ""
 
 #: ../src/pulse/error.c:66
-#, fuzzy
 msgid "Missing implementation"
-msgstr "找不到套件"
+msgstr ""
 
 #: ../src/pulse/error.c:67
 msgid "Client forked"
 msgstr ""
 
 #: ../src/pulse/error.c:68
-#, fuzzy
 msgid "Input/Output error"
 msgstr ""
-"重新設調整分割區 %s 的大小時發生錯誤。\n"
-"\n"
-"%s"
 
 #: ../src/pulse/error.c:69
 msgid "Device or resource busy"
@@ -1006,18 +996,17 @@ msgstr ""
 
 #: ../src/pulse/client-conf-x11.c:55
 #: ../src/utils/pax11publish.c:100
-#, fuzzy
 msgid "XOpenDisplay() failed"
-msgstr "磁碟分割失敗:%s"
+msgstr ""
 
 #: ../src/pulse/client-conf-x11.c:93
 msgid "Failed to parse cookie data"
 msgstr ""
 
 #: ../src/pulse/client-conf.c:111
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to open configuration file '%s': %s"
-msgstr "從檔案載入驅動程式碟片失敗。"
+msgstr ""
 
 #: ../src/pulse/context.c:550
 msgid "No cookie loaded. Attempting to connect without."
@@ -1039,18 +1028,17 @@ msgid "Received message for unknown extension '%s'"
 msgstr ""
 
 #: ../src/utils/pacat.c:108
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to drain stream: %s"
-msgstr "讀取目錄 %s 失敗:%m"
+msgstr ""
 
 #: ../src/utils/pacat.c:113
 msgid "Playback stream drained."
 msgstr ""
 
 #: ../src/utils/pacat.c:123
-#, fuzzy
 msgid "Draining connection to server."
-msgstr "傳送至遠端伺服器(scp)"
+msgstr ""
 
 #: ../src/utils/pacat.c:136
 #, c-format
@@ -1074,9 +1062,8 @@ msgid "pa_stream_peek() failed: %s"
 msgstr ""
 
 #: ../src/utils/pacat.c:307
-#, fuzzy
 msgid "Stream successfully created."
-msgstr "串流已成功建立\n"
+msgstr ""
 
 #: ../src/utils/pacat.c:310
 #, c-format
@@ -1094,39 +1081,39 @@ msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr ""
 
 #: ../src/utils/pacat.c:321
-#, fuzzy, c-format
+#, c-format
 msgid "Using sample spec '%s', channel map '%s'."
-msgstr "正使用取樣規格「%s」\n"
+msgstr ""
 
 #: ../src/utils/pacat.c:325
-#, fuzzy, c-format
+#, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
-msgstr "選取要載入的裝置驅動程式"
+msgstr ""
 
 #: ../src/utils/pacat.c:335
-#, fuzzy, c-format
+#, c-format
 msgid "Stream error: %s"
-msgstr "設定分割區錯誤"
+msgstr ""
 
 #: ../src/utils/pacat.c:345
-#, fuzzy, c-format
+#, c-format
 msgid "Stream device suspended.%s"
-msgstr "編輯 RAID 裝置"
+msgstr ""
 
 #: ../src/utils/pacat.c:347
-#, fuzzy, c-format
+#, c-format
 msgid "Stream device resumed.%s"
-msgstr "編輯 RAID 裝置"
+msgstr ""
 
 #: ../src/utils/pacat.c:355
-#, fuzzy, c-format
+#, c-format
 msgid "Stream underrun.%s"
-msgstr "串流錯誤:%s\n"
+msgstr ""
 
 #: ../src/utils/pacat.c:362
-#, fuzzy, c-format
+#, c-format
 msgid "Stream overrun.%s"
-msgstr "串流錯誤:%s\n"
+msgstr ""
 
 #: ../src/utils/pacat.c:369
 #, c-format
@@ -1139,9 +1126,8 @@ msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr ""
 
 #: ../src/utils/pacat.c:376
-#, fuzzy
 msgid "not "
-msgstr "找不到 %s"
+msgstr ""
 
 #: ../src/utils/pacat.c:383
 #, c-format
@@ -1149,9 +1135,9 @@ msgid "Stream buffer attributes changed.%s"
 msgstr ""
 
 #: ../src/utils/pacat.c:415
-#, fuzzy, c-format
+#, c-format
 msgid "Connection established.%s"
-msgstr "正在等候 telnet 連線..."
+msgstr ""
 
 #: ../src/utils/pacat.c:418
 #, c-format
@@ -1170,29 +1156,27 @@ msgstr ""
 
 #: ../src/utils/pacat.c:470
 #: ../src/utils/pactl.c:857
-#, fuzzy, c-format
+#, c-format
 msgid "Connection failure: %s"
-msgstr "指令稿小程式失敗"
+msgstr ""
 
 #: ../src/utils/pacat.c:503
-#, fuzzy
 msgid "Got EOF."
-msgstr "取得檔案結尾 (EOF)。\n"
+msgstr ""
 
 #: ../src/utils/pacat.c:540
-#, fuzzy, c-format
+#, c-format
 msgid "write() failed: %s"
-msgstr "磁碟分割失敗:%s"
+msgstr ""
 
 #: ../src/utils/pacat.c:561
-#, fuzzy
 msgid "Got signal, exiting."
-msgstr "取得訊號,正在離開。\n"
+msgstr ""
 
 #: ../src/utils/pacat.c:575
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get latency: %s"
-msgstr "讀取目錄 %s 失敗:%m"
+msgstr ""
 
 #: ../src/utils/pacat.c:580
 #, c-format
@@ -1255,44 +1239,43 @@ msgstr ""
 
 #: ../src/utils/pacat.c:764
 #: ../src/utils/pactl.c:953
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid client name '%s'"
-msgstr "Initiator 名稱無效"
+msgstr ""
 
 #: ../src/utils/pacat.c:779
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid stream name '%s'"
-msgstr "Initiator 名稱無效"
+msgstr ""
 
 #: ../src/utils/pacat.c:816
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid channel map '%s'"
-msgstr "無效的錯誤資訊"
+msgstr ""
 
 #: ../src/utils/pacat.c:845
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid latency specification '%s'"
-msgstr "無效的錯誤資訊"
+msgstr ""
 
 #: ../src/utils/pacat.c:852
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid process time specification '%s'"
-msgstr "無效的重新取樣方法「%s」。"
+msgstr ""
 
 #: ../src/utils/pacat.c:864
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid property '%s'"
-msgstr "無效的金鑰"
+msgstr ""
 
 #: ../src/utils/pacat.c:881
-#, fuzzy, c-format
+#, c-format
 msgid "Unknown file format %s."
-msgstr "要格式化為 Swap 分割區嗎?"
+msgstr ""
 
 #: ../src/utils/pacat.c:900
-#, fuzzy
 msgid "Invalid sample specification"
-msgstr "無效的錯誤資訊"
+msgstr ""
 
 #: ../src/utils/pacat.c:910
 #, c-format
@@ -1305,19 +1288,16 @@ msgid "dup2(): %s"
 msgstr ""
 
 #: ../src/utils/pacat.c:922
-#, fuzzy
 msgid "Too many arguments."
-msgstr "太多備援磁碟機"
+msgstr ""
 
 #: ../src/utils/pacat.c:933
-#, fuzzy
 msgid "Failed to generate sample specification for file."
-msgstr "無法載入客戶端配置檔。\n"
+msgstr ""
 
 #: ../src/utils/pacat.c:953
-#, fuzzy
 msgid "Failed to open audio file."
-msgstr "從檔案載入驅動程式碟片失敗。"
+msgstr ""
 
 #: ../src/utils/pacat.c:959
 msgid "Warning: specified sample specification will be overwritten with specification from file."
@@ -1325,18 +1305,16 @@ msgstr ""
 
 #: ../src/utils/pacat.c:962
 #: ../src/utils/pactl.c:997
-#, fuzzy
 msgid "Failed to determine sample specification from file."
-msgstr "無法載入客戶端配置檔。\n"
+msgstr ""
 
 #: ../src/utils/pacat.c:971
 msgid "Warning: Failed to determine channel map from file."
 msgstr ""
 
 #: ../src/utils/pacat.c:982
-#, fuzzy
 msgid "Channel map doesn't match sample specification"
-msgstr "頻道對應表不符合檔案。\n"
+msgstr ""
 
 #: ../src/utils/pacat.c:993
 msgid "Warning: failed to write channel map to file."
@@ -1349,11 +1327,11 @@ msgstr ""
 
 #: ../src/utils/pacat.c:1009
 msgid "recording"
-msgstr "正在錄製"
+msgstr ""
 
 #: ../src/utils/pacat.c:1009
 msgid "playback"
-msgstr "播放控制"
+msgstr ""
 
 #: ../src/utils/pacat.c:1035
 #: ../src/utils/pactl.c:1267
@@ -1361,9 +1339,8 @@ msgid "pa_mainloop_new() failed."
 msgstr ""
 
 #: ../src/utils/pacat.c:1054
-#, fuzzy
 msgid "io_new() failed."
-msgstr "LVM 操作失敗"
+msgstr ""
 
 #: ../src/utils/pacat.c:1061
 #: ../src/utils/pactl.c:1279
@@ -1396,14 +1373,14 @@ msgid "execvp(): %s\n"
 msgstr ""
 
 #: ../src/utils/pasuspender.c:109
-#, fuzzy, c-format
+#, c-format
 msgid "Failure to suspend: %s\n"
-msgstr "無法登入"
+msgstr ""
 
 #: ../src/utils/pasuspender.c:124
-#, fuzzy, c-format
+#, c-format
 msgid "Failure to resume: %s\n"
-msgstr "無法登入"
+msgstr ""
 
 #: ../src/utils/pasuspender.c:147
 #, c-format
@@ -1411,9 +1388,9 @@ msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr ""
 
 #: ../src/utils/pasuspender.c:159
-#, fuzzy, c-format
+#, c-format
 msgid "Connection failure: %s\n"
-msgstr "指令稿小程式失敗"
+msgstr ""
 
 #: ../src/utils/pasuspender.c:176
 #, c-format
@@ -1460,9 +1437,9 @@ msgid "pa_mainloop_run() failed.\n"
 msgstr ""
 
 #: ../src/utils/pactl.c:135
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get statistics: %s"
-msgstr "讀取目錄 %s 失敗:%m"
+msgstr ""
 
 #: ../src/utils/pactl.c:141
 #, c-format
@@ -1475,14 +1452,14 @@ msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr ""
 
 #: ../src/utils/pactl.c:147
-#, fuzzy, c-format
+#, c-format
 msgid "Sample cache size: %s\n"
-msgstr "額外的大小選項"
+msgstr ""
 
 #: ../src/utils/pactl.c:156
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get server information: %s"
-msgstr "無法取得機器 ID"
+msgstr ""
 
 #: ../src/utils/pactl.c:164
 #, c-format
@@ -1499,9 +1476,9 @@ msgid ""
 msgstr ""
 
 #: ../src/utils/pactl.c:205
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get sink information: %s"
-msgstr "無法取得機器 ID"
+msgstr ""
 
 #: ../src/utils/pactl.c:221
 #, c-format
@@ -1533,14 +1510,14 @@ msgstr ""
 
 #: ../src/utils/pactl.c:274
 #: ../src/utils/pactl.c:366
-#, fuzzy, c-format
+#, c-format
 msgid "\tActive Port: %s\n"
-msgstr "主機(host:port)"
+msgstr ""
 
 #: ../src/utils/pactl.c:297
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get source information: %s"
-msgstr "無法變更群組清單:%s"
+msgstr ""
 
 #: ../src/utils/pactl.c:313
 #, c-format
@@ -1578,12 +1555,12 @@ msgstr ""
 #: ../src/utils/pactl.c:638
 #: ../src/utils/pactl.c:645
 msgid "n/a"
-msgstr "不存在"
+msgstr ""
 
 #: ../src/utils/pactl.c:375
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get module information: %s"
-msgstr "無法變更群組清單:%s"
+msgstr ""
 
 #: ../src/utils/pactl.c:393
 #, c-format
@@ -1597,9 +1574,9 @@ msgid ""
 msgstr ""
 
 #: ../src/utils/pactl.c:412
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get client information: %s"
-msgstr "無法載入客戶端配置檔。\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:430
 #, c-format
@@ -1612,9 +1589,9 @@ msgid ""
 msgstr ""
 
 #: ../src/utils/pactl.c:447
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get card information: %s"
-msgstr "無法取得機器 ID"
+msgstr ""
 
 #: ../src/utils/pactl.c:465
 #, c-format
@@ -1638,9 +1615,9 @@ msgid "\tActive Profile: %s\n"
 msgstr ""
 
 #: ../src/utils/pactl.c:496
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get sink input information: %s"
-msgstr "無法終止幕後程式:%s"
+msgstr ""
 
 #: ../src/utils/pactl.c:515
 #, c-format
@@ -1664,9 +1641,9 @@ msgid ""
 msgstr ""
 
 #: ../src/utils/pactl.c:554
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get source output information: %s"
-msgstr "無法變更群組清單:%s"
+msgstr ""
 
 #: ../src/utils/pactl.c:574
 #, c-format
@@ -1686,9 +1663,9 @@ msgid ""
 msgstr ""
 
 #: ../src/utils/pactl.c:605
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to get sample information: %s"
-msgstr "無法上傳取樣:%s\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:623
 #, c-format
@@ -1710,24 +1687,22 @@ msgstr ""
 
 #: ../src/utils/pactl.c:653
 #: ../src/utils/pactl.c:663
-#, fuzzy, c-format
+#, c-format
 msgid "Failure: %s"
-msgstr "指令稿小程式失敗"
+msgstr ""
 
 #: ../src/utils/pactl.c:687
-#, fuzzy, c-format
+#, c-format
 msgid "Failed to upload sample: %s"
-msgstr "讀取目錄 %s 失敗:%m"
+msgstr ""
 
 #: ../src/utils/pactl.c:704
-#, fuzzy
 msgid "Premature end of file"
-msgstr "未經正常程序關機(Dirty)的檔案系統"
+msgstr ""
 
 #: ../src/utils/pactl.c:863
-#, fuzzy
 msgid "Got SIGINT, exiting."
-msgstr "取得訊號,正在離開。\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:869
 #, c-format
@@ -1770,78 +1745,64 @@ msgid ""
 msgstr ""
 
 #: ../src/utils/pactl.c:979
-#, fuzzy
 msgid "Please specify a sample file to load"
-msgstr "請指定一份樣本檔以載入\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:992
-#, fuzzy
 msgid "Failed to open sound file."
-msgstr "從檔案載入驅動程式碟片失敗。"
+msgstr ""
 
 #: ../src/utils/pactl.c:1004
 msgid "Warning: Failed to determine sample specification from file."
 msgstr ""
 
 #: ../src/utils/pactl.c:1014
-#, fuzzy
 msgid "You have to specify a sample name to play"
-msgstr "您必須指定要播放的樣本名稱\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1026
-#, fuzzy
 msgid "You have to specify a sample name to remove"
-msgstr "您必須指定要移除的樣本名稱\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1035
-#, fuzzy
 msgid "You have to specify a sink input index and a sink"
-msgstr "您必須指定一個來源索引以及一個來源\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1045
-#, fuzzy
 msgid "You have to specify a source output index and a source"
-msgstr "您必須指定一個來源索引以及一個來源\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1060
-#, fuzzy
 msgid "You have to specify a module name and arguments."
-msgstr "您必須指定一個模組名稱與參數。\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1080
-#, fuzzy
 msgid "You have to specify a module index"
-msgstr "您必須指定一個模組索引\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1090
-#, fuzzy
 msgid "You may not specify more than one sink. You have to specify a boolean value."
-msgstr "你可能無法指定一個以上的來源。您必須指定一個布林值。\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1103
-#, fuzzy
 msgid "You may not specify more than one source. You have to specify a boolean value."
-msgstr "你可能無法指定一個以上的來源。您必須指定一個布林值。\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1115
-#, fuzzy
 msgid "You have to specify a card name/index and a profile name"
-msgstr "您必須指定一個模組名稱與參數。\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1126
-#, fuzzy
 msgid "You have to specify a sink name/index and a port name"
-msgstr "您必須指定一個來源索引以及一個來源\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1137
-#, fuzzy
 msgid "You have to specify a source name/index and a port name"
-msgstr "您必須指定一個來源索引以及一個來源\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1149
-#, fuzzy
 msgid "You have to specify a sink name/index and a volume"
-msgstr "您必須指定一個來源索引以及一個來源\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1154
 #: ../src/utils/pactl.c:1171
@@ -1849,47 +1810,40 @@ msgstr "您必須指定一個來源索引以及一個來源\n"
 #: ../src/utils/pactl.c:1209
 #: ../src/utils/pactl.c:1226
 #: ../src/utils/pactl.c:1248
-#, fuzzy
 msgid "Invalid volume specification"
-msgstr "邏輯卷冊名稱:"
+msgstr ""
 
 #: ../src/utils/pactl.c:1166
-#, fuzzy
 msgid "You have to specify a source name/index and a volume"
-msgstr "您必須指定一個來源索引以及一個來源\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1183
-#, fuzzy
 msgid "You have to specify a sink input index and a volume"
-msgstr "您必須指定一個來源索引以及一個來源\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1188
 msgid "Invalid sink input index"
 msgstr ""
 
 #: ../src/utils/pactl.c:1204
-#, fuzzy
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr "您必須指定要播放的樣本名稱\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1221
-#, fuzzy
 msgid "You have to specify a source name/index and a mute boolean"
-msgstr "您必須指定一個來源索引以及一個來源\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1238
-#, fuzzy
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr "您必須指定一個來源索引以及一個來源\n"
+msgstr ""
 
 #: ../src/utils/pactl.c:1243
 msgid "Invalid sink input index specification"
 msgstr ""
 
 #: ../src/utils/pactl.c:1262
-#, fuzzy
 msgid "No valid command specified."
-msgstr "在網路指令中指定了不良的 bootproto %s"
+msgstr ""
 
 #: ../src/utils/pax11publish.c:61
 #, c-format
@@ -1905,17 +1859,17 @@ msgstr ""
 #: ../src/utils/pax11publish.c:94
 #, c-format
 msgid "Failed to parse command line.\n"
-msgstr "無法分析命令列。\n"
+msgstr ""
 
 #: ../src/utils/pax11publish.c:108
 #, c-format
 msgid "Server: %s\n"
-msgstr "伺服器:%s\n"
+msgstr ""
 
 #: ../src/utils/pax11publish.c:110
 #, c-format
 msgid "Source: %s\n"
-msgstr "來源:%s\n"
+msgstr ""
 
 #: ../src/utils/pax11publish.c:112
 #, c-format
@@ -1930,37 +1884,37 @@ msgstr ""
 #: ../src/utils/pax11publish.c:132
 #, c-format
 msgid "Failed to parse cookie data\n"
-msgstr "無法解析 cookie 資料\n"
+msgstr ""
 
 #: ../src/utils/pax11publish.c:137
 #, c-format
 msgid "Failed to save cookie data\n"
-msgstr "無法儲存 cookie 資料\n"
+msgstr ""
 
 #: ../src/utils/pax11publish.c:152
 #, c-format
 msgid "Failed to load client configuration file.\n"
-msgstr "無法載入客戶端配置檔。\n"
+msgstr ""
 
 #: ../src/utils/pax11publish.c:157
 #, c-format
 msgid "Failed to read environment configuration data.\n"
-msgstr "無法讀取環境配置資料。\n"
+msgstr ""
 
 #: ../src/utils/pax11publish.c:174
 #, c-format
 msgid "Failed to get FQDN.\n"
-msgstr "無法取得 FQDN。\n"
+msgstr ""
 
 #: ../src/utils/pax11publish.c:194
 #, c-format
 msgid "Failed to load cookie data\n"
-msgstr "無法載入 cookie 資料\n"
+msgstr ""
 
 #: ../src/utils/pax11publish.c:211
 #, c-format
 msgid "Not yet implemented.\n"
-msgstr "尚未實現。\n"
+msgstr ""
 
 #: ../src/utils/pacmd.c:69
 msgid "No PulseAudio daemon running, or not running as session daemon."
@@ -1978,11 +1932,11 @@ msgstr ""
 
 #: ../src/utils/pacmd.c:99
 msgid "Failed to kill PulseAudio daemon."
-msgstr "無法結束 PulseAudio 幕後程式。"
+msgstr ""
 
 #: ../src/utils/pacmd.c:107
 msgid "Daemon not responding."
-msgstr "幕後程式目前沒有回應。"
+msgstr ""
 
 #: ../src/utils/pacmd.c:161
 #, c-format
@@ -1991,9 +1945,9 @@ msgstr ""
 
 #: ../src/utils/pacmd.c:171
 #: ../src/utils/pacmd.c:188
-#, fuzzy, c-format
+#, c-format
 msgid "read(): %s"
-msgstr "唯讀"
+msgstr ""
 
 #: ../src/utils/pacmd.c:207
 #: ../src/utils/pacmd.c:223
@@ -2032,16 +1986,15 @@ msgstr "關閉"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2184
 msgid "High Fidelity Playback (A2DP)"
-msgstr "高傳真播放 (A2DP)"
+msgstr "高傳真播放裝置 (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2198
-#, fuzzy
 msgid "High Fidelity Capture (A2DP)"
-msgstr "高傳真播放 (A2DP)"
+msgstr "高傳真擷取裝置 (A2DP)"
 
 #: ../src/modules/bluetooth/module-bluetooth-device.c:2213
 msgid "Telephony Duplex (HSP/HFP)"
-msgstr "電話雙絞線 (HSP/HFP)"
+msgstr "電話雙工 (HSP/HFP)"
 
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
@@ -2049,25 +2002,21 @@ msgstr "PulseAudio 音效伺服器"
 
 #: ../src/modules/module-rygel-media-server.c:569
 #: ../src/modules/module-rygel-media-server.c:583
-#, fuzzy
 msgid "Output Devices"
-msgstr "找不到裝置"
+msgstr "輸出裝置"
 
 #: ../src/modules/module-rygel-media-server.c:570
 #: ../src/modules/module-rygel-media-server.c:584
-#, fuzzy
 msgid "Input Devices"
-msgstr "找不到裝置"
+msgstr "輸入裝置"
 
 #: ../src/modules/module-rygel-media-server.c:774
-#, fuzzy
 msgid "Audio on @HOSTNAME@"
-msgstr "主機名稱錯誤"
+msgstr "音效位於 @HOSTNAME@"
 
 #: ../src/modules/alsa/alsa-mixer.c:1701
-#, fuzzy
 msgid "Input"
-msgstr "輸入端 %s"
+msgstr "輸入"
 
 #: ../src/modules/alsa/alsa-mixer.c:1702
 msgid "Docking Station Input"
@@ -2078,35 +2027,32 @@ msgid "Docking Station Microphone"
 msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1704
-#, fuzzy
 msgid "Line-In"
-msgstr "正在進行...   "
+msgstr "線路輸入"
 
 #: ../src/modules/alsa/alsa-mixer.c:1705
 msgid "Microphone"
-msgstr ""
+msgstr "麥克風"
 
 #: ../src/modules/alsa/alsa-mixer.c:1706
 msgid "External Microphone"
-msgstr ""
+msgstr "外接麥克風"
 
 #: ../src/modules/alsa/alsa-mixer.c:1707
-#, fuzzy
 msgid "Internal Microphone"
-msgstr "內部音效"
+msgstr "內建麥克風"
 
 #: ../src/modules/alsa/alsa-mixer.c:1708
 msgid "Radio"
-msgstr ""
+msgstr "ç„¡ç·šé›»"
 
 #: ../src/modules/alsa/alsa-mixer.c:1709
 msgid "Video"
-msgstr ""
+msgstr "視訊"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
-#, fuzzy
 msgid "Automatic Gain Control"
-msgstr "自動分割磁碟發生錯誤"
+msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
@@ -2117,62 +2063,52 @@ msgid "Boost"
 msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
-#, fuzzy
 msgid "No Boost"
-msgstr "無密碼"
+msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
 msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
-#, fuzzy
 msgid "No Amplifier"
-msgstr "無密碼"
+msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
-#, fuzzy
 msgid "Analog Input"
-msgstr "類比單聲道"
+msgstr "類比輸入"
 
 #: ../src/modules/alsa/alsa-mixer.c:1774
-#, fuzzy
 msgid "Analog Microphone"
-msgstr "類比單聲道"
+msgstr "類比麥克風"
 
 #: ../src/modules/alsa/alsa-mixer.c:1775
-#, fuzzy
 msgid "Analog Line-In"
-msgstr "此分割區正被安裝程式使用。"
+msgstr "類比線路輸入"
 
 #: ../src/modules/alsa/alsa-mixer.c:1776
-#, fuzzy
 msgid "Analog Radio"
-msgstr "類比單聲道"
+msgstr "類比無線電"
 
 #: ../src/modules/alsa/alsa-mixer.c:1777
-#, fuzzy
 msgid "Analog Video"
-msgstr "類比立體聲"
+msgstr "類比視訊"
 
 #: ../src/modules/alsa/alsa-mixer.c:1778
-#, fuzzy
 msgid "Analog Output"
-msgstr "類比立體聲"
+msgstr "類比輸出"
 
 #: ../src/modules/alsa/alsa-mixer.c:1779
-#, fuzzy
 msgid "Analog Headphones"
-msgstr "類比單聲道"
+msgstr "類比頭戴式麥克風"
 
 #: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Output (LFE)"
-msgstr ""
+msgstr "類比輸出 (LFE)"
 
 #: ../src/modules/alsa/alsa-mixer.c:1781
-#, fuzzy
 msgid "Analog Mono Output"
-msgstr "類比單聲道"
+msgstr "類比單聲道輸出"
 
 #: ../src/modules/alsa/alsa-mixer.c:1981
 #, c-format
@@ -2194,19 +2130,16 @@ msgid "Analog Stereo"
 msgstr "類比立體聲"
 
 #: ../src/modules/alsa/alsa-mixer.c:2792
-#, fuzzy
 msgid "Analog Surround 2.1"
-msgstr "類比環繞聲 4.1"
+msgstr "類比環繞聲 2.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2793
-#, fuzzy
 msgid "Analog Surround 3.0"
-msgstr "類比環繞聲 4.0"
+msgstr "類比環繞聲 3.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2794
-#, fuzzy
 msgid "Analog Surround 3.1"
-msgstr "類比環繞聲 4.1"
+msgstr "類比環繞聲 3.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Surround 4.0"
@@ -2225,19 +2158,16 @@ msgid "Analog Surround 5.1"
 msgstr "類比環繞聲 5.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2799
-#, fuzzy
 msgid "Analog Surround 6.0"
-msgstr "類比環繞聲 4.0"
+msgstr "類比環繞聲 6.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2800
-#, fuzzy
 msgid "Analog Surround 6.1"
-msgstr "類比環繞聲 4.1"
+msgstr "類比環繞聲 6.1"
 
 #: ../src/modules/alsa/alsa-mixer.c:2801
-#, fuzzy
 msgid "Analog Surround 7.0"
-msgstr "類比環繞聲 4.0"
+msgstr "類比環繞聲 7.0"
 
 #: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 7.1"
@@ -2248,13 +2178,12 @@ msgid "Digital Stereo (IEC958)"
 msgstr "數位立體聲 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2804
-#, fuzzy
 msgid "Digital Surround 4.0 (IEC958)"
-msgstr "數位環繞聲 4.0  (IEC958/AC3)"
+msgstr "數位環繞聲 4.0 (IEC958)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr "數位環繞聲 4.0  (IEC958/AC3)"
+msgstr "數位環繞聲 4.0 (IEC958/AC3)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Digital Surround 5.1 (IEC958/AC3)"
@@ -2265,52 +2194,14 @@ msgid "Digital Stereo (HDMI)"
 msgstr "數位立體聲 (HDMI)"
 
 #: ../src/modules/alsa/alsa-mixer.c:2928
-#, fuzzy
 msgid "Analog Mono Duplex"
-msgstr "類比單聲道"
+msgstr "類比單聲道雙工"
 
 #: ../src/modules/alsa/alsa-mixer.c:2929
-#, fuzzy
 msgid "Analog Stereo Duplex"
-msgstr "類比立體聲"
+msgstr "類比立體聲雙工"
 
 #: ../src/modules/alsa/alsa-mixer.c:2930
-#, fuzzy
 msgid "Digital Stereo Duplex (IEC958)"
-msgstr "數位立體聲 (IEC958)"
-
-#~ msgid "Cannot connect to system bus: %s"
-#~ msgstr "無法連接到系統 bus: %s"
-#~ msgid "Cannot get caller from PID: %s"
-#~ msgstr "無法取得來自 PID 的呼叫程式:%s"
-#~ msgid "Cannot set UID on caller object."
-#~ msgstr "無法對呼叫程式器物件設定 UID。"
-#~ msgid "Failed to get CK session."
-#~ msgstr "無法取得 CK 作業階段。"
-#~ msgid "Cannot set UID on session object."
-#~ msgstr "無法在作業階段物件上設定 UID。"
-#~ msgid "Cannot allocate PolKitAction."
-#~ msgstr "無法分配 PolKitAction。"
-#~ msgid "Cannot set action_id"
-#~ msgstr "無法設定 action_id"
-#~ msgid "Cannot allocate PolKitContext."
-#~ msgstr "無法分配 PolKitContext。"
-#~ msgid "Cannot initialize PolKitContext: %s"
-#~ msgstr "無法初始化 PolKitContext:%s"
-#~ msgid "Could not determine whether caller is authorized: %s"
-#~ msgstr "無法決定呼叫程式是否取得授權:%s"
-#~ msgid "Cannot obtain auth: %s"
-#~ msgstr "無法取得權力:%s"
-#~ msgid "PolicyKit responded with '%s'"
-#~ msgstr "PolicyKit 回應了「%s」"
-#~ msgid "Successfully increased RLIMIT_RTPRIO"
-#~ msgstr "成功地增加 RLIMIT_RTPRIO"
-#~ msgid "RLIMIT_RTPRIO failed: %s"
-#~ msgstr "RLIMIT_RTPRIO 失敗:%s"
-#~ msgid "Giving up CAP_NICE"
-#~ msgstr "正在放棄 CAP_NICE"
-#~ msgid "Failed to open file '%s'\n"
-#~ msgstr "無法開啟檔案「%s」\n"
-#~ msgid "Output %s + Input %s"
-#~ msgstr "輸出端 %s + 輸入端 %s"
+msgstr "數位立體聲雙工 (IEC958)"
 

commit 3e463e0872daadd504881a1c03dfa36bed559985
Author: Cheng-Chia Tseng <pswo10680 at gmail.com>
Date:   Fri Feb 19 12:10:30 2010 +0000

    l10n: Updates to Chinese (Taiwan) (zh_TW) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/zh_TW.po b/po/zh_TW.po
index 1a08823..40deec3 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -8,7 +8,7 @@ msgstr ""
 "Project-Id-Version: PulseAudio Volume Control\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-02-05 08:05+0000\n"
-"PO-Revision-Date: 2010-02-19 19:41+0800\n"
+"PO-Revision-Date: 2010-02-19 20:10+0800\n"
 "Last-Translator: Cheng-Chia Tseng <pswo10680 at gmail.com>\n"
 "Language-Team: zh_TW\n"
 "MIME-Version: 1.0\n"
@@ -21,7 +21,7 @@ msgstr ""
 #: ../src/pulsecore/sink.c:2629
 #, c-format
 msgid "%s %s"
-msgstr ""
+msgstr "%s %s"
 
 #: ../src/modules/alsa/alsa-util.c:1106
 #, c-format
@@ -78,34 +78,34 @@ msgstr "數據機"
 
 #: ../src/daemon/ltdl-bind-now.c:124
 msgid "Failed to find original lt_dlopen loader."
-msgstr ""
+msgstr "找不到 original lt_dlopen loader。"
 
 #: ../src/daemon/ltdl-bind-now.c:129
 msgid "Failed to allocate new dl loader."
-msgstr ""
+msgstr "分配新的 dl loader 失敗。"
 
 #: ../src/daemon/ltdl-bind-now.c:142
 msgid "Failed to add bind-now-loader."
-msgstr ""
+msgstr "加入 bind-now-loader 失敗。"
 
 #: ../src/daemon/main.c:141
 #, c-format
 msgid "Got signal %s."
-msgstr ""
+msgstr "取得信號 %s。"
 
 #: ../src/daemon/main.c:168
 msgid "Exiting."
-msgstr ""
+msgstr "正在退出。"
 
 #: ../src/daemon/main.c:186
 #, c-format
 msgid "Failed to find user '%s'."
-msgstr ""
+msgstr "尋找使用者「%s」失敗。"
 
 #: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find group '%s'."
-msgstr ""
+msgstr "尋找群組「%s」失敗。"
 
 #: ../src/daemon/main.c:195
 #, c-format
@@ -145,7 +145,7 @@ msgstr ""
 
 #: ../src/daemon/main.c:271
 msgid "Successfully dropped root privileges."
-msgstr ""
+msgstr "成功地放下 root 特權。"
 
 #: ../src/daemon/main.c:279
 msgid "System wide mode unsupported on this platform."
@@ -158,7 +158,7 @@ msgstr ""
 
 #: ../src/daemon/main.c:474
 msgid "Failed to parse command line."
-msgstr ""
+msgstr "解析命令列失敗。"
 
 #: ../src/daemon/main.c:541
 msgid "Daemon not running"
@@ -180,7 +180,7 @@ msgstr ""
 
 #: ../src/daemon/main.c:573
 msgid "Root privileges required."
-msgstr ""
+msgstr "需要 root 特權。"
 
 #: ../src/daemon/main.c:578
 msgid "--start not supported for system instances."
@@ -209,31 +209,31 @@ msgstr ""
 #: ../src/daemon/main.c:627
 #, c-format
 msgid "pipe failed: %s"
-msgstr ""
+msgstr "pipe 失敗: %s"
 
 #: ../src/daemon/main.c:632
 #, c-format
 msgid "fork() failed: %s"
-msgstr ""
+msgstr "fork() 失敗: %s"
 
 #: ../src/daemon/main.c:646
 #: ../src/utils/pacat.c:508
 #, c-format
 msgid "read() failed: %s"
-msgstr ""
+msgstr "read() 失敗: %s"
 
 #: ../src/daemon/main.c:652
 msgid "Daemon startup failed."
-msgstr ""
+msgstr "幕後程式啟動失敗。"
 
 #: ../src/daemon/main.c:654
 msgid "Daemon startup successful."
-msgstr ""
+msgstr "幕後程式啟動成功。"
 
 #: ../src/daemon/main.c:731
 #, c-format
 msgid "This is PulseAudio %s"
-msgstr ""
+msgstr "這是 PulseAudio %s"
 
 #: ../src/daemon/main.c:732
 #, c-format
@@ -253,7 +253,7 @@ msgstr ""
 #: ../src/daemon/main.c:739
 #, c-format
 msgid "Found %u CPUs."
-msgstr ""
+msgstr "找到 %u 個 CPU。"
 
 #: ../src/daemon/main.c:741
 #, c-format
@@ -352,23 +352,23 @@ msgstr ""
 
 #: ../src/daemon/main.c:904
 msgid "Failed to initialize daemon."
-msgstr ""
+msgstr "初始化幕後程式失敗。"
 
 #: ../src/daemon/main.c:909
 msgid "Daemon startup without any loaded modules, refusing to work."
-msgstr ""
+msgstr "幕後程式啟動而沒有任何載入的模組,拒絕運作。"
 
 #: ../src/daemon/main.c:926
 msgid "Daemon startup complete."
-msgstr ""
+msgstr "幕後程式啟動完成。"
 
 #: ../src/daemon/main.c:932
 msgid "Daemon shutdown initiated."
-msgstr ""
+msgstr "幕後程式已開始關閉。"
 
 #: ../src/daemon/main.c:954
 msgid "Daemon terminated."
-msgstr ""
+msgstr "幕後程式已終止。"
 
 #: ../src/daemon/cmdline.c:115
 #, c-format
@@ -495,32 +495,32 @@ msgstr ""
 #: ../src/daemon/dumpmodules.c:60
 #, c-format
 msgid "Name: %s\n"
-msgstr ""
+msgstr "名稱:%s\n"
 
 #: ../src/daemon/dumpmodules.c:63
 #, c-format
 msgid "No module information available\n"
-msgstr ""
+msgstr "沒有可用的模組資訊\n"
 
 #: ../src/daemon/dumpmodules.c:66
 #, c-format
 msgid "Version: %s\n"
-msgstr ""
+msgstr "版本:%s\n"
 
 #: ../src/daemon/dumpmodules.c:68
 #, c-format
 msgid "Description: %s\n"
-msgstr ""
+msgstr "描述:%s\n"
 
 #: ../src/daemon/dumpmodules.c:70
 #, c-format
 msgid "Author: %s\n"
-msgstr ""
+msgstr "作者:%s\n"
 
 #: ../src/daemon/dumpmodules.c:72
 #, c-format
 msgid "Usage: %s\n"
-msgstr ""
+msgstr "用法:%s\n"
 
 #: ../src/daemon/dumpmodules.c:73
 #, c-format
@@ -535,7 +535,7 @@ msgstr ""
 #: ../src/daemon/dumpmodules.c:79
 #, c-format
 msgid "Path: %s\n"
-msgstr ""
+msgstr "路徑:%s\n"
 
 #: ../src/daemon/daemon-conf.c:232
 #, c-format
@@ -613,15 +613,15 @@ msgstr ""
 
 #: ../src/daemon/caps.c:62
 msgid "Cleaning up privileges."
-msgstr ""
+msgstr "正在清除特權。"
 
 #: ../src/daemon/pulseaudio.desktop.in.h:1
 msgid "PulseAudio Sound System"
-msgstr ""
+msgstr "PulseAudio 音效系統"
 
 #: ../src/daemon/pulseaudio.desktop.in.h:2
 msgid "Start the PulseAudio Sound System"
-msgstr ""
+msgstr "啟動 PulseAudio 音效系統"
 
 #: ../src/pulse/channelmap.c:105
 #: ../src/pulse/channelmap.c:757
@@ -630,27 +630,27 @@ msgstr "單聲道"
 
 #: ../src/pulse/channelmap.c:107
 msgid "Front Center"
-msgstr "前方中央"
+msgstr "正前方"
 
 #: ../src/pulse/channelmap.c:108
 msgid "Front Left"
-msgstr "前方左側"
+msgstr "左前方"
 
 #: ../src/pulse/channelmap.c:109
 msgid "Front Right"
-msgstr "前方右側"
+msgstr "右前方"
 
 #: ../src/pulse/channelmap.c:111
 msgid "Rear Center"
-msgstr "後方中央"
+msgstr "正後方"
 
 #: ../src/pulse/channelmap.c:112
 msgid "Rear Left"
-msgstr "後方左側"
+msgstr "左後方"
 
 #: ../src/pulse/channelmap.c:113
 msgid "Rear Right"
-msgstr "後方右側"
+msgstr "右後方"
 
 #: ../src/pulse/channelmap.c:115
 msgid "Low Frequency Emmiter"
@@ -802,31 +802,31 @@ msgstr "輔助 31"
 
 #: ../src/pulse/channelmap.c:156
 msgid "Top Center"
-msgstr "頂端中央"
+msgstr "正上方"
 
 #: ../src/pulse/channelmap.c:158
 msgid "Top Front Center"
-msgstr "頂端前方中央"
+msgstr "頂端正上方"
 
 #: ../src/pulse/channelmap.c:159
 msgid "Top Front Left"
-msgstr "頂端前方左側"
+msgstr "頂端左前方"
 
 #: ../src/pulse/channelmap.c:160
 msgid "Top Front Right"
-msgstr "頂端前方右側"
+msgstr "頂端右前方"
 
 #: ../src/pulse/channelmap.c:162
 msgid "Top Rear Center"
-msgstr "頂端後方中央"
+msgstr "頂端正後方"
 
 #: ../src/pulse/channelmap.c:163
 msgid "Top Rear Left"
-msgstr "頂端後方左側"
+msgstr "頂端左後方"
 
 #: ../src/pulse/channelmap.c:164
 msgid "Top Rear Right"
-msgstr "頂端後方右側"
+msgstr "頂端右後方"
 
 #: ../src/pulse/channelmap.c:484
 #: ../src/pulse/sample.c:170
@@ -867,15 +867,15 @@ msgstr "確定"
 
 #: ../src/pulse/error.c:44
 msgid "Access denied"
-msgstr ""
+msgstr "拒絕存取"
 
 #: ../src/pulse/error.c:45
 msgid "Unknown command"
-msgstr ""
+msgstr "未知指令"
 
 #: ../src/pulse/error.c:46
 msgid "Invalid argument"
-msgstr ""
+msgstr "無效的參數"
 
 #: ../src/pulse/error.c:47
 msgid "Entity exists"
@@ -887,27 +887,27 @@ msgstr ""
 
 #: ../src/pulse/error.c:49
 msgid "Connection refused"
-msgstr ""
+msgstr "拒絕連線"
 
 #: ../src/pulse/error.c:50
 msgid "Protocol error"
-msgstr ""
+msgstr "協定錯誤"
 
 #: ../src/pulse/error.c:51
 msgid "Timeout"
-msgstr ""
+msgstr "逾時"
 
 #: ../src/pulse/error.c:52
 msgid "No authorization key"
-msgstr ""
+msgstr "沒有認證金鑰"
 
 #: ../src/pulse/error.c:53
 msgid "Internal error"
-msgstr ""
+msgstr "內部錯誤"
 
 #: ../src/pulse/error.c:54
 msgid "Connection terminated"
-msgstr ""
+msgstr "連線已終止"
 
 #: ../src/pulse/error.c:55
 msgid "Entity killed"
@@ -915,47 +915,47 @@ msgstr ""
 
 #: ../src/pulse/error.c:56
 msgid "Invalid server"
-msgstr ""
+msgstr "無效的伺服器"
 
 #: ../src/pulse/error.c:57
 msgid "Module initalization failed"
-msgstr ""
+msgstr "模組初始化失敗"
 
 #: ../src/pulse/error.c:58
 msgid "Bad state"
-msgstr ""
+msgstr "不良狀態"
 
 #: ../src/pulse/error.c:59
 msgid "No data"
-msgstr ""
+msgstr "無資料"
 
 #: ../src/pulse/error.c:60
 msgid "Incompatible protocol version"
-msgstr ""
+msgstr "不相容的協定版本"
 
 #: ../src/pulse/error.c:61
 msgid "Too large"
-msgstr ""
+msgstr "過大"
 
 #: ../src/pulse/error.c:62
 msgid "Not supported"
-msgstr ""
+msgstr "不支援"
 
 #: ../src/pulse/error.c:63
 msgid "Unknown error code"
-msgstr ""
+msgstr "未知的錯誤碼"
 
 #: ../src/pulse/error.c:64
 msgid "No such extension"
-msgstr ""
+msgstr "無此擴展功能"
 
 #: ../src/pulse/error.c:65
 msgid "Obsolete functionality"
-msgstr ""
+msgstr "淘汰的功能"
 
 #: ../src/pulse/error.c:66
 msgid "Missing implementation"
-msgstr ""
+msgstr "遺失的實作"
 
 #: ../src/pulse/error.c:67
 msgid "Client forked"
@@ -963,64 +963,64 @@ msgstr ""
 
 #: ../src/pulse/error.c:68
 msgid "Input/Output error"
-msgstr ""
+msgstr "輸入/輸出 錯誤"
 
 #: ../src/pulse/error.c:69
 msgid "Device or resource busy"
-msgstr ""
+msgstr "裝置或資源忙碌"
 
 #: ../src/pulse/sample.c:172
 #, c-format
 msgid "%s %uch %uHz"
-msgstr ""
+msgstr "%s %uch %uHz"
 
 #: ../src/pulse/sample.c:184
 #, c-format
 msgid "%0.1f GiB"
-msgstr ""
+msgstr "%0.1f GiB"
 
 #: ../src/pulse/sample.c:186
 #, c-format
 msgid "%0.1f MiB"
-msgstr ""
+msgstr "%0.1f MiB"
 
 #: ../src/pulse/sample.c:188
 #, c-format
 msgid "%0.1f KiB"
-msgstr ""
+msgstr "%0.1f KiB"
 
 #: ../src/pulse/sample.c:190
 #, c-format
 msgid "%u B"
-msgstr ""
+msgstr "%u B"
 
 #: ../src/pulse/client-conf-x11.c:55
 #: ../src/utils/pax11publish.c:100
 msgid "XOpenDisplay() failed"
-msgstr ""
+msgstr "XOpenDisplay() 失敗"
 
 #: ../src/pulse/client-conf-x11.c:93
 msgid "Failed to parse cookie data"
-msgstr ""
+msgstr "解析 cookie 資料失敗"
 
 #: ../src/pulse/client-conf.c:111
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
-msgstr ""
+msgstr "開啟配置檔「%s」失敗:%s"
 
 #: ../src/pulse/context.c:550
 msgid "No cookie loaded. Attempting to connect without."
-msgstr ""
+msgstr "沒有載入 cookie。試圖連接而不用 cookie。"
 
 #: ../src/pulse/context.c:693
 #, c-format
 msgid "fork(): %s"
-msgstr ""
+msgstr "fork(): %s"
 
 #: ../src/pulse/context.c:748
 #, c-format
 msgid "waitpid(): %s"
-msgstr ""
+msgstr "waitpid(): %s"
 
 #: ../src/pulse/context.c:1438
 #, c-format
@@ -1043,32 +1043,32 @@ msgstr ""
 #: ../src/utils/pacat.c:136
 #, c-format
 msgid "pa_stream_drain(): %s"
-msgstr ""
+msgstr "pa_stream_drain(): %s"
 
 #: ../src/utils/pacat.c:159
 #, c-format
 msgid "pa_stream_write() failed: %s"
-msgstr ""
+msgstr "pa_stream_write() failed: %s"
 
 #: ../src/utils/pacat.c:197
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
-msgstr ""
+msgstr "pa_stream_begin_write() 失敗: %s"
 
 #: ../src/utils/pacat.c:237
 #: ../src/utils/pacat.c:267
 #, c-format
 msgid "pa_stream_peek() failed: %s"
-msgstr ""
+msgstr "pa_stream_peek() 失敗: %s"
 
 #: ../src/utils/pacat.c:307
 msgid "Stream successfully created."
-msgstr ""
+msgstr "已成功建立串流。"
 
 #: ../src/utils/pacat.c:310
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
-msgstr ""
+msgstr "pa_stream_get_buffer_attr() 失敗: %s"
 
 #: ../src/utils/pacat.c:314
 #, c-format
@@ -1280,12 +1280,12 @@ msgstr ""
 #: ../src/utils/pacat.c:910
 #, c-format
 msgid "open(): %s"
-msgstr ""
+msgstr "open(): %s"
 
 #: ../src/utils/pacat.c:915
 #, c-format
 msgid "dup2(): %s"
-msgstr ""
+msgstr "dup2(): %s"
 
 #: ../src/utils/pacat.c:922
 msgid "Too many arguments."
@@ -1327,11 +1327,11 @@ msgstr ""
 
 #: ../src/utils/pacat.c:1009
 msgid "recording"
-msgstr ""
+msgstr "錄製"
 
 #: ../src/utils/pacat.c:1009
 msgid "playback"
-msgstr ""
+msgstr "播放控制"
 
 #: ../src/utils/pacat.c:1035
 #: ../src/utils/pactl.c:1267
@@ -1365,7 +1365,7 @@ msgstr ""
 #: ../src/utils/pasuspender.c:81
 #, c-format
 msgid "fork(): %s\n"
-msgstr ""
+msgstr "fork(): %s\n"
 
 #: ../src/utils/pasuspender.c:92
 #, c-format
@@ -1555,7 +1555,7 @@ msgstr ""
 #: ../src/utils/pactl.c:638
 #: ../src/utils/pactl.c:645
 msgid "n/a"
-msgstr ""
+msgstr "n/a"
 
 #: ../src/utils/pactl.c:375
 #, c-format
@@ -1702,7 +1702,7 @@ msgstr ""
 
 #: ../src/utils/pactl.c:863
 msgid "Got SIGINT, exiting."
-msgstr ""
+msgstr "取得 SIGINT,正在退出。"
 
 #: ../src/utils/pactl.c:869
 #, c-format
@@ -1843,7 +1843,7 @@ msgstr ""
 
 #: ../src/utils/pactl.c:1262
 msgid "No valid command specified."
-msgstr ""
+msgstr "沒有指定有效的命令。"
 
 #: ../src/utils/pax11publish.c:61
 #, c-format
@@ -1859,27 +1859,27 @@ msgstr ""
 #: ../src/utils/pax11publish.c:94
 #, c-format
 msgid "Failed to parse command line.\n"
-msgstr ""
+msgstr "解析命令列失敗。\n"
 
 #: ../src/utils/pax11publish.c:108
 #, c-format
 msgid "Server: %s\n"
-msgstr ""
+msgstr "伺服器:%s\n"
 
 #: ../src/utils/pax11publish.c:110
 #, c-format
 msgid "Source: %s\n"
-msgstr ""
+msgstr "來源:%s\n"
 
 #: ../src/utils/pax11publish.c:112
 #, c-format
 msgid "Sink: %s\n"
-msgstr ""
+msgstr "Sink: %s\n"
 
 #: ../src/utils/pax11publish.c:114
 #, c-format
 msgid "Cookie: %s\n"
-msgstr ""
+msgstr "Cookie: %s\n"
 
 #: ../src/utils/pax11publish.c:132
 #, c-format
@@ -1928,7 +1928,7 @@ msgstr ""
 #: ../src/utils/pacmd.c:91
 #, c-format
 msgid "connect(): %s"
-msgstr ""
+msgstr "connect(): %s"
 
 #: ../src/utils/pacmd.c:99
 msgid "Failed to kill PulseAudio daemon."
@@ -1936,24 +1936,24 @@ msgstr ""
 
 #: ../src/utils/pacmd.c:107
 msgid "Daemon not responding."
-msgstr ""
+msgstr "幕後程式沒有回應。"
 
 #: ../src/utils/pacmd.c:161
 #, c-format
 msgid "poll(): %s"
-msgstr ""
+msgstr "poll(): %s"
 
 #: ../src/utils/pacmd.c:171
 #: ../src/utils/pacmd.c:188
 #, c-format
 msgid "read(): %s"
-msgstr ""
+msgstr "read(): %s"
 
 #: ../src/utils/pacmd.c:207
 #: ../src/utils/pacmd.c:223
 #, c-format
 msgid "write(): %s"
-msgstr ""
+msgstr "write(): %s"
 
 #: ../src/pulsecore/lock-autospawn.c:136
 #: ../src/pulsecore/lock-autospawn.c:219
@@ -2068,11 +2068,11 @@ msgstr ""
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"
-msgstr ""
+msgstr "揚聲器"
 
 #: ../src/modules/alsa/alsa-mixer.c:1715
 msgid "No Amplifier"
-msgstr ""
+msgstr "無揚聲器"
 
 #: ../src/modules/alsa/alsa-mixer.c:1773
 msgid "Analog Input"
@@ -2113,13 +2113,13 @@ msgstr "類比單聲道輸出"
 #: ../src/modules/alsa/alsa-mixer.c:1981
 #, c-format
 msgid "%s+%s"
-msgstr ""
+msgstr "%s+%s"
 
 #: ../src/modules/alsa/alsa-mixer.c:1984
 #: ../src/modules/alsa/alsa-mixer.c:3404
 #, c-format
 msgid "%s / %s"
-msgstr ""
+msgstr "%s / %s"
 
 #: ../src/modules/alsa/alsa-mixer.c:2790
 msgid "Analog Mono"

commit 4df917cb27e847da8bdb1c3f0e5ebaf20c788045
Author: Cheng-Chia Tseng <pswo10680 at gmail.com>
Date:   Sat Feb 20 04:57:35 2010 +0000

    l10n: Updates to Chinese (Taiwan) (zh_TW) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/zh_TW.po b/po/zh_TW.po
index 40deec3..5fa7550 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -8,7 +8,7 @@ msgstr ""
 "Project-Id-Version: PulseAudio Volume Control\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2010-02-05 08:05+0000\n"
-"PO-Revision-Date: 2010-02-19 20:10+0800\n"
+"PO-Revision-Date: 2010-02-20 12:55+0800\n"
 "Last-Translator: Cheng-Chia Tseng <pswo10680 at gmail.com>\n"
 "Language-Team: zh_TW\n"
 "MIME-Version: 1.0\n"
@@ -50,7 +50,7 @@ msgstr ""
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
-msgstr ""
+msgstr "Dummy Output"
 
 #: ../src/modules/module-ladspa-sink.c:49
 msgid "Virtual LADSPA sink"
@@ -62,11 +62,11 @@ msgstr ""
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
-msgstr ""
+msgstr "Clocked Null sink"
 
 #: ../src/modules/module-null-sink.c:291
 msgid "Null Output"
-msgstr ""
+msgstr "Null Output"
 
 #: ../src/pulsecore/sink.c:2613
 msgid "Internal Audio"
@@ -82,11 +82,11 @@ msgstr "找不到 original lt_dlopen loader。"
 
 #: ../src/daemon/ltdl-bind-now.c:129
 msgid "Failed to allocate new dl loader."
-msgstr "分配新的 dl loader 失敗。"
+msgstr "未能分配新的 dl loader。"
 
 #: ../src/daemon/ltdl-bind-now.c:142
 msgid "Failed to add bind-now-loader."
-msgstr "加入 bind-now-loader 失敗。"
+msgstr "未能加入 bind-now-loader。"
 
 #: ../src/daemon/main.c:141
 #, c-format
@@ -100,48 +100,48 @@ msgstr "正在退出。"
 #: ../src/daemon/main.c:186
 #, c-format
 msgid "Failed to find user '%s'."
-msgstr "尋找使用者「%s」失敗。"
+msgstr "找不到使用者「%s」。"
 
 #: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find group '%s'."
-msgstr "尋找群組「%s」失敗。"
+msgstr "找不到群組「%s」。"
 
 #: ../src/daemon/main.c:195
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
-msgstr ""
+msgstr "找到使用者「%s」(UID %lu) 與群組「%s」(GID %lu)。"
 
 #: ../src/daemon/main.c:200
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
-msgstr ""
+msgstr "使用者「%s」的 GID 與群組「%s」的 GID 不相符。"
 
 #: ../src/daemon/main.c:205
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
-msgstr ""
+msgstr "使用者「%s」的家目錄不是「%s」,忽略中。"
 
 #: ../src/daemon/main.c:208
 #: ../src/daemon/main.c:213
 #, c-format
 msgid "Failed to create '%s': %s"
-msgstr ""
+msgstr "未能建立「%s」:%s"
 
 #: ../src/daemon/main.c:220
 #, c-format
 msgid "Failed to change group list: %s"
-msgstr ""
+msgstr "未能變更群組清單:%s"
 
 #: ../src/daemon/main.c:236
 #, c-format
 msgid "Failed to change GID: %s"
-msgstr ""
+msgstr "未能變更 GIC:%s"
 
 #: ../src/daemon/main.c:252
 #, c-format
 msgid "Failed to change UID: %s"
-msgstr ""
+msgstr "未能變更 UID:%s"
 
 #: ../src/daemon/main.c:271
 msgid "Successfully dropped root privileges."
@@ -149,16 +149,16 @@ msgstr "成功地放下 root 特權。"
 
 #: ../src/daemon/main.c:279
 msgid "System wide mode unsupported on this platform."
-msgstr ""
+msgstr "本平台不支援 system wide 模式。"
 
 #: ../src/daemon/main.c:297
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
-msgstr ""
+msgstr "setrlimit(%s, (%u, %u)) 失敗:%s"
 
 #: ../src/daemon/main.c:474
 msgid "Failed to parse command line."
-msgstr "解析命令列失敗。"
+msgstr "未能解析命令列。"
 
 #: ../src/daemon/main.c:541
 msgid "Daemon not running"
@@ -167,16 +167,16 @@ msgstr "幕後程式沒有在執行中"
 #: ../src/daemon/main.c:543
 #, c-format
 msgid "Daemon running as PID %u"
-msgstr ""
+msgstr "幕後程式正在執行中,PID 為 %u "
 
 #: ../src/daemon/main.c:553
 #, c-format
 msgid "Failed to kill daemon: %s"
-msgstr ""
+msgstr "未能結束幕後程式:%s"
 
 #: ../src/daemon/main.c:571
 msgid "This program is not intended to be run as root (unless --system is specified)."
-msgstr ""
+msgstr "本程式不預期以 root 身份執行(除非有指定 --system)。"
 
 #: ../src/daemon/main.c:573
 msgid "Root privileges required."
@@ -204,7 +204,7 @@ msgstr ""
 
 #: ../src/daemon/main.c:621
 msgid "Failed to acquire stdio."
-msgstr ""
+msgstr "未能獲取 stdio。"
 
 #: ../src/daemon/main.c:627
 #, c-format
@@ -248,7 +248,7 @@ msgstr ""
 #: ../src/daemon/main.c:736
 #, c-format
 msgid "Running on host: %s"
-msgstr ""
+msgstr "正在執行於此主機上:%s"
 
 #: ../src/daemon/main.c:739
 #, c-format
@@ -258,28 +258,28 @@ msgstr "找到 %u 個 CPU。"
 #: ../src/daemon/main.c:741
 #, c-format
 msgid "Page size is %lu bytes"
-msgstr ""
+msgstr "分頁大小為 %lu bytes"
 
 #: ../src/daemon/main.c:744
 msgid "Compiled with Valgrind support: yes"
-msgstr ""
+msgstr "以 Valgrind 支援進行編譯:是"
 
 #: ../src/daemon/main.c:746
 msgid "Compiled with Valgrind support: no"
-msgstr ""
+msgstr "以 Valgrind 支援進行編譯:否"
 
 #: ../src/daemon/main.c:749
 #, c-format
 msgid "Running in valgrind mode: %s"
-msgstr ""
+msgstr "正在以 valgrind 模式執行中:%s"
 
 #: ../src/daemon/main.c:752
 msgid "Optimized build: yes"
-msgstr ""
+msgstr "最佳化的建構版本:是"
 
 #: ../src/daemon/main.c:754
 msgid "Optimized build: no"
-msgstr ""
+msgstr "最佳化的建構版本:否"
 
 #: ../src/daemon/main.c:758
 msgid "NDEBUG defined, all asserts disabled."
@@ -295,17 +295,17 @@ msgstr ""
 
 #: ../src/daemon/main.c:766
 msgid "Failed to get machine ID"
-msgstr ""
+msgstr "未能取得機器 ID"
 
 #: ../src/daemon/main.c:769
 #, c-format
 msgid "Machine ID is %s."
-msgstr ""
+msgstr "機器 ID 為 %s。"
 
 #: ../src/daemon/main.c:773
 #, c-format
 msgid "Session ID is %s."
-msgstr ""
+msgstr "工作階段 ID 為 %s。"
 
 #: ../src/daemon/main.c:779
 #, c-format
@@ -320,12 +320,12 @@ msgstr ""
 #: ../src/daemon/main.c:787
 #, c-format
 msgid "Using modules directory %s."
-msgstr ""
+msgstr "使用模組目錄 %s。"
 
 #: ../src/daemon/main.c:789
 #, c-format
 msgid "Running in system mode: %s"
-msgstr ""
+msgstr "以系統模式執行中:%s"
 
 #: ../src/daemon/main.c:792
 msgid ""
@@ -336,23 +336,23 @@ msgstr ""
 
 #: ../src/daemon/main.c:809
 msgid "pa_pid_file_create() failed."
-msgstr ""
+msgstr "pa_pid_file_create() 失敗。"
 
 #: ../src/daemon/main.c:819
 msgid "Fresh high-resolution timers available! Bon appetit!"
-msgstr ""
+msgstr "有新鮮的高解析度計時器可用!期望您有個好食慾!"
 
 #: ../src/daemon/main.c:821
 msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
-msgstr ""
+msgstr "先生,您的核心糟透了!今日主廚推薦是啟用高解析度計時器的 Linux!"
 
 #: ../src/daemon/main.c:844
 msgid "pa_core_new() failed."
-msgstr ""
+msgstr "pa_core_new() 失敗。"
 
 #: ../src/daemon/main.c:904
 msgid "Failed to initialize daemon."
-msgstr "初始化幕後程式失敗。"
+msgstr "未能初始化幕後程式。"
 
 #: ../src/daemon/main.c:909
 msgid "Daemon startup without any loaded modules, refusing to work."
@@ -478,7 +478,7 @@ msgstr ""
 #: ../src/daemon/cmdline.c:354
 #, c-format
 msgid "Invalid resample method '%s'."
-msgstr ""
+msgstr "無效的重新取樣方法「%s」"
 
 #: ../src/daemon/cmdline.c:361
 msgid "--system expects boolean argument"
@@ -525,12 +525,12 @@ msgstr "用法:%s\n"
 #: ../src/daemon/dumpmodules.c:73
 #, c-format
 msgid "Load Once: %s\n"
-msgstr ""
+msgstr "載入一次:%s\n"
 
 #: ../src/daemon/dumpmodules.c:75
 #, c-format
 msgid "DEPRECATION WARNING: %s\n"
-msgstr ""
+msgstr "反對警告:%s\n"
 
 #: ../src/daemon/dumpmodules.c:79
 #, c-format
@@ -550,7 +550,7 @@ msgstr ""
 #: ../src/daemon/daemon-conf.c:264
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
-msgstr ""
+msgstr "[%s:%u] 無效的重新取樣方法「%s」。"
 
 #: ../src/daemon/daemon-conf.c:287
 #, c-format
@@ -600,16 +600,16 @@ msgstr ""
 #: ../src/daemon/daemon-conf.c:546
 #, c-format
 msgid "Failed to open configuration file: %s"
-msgstr ""
+msgstr "未能開啟配置檔:%s"
 
 #: ../src/daemon/daemon-conf.c:562
 msgid "The specified default channel map has a different number of channels than the specified default number of channels."
-msgstr ""
+msgstr "指定的預設聲道對應表的聲道數與指定的預設聲道數不同。"
 
 #: ../src/daemon/daemon-conf.c:638
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
-msgstr ""
+msgstr "### 從此配置檔讀取:%s ###\n"
 
 #: ../src/daemon/caps.c:62
 msgid "Cleaning up privileges."
@@ -879,11 +879,11 @@ msgstr "無效的參數"
 
 #: ../src/pulse/error.c:47
 msgid "Entity exists"
-msgstr ""
+msgstr "實體存在"
 
 #: ../src/pulse/error.c:48
 msgid "No such entity"
-msgstr ""
+msgstr "無此實體"
 
 #: ../src/pulse/error.c:49
 msgid "Connection refused"
@@ -911,7 +911,7 @@ msgstr "連線已終止"
 
 #: ../src/pulse/error.c:55
 msgid "Entity killed"
-msgstr ""
+msgstr "實體已結束"
 
 #: ../src/pulse/error.c:56
 msgid "Invalid server"
@@ -959,7 +959,7 @@ msgstr "遺失的實作"
 
 #: ../src/pulse/error.c:67
 msgid "Client forked"
-msgstr ""
+msgstr "客戶端已分支"
 
 #: ../src/pulse/error.c:68
 msgid "Input/Output error"
@@ -1001,12 +1001,12 @@ msgstr "XOpenDisplay() 失敗"
 
 #: ../src/pulse/client-conf-x11.c:93
 msgid "Failed to parse cookie data"
-msgstr "解析 cookie 資料失敗"
+msgstr "未能解析 cookie 資料"
 
 #: ../src/pulse/client-conf.c:111
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
-msgstr "開啟配置檔「%s」失敗:%s"
+msgstr "未能開啟配置檔「%s」:%s"
 
 #: ../src/pulse/context.c:550
 msgid "No cookie loaded. Attempting to connect without."
@@ -1025,20 +1025,20 @@ msgstr "waitpid(): %s"
 #: ../src/pulse/context.c:1438
 #, c-format
 msgid "Received message for unknown extension '%s'"
-msgstr ""
+msgstr "已接收到未知擴展功能的訊息「%s」"
 
 #: ../src/utils/pacat.c:108
 #, c-format
 msgid "Failed to drain stream: %s"
-msgstr ""
+msgstr "未能排出串流:%s"
 
 #: ../src/utils/pacat.c:113
 msgid "Playback stream drained."
-msgstr ""
+msgstr "播放控制串流已排出。"
 
 #: ../src/utils/pacat.c:123
 msgid "Draining connection to server."
-msgstr ""
+msgstr "正在排出連線到伺服器。"
 
 #: ../src/utils/pacat.c:136
 #, c-format
@@ -1083,110 +1083,110 @@ msgstr ""
 #: ../src/utils/pacat.c:321
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
-msgstr ""
+msgstr "使用取樣規格「%s」,聲道對應表「%s」"
 
 #: ../src/utils/pacat.c:325
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
-msgstr ""
+msgstr "正在連接到裝置 %s (%u, %ssuspended)。"
 
 #: ../src/utils/pacat.c:335
 #, c-format
 msgid "Stream error: %s"
-msgstr ""
+msgstr "串流錯誤:%s"
 
 #: ../src/utils/pacat.c:345
 #, c-format
 msgid "Stream device suspended.%s"
-msgstr ""
+msgstr "串流裝置已暫停。%s"
 
 #: ../src/utils/pacat.c:347
 #, c-format
 msgid "Stream device resumed.%s"
-msgstr ""
+msgstr "串流裝置已恢復:%s"
 
 #: ../src/utils/pacat.c:355
 #, c-format
 msgid "Stream underrun.%s"
-msgstr ""
+msgstr "串流欠載運行。%s"
 
 #: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream overrun.%s"
-msgstr ""
+msgstr "串流超載運行。%s"
 
 #: ../src/utils/pacat.c:369
 #, c-format
 msgid "Stream started.%s"
-msgstr ""
+msgstr "串流已開始。%s"
 
 #: ../src/utils/pacat.c:376
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
-msgstr ""
+msgstr "串流移至裝置 %s (%u, %ssuspended)。%s"
 
 #: ../src/utils/pacat.c:376
 msgid "not "
-msgstr ""
+msgstr "不是"
 
 #: ../src/utils/pacat.c:383
 #, c-format
 msgid "Stream buffer attributes changed.%s"
-msgstr ""
+msgstr "串流緩衝特徵已變更。%s"
 
 #: ../src/utils/pacat.c:415
 #, c-format
 msgid "Connection established.%s"
-msgstr ""
+msgstr "連線已建立。%s"
 
 #: ../src/utils/pacat.c:418
 #, c-format
 msgid "pa_stream_new() failed: %s"
-msgstr ""
+msgstr "pa_stream_new() 失敗:%s"
 
 #: ../src/utils/pacat.c:450
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
-msgstr ""
+msgstr "pa_stream_connect_playback() 失敗:%s"
 
 #: ../src/utils/pacat.c:456
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
-msgstr ""
+msgstr "pa_stream_connect_record() 失敗:%s"
 
 #: ../src/utils/pacat.c:470
 #: ../src/utils/pactl.c:857
 #, c-format
 msgid "Connection failure: %s"
-msgstr ""
+msgstr "連線失敗:%s"
 
 #: ../src/utils/pacat.c:503
 msgid "Got EOF."
-msgstr ""
+msgstr "取得檔案結尾 (EOF)。"
 
 #: ../src/utils/pacat.c:540
 #, c-format
 msgid "write() failed: %s"
-msgstr ""
+msgstr "write() 失敗:%s"
 
 #: ../src/utils/pacat.c:561
 msgid "Got signal, exiting."
-msgstr ""
+msgstr "取得訊號,正在退出。"
 
 #: ../src/utils/pacat.c:575
 #, c-format
 msgid "Failed to get latency: %s"
-msgstr ""
+msgstr "未能取得傳輸延遲:%s"
 
 #: ../src/utils/pacat.c:580
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
-msgstr ""
+msgstr "時間:%0.3f 秒;延遲:%0.0f 微秒。"
 
 #: ../src/utils/pacat.c:599
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
-msgstr ""
+msgstr "pa_stream_update_timing_info() 失敗:%s"
 
 #: ../src/utils/pacat.c:609
 #, c-format
@@ -1241,41 +1241,41 @@ msgstr ""
 #: ../src/utils/pactl.c:953
 #, c-format
 msgid "Invalid client name '%s'"
-msgstr ""
+msgstr "無效的客戶端名稱「%s」"
 
 #: ../src/utils/pacat.c:779
 #, c-format
 msgid "Invalid stream name '%s'"
-msgstr ""
+msgstr "無效的串流名稱「%s」"
 
 #: ../src/utils/pacat.c:816
 #, c-format
 msgid "Invalid channel map '%s'"
-msgstr ""
+msgstr "無效的聲道對應表「%s」"
 
 #: ../src/utils/pacat.c:845
 #, c-format
 msgid "Invalid latency specification '%s'"
-msgstr ""
+msgstr "無效的延遲規格「%s」"
 
 #: ../src/utils/pacat.c:852
 #, c-format
 msgid "Invalid process time specification '%s'"
-msgstr ""
+msgstr "無效的程序時間規格「%s」"
 
 #: ../src/utils/pacat.c:864
 #, c-format
 msgid "Invalid property '%s'"
-msgstr ""
+msgstr "無效的屬性「%s」"
 
 #: ../src/utils/pacat.c:881
 #, c-format
 msgid "Unknown file format %s."
-msgstr ""
+msgstr "未知檔案格式 %s。"
 
 #: ../src/utils/pacat.c:900
 msgid "Invalid sample specification"
-msgstr ""
+msgstr "無效的取樣規格"
 
 #: ../src/utils/pacat.c:910
 #, c-format
@@ -1289,41 +1289,41 @@ msgstr "dup2(): %s"
 
 #: ../src/utils/pacat.c:922
 msgid "Too many arguments."
-msgstr ""
+msgstr "太多參數。"
 
 #: ../src/utils/pacat.c:933
 msgid "Failed to generate sample specification for file."
-msgstr ""
+msgstr "未能替檔案產生取樣規格。"
 
 #: ../src/utils/pacat.c:953
 msgid "Failed to open audio file."
-msgstr ""
+msgstr "未能開啟音效檔。"
 
 #: ../src/utils/pacat.c:959
 msgid "Warning: specified sample specification will be overwritten with specification from file."
-msgstr ""
+msgstr "警告:指定的取樣規格將會覆寫從檔案得到的規格。"
 
 #: ../src/utils/pacat.c:962
 #: ../src/utils/pactl.c:997
 msgid "Failed to determine sample specification from file."
-msgstr ""
+msgstr "未能從檔案得知取樣規格。"
 
 #: ../src/utils/pacat.c:971
 msgid "Warning: Failed to determine channel map from file."
-msgstr ""
+msgstr "警告:未能從檔案取得聲道對應表。"
 
 #: ../src/utils/pacat.c:982
 msgid "Channel map doesn't match sample specification"
-msgstr ""
+msgstr "聲道對應表與取樣規格不符"
 
 #: ../src/utils/pacat.c:993
 msgid "Warning: failed to write channel map to file."
-msgstr ""
+msgstr "警告:未能將聲道對應表寫入檔案。"
 
 #: ../src/utils/pacat.c:1008
 #, c-format
 msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr ""
+msgstr "正在開啟一道 %s 串流,取樣規格為「%s」,聲道對應表為「%s」。"
 
 #: ../src/utils/pacat.c:1009
 msgid "recording"
@@ -1336,31 +1336,31 @@ msgstr "播放控制"
 #: ../src/utils/pacat.c:1035
 #: ../src/utils/pactl.c:1267
 msgid "pa_mainloop_new() failed."
-msgstr ""
+msgstr "pa_mainloop_new() 失敗。"
 
 #: ../src/utils/pacat.c:1054
 msgid "io_new() failed."
-msgstr ""
+msgstr "io_new() 失敗。"
 
 #: ../src/utils/pacat.c:1061
 #: ../src/utils/pactl.c:1279
 msgid "pa_context_new() failed."
-msgstr ""
+msgstr "pa_context_new() 失敗。"
 
 #: ../src/utils/pacat.c:1069
 #: ../src/utils/pactl.c:1285
 #, c-format
 msgid "pa_context_connect() failed: %s"
-msgstr ""
+msgstr "pa_context_connect() 失敗:%s"
 
 #: ../src/utils/pacat.c:1075
 msgid "pa_context_rttime_new() failed."
-msgstr ""
+msgstr "pa_context_rttime_new() 失敗。"
 
 #: ../src/utils/pacat.c:1082
 #: ../src/utils/pactl.c:1290
 msgid "pa_mainloop_run() failed."
-msgstr ""
+msgstr "pa_mainloop_run() 失敗。"
 
 #: ../src/utils/pasuspender.c:81
 #, c-format
@@ -1370,37 +1370,37 @@ msgstr "fork(): %s\n"
 #: ../src/utils/pasuspender.c:92
 #, c-format
 msgid "execvp(): %s\n"
-msgstr ""
+msgstr "execvp(): %s\n"
 
 #: ../src/utils/pasuspender.c:109
 #, c-format
 msgid "Failure to suspend: %s\n"
-msgstr ""
+msgstr "未能暫停:%s\n"
 
 #: ../src/utils/pasuspender.c:124
 #, c-format
 msgid "Failure to resume: %s\n"
-msgstr ""
+msgstr "未能恢復:%s\n"
 
 #: ../src/utils/pasuspender.c:147
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
-msgstr ""
+msgstr "警告:音效伺服器並非本機,不會暫停。\n"
 
 #: ../src/utils/pasuspender.c:159
 #, c-format
 msgid "Connection failure: %s\n"
-msgstr ""
+msgstr "連線失敗:%s\n"
 
 #: ../src/utils/pasuspender.c:176
 #, c-format
 msgid "Got SIGINT, exiting.\n"
-msgstr ""
+msgstr "取得 SIGINT,正在退出。\n"
 
 #: ../src/utils/pasuspender.c:194
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
-msgstr ""
+msgstr "警告:子程序已被訊號 %u 所終止\n"
 
 #: ../src/utils/pasuspender.c:212
 #, c-format
@@ -1424,22 +1424,22 @@ msgstr ""
 #: ../src/utils/pasuspender.c:277
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
-msgstr ""
+msgstr "pa_mainloop_new() 失敗。\n"
 
 #: ../src/utils/pasuspender.c:290
 #, c-format
 msgid "pa_context_new() failed.\n"
-msgstr ""
+msgstr "pa_context_new() 失敗。\n"
 
 #: ../src/utils/pasuspender.c:298
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
-msgstr ""
+msgstr "pa_mainloop_run() 失敗。\n"
 
 #: ../src/utils/pactl.c:135
 #, c-format
 msgid "Failed to get statistics: %s"
-msgstr ""
+msgstr "未能取得統計:%s"
 
 #: ../src/utils/pactl.c:141
 #, c-format
@@ -1454,12 +1454,12 @@ msgstr ""
 #: ../src/utils/pactl.c:147
 #, c-format
 msgid "Sample cache size: %s\n"
-msgstr ""
+msgstr "取樣快取大小:%s\n"
 
 #: ../src/utils/pactl.c:156
 #, c-format
 msgid "Failed to get server information: %s"
-msgstr ""
+msgstr "未能取得伺服器資訊:%s"
 
 #: ../src/utils/pactl.c:164
 #, c-format
@@ -1478,7 +1478,7 @@ msgstr ""
 #: ../src/utils/pactl.c:205
 #, c-format
 msgid "Failed to get sink information: %s"
-msgstr ""
+msgstr "未能取得 sink 資訊:%s"
 
 #: ../src/utils/pactl.c:221
 #, c-format
@@ -1517,7 +1517,7 @@ msgstr ""
 #: ../src/utils/pactl.c:297
 #, c-format
 msgid "Failed to get source information: %s"
-msgstr ""
+msgstr "未能取得來源資訊:%s"
 
 #: ../src/utils/pactl.c:313
 #, c-format
@@ -1560,7 +1560,7 @@ msgstr "n/a"
 #: ../src/utils/pactl.c:375
 #, c-format
 msgid "Failed to get module information: %s"
-msgstr ""
+msgstr "未能取得模組資訊:%s"
 
 #: ../src/utils/pactl.c:393
 #, c-format
@@ -1576,7 +1576,7 @@ msgstr ""
 #: ../src/utils/pactl.c:412
 #, c-format
 msgid "Failed to get client information: %s"
-msgstr ""
+msgstr "未能取得客戶端資訊:%s"
 
 #: ../src/utils/pactl.c:430
 #, c-format
@@ -1591,7 +1591,7 @@ msgstr ""
 #: ../src/utils/pactl.c:447
 #, c-format
 msgid "Failed to get card information: %s"
-msgstr ""
+msgstr "未能取得音效卡資訊:%s"
 
 #: ../src/utils/pactl.c:465
 #, c-format
@@ -1607,17 +1607,17 @@ msgstr ""
 #: ../src/utils/pactl.c:479
 #, c-format
 msgid "\tProfiles:\n"
-msgstr ""
+msgstr "\t個人設定檔:\n"
 
 #: ../src/utils/pactl.c:485
 #, c-format
 msgid "\tActive Profile: %s\n"
-msgstr ""
+msgstr "\t啟用的個人設定檔:%s\n"
 
 #: ../src/utils/pactl.c:496
 #, c-format
 msgid "Failed to get sink input information: %s"
-msgstr ""
+msgstr "未能取得 sink 輸入資訊:%s"
 
 #: ../src/utils/pactl.c:515
 #, c-format
@@ -1643,7 +1643,7 @@ msgstr ""
 #: ../src/utils/pactl.c:554
 #, c-format
 msgid "Failed to get source output information: %s"
-msgstr ""
+msgstr "未能取得來源輸出資訊:%s"
 
 #: ../src/utils/pactl.c:574
 #, c-format
@@ -1665,7 +1665,7 @@ msgstr ""
 #: ../src/utils/pactl.c:605
 #, c-format
 msgid "Failed to get sample information: %s"
-msgstr ""
+msgstr "未能取得取樣資訊:%s"
 
 #: ../src/utils/pactl.c:623
 #, c-format
@@ -1689,16 +1689,16 @@ msgstr ""
 #: ../src/utils/pactl.c:663
 #, c-format
 msgid "Failure: %s"
-msgstr ""
+msgstr "失敗:%s"
 
 #: ../src/utils/pactl.c:687
 #, c-format
 msgid "Failed to upload sample: %s"
-msgstr ""
+msgstr "未能上傳樣本:%s"
 
 #: ../src/utils/pactl.c:704
 msgid "Premature end of file"
-msgstr ""
+msgstr "未完成的檔案結尾"
 
 #: ../src/utils/pactl.c:863
 msgid "Got SIGINT, exiting."
@@ -1746,15 +1746,15 @@ msgstr ""
 
 #: ../src/utils/pactl.c:979
 msgid "Please specify a sample file to load"
-msgstr ""
+msgstr "請旨定要載入的取樣檔"
 
 #: ../src/utils/pactl.c:992
 msgid "Failed to open sound file."
-msgstr ""
+msgstr "未能開啟音效檔。"
 
 #: ../src/utils/pactl.c:1004
 msgid "Warning: Failed to determine sample specification from file."
-msgstr ""
+msgstr "警告:未能從檔案得知取樣規格。"
 
 #: ../src/utils/pactl.c:1014
 msgid "You have to specify a sample name to play"
@@ -1859,7 +1859,7 @@ msgstr ""
 #: ../src/utils/pax11publish.c:94
 #, c-format
 msgid "Failed to parse command line.\n"
-msgstr "解析命令列失敗。\n"
+msgstr "未能解析命令列。\n"
 
 #: ../src/utils/pax11publish.c:108
 #, c-format
@@ -1884,37 +1884,37 @@ msgstr "Cookie: %s\n"
 #: ../src/utils/pax11publish.c:132
 #, c-format
 msgid "Failed to parse cookie data\n"
-msgstr ""
+msgstr "未能解析 cookie 資料\n"
 
 #: ../src/utils/pax11publish.c:137
 #, c-format
 msgid "Failed to save cookie data\n"
-msgstr ""
+msgstr "未能儲存 cookie 資料\n"
 
 #: ../src/utils/pax11publish.c:152
 #, c-format
 msgid "Failed to load client configuration file.\n"
-msgstr ""
+msgstr "未能載入客戶端配置檔。\n"
 
 #: ../src/utils/pax11publish.c:157
 #, c-format
 msgid "Failed to read environment configuration data.\n"
-msgstr ""
+msgstr "未能讀取環境配置資料。\n"
 
 #: ../src/utils/pax11publish.c:174
 #, c-format
 msgid "Failed to get FQDN.\n"
-msgstr ""
+msgstr "未能取得 FQDN。\n"
 
 #: ../src/utils/pax11publish.c:194
 #, c-format
 msgid "Failed to load cookie data\n"
-msgstr ""
+msgstr "未能載入 cookie 資料\n"
 
 #: ../src/utils/pax11publish.c:211
 #, c-format
 msgid "Not yet implemented.\n"
-msgstr ""
+msgstr "尚未實作。\n"
 
 #: ../src/utils/pacmd.c:69
 msgid "No PulseAudio daemon running, or not running as session daemon."
@@ -1932,7 +1932,7 @@ msgstr "connect(): %s"
 
 #: ../src/utils/pacmd.c:99
 msgid "Failed to kill PulseAudio daemon."
-msgstr ""
+msgstr "未能結束 PulseAudio 幕後程式。"
 
 #: ../src/utils/pacmd.c:107
 msgid "Daemon not responding."
@@ -2052,19 +2052,19 @@ msgstr "視訊"
 
 #: ../src/modules/alsa/alsa-mixer.c:1710
 msgid "Automatic Gain Control"
-msgstr ""
+msgstr "自動增益控制"
 
 #: ../src/modules/alsa/alsa-mixer.c:1711
 msgid "No Automatic Gain Control"
-msgstr ""
+msgstr "無自動增益控制"
 
 #: ../src/modules/alsa/alsa-mixer.c:1712
 msgid "Boost"
-msgstr ""
+msgstr "加速器"
 
 #: ../src/modules/alsa/alsa-mixer.c:1713
 msgid "No Boost"
-msgstr ""
+msgstr "無加速器"
 
 #: ../src/modules/alsa/alsa-mixer.c:1714
 msgid "Amplifier"

commit f7415e3ce98472e8b5da002276ddaf505c2f3394
Author: Cheng-Chia Tseng <pswo10680 at gmail.com>
Date:   Sat Feb 20 09:58:28 2010 +0000

    l10n: Updates to Chinese (Taiwan) (zh_TW) translation
    
    Transmitted-via: Transifex (www.transifex.net)

diff --git a/po/zh_TW.po b/po/zh_TW.po
index 5fa7550..18b94c4 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -1,7 +1,7 @@
-# SOME DESCRIPTIVE TITLE.
+# Chinese (Taiwan) translation for pulseaudio.
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+# Cheng-Chia Tseng <pswo10680 at gmail.com>, 2010
 #
 msgid ""
 msgstr ""

commit cde8044f28483ad0666cc12b94d07b6d46f76458
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sun Feb 21 21:15:10 2010 +0100

    i18n: update LINGUAS

diff --git a/po/LINGUAS b/po/LINGUAS
index 14414f4..205e482 100644
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -2,14 +2,16 @@ as
 bn_IN
 ca
 cs
-de
 de_CH
+de
 el
 es
 fi
 fr
 gu
+he
 hi
+hu
 it
 ja
 kn
@@ -19,12 +21,14 @@ nl
 or
 pa
 pl
-pt
 pt_BR
-sr
+pt
+ru
 sr at latin
+sr
 sv
 ta
 te
 uk
 zh_CN
+zh_TW

commit ebf2116810fa8f18baf1fa693eaf35a8a83109ee
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sun Feb 21 21:16:33 2010 +0100

    i18n: run make update-po

diff --git a/po/as.po b/po/as.po
index 9586cba..0c20a63 100644
--- a/po/as.po
+++ b/po/as.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.as\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-07 08:36+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-12-11 17:11+0530\n"
 "Last-Translator: Amitakhya Phukan <aphukan at fedoraproject.org>\n"
 "Language-Team: Assamese <>\n"
@@ -17,12 +17,12 @@ msgstr ""
 "X-Generator: Lokalize 0.2\n"
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -34,7 +34,7 @@ msgstr ""
 "অতি সম্ভৱ এইটো ALSA চালক '%s' ৰ এটা বাগ । অনুগ্ৰহ কৰি এই সমস্যা ALSA বিকাশকক "
 "জনাওক ।"
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -46,7 +46,7 @@ msgstr ""
 "অতি সম্ভৱ এইটো ALSA চালক '%s' ৰ এটা বাগ । অনুগ্ৰহ কৰি এই সমস্যা ALSA বিকাশকক "
 "জনাওক ।"
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -92,11 +92,11 @@ msgstr "NULL sink ৰ সময় নিৰ্ধাৰণ"
 msgid "Null Output"
 msgstr "Null ফলাফল"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "আভ্যন্তৰীণ অ'ডিঅ'"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "মোডেম"
 
@@ -112,248 +112,269 @@ msgstr "নতুন dl loader বিতৰণ কৰিবলৈ বিফল 
 msgid "Failed to add bind-now-loader."
 msgstr "bind now loader যোগ কৰিবলৈ বিফল ।"
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "চিগ্নেল %s পোৱা গ'ল ।"
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "প্ৰস্থান কৰা হৈছে ।"
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "ব্যৱহাৰকৰ্তা '%s' পোৱা ন'গ'ল ।"
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "'%s' সমষ্টি পোৱা ন'গ'ল ।"
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "ব্যৱহাৰকৰ্তা '%s' (UID %lu) আৰু সমষ্টি '%s' (GID %lu) পোৱা গ'ল ।"
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "ব্যৱহাৰকৰ্তা '%s' আৰু সমষ্টি '%s' ৰ GID অমিল ।"
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "ব্যৱহাৰকৰ্তা '%s' ৰ ঘৰৰ পঞ্জিকা '%s' নহয়, আওকাণ কৰা হৈছে ।"
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "'%s' সৃষ্টি কৰিবলৈ বিফল: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "সমষ্টিৰ তালিকা সলনি কৰিবলৈ ব্যৰ্থ: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "GID সলনি কৰিবলৈ ব্যৰ্থ: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "UID সলনি কৰিবলৈ ব্যৰ্থ: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "ৰূটৰ অধিকাৰ সফলভাবে এৰোৱা গ'ল ।"
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "এই স্থাপত্যত প্ৰণালী ব্যাপক মোড অসমৰ্থিত ।"
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) বিফল: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "আদেশ শাৰী বিশ্লেষণ কৰিবলৈ বিফল ।"
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "ডেমন নাই চলা"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "PID %u ৰূপে ডেমন চলিছে"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "ডেমন kill কৰিবলৈ ব্যৰ্থ: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
 msgstr ""
 "root পৰিচয়ে এই প্ৰোগ্ৰাম সঞ্চালিত হোৱা উচিত নহয় (ন'হ'লে   system উল্লিখিত হয়) ।"
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Root ৰ অধিকাৰ আৱশ্যক ।"
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "প্ৰণালী চানেকিৰ ক্ষেত্ৰত   start সমৰ্থিত নহয় ।"
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "প্ৰণালী মোডত চলিছে, কিন্তু   disallow exit নিৰ্ধাৰিত নহয়!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr "প্ৰণালী মোডত চলিছে, কিন্তু   disallow module loading নিৰ্ধাৰিত নহয়!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "প্ৰণালী মোডত চলিছে, SHM মোড বলপূৰ্বক নিষ্ক্ৰিয় কৰা হৈছে!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 "প্ৰণালী মোডত চলিছে, কাম নকৰা সময়ৰ পৰা প্ৰস্থান কৰা বলপূৰ্বক নিষ্ক্ৰিয় কৰা হৈছে!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "stdio প্ৰাপ্ত কৰিবলৈ ব্যৰ্থ ।"
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "pipe বিফল: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() বিফল: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() বিফল: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "ডেমন আৰম্ভ কৰিবলৈ বিফল ।"
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "সফলতাৰে ডেমন আৰম্ভ কৰা হৈছে ।"
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() বিফল: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "এইটো PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "সঙ্কলনৰ গৃহস্থ: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "সঙ্কলনৰ CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "গৃহস্থত চলোৱা হৈছে: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u CPU পোৱা গৈছে ।"
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "পেজৰ মাপ %lu bytes"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Valgrind সমৰ্থনৰ সৈতে সঙ্কলন কৰা হৈছে: হয়"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Valgrind সমৰ্থনৰ সৈতে সঙ্কলন কৰা হৈছে: নহয়"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "valgrind মোডত চলিছে: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "গৃহস্থত চলোৱা হৈছে: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Optimized build: হয়"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Optimized build: নহয়"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG ব্যাখ্যা কৰা হৈছে, সকলো asserts নিষ্ক্ৰিয় কৰা হৈছে ।"
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH ব্যাখ্যা কৰা হৈছে, অকল fast path asserts নিষ্ক্ৰিয় কৰা হৈছে ।"
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "সকলো asserts সক্ৰিয় কৰা হৈছে ।"
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "যন্ত্ৰ ID প্ৰাপ্ত কৰিবলৈ ব্যৰ্থ"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "যন্ত্ৰ ID হ'ল %s ।"
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "সেশান ID হল %s।"
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "ৰান টাইম পঞ্জিকা %s ব্যৱহাৰ কৰা হৈছে ।"
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "অৱস্থাসূচক পঞ্জিকা %s ব্যৱহাৰ কৰা হৈছে ।"
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "মডিউল ডিৰেক্টৰি %s ব্যৱহাৰ কৰা হচ্ছে।"
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "প্ৰণালী মোডত চলিছে: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -367,15 +388,15 @@ msgstr ""
 "সিস্টেম মোডে ব্যৱহাৰেৰ সমস্যা সম্পৰ্কে জানতে হলে http://pulseaudio.org/wiki/"
 "WhatIsWrongWithSystemMode দেখুন।"
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() ব্যৰ্থ ।"
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "নতুন high resolution timers পোৱা হয়! অভিনন্দন!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -383,28 +404,28 @@ msgstr ""
 "শ্ৰীমান, আপোনাৰ কাৰ্ণেল পূৰণি! high resolution timer সক্ৰিয় থকা Linux ক আজি "
 "উপদেশ দিয়া হয়!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() ব্যৰ্থ ।"
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "ডেমন আৰম্ভ কৰিবলৈ ব্যৰ্থ ।"
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr ""
 "তুলি লোৱা মডিউল নোহোৱাকে ডেমন আৰম্ভ কৰা হৈছে, কোনো কাম সঞ্চালন কৰা সম্ভৱ নহয় ।"
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "ডেমন আৰম্ভ কৰা সম্পূৰ্ণ ।"
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "ডেমন বন্ধ কৰাৰ প্ৰক্ৰিয়া আৰম্ভ কৰা হৈছে ।"
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "ডেমন বন্ধ কৰা হৈছে ।"
 
@@ -661,72 +682,77 @@ msgstr "অবচিত কৰাৰ সতৰ্কবাৰ্তা: %s\n"
 msgid "Path: %s\n"
 msgstr "পাথ: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] লগ লক্ষ্য '%s' বৈধ নহয় ।"
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] লগৰ স্তৰ '%s' বৈধ নহয় ।"
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] resample পদ্ধতি '%s' বৈধ নহয় ।"
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] rlimit '%s' বৈধ নহয় ।"
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] এই স্থাপত্যত rlimit সমৰ্থিত নহয় ।"
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] চানেকিৰ বিন্যাস '%s' বৈধ নহয় ।"
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] চানেকিৰ মাত্ৰা '%s' বৈধ নহয় ।"
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] চানেকিৰ চেনেল '%s' বৈধ নহয়"
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] চেনেল মেপ '%s' বৈধ নহয় ।"
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] অংশৰ সংখ্যা '%s' বৈধ নহয় ।"
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] অংশৰ মাপ '%s' বৈধ নহয় ।"
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] nice স্তৰ '%s' বৈধ নহয় ।"
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] চানেকিৰ মাত্ৰা '%s' বৈধ নহয় ।"
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "বিন্যাস নথিপত্ৰ খুলিবলৈ ব্যৰ্থ: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -734,7 +760,7 @@ msgstr ""
 "নিৰ্ধাৰিত অবিকল্পিত চেনেল মেপত নিৰ্ধাৰিত অবিকল্পিত চেনেলৰ সংখ্যাতকে বেলেগ সংখ্যক "
 "চেনেল আছে ।"
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### চিহ্নিত বিন্যাস নথিপত্ৰৰ পৰা পঢ়া হ'ব: %s ###\n"
@@ -780,8 +806,8 @@ msgid "Rear Right"
 msgstr "পিছত সোঁফালে"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Low Frequency Emmiter"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1126,191 +1152,191 @@ msgstr "XOpenDisplay() ব্যৰ্থ"
 msgid "Failed to parse cookie data"
 msgstr "কুকিৰ তথ্য বিশ্লেষণ কৰিবলৈ ব্যৰ্থ"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "বিন্যাস নথিপত্ৰ '%s' খুলিবলৈ ব্যৰ্থ: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "কোনো কুকি তুলি লোৱা নহয় । কুকি নোহোৱাকে সংযোগৰ প্ৰচেষ্টা কৰা হৈছে ।"
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "অজানা এক্সটেনশন '%s' ৰ বাবে বাৰ্তা প্ৰাপ্ত হৈছে"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "স্ট্ৰিম ড্ৰেইন (অৰ্থাৎ ফাঁকা) কৰতে ব্যৰ্থ: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "প্লে ব্যাক স্ট্ৰিম ফাঁকা কৰা হয়েছে।"
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "সাৰ্ভাৰেৰ সাথে স্থাপিত সংযোগ ফাঁকা কৰা হচ্ছে।"
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() ব্যৰ্থ: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_write() ব্যৰ্থ: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() ব্যৰ্থ: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "সাফল্যেৰ সাথে স্ট্ৰিম নিৰ্মিত হয়েছে।"
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() ব্যৰ্থ: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "বাফাৰেৰ মাপ: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "বাফাৰেৰ মাপ: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "স্যাম্পেলেৰ spec '%s', ও চ্যানেল ম্যাপ '%s' ব্যৱহাৰ কৰা হচ্ছে।"
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "যন্ত্ৰ %s ৰ সাথে সংযোগ কৰা হয়েছে (%u, %ssuspended)।"
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "ষ্ট্ৰিম সংক্ৰান্ত ত্ৰুটি: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "স্ট্ৰিম যন্ত্ৰ স্থগিত কৰা হয়েছে। %s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "স্ট্ৰিম যন্ত্ৰ পুনৰাৰম্ভ কৰা হয়েছে। %s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "ধীৰ গতিৰ স্ট্ৰিম.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "স্ট্ৰিম মাত্ৰা অতিক্ৰম কৰিছে।%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "স্ট্ৰিম আৰম্ভ কৰা হয়েছে। %s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "%s যন্ত্ৰে স্ট্ৰিম স্থানান্তৰ কৰা হয়েছে (%u, %ssuspended)।%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "not "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "স্ট্ৰিম বাফাৰেৰ এট্ৰিবিউট পৰিবৰ্তিত হয়েছে। %s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "সংযোগ স্থাপিত হয়েছে।%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() ব্যৰ্থ: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() ব্যৰ্থ: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() ব্যৰ্থ: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "সংযোগ বিফল: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "ফাইলেৰ সমাপ্তি সনাক্ত হয়েছে।"
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() ব্যৰ্থ: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "সিগন্যাল প্ৰাপ্ত হয়েছে, প্ৰস্থান কৰা হ'ব।"
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "লেটেন্সিৰ পৰিমাণ প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "সময়: %0.3f ছেকেণ্ড; লেটেন্সি: %0.0f usec ।"
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() ব্যৰ্থ: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1362,10 +1388,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [options]\n"
@@ -1424,7 +1454,7 @@ msgstr ""
 "        file format=FFORMAT             Record/play formatted PCM data.\n"
 "        list file formats               List available file formats.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1435,68 +1465,68 @@ msgstr ""
 "libpulse ৰ সৈতে সঙ্কলন কৰা হৈছে %s\n"
 "libpulse ৰ সৈতে যুক্ত %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "ক্লায়েন্টেৰ নাম '%s' বৈধ নয়"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "স্ট্ৰিমেৰ নাম '%s' বৈধ নয়।"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "চ্যানেল ম্যাপ '%s' বৈধ নয়"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "লেটেন্সিৰ জন্য নিৰ্ধাৰিত বৈশিষ্ট্য '%s' বৈধ নয়"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "প্ৰসেসেৰ সময়েৰ বৈশিষ্ট্য '%s' বৈধ নয়"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "বৈশিষ্ট্য '%s' বৈধ নয়।"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "ফাইলেৰ অজানা বিন্যাস %s।"
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "অবৈধ স্যাম্পেল নিৰ্ধাৰিত"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "অত্যাধিক আৰ্গুমেন্ট।"
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "স্যাম্পেলেৰ মান নিৰ্ধাৰণেৰ ফাইল নিৰ্মাণ কৰতে ব্যৰ্থ"
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "শব্দেৰ ফাইল খুলতে ব্যৰ্থ।"
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
@@ -1504,103 +1534,104 @@ msgstr ""
 "সতৰ্কবাৰ্তা: চিহ্নিত স্যাম্পেল নিৰ্ধাৰণেৰ ফাইলটিৰ তথ্য, এই ফাইলেৰৰ পৰা উপলব্ধ তথ্য "
 "দ্বাৰা প্ৰতিস্থাপিত হ'ব।"
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "ফাইলৰ পৰা স্যাম্পেল সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ।"
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "সতৰ্কবাৰ্তা: ফাইলৰ পৰা চ্যানেলেৰ ম্যাপ নিৰ্ধাৰণ কৰতে ব্যৰ্থ।"
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "চ্যানেলেৰ ম্যাপ ও স্যাম্পেলেৰ নিৰ্ধাৰিত মানে গৰমিল"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "সতৰ্কবাৰ্তা: ফাইলেত চ্যানেলেৰ ম্যাপ লিখতে ব্যৰ্থ।"
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
 "এটা %s স্ট্ৰিম খোলা হচ্ছে। এটিৰ জন্য '%s' ৰ স্যাম্পেলেৰ নিৰ্ধাৰিত মান ও '%s' "
 "চ্যানেলেৰ ম্যাপ প্ৰয়োগ কৰা হ'ব।"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "ৰেকৰ্ড কৰা হৈছে"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "প্লে বেক"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() ব্যৰ্থ।"
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() ব্যৰ্থ।"
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() ব্যৰ্থ।"
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() ব্যৰ্থ: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() ব্যৰ্থ।"
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() ব্যৰ্থ।"
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "স্থগিত কৰিবলৈ ব্যৰ্থ: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "পুনৰাৰম্ভ কৰিবলৈ ব্যৰ্থ: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "সতৰ্কবাৰ্তা: ধ্বনি সেৱক স্থানীয় নহয়, স্থগিত কৰা নহয় ।\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "<b>সংযোগৰ মোড</b>: %s<br>\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "SIGINT প্ৰাপ্ত হৈছে, প্ৰস্থান কৰা হৈছে ।\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "সতৰ্কবাৰ্তা: চিগ্নেল %u দ্বাৰা চাইল্ড প্ৰক্ৰিয়া বন্ধ কৰা হৈছে\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1619,7 +1650,7 @@ msgstr ""
 "to\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1630,50 +1661,61 @@ msgstr ""
 "libpulse ৰ সৈতে সঙ্কলন কৰা হৈছে %s\n"
 "libpulse ৰ সৈতে যুক্ত %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() ব্যৰ্থ ।\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() ব্যৰ্থ ।\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() ব্যৰ্থ ।\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "পৰিসংখ্যান প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "বৰ্ত্তমানে ব্যৱহৃত: %u blocks containing %s bytes total.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "সম্পূৰ্ণ জীৱনকালত বিতৰণ কৰা: %u blocks containing %s bytes total.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "চানেকি কেশ্বৰ মাপ: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "সাৰ্ভাৰ সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1681,7 +1723,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "ব্যৱহাৰকৰ্তাৰ নাম: %s\n"
 "গৃহস্থৰ নাম: %s\n"
@@ -1693,12 +1735,12 @@ msgstr ""
 "অবিকল্পিত উৎস: %s\n"
 "কুকি: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "sink সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1737,22 +1779,22 @@ msgstr ""
 "\tগুণ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tপোৰ্ট:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tসক্ৰিয় পোৰ্ট: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "উৎস সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1791,20 +1833,20 @@ msgstr ""
 "\tগুণ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n/a"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "মডিউল সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1821,12 +1863,12 @@ msgstr ""
 "\tগুণ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "ক্লায়েন্ট সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1841,12 +1883,12 @@ msgstr ""
 "\tগুণ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "কাৰ্ড সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1863,22 +1905,22 @@ msgstr ""
 "\tগুণ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tপাৰ্শ্বৰূপ:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tসক্ৰিয় পাৰ্শ্বৰূপ: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "sink নিবেশ সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1915,12 +1957,12 @@ msgstr ""
 "\tগুণ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "উৎস নিৰ্গম সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1949,12 +1991,12 @@ msgstr ""
 "\tগুণ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "স্যাম্পেল সংক্ৰান্ত তথ্য প্ৰাপ্ত কৰতে ব্যৰ্থ: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1985,26 +2027,80 @@ msgstr ""
 "\tগুণ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "ব্যৰ্থতা: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "স্যাম্পেল আপলোড কৰতে ব্যৰ্থ: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "সম্পূৰ্ণ হওয়াৰ পূৰ্বে ফাইল সমাপ্ত হয়েছে"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "সেৱক বৈধ নহয়"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT প্ৰাপ্ত হয়েছে, প্ৰস্থান কৰা হয়েছে।"
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2027,6 +2123,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2066,7 +2163,7 @@ msgstr ""
 "   n,   client name=NAME                How to call this client on the "
 "server\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2077,103 +2174,104 @@ msgstr ""
 "libpulseৰ সৈতে সঙ্কলন কৰা %s\n"
 "libpulse ৰ সৈতে যুক্ত %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "লোড কৰাৰ উদ্দেশ্যে অনুগ্ৰহ কৰি এটা স্যাম্পেল ফাইল উল্লেখ কৰুন"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "শব্দেৰ ফাইল খুলতে ব্যৰ্থ।"
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "সতৰ্কবাৰ্তা: ফাইলৰ পৰা স্যাম্পেলেৰ নিৰ্ধাৰিত মাপ নিৰ্মাণ কৰতে ব্যৰ্থ।"
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "বাজানোৰ উদ্দেশ্যে এটা স্যাম্পেল ফাইল উল্লেখ কৰা আবশ্যক"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "অপসাৰণেৰ উদ্দেশ্যে এটা স্যাম্পেল ফাইল উল্লেখ কৰা আবশ্যক"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "সিংক নিবেশ ইন্ডেক্স ও এটা সিংক নিৰ্ধাৰণ কৰা আবশ্যক"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "সোৰ্স নিৰ্গম ইন্ডেক্স ও এটা সোৰ্স নিৰ্ধাৰণ কৰা আবশ্যক"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "মডিউলেৰ নাম ও আৰ্গুমেন্ট নিৰ্ধাৰণ কৰা আবশ্যক।"
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "মডিউল ইন্ডেক্স নিৰ্ধাৰণ কৰা আবশ্যক"
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
 msgstr "একাধিক সিংক নিৰ্ধাৰণ কৰা যাবে না। বুলিয়েন মান নিৰ্ধাৰণ কৰা আবশ্যক।"
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
 msgstr "একাধিক সোৰ্স নিৰ্ধাৰণ কৰা যাবে না। বুলিয়েন মান নিৰ্ধাৰণ কৰা আবশ্যক।"
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "কাৰ্ডেৰ নাম/ইন্ডেক্স ও এটা প্ৰোফাইলেৰ নাম উল্লেখ কৰা আবশ্যক"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "sink ৰ নাম/ইন্ডেক্স ও এটা পোৰ্টেৰ নাম উল্লেখ কৰা আবশ্যক"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "উৎসেৰ নাম/ইন্ডেক্স ও এটা পোৰ্টে নাম উল্লেখ কৰা আবশ্যক"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "sink ৰ নাম/ইন্ডেক্স ও এটা পোৰ্টেৰ নাম উল্লেখ কৰা আবশ্যক"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "অবৈধ শব্দেৰ মাত্ৰা নিৰ্ধাৰিত"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "উৎসেৰ নাম/ইন্ডেক্স ও এটা শব্দেৰ মাত্ৰা উল্লেখ কৰা আবশ্যক"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "সিংক নিবেশ ইন্ডেক্স ও শব্দেৰ মাত্ৰা নিৰ্ধাৰণ কৰা আবশ্যক"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "সিংক নিবেশ ইন্ডেক্স বৈধ নয়"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "sink ৰ নাম/ইন্ডেক্স ও এটা নিঃশব্দতাৰ বুলিয়ান উল্লেখ কৰা আবশ্যক"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "উৎসেৰ নাম/ইন্ডেক্স ও নিঃশব্দতাৰ বুলিয়ান উল্লেখ কৰা আবশ্যক"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "সিংক নিবেশ ইন্ডেক্স ও নিঃশব্দতাৰ বুলিয়ান নিৰ্ধাৰণ কৰা আবশ্যক"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "অবৈধ সিংক নিবেশ ইন্ডেক্স নিৰ্ধাৰিত"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "কোনো বৈধ কমান্ড নিৰ্ধাৰিত হয়নি।"
 
@@ -2256,44 +2354,44 @@ msgstr "কুকি সংক্ৰান্ত তথ্য তুলিবল
 msgid "Not yet implemented.\n"
 msgstr "এতিয়াও বাস্তবায়িত নহয় ।\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr "PulseAudio ডেমন চলছে না বা সেশানৰ ডেমন ৰূপে চলছে না।"
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "PulseAudio ডেমন kill কৰিবলৈ ব্যৰ্থ ।"
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "ডেমনৰ পৰা কোনো প্ৰতিক্ৰিয়া পোৱা নাযায় ।"
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "autospawn লক প্ৰয়োগ কৰিবলৈ ব্যৰ্থ ।"
 
@@ -2330,38 +2428,42 @@ msgstr ""
 "দিলে বা অন্য এটা মান < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "বন্ধ"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "High Fidelity Playback (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "হাই ফিডেলিটি ক্যাপচাৰ (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Telephony Duplex (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio ধ্বনি সেৱক"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "নিৰ্গম যন্ত্ৰ"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "নিবেশ যন্ত্ৰ"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "@HOSTNAME@ ত অ'ডিঅ'"
 
@@ -2425,133 +2527,159 @@ msgstr "বিবৰ্ধক"
 msgid "No Amplifier"
 msgstr "বিবৰ্ধন প্ৰয়োগ কৰা ন'হ'ব"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "বুস্ট"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "বুস্ট প্ৰয়োগ কৰা ন'হ'ব"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "এনালগ হেড ফোন"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "এনালগ নিবেশ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "এনালগ মাইক্ৰোফোন"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "এনালগ লাইন ইন"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "এনালগ ৰেডিও"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "এনালগ ভিডিঅ'"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "এনালগ নিৰ্গম"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "এনালগ হেড ফোন"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "এনালগ নিৰ্গম (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "এনালগ মোনো নিৰ্গম"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "এনালগ স্টিৰিঅ'"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "এনালগ মোনো"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "এনালগ স্টিৰিঅ'"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "এনালগ ছাৰাউন্ড ২.১"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "এনালগ ছাৰাউন্ড ৩.০"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "এনালগ ছাৰাউন্ড ৩.১"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "এনালগ ছাৰাউন্ড ৪.০"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "এনালগ ছাৰাউন্ড ৪.১"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "এনালগ ছাৰাউন্ড ৫.০"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "এনালগ ছাৰাউন্ড ৫.১"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "এনালগ ছাৰাউন্ড ৬.০"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "এনালগ ছাৰাউন্ড ৬.১"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "এনালগ ছাৰাউন্ড ৭.০"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "এনালগ ছাৰাউন্ড ৭.১"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "ডিজিটেল স্টিৰিঅ' (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "ডিজিটেল ছাৰাউন্ড ৪.০ (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "ডিজিটেল ছাৰাউন্ড ৪.০ (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "ডিজিটেল ছাৰাউন্ড ৫.১ (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "ডিজিটেল স্টিৰিঅ' (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "এনালগ মোনো ডুপ্লেক্স"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "এনালগ স্টিৰিঅ' ডুপ্লেক্স"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "ডিজিটেল স্টিৰিঅ' ডুপ্লেক্স (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Low Frequency Emmiter"
diff --git a/po/bn_IN.po b/po/bn_IN.po
index 65b26cc..1e11457 100644
--- a/po/bn_IN.po
+++ b/po/bn_IN.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.bn_IN\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-07 08:36+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-12-08 14:34+0530\n"
 "Last-Translator: Runa Bhattacharjee <runab at redhat.com>\n"
 "Language-Team: Bengali INDIA <anubad at lists.ankur.org.in>\n"
@@ -18,12 +18,12 @@ msgstr ""
 "X-Generator: KBabel 1.11.4\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -35,7 +35,7 @@ msgstr ""
 "সম্ভবত এটি ALSA ড্রাইভার '%s'-র একটি বাগ। অনুগ্রহ করে এই সমস্যা সম্বন্ধে ALSA "
 "ডিভেলপরদের সূচিত করুন।"
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -47,7 +47,7 @@ msgstr ""
 "সম্ভবত এটি ALSA ড্রাইভার '%s'-র একটি বাগ। অনুগ্রহ করে এই সমস্যা সম্বন্ধে ALSA "
 "ডিভেলপরদের সূচিত করুন।"
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -61,7 +61,8 @@ msgstr ""
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr "সর্বদা অন্তত একটি sink লোড করে রাখা হবে, প্রয়োজনে null sink ব্যবহার করা হবে"
+msgstr ""
+"সর্বদা অন্তত একটি sink লোড করে রাখা হবে, প্রয়োজনে null sink ব্যবহার করা হবে"
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
@@ -93,11 +94,11 @@ msgstr "NULL sink-র সময় নির্ধারণ"
 msgid "Null Output"
 msgstr "Null ফলাফল"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "অভ্যন্তরীণ অডিও"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "মোডেম"
 
@@ -113,249 +114,272 @@ msgstr "নতুন dl লোডার বরাদ্দ করতে ব্
 msgid "Failed to add bind-now-loader."
 msgstr "bind-now-loader যোগ করতে ব্যর্থ।"
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "%s সিগন্যাল প্রাপ্ত হয়েছে।"
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "প্রস্থান করা হচ্ছে।"
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "'%s' ব্যবহারকারী সন্ধান করতে ব্যর্থ।"
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "দল '%s' সন্ধান করতে ব্যর্থ।"
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "ব্যবহারকারী '%s' (UID %lu) ও দল '%s' (GID %lu) প্রাপ্ত হয়েছে।"
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "'%s' ব্যবহারকারীর ও '%s' দলের GID-র মধ্যে গরমিল।"
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
-msgstr "'%s' ব্যবহারকারী ব্যক্তিগত ডিরেক্টরি রূপে '%s' ধার্য করা হয়নি, অগ্রাহ্য করা হবে।"
+msgstr ""
+"'%s' ব্যবহারকারী ব্যক্তিগত ডিরেক্টরি রূপে '%s' ধার্য করা হয়নি, অগ্রাহ্য করা হবে।"
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "'%s' নির্মাণ করতে ব্যর্থ: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "দলের তালিকা পরিবর্তন করতে ব্যর্থ: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "GID পরিবর্তন করতে ব্যর্থ: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "UID পরিবর্তন করতে ব্যর্থ: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "root-র অধিকার সাফল্যের সাথে বর্জন করা হয়েছে।"
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "এই প্ল্যাটফর্মে, সিস্টেমব্যাপী মোড সমর্থিত নয়।"
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) বিফল: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "কমান্ড-লাইন পার্স করতে ব্যর্থ।"
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "ডেমন চলছে না"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "PID %u রূপে ডেমন চলছে"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "ডেমন kill করতে ব্যর্থ: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
-msgstr "root পরিচয়ে এই প্রোগ্রামটি সঞ্চালিত হওয়া উচিত নয় (যদি না --system উল্লিখিত হয়)।"
+msgstr ""
+"root পরিচয়ে এই প্রোগ্রামটি সঞ্চালিত হওয়া উচিত নয় (যদি না --system উল্লিখিত হয়)।"
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Root-র অধিকার আবশ্যক।"
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "সিস্টেম ইনস্ট্যান্সের ক্ষেত্রে --start সমর্থিত নয়।"
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "সিস্টেম মোডে চলছে, কিন্তু --disallow-exit নির্ধারিত হয়নি!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr "সিস্টেম মোডে চলছে, কিন্তু --disallow-module-loading নির্ধারিত হয়নি!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "সিস্টেম মোডে চলছে, SHM মোড বলপূর্বক নিষ্ক্রিয় করা হচ্ছে!"
 
 # http://linux.die.net/man/1/pulseaudio এখানে রেফারেন্স পাওয়া যাবে
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 "সিস্টেম মোডে চলছে, কর্মহীন অবস্থার জন্য ধার্য সময়সীমা পূর্তী পরে প্রস্থানের ব্যবস্থা "
 "বলপূর্বক নিষ্ক্রিয় করা হচ্ছে!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "stdio প্রাপ্ত করতে ব্যর্থ।"
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "পাইপ বিফল: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() বিফল: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() বিফল: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "ডেমন আরম্ভ করতে বিফল।"
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "সাফল্যের সাথে ডেমন আরম্ভ করা হয়েছে।"
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() বিফল: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "এটি PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "কম্পাইলেশনের হোস্ট: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "কম্পাইলশনের CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "চিহ্নিত হোস্টে চলছে: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u CPU পাওয়া গিয়েছে।"
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "পেজের মাপ %lu বাইট"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Valgrind সমর্থন সহ কম্পাইল করা হয়েছে: হ্যাঁ"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Valgrind সমর্থন সহ কম্পাইল করা হয়েছে: না"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "valgrind মোডে চলছে: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "চিহ্নিত হোস্টে চলছে: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "সর্বাপেক্ষ উত্তম বিল্ড: হ্যাঁ"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "সর্বাপেক্ষ উত্তম বিল্ড: না"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG ব্যাখ্যা করা হয়েছে, সকল অ্যাসার্ট নিষ্ক্রিয় করা হয়েছে।"
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH ব্যাখ্যা করা হয়েছে, শুধুমাত্র ফাস্ট পাথ অ্যাসার্ট নিষ্ক্রিয় করা হয়েছে।"
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "সকল অ্যাসার্ট সক্রিয় করা হয়েছে।"
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "মেশিন ID প্রাপ্ত করতে ব্যর্থ"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "মেশিন ID হল %s।"
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "সেশান ID হল %s।"
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "রান-টাইম ডিরেক্টরি %s ব্যবহার করা হচ্ছে।"
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "অবস্থাসূচক ডিরেক্টরি %s ব্যবহার করা হচ্ছে।"
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "মডিউল ডিরেক্টরি %s ব্যবহার করা হচ্ছে।"
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "সিস্টেম মোডে চলছে: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -369,41 +393,42 @@ msgstr ""
 "সিস্টেম মোডে ব্যবহারের সমস্যা সম্পর্কে জানতে হলে http://pulseaudio.org/wiki/"
 "WhatIsWrongWithSystemMode দেখুন।"
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() ব্যর্থ।"
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "উচ্চ-রেসোলিউশনের নতুন টাইমার উপলব্ধ রয়েছে! পরীক্ষা করে দেখুন!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
 msgstr "উচ্চ-রেসোলিউশনের নতুন টাইমার সহ Linux সক্রিয় করা বাঞ্ছনীয়!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() ব্যর্থ।"
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "ডেমন আরম্ভ করতে ব্যর্থ।"
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
-msgstr "লোড করা মডিউল বিনা ডেমন আরম্ভ করা হয়েছে এবং কোনো কর্ম সঞ্চালন করা সম্ভব নয়।"
+msgstr ""
+"লোড করা মডিউল বিনা ডেমন আরম্ভ করা হয়েছে এবং কোনো কর্ম সঞ্চালন করা সম্ভব নয়।"
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "ডেমন আরম্ভ করা হয়েছে।"
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "ডেমন বন্ধ করার প্রক্রিয়া আরম্ভ করা হয়েছে।"
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "ডেমন বন্ধ করা হয়েছে।"
 
@@ -669,72 +694,77 @@ msgstr "অবচিত করার সতর্কবার্তা: %s\n"
 msgid "Path: %s\n"
 msgstr "পাথ: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] লগ টার্গেট '%s' বৈধ নয়।"
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] লগের স্তর '%s' বৈধ নয়।"
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] রি-স্যাম্পেল পদ্ধতি '%s' বৈধ নয়।"
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] rlimit '%s' বৈধ নয়।"
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] এই প্ল্যাটফর্মে rlimit সমর্থিত নয়।"
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] স্যাম্পেলের বিন্যাস '%s' বৈধ নয়।"
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] স্যাম্পেলের মাত্রা '%s' বৈধ নয়।"
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] স্যাম্পেলের চ্যানেল '%s' বৈধ নয়"
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] চ্যানেল ম্যাপ '%s' বৈধ নয়।"
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] অংশ সংখ্যা '%s' বৈধ নয়।"
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] অংশের মাপ '%s' বৈধ নয়।"
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] nice স্তর '%s' বৈধ নয়।"
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] স্যাম্পেলের মাত্রা '%s' বৈধ নয়।"
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "কনফিগারেশন ফাইল খুলতে ব্যর্থ: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -742,7 +772,7 @@ msgstr ""
 "ডিফল্ট চ্যানেল ম্যাপের মধ্যে অন্তর্ভুক্ত চ্যানেলের সংখ্যা ও চ্যানেলের ডিফল্ট সংখ্যার মধ্যে "
 "গরমিল।"
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### চিহ্নিত কনফিগারেশন ফাইল থেকে পড়া হবে: %s ###\n"
@@ -788,8 +818,8 @@ msgid "Rear Right"
 msgstr "পিছনে ডানদিকে"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "কম ফ্রিকোয়েন্সির নিঃসরণকারী"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1134,196 +1164,196 @@ msgstr "XOpenDisplay() ব্যর্থ"
 msgid "Failed to parse cookie data"
 msgstr "কুকির তথ্য পার্স করতে ব্যর্থ"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "কনফিগারেশন ফাইল '%s' খুলতে ব্যর্থ: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "কোনো কুকি লোড করা হয়নি। কুকি বিনা সংযোগের প্রচেষ্টা করা হচ্ছে।"
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "অজানা এক্সটেনশন '%s'-র জন্য বার্তা প্রাপ্ত হয়েছে"
 
 # drain a stream = যখন স্ট্রিমের মধ্যে উপস্থিত সকল তথ্য আহরণ করা হয় ও স্ট্রিমটি সম্পূর্ণরূপে ফাঁকা হয়ে যায়।
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "স্ট্রিম ড্রেইন (অর্থাৎ ফাঁকা) করতে ব্যর্থ: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "প্লে-ব্যাক স্ট্রিম ফাঁকা করা হয়েছে।"
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "সার্ভারের সাথে স্থাপিত সংযোগ ফাঁকা করা হচ্ছে।"
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() ব্যর্থ: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_write() ব্যর্থ: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() ব্যর্থ: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "সাফল্যের সাথে স্ট্রিম নির্মিত হয়েছে।"
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() ব্যর্থ: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "বাফারের মাপ: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "বাফারের মাপ: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "স্যাম্পেলের spec '%s', ও চ্যানেল ম্যাপ '%s' ব্যবহার করা হচ্ছে।"
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "ডিভাইস %s-র সাথে সংযোগ করা হয়েছে (%u, %ssuspended)।"
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "ষ্ট্রিম সংক্রান্ত ত্রুটি: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "স্ট্রিম ডিভাইস স্থগিত করা হয়েছে। %s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "স্ট্রিম ডিভাইস পুনরারম্ভ করা হয়েছে। %s"
 
 # underrun = ধীর গতির স্ট্রিম
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "ধীর গতির স্ট্রিম.%s"
 
 # overrun=the stream fills up the allocated buffer space and there is no more space for it
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "স্ট্রিম মাত্রা অতিক্রম করেছে।%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "স্ট্রিম আরম্ভ করা হয়েছে। %s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "%s ডিভাইসে স্ট্রিম স্থানান্তর করা হয়েছে (%u, %ssuspended)।%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "না "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "স্ট্রিম বাফারের অ্যাট্রিবিউট পরিবর্তিত হয়েছে। %s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "সংযোগ স্থাপিত হয়েছে।%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() ব্যর্থ: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() ব্যর্থ: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() ব্যর্থ: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "সংযোগ বিফল: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "ফাইলের সমাপ্তি সনাক্ত হয়েছে।"
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() ব্যর্থ: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "সিগন্যাল প্রাপ্ত হয়েছে, প্রস্থান করা হবে।"
 
 # latency here = delay (technical term
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "লেটেন্সির পরিমাণ প্রাপ্ত করতে ব্যর্থ: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "সময়: %0.3f সেকেন্ড; লেটেন্সি: %0.0f usec।"
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() ব্যর্থ: %s"
 
 # reverting this to english because the command line text gets messed up
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1375,10 +1405,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [options]\n"
@@ -1437,7 +1471,7 @@ msgstr ""
 "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1448,68 +1482,68 @@ msgstr ""
 "libpulse সহযোগে কম্পাইল করা হয়েছে %s\n"
 "libpulse-র সাথে যুক্ত %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "ক্লায়েন্টের নাম '%s' বৈধ নয়"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "স্ট্রিমের নাম '%s' বৈধ নয়।"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "চ্যানেল ম্যাপ '%s' বৈধ নয়"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "লেটেন্সির জন্য নির্ধারিত বৈশিষ্ট্য '%s' বৈধ নয়"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "প্রসেসের সময়ের বৈশিষ্ট্য '%s' বৈধ নয়"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "বৈশিষ্ট্য '%s' বৈধ নয়।"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "ফাইলের অজানা বিন্যাস %s।"
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "অবৈধ স্যাম্পেল নির্ধারিত"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "অত্যাধিক আর্গুমেন্ট।"
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "স্যাম্পেলের মান নির্ধারণের ফাইল নির্মাণ করতে ব্যর্থ"
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "শব্দের ফাইল খুলতে ব্যর্থ।"
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
@@ -1517,103 +1551,104 @@ msgstr ""
 "সতর্কবার্তা: চিহ্নিত স্যাম্পেল নির্ধারণের ফাইলটির তথ্য, এই ফাইলের থেকে উপলব্ধ তথ্য "
 "দ্বারা প্রতিস্থাপিত হবে।"
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "ফাইল থেকে স্যাম্পেল সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ।"
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "সতর্কবার্তা: ফাইল থেকে চ্যানেলের ম্যাপ নির্ধারণ করতে ব্যর্থ।"
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "চ্যানেলের ম্যাপ ও স্যাম্পেলের নির্ধারিত মানে গরমিল"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "সতর্কবার্তা: ফাইলের মধ্যে চ্যানেলের ম্যাপ লিখতে ব্যর্থ।"
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
 "একটি %s স্ট্রিম খোলা হচ্ছে। এটির জন্য '%s'-র স্যাম্পেলের নির্ধারিত মান ও '%s' "
 "চ্যানেলের ম্যাপ প্রয়োগ করা হবে।"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "রেকর্ড করা হচ্ছে"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "প্লে-ব্যাক"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() ব্যর্থ।"
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() ব্যর্থ।"
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() ব্যর্থ।"
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() ব্যর্থ: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() ব্যর্থ।"
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() ব্যর্থ।"
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "স্থগিত করতে ব্যর্থ: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "পুনরারম্ভ করতে ব্যর্থ: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "সতর্কবার্তা: শব্দের সার্ভারটি স্থানীয় নয় ও স্থগিত করা হচ্ছে না।\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "সংযোগ বিফল: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "SIGINT প্রাপ্ত হয়েছে, প্রস্থান করা হয়েছে।\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "সতর্কবার্তা: সিগন্যাল %u দ্বারা চাইল্ড প্রসেস বন্ধ করা হয়েছে\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1632,7 +1667,7 @@ msgstr ""
 "নাম\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1643,50 +1678,62 @@ msgstr ""
 "libpulse সহযোগে কম্পাইল করা হয়েছে %s\n"
 "libpulse-র সাথে যুক্ত %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() ব্যর্থ।\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() ব্যর্থ।\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() ব্যর্থ।\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "পরিসংখ্যান প্রাপ্ত করতে ব্যর্থ: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "বর্তমানে ব্যবহৃত: %u ব্লকের মধ্যে উপস্থিত সর্বমোট %s বাইট।\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
-msgstr "সম্পূর্ণ কর্মকালের জন্য বরাদ্দ করা হয়েছে: %u ব্লকের মধ্যে উপস্থিত সর্বমোট %s বাইট।\n"
+msgstr ""
+"সম্পূর্ণ কর্মকালের জন্য বরাদ্দ করা হয়েছে: %u ব্লকের মধ্যে উপস্থিত সর্বমোট %s বাইট।\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "স্যাম্পেল ক্যাশের মাপ: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "সার্ভার সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1694,7 +1741,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "ব্যবহারকারীর নাম: %s\n"
 "হোস্ট-নেম: %s\n"
@@ -1706,12 +1753,12 @@ msgstr ""
 "ডিফল্ট সোর্স: %s\n"
 "কুকি: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "sink সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1750,22 +1797,22 @@ msgstr ""
 "\tবিবিধ বৈশিষ্ট্য:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tপোর্ট:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tসক্রিয় পোর্ট: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "উৎস সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1804,20 +1851,20 @@ msgstr ""
 "\tবিবিধ বৈশিষ্ট্য:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n/a"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "মডিউল সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1834,12 +1881,12 @@ msgstr ""
 "\tবিবিধ বৈশিষ্ট্য:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "ক্লায়েন্ট সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1854,12 +1901,12 @@ msgstr ""
 "\tবিবিধ বৈশিষ্ট্য:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "কার্ড সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1876,22 +1923,22 @@ msgstr ""
 "\tবিবিধ বৈশিষ্ট্য:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tপ্রোফাইল:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tসক্রিয় প্রোফাইল: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "sink ইনপুট সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1928,12 +1975,12 @@ msgstr ""
 "\tবিবিধ বৈশিষ্ট্য:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "উৎস আউটপুট সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1962,13 +2009,13 @@ msgstr ""
 "\tবিবিধ বৈশিষ্ট্য:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "স্যাম্পেল সংক্রান্ত তথ্য প্রাপ্ত করতে ব্যর্থ: %s"
 
 # Lazy = low quality sample
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1999,27 +2046,81 @@ msgstr ""
 "\tবিবিধ বৈশিষ্ট্য:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "ব্যর্থতা: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "স্যাম্পেল আপলোড করতে ব্যর্থ: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "সম্পূর্ণ হওয়ার পূর্বে ফাইল সমাপ্ত হয়েছে"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "সার্ভার বৈধ নয়"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT প্রাপ্ত হয়েছে, প্রস্থান করা হয়েছে।"
 
 # reverting to english because the command line output gets messed up
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2042,6 +2143,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2081,7 +2183,7 @@ msgstr ""
 "  -n, --client-name=NAME                How to call this client on the "
 "server\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2092,103 +2194,104 @@ msgstr ""
 "libpulse সহযোগে কম্পাইল করা %s\n"
 "libpulse-র সাথে যুক্ত %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "লোড করার উদ্দেশ্যে অনুগ্রহ করে একটি স্যাম্পেল ফাইল উল্লেখ করুন"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "শব্দের ফাইল খুলতে ব্যর্থ।"
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "সতর্কবার্তা: ফাইল থেকে স্যাম্পেলের নির্ধারিত মাপ নির্মাণ করতে ব্যর্থ।"
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "বাজানোর উদ্দেশ্যে একটি স্যাম্পেল ফাইল উল্লেখ করা আবশ্যক"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "অপসারণের উদ্দেশ্যে একটি স্যাম্পেল ফাইল উল্লেখ করা আবশ্যক"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "সিংক ইনপুট ইন্ডেক্স ও একটি সিংক নির্ধারণ করা আবশ্যক"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "সোর্স আউটপুট ইন্ডেক্স ও একটি সোর্স নির্ধারণ করা আবশ্যক"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "মডিউলের নাম ও আর্গুমেন্ট নির্ধারণ করা আবশ্যক।"
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "মডিউল ইন্ডেক্স নির্ধারণ করা আবশ্যক"
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
 msgstr "একাধিক সিংক নির্ধারণ করা যাবে না। বুলিয়েন মান নির্ধারণ করা আবশ্যক।"
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
 msgstr "একাধিক সোর্স নির্ধারণ করা যাবে না। বুলিয়েন মান নির্ধারণ করা আবশ্যক।"
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "কার্ডের নাম/ইন্ডেক্স ও একটি প্রোফাইলের নাম উল্লেখ করা আবশ্যক"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "sink-র নাম/ইন্ডেক্স ও একটি পোর্টের নাম উল্লেখ করা আবশ্যক"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "উৎসের নাম/ইন্ডেক্স ও একটি পোর্টে নাম উল্লেখ করা আবশ্যক"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "sink-র নাম/ইন্ডেক্স ও একটি পোর্টের নাম উল্লেখ করা আবশ্যক"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "অবৈধ শব্দের মাত্রা নির্ধারিত"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "উৎসের নাম/ইন্ডেক্স ও একটি শব্দের মাত্রা উল্লেখ করা আবশ্যক"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "সিংক ইনপুট ইন্ডেক্স ও শব্দের মাত্রা নির্ধারণ করা আবশ্যক"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "সিংক ইনপুট ইন্ডেক্স বৈধ নয়"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "sink-র নাম/ইন্ডেক্স ও একটি নিঃশব্দতার বুলিয়ান উল্লেখ করা আবশ্যক"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "উৎসের নাম/ইন্ডেক্স ও নিঃশব্দতার বুলিয়ান উল্লেখ করা আবশ্যক"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "সিংক ইনপুট ইন্ডেক্স ও নিঃশব্দতার বুলিয়ান নির্ধারণ করা আবশ্যক"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "অবৈধ সিংক ইনপুট ইন্ডেক্স নির্ধারিত"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "কোনো বৈধ কমান্ড নির্ধারিত হয়নি।"
 
@@ -2271,44 +2374,44 @@ msgstr "কুকি সংক্রান্ত তথ্য লোড কর
 msgid "Not yet implemented.\n"
 msgstr "এখনো বাস্তবায়িত হয়নি।\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr "PulseAudio ডেমন চলছে না অথবা সেশানের ডেমন রূপে চলছে না।"
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "PulseAudio ডেমন kill করতে ব্যর্থ।"
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "ডেমন থেকে কোনো প্রতিক্রিয়া পাওয়া যাচ্ছে না।"
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "autospawn লক প্রয়োগ করতে ব্যর্থ।"
 
@@ -2347,38 +2450,42 @@ msgstr ""
 "min_avail-র থেকে কম অন্য একটি মান প্রাপ্ত হয়েছে।"
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "বন্ধ"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "হাই-ফিডেলিটি প্লে-ব্যাক (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "হাই-ফিডেলিটি ক্যাপচার (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "টেলিফোনি ডুপ্লে (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio শব্দের সার্ভার"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "আউটপুট ডিভাইস"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "ইনপুট ডিভাইস"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "@HOSTNAME at -র মধ্যে অডিও"
 
@@ -2442,133 +2549,159 @@ msgstr "বিবর্ধক"
 msgid "No Amplifier"
 msgstr "বিবর্ধন প্রয়োগ করা হবে না"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "বুস্ট"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "বুস্ট প্রয়োগ করা হবে না"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "অ্যানালগ হেড-ফোন"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "অ্যানালগ ইনপুট"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "অ্যানালগ মাইক্রোফোন"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "অ্যানালগ লাইন-ইন"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "অ্যানালগ রেডিও"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "অ্যানালগ ভিডিও"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "অ্যানালগ আউটপুট"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "অ্যানালগ হেড-ফোন"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "অ্যানালগ আউটপুট (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "অ্যানালগ মোনো আউটপুট"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "অ্যানালগ স্টিরিও"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "অ্যানালগ মোনো"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "অ্যানালগ স্টিরিও"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "অ্যানালগ সারাউন্ড ২.১"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "অ্যানালগ সারাউন্ড ৩.০"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "অ্যানালগ সারাউন্ড ৩.১"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "অ্যানালগ সারাউন্ড ৪.০"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "অ্যানালগ সারাউন্ড ৪.১"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "অ্যানালগ সারাউন্ড ৫.০"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "অ্যানালগ সারাউন্ড ৫.১"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "অ্যানালগ সারাউন্ড ৬.০"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "অ্যানালগ সারাউন্ড ৬.১"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "অ্যানালগ সারাউন্ড ৭.০"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "অ্যানালগ সারাউন্ড ৭.১"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "ডিজিট্যাল স্টিরিও (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "ডিজিট্যাল সারাউন্ড ৪.০ (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "ডিজিট্যাল সারাউন্ড ৪.০ (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "ডিজিট্যাল সারাউন্ড ৫.১ (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "ডিজিট্যাল স্টিরিও (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "অ্যানালগ মোনো ডুপ্লে"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "অ্যানালগ স্টিরিও ডুপ্লে"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "ডিজিট্যাল স্টিরিও ডুপ্লে (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "কম ফ্রিকোয়েন্সির নিঃসরণকারী"
diff --git a/po/ca.po b/po/ca.po
index e9938df..95d9377 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -24,7 +24,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-09-12 11:40+0100\n"
 "Last-Translator: Josep Torné Llavall <josep.torne at gmail.com>\n"
 "Language-Team: Catalan <fedora at softcatala.net>\n"
@@ -32,12 +32,12 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -50,7 +50,7 @@ msgstr ""
 "Probablement es tracta d'un error del controlador de l'ALSA '%s'. Informeu "
 "d'aquest incident als desenvolupadors de l'ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -63,7 +63,7 @@ msgstr ""
 "Probablement es tracta d'un error del controlador de l'ALSA '%s'. Informeu "
 "d'aquest incident als desenvolupadors de l'ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -110,11 +110,11 @@ msgstr "Conducte NULL"
 msgid "Null Output"
 msgstr "Sortida nul·la"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Audio intern"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Mòdem"
 
@@ -130,92 +130,98 @@ msgstr "No s'ha pogut allotjar el nou carregador dl."
 msgid "Failed to add bind-now-loader."
 msgstr "No s'ha pogut afegir bind-now-loader."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "S'ha obtingut la senyal %s."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "S'està sortint."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "No s'ha trobat l'usuari '%s'."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "No s'ha trobat el grup '%s'."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "S'han trobat l'usuari '%s' (UID %lu) i el grup '%s' (GID %lu)."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "El GID de l'usuari '%s' i del grup '%s' no coincideixen."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 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:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "No s'ha pogut crear '%s': %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "No s'ha pogut canviar la llista del grup: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "No s'ha pogut canviar el GID: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "No s'ha pogut canviar l'UID: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "S'han alliberat els permisos de root."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "El mode de sistema global no és compatible amb aquesta plataforma."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "S'ha produït un error en setrlimit(%s, (%u, %u)): %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "No s'ha pogut interpretar la línia d'ordres."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "El dimoni no s'està executant"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "El dimoni s'està executant amb PID %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "S'ha produït un error en matar el dimoni: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -223,163 +229,178 @@ msgstr ""
 "No és necessari executar aquesta aplicació com a root (excepte si "
 "s'especifica --system)"
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Es requereixen privilegis de root."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "La opció --start no està suportada per a instàncies de sistema."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr ""
 "S'està executant en mode sistema, però no s'ha especificat l'opció --"
 "disallow-exit."
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 "S'està executant en mode sistema, però no s'ha especificat l'opció --"
 "disallow-module-loading."
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr ""
 "S'està executant en mode sistema, es deshabilitarà el mode SHM forçosament."
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 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."
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "S'ha produït un error en adquirir stdio."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "Ha fallat la canonada: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "Ha fallat fork(): %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "Ha fallat read(): %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "S'ha produït un error en iniciar el dimoni."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "S'ha iniciat el dimoni."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "Ha fallat read(): %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Aquest és el PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Host de compilació: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "CFLAGS de compilació: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "S'està executant en el host: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "S'han trobat %u CPU's"
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "La mida de pàgina és de %lu bytes."
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Compilat amb suport per a Valgrind: sí"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Compilat amb suport per a Valgrind: no"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "S'està executant amb el mode valgrind: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "S'està executant en el host: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Construcció optimitzada: sí"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Construcció optmitzada: no"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG està definit, s'han desactivat totes les assercions."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr ""
 "FASTPATH està definit, només s'ha deshabilitat les assercions de camí ràpid."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "S'han habilitat totes les assercions."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "No s'ha pogut obtenir l'ID de la màquina"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "L'ID de la màquina és %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "L'ID de la sessió és %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "S'està utilitzant el directori d'execució %s."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "S'està utilitzant el directori d'estat %s."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "S'està utilitzant el directori dels móduls %s."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "S'està executant en mode sistema: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -395,15 +416,15 @@ msgstr ""
 "Si us plau, llegiu http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode per "
 "a una explicació de per què el mode sistema sol ser una mala idea."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "S'ha produït un error en pa_pid_file_create()."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Estan disponibles els temporitzadors frescos d'alta resolució."
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -411,27 +432,27 @@ msgstr ""
 "Es recomana la utilització d'un nucli amb els temporitzadors d'alta "
 "resolució habilitats."
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "S'ha produït un error en pa_core_new()."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "S'ha produït un error en inicialitzar el dimoni."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "El dimoni s'ha iniciat sense cap mòdul carregat, no funcionarà."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "S'ha completat la inicialització del dimoni."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "S'ha iniciat l'aturada del dimoni."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "S'ha aturat el dimoni."
 
@@ -701,72 +722,77 @@ msgstr "Advertència d'obsolescència: %s\n"
 msgid "Path: %s\n"
 msgstr "Ruta: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Destí de registre incorrecte '%s'"
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Nivell de registre incorrecte '%s'."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Mètode de remostreig incorrecte '%s'."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] rlimit incorrecte '%s'."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, 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:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Format de mostra incorrecte '%s'."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Velocitat de mostreig '%s'."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Canals de mostreig incorrectes '%s'."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Mapa de canals incorrecte '%s'."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Nombre de fragments incorrecte '%s'."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Mida de fragment incorrecta '%s'."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Nivell de prioritat incorrecte '%s'."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Velocitat de mostreig '%s'."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Error en obrir el fitxer de configuració: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -774,7 +800,7 @@ msgstr ""
 "El mapa de canals especificat per omissió té un número de canals diferent "
 "del número de canals especificat per omissió."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Lectura del fitxer de configuració: %s ###\n"
@@ -820,8 +846,8 @@ msgid "Rear Right"
 msgstr "Posterior dreta"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Emissor de baixa freqüència"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1166,193 +1192,193 @@ msgstr "Ha fallat XOpenDisplay()"
 msgid "Failed to parse cookie data"
 msgstr "Ha fallat el parseig de les dades de la cookie"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 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:550
+#: ../src/pulse/context.c:539
 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:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "S'ha rebut un missatge per a una extensió desconeguda '%s'"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "S'ha produït un error en drenar el fluxe: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "Flux de reproducció drenat."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "S'està drenant la connexió amb el servidor."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "Ha fallat pa_stream_write(): %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "Ha fallat pa_stream_begin_write(): %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "Ha fallat pa_stream_peek(): %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Flux creat correctament."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "Ha fallat pa_stream_get_buffer_attr(): %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Mètriques del búffer: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Mètriques del búffer: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr ""
 "S'estan utilitzant les especificacions de mostreig '%s', mapejat del canal '%"
 "s'."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "S'ha connectat al dispositiu %s (%u, %ssuspès)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "S'ha produït un error en l'stream: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Flux del dispositiu suspès.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "Flux del dispositiu reprès.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "Dades insuficients al flux.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "Desbordament de flux.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "S'ha iniciat el flux.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "S'ha mogut el flux al dispositiu %s (%u, %ssuspès).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "no "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Els atributs del flux de memòria intermèdia han canviat.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "S'ha establert la connexió.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "Ha fallat pa_stream_new(): %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "Ha fallat pa_stream_connect_playback(): %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "Ha fallat pa_stream_connect_record(): %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Ha fallat la connexió: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "S'ha llegit el fi del fitxer."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "Ha fallat write(): %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "S'ha rebut un senyal, s'està sortint."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "No s'ha pogut obtenir la latència: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Temps: %0.3f segs; Latència: %0.0f microsegs."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "Ha fallat pa_stream_update_timing_info(): %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1404,10 +1430,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [opcions]\n"
@@ -1467,7 +1497,7 @@ msgstr ""
 "      --list-file-formats               Llista disponible de formats de "
 "fitxer.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1478,68 +1508,68 @@ msgstr ""
 "Compilat amb libpulse %s\n"
 "Enllaçat amb libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Nom del client invàlid '%s'"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Nom de flux de dades invàlid '%s'"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Mapa de canals invàlid '%s'"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Especificació de latència invàlida '%s'"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Especificació de temps de procés invàlida '%s'"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Propietat invàlida '%s'"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Format desconegut de fitxer %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Especificació de mostra invàlida"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Massa arguments."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "No s'ha pogut generar l'especificació de mostra del fitxer."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "No s'ha pogut obrir el fitxer d'àudio."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
@@ -1547,24 +1577,24 @@ msgstr ""
 "Advertència: l'especificació de mostra especificada se sobreescriurà amb "
 "l'especificació del fitxer."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "No s'ha pogut determinar l'especificació de mostra del fitxer."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr ""
 "Advertència: no s'ha pogut determinar el mapeig de canals des del fitxer."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "El mapa de canals no coincideix amb l'especificació de mostra"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "Advertència: no s'ha pogut escriure el mapa de canals en un fitxer."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
 msgid ""
 "Opening a %s stream with sample specification '%s' and channel map '%s'."
@@ -1572,80 +1602,80 @@ msgstr ""
 "S'està obrint un flux de dades %s amb especificació de mostra '%s' i mapa de "
 "canals '%s'."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "enregistrant"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "reproducció"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "Ha fallat el pa_mainloop_new()."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "Ha fallat el io_new()."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "Ha fallat el pa_context_new()."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "Ha fallat pa_context_connect(): %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "Ha fallat el pa_context_new()."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "Ha fallat el pa_mainloop_run()."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "No s'ha pogut suspendre: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "No s'ha pogut en rependre: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "ADVERTÈNCIA: el sevidor de so no és local, no s'està suspenent.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Ha fallat la connexió: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "S'ha rebut SIGINT, s'està sortint.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "ADVERTÈNCIA: procés fill acabat pel senyal %u\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1664,7 +1694,7 @@ msgstr ""
 "se\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1675,52 +1705,63 @@ msgstr ""
 "Compilat amb libpulse %s\n"
 "Enllaçat amb libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "Ha fallat el pa_mainloop_new().\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "Ha fallat el pa_context_new().\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "Ha fallat el pa_mainloop_run().\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "No s'han pogut obtenir les estadístiques: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr ""
 "Actualment s'estan utilitzant: %u blocs que contenen %s bytes en total.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr ""
 "Allotjats durant el temps de vida: %u blocs que contenen %s bytes en total.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Mida de la memòria cau de mostres: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "No s'ha pogut obtenir la informació del servidor: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1728,7 +1769,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Nom d'usuari: %s\n"
 "Nom del host: %s\n"
@@ -1740,12 +1781,12 @@ msgstr ""
 "Font per omissió: %s\n"
 "Galeta: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "No s'ha pogut obtenir la informació del conducte: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1784,22 +1825,22 @@ msgstr ""
 "\tPropietats:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tPorts:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tPort actiu: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "No s'ha pogut obtenir la informació de la font: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1838,20 +1879,20 @@ msgstr ""
 "\tPropietats:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n/a"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "No s'ha pogut obtenir informació del mòdul: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1868,12 +1909,12 @@ msgstr ""
 "\tPropietats:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "No s'ha pogut obtenir informació del client: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1888,12 +1929,12 @@ msgstr ""
 "\tPropietats:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "No s'ha pogut obtenir la informació de la targeta: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1910,22 +1951,22 @@ msgstr ""
 "\tPropietats:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tPerfils:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tPerfil actiu: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "No s'ha pogut obtenir informació del conducte d'entrada: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1962,12 +2003,12 @@ msgstr ""
 "\tPropietats:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "No s'ha pogut obtenir la informació del conducte de sortida: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1996,12 +2037,12 @@ msgstr ""
 "\tPropietats:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "No s'ha pogut obtenir informació de la mostra: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -2032,26 +2073,81 @@ msgstr ""
 "\tPropietats:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Ha fallat: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "No s'ha pogut pujar la mostra: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "S'ha trobat un fi de fitxer prematurament"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr "conducte"
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr "font"
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+#, fuzzy
+msgid "source-output"
+msgstr "font"
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Servidor incorrecte"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "S'ha rebut SIGINT, s'està sortint."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2074,6 +2170,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2112,7 +2209,7 @@ msgstr ""
 "  -n, --client-name=NOM                 Com cridar aquest client en el "
 "servidor\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2123,111 +2220,111 @@ msgstr ""
 "Compilat amb libpulse %s\n"
 "Enllaçat amb libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Si us plau, especifiqueu un fitxer de mostra per a carregar"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "No s'ha pogut obrir el fitxer de so."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr ""
 "Advertiment: No s'ha pogut determinar l'especificació de mostra a partir del "
 "fitxer."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "Heu d'especificar un nom de mostra a reproduir"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "Heu d'especificar un nom de mostra a suprimir"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "Heu d'especificar una entrada del conducte i un conducte"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "Heu d'especificar un índex de font de sortida i una font"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "Heu d'especificar un nom de mòdul i els seus arguments."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "Heu d'especificar un índex de mòdul"
 
-#: ../src/utils/pactl.c:1090
+#: ../src/utils/pactl.c:1183
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 "No haríeu d'especificar més d'un conducte. Heu d'especificar un valor booleà."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
 msgstr ""
 "No haríeu d'especificar més d'una font. Heu d'especificar un valor booleà."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "Heu d'especificar un nom o un índex de targeta i un nom de perfil"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "Heu d'especificar un nom o un índex de conducte i un nom de port"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "Heu d'especificar un nom o un índex de font i un nom de port"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "Heu d'especificar un nom o un índex de conducte i un volum"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "Especificació de volum invàlida"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "Heu d'especificar un nom o un índex de font i un volum"
 
 #
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "Heu d'especificar un índex entrada del conducte i un volum"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "Índex d'entrada del conducte invàlid"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr ""
 "Heu d'especificar un nom o un índex de conducte i un booleà de silenciat"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "Heu d'especificar un nom o un índex de font i un booleà de silenciat"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr ""
 "Heu d'especificar un índex d'entrada del conducte i un booleà de silenciat"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "Especificació d'índex d'entrada del conducte invàlida"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "Ordre especificada no vàlida."
 
@@ -2312,46 +2409,46 @@ msgstr "No s'han pogut carregar les dades de la galeta\n"
 msgid "Not yet implemented.\n"
 msgstr "Encara no s'ha implementat.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
 "El dimoni PulseAudio no s'està executant, o no s'està executant com a dimoni "
 "de la sessió."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "No s'ha pogut matar el dimoni PulseAudio."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "El dimoni no respon."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "No s'ha pogut accedir al bloqueig d'autospawn."
 
@@ -2390,39 +2487,43 @@ msgstr ""
 "snd_pcm_avail() ha retornat 0 o un altre valor < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Inactiu"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "Reproducció d'alta fidelitat (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "Captura d'alta fidelitat (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Dúplex de telefonia (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "Servidor de so PulseAudio"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr ""
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 #, fuzzy
 msgid "Input Devices"
 msgstr "Entrada %s"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr ""
 
@@ -2488,154 +2589,179 @@ msgstr ""
 msgid "No Amplifier"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+msgid "Bass Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+msgid "No Bass Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "Mono analògic"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 #, fuzzy
 msgid "Analog Input"
 msgstr "Mono analògic"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 #, fuzzy
 msgid "Analog Microphone"
 msgstr "Mono analògic"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 #, fuzzy
 msgid "Analog Line-In"
 msgstr "Mono analògic"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 #, fuzzy
 msgid "Analog Radio"
 msgstr "Mono analògic"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 #, fuzzy
 msgid "Analog Video"
 msgstr "Estèreo analògic"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 #, fuzzy
 msgid "Analog Output"
 msgstr "Sortida nul·la"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 #, fuzzy
 msgid "Analog Headphones"
 msgstr "Mono analògic"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 #, fuzzy
 msgid "Analog Mono Output"
 msgstr "Mono analògic"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Estèreo analògic"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, fuzzy, c-format
 msgid "%s+%s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, fuzzy, c-format
 msgid "%s / %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Mono analògic"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Estèreo analògic"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 #, fuzzy
 msgid "Analog Surround 2.1"
 msgstr "Envolvent analògic 4.1 "
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 #, fuzzy
 msgid "Analog Surround 3.0"
 msgstr "Envolvent analògic 4.0 "
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 #, fuzzy
 msgid "Analog Surround 3.1"
 msgstr "Envolvent analògic 4.1 "
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Envolvent analògic 4.0 "
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Envolvent analògic 4.1 "
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Envolvent analògic 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Envolvent analògic 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 #, fuzzy
 msgid "Analog Surround 6.0"
 msgstr "Envolvent analògic 4.0 "
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 #, fuzzy
 msgid "Analog Surround 6.1"
 msgstr "Envolvent analògic 4.1 "
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 #, fuzzy
 msgid "Analog Surround 7.0"
 msgstr "Envolvent analògic 4.0 "
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Envolvent analògic 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Estèreo digital (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 #, fuzzy
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Envolvent digital 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Envolvent digital 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Envolvent digital 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Estèreo digital (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 #, fuzzy
 msgid "Analog Mono Duplex"
 msgstr "Mono analògic"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 #, fuzzy
 msgid "Analog Stereo Duplex"
 msgstr "Estèreo analògic"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 #, fuzzy
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Estèreo digital (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Emissor de baixa freqüència"
+
 #~ msgid "Invalid client name '%s'\n"
 #~ msgstr "Nom del client invàlid '%s'\n"
 
@@ -2928,9 +3054,3 @@ msgstr "Estèreo digital (IEC958)"
 #~ "Tipus: %s\n"
 #~ "Mòdul: %s\n"
 #~ "Arguments: %s\n"
-
-#~ msgid "sink"
-#~ msgstr "conducte"
-
-#~ msgid "source"
-#~ msgstr "font"
diff --git a/po/cs.po b/po/cs.po
index 6d6c3a5..b9a713c 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-17 09:51+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-10-17 17:08+0200\n"
 "Last-Translator: Petr Kovar <pknbe at volny.cz>\n"
 "Language-Team: Czech <translation-team-cs at lists.sourceforge.net>\n"
@@ -16,12 +16,12 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 "X-Generator: Lokalize 1.0\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -34,7 +34,7 @@ msgstr ""
 "S největší pravděpodobností se jedná o chybu v ovladači ALSA \"%s\". "
 "Nahlaste prosím tento problém vývojářům ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -47,7 +47,7 @@ msgstr ""
 "S největší pravděpodobností se jedná o chybu v ovladači ALSA \"%s\". "
 "Nahlaste prosím tento problém vývojářům ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -94,11 +94,11 @@ msgstr "Taktovaný cíl NULL"
 msgid "Null Output"
 msgstr "Výstup \"null\""
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Vnitřní zvukový systém"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Modem"
 
@@ -114,92 +114,98 @@ msgstr "Nezdařilo se přidělení nového nahrávacího programu dl."
 msgid "Failed to add bind-now-loader."
 msgstr "Nezdařilo se přidat bind-now-loader."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Získán signál %s."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Ukončování."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Nezdařilo se nalézt uživatele \"%s\"."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Nezdařilo se nalézt skupinu \"%s\"."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Nalezen uživatel \"%s\" (UID %lu) a skupina \"%s\" (GID %lu)."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "GID uživatele \"%s\" a skupiny \"%s\" nesouhlasí."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "Domovský adresář uživatele \"%s\" není \"%s\", bude ignorováno."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Nezdařilo se vytvořit \"%s\": %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "Nezdařilo se změnit seznam skupin: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "Nezdařilo se změnit GID: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "Nezdařilo se změnit UID: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "Oprávnění superuživatele úspěšně zrušena."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "Režim celého systému není na této platformě podporován."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) selhalo: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "Nezdařila se analýza příkazového řádku."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "Démon neběží"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Démon běží jako PID %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Zabití démona se nezdařilo: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -207,155 +213,170 @@ msgstr ""
 "Tento program není určen ke spuštění pod superuživatelem (není-li zadáno --"
 "system)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Jsou vyžadována oprávnění superuživatele."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start nepodporováno u systémových instancí."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 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:586
+#: ../src/daemon/main.c:686
 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:589
+#: ../src/daemon/main.c:689
 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:594
+#: ../src/daemon/main.c:694
 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:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "Nezdařilo se získání stdio."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "pipe selhalo: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() selhalo: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() selhalo: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "Spuštění démona selhalo."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "Spuštění démona bylo úspěšné."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() selhalo: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Toto je PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Překladový počítač: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "Překladové CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "Běží na počítači: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "Nalezen následující počet CPU: %u."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "Velikost stránky je %lu bajtů"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Přeloženo s podporou Valgrind: ano"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Přeloženo s podporou Valgrind: ne"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Běží v režimu valgrind: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "Běží na počítači: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Optimalizované sestavení: ano"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Optimalizované sestavení: ne"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG definováno, všechny výrazy zakázány."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH definováno, zakázány pouze výrazy rychlých cest."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "Všechny výrazy povoleny."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "Nezdařilo se získání ID počítače"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "ID počítače je %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "ID sezení je %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Používán běhový adresář %s."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "Používán stavový adresář %s."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "Používán adresář modulů %s."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Běží v systémovém režimu: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -371,16 +392,16 @@ msgstr ""
 "Vysvětlení, proč je systémový režim obvykle velmi špatný nápad, si můžete "
 "přečíst na http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() selhalo."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 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:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -388,27 +409,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:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() selhalo."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "Selhalo spuštění démona."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 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:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "Spuštění démona dokončeno."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "Vypínání démona spuštěno."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "Démon ukončen."
 
@@ -669,72 +690,77 @@ msgstr "VAROVÁNÍ ZASTARALOSTI: %s\n"
 msgid "Path: %s\n"
 msgstr "Cesta: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Neplatný protokolovací cíl \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Neplatná protokolovací úroveň \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Neplatná metoda převzorkování \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] Neplatné rlimit \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit na této platformě není podporováno."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Neplatný vzorkovací formát \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Neplatná vzorkovací frekvence \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Neplatné vzorkovací kanály \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Neplatná mapa kanálů \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Neplatný počet fragmentů \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Neplatná velikost fragmentu \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Neplatná úroveň nice \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Neplatná vzorkovací frekvence \"%s\"."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Nezdařilo se otevřít konfigurační soubor: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -742,7 +768,7 @@ msgstr ""
 "Zadaná výchozí mapa kanálů obsahuje odlišný počet kanálů než je zadaný "
 "výchozí počet kanálů."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Čtení z konfiguračního souboru: %s ###\n"
@@ -788,8 +814,8 @@ msgid "Rear Right"
 msgstr "Zadní pravý"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Nízkofrekvenční zářič"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1134,192 +1160,192 @@ msgstr "XOpenDisplay() selhalo"
 msgid "Failed to parse cookie data"
 msgstr "Selhala analýza dat cookie"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Selhalo otevření konfiguračního souboru \"%s\": %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Žádný soubor cookie nenahrán. Pokus o spojení bez tohoto kroku."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "Přijata zpráva pro neznámé rozšíření \"%s\""
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Nezdařilo se vyprázdnit proud: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "Proud přehrávání vyprázdněn."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "Vyprazdňování spojení se serverem."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() selhalo: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() selhalo: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() selhalo: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Proud úspěšně vytvořen."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() selhalo: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr ""
 "Metrika vyrovnávací paměti: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Metrika vyrovnávací paměti: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "Používáno určení vzorku \"%s\", mapa kanálů \"%s\"."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Připojeno k zařízení %s (%u, %ssuspended)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "Chyba proudu: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Proudové zařízení pozastaveno.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "Proudové zařízení obnoveno.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "Podběhnutí proudu.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "Přeběhnutí proudu.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "Proud spuštěn.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Proud přesunut na zařízení %s (%u, %ssuspended).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "nikoliv "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Změněny atributy vyrovnávací paměti proudu.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "Spojení navázáno.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() selhalo: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() selhalo: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() selhalo: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Spojení selhalo: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "Získáno EOF."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() selhalo: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "Získán signál, ukončování."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "Nezdařilo se získat latenci: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Čas: %0.3f sekund; latence: %0.0f μs"
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() selhalo: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1371,10 +1397,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [přepínače]\n"
@@ -1429,7 +1459,7 @@ msgstr ""
 "      --list-file-formats               Zobrazí seznam dostupných formátů "
 "souborů.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1440,170 +1470,170 @@ msgstr ""
 "Přeloženo s libpulse %s\n"
 "Propojeno s libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Neplatný název klienta \"%s\""
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Neplatný název proudu \"%s\""
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Neplatná mapa kanálů \"%s\""
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Neplatné upřesnění latence \"%s\""
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Neplatné upřesnění času zpracování \"%s\""
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Neplatná vlastnost \"%s\""
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Neznámý formát souboru %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Neplatné určení vzorku"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Příliš mnoho argumentů."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "Selhalo vytvoření určení vzorku souboru."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "Selhalo otevření zvukového souboru."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
 msgstr ""
 "Varování: zadané určení vzorku bude přepsáno určením získaným ze souboru."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "Selhalo zjištění určení vzorku ze souboru."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "Varování: Selhalo zjištění mapy kanálů ze souboru."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "Mapa kanálů se neshoduje s určením vzorku"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "Varování: selhal zápis mapy kanálů do souboru."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
 msgid ""
 "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "Otevírání proudu %s s určením vzorku \"%s\" a mapou kanálů \"%s\"."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "nahrávání"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "přehrávání"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() selhalo."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() selhalo."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() selhalo."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() selhalo: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() selhalo."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() selhalo."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "Nezdařilo se pozastavení: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "Nezdařilo se obnovení: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 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:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Spojení selhalo: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "Získáno SIGINT, ukončování.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "VAROVÁNÍ: Proces potomka ukončen signálem %u\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1621,7 +1651,7 @@ msgstr ""
 "  -s, --server=SERVER                   Název připojovaného serveru\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1632,50 +1662,61 @@ msgstr ""
 "Přeloženo s libpulse %s\n"
 "Propojeno s libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() selhalo.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() selhalo.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() selhalo.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Selhalo získání statistik: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "Právě používáno: %u bloků obsahujících celkem %s bajtů.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "Alokováno během celého běhu: %u bloků obsahujících celkem %s bajtů.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Velikost vzorkovací vyrovnávací paměti: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "Nezdařilo se získání informací o serveru: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1683,7 +1724,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Uživatelské jméno: %s\n"
 "Název počítače: %s\n"
@@ -1695,12 +1736,12 @@ msgstr ""
 "Výchozí zdroj: %s\n"
 "Cookie: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Nezdařilo se získání informací o cíli: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1739,22 +1780,22 @@ msgstr ""
 "\tVlastnosti:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tPorty:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tAktivní port: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "Nezdařilo se získání informací o zdroji: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1793,20 +1834,20 @@ msgstr ""
 "\tVlastnosti:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "nic"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "Selhalo získání informací o modulu: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1823,12 +1864,12 @@ msgstr ""
 "\tVlastnosti:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "Selhalo získání informací o klientu: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1843,12 +1884,12 @@ msgstr ""
 "\tVlastnosti:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "Selhalo získání informací o kartě: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1865,22 +1906,22 @@ msgstr ""
 "\tVlastnosti:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tProfily:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tAktivní profil: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Nezdařilo se získání informací o vstupu cíle: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1917,12 +1958,12 @@ msgstr ""
 "\tVlastnosti:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "Selhalo získání informace o výstupu zdroje: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1951,12 +1992,12 @@ msgstr ""
 "\tVlastnosti:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Selhalo získání informace o vzorku: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1987,26 +2028,80 @@ msgstr ""
 "\tVlastnosti:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Selhání: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Selhalo nahrání vzorku: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "Předčasný konec souboru"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Neplatný server"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "Získáno SIGINT, ukončování."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2029,6 +2124,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2067,7 +2163,7 @@ msgstr ""
 "  -n, --client-name=NÁZEV               Způsob volání tohoto klienta na "
 "serveru\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2078,104 +2174,104 @@ msgstr ""
 "Přeloženo s libpulse %s\n"
 "Propojeno s libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Zadejte prosím soubor se vzorkem určeným k nahrání"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Selhalo otevření zvukového souboru."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "Varování: Selhalo zjištění určení vzorku ze souboru."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "Je nutné zadat název vzorku určeného k přehrání"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "Je nutné zadat název vzorku určeného k odstranění"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "Je nutné zadat vstup cíle a cíl"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "Je nutné zadat index výstupu zdroje a zdroj"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "Je nutné zadat název modulu a argumenty."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "Je nutné zadat index modulu"
 
-#: ../src/utils/pactl.c:1090
+#: ../src/utils/pactl.c:1183
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr "Nelze zadat více než jeden cíl. Je nutné zadat booleovskou hodnotu."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
 msgstr "Nelze zadat více než jeden zdroj. Je nutné zadat booleovskou hodnotu."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "Je nutné upřesnit název karty/indexu a název profilu"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "Je nutné upřesnit název cíle/indexu a název portu"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "Je nutné upřesnit název zdroje/indexu a název portu"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "Je nutné upřesnit název cíle/indexu a hlasitost"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "Neplatné určení hlasitosti"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "Je nutné upřesnit název zdroje/indexu a hlasitost"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "Je nutné zadat index vstupu cíle a hlasitost"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "Neplatný index vstupu cíle"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "Je nutné upřesnit název cíle/indexu a booleovskou hodnotu ztlumení"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "Je nutné upřesnit název zdroje/indexu a booleovskou hodnotu ztlumení"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "Je nutné zadat index vstupu cíle a booleovskou hodnotu ztlumení"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "Neplatné určení indexu vstupu cíle"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "Nezadán žádný platný příkaz."
 
@@ -2258,44 +2354,44 @@ msgstr "Nezdařilo se nahrát data cookie\n"
 msgid "Not yet implemented.\n"
 msgstr "Doposud neimplementováno.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr "Neběží žádný démon PulseAudio, nebo neběží jako démon sezení."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "Nezdařilo se zabít démona PulseAudio."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "Démon neodpovídá."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "Nelze přistoupit k zámku automatického spouštění."
 
@@ -2334,38 +2430,42 @@ msgstr ""
 "či jinou hodnotu < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Vypnuto"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "Přehrávání s velmi věrnou reprodukcí (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "Záznam s velmi věrnou reprodukcí (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Duplexní telefonie (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "Zvukový server PulseAudio"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "Výstupní zařízení"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "Vstupní zařízení"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "Zvuk na @HOSTNAME@"
 
@@ -2429,136 +2529,163 @@ msgstr "Zesilovač"
 msgid "No Amplifier"
 msgstr "Bez zesilovače"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "Zesílení"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "Bez zesílení"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "Analogová sluchátka"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "Analogový vstup"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "Analogový mikrofon"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "Analogový linkový vstup"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "Analogové rádio"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "Analogový obraz"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "Analogový výstup"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "Analogová sluchátka"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "Analogový výstup (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "Analogový výstup mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Analogové stereo"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Analogové mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Analogové stereo"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "Analogový Surround 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "Analogový Surround 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "Analogový Surround 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Analogový Surround 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Analogový Surround 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Analogový Surround 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Analogový Surround 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "Analogový Surround 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "Analogový Surround 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "Analogový Surround 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Analogový Surround 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Digitální stereo (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Digitální Surround 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Digitální Surround 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Digitální Surround 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Digitální stereo (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "Analogové duplexní mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "Analogové duplexní stereo"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Digitální duplexní stereo (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Nízkofrekvenční zářič"
+
 #~ msgid "Invalid client name '%s'\n"
 #~ msgstr "Neplatný název klienta \"%s\"\n"
 
diff --git a/po/de.po b/po/de.po
index 25b015b..d08a3fa 100644
--- a/po/de.po
+++ b/po/de.po
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-08 02:51+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-12-08 15:14+1000\n"
 "Last-Translator: Hedda Peters <hpeters at redhat.com>\n"
 "Language-Team: \n"
@@ -22,12 +22,12 @@ msgstr ""
 "X-Poedit-Language: German\n"
 "X-Generator: KBabel 1.11.4\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -40,7 +40,7 @@ msgstr ""
 "Dies ist wahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie "
 "dieses Problem den ALSA-Entwicklern."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -53,7 +53,7 @@ msgstr ""
 "Dies ist wahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie "
 "dieses Problem den ALSA-Entwicklern."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -61,8 +61,8 @@ msgid ""
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 "to the ALSA developers."
 msgstr ""
-"snd_pcm_mmap_begin() gibt einen Wert zurück, der ausserordentlich gross "
-"ist: %lu bytes (%lu ms).\n"
+"snd_pcm_mmap_begin() gibt einen Wert zurück, der ausserordentlich gross ist: "
+"%lu bytes (%lu ms).\n"
 "Dies ist wahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie "
 "dieses Problem den ALSA-Entwicklern."
 
@@ -87,8 +87,10 @@ msgid ""
 "input control values>"
 msgstr ""
 "sink_name=<Name des Sinks> sink_properties=<Eigenschaften des Sinks> "
-"master=<Name des zu filternden Sinks> format=<Sample-Format> rate=<Sample-Rate> "
-"channels=<Anzahl der Channels> channel_map=<Channel-Map> plugin=<ladspa Plugin-Name> label=<ladspa Plugin-Label> control=<kommagetrennte Liste von Eingabekontrollwerten>"
+"master=<Name des zu filternden Sinks> format=<Sample-Format> rate=<Sample-"
+"Rate> channels=<Anzahl der Channels> channel_map=<Channel-Map> "
+"plugin=<ladspa Plugin-Name> label=<ladspa Plugin-Label> "
+"control=<kommagetrennte Liste von Eingabekontrollwerten>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
@@ -98,11 +100,11 @@ msgstr "Clocked NULL Sink"
 msgid "Null Output"
 msgstr "Null-Ausgabe"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Internes Audio"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Modem"
 
@@ -118,92 +120,98 @@ msgstr "Neuer dlopen-Loader konnte nicht gefunden werden."
 msgid "Failed to add bind-now-loader."
 msgstr "Hinzufügen von Bind-Now-Loader fehlgeschlagen."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Signal %s empfangen."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Wird beendet."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Benutzer '%s' nicht gefunden."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Gruppe '%s' nicht gefunden."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Benutzer '%s' (UID %lu) und Gruppe '%s' (GID %lu) gefunden."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "GID von Benutzer '%s' und Gruppe '%s' stimmen nicht überein."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "Benutzerverzeichnis von Benutzer '%s' ist nicht '%s', ignoriere."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Konnte '%s' nciht erzeugen: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "Wechseln der Gruppen-Liste fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "Wechseln der GID fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "Wechseln der UID fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "Root-Berechtigungen erfolgreich zurückgesetzt."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "System-Modus auf dieser Plattform nicht unterstützt."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "Parsen der Kommandzeile fehlgeschlagen."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "Daemon läuft nicht"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Daemon läuft als PID %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Konnte Prozess nicht abbrechen: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -211,155 +219,170 @@ msgstr ""
 "Dieses Programm sollte ohne die Option --system nicht als Administrator "
 "ausgeführt werden."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Root-Berechtigungen benötigt."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start nicht unterstützt für System-Instanzen."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "System-Modus aktiv, jeodch --disallow-exit nicht gesetzt!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 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:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "System-Modus aktiv, SHM-Modus gezwungenermaßen deaktiviert!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr "System-Modus aktiv, Exit-Idle-Time gezwungenermaßen deaktiviert!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "Reservieren von STDIO fehlgeschlagen."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "pipe fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "Start des Daemons fehlgeschlagen."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "Start des Daemons erfolgreich."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() fehlgeschlagen: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Dies ist PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Kompilier-Host: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "Kompilier-CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "Laufe auf Host: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u CPUs gefunden."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "Seitengröße ist %lu Bytes."
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Kompiliere mit Valgrind-Unterstützung: ja"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Kompiliere mit Valgrind-Unterstützung: nein"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Läuft im Valgrind-Modus: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "Laufe auf Host: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Optimiertes Build: ja"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Optimiertes Build: nein"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG definiert, alle Ansprüche deaktiviert."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH definiert, nur fast-path-Ansprüche deaktiviert."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "Alle Ansprüche aktiviert."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "Beziehen der Maschinen-ID fehlgeschlagen"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "System- ID ist %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "System- ID ist %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Nutze Laufzeit-Verzeichnis %s."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "Nutze Zustands-Verzeichnis %s."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "Modul-Verzeichnis %s benutzen."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Laufe im System-Modus: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -374,41 +397,41 @@ msgstr ""
 "Für eine Erklärung warum System Mode eine schlechte Idee ist, bitte http://"
 "pulseaudio.org/wiki/WhatIsWrongWithSystemMode lesen"
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() fehlgeschlagen."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Neue hochauslösende Timer verfügbar! Guten Appetit!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 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:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() fehlgeschlagen."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "Konnte Daemon nicht initialisieren."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "Daemon verweigert Ausführung, da keine Module geladen."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "Start des Daemons abgeschlossen."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "Herunterfahren des Daemon gestartet."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "Daemon beendet."
 
@@ -493,7 +516,8 @@ 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                     Bereinige veraltete Bereiche des gemeinsamen Speichers\n"
+"      --cleanup-shm                     Bereinige veraltete Bereiche des "
+"gemeinsamen Speichers\n"
 "      --start                           Starte Daemon, falls noch nicht "
 "geschehen\n"
 "  -k  --kill                            Laufenden Daemon beenden\n"
@@ -504,7 +528,8 @@ msgstr ""
 "      --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]            Versuche höchste Priorität zu setzen\n"
+"      --high-priority[=BOOL]            Versuche höchste Priorität zu "
+"setzen\n"
 "                                        (Nur verfügbar als root, wenn SUID "
 "oder\n"
 "                                        mit erhöhtem RLIMIT_NICE)\n"
@@ -528,12 +553,13 @@ msgstr ""
 "      --log-level[=LEVEL]               Grad der Ausführlichkeit angeben\n"
 "  -v                                    Ausführliche Meldungen\n"
 "      --log-target={auto,syslog,stderr} Protokoll-Ziel angeben\n"
-"      --log-meta[=BOOL]                 Speicherort des Codes in Protokollnachrichten"
+"      --log-meta[=BOOL]                 Speicherort des Codes in "
+"Protokollnachrichtenangeben\n"
+"      --log-time[=BOOL]                 Zeitstempel in Protokollnachrichten "
+"angeben\n"
+"      --log-backtrace=FRAMES            Backtrace in Protokollnachrichten "
 "angeben\n"
-"      --log-time[=BOOL]                 Zeitstempel in Protokollnachrichten angeben\n"
-"      --log-backtrace=FRAMES            Backtrace in Protokollnachrichten angeben\n"
-"  -p, --dl-search-path=PATH             Suchpfad für dynamisch "
-"freigegebene\n"
+"  -p, --dl-search-path=PATH             Suchpfad für dynamisch freigegebene\n"
 "                                        Objekte (Plugins) angeben\n"
 "      --resample-method=METHOD          Nutze diese Resampling-Methode\n"
 "                                        (Siehe --dump-resample-methods für\n"
@@ -542,11 +568,12 @@ msgstr ""
 "      --no-cpu-limit[=BOOL]             CPU-Lastbegrenzung auf "
 "unterstützten\n"
 "                                        Systemen nicht installieren.\n"
-"      --disable-shm[=BOOL]              Unterstützung für Shared "
-"Memory deaktivieren.\n"
+"      --disable-shm[=BOOL]              Unterstützung für Shared Memory "
+"deaktivieren.\n"
 "\n"
 "STARTUP SCRIPT:\n"
-"  -L, --load=\"MODULE ARGUMENTS\"         Plugin-Modul mit diesen Parametern\n"
+"  -L, --load=\"MODULE ARGUMENTS\"         Plugin-Modul mit diesen "
+"Parametern\n"
 "                                        laden.\n"
 "  -F, --file=FILENAME                   Dieses Skript ausführen\n"
 "  -C                                    Nach Start auf laufendem TTY\n"
@@ -567,8 +594,8 @@ 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 Parameter für Grad der Protokollierung (entweder numerisch "
-"im Bereich 0..4 or einen dieser: debug, info, notice, warn, error)."
+"--log-level erfordert Parameter für Grad der Protokollierung (entweder "
+"numerisch im Bereich 0..4 or einen dieser: debug, info, notice, warn, error)."
 
 #: ../src/daemon/cmdline.c:276
 msgid "--high-priority expects boolean argument"
@@ -592,7 +619,8 @@ msgstr "--use-pid-file erfordert Boolsche Variable"
 
 #: ../src/daemon/cmdline.c:321
 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:328
 msgid "--log-time expects boolean argument"
@@ -664,72 +692,77 @@ msgstr "WARNUNG (DEPRECATION): %s\n"
 msgid "Path: %s\n"
 msgstr "Pfad: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Ungültiges Log-Ziel '%s'."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Ungültige Log-Stufe '%s'."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Ungültige Resample-Methode '%s'."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] Ungültiges rlimit '%s'."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit auf dieser Plattform nicht unterstützt."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Ungültiges Sample-Format '%s'."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Ungültige Sample-Rate '%s'."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Ungültige Sample-Kanäle '%s'."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Ungültige Kanal-Zuordnung '%s'."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Ungültige Anzahl von Fragmenten '%s'."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Ungültige Fragmentgröße '%s'."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Ungültige Nice-Stufe '%s'."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Ungültige Sample-Rate '%s'."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Öffnen der Konfigurationsdatei fehlgeschlagen : %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -737,7 +770,7 @@ msgstr ""
 "Die angegebene Standard-Kanalzuordnung hat eine andere Anzahl von Kanälen "
 "als die angegebene Standard-Kanal-Anzahl."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Lese von Konfigurationsdatei: %s ###\n"
@@ -783,8 +816,8 @@ msgid "Rear Right"
 msgstr "Hinten Rechts"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Niedrigfrequenzemitter"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1129,191 +1162,191 @@ msgstr "XOpenDisplay() fehlgeschlagen"
 msgid "Failed to parse cookie data"
 msgstr "Parsen der Cookie-Daten fehlgeschlagen"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Konfigurationsdatei '%s' konnte nicht geöffnet werden: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Verbindungsversuch ohne Cookie, da keines geladen."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "Nachricht für unbekannte Erweiterung '%s' erhalten"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Entleeren des Streams fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "Wiedergabe-Stream entleert."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "Verbindung zu Server entleert."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_write() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Stream wurde erfolgreich erstellt."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Pufferdaten: maxlenght=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Pufferdaten: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "Benutze Sample-Angabe '%s', Kanalzuordnung '%s'."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Verbunden mit Gerät %s (%u, %sausgesetzt)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "Stream-Fehler: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Stream-Gerät ausgesetzt.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "Stream-Gerät reaktiviert.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "Stream leergelaufen.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "Stream überlaufen.%s "
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "Stream gestartet: %s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Stream an Gerät %s übergeben (%u, %sausgesetzt).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "nicht "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Stream-Zwischenspeicher-Attribute geändert.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "Verbindung hergestellt.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Verbindungsfehler: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "EOF empfangen."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "Signal empfangen, beenden."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "Erhalten der Latenz fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Zeit: %0.3f sec; Latenz: %0.0f usec."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1365,10 +1398,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [options]\n"
@@ -1382,17 +1419,19 @@ msgstr ""
 "  -v, --verbose                         Ausführliche Meldungen\n"
 "\n"
 "  -s, --server=SERVER                   Name des zu verbindenden Servers\n"
-"  -d, --device=DEVICE                   Name des/der zu verbindender Sink/Quelle\n"
+"  -d, --device=DEVICE                   Name des/der 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"
 "      --rate=SAMPLERATE                 Sample-Rate in Hz (Standard 44100)\n"
-"      --format=SAMPLEFORMAT             Ein Sample-Format von s16le, "
-"s16be, u8, float32le,\n"
+"      --format=SAMPLEFORMAT             Ein Sample-Format von s16le, s16be, "
+"u8, float32le,\n"
 "                                        float32be, ulaw, alaw, s32le, s32be, "
 "s24le, s24be,\n"
-"                                        s24-32le, s24-32be (Standard ist s16ne)\n"
+"                                        s24-32le, s24-32be (Standard ist "
+"s16ne)\n"
 "      --channels=CHANNELS               Anzahl Kanäle, 1 für Mono, 2 für "
 "Stereo\n"
 "                                        (Standard ist 2)\n"
@@ -1411,13 +1450,14 @@ msgstr ""
 "      --latency=BYTES                   Diese Latenz verwenden.\n"
 "      --process-time=BYTES              Diese Prozesszeit pro Anfrage "
 "verwenden.\n"
-"      --property=PROPERTY=VALUE         Die angegebene Eigenschaft auf den"
-"spezifizierten Wert setzen.\n"
+"      --property=PROPERTY=VALUE         Die angegebene Eigenschaft auf "
+"denspezifizierten Wert setzen.\n"
 "      --raw                             PCM-Rohdaten aufnehmen/wiedergeben.\n"
-"      --file-format=FFORMAT             Formatierte PCM-Daten aufnehmen/wiedergeben.\n"
+"      --file-format=FFORMAT             Formatierte PCM-Daten aufnehmen/"
+"wiedergeben.\n"
 "      --list-file-formats               Verfügbare Dateiformate auflisten.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1428,168 +1468,170 @@ msgstr ""
 "Kompiliert mit libpulse %s\n"
 "Gelinkt mit libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Ungültiger Client-Name '%s'"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Ungültiger Stream-Name '%s'"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Ungültige Kanal-Zuweisung '%s'"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Ungültige Latenz-Angaben '%s'"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Ungültige Prozesszeit-Angaben '%s'"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Ungültige Eigenschaft '%s'"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Unbekanntes Dateiformat %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Ungültige Sample-Angaben"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Zu viele Argumente."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "Beziehen der Sample-Informationen für die Datei fehlgeschlagen."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "Öffnen der Audio-Datei fehlgeschlagen."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
 msgstr "Warnung: Beziehen der Sample-Angabe aus Datei fehlgeschlagen."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "Beziehen der Sample-Informationen der Datei fehlgeschlagen."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "Warnung: Bestimmung der Kanalzuordnung aus Datei fehlgeschlagen."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "Kanalzuordnung entspricht nicht Einstellungen des Samples"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "Warnung: Schreiben der Kanalzuordnung in Datei fehlgeschlagen."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr "Öffnen eines %s-Streams mit Sample-Angabe '%s' und Kanalzuordnung '%s'."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr ""
+"Öffnen eines %s-Streams mit Sample-Angabe '%s' und Kanalzuordnung '%s'."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "aufnehmen"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "abspielen"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() fehlgeschlagen"
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() fehlgeschlagen."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() fehlgeschlagen."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_new() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_new() fehlgeschlagen."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() fehlgeschlagen."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "Aussetzen fehlgeschlagen: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "Resume fehlgeschlagen: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 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:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Verbindungsfehler: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "SIGINT empfangen, beende.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "WARNUNG: Kind-Prozess durch Signal %u beendet\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1607,7 +1649,7 @@ msgstr ""
 "  -s, --server=SERVER                   Name des Zielservers\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1618,50 +1660,61 @@ msgstr ""
 "kompiliert mit libpulse %s\n"
 "Gelinkt mit libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() fehlgeschlagen.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() fehlgeschlagen.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() fehlgeschlagen.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Beziehen der Statistik fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "Momentane Nutzung: %u Blöcke mit insgesamt %s Bytes.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "Während gesamter Laufzeit: %u Blöcke mit insgesamt %s Bytes.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Sample-Pufferspeichergrösse: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "Beziehen der Server-Information fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1669,7 +1722,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Name des Nutzers: %s\n"
 "Rechnername: %s\n"
@@ -1681,12 +1734,12 @@ msgstr ""
 "Standard-Quelle: %s\n"
 "Cookie: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Erhalten der Sink-Informationen fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1725,22 +1778,22 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tProfile:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tAktive Profile: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "Beziehen der Quellen-Informationen fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1779,20 +1832,20 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "k. A."
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "Beziehen der Modul-Information fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1809,12 +1862,12 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "Beziehen der Client-Information fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1829,12 +1882,12 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "Beziehen der Karten-Information fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1851,22 +1904,22 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tProfile:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tAktive Profile: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Erhalten der Sink-Eingabe-Informationen fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1903,12 +1956,12 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "Konnte Informationen über Quell-Ausgabe nicht holen: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1937,12 +1990,12 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Beziehen der Sample-Informationen fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1973,26 +2026,80 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Hochladen des Sample fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "Dateiende ist zu früh aufgetreten"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Ungültiger Server"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT empfangen, beenden."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2015,6 +2122,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2052,7 +2160,7 @@ msgstr ""
 "  -s, --server=SERVER                   Name des Zielservers\n"
 "  -n, --client-name=NAME                Rufname des Clients auf dem Server\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2063,103 +2171,115 @@ msgstr ""
 "Kompiliert mit libpulse %s\n"
 "Gelinkt mit libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Geben Sie eine zu öffnende Sample-Datei an"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Öffnen der Audio-Datei fehlgeschlagen."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "Warnung: Beziehen der Sample-Angabe aus Datei fehlgeschlagen."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "Sie müssen eine abzuspielende Sample-Datei angeben"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "Sie müssen eine zu löschende Sample-Datei angeben"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "Sie müssen einen Sink-Eingabe-Indexwert und einen Sink angeben"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
-msgstr "Sie müssen eine Indexwert für die Quell-Ausgabe und eine Quelle angeben"
+msgstr ""
+"Sie müssen eine Indexwert für die Quell-Ausgabe und eine Quelle angeben"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "Sie müssen einen Modulnamen angeben und Argumente übergeben."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "Sie müssen einen Indexwert für ein Modul angeben"
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
-msgstr "Sie sollten nur einen Sink angeben. Sie müssen zumindest eine Boolsche Variable übergeben."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
+msgstr ""
+"Sie sollten nur einen Sink angeben. Sie müssen zumindest eine Boolsche "
+"Variable übergeben."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr "Sie sollten nur eine Quelle angeben. Sie müssen zumindest eine Boolsche Variable übergeben."
+msgstr ""
+"Sie sollten nur eine Quelle angeben. Sie müssen zumindest eine Boolsche "
+"Variable übergeben."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "Sie müssen einen Karten-Name/Indexwert und einen Profilnamen angeben"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "Sie müssen einen Sink-Namen/-Indexwert und einen Portnamen angeben"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "Sie müssen einen Quellennamen/-Indexwert und einen Portnamen angeben"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "Sie müssen einen Sink-Namen/-Indexwert und eine Lautstärke angeben"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "Ungültige Sample-Angaben"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "Sie müssen einen Quellennamen/-Indexwert und einen Portnamen angeben"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "Sie müssen einen Sink-Eingabe-Indexwert und eine Lautstärke angeben."
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "Ungültiger Sink-Eingabe-Index"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr "Sie müssen einen Sink-Namen/-Indexwert und eine Boolsche Variable für Stummschaltung angeben"
+msgstr ""
+"Sie müssen einen Sink-Namen/-Indexwert und eine Boolsche Variable für "
+"Stummschaltung angeben"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
-msgstr "Sie müssen einen Quellennamen/-Indexwert und eine Boolsche Variable für Stummschaltung angeben"
+msgstr ""
+"Sie müssen einen Quellennamen/-Indexwert und eine Boolsche Variable für "
+"Stummschaltung angeben"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr "Sie müssen einen Sink-Eingabe-Indexwert und eine Boolsche Variable für Stummschaltung angeben"
+msgstr ""
+"Sie müssen einen Sink-Eingabe-Indexwert und eine Boolsche Variable für "
+"Stummschaltung angeben"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "Ungültige Sink-Eingabe-Index-Angaben"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "Kein gültiger Befehl angegeben."
 
@@ -2242,44 +2362,44 @@ msgstr "Laden der Cookie-Daten fehlgeschlagen\n"
 msgid "Not yet implemented.\n"
 msgstr "Noch nicht implementiert.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr "Es läuft kein PulseAudio-Dienst oder nicht als Sessiondienst."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "Beenden des PulseAudio-Daemon fehlgeschlagen."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "Daemon antwortet nicht."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "Fehler beim Zugriff auf Autostart-Sperre."
 
@@ -2293,10 +2413,13 @@ msgid ""
 "We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
 "returned 0 or another value < min_avail."
 msgstr ""
-"ALSA weckte uns auf, um neue Daten auf das Gerät zu schreiben, doch es gab nichts zum Schreiben!\n"
-"Dies ist höchstwahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie diesen Fehler den ALSA-Entwicklern.\n"
-"Wir wurden durch das POLLOUT-Set geweckt, allerdings lieferte ein anschliessender snd_pcm_avail() "
-"den Wert 0 oder einen anderen Wert < min_avail."
+"ALSA weckte uns auf, um neue Daten auf das Gerät zu schreiben, doch es gab "
+"nichts zum Schreiben!\n"
+"Dies ist höchstwahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden "
+"Sie diesen Fehler den ALSA-Entwicklern.\n"
+"Wir wurden durch das POLLOUT-Set geweckt, allerdings lieferte ein "
+"anschliessender snd_pcm_avail() den Wert 0 oder einen anderen Wert < "
+"min_avail."
 
 #: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
 #, c-format
@@ -2308,44 +2431,51 @@ msgid ""
 "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
 "returned 0 or another value < min_avail."
 msgstr ""
-"ALSA weckte uns auf, um neue Daten vom Gerät zu lesen, doch es gab nichts zum Lesen!\n"
-"Dies ist höchstwahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie diesen Fehler den ALSA-Entwicklern.\n"
-"Wir wurden durch das POLLIN-Set geweckt, allerdings lieferte ein anschliessender snd_pcm_avail() "
-"den Wert 0 oder einen anderen Wert < min_avail."
+"ALSA weckte uns auf, um neue Daten vom Gerät zu lesen, doch es gab nichts "
+"zum Lesen!\n"
+"Dies ist höchstwahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden "
+"Sie diesen Fehler den ALSA-Entwicklern.\n"
+"Wir wurden durch das POLLIN-Set geweckt, allerdings lieferte ein "
+"anschliessender snd_pcm_avail() den Wert 0 oder einen anderen Wert < "
+"min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Aus"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "High Fidelity Playback (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "High Fidelity-Wiedergabe (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Telephony Duplex (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio Sound Server"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "Ausgabegeräte"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "Eingabegeräte"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "Audio auf @HOSTNAME@"
 
@@ -2409,133 +2539,159 @@ msgstr "Verstärker"
 msgid "No Amplifier"
 msgstr "Kein Verstärker"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "Boost"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "Kein Boost"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "Analoge Kopfhörer"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "Analoge Eingabe"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "Analoges Mikrofon"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "Analoges Line-In"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "Analoges Radio"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "Analoges Video"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "Analoge Ausgabe"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "Analoge Kopfhörer"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "Analoge Ausgabe (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "Analoge Mono-Ausgabe"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Analog Stereo"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Analog Mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Analog Stereo"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "Analog Surround 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "Analog Surround 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "Analog Surround 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Analog Surround 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Analog Surround 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Analog Surround 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Analog Surround 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "Analog Surround 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "Analog Surround 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "Analog Surround 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Analog Surround 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Digital Stereo (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Digital Surround 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Digital Surround 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Digital Surround 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Digital Stereo (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "Analog Mono Duplex"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "Analog Stereo Duplex"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Digital Stereo Duplex (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Niedrigfrequenzemitter"
diff --git a/po/de_CH.po b/po/de_CH.po
index e239deb..e31419f 100644
--- a/po/de_CH.po
+++ b/po/de_CH.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-09-14 10:22+0100\n"
 "Last-Translator: Fabian Affolter <fab at fedoraproject.org>\n"
 "Language-Team: German <fedora-trans-de at redhat.com>\n"
@@ -19,12 +19,12 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Poedit-Language: German\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -37,7 +37,7 @@ msgstr ""
 "Dies ist wahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie "
 "diesen Punkt den ALSA-Entwicklern."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -50,7 +50,7 @@ msgstr ""
 "Dies ist wahrscheinlich ein Fehler im ALSA-Treiber '%s'. Bitte melden Sie "
 "diesen Punkt den ALSA-Entwicklern."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -94,11 +94,11 @@ msgstr ""
 msgid "Null Output"
 msgstr "Ausgang %s"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Internes Audio"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Modem"
 
@@ -114,92 +114,98 @@ msgstr "Neuer dlopen-Loader konnte nicht gefunden werden."
 msgid "Failed to add bind-now-loader."
 msgstr "Hinzufügen von Bind-Now-Loader fehlgeschlagen."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Signal %s empfangen."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Wird beendet."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Benutzer '%s' nicht gefunden."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Gruppe '%s' nicht gefunden."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Benutzer '%s' (UID %lu) und Gruppe '%s' (GID %lu) gefunden."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "GID von Benutzer '%s' und Gruppe '%s' stimmen nicht überein."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "Benutzerverzeichnis von Benutzer '%s' ist nicht '%s', ignoriere."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Konnte '%s' nciht erzeugen: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "Wechseln der Gruppen-Liste fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "Wechseln der GID fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "Wechseln der UID fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "Root-Berechtigungen erfolgreich zurückgesetzt."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "System-Modus auf dieser Plattform nicht unterstützt."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "Parsen der Kommandzeile fehlgeschlagen."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "Daemon läuft nicht"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Daemon läuft als PID %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Konnte Prozess nicht abbrechen: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -207,155 +213,170 @@ msgstr ""
 "Dieses Programm sollte ohne die Option --system nicht als Administrator "
 "ausgeführt werden."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Root-Berechtigungen benötigt."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start nicht unterstützt für System-Instanzen."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "System-Modus aktiv, jeodch --disallow-exit nicht gesetzt!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 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:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "System-Modus aktiv, SHM-Modus gezwungenermaßen deaktiviert!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr "System-Modus aktiv, Exit-Idle-Time gezwungenermaßen deaktiviert!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "Reservieren von STDIO fehlgeschlagen."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "pipe fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "Start des Daemons fehlgeschlagen."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "Start des Daemons erfolgreich."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() fehlgeschlagen: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Dies ist PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Kompilier-Host: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "Kompilier-CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "Laufe auf Host: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u CPUs gefunden."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "Seitengröße ist %lu Bytes."
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Kompiliere mit Valgrind-Unterstützung: ja"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Kompiliere mit Valgrind-Unterstützung: nein"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Läuft im Valgrind-Modus: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "Laufe auf Host: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Optimiertes Build: ja"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Optimiertes Build: nein"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG definiert, alle Ansprüche deaktiviert."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH definiert, nur fast-path-Ansprüche deaktiviert."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "Alle Ansprüche aktiviert."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "Beziehen der Maschinen-ID fehlgeschlagen"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "System- ID ist %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "System- ID ist %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Nutze Laufzeit-Verzeichnis %s."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "Nutze Zustands-Verzeichnis %s."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "Modul-Verzeichnis %s benutzen."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Laufe im System-Modus: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -365,41 +386,41 @@ msgid ""
 "explanation why system mode is usually a bad idea."
 msgstr ""
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() fehlgeschlagen."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Neue hochauslösende Timer verfügbar! Guten Appetit!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 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:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() fehlgeschlagen."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "Konnte Daemon nicht initialisieren."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "Daemon verweigert Ausführung, da keine Module geladen."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "Start des Daemons abgeschlossen."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "Herunterfahren des Daemon gestartet."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "Daemon beendet."
 
@@ -653,72 +674,77 @@ msgstr "DEPRECATION WARNING: %s\n"
 msgid "Path: %s\n"
 msgstr "Pfad: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Ungültiges Log-Ziel '%s'."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Ungültige Log-Stufe '%s'."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Ungültige Resample-Methode '%s'."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] Ungültiges rlimit '%s'."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit auf dieser Plattform nicht unterstützt."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Ungültiges Sample-Format '%s'."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Ungültige Sample-Rate '%s'."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Ungültige Sample-Kanäle '%s'."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Ungültige Kanal-Zuordnung '%s'."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Ungültige Anzahl von Fragmenten '%s'."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Ungültige Fragmentgröße '%s'."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Ungültige Nice-Stufe '%s'."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Ungültige Sample-Rate '%s'."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Öffnen der Konfigurationsdatei fehlgeschlagen : %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -726,7 +752,7 @@ msgstr ""
 "Die angegebene Standard-Kanalzuordnung hat eine andere Anzahl von Kanälen "
 "als die angegebene Standard-Kanal-Anzahl."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Lese von Konfigurationsdatei: %s ###\n"
@@ -772,8 +798,8 @@ msgid "Rear Right"
 msgstr "Hinten Rechts"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Niedrigfrequenzemitter"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1118,190 +1144,190 @@ msgstr "XOpenDisplay() fehlgeschlagen"
 msgid "Failed to parse cookie data"
 msgstr "Parsen der Cookie-Daten fehlgeschlagen"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Konfigurationsdatei '%s' konnte nicht geöffnet werden: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Verbindungsversuch ohne Cookie, da keines geladen."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "Nachricht für unbekannte Erweiterung '%s' erhalten"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Entleeren des Streams fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "Wiedergabe-Stream entleert."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "Verbindung zu Server entleert."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_write() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Stream wurde erfolgreich erstellt."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Pufferdaten: maxlenght=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Pufferdaten: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "Benutze Sample-Angabe '%s', Kanalzuordnung '%s'."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Verbunden mit Gerät %s (%u, %sausgesetzt)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "Stream-Fehler: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Stream-Gerät ausgesetzt.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "Stream-Gerät reaktiviert.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "Stream leergelaufen.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "Stream überlaufen.%s "
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "Stream gestartet: %s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Stream an Gerät %s übergeben (%u, %sausgesetzt).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "nicht "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Stream-Zwischenspeicher-Attribute geändert.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "Verbindung hergestellt.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Verbindungsfehler: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "EOF empfangen."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "Signal empfangen, beenden."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "Erhalten der Latenz fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Zeit: %0.3f sec; Latenz: %0.0f usec."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:609
+#: ../src/utils/pacat.c:630
 #, fuzzy, c-format
 msgid ""
 "%s [options]\n"
@@ -1354,10 +1380,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [options]\n"
@@ -1400,7 +1430,7 @@ msgstr ""
 "      --process-time=BYTES              Diese Prozesszeit pro Anfrage "
 "verwenden.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1411,170 +1441,170 @@ msgstr ""
 "Kompiliert mit libpulse %s\n"
 "Gelinkt mit libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Ungültiger Client-Name '%s'"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Ungültiger Stream-Name '%s'"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Ungültige Kanal-Zuweisung '%s'"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Ungültige Latenz-Angaben '%s'"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Ungültige Prozesszeit-Angaben '%s'"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Ungültige Eigenschaft '%s'"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Unbekanntes Dateiformat %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Ungültige Sample-Angaben"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Zu viele Argumente."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "Beziehen der Sample-Informationen für die Datei fehlgeschlagen."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "Öffnen der Audio-Datei fehlgeschlagen."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
 msgstr "Warnung: Beziehen der Sample-Angabe aus Datei fehlgeschlagen."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "Beziehen der Sample-Informationen der Datei fehlgeschlagen."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "Warnung: Bestimmung der Kanalzuordnung aus Datei fehlgeschlagen."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "Kanalzuordnung entspricht nicht Einstellungen des Samples"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "Warnung: Schreiben der Kanalzuordnung in Datei fehlgeschlagen."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
 msgid ""
 "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
 "Öffnen eines %s-Streams mit Sample-Angabe '%s' und Kanalzuordnung '%s'."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "aufnehmen"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "abspielen"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() fehlgeschlagen"
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() fehlgeschlagen."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() fehlgeschlagen."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_new() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_new() fehlgeschlagen."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() fehlgeschlagen."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "Aussetzen fehlgeschlagen: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "Resume fehlgeschlagen: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 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:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Verbindungsfehler: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "SIGINT empfangen, beende.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "WARNUNG: Kind-Prozess durch Signal %u beendet\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1592,7 +1622,7 @@ msgstr ""
 "  -s, --server=SERVER                   Name des Zielservers\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1603,50 +1633,61 @@ msgstr ""
 "kompiliert mit libpulse %s\n"
 "Gelinkt mit libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() fehlgeschlagen.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() fehlgeschlagen.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() fehlgeschlagen.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Beziehen der Statistik fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "Momentane Nutzung: %u Blöcke mit insgesamt %s Bytes.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "Während gesamter Laufzeit: %u Blöcke mit insgesamt %s Bytes.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Sample-Pufferspeichergrösse: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "Beziehen der Server-Information fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1654,7 +1695,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Name des Nutzers: %s\n"
 "Rechnername: %s\n"
@@ -1666,12 +1707,12 @@ msgstr ""
 "-Standard-Quelle: %s\n"
 "Cookie: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Erhalten der Sink-Informationen fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1710,22 +1751,22 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tProfile:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tAktive Profile: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "Beziehen der Quellen-Informationen fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1764,20 +1805,20 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "k. A."
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "Beziehen der Modul-Information fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1794,12 +1835,12 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "Beziehen der Client-Information fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1814,12 +1855,12 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "Beziehen der Karten-Information fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1836,22 +1877,22 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tProfile:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tAktive Profile: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Konnte Sink-Eingabe-Informationen nicht holen: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1888,12 +1929,12 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "Konnte Informationen über Quell-Ausgabe nicht holen: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1922,12 +1963,12 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Beziehen der Sample-Informationen fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1958,26 +1999,81 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Hochladen des Sample fehlgeschlagen: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "Dateiende ist zu früh aufgetreten"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr "Sink"
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr "Quelle"
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+#, fuzzy
+msgid "source-output"
+msgstr "Quelle"
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Ungültiger Server"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT empfangen, beenden."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2000,6 +2096,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2037,7 +2134,7 @@ msgstr ""
 "  -s, --server=SERVER                   Name des Zielservers\n"
 "  -n, --client-name=NAME                Rufname des Clients auf dem Server\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2048,51 +2145,51 @@ msgstr ""
 "Kompiliert mit libpulse %s\n"
 "Gelinkt mit libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Geben Sie eine zu öffnende Sample-Datei an"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Öffnen der Audio-Datei fehlgeschlagen."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "Warnung: Beziehen der Sample-Angabe aus Datei fehlgeschlagen."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "Sie müssen eine abzuspielende Sample-Datei angeben"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "Sie müssen eine zu löschende Sample-Datei angeben"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "Sie müssen einen Sink-Eingabe-Indexwert und einen Sink angeben"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr ""
 "Sie müssen eine Indexwert für die Quell-Ausgabe und eine Quelle angeben"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "Sie müssen einen Modulnamen angeben und Argumente übergeben."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "Sie müssen einen Indexwert für ein Modul angeben"
 
-#: ../src/utils/pactl.c:1090
+#: ../src/utils/pactl.c:1183
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 "Sie sollten nur eine Senke angeben. Sie müssen zumindest einen bool'schen "
 "Wert übergeben."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
@@ -2100,57 +2197,57 @@ msgstr ""
 "Sie sollten nur eine Quelle angeben. Sie müssen zumindest einen bool'schen "
 "Wert übergeben."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "Sie müssen einen Karten-Name/Indexwert und einen Profilnamen angeben"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "Sie müssen einen Senkennamen/-Indexwert und einen Portnamen angeben"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "Sie müssen einen Quellennamen/-Indexwert und einen Portnamen angeben"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "Sie müssen einen Senkennamen/-Indexwert und einen Portnamen angeben"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "Ungültige Sample-Angaben"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "Sie müssen einen Quellennamen/-Indexwert und einen Portnamen angeben"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "Sie müssen einen Sink-Eingabe-Indexwert und einen Sink angeben"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "Ungültiger Sink-Eingabe-Index"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "Sie müssen einen Senkennamen/-Indexwert und einen Portnamen angeben"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "Sie müssen einen Quellennamen/-Indexwert und einen Portnamen angeben"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "Sie müssen einen Sink-Eingabe-Indexwert und einen Sink angeben"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "Ungültige Sink-Eingabe-Index-Angaben"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "Kein gültiger Befehl angegeben."
 
@@ -2233,44 +2330,44 @@ msgstr "Laden der Cookie-Daten fehlgeschlagen\n"
 msgid "Not yet implemented.\n"
 msgstr "Noch nicht implementiert.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr "Es läuft kein PulseAudio-Dienst oder nicht als Sessiondienst."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "Terminieren des PulseAudio-Daemon fehlgeschlagen."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "Daemon antwortet nicht."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "Fehler beim Zugriff auf Autostart -Sperre."
 
@@ -2297,39 +2394,43 @@ msgid ""
 msgstr ""
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Aus"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "High Fidelity-Wiedergabe (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "High Fidelity-Aufnahme (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Telephony Duplex (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio Sound Server"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr ""
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 #, fuzzy
 msgid "Input Devices"
 msgstr "Eingang %s"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr ""
 
@@ -2395,154 +2496,179 @@ msgstr ""
 msgid "No Amplifier"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+msgid "Bass Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+msgid "No Bass Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "Analog Mono"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 #, fuzzy
 msgid "Analog Input"
 msgstr "Analog Mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 #, fuzzy
 msgid "Analog Microphone"
 msgstr "Analog Mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 #, fuzzy
 msgid "Analog Line-In"
 msgstr "Analog Mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 #, fuzzy
 msgid "Analog Radio"
 msgstr "Analog Mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 #, fuzzy
 msgid "Analog Video"
 msgstr "Analog Stereo"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 #, fuzzy
 msgid "Analog Output"
 msgstr "Ausgang %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 #, fuzzy
 msgid "Analog Headphones"
 msgstr "Analog Mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 #, fuzzy
 msgid "Analog Mono Output"
 msgstr "Analog Mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Analog Stereo"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, fuzzy, c-format
 msgid "%s+%s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, fuzzy, c-format
 msgid "%s / %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Analog Mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Analog Stereo"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 #, fuzzy
 msgid "Analog Surround 2.1"
 msgstr "Analog Surround 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 #, fuzzy
 msgid "Analog Surround 3.0"
 msgstr "Analog Surround 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 #, fuzzy
 msgid "Analog Surround 3.1"
 msgstr "Analog Surround 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Analog Surround 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Analog Surround 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Analog Surround 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Analog Surround 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 #, fuzzy
 msgid "Analog Surround 6.0"
 msgstr "Analog Surround 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 #, fuzzy
 msgid "Analog Surround 6.1"
 msgstr "Analog Surround 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 #, fuzzy
 msgid "Analog Surround 7.0"
 msgstr "Analog Surround 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Analog Surround 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Digital Stereo (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 #, fuzzy
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Digital Surround 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Digital Surround 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Digital Surround 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Digital Stereo (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 #, fuzzy
 msgid "Analog Mono Duplex"
 msgstr "Analog Mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 #, fuzzy
 msgid "Analog Stereo Duplex"
 msgstr "Analog Stereo"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 #, fuzzy
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Digital Stereo (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Niedrigfrequenzemitter"
+
 #~ msgid "Invalid client name '%s'\n"
 #~ msgstr "Ungültiger Client-Name '%s'\n"
 
@@ -2794,11 +2920,5 @@ msgstr "Digital Stereo (IEC958)"
 #~ "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 01334a4..de92385 100644
--- a/po/el.po
+++ b/po/el.po
@@ -1,13 +1,13 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
-# 
+#
 # Dimitris Glezos <dimitris at glezos.com>, 2008.
 # Thalia Papoutsaki <saliyath at gmail.com>, 2009.
 msgid ""
 msgstr ""
 "Project-Id-Version: el\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-01-15 06:45+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-10-26 17:15+0200\n"
 "Last-Translator: Thalia Papoutsaki <saliyath at gmail.com>\n"
 "Language-Team: Greek <fedora-trans-el at redhat.com>\n"
@@ -17,30 +17,36 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: KAider 0.1\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
-"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
+"ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
-"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
+"lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
-"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
 
 #: ../src/modules/module-always-sink.c:39
@@ -56,7 +62,12 @@ msgid "Virtual LADSPA sink"
 msgstr ""
 
 #: ../src/modules/module-ladspa-sink.c:53
-msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
+msgid ""
+"sink_name=<name for the sink> sink_properties=<properties for the sink> "
+"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
+"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
+"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
+"input control values>"
 msgstr ""
 
 #: ../src/modules/module-null-sink.c:55
@@ -67,11 +78,11 @@ msgstr ""
 msgid "Null Output"
 msgstr ""
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Εσωτερικός ήχος"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Modem"
 
@@ -87,283 +98,313 @@ msgstr ""
 msgid "Failed to add bind-now-loader."
 msgstr ""
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Έγινε λήψη σήματος %s."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Έξοδος."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Αποτυχία εύρεσης χρήστη '%s'."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Αποτυχία εύρεσης ομάδας χρηστών '%s'."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr ""
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr ""
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr ""
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr ""
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr ""
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr ""
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr ""
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr ""
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr ""
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:571
-msgid "This program is not intended to be run as root (unless --system is specified)."
+#: ../src/daemon/main.c:662
+msgid ""
+"This program is not intended to be run as root (unless --system is "
+"specified)."
 msgstr ""
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr ""
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr ""
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr ""
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr ""
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr ""
 
-#: ../src/daemon/main.c:627
+#: ../src/daemon/main.c:726
 #, c-format
-msgid "pipe failed: %s"
+msgid "pipe() failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr ""
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr ""
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "Αποτυχία σύνδεσης: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Αυτό είναι το PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr ""
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr ""
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr ""
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr ""
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, c-format
+msgid "Running in VM: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr ""
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr ""
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr ""
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr ""
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr ""
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr ""
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr ""
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr ""
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr ""
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr ""
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr ""
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
-"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
-"If you do it nonetheless then it's your own fault if things don't work as expected.\n"
-"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."
+"OK, so you are running PA in system mode. Please note that you most likely "
+"shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as "
+"expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
+"explanation why system mode is usually a bad idea."
 msgstr ""
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr ""
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr ""
 
-#: ../src/daemon/main.c:821
-msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
-msgstr "Δικέ μου, ο πυρήνας σου είναι για τα μπάζα! Η πρόταση του σεφ σήμερα είναι Linux με ενεργοποιημένα τα high-resolution timers!"
+#: ../src/daemon/main.c:922
+msgid ""
+"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
+"resolution timers enabled!"
+msgstr ""
+"Δικέ μου, ο πυρήνας σου είναι για τα μπάζα! Η πρόταση του σεφ σήμερα είναι "
+"Linux με ενεργοποιημένα τα high-resolution timers!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr ""
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr ""
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr ""
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr ""
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr ""
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr ""
 
@@ -378,37 +419,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"
@@ -419,10 +471,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"
@@ -437,7 +491,9 @@ msgid "--fail expects boolean argument"
 msgstr ""
 
 #: ../src/daemon/cmdline.c:264
-msgid "--log-level expects log level argument (either numeric in range 0..4 or one of 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 ""
 
 #: ../src/daemon/cmdline.c:276
@@ -534,76 +590,83 @@ msgstr ""
 msgid "Path: %s\n"
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:562
-msgid "The specified default channel map has a different number of channels than the specified default number of channels."
+#: ../src/daemon/daemon-conf.c:602
+msgid ""
+"The specified default channel map has a different number of channels than "
+"the specified default number of channels."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr ""
@@ -649,7 +712,7 @@ msgid "Rear Right"
 msgstr ""
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
+msgid "Subwoofer"
 msgstr ""
 
 #: ../src/pulse/channelmap.c:117
@@ -995,190 +1058,190 @@ msgstr ""
 msgid "Failed to parse cookie data"
 msgstr ""
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr ""
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr ""
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, fuzzy, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, fuzzy, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr ""
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, fuzzy, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Αποτυχία εύρεσης χρήστη '%s'."
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr ""
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr ""
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr ""
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr ""
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr ""
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr ""
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr ""
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr ""
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Αποτυχία σύνδεσης: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr ""
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr ""
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, fuzzy, c-format
 msgid "Failed to get latency: %s"
 msgstr "Αποτυχία εύρεσης χρήστη '%s'."
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr ""
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:609
+#: ../src/utils/pacat.c:630
 #, c-format
 msgid ""
 "%s [options]\n"
@@ -1191,35 +1254,58 @@ 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, s24le, s24be,\n"
-"                                        s24-32le, s24-32be (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, "
+"s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to "
+"s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, "
+"2 for stereo\n"
 "                                        (defaults to 2)\n"
-"      --channel-map=CHANNELMAP          Channel map to use instead of the default\n"
-"      --fix-format                      Take the sample format from the sink 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"
-"      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
+"      --no-remap                        Map channels by index instead of "
+"name.\n"
+"      --latency=BYTES                   Request the specified latency in "
+"bytes.\n"
+"      --process-time=BYTES              Request the specified process time "
+"per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the "
+"specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1227,177 +1313,181 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr ""
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr ""
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr ""
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr ""
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr ""
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr ""
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr ""
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr ""
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr ""
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr ""
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr ""
 
-#: ../src/utils/pacat.c:959
-msgid "Warning: specified sample specification will be overwritten with specification from file."
+#: ../src/utils/pacat.c:1000
+msgid ""
+"Warning: specified sample specification will be overwritten with "
+"specification from file."
 msgstr ""
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr ""
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr ""
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr ""
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr ""
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr ""
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr ""
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr ""
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr ""
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr ""
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr ""
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr ""
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, fuzzy, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, fuzzy, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
-"  -s, --server=SERVER                   The name of the server to connect to\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
 "\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1405,50 +1495,61 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, fuzzy, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Αποτυχία εύρεσης χρήστη '%s'."
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, fuzzy, c-format
 msgid "Failed to get server information: %s"
 msgstr "Αποτυχία εύρεσης χρήστη '%s'."
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1456,15 +1557,15 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, fuzzy, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Αποτυχία εύρεσης χρήστη '%s'."
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1486,22 +1587,22 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, fuzzy, c-format
 msgid "Failed to get source information: %s"
 msgstr "Αποτυχία εύρεσης χρήστη '%s'."
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1523,20 +1624,20 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr ""
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, fuzzy, c-format
 msgid "Failed to get module information: %s"
 msgstr "Αποτυχία εύρεσης χρήστη '%s'."
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1547,12 +1648,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, fuzzy, c-format
 msgid "Failed to get client information: %s"
 msgstr "Αποτυχία εύρεσης χρήστη '%s'."
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1562,12 +1663,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, fuzzy, c-format
 msgid "Failed to get card information: %s"
 msgstr "Αποτυχία εύρεσης χρήστη '%s'."
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1578,22 +1679,22 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, fuzzy, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Αποτυχία εύρεσης χρήστη '%s'."
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1614,12 +1715,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, fuzzy, c-format
 msgid "Failed to get source output information: %s"
 msgstr "Αποτυχία εύρεσης χρήστη '%s'."
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1636,12 +1737,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, fuzzy, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Αποτυχία εύρεσης χρήστη '%s'."
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1659,25 +1760,78 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Αποτυχία: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, fuzzy, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Αποτυχία εύρεσης χρήστη '%s'."
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr ""
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+msgid "server"
+msgstr ""
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr ""
 
-#: ../src/utils/pactl.c:869
+#: ../src/utils/pactl.c:961
 #, c-format
 msgid ""
 "%s [options] stat\n"
@@ -1701,15 +1855,18 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\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:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1717,101 +1874,104 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr ""
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Αποτυχία ανοίγματος αρχείου ήχου."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr ""
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr ""
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr ""
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr ""
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr ""
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr ""
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr ""
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 
-#: ../src/utils/pactl.c:1103
-msgid "You may not specify more than one source. You have to specify a boolean value."
+#: ../src/utils/pactl.c:1196
+msgid ""
+"You may not specify more than one source. You have to specify a boolean "
+"value."
 msgstr ""
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr ""
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr ""
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr ""
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr ""
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr ""
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr ""
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr ""
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr ""
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr ""
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr ""
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr ""
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr ""
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr ""
 
@@ -1822,7 +1982,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 ""
 
@@ -1886,96 +2047,106 @@ msgstr ""
 msgid "Not yet implemented.\n"
 msgstr ""
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr ""
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "σύνδεση(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr ""
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr ""
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr ""
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr ""
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr ""
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr ""
 
 #: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
 #, c-format
 msgid ""
-"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
-"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
+"ALSA woke us up to write new data to the device, but there was actually "
+"nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
 msgstr ""
 
 #: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
 #, c-format
 msgid ""
-"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
-"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
+"ALSA woke us up to read new data from the device, but there was actually "
+"nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
 msgstr ""
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr ""
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr ""
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr ""
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr ""
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr ""
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr ""
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr ""
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr ""
 
@@ -2039,132 +2210,153 @@ msgstr ""
 msgid "No Amplifier"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+msgid "Bass Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+msgid "No Bass Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+msgid "Headphones"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "Analog Radio"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "Analog Video"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "Analog Output (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "Analog Mono Output"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Analog Stereo"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Analog Mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Analog Stereo"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "Analog Surround 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "Analog Surround 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "Analog Surround 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Analog Surround 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Analog Surround 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Analog Surround 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Analog Surround 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "Analog Surround 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "Analog Surround 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "Analog Surround 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Analog Surround 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Digital Stereo (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Digital Surround 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Digital Surround 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Digital Surround 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Digital Stereo (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "Analog Mono Duplex"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "Analog Stereo Duplex"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Digital Stereo Duplex (IEC958)"
diff --git a/po/es.po b/po/es.po
index 48a4f13..84c67f0 100644
--- a/po/es.po
+++ b/po/es.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PulseAudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-04 16:37+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-10-04 21:16+0200\n"
 "Last-Translator: Fernando Gonzalez Blanco <fgonz at fedoraproject.org>\n"
 "Language-Team: Spanish <fedora-trans-es at redhat.com>\n"
@@ -19,12 +19,12 @@ msgstr ""
 "X-Poedit-Language: Spanish\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -37,7 +37,7 @@ msgstr ""
 "Lo más probable es que sea un error del controlador ALSA '%s'. Por favor, "
 "informe ésto a los desarrolladores de ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -50,7 +50,7 @@ msgstr ""
 "Lo más probable es que sea un error del controlador ALSA '%s'. Por favor, "
 "informe ésto a los desarrolladores de ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -98,11 +98,11 @@ msgstr "Sumidero nulo sincronizado"
 msgid "Null Output"
 msgstr "Salida Nula"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Audio Interno"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Módem"
 
@@ -118,92 +118,98 @@ msgstr "Falló al asignar el cargador dl nuevo."
 msgid "Failed to add bind-now-loader."
 msgstr "Falló al agregar bind-now-loader."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Se obtuvo la señal %s."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Saliendo."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Falló al buscar usuario '%s'."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Falló al buscar grupo '%s'."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Se encontró el usuario '%s' (UID %lu) y el grupo '%s' (GID %lu)."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "GID del usuario '%s' y del grupo '%s' no son similares."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "El directorio de inicio del usuario '%s' no es '%s', ignorando."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Falló al crear '%s': %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "Falló al cambiar la lista de grupo: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "Falló al cambiar GID: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "Falló al cambiar UID: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "Se han liberado con éxitos los privilegios de root."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "El modo a nivel de sistema no es soportado en esta plataforma."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) falló: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "Falló al analizar la línea de comando."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "El demonio no está funcionando"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "El demonio está funcionando como PID %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "No se ha podido detener el demonio: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -211,160 +217,175 @@ msgstr ""
 "Este programa no tiene por qué ser ejecutado como root (a menos que --system "
 "sea especificado)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Se necesitan privilegios de root."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start no está soportado para las instancias del sistema."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 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:586
+#: ../src/daemon/main.c:686
 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:589
+#: ../src/daemon/main.c:689
 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:594
+#: ../src/daemon/main.c:694
 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:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "Fallo al intentar adquirir stdio."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "Falló el pipe: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "Falló el fork(): %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "Falló la operación read(): %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "Falló el inicio del demonio. "
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "El demonio se inició exitosamente."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "Falló la operación read(): %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Esto es PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Host de compilación: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "Compilación CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "Ejecutándose en el host: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "Se encontraron %u CPUs."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "El tamaño de la página es de %lu bytes"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Soporte para compilar con Valgrind: si"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Soporte para compilar con Valgrind: no"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Ejecutándose en modo valgrind: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "Ejecutándose en el host: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Build optimizado: si"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Build optimizado: no"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG definido, todos los chequeos deshabilitados."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH definido, sólo se deshabilitan los chequeos fast path."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "Todos los chequeos habilitados."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "Fallo al intentar obtener el ID de la máquina"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "El ID de la máquina es %s"
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "El ID de la sesión es %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Utilizando directorio de tiempo de ejecución %s."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "Utilizando directorio de estado %s."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "Utilizando directorio de módulos %s."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Ejecutándose en modo de sistema: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -381,17 +402,17 @@ msgstr ""
 "obtener una explicación acerca de por qué es una mala idea utilizar el  modo "
 "sistema."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "Ha fallado pa_pid_file_create()."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 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:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -399,29 +420,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:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "Falló pa_core_new()."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "Fallo al intentar iniciar el demonio."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 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:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "El demonio se inició completamente."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "Comienza a apagarse el demonio."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "El demonio se ha apagado."
 
@@ -688,72 +709,77 @@ msgstr "ADVERTENCIA DE COMPATIBILIDAD: %s\n"
 msgid "Path: %s\n"
 msgstr "Ruta: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Destino de log inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Nivel de log inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Método de remuestreo inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] Rlimit inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] Rlimit no soportado en esta plataforma."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Formato de muestra inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Tasa de muestra inválida '%s'."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Canales de muestra inválidos '%s'."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Mapa de canal inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Cantidad de fragmentoa inválidos '%s'."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Tamaño inválido de fragmento '%s'."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Nivel de nice inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Tasa de muestra inválida '%s'."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "No se pudo abrir el archivo de configuración: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -761,7 +787,7 @@ msgstr ""
 "El mapa de canal predeterminado especificado tiene un número de canales "
 "distinto al especificado como predeterminado."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Leyendo desde el archivo de confioguración: %s ###\n"
@@ -807,8 +833,8 @@ msgid "Rear Right"
 msgstr "POsterior derecho"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Emisor de baja frecuencia"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1153,191 +1179,191 @@ msgstr "XOpenDisplay() falló"
 msgid "Failed to parse cookie data"
 msgstr "Fallo al analizar los datos de la cookie"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Fallo al abrir el archivo de configuración '%s': %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "No se ha cargado ninguna cookie. Intentando conectar de todos modos."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(:) %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "Se ha recibido un mensaje para una extensión desconocida '%s'"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Falló al drenar el flujo: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "El flujo de reproducción ha sido drenado."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "Drenando conexión con el servidor."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() falló: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_write() falló: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() falló: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Se ha creado exitosamente el flujo (stream)."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() falló: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Métrica del búfer: maxlenght=%u, tlenghth=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Métrica del búfer: maxlenght=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "Utilizando especificaciones de muestra '%s', mapa del canal '%s'."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Conectado al dispositivo %s (%u, %ssuspended)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "Error de flujo: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Dispositivo de flujo suspendido.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "Dispositivo de flujo reestablecido.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "Flujo agotado.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "Flujo saturado.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "Flujo iniciado.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Fujo trasladado al dispositivo %s (%u, %ssuspended).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "no"
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Los atributos del búfer de flujo han cambiado.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "Conexión establecida.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() falló: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() falló: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() falló: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Error en la conexión: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "Se tiene EOF."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() falló: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "Hay señal, saliendo (exiting)."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "No se pudo obtener latencia: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Tiempo: %0.3f seg; Latencia: %0.0f useg."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() falló: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1389,10 +1415,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [opciones]\n"
@@ -1454,7 +1484,7 @@ msgstr ""
 "      --list-file-formats               Muestra una lista con los formatos "
 "de archivo disponibles.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1465,68 +1495,68 @@ msgstr ""
 "Compilado con libpulse %s\n"
 "Linkeado con libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Nombre de cliente '%s' inválido"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Nombre de flujo '%s' inválido"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Mapa de canales '%s' inválido"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Especificación de latencia '%s' inválida"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Especificación de tiempo de proceso '%s' inválida"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Propiedad '%s' inválida"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Formato de archivo desconocido %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Especificación de muestra inválida"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open() %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Demasiados argumentos."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "Falló al generar especificación de ejemplo para el archivo."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "Falló al abrir el archivo de sonido."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
@@ -1534,23 +1564,23 @@ msgstr ""
 "Aviso: el ejemplo de especificación indicado será sobreescrito con las "
 "especificaciones del archivo."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "Falló al determinar especificación de ejemplo del archivo."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "Aviso: Falló al determinar el mapeo del canal desde el archivo."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "El mapa del canal no se corresponde con la especificación de muestra"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "Aviso: Faló al escribir el mapeo del canal en el archivo."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
 msgid ""
 "Opening a %s stream with sample specification '%s' and channel map '%s'."
@@ -1558,80 +1588,80 @@ msgstr ""
 "Abriendo un flujo %s con especificación de muestra '%s' y mapeo de canal '%"
 "s'."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "grabando"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "playback"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() falló."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() falló."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() falló."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() falló: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() falló."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() falló."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "Error al suspender: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "Error al continuar: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 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:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Error en la conexión: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "Hay SIGINT, saliendo.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "AVISO: El proceso niño terminado por la señal %u\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1650,7 +1680,7 @@ msgstr ""
 "conectarse\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1661,52 +1691,63 @@ msgstr ""
 "Compilado con libpulse %s\n"
 "Linkeado con libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() falló.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() falló.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() falló.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Error al intentar obtener estadísticas: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "Actualmente en uso: %u bloques conteniendo %s bytes en total.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr ""
 "Ubicados durante a lo largo del tiempo: %u bloques conteniendo %s bytes en "
 "total.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Tamaño del cache de muestra: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "Error al intentar obtener información del servidor: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1714,7 +1755,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Nombre de usuario: %s\n"
 "Nombre del equipo: %s\n"
@@ -1726,12 +1767,12 @@ msgstr ""
 "Fuente por defecto: %s\n"
 "Cookie: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Error al intentar obtener información del sumidero: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1770,22 +1811,22 @@ msgstr ""
 "\tPropiedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tPuertos:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tPuerto Activo: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "Error al intentar obtener información de la fuente: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1824,20 +1865,20 @@ msgstr ""
 "\tPropiedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n/a"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "Error al intentar obtener información del módulo: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1854,12 +1895,12 @@ msgstr ""
 "\tPropiedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "Error al intentar obtener información del cliente: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1874,12 +1915,12 @@ msgstr ""
 "\tPropiedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "Fallo al obtener la información de la placa: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1896,22 +1937,22 @@ msgstr ""
 "\tPropiedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tPerfiles:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tPerfil Activo: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Error al intentar obtener información de entrada del sumidero: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1948,12 +1989,12 @@ msgstr ""
 "\tPropiedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "Falló al obtener información de salida de la fuente: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1982,12 +2023,12 @@ msgstr ""
 "\tPropiedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Falló al obtener información de la muestra: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -2018,26 +2059,81 @@ msgstr ""
 "\tPropiedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Falla: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Falló al subir muestra: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "Fin de archivo prematuro"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr "destino"
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr "fuente"
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+#, fuzzy
+msgid "source-output"
+msgstr "fuente"
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Servidor inválido"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "Hay un SIGINT, saliendo."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2060,6 +2156,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2099,7 +2196,7 @@ msgstr ""
 "  -n, --client-name=NAME                El nombre de este cliente en el "
 "servidor\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2110,52 +2207,52 @@ msgstr ""
 "Compilado con libpulse %s\n"
 "Linked con libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Por favor, especifique un archivo de muestra a cargar"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Error al intentar abrir el archivo de sonido."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr ""
 "Aviso: Falló al intentar determinar especificación de la muestra desde el "
 "archivo."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "Debe especificar un nombre de muestra para reproducir"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "Debe especificar un nombre de muestra a eliminar"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "Debe especificar un índice para la entrada al sumidero y un sumidero"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "Debe especificar un índice para las salida de la fuente y una fuente"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "Debe especificar un nombre de módulo y los argumentos."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "Debe especificar un índice de módulo"
 
-#: ../src/utils/pactl.c:1090
+#: ../src/utils/pactl.c:1183
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 "No puede especificar más de un sumidero. Tiene que especificar un valor "
 "booleano."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
@@ -2163,58 +2260,58 @@ msgstr ""
 "No puede especificar más de una fuente. Tiene que especificar un valor "
 "booleano."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "Debe especificar un nombre/índice de placa y un nombre de perfil"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "Debe especificar un nombre/índice de sumidero y un nombre de puerto"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "Debe especificar un nombre/índice de fuente y un nombre de puerto"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "Debe especificar un nombre/índice de sumidero y el volumen"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "Especificación de volumen inválida"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "Debe especificar un nombre/índice de fuente y un volumen"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "Debe especificar un índice de sumidero y un volumen"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "Indice de entrada a sumidero inválido"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "Debe especificar un nombre/índice de sumidero y un booleano para mudo"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "Debe especificar un nombre/índice de fuente y un booleano para mudo"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr ""
 "Debe especificar un índice de entrada a sumidero y un booleano para mudo"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "Especificación de índice de entrada a sumidero inválida"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "No se ha especificado ningún comando válido."
 
@@ -2298,46 +2395,46 @@ msgstr "Error al cargar datos de cookie\n"
 msgid "Not yet implemented.\n"
 msgstr "Aún no se ha implementado.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
 "El demonio PulseAudio no está ejecutándose, o no se está ejecutando como un "
 "demonio de sesión."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "Error al intentar detener el demonio de PulseAudio."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "El demonio no responde."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "No se puede acceder al candado de autogeneración."
 
@@ -2376,38 +2473,42 @@ msgstr ""
 "() devolvió 0 u otro valor < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Apagado"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "Reproducción de Alta Fidelidad (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "Captura de Alta Fidelidad (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Telefonía Duplex (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "Servidor de Sonido PulseAudio"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "Dispositivos de salida"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "Dispositivos de entrada"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "Audio en @HOSTNAME@"
 
@@ -2471,136 +2572,163 @@ msgstr "Amplificador"
 msgid "No Amplifier"
 msgstr "Sin amplificador"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "Incremento de ganancia"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "Sin incremento de ganancia"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "Auriculares analógicos"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "Entrada analógica"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "Micrófono analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "Entrada en línea analógica"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "Radio analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "Vídeo analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "Salida analógica"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "Auriculares analógicos"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "Salida analógica (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "Salida Mono analógica "
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Estéreo Analógico"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Mono Analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Estéreo Analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "Análogico Envolvente 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "Análogico Envolvente 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "Análogico Envolvente 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Análogo Envolvente 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Análogo Envolvente 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Análogo Envolvente 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Análogo Envolvente 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "Análogico Envolvente 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "Análogico Envolvente 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "Análogico Envolvente 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Análogo Envolvénte 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Estéreo Digital (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Digital Envolvente 4.0 (IEC9588)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Digital Envolvente 4.0 (IEC9588/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Digital Envolvente 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Estéreo Digital (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "Mono Analógico.Duplex"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "Estéreo Analógico.Duplex"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Estéreo Digital Duplex(IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Emisor de baja frecuencia"
+
 #~ msgid "Invalid client name '%s'\n"
 #~ msgstr "Nombre de cliente inválido '%s'\n"
 
@@ -2875,9 +3003,3 @@ msgstr "Estéreo Digital Duplex(IEC958)"
 #~ "Tipo: %s\n"
 #~ "Módulo: %s\n"
 #~ "Argumento: %s\n"
-
-#~ msgid "sink"
-#~ msgstr "destino"
-
-#~ msgid "source"
-#~ msgstr "fuente"
diff --git a/po/fi.po b/po/fi.po
index 00bfda9..fcdfa2a 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-12-23 17:25+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-12-23 23:45+0200\n"
 "Last-Translator: Ville-Pekka Vainio <vpivaini at cs.helsinki.fi>\n"
 "Language-Team: Finnish <laatu at lokalisointi.org>\n"
@@ -16,12 +16,12 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -33,7 +33,7 @@ msgstr ""
 "Tämä on todennäköisesti ohjelmavirhe ALSA-ajurissa ”%s”. Ilmoita tästä "
 "ongelmasta ALSA-kehittäjille."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -46,7 +46,7 @@ msgstr ""
 "Tämä on todennäköisesti ohjelmavirhe ALSA-ajurissa ”%s”. Ilmoita tästä "
 "ongelmasta ALSA-kehittäjille."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -94,11 +94,11 @@ msgstr "Kellotettu tyhjä nielu"
 msgid "Null Output"
 msgstr "Tyhjä ulostulo"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Sisäinen äänentoisto"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Modeemi"
 
@@ -114,92 +114,98 @@ msgstr "Uuden dl-lataaminen varaaminen epäonnistui."
 msgid "Failed to add bind-now-loader."
 msgstr "bind-now-loaderin lisääminen epäonnistui."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Saatiin signaali %s."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Poistutaan."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Käyttäjää ”%s” ei löydetty."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Ryhmää ”%s” ei löydetty."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Löydettiin käyttäjä ”%s” (UID %lu) ja ryhmä ”%s” (GID %lu)."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "Käyttäjän ”%s” ja ryhmän ”%s” GID:t eivät vastaa toisiaan."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "Käyttäjän ”%s” kotihakemisto ei ole ”%s”, ohitetaan."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Hakemiston ”%s” luominen epäonnistui: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "Ryhmäluettelon vaihtaminen epäonnistui: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "GID:n vaihtaminen epäonnistui: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "UID:n vaihtaminen epäonnistui: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "Root-oikeuksista luopuminen onnistui."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "Järjestelmänlaajuista tilaa ei tueta tällä alustalla."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) epäonnistui: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "Komentorivin jäsentäminen epäonnistui."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "Taustaprosessi ei ole käynnissä"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Taustaprosessi käynnissä prosessitunnisteella %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Taustaprosessin lopettaminen epäonnistui: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -207,161 +213,176 @@ msgstr ""
 "Tätä ohjelmaa ei ole tarkoitettu suoritettavaksi pääkäyttäjänä (ellei --"
 "system ole määritelty)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Pääkäyttäjän (root) oikeudet vaaditaan."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start-valitsinta ei tueta järjestelmätilassa."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr ""
 "Suoritetaan järjestelmätilassa, mutta --disallow-exit ei ole asetettuna!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 "Suoritetaan järjestelmätilassa, mutta -disallow-module-loading ei ole "
 "asetettuna!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 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:594
+#: ../src/daemon/main.c:694
 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:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "stdio:n saaminen epäonnistui."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "putki epäonnistui: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() epäonnistui: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() epäonnistui: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "Taustaprosessin käynnistys epäonnistui."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "Taustaprosessin käynnistys onnistui."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() epäonnistui: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Tämä on PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Käännöksen isäntäkone: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "Käännösaikaiset C-liput (CFLAGS): %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "Käynnissä isäntäkoneella: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "Löydettiin %u CPU:ta."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "Sivun koko on %lu tavua"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Käännetty Valgrind-tuella: kyllä"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Käännetty Valgrind-tuella: ei"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Käynnissä valgrind-tilassa: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "Käynnissä isäntäkoneella: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Optimoitu rakentaminen: kyllä"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Optimoitu rakentaminen: ei"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG on määritelty, kaikki assertit ovat poissa käytöstä."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH on määritelty, vain fast path -assertit ovat poissa käytöstä."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "Kaikki assertit ovat käytössä."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "Konetunnisteen nouto epäonnistui"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "Konetunniste on %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "Istunnon tunniste on %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Käytetään ajonaikaista hakemistoa %s."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "Käytetään tilahakemistoa %s."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "Käytetään moduulihakemistoa %s."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Suoritetaan järjestelmätilassa: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -375,15 +396,15 @@ msgstr ""
 "Lisätietoja siitä, miksi järjestelmätilan käyttäminen on yleensä huono "
 "ajatus on osoitteessa http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode"
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() epäonnistui."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Korkean tarkkuuden ajastimet käytettävissä."
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -391,29 +412,29 @@ msgstr ""
 "Hei, ytimesi on kehno! Linux korkean tarkkuuden ajastimien tuella on hyvin "
 "suositeltava!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() epäonnistui."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "Taustaprosessin alustus epäonnistui."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 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:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "Taustaprosessin käynnistys valmis."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "Taustaprosessin sulkeminen käynnistetty."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "Taustaprosessi lopetettu."
 
@@ -684,72 +705,77 @@ msgstr "VAROITUS VANHENTUNEISUUDESTA: %s\n"
 msgid "Path: %s\n"
 msgstr "Polku: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Virheellinen lokikirjoituksen kohde ”%s”."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Virheellinen lokikirjoituksen taso ”%s”."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Virheellinen uudelleennäytteistyksen tapa ”%s”."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] Virheellinen rlimit ”%s”."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimitiä ei tueta tällä alustalla."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Virheellinen näytemuoto ”%s”."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Virheellinen näytteenottotaajuus ”%s”."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Virheelliset näytekanavat ”%s”."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Virheellinen kanavakartta ”%s”."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Virheellinen fragmenttimäärä ”%s”."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Virheellinen fragmenttikoko ”%s”."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Virheellinen nice-taso ”%s”."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Virheellinen näytteenottotaajuus ”%s”."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Asetustiedoston avaaminen epäonnistui: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -757,7 +783,7 @@ msgstr ""
 "Kanavien oletusmäärä ja oletuskanavakartan kanavien määrä poikkeavat "
 "toisistaan."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Luettu asetustiedostosta: %s ###\n"
@@ -803,8 +829,8 @@ msgid "Rear Right"
 msgstr "Oikea taka"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Alataajuus"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1149,191 +1175,191 @@ msgstr "XOpenDisplay() epäonnistui"
 msgid "Failed to parse cookie data"
 msgstr "Evästetietojen jäsennys epäonnistui"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Asetustiedoston avaaminen epäonnistui: ”%s”: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Ei ladattua evästettä. Yritetään yhdistämistä ilman."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "Saatiin viesti tuntemattomalle laajennokselle ”%s”"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Virran tyhjentäminen epäonnistui: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "Toistovirta on tyhjennetty."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "Tyhjennetään yhteyttä palvelimelle."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() epäonnistui: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_write() epäonnistui: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() epäonnistui: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Virran luonti onnistui."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() epäonnistui: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Puskuritiedot: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Puskuritiedot: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "Käytetään näytemäärittelyä ”%s”, kanavakarttaa ”%s”."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Yhdistetty laitteeseen %s (%u, %ssuspended)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "Virtavirhe: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Virtalaite keskeytetty.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "Virtalaite palautettu.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "Virran alivuoto.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "Virran ylivuoto.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "Virta käynnistetty.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Virta siirretty laitteelle %s (%u, %ssuspended).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "ei "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Virran puskuriattribuutteja muutettu.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "Yhteys muodostettu.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() epäonnistui: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() epäonnistui: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() epäonnistui: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Yhteysvirhe: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "Saatiin EOF."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() epäonnistui: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "Saatiin signaali, lopetetaan."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "Latenssin selvittäminen epäonnistui: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Aika: %0.3f s; Latenssi: %0.0f μs."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() epäonnistui: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1385,10 +1411,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [valitsimet]\n"
@@ -1444,7 +1474,7 @@ msgstr ""
 "      --list-file-formats               Luettele käytettävissä olevat "
 "tiedostomuodot.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1455,170 +1485,170 @@ msgstr ""
 "Käännetty libpulsen versiolle %s\n"
 "Linkitetty libpulsen versiolle %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Virheellinen asiakasohjelman nimi ”%s”"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Virheellinen virran nimi ”%s”"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Virheellinen kanavakartta ”%s”"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Virheellinen latenssimääritys ”%s”"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Virheellinen prosessiajan määritys ”%s”"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Virheellinen asetus ”%s”"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Tuntematon tiedostomuoto %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Virheellinen näytemääritys"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Liian monta argumenttia."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "Näytemäärityksen generointi tiedostolle epäonnistui."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "Äänitiedoston avaaminen epäonnistui."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
 msgstr ""
 "Varoitus: tiedostosta luettava näytemääritys korvaa annetun määrityksen."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "Näytemäärityksen selvittäminen tiedostosta epäonnistui."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "Varoitus: Kanavakartan selvittäminen tiedostosta epäonnistui."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "Kanavakartta ei vastaa näytemääritystä"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "Varoitus: kanavakartan kirjoittaminen tiedostoon epäonnistui."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
 msgid ""
 "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "Avataan %svirta näytemäärityksellä ”%s” ja kanavakartalla ”%s”."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "nauhoitus"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "toisto"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() epäonnistui."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() epäonnistui."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() epäonnistui."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() epäonnistui: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_new() epäonnistui."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() epäonnistui."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "Keskeytys epäonnistui: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "Palautus epäonnistui: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "VAROITUS: Äänipalvelin ei ole paikallinen, ei keskeytetä.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Yhteysvirhe: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "Saatiin SIGINT, lopetetaan.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "VAROITUS: Lapsiprosessi lopetettiin signaalilla %u\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1637,7 +1667,7 @@ msgstr ""
 "                                        yhdistetään\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1648,50 +1678,61 @@ msgstr ""
 "Käännetty libpulsen versiolle %s\n"
 "Linkitetty libpulsen versiolle %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() epäonnistui.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() epäonnistui.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() epäonnistui.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Tilastojen selvittäminen epäonnistui: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "Nyt käytössä: %u lohkoa sisältäen yhteensä %s tavua.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "Koko käyttöaikana varattu: %u lohkoa sisältäen yhteensä %s tavua.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Näytevälimuistin koko: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "Palvelintietojen selvittäminen epäonnistui: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1699,7 +1740,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Käyttäjänimi: %s\n"
 "Konenimi: %s\n"
@@ -1711,12 +1752,12 @@ msgstr ""
 "Oletuslähde: %s\n"
 "Eväste: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Nielun tietojen nouto epäonnistui: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1755,22 +1796,22 @@ msgstr ""
 "\tOminaisuudet:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tPortit:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tAktiivinen portti: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "Lähteen tietojen nouto epäonnistui: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1809,20 +1850,20 @@ msgstr ""
 "\tOminaisuudet:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "-"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "Moduulin tietojen nouto epäonnistui: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1839,12 +1880,12 @@ msgstr ""
 "\tOminaisuudet:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "Asiakkaan tietojen nouto epäonnistui: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1859,12 +1900,12 @@ msgstr ""
 "\tOminaisuudet:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "Kortin tietojen nouto epäonnistui: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1881,22 +1922,22 @@ msgstr ""
 "\tOminaisuudet:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tProfiilit:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tAktiivinen profiili: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Nielun sisääntulon tietojen nouto epäonnistui: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1933,12 +1974,12 @@ msgstr ""
 "\tOminaisuudet:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "Lähteen ulostulon tietojen nouto epäonnistui: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1967,12 +2008,12 @@ msgstr ""
 "\tOminaisuudet:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Näytetietojen nouto epäonnistui: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -2003,26 +2044,81 @@ msgstr ""
 "\tOminaisuudet:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Epäonnistuminen: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Näytteen lähettäminen epäonnistui: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "Ennenaikainen tiedoston päättyminen"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr "nielu"
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr "lähde"
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+#, fuzzy
+msgid "source-output"
+msgstr "lähde"
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Virheellinen palvelin"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "Saatiin SIGINT, lopetetaan."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2045,6 +2141,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2084,7 +2181,7 @@ msgstr ""
 "  -n, --client-name=NIMI                Kuinka tätä asiakasohjelmaa "
 "kutsutaan palvelimella\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2095,104 +2192,104 @@ msgstr ""
 "Käännetty libpulsen versiolle %s\n"
 "Linkitetty libpulsen versiolle %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Anna ladattava näytetiedosto"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Äänitiedoston avaaminen epäonnistui."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "Varoitus: näytemäärityksen selvitys tiedostosta epäonnistui."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "Soitettavan näytteen nimi on annettava"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "Poistettavan näytteen nimi on annettava"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "Nielun syöteindeksi ja nielu on annettava"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "Lähteen ulostuloindeksi ja lähde on annettava"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "Moduulin nimi ja argumentit on annettava."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "Moduulin indeksi on annettava"
 
-#: ../src/utils/pactl.c:1090
+#: ../src/utils/pactl.c:1183
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr "Ei voi antaa enempää kuin yhden nielun. Totuusarvo on annettava."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
 msgstr "Ei voi antaa enempää kuin yhden lähteen. Totuusarvo on annettava."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "Kortin nimi/indeksi ja profiilin nimi on annettava"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "Nielun nimi/indeksi ja portin nimi on annettava"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "Lähteen nimi/indeksi ja portin nimi on annettava"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "Nielun nimi/indeksi ja portin nimi on annettava"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "Virheellinen äänenvoimakkuuden määritys"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "Lähteen nimi/indeksi ja äänenvoimakkuus on annettava"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "Nielun syöteindeksi ja äänenvoimakkuus on annettava"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "Virheellinen nielun syöteindeksi"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "Nielun nimi/indeksi ja vaimennuksen totuusarvo on annettava"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "Lähteen nimi/indeksi ja vaimennuksen totuusarvo on annettava"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "Nielun syöteindeksi ja vaimennuksen totuusarvo on annettava"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "Virheellinen nielun syöteindeksin määritys"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "Mitään kelvollista komentoa ei annettu."
 
@@ -2277,46 +2374,46 @@ msgstr "Evästetietojen lataaminen epäonnistui\n"
 msgid "Not yet implemented.\n"
 msgstr "Toteutusta ei vielä ole.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
 "PulseAudio-taustaprosessi ei ole käynnissä eikä PulseAudiota suoriteta "
 "istunnon taustaprosessina."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "PulseAudio-taustaprosessin lopettaminen epäonnistui."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "Taustaprosessi ei vastaa."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "Automaattisen käynnistyksen lukkoa ei voida käyttää."
 
@@ -2354,38 +2451,42 @@ msgstr ""
 "snd_pcm_avail() palautti kuitenkin 0 tai jonkin muun arvon, on < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Poissa"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "Korkean äänenlaadun toisto (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "Korkean äänenlaadun tallennus (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Puhelut, molemmat suunnat (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio-äänipalvelin"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "Ulostulolaitteet"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "Sisääntulolaitteet"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "Ääni koneella @HOSTNAME@"
 
@@ -2449,136 +2550,163 @@ msgstr "Vahvistin"
 msgid "No Amplifier"
 msgstr "Ei vahvistinta"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "Vahvistus"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "Ei vahvistusta"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "Analoginen kuulokeliitäntä"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "Analoginen sisääntulo"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "Analoginen mikrofoni"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "Analoginen linjasisääntulo"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "Analoginen radio"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "Analoginen video"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "Analoginen ulostulo"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "Analoginen kuulokeliitäntä"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "Analoginen ulostulo (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "Analoginen monoulostulo"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Analoginen stereo"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Analoginen mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Analoginen stereo"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "Analoginen tilaääni 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "Analoginen tilaääni 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "Analoginen tilaääni 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Analoginen tilaääni 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Analoginen tilaääni 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Analoginen tilaääni 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Analoginen tilaääni 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "Analoginen tilaääni 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "Analoginen tilaääni 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "Analoginen tilaääni 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Analoginen tilaääni 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Digitaalinen stereo (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Digitaalinen tilaääni 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Digitaalinen tilaääni 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Digitaalinen tilaääni 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Digitaalinen stereo (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "Analoginen mono, molemmat suunnat"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "Analoginen stereo, molemmat suunnat"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Digitaalinen stereo, molemmat suunnat (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Alataajuus"
+
 #~ msgid "Invalid client name '%s'\n"
 #~ msgstr "Virheellinen asiakasohjelman nimi ”%s”\n"
 
@@ -2807,9 +2935,3 @@ msgstr "Digitaalinen stereo, molemmat suunnat (IEC958)"
 #~ "Tyyppi: %s\n"
 #~ "Moduuli: %s\n"
 #~ "Argumentto: %s\n"
-
-#~ msgid "sink"
-#~ msgstr "nielu"
-
-#~ msgid "source"
-#~ msgstr "lähde"
diff --git a/po/fr.po b/po/fr.po
index 5c2cd78..355ec23 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -1,8 +1,8 @@
 # French translation of pulseaudio.
 # Copyright (C) 2006-2008 Lennart Poettering
 # This file is distributed under the same license as the pulseaudio package.
-# 
-# 
+#
+#
 # Robert-André Mauchin <zebob.m at pengzone.org>, 2008.
 # Michaël Ughetto <telimektar esraonline com>, 2008.
 # Pablo Martin-Gomez <pablo.martin-gomez at laposte.net>, 2008.
@@ -12,7 +12,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio trunk\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-01-17 06:48+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-12-09 21:40+0100\n"
 "Last-Translator: Thomas Canniot <mrtom at fedoraproject.org>\n"
 "Language-Team: French <fedora-trans-fr at redhat.com>\n"
@@ -22,37 +22,49 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n>1;\n"
 "X-Generator: Lokalize 1.0\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
-"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
+"ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
-"snd_pcm_avail() a retourné une valeur qui est exceptionnellement large : %lu octets (%lu ms).\n"
-"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez rapporter ce problème aux développeurs d'ALSA."
+"snd_pcm_avail() a retourné une valeur qui est exceptionnellement large : %lu "
+"octets (%lu ms).\n"
+"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez "
+"rapporter ce problème aux développeurs d'ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
-"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
+"lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
-"snd_pcm_delay() a retourné une valeur qui est exceptionnellement large : %li octets (%s%lu ms).\n"
-"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez rapporter ce problème aux développeurs d'ALSA."
+"snd_pcm_delay() a retourné une valeur qui est exceptionnellement large : %li "
+"octets (%s%lu ms).\n"
+"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez "
+"rapporter ce problème aux développeurs d'ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
-"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
-"snd_pcm_mmap_begin() a retourné une valeur qui est exceptionnellement large : %lu octets (%lu·ms).\n"
-"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez rapporter ce problème aux développeurs d'ALSA."
+"snd_pcm_mmap_begin() a retourné une valeur qui est exceptionnellement "
+"large : %lu octets (%lu·ms).\n"
+"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez "
+"rapporter ce problème aux développeurs d'ALSA."
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
@@ -67,8 +79,19 @@ msgid "Virtual LADSPA sink"
 msgstr "Destination virtuelle LADSPA"
 
 #: ../src/modules/module-ladspa-sink.c:53
-msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
-msgstr "sink_name=<nom de la destination> sink_properties=<propriétés de la destination> master=<nom de la destination à filter> format=<format de l'échantillon> rate=<taux d'échantillonage> channels=<nombre de canaux> channel_map=<plan des canaux> plugin=<nom de l'extension ladspa> label=<étiquette de l'extension ladspa> control=<liste des valeurs de contrôle de l'entrée séparées par des virgules>"
+msgid ""
+"sink_name=<name for the sink> sink_properties=<properties for the sink> "
+"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
+"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
+"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
+"input control values>"
+msgstr ""
+"sink_name=<nom de la destination> sink_properties=<propriétés de la "
+"destination> master=<nom de la destination à filter> format=<format de "
+"l'échantillon> rate=<taux d'échantillonage> channels=<nombre de canaux> "
+"channel_map=<plan des canaux> plugin=<nom de l'extension ladspa> "
+"label=<étiquette de l'extension ladspa> control=<liste des valeurs de "
+"contrôle de l'entrée séparées par des virgules>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
@@ -78,11 +101,11 @@ msgstr "Horloge de la destination vide"
 msgid "Null Output"
 msgstr "Sortie vide"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Audio interne"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Modem"
 
@@ -98,286 +121,329 @@ msgstr "Échec lors de l'allocation du nouveau chargeur dl."
 msgid "Failed to add bind-now-loader."
 msgstr "Échec lors de l'ajout du chargeur bind-now."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Signal %s obtenu."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Fermeture."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Impossible de trouver l'utilisateur « %s »."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Impossible de trouver le groupe « %s »."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Utilisateur « %s ” (UID %lu) et groupe « %s » (GID %lu) trouvé."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
-msgstr "Le GID de l'utilisateur « %s » et du groupe « %s » ne sont pas identiques."
+msgstr ""
+"Le GID de l'utilisateur « %s » et du groupe « %s » ne sont pas identiques."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "Le dossier personnel de l'utilisateur « %s » n'est pas « %s », ignoré."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Échec lors de la création de « %s » : %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "Échec lors du changement de la liste du groupe : %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "Échec lors du changement de GID : %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "Échec lors du changement d'UID : %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "Les privilèges root ont été correctement abandonnés."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "Mode système étendu non pris en charge sur cette plateforme."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) a échoué : %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "Échec lors de l'analyse de la ligne de commande"
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "Lé démon n'est pas lancé"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Le démon est lancé avec le PID %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Impossible de tuer le démon : %s"
 
-#: ../src/daemon/main.c:571
-msgid "This program is not intended to be run as root (unless --system is specified)."
-msgstr "Le programme n'est pas conçu pour être lancé en tant que root (sauf si --system est renseigné)."
+#: ../src/daemon/main.c:662
+msgid ""
+"This program is not intended to be run as root (unless --system is "
+"specified)."
+msgstr ""
+"Le programme n'est pas conçu pour être lancé en tant que root (sauf si --"
+"system est renseigné)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Les privilèges root sont nécessaires."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start n'est pas pris en charge pour les instances système."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 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."
+msgstr ""
+"Le démon s'exécute en mode système, mais --disallow-exit n'est pas défini."
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 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."
+msgstr ""
+"Le démon s'exécute en mode système, mais --disallow-module-loading n'est pas "
+"défini."
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 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:594
+#: ../src/daemon/main.c:694
 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é."
+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:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "Échec lors de l'acquisition de stdio."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "Échec du tube : %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "Échec de fork() : %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "Échec de read() : %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "Échec lors du démarrage du démon."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "Démarrage du démon réussi."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "Échec de read() : %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Pulseaudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Hôte de compilation : %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "CFLAGS de compilation : %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "Exécution sur l'hôte : %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u processeurs trouvés."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "La taille de la page est de %lu octets"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Compilé avec la prise en charge Valgrind : oui"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Compilé avec la prise en charge Valgrind : non"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Exécution en mode valgrind : %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "Exécution sur l'hôte : %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Construction optimisée : oui"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Construction optimisée : non"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG défini, tous les messages d'erreur sont désactivés."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
-msgstr "FASTPATH défini, seuls les messages d'erreur fastpath ont été désactivés."
+msgstr ""
+"FASTPATH défini, seuls les messages d'erreur fastpath ont été désactivés."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "Tous les messages d'erreur sont activés."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "Échec lors de l'obtention de l'ID de la machine"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "L'ID de la machine est %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "L'ID de la session est %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Utilisation du répertoire d'exécution %s."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "Utilisation du répertoire d'état %s."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "Utilisation du répertoire des modules %s."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Exécution en mode système : %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
-"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
-"If you do it nonetheless then it's your own fault if things don't work as expected.\n"
-"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."
+"OK, so you are running PA in system mode. Please note that you most likely "
+"shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as "
+"expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
+"explanation why system mode is usually a bad idea."
 msgstr ""
-"Vous exécutez PA dans un mode système. Sachez que vous ne devriez pas faire cela.\n"
-"Si vous choisissez malgré tout de le faire, vous êtes responsable de tout dysfonctionnement inattendu.\n"
-"Veuillez lire http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode pour comprendre pourquoi le mode système est généralement une mauvaise idée."
-
-#: ../src/daemon/main.c:809
+"Vous exécutez PA dans un mode système. Sachez que vous ne devriez pas faire "
+"cela.\n"
+"Si vous choisissez malgré tout de le faire, vous êtes responsable de tout "
+"dysfonctionnement inattendu.\n"
+"Veuillez lire http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode pour "
+"comprendre pourquoi le mode système est généralement une mauvaise idée."
+
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "Échec de pa_pid_file_create()."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
-msgstr "De nouvelles horloges à haute résolution sont disponibles ! Bon appétit !"
+msgstr ""
+"De nouvelles horloges à haute résolution sont disponibles ! Bon appétit !"
 
-#: ../src/daemon/main.c:821
-msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
-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:922
+msgid ""
+"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
+"resolution timers enabled!"
+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:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "Échec de pa_core_new()."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "Échec lors de l'initialisation du démon"
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 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:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "Démarrage du démon effectué."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "Fermeture du démon initiée."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "Démon terminé."
 
@@ -392,37 +458,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"
@@ -433,10 +510,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"
@@ -447,56 +526,87 @@ msgstr ""
 "  -h, --help                            Affiche cette aide\n"
 "      --version                         Affiche la version\n"
 "      --dump-conf                       Affiche la configuration par défaut\n"
-"      --dump-modules                    Affiche la liste des modules disponibles\n"
-"      --dump-resample-methods           Affiche la liste des méthodes d'échantillonnage disponibles\n"
-"      --cleanup-shm                     Nettoie les segments de mémoire partagée périmés\n"
-"      --start                           Démarre le démon s'il n'est pas lancé\n"
+"      --dump-modules                    Affiche la liste des modules "
+"disponibles\n"
+"      --dump-resample-methods           Affiche la liste des méthodes "
+"d'échantillonnage disponibles\n"
+"      --cleanup-shm                     Nettoie les segments de mémoire "
+"partagée périmés\n"
+"      --start                           Démarre le démon s'il n'est pas "
+"lancé\n"
 "  -k  --kill                            Tue un démon en cours d'exécution\n"
-"      --check                           Vérifie s'il existe un démon en cours d'exécution (ne retourne que le code de sortie)\n"
+"      --check                           Vérifie s'il existe un démon en "
+"cours d'exécution (ne retourne que le code de sortie)\n"
 "\n"
 "OPTIONS :\n"
-"      --system[=BOOL]                   Exécuter en tant qu'instance système\n"
-"  -D, --daemonize[=BOOL]                Définir en tant que démon après le démarrage\n"
+"      --system[=BOOL]                   Exécuter en tant qu'instance "
+"système\n"
+"  -D, --daemonize[=BOOL]                Définir en tant que démon après le "
+"démarrage\n"
 "      --fail[=BOOL]                     Quitte quand le démarrage échoue\n"
-"      --high-priority[=BOOL]            Tente de définir un niveau nice plus élevé\n"
-"                                        (seulement disponible en tant que root, avec le SUID ou\n"
+"      --high-priority[=BOOL]            Tente de définir un niveau nice plus "
+"élevé\n"
+"                                        (seulement disponible en tant que "
+"root, avec le SUID ou\n"
 "                                        avec un RLIMIT_NICE élevé)\n"
-"      --realtime[=BOOL]                 Tente d'activer une planification en temps réel\n"
-"                                        (seulement disponible en tant que root, avec le SUID ou\n"
+"      --realtime[=BOOL]                 Tente d'activer une planification en "
+"temps réel\n"
+"                                        (seulement disponible en tant que "
+"root, avec le SUID ou\n"
 "                                        ave un RLIMIT_RTPRIO élevé)\n"
-"      --disallow-module-loading[=BOOL]  Empêche les chargements/déchargements de module\n"
-"                                        demandés par l'utilisateur après le démarrage\n"
-"      --disallow-exit[=BOOL]            Empêche les fermetures demandées par l'utilisateur\n"
-"      --exit-idle-time=SECS             Termine le démon quand la durée d'inactivité \n"
+"      --disallow-module-loading[=BOOL]  Empêche les chargements/"
+"déchargements de module\n"
+"                                        demandés par l'utilisateur après le "
+"démarrage\n"
+"      --disallow-exit[=BOOL]            Empêche les fermetures demandées par "
+"l'utilisateur\n"
+"      --exit-idle-time=SECS             Termine le démon quand la durée "
+"d'inactivité \n"
 "                                        et ce temps se sont écoulés\n"
-"      --module-idle-time=SECS           Décharge les modules chargés automatiquement \n"
-"                                        quand la durée d'inactivité et ce temps se sont écoulés\n"
-"      --scache-idle-time=SECS           Décharge les échantillons chargés automatiquement \n"
-"                                        quand la durée d'inactivité et ce temps se sont écoulés\n"
-"      --log-level[=NIVEAU]              Augmente ou définit le niveau de verbosité\n"
+"      --module-idle-time=SECS           Décharge les modules chargés "
+"automatiquement \n"
+"                                        quand la durée d'inactivité et ce "
+"temps se sont écoulés\n"
+"      --scache-idle-time=SECS           Décharge les échantillons chargés "
+"automatiquement \n"
+"                                        quand la durée d'inactivité et ce "
+"temps se sont écoulés\n"
+"      --log-level[=NIVEAU]              Augmente ou définit le niveau de "
+"verbosité\n"
 "  -v                                    Augmente le niveau de verbosité\n"
 "      --log-target={auto,syslog,stderr} Indique la cible du journal\n"
-"      --log-meta[=BOOL]                 Inclure la position du code dans les messages ·du journal\n"
-"      --log-time[=BOOL]                 Inclure la date dans les messages du journal\n"
-"      --log-backtrace=TRAMES            Inclure un traçage de la pile dans les messages du journal\n"
-"  -p, --dl-search-path=CHEMIN           Définit le chemin de recherche pour les objets dynamiques\n"
+"      --log-meta[=BOOL]                 Inclure la position du code dans les "
+"messages ·du journal\n"
+"      --log-time[=BOOL]                 Inclure la date dans les messages du "
+"journal\n"
+"      --log-backtrace=TRAMES            Inclure un traçage de la pile dans "
+"les messages du journal\n"
+"  -p, --dl-search-path=CHEMIN           Définit le chemin de recherche pour "
+"les objets dynamiques\n"
 "                                        partagés (extensions)\n"
-"      --resample-method=MÉTHODE         Utilise la méthode de rééchantillonnage indiquée\n"
+"      --resample-method=MÉTHODE         Utilise la méthode de "
+"rééchantillonnage indiquée\n"
 "                                        (Voir --dump-resample-methods pour\n"
 "                                        les valeurs possibles)\n"
 "      --use-pid-file[=BOOL]             Crée un fichier PID\n"
-"      --no-cpu-limit[=BOOL]             Ne pas installer de limiteur de charge CPU\n"
-"                                        sur les plateformes qui le supportent.\n"
-"      --disable-shm[=BOOL]              Désactive la prise en charge de la mémoire partagée.\n"
+"      --no-cpu-limit[=BOOL]             Ne pas installer de limiteur de "
+"charge CPU\n"
+"                                        sur les plateformes qui le "
+"supportent.\n"
+"      --disable-shm[=BOOL]              Désactive la prise en charge de la "
+"mémoire partagée.\n"
 "\n"
 "SCRIPT DE DÉMARRAGE :\n"
-"  -L, --load=\"PARAMÈTRES DU MODULE\"   Charge le module d'extension indiqué avec\n"
+"  -L, --load=\"PARAMÈTRES DU MODULE\"   Charge le module d'extension indiqué "
+"avec\n"
 "                                        le paramètre indiqué\n"
 "  -F, --file=NOMDEFICHIER               Exécute le script indiqué\n"
-"  -C                                    Ouvre une ligne de commande sur le TTY en cours \n"
+"  -C                                    Ouvre une ligne de commande sur le "
+"TTY en cours \n"
 "                                        après le démarrage\n"
 "\n"
-"  -n                                    Ne pas charger les fichiers de scripts par défaut\n"
+"  -n                                    Ne pas charger les fichiers de "
+"scripts par défaut\n"
 
 #: ../src/daemon/cmdline.c:247
 msgid "--daemonize expects boolean argument"
@@ -507,8 +617,12 @@ msgid "--fail expects boolean argument"
 msgstr "--fail requiert un paramètre booléen"
 
 #: ../src/daemon/cmdline.c:264
-msgid "--log-level expects log level argument (either numeric in range 0..4 or one of debug, info, notice, warn, error)."
-msgstr "--log-level requiert un paramètre de niveau de journal (soit numérique entre 0 et 4, soit de débogage : 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 requiert un paramètre de niveau de journal (soit numérique entre "
+"0 et 4, soit de débogage : info, notice, warn , error)."
 
 #: ../src/daemon/cmdline.c:276
 msgid "--high-priority expects boolean argument"
@@ -605,76 +719,85 @@ msgid "Path: %s\n"
 msgstr "Chemin : %s\n"
 
 # dans les lignes suivantes [%s = nom de fichier: %u = ligne dans celui-ci]
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Cible du journal « %s » invalide."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Niveau du journal « %s » invalide."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Méthode de rééchantillonnage « %s » invalide."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] rlimit « %s » invalide."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit n'est pas pris en charge sur cette plateforme."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Format d'échantillon « %s » invalide."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Taux d'échantillonnage « %s » invalide."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Canaux d'échantillonnage « %s » invalide."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Plan de canaux « %s » invalide."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Nombre de fragments « %s » invalide."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Taille du fragment « %s » invalide."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Niveau de priorité (nice) « %s » invalide."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Taux d'échantillonnage « %s » invalide."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Échec lors de l'ouverture du fichier de configuration : %s"
 
-#: ../src/daemon/daemon-conf.c:562
-msgid "The specified default channel map has a different number of channels than the specified default number of channels."
-msgstr "Le plan de canaux spécifié par défaut a un nombre de canaux différent du nombre spécifié par défaut."
+#: ../src/daemon/daemon-conf.c:602
+msgid ""
+"The specified default channel map has a different number of channels than "
+"the specified default number of channels."
+msgstr ""
+"Le plan de canaux spécifié par défaut a un nombre de canaux différent du "
+"nombre spécifié par défaut."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Lecture à partir du fichier de configuration : %s ###\n"
@@ -720,8 +843,8 @@ msgid "Rear Right"
 msgstr "Arrière droit"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Émetteur à basse fréquence"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1066,187 +1189,188 @@ msgstr "Échec de XOpenDisplay()"
 msgid "Failed to parse cookie data"
 msgstr "Échec lors de l'analyse des données du cookie"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Échec lors de l'ouverture du fichier de configuration « %s » :%s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Aucun cookie chargé. Tentative de connexion sans celui-ci."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork() : %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid() : %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "Message reçu pour une extension inconnue « %s »"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Échec lors du vidage du flux : %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "Flux de lecture vidé."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "Vidage de la connexion au serveur."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain() : %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "Échec de pa_stream_write() : %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "Échec de pa_stream_begin_write() : %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "Échec de pa_stream_peek() : %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Création du flux réussie."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "Échec de pa_stream_get_buffer_attr() : %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Mesures du tampon : maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Mesures du tampon : maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
-msgstr "Utilisation de la spécification d'échantillon « %s », plan des canaux « %s »."
+msgstr ""
+"Utilisation de la spécification d'échantillon « %s », plan des canaux « %s »."
 
 # l'espace manquant entre %s et suspended est voulu
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Connecté au périphérique %s (%u, %ssuspendu)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "Erreur du flux : %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Périphérique de flux suspendu.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "Périphérique de flux repris.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "Flux vide.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "Flux saturé.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "Flux démarré.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Flux déplacé vers le périphérique %s (%u, %ssuspendu).%s"
 
 # suspendu ou non suspendu
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "non "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Des attributs du tampon de flux ont changé.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "Connexion établie.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "Échec de pa_stream_new() : %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "Échec de pa_stream_connect_playback() : %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "Échec de pa_stream_connect_record() : %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Échec lors de la connexion : %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "EOF obtenu."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "Échec de write() : %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "Signal obtenu, fermeture."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "Échec lors de l'obtention de la latence : %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Durée : %0.3f sec. ; Latence : %0.0f µsec."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "Échec de pa_stream_update_timing_info() : %s"
@@ -1254,8 +1378,8 @@ msgstr "Échec de pa_stream_update_timing_info() : %s"
 # 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:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1267,31 +1391,54 @@ 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, s24le, s24be,\n"
-"                                        s24-32le, s24-32be (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, "
+"s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to "
+"s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, "
+"2 for stereo\n"
 "                                        (defaults to 2)\n"
-"      --channel-map=CHANNELMAP          Channel map to use instead of the default\n"
-"      --fix-format                      Take the sample format from the sink 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"
-"      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
+"      --no-remap                        Map channels by index instead of "
+"name.\n"
+"      --latency=BYTES                   Request the specified latency in "
+"bytes.\n"
+"      --process-time=BYTES              Request the specified process time "
+"per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the "
+"specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [options]\n"
@@ -1299,38 +1446,62 @@ msgstr ""
 "  -h, --help                            Affiche cette aide\n"
 "      --version                         Affiche la version\n"
 "\n"
-"  -r, --record                          Crée une connexion pour l'enregistrement\n"
-"  -p, --playback                        Crée une connexion pour la relecture\n"
+"  -r, --record                          Crée une connexion pour "
+"l'enregistrement\n"
+"  -p, --playback                        Crée une connexion pour la "
+"relecture\n"
 "\n"
 "  -v, --verbose                         Active le mode verbeux\n"
 "\n"
-"  -s, --server=SERVEUR                  Le nom du serveur auquel se connecter\n"
-"  -d, --device=PÉRIPHÉRIQUE             Le nom de la destination/source à laquelle se connecter\n"
-"  -n, --client-name=NOM                 Définit le nom de ce client sur le serveur\n"
-"      --stream-name=NOM                 Définit le nom de ce flux sur le serveur\n"
-"      --volume=VOLUME                   Indique le volume initial (linéaire) entre 0 et 65536\n"
-"      --rate=TAUXDÉCHANTILLONNAGE       Le taux d'échantillonnage en Hz (par défaut 44100)\n"
-"      --format=FORMATDELÉCHANTILLON     Le type de l'échantillon, parmi : s16le, s16be, u8, float32le,\n"
-"                                        float32be, ulaw, alaw (par défaut s16ne)\n"
-"      --channels=CANAUX                 Le nombre de canaux, 1 pour mono, 2 pour stéréo\n"
+"  -s, --server=SERVEUR                  Le nom du serveur auquel se "
+"connecter\n"
+"  -d, --device=PÉRIPHÉRIQUE             Le nom de la destination/source à "
+"laquelle se connecter\n"
+"  -n, --client-name=NOM                 Définit le nom de ce client sur le "
+"serveur\n"
+"      --stream-name=NOM                 Définit le nom de ce flux sur le "
+"serveur\n"
+"      --volume=VOLUME                   Indique le volume initial (linéaire) "
+"entre 0 et 65536\n"
+"      --rate=TAUXDÉCHANTILLONNAGE       Le taux d'échantillonnage en Hz (par "
+"défaut 44100)\n"
+"      --format=FORMATDELÉCHANTILLON     Le type de l'échantillon, parmi : "
+"s16le, s16be, u8, float32le,\n"
+"                                        float32be, ulaw, alaw (par défaut "
+"s16ne)\n"
+"      --channels=CANAUX                 Le nombre de canaux, 1 pour mono, 2 "
+"pour stéréo\n"
 "                                        (par défaut 2)\n"
-"      --channel-map=PLANDESCANAUX       Plan des canaux à utiliser au lieu de celui par défaut\n"
-"      --fix-format                      Prend le format de l'échantillon de la destination où le flux\n"
+"      --channel-map=PLANDESCANAUX       Plan des canaux à utiliser au lieu "
+"de celui par défaut\n"
+"      --fix-format                      Prend le format de l'échantillon de "
+"la destination où le flux\n"
 "                                        est en train de se connecter.\n"
-"      --fix-rate                        Prend le taux d'échantillonnage de la destination où le flux\n"
+"      --fix-rate                        Prend le taux d'échantillonnage de "
+"la destination où le flux\n"
 "                                        est en train de se connecter.\n"
-"      --fix-channels                    Prend le nombre et le plan des canaux de la destination \n"
-"                                        où le flux est en train de se connecter.\n"
-"      --no-remix                        Ne pas augmenter ou diminuer le nombre de canaux par mixage.\n"
-"      --no-remap                        Créer le plan des canaux par index et non par nom.\n"
-"      --latency=OCTETS                  Demande la latence indiquée en octets.\n"
-"      --process-time=OCTETS             Demande le temps de traitement indiqué par requête en octets.\n"
-"      --property=PROPRIÉTÉ=VALEUR         Attribut la propriété définie à la valeur définie.\n"
-"      --raw                             Enregistre/lit les données PCM brutes.\n"
-"      --file-format=FFORMAT             Enregistre/lit les données PCM formatées.\n"
-"      --list-file-formats               Liste les formats de fichiers disponibles.\n"
-
-#: ../src/utils/pacat.c:731
+"      --fix-channels                    Prend le nombre et le plan des "
+"canaux de la destination \n"
+"                                        où le flux est en train de se "
+"connecter.\n"
+"      --no-remix                        Ne pas augmenter ou diminuer le "
+"nombre de canaux par mixage.\n"
+"      --no-remap                        Créer le plan des canaux par index "
+"et non par nom.\n"
+"      --latency=OCTETS                  Demande la latence indiquée en "
+"octets.\n"
+"      --process-time=OCTETS             Demande le temps de traitement "
+"indiqué par requête en octets.\n"
+"      --property=PROPRIÉTÉ=VALEUR         Attribut la propriété définie à la "
+"valeur définie.\n"
+"      --raw                             Enregistre/lit les données PCM "
+"brutes.\n"
+"      --file-format=FFORMAT             Enregistre/lit les données PCM "
+"formatées.\n"
+"      --list-file-formats               Liste les formats de fichiers "
+"disponibles.\n"
+
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1341,183 +1512,198 @@ msgstr ""
 "Compilé avec libpulse %s\n"
 "Lié avec libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Nom du client invalide « %s »"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Nom du flux invalide « %s »"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Plan des canaux invalide « %s »"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Spécification de latence invalide « %s »"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Spécification de temps de traitement invalide « %s »"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Propriété invalide « %s »"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Format de fichier inconnu %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Spécification d'échantillon invalide"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open() : %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2() : %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Trop de paramètres."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
-msgstr "Échec lors de la génération des informations de l'échantillon du fichier."
+msgstr ""
+"Échec lors de la génération des informations de l'échantillon du fichier."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "Échec lors de l'ouverture du fichier audio."
 
-#: ../src/utils/pacat.c:959
-msgid "Warning: specified sample specification will be overwritten with specification from file."
-msgstr "Avertissement : les spécifications de l'échantillon spécifié seront écrasées par celles du fichier."
+#: ../src/utils/pacat.c:1000
+msgid ""
+"Warning: specified sample specification will be overwritten with "
+"specification from file."
+msgstr ""
+"Avertissement : les spécifications de l'échantillon spécifié seront écrasées "
+"par celles du fichier."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
-msgstr "Échec lors de l'obtention des informations de l'échantillon du fichier."
+msgstr ""
+"Échec lors de l'obtention des informations de l'échantillon du fichier."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
-msgstr "Avertissement : échec lors de l'obtention des informations du plan des canaux du fichier."
+msgstr ""
+"Avertissement : échec lors de l'obtention des informations du plan des "
+"canaux du fichier."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "Le plan des canaux ne correspond pas à la spécification d'échantillon"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
-msgstr "Avertissement : Échec lors de l'écriture du plan des canaux dans le fichier."
+msgstr ""
+"Avertissement : Échec lors de l'écriture du plan des canaux dans le fichier."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr "Ouverture d'un flux %s avec une spécification d'échantillon « %s » et un plan des canaux « %s »."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr ""
+"Ouverture d'un flux %s avec une spécification d'échantillon « %s » et un plan "
+"des canaux « %s »."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "enregistrement"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "lecture"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "Échec de pa_mainloop_new()."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "Échec de io_new()."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "Échec de pa_context_new()."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "Échec de pa_context_connect() : %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "Échec de pa_context_rttime_new()."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "Échec de pa_mainloop_run()."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork() : %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp() : %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "Échec lors de la suspension : %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "Échec lors de la reprise : %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
-msgstr "AVERTISSEMENT : le serveur de son n'est pas local, suspension annulée.\n"
+msgstr ""
+"AVERTISSEMENT : le serveur de son n'est pas local, suspension annulée.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Échec lors de la connexion : %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "SIGINT reçu, fermeture.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "AVERTISSEMENT : le processus fils a été terminé par le signal %u\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
-"  -s, --server=SERVER                   The name of the server to connect to\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
 "\n"
 msgstr ""
 "%s [options] ... \n"
 "\n"
 "  -h, --help                            Affiche cette aide\n"
 "      --version                         Affiche la version\n"
-"  -s, --server=SERVEUR                  Le nom du serveur auquel se connecter\n"
+"  -s, --server=SERVEUR                  Le nom du serveur auquel se "
+"connecter\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1528,50 +1714,63 @@ msgstr ""
 "Compilé avec libpulse %s\n"
 "Lié avec libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "Échec de pa_mainloop_new().\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "Échec de pa_context_new().\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "Échec de pa_mainloop_run().\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Échec lors de l'obtention des statistiques : %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "En cours d'utilisation : %u blocs contenant au total %s octets.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
-msgstr "Alloué pendant l'ensemble de la durée d'exécution : %u blocs contenant au total %s octets.\n"
+msgstr ""
+"Alloué pendant l'ensemble de la durée d'exécution : %u blocs contenant au "
+"total %s octets.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Taille du cache de l'échantillon : %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "Échec lors de l'obtention des informations du serveur : %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1579,7 +1778,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Nom d'utilisateur : %s\n"
 "Nom d'hôte : %s\n"
@@ -1591,13 +1790,13 @@ msgstr ""
 "Source par défaut : %s\n"
 "Cookie : %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Échec lors de l'obtention des informations sur la destination : %s"
 
 # demander à Lennart s'il s'agit de monitor of source
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1636,22 +1835,22 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tPorts :\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tPort actif : %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "Échec lors de l'obtention des informations sur la source : %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1690,20 +1889,20 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n/d"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "Échec lors de l'obtention des informations du module : %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1720,12 +1919,12 @@ msgstr ""
 "\tPropriétés : \n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "Échec lors de l'obtention des informations du client : %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1740,12 +1939,12 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "Impossible d'obtenir des informations sur la carte : %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1762,22 +1961,23 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tProfils :\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tProfil actif : %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
-msgstr "Échec lors de l'obtention des informations de l'entrée de la destination : %s"
+msgstr ""
+"Échec lors de l'obtention des informations de l'entrée de la destination : %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1814,12 +2014,13 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
-msgstr "Échec lors de l'obtention des informations de la sortie de la source : %s"
+msgstr ""
+"Échec lors de l'obtention des informations de la sortie de la source : %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1848,7 +2049,7 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Échec lors de l'obtention des informations de l'échantillon : %s"
@@ -1856,7 +2057,7 @@ msgstr "Échec lors de l'obtention des informations de l'échantillon : %s"
 # Lazy ?
 # load-sample-lazy = Create a new entry in the sample cache, but don't load
 # the sample immediately. The sample is loaded only when it is first used
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1887,26 +2088,81 @@ msgstr ""
 "\tPropriétés :\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Échec : %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Échec lors de l'envoi de l'échantillon : %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "Fin prématurée du fichier"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr "destination"
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr "source"
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+#, fuzzy
+msgid "source-output"
+msgstr "source"
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Serveur invalide"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT reçu, fermeture."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -1929,12 +2185,15 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\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 ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -1961,10 +2220,12 @@ msgstr ""
 "  -h, --help                            Affiche cette aide\n"
 "      --version                         Affiche la version\n"
 "\n"
-"  -s, --server=SERVEUR                  Le nom du serveur auquel se connecter\n"
-"  -n, --client-name=NOM                 Définit le nom de ce client sur le serveur\n"
+"  -s, --server=SERVEUR                  Le nom du serveur auquel se "
+"connecter\n"
+"  -n, --client-name=NOM                 Définit le nom de ce client sur le "
+"serveur\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1975,101 +2236,112 @@ msgstr ""
 "Compilé avec libpulse %s\n"
 "Lié avec libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Veuillez indiquer un fichier d'échantillon à charger"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Échec lors de l'ouverture du fichier audio."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
-msgstr "Avertissement : Échec lors de l'obtention des spécifications de l'échantillon du fichier."
+msgstr ""
+"Avertissement : Échec lors de l'obtention des spécifications de "
+"l'échantillon du fichier."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "Vous devez indiquer un nom d'échantillon à lire"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "Vous devez indiquer un nom d'échantillon à supprimer"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
-msgstr "Vous devez indiquer un index d'entrée de destination et une destination"
+msgstr ""
+"Vous devez indiquer un index d'entrée de destination et une destination"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "Vous devez indiquer un index de sortie de source et une source"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "Vous devez indiquer un nom de module et des paramètres."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "Vous devez indiquer un index de module"
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
-msgstr "Vous ne pouvez pas indiquer plus d'une destination. Vous devez indiquer une valeur booléenne."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
+msgstr ""
+"Vous ne pouvez pas indiquer plus d'une destination. Vous devez indiquer une "
+"valeur booléenne."
 
-#: ../src/utils/pactl.c:1103
-msgid "You may not specify more than one source. You have to specify a boolean value."
-msgstr "Vous ne pouvez pas indiquer plus d'une source. Vous devez indiquer une valeur booléenne."
+#: ../src/utils/pactl.c:1196
+msgid ""
+"You may not specify more than one source. You have to specify a boolean "
+"value."
+msgstr ""
+"Vous ne pouvez pas indiquer plus d'une source. Vous devez indiquer une "
+"valeur booléenne."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "Vous devez indiquer un nom/un index de carte et un nom de profil"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "Vous devez indiquer un nom/un index de destination et un nom de port"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "Vous devez indiquer un nom/un index de source et un nom de port"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "Vous devez indiquer un nom/un index de destination et un volume"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "Spécification de volume invalide"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "Vous devez indiquer un nom/un index de source et un volume"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "Vous devez indiquer un index d'entrée de destination et un volume"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "Index invalide d'entrée de la destination"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "Vous devez indiquer un nom/un index de destination et un booléen muet"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "Vous devez indiquer un nom/un index de source et un booléen muet"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr "Vous devez indiquer un index d'entrée de destination et un booléen muet"
+msgstr ""
+"Vous devez indiquer un index d'entrée de destination et un booléen muet"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "Spécification d'index d'entrée de la destination invalide"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "Aucune commande valide indiquée."
 
@@ -2080,14 +2352,18 @@ 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 visuel] [-S serveur] [-O destination] [-I source] [-c fichier]  [-d|-e|-i|-r]\n"
+"%s [-D visuel] [-S serveur] [-O destination] [-I source] [-c fichier]  [-d|-"
+"e|-i|-r]\n"
 "\n"
-" -d    Affiche les données PulseAudio actuelles attachées au visuel X11 (par défaut)\n"
+" -d    Affiche les données PulseAudio actuelles attachées au visuel X11 (par "
+"défaut)\n"
 " -e    Exporte les données PulseAudio locales vers le visuel X11\n"
-" -i    Importe les données PulseAudio depuis le visuel X11 vers les variables de l'environnement local et le fichier de cookie.\n"
+" -i    Importe les données PulseAudio depuis le visuel X11 vers les "
+"variables de l'environnement local et le fichier de cookie.\n"
 " -r    Enlève les données PulseAudio du visuel X11\n"
 
 #: ../src/utils/pax11publish.c:94
@@ -2133,7 +2409,8 @@ msgstr "Échec lors du chargement du fichier de configuration du client.\n"
 #: ../src/utils/pax11publish.c:157
 #, c-format
 msgid "Failed to read environment configuration data.\n"
-msgstr "Échec lors de la lecture des données de configuration de l'environnement.\n"
+msgstr ""
+"Échec lors de la lecture des données de configuration de l'environnement.\n"
 
 # Fully Qualified Domain Name
 #: ../src/utils/pax11publish.c:174
@@ -2151,102 +2428,120 @@ msgstr "Échec lors du chargement des données du cookie\n"
 msgid "Not yet implemented.\n"
 msgstr "Pas encore implémenté.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
-msgstr "Aucun démon PulseAudio en cours d'exécution, ou ne s'exécutant pas dans une session de type démon."
+msgstr ""
+"Aucun démon PulseAudio en cours d'exécution, ou ne s'exécutant pas dans une "
+"session de type démon."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0) : %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect() : %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "Impossible de tuer le démon PulseAudio."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "Le démon ne répond pas."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll() : %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read() : %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write() : %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "Impossible d'accèder au verrou autonome."
 
 #: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
 #, c-format
 msgid ""
-"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
-"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
+"ALSA woke us up to write new data to the device, but there was actually "
+"nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
 msgstr ""
-"ALSA nous a réveillé pour écrire de nouvelles données à partir du périphérique, mais il n'y avait en fait rien à écrire !\n"
-"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez rapporter ce problème aux développeurs d'ALSA.\n"
-"Nous avons été réveillés avec POLLOUT actif, cependant un snd_pcm_avail() ultérieur a retourné 0 ou une autre valeur < min_avail."
+"ALSA nous a réveillé pour écrire de nouvelles données à partir du "
+"périphérique, mais il n'y avait en fait rien à écrire !\n"
+"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez "
+"rapporter ce problème aux développeurs d'ALSA.\n"
+"Nous avons été réveillés avec POLLOUT actif, cependant un snd_pcm_avail() "
+"ultérieur a retourné 0 ou une autre valeur < min_avail."
 
 #: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
 #, c-format
 msgid ""
-"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
-"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
+"ALSA woke us up to read new data from the device, but there was actually "
+"nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
 msgstr ""
-"ALSA nous a réveillé pour lire de nouvelles données à partir du périphérique, mais il n'y avait en fait rien à lire !\n"
-"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez rapporter ce problème aux développeurs d'ALSA.\n"
-"Nous avons été réveillés avec POLLIN actif, cependant un snd_pcm_avail() ultérieur a retourné 0 ou une autre valeur < min_avail."
+"ALSA nous a réveillé pour lire de nouvelles données à partir du "
+"périphérique, mais il n'y avait en fait rien à lire !\n"
+"Il s'agit très probablement d'un bogue dans le pilote ALSA « %s ». Veuillez "
+"rapporter ce problème aux développeurs d'ALSA.\n"
+"Nous avons été réveillés avec POLLIN actif, cependant un snd_pcm_avail() "
+"ultérieur a retourné 0 ou une autre valeur < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Éteint"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "Lecture haute fidélité (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "Capture haute fidélité (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Telephonie en duplex (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "Serveur de son PulseAudio"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "Périphériques de sortie"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "Périphériques d'entrée"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "Audio sur @HOSTNAME@"
 
@@ -2310,136 +2605,163 @@ msgstr "Amplificateur"
 msgid "No Amplifier"
 msgstr "Pas d'amplificateur"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "Boost"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "Pas de boost"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "Casques analogiques"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "Entrée analogique"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "Microphone analogique"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "Entrée-ligne analogique"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "Radio analogique"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "Vidéo analogique"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "Sortie analogique"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "Casques analogiques"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "Sortie analogique (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "Sortie mono analogique"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Stéréo analogique"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Mono analogique"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Stéréo analogique"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "Surround analogique 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "Surround analogique 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "Surround analogique 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Surround analogique 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Surround analogique 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Surround analogique 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Surround analogique 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "Surround analogique 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "Surround analogique 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "Surround analogique 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Surround analogique 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Stéréo numérique (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Surround numérique 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Surround numérique 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Surround numérique 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Stéréo numérique (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "Duplex Mono analogique"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "Duplex stéréo analogique"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Duplex stéréo numérique (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Émetteur à basse fréquence"
+
 #~ msgid "Invalid client name '%s'\n"
 #~ msgstr "Plan des canaux invalide « %s »\n"
 
@@ -2485,17 +2807,27 @@ msgstr "Duplex stéréo numérique (IEC958)"
 #~ msgid "PolicyKit responded with '%s'"
 #~ msgstr "PolicyKit a renvoyé « %s »"
 
-#~ msgid "High-priority scheduling (negative Unix nice level) for the PulseAudio daemon"
-#~ msgstr "Ordonnancement haute priorité (niveau Unix « nice » négatif) pour le démon PulseAudio"
+#~ msgid ""
+#~ "High-priority scheduling (negative Unix nice level) for the PulseAudio "
+#~ "daemon"
+#~ msgstr ""
+#~ "Ordonnancement haute priorité (niveau Unix « nice » négatif) pour le démon "
+#~ "PulseAudio"
 
 #~ msgid "Real-time scheduling for the PulseAudio daemon"
 #~ msgstr "Ordonnancement en temps réel pour le démon PulseAudio"
 
-#~ msgid "System policy prevents PulseAudio from acquiring high-priority scheduling."
-#~ msgstr "La politique du système empêche PulseAudio d'acquérir un ordonnancement haute priorité"
+#~ msgid ""
+#~ "System policy prevents PulseAudio from acquiring high-priority scheduling."
+#~ msgstr ""
+#~ "La politique du système empêche PulseAudio d'acquérir un ordonnancement "
+#~ "haute priorité"
 
-#~ msgid "System policy prevents PulseAudio from acquiring real-time scheduling."
-#~ msgstr "La politique du système empêche PulseAudio d'acquérir un ordonnancement en temps réel"
+#~ msgid ""
+#~ "System policy prevents PulseAudio from acquiring real-time scheduling."
+#~ msgstr ""
+#~ "La politique du système empêche PulseAudio d'acquérir un ordonnancement "
+#~ "en temps réel"
 
 #~ msgid "read() failed: %s\n"
 #~ msgstr "Échec de read() : %s\n"
@@ -2504,13 +2836,18 @@ msgstr "Duplex stéréo numérique (IEC958)"
 #~ msgstr "Échec de pa_context_connect() : %s"
 
 #~ msgid "We're in the group '%s', allowing high-priority scheduling."
-#~ msgstr "Nous sommes dans le groupe « %s », permettant une planification à haute priorité."
+#~ msgstr ""
+#~ "Nous sommes dans le groupe « %s », permettant une planification à haute "
+#~ "priorité."
 
 #~ msgid "We're in the group '%s', allowing real-time scheduling."
-#~ msgstr "Nous sommes dans le groupe « %s », permettant un ordonnancement en temps réel."
+#~ msgstr ""
+#~ "Nous sommes dans le groupe « %s », permettant un ordonnancement en temps "
+#~ "réel."
 
 #~ msgid "PolicyKit grants us acquire-high-priority privilege."
-#~ msgstr "PolicyKit a accordé l'acquisition des permissions de haute priorité."
+#~ msgstr ""
+#~ "PolicyKit a accordé l'acquisition des permissions de haute priorité."
 
 #~ msgid "PolicyKit refuses acquire-high-priority privilege."
 #~ msgstr "PolicyKit a refusé l'acquisition des permissions de haute priorité."
@@ -2522,16 +2859,33 @@ msgstr "Duplex stéréo numérique (IEC958)"
 #~ msgstr "PolicyKit a refusé l'acquisition des permissions de temps réel."
 
 #~ 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 '%s', 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 '%s', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user."
+#~ "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 '%s', 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 '%s', or increase "
+#~ "the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user."
 #~ msgstr ""
-#~ "Le SUID root et l'ordonnancement en temps réel et/ou haute priorité ont été spécifiés dans la configuration. Cependant, il nous manque les privilèges nécessaires :\n"
-#~ "Nous ne sommes pas dans le groupe « %s », PolicyKit refuse de nous accorder les privilèges demandés et nous devons augmenter les limites de ressources RLIMIT_NICE/RLIMIT_RTPRIO.\n"
-#~ "Pour activer l'ordonnancement en temps réel/haute priorité, veuillez acquérir les privilèges PolicyKit apropriés, ou devenir membre de « %s », ou augmenter les limites de ressources RLIMIT_NICE/RLIMIT_RTPRIO pour cet utilisateur."
+#~ "Le SUID root et l'ordonnancement en temps réel et/ou haute priorité ont "
+#~ "été spécifiés dans la configuration. Cependant, il nous manque les "
+#~ "privilèges nécessaires :\n"
+#~ "Nous ne sommes pas dans le groupe « %s », PolicyKit refuse de nous "
+#~ "accorder les privilèges demandés et nous devons augmenter les limites de "
+#~ "ressources RLIMIT_NICE/RLIMIT_RTPRIO.\n"
+#~ "Pour activer l'ordonnancement en temps réel/haute priorité, veuillez "
+#~ "acquérir les privilèges PolicyKit apropriés, ou devenir membre de « %s », "
+#~ "ou augmenter les limites de ressources RLIMIT_NICE/RLIMIT_RTPRIO pour cet "
+#~ "utilisateur."
 
-#~ 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."
+#~ 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."
 
 #~ msgid "Successfully increased RLIMIT_RTPRIO"
 #~ msgstr "Augmentation de RLIMIT_RTPRIO réussie"
@@ -2542,8 +2896,11 @@ msgstr "Duplex stéréo numérique (IEC958)"
 #~ msgid "Giving up CAP_NICE"
 #~ msgstr "Abandon de CAP_NICE"
 
-#~ 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."
+#~ 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."
 
 #~ msgid "Limited capabilities successfully to CAP_SYS_NICE."
 #~ msgstr "Limitation des capacités à CAP_SYS_NICE réussie."
@@ -2571,11 +2928,16 @@ msgstr "Duplex stéréo numérique (IEC958)"
 #~ "\n"
 #~ "  -v, --verbose                         Enable verbose operation\n"
 #~ "\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"
+#~ "  -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"
 #~ "      --channel-map=CHANNELMAP          Set the channel map to the use\n"
 #~ msgstr ""
 #~ "%s [options] [FICHIER]\n"
@@ -2585,12 +2947,18 @@ msgstr "Duplex stéréo numérique (IEC958)"
 #~ "\n"
 #~ "  -v, --verbose                         Active le mode verbeux\n"
 #~ "\n"
-#~ "  -s, --server=SERVEUR                  Le nom du serveur auquel se connecter\n"
-#~ "  -d, --device=PÉRIPHÉRIQUE             Le nom de la destination à laquelle se connecter\n"
-#~ "  -n, --client-name=NOM                 Définit le nom de ce client sur le serveur\n"
-#~ "      --stream-name=NOM                 Définit le nom de ce flux sur le serveur\n"
-#~ "      --volume=VOLUME                   Définit le volume initial (linéaire) entre 0 et 65536\n"
-#~ "      --channel-map=PLANDESCANAUX       Définit le plan des canaux à utiliser\n"
+#~ "  -s, --server=SERVEUR                  Le nom du serveur auquel se "
+#~ "connecter\n"
+#~ "  -d, --device=PÉRIPHÉRIQUE             Le nom de la destination à "
+#~ "laquelle se connecter\n"
+#~ "  -n, --client-name=NOM                 Définit le nom de ce client sur "
+#~ "le serveur\n"
+#~ "      --stream-name=NOM                 Définit le nom de ce flux sur le "
+#~ "serveur\n"
+#~ "      --volume=VOLUME                   Définit le volume initial "
+#~ "(linéaire) entre 0 et 65536\n"
+#~ "      --channel-map=PLANDESCANAUX       Définit le plan des canaux à "
+#~ "utiliser\n"
 
 #~ msgid ""
 #~ "paplay %s\n"
@@ -2614,17 +2982,23 @@ msgstr "Duplex stéréo numérique (IEC958)"
 #~ msgstr "Utilisation de la spécification de l'échantillon « %s »\n"
 
 #~ 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 ""
-#~ "Le SUID root a été appelé et la planification à haute priorité/en temps réel demandée dans la configuration. Néanmoins nous n'avons pas les permissions nécessaires :\n"
+#~ "Le SUID root a été appelé et la planification à haute priorité/en temps "
+#~ "réel demandée dans la configuration. Néanmoins nous n'avons pas les "
+#~ "permissions nécessaires :\n"
 #~ "nous ne somme pas dans le groupe "
 
 #~ msgid "--log-time boolean argument"
 #~ msgstr "--disallow-exit requiert un paramètre booléen"
 
 #~ msgid "Default sink name (%s) does not exist in name register."
-#~ msgstr "Le nom de la destination par défaut (%s) n'existe pas dans le registre des noms."
+#~ msgstr ""
+#~ "Le nom de la destination par défaut (%s) n'existe pas dans le registre "
+#~ "des noms."
 
 #~ msgid "Buffer overrun, dropping incoming data\n"
 #~ msgstr "Saturation du tampon, abandon des données entrantes\n"
@@ -2648,21 +3022,22 @@ msgstr "Duplex stéréo numérique (IEC958)"
 #~ "Module : %s\n"
 #~ "Paramètre : %s\n"
 
-#~ msgid "sink"
-#~ msgstr "destination"
-
-#~ msgid "source"
-#~ msgstr "source"
-
 #~ 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 '"
+#~ "For enabling real-time scheduling please acquire the appropriate "
+#~ "PolicyKit priviliges, or become a member of '"
 #~ msgstr ""
-#~ " et PolicyKit refuse de nous accorder les permissions. Abandon du SUID à nouveau.\n"
-#~ "Pour activer la planification en temps réel, veuillez aquérir les permissions PolicyKit appropriées, ou devenez membre de "
+#~ " et PolicyKit refuse de nous accorder les permissions. Abandon du SUID à "
+#~ "nouveau.\n"
+#~ "Pour activer la planification en temps réel, veuillez aquérir les "
+#~ "permissions PolicyKit appropriées, ou devenez membre de "
 
-#~ msgid "', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user."
-#~ msgstr ", ou augmentez les limites de ressource RLIMIT_NICE/RLIMIT_RTPRIO pour cet utilisateur."
+#~ msgid ""
+#~ "', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this "
+#~ "user."
+#~ msgstr ""
+#~ ", ou augmentez les limites de ressource RLIMIT_NICE/RLIMIT_RTPRIO pour "
+#~ "cet utilisateur."
 
 #~ msgid "socketpair(): %s"
 #~ msgstr "socketpair() : %s"
diff --git a/po/gu.po b/po/gu.po
index 2486027..1d0f38d 100644
--- a/po/gu.po
+++ b/po/gu.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PulseAudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-07 08:36+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-12-07 17:22+0530\n"
 "Last-Translator: Sweta Kothari <swkothar at redhat.com>\n"
 "Language-Team: Gujarati\n"
@@ -17,12 +17,12 @@ msgstr ""
 "X-Generator: KBabel 1.11.4\n"
 "Plural-Forms: nplurals=2; plural=(n!=1);\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -34,7 +34,7 @@ msgstr ""
 "ALSA ડ્રાઇવર '%s' માં મોટેભાગે આ ભૂલ જેવુ છે. ALSA ડેવલ્પરોમાં આ સમસ્યાને મહેરબાની કરીને "
 "અહેવાલ કરો."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -47,7 +47,7 @@ msgstr ""
 "ALSA ડ્રાઇવર '%s' માં મોટેભાગે આ ભૂલ જેવુ છે. ALSA ડેવલ્પરોમાં આ સમસ્યાને મહેરબાની કરીને "
 "અહેવાલ કરો."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -94,11 +94,11 @@ msgstr "ક્લોક થયેલ NULL સિંક"
 msgid "Null Output"
 msgstr "શૂન્ય આઉટપુટ"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "આંતરિક ઓડિયો"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "મોડેમ"
 
@@ -114,248 +114,270 @@ msgstr "નવા dl લોડરને ફાળવવાનું નિષ્
 msgid "Failed to add bind-now-loader."
 msgstr "bind-now-loader ને ઉમેરવાનું નિષ્ફળ."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "સંકેત %s મળ્યુ."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "બહાર નીકળી રહ્યા છે."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "વપરાશકર્તા '%s' ને શોધવામાં નિષ્ફળ."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "જૂથ '%s' ને શોધવામાં નિષ્ફળ."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "વપરાશકર્તા '%s' (UID %lu) અને જૂથ '%s' (GID %lu) શોધાયુ."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "વપરાશકર્તા '%s' અને જૂથ '%s' ની GID બંધબેસતુ નથી."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "વપરાશકર્તાઓ '%s' ની ઘર ડિરેક્ટરી '%s' નથી, અવગણી રહ્યા છે."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "'%s' ને બનાવવામાં નિષ્ફળ: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "જૂથ યાદીને બદલવામાં નિષ્ફળ: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "GID ને બદલવામાં નિષ્ફળ: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "UID ને બદલવામાં નિષ્ફળ: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "સફળતાપૂર્વક છોડી દીધેલ રુટ અધિકારો."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "આ પ્લેટફોર્મ પર બિનઆધારભૂત સિસ્ટમ વિશાળ સ્થિતિ."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) નિષ્ફળ: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "આદેશ વાક્યને પદચ્છેદન કરવામાં નિષ્ફળ."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "ડિમન ચાલી રહ્યુ નથી"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "PID %u તરીકે ડિમન ચાલી રહ્યુ છે"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "ડિમનને મારવાનું નિષ્ફળ: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
-msgstr "આ પ્રક્રિયાને રુટ તરીકે ચલાવવા માટે વિચાર થયેલ નથી (નહિં તો --system એ સ્પષ્ટ થયેલ છે)."
+msgstr ""
+"આ પ્રક્રિયાને રુટ તરીકે ચલાવવા માટે વિચાર થયેલ નથી (નહિં તો --system એ સ્પષ્ટ થયેલ છે)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "રુટ અધિકારો જરૂરી છે."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start એ સિસ્ટમ ઉદાહરણો માટે આધારભૂત નથી."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "સિસ્ટમ સ્થિતિમાં ચાલી રહ્યુ છે, પરંતુ --disallow-exit સુયોજિત નથી!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr "સિસ્ટમ સ્થિતિમાં ચાલી રહ્યુ છે, પરંતુ --disallow-module-loading એ સુયોજિત નથી!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "સિસ્ટમ સ્થિતિમાં ચાલી રહ્યુ છે, SHM સ્થિતિને દબાણપૂર્વક નિષ્ક્રિય કરી રહ્યા છે!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 "સિસ્ટમ સ્થિતિમાં ચાલી રહ્યુ છે, બહાર નીકળવનાં નિષ્કાર્ય સમયને દબાણપૂર્વક નિષ્ક્રિય કરી "
 "રહ્યા છે!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "stdio ને મેળવવામાં નિષ્ફળ."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "પાઇપ નિષ્ફળ: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() નિષ્ફળ: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() નિષ્ફળ: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "ડિમન શરૂઆત નિષ્ફળ."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "ડિમન શરૂઆત કરવુ સફળ છે."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() નિષ્ફળ: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "આ PulseAudio %s છે"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "કમ્પાઇલેશન યજમાન: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "કમ્પાઇલેશન CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "યજમાન પર ચાલી રહ્યુ છે: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u CPUs શોધાયુ."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "પાનાંનુ માપ %lu બાઇટો છે"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Valgrind આધાર સાથે કમ્પાઇલ થયેલ છે: હા"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Valgrind આધાર સાથે કમ્પાઇલ થયેલ છે: ના"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "valgrind સ્થિતિમાં ચાલી રહ્યુ છે: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "યજમાન પર ચાલી રહ્યુ છે: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "શ્રેષ્ટ થયેલ બિલ્ડ: હા"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "શ્રેષ્ટ થયેલ બિલ્ડ: ના"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG વ્યાખ્યાયિત થયેલ છે, બધા હકો નિષ્ક્રિય થયેલ છે."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH વ્યાખ્યાયિત થયેલ છે, ફક્ત ઝડપી પાથનાં હકો નિષ્ક્રિય થયેલ છે."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "બધા હકો સક્રિય થયેલ છે."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "મશીન ID ને મેળવવામાં નિષ્ફળ"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "મશીન ID %s છે."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "સત્ર ID %s છે."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "રનટાઇમ ડિરેક્ટરી %s ને વાપરી રહ્યા છે."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "સ્થિતિ ડિરેક્ટરી %s ને વાપરી રહ્યા છે."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "ઇોડ્યુલોમ ડિરેક્ટરી %s ને વાપરી રહ્યા છે."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "સિસ્ટમ સ્થિતિમાં ચાલી રહ્યુ છે: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -370,15 +392,15 @@ msgstr ""
 "શા માટે સિસ્ટમ સ્થિતિ સામાન્ય રીતે ખરાબ વિચાર છે તે માટે વિગતવાર જાણકારી માટે મહેરબાની "
 "કરીને http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode આને વાંચો."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() નિષ્ફળ."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "તાજુ high-resolution ટાઇમરો ઉપલ્બધ છે! બોન એપેટાઇટ!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -386,27 +408,27 @@ msgstr ""
 "મિત્ર, તમારુ કર્નલમાં ગડબડ છે! રસોઇયાનું આજે ભલામણ એ સક્રિય થયેલ high-resolution "
 "ટાઇમરો સાથે Linux નું છે!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() નિષ્ફળ."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "ડિમનને શરૂ કરવામાં નિષ્ફળ."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "કોઇપણ લોડ થયેલ મોડ્યુલો વગર ડિમનને શરૂ કરો, કામ કરવા માટે ફરી શરૂ કરી રહ્યા છે."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "ડિમન પારંભ કરવાનું સમાપ્ત છે."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "ડિમનને બંધ કરવાનું પ્રારંભ થયેલ છે."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "ડિમનનો અંત આવેલ છે."
 
@@ -662,78 +684,84 @@ msgstr "DEPRECATION WARNING: %s\n"
 msgid "Path: %s\n"
 msgstr "પાથ: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] અયોગ્ય લોગ લક્ષ્ય '%s'."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] અયોગ્ય લોગ સ્તર '%s'."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] અયોગ્ય resample પદ્દતિ '%s'."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] અયોગ્ય rlimit '%s'."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit એ આ પ્લેટફોર્મ પર આધારભૂત નથી."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] અયોગ્ય નમૂના બંધારણ '%s'."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] અયોગ્ય નમૂના દર '%s'."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] અયોગ્ય નમૂના ચેનલો '%s'."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] અયોગ્ય ચેનલ મેપ '%s'."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] અયોગ્ય ફ્રેગમેન્ટોનાં નંબર '%s'."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] અયોગ્ય ફ્રેગમેન્ટ માપ '%s'."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] અયોગ્ય સારુ સ્તર '%s'."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] અયોગ્ય નમૂના દર '%s'."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "રૂપરેખાંકન ફાઇલને ખોલવાનું નિષ્ફળ: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
-msgstr "સ્પષ્ટ થયેલ મૂળભૂત ચેનલ મેપ પાસે સ્પષ્ટ થયેલ ચેનલોની મૂળભૂત સંખ્યા કરતા વિવિધ ચેનલોની સંખ્યા છે."
+msgstr ""
+"સ્પષ્ટ થયેલ મૂળભૂત ચેનલ મેપ પાસે સ્પષ્ટ થયેલ ચેનલોની મૂળભૂત સંખ્યા કરતા વિવિધ ચેનલોની સંખ્યા છે."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### રૂપરેખાંકન ફાઇલમાંથી વાંચો: %s ###\n"
@@ -779,8 +807,8 @@ msgid "Rear Right"
 msgstr "રિઅર જમણે"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Low Frequency Emmiter"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1125,191 +1153,191 @@ msgstr "XOpenDisplay() નિષ્ફળ"
 msgid "Failed to parse cookie data"
 msgstr "કુકીની માહિતીને પદચ્છેદન કરવામાં નિષ્ફળ"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "રૂપરેખાંકન ફાઇલ '%s' ને ખોલવામાં નિષ્ફળ: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "કુકી લોડ થયેલ નથી. તેનાં વગર જોડવાનો પ્રયત્ન કરી રહ્યા છે."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "અજ્ઞાત એક્સટેન્શન '%s' માટે મળેલ સંદેશ"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "સ્ટ્રીમને નિકાલ કરવામાં નિષ્ફળ: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "પ્લેબેક સ્ટ્રીમ ને નિકાલ કરેલ છે."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "સર્વરમાં જોડાણને નિકાલ કરી રહ્યા છે."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() નિષ્ફળ: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() નિષ્ફળ: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() નિષ્ફળ: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "સ્ટ્રીમ સફળતાપૂર્વક બનાવેલ છે."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() નિષ્ફળ: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "બફર મેટ્રિક્સ: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "બફર મેટ્રિક્સ: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "નમૂનો spec '%s' ને વાપરી રહ્યા છે, ચેનલ મેપ '%s'."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "ઉપકરણ %s (%u, %ssuspended) સાથે જોડાયેલ છે."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "સ્ટ્રીમ ભૂલ: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "સ્ટ્રીમ ઉપકરણ ને થોડા સમય માટે બંધ રાખેલ છે.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "સ્ટ્રીમ ઉપકરણને ફરી શરૂ કરેલ છે.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "સ્ટ્રીમ ચલાવવા હેઠળ છે.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "સ્ટ્રીમ ઉપર ચાલે છે.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "સ્ટ્રીમ શરૂ થયેલ છે.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "સ્ટ્રીમ એ ઉપકરણ %s (%u, %ssuspended) માં ખસેડેલ છે.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "નથી "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "સ્ટ્રીમ બફર ગુણધર્મો બદલાયેલ છે.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "જોડાણ સ્થાપિત થયેલ છે.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() નિષ્ફળ: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() નિષ્ફળ: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() નિષ્ફળ: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "જોડાણ નિષ્ફળ: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "EOF મળ્યુ."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() નિષ્ફળ: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "સંકેત મળ્યું, બહાર નીકળી રહ્યા છે."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "ગુપ્તતા મેળવવામાં નિષ્ફળતા: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Time: %0.3f sec; Latency: %0.0f usec."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() નિષ્ફળ: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1361,10 +1389,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [options]\n"
@@ -1413,7 +1445,7 @@ msgstr ""
 "      --file-format=FFORMAT             બંધારણ થયેલ માહિતીનો રેકોર્ડ કરો/વગાડો.\n"
 "      --list-file-formats               ઉપલ્બધ ફાઇલ બંધારણોની યાદી.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1424,168 +1456,169 @@ msgstr ""
 "libpulse %s સાથે કમ્પાઇલ થયેલ છે\n"
 "libpulse %s સાથે કડી થયેલ છે\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "અયોગ્ય ક્લાઇન્ટ નામ '%s'"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "અયોગ્ય સ્ટ્રીમ નામ '%s'"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "અયોગ્ય ચેનલ મેપ '%s'"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "અયોગ્ય ગુપ્તતા સ્પષ્ટીકરણ '%s'"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "અયોગ્ય પ્રક્રિયા સમય સ્પષ્ટીકરણ '%s'"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "અયોગ્ય ગુણધર્મ '%s'"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "અજ્ઞાત ફાઇલ બંધારણ %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "અયોગ્ય નમૂના સ્પષ્ટીકરણ"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "ઘણી બધી દલીલો છે."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "ફાઇલ માટે નમૂના સ્પષ્ટીકરણ ને ઉત્પન્ન કરવામાં નિષ્ફળ."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "સાઉન્ડ ફાઇલને ખોલવામાં નિષ્ફળતા."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
 msgstr "ચેતવણી: સ્પષ્ટ થયેલ નમૂના સ્પષ્ટીકરણ ફાઇલ માંથી સ્પષ્ટીકરણ સાથે ઉપર લખાયેલ હશે."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "ફાઇલ માંથી નમૂના સ્પષ્ટીકરણને નક્કી કરવામાં નિષ્ફળતા."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "ચેતવણી: ફાઇલમાંથી ચેનલ મેપને નક્કી કરવામાં નિષ્ફળતા."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "ચેનલ મેપ એ સ્પષ્ટીકરણ નમૂનાને બંધબેસતુ નથી"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "ચેતણી: ફાઇલમાં ચેનલ મેપને લખવામાં નિષ્ફળતા."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "નમૂના સ્પષ્ટીકરણ '%s' અને ચેનલ નક્ષા '%s' સાથે %s સ્ટ્રીમને ખોલી રહ્યા છે."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "રેકોર્ડ કરી રહ્યા છે"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "પ્લેબેક"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() નિષ્ફળ."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() નિષ્ફળ."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() નિષ્ફળ."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() નિષ્ફળ: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_new() નિષ્ફળ."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() નિષ્ફળ."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "થોડા સમય માટે બંધ કરવા માટે નિષ્ફળતા: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "ફરી શરૂ કરવામાં નિષ્ફળતા: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "ચેતવણી: સાઉન્ડ સર્વર એ સ્થાનિક નથી, થોડા સમય માટે બંધ કરવામાં આવ્યુ નથી.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "જોડાણ નિષ્ફળ: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "SIGINT મળ્યુ, બહાર નીકળી રહ્યા છે.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "ચેતવણી: બાળ પ્રક્રિયાનો સંકેત %u દ્દારા અંત આવેલ છે\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1603,7 +1636,7 @@ msgstr ""
 "  -s, --server=SERVER                   જોડાવવા માટે સર્વરનું નામ\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1614,50 +1647,61 @@ msgstr ""
 "libpulse %s સાથે કમ્પાઇલ થયેલ છે\n"
 "libpulse %s સાથે કડી થયેલ છે\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() નિષ્ફળ.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() નિષ્ફળ.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() નિષ્ફળ.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "પરિસ્થિતિઓને મેળવવામાં નિષ્ફળતા: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "હાલમાં વપરાશમાં છે: %u બ્લોકો %s કુલ બાઇટોને સમાવી રહ્યા છે.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "આખી જીંદગી દરમ્યાન ફાળવેલ છે: %u બ્લોકો %s કુલ બાઇટોને સમાવી રહ્યા છે.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "નમૂના કેશ માપ: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "સર્વર જાણકારી મેળવવામાં નિષ્ફળતા: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1665,7 +1709,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "વપરાશકર્તા નામ: %s\n"
 "યજમાન નામ: %s\n"
@@ -1677,12 +1721,12 @@ msgstr ""
 "મૂળભૂત સ્ત્રોત: %s\n"
 "કુકી: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "સિંક જાણકારી મેળવવામાં નિષ્ફળતા: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1721,22 +1765,22 @@ msgstr ""
 "\tગુણધર્મો:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tપોર્ટો:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tસક્રિય પોર્ટ: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "સ્ત્રોત જાણકારીને મેળવવામાં નિષ્ફળતા: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1775,20 +1819,20 @@ msgstr ""
 "\tગુણધર્મો:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n/a"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "મોડ્યુલની જાણકારી મેળવવામાં નિષ્ફળતા: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1805,12 +1849,12 @@ msgstr ""
 "\tગુણધર્મો:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "ક્લાઇન્ટ જાણકારી મેળવવામાં નિષ્ફળતા: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1825,12 +1869,12 @@ msgstr ""
 "\tગુણધર્મો:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "કાર્ડ જાણકારી મેળવવામાં નિષ્ફળતા: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1847,22 +1891,22 @@ msgstr ""
 "\tગુણધર્મો:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tરૂપરેખાઓ:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tસક્રિય રૂપરેખા: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "સિંક ઇનપુટ જાણકારી મેળવવામાં નિષ્ફળતા: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1899,12 +1943,12 @@ msgstr ""
 "\tગુણધર્મો:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "સ્ત્રોત આઉટપુટ જાણકારી મેળવવામાં નિષ્ફળ: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1933,12 +1977,12 @@ msgstr ""
 "\tગુણધર્મો:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "નમૂના જાણકારી મેળવવામાં નિષ્ફળ: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1969,26 +2013,80 @@ msgstr ""
 "\tગુણધર્મો:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "નિષ્ફળતા: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "નમૂનાને અપલોડ કરવામાં નિષ્ફળ: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "ફાઇલનો નિયત સમય પહેલા અંત"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "અયોગ્ય સર્વર"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT મળ્યુ, બહાર નીકળી રહ્યા છે."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2011,6 +2109,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2050,7 +2149,7 @@ msgstr ""
 "  -n, --client-name=NAME                How to call this client on the "
 "server\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2061,103 +2160,106 @@ msgstr ""
 "libpulse %s સાથે કમ્પાઇલ થયેલ છે\n"
 "libpulse %s સાથે કડી થયેલ છે\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "મહેરબાની કરીને લોડ કરવા માટે નમૂના ફાઇલને સ્પષ્ટ કરો"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "સાઉન્ડ ફાઇલને ખોલવામાં નિષ્ફળ."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "ચેતવણી: ફાઇલ માંથી નમૂના સ્પષ્ટીકરણ કરવાનું નક્કી કરવામાં નિષ્ફળ."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "વગાડવા માટે તમારે નમૂના નામને સ્પષ્ટ કરવુ જ પડશે"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "દૂર કરવા માટે તમારે નમૂના નામને સ્પષ્ટ કરવુ જ પડશે"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "સિંક ઇનપુટ અનુક્રમણિકા અને સિંકને તમારે સ્પષ્ટ કરવુ જ પડશે"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "તમારે સ્ત્રોત આઉટપુટ અનુક્રમણિકા અને સ્ત્રોતને સ્પષ્ટ કરવુ જ પડશે"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "તમારે મોડ્યુલ નામ અને દલીલોને સ્પષ્ટ કરવુ જ પડશે."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "તમારે મોડ્યુલ અનુક્રમણિકાને સ્પષ્ટ કરવુ જ પડશે"
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
-msgstr "તમે એક સિંક કરતા વધારે સ્પષ્ટ કરી શકશો નહિં. તમારે બુલિયન કિંમતને સ્પષ્ટ કરવુ જ પડશે."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
+msgstr ""
+"તમે એક સિંક કરતા વધારે સ્પષ્ટ કરી શકશો નહિં. તમારે બુલિયન કિંમતને સ્પષ્ટ કરવુ જ પડશે."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr "તમે એક સ્ત્રોત કરતા વધારે સ્પષ્ટ કરી શકશો નહિં. તમારે બુલિયન કિંમતને સ્પષ્ટ કરવુ જ પડશે."
+msgstr ""
+"તમે એક સ્ત્રોત કરતા વધારે સ્પષ્ટ કરી શકશો નહિં. તમારે બુલિયન કિંમતને સ્પષ્ટ કરવુ જ પડશે."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "તમારે કાર્ડ નામ/અનુક્રમણિકા અને પોર્ટ નામને સ્પષ્ટ કરવુ જ પડશે"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "તમારે કાર્ડ નામ/અનુક્રમણિકા અને પોર્ટ નામને સ્પષ્ટ કરવુ જ પડશે"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "તમારે કાર્ડ નામ/અનુક્રમણિકા અને પોર્ટ નામને સ્પષ્ટ કરવુ જ પડશે"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "તમારે કાર્ડ નામ/અનુક્રમણિકા અને વોલ્યુમને સ્પષ્ટ કરવુ જ પડશે"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "અયોગ્ય નમૂના સ્પષ્ટીકરણ"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "તમારે કાર્ડ નામ/અનુક્રમણિકા અને વોલ્યુમ સ્પષ્ટ કરવુ જ પડશે"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "સિંક ઇનપુટ અનુક્રમણિકા અને વોલ્યુમને તમારે સ્પષ્ટ કરવુ જ પડશે"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "અયોગ્ય સિંક ઇનપુટ અનુક્રમણિકા"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "તમારે સિંક નામ/અનુક્રમણિકા અને મૂંગા બુલિયનને સ્પષ્ટ કરવુ જ પડશે"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "તમારે સિંક નામ/અનુક્રમણિકા અને મૂંગા બુલિયનને સ્પષ્ટ કરવુ જ પડશે"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "સિંક ઇનપુટ અનુક્રમણિકા અને મૂંગા બુલિયનને તમારે સ્પષ્ટ કરવુ જ પડશે"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "અયોગ્ય ઇનપુટ અનુક્રમણિકા સ્પષ્ટીકરણ"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "યોગ્ય આદેશ સ્પષ્ટ થયેલ નથી."
 
@@ -2240,44 +2342,44 @@ msgstr "કુકી માહિતીને લોડ કરવામાં 
 msgid "Not yet implemented.\n"
 msgstr "હજુ અમલીકરણ થયેલ નથી.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr "PulseAudio ડિમન ચાલી રહ્યુ નથી, અથવા સત્ર ડિમન તરીકે ચાલી રહ્યુ નથી."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "PulseAudio ડિમનને મારવામાં નિષ્ફળ."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "ડિમન એ જવાબ આપતુ નથી."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "autospawn તાળાને દાખલ કરી શકાતુ નથી."
 
@@ -2316,38 +2418,42 @@ msgstr ""
 "છે અથવા બીજી કિંમત < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "બંધ"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "High Fidelity Playback (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "High Fidelity Capture (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Telephony Duplex (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio સાઉન્ડ સર્વર"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "આઉટપુટ ઉપકરણો"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "ઇનપુટ ઉપકરણો"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "@HOSTNAME@ પર ઓડિયો"
 
@@ -2411,133 +2517,159 @@ msgstr "પરિવર્ધક"
 msgid "No Amplifier"
 msgstr "પરિવર્ધક નથી"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "બુસ્ટ"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "બુસ્ટ નથી"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "ઍનલૉગ હૅડફોનો"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "ઍનલૉગ ઇનપુટ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "ઍનલૉગ માઇક્રોફોન"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "ઍનલૉગ લાઇન-ઇન"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "ઍનલૉગ રેડિયો"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "ઍનલૉગ વિડિયો"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "ઍનલૉગ આઉટપુટ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "ઍનલૉગ હૅડફોનો"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "ઍનલૉગ આઉટપુટ (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "ઍનલૉગ મોનો આઉટપુટ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "ઍનલૉગ સ્ટેરિઓ"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "ઍનલૉગ મોનો"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "ઍનલૉગ સ્ટેરિઓ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "ઍનલૉગ સરાઉન્ડ 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "ઍનલૉગ સરાઉન્ડ 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "ઍનલૉગ સરાઉન્ડ 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "ઍનલૉગ સરાઉન્ડ 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "ઍનલૉગ સરાઉન્ડ 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "ઍનલૉગ સરાઉન્ડ 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "ઍનલૉગ સરાઉન્ડ 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "ઍનલૉગ સરાઉન્ડ 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "ઍનલૉગ સરાઉન્ડ 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "ઍનલૉગ સરાઉન્ડ 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "ઍનલૉગ સરાઉન્ડ 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "ડિજિટલ સ્ટેરિઓ (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "ડિજિટલ સરાઉન્ડ 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "ડિજિટલ સરાઉન્ડ 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "ડિજિટલ સરાઉન્ડ 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "ડિજિટલ સ્ટેરિઓ (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "ઍનલૉગ મોનો ડુપ્લેક્ષ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "ઍનલૉગ સ્ટેરિઓ ડુપ્લેક્ષ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "ડિજિટલ સ્ટેરિઓ ડુપ્લેક્ષ (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Low Frequency Emmiter"
diff --git a/po/he.po b/po/he.po
index e1e3c08..6231bd6 100644
--- a/po/he.po
+++ b/po/he.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-29 12:48+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: \n"
 "Last-Translator: Elad <el.il at doom.co.il>\n"
 "Language-Team: Hebrew <fedora-he-list at redhat.com>\n"
@@ -13,31 +13,36 @@ msgstr ""
 "X-Poedit-Language: Hebrew\n"
 "X-Poedit-Country: Israel\n"
 
-#: ../src/modules/alsa/alsa-util.c:858
-#: ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
-"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
+"ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
-"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
+"lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
-"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
 
 #: ../src/modules/module-always-sink.c:39
@@ -53,7 +58,12 @@ msgid "Virtual LADSPA sink"
 msgstr ""
 
 #: ../src/modules/module-ladspa-sink.c:53
-msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
+msgid ""
+"sink_name=<name for the sink> sink_properties=<properties for the sink> "
+"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
+"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
+"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
+"input control values>"
 msgstr ""
 
 #: ../src/modules/module-null-sink.c:55
@@ -64,11 +74,11 @@ msgstr ""
 msgid "Null Output"
 msgstr ""
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "צליל פנימי"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "מודם"
 
@@ -84,285 +94,311 @@ msgstr ""
 msgid "Failed to add bind-now-loader."
 msgstr ""
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr ""
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "יוצא."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr ""
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr ""
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr ""
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr ""
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr ""
 
-#: ../src/daemon/main.c:208
-#: ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr ""
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr ""
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr ""
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr ""
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr ""
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr ""
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:571
-msgid "This program is not intended to be run as root (unless --system is specified)."
+#: ../src/daemon/main.c:662
+msgid ""
+"This program is not intended to be run as root (unless --system is "
+"specified)."
 msgstr ""
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr ""
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr ""
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr ""
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr ""
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr ""
 
-#: ../src/daemon/main.c:627
+#: ../src/daemon/main.c:726
 #, c-format
-msgid "pipe failed: %s"
+msgid "pipe() failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:646
-#: ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr ""
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr ""
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, c-format
+msgid "setsid() failed: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr ""
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr ""
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr ""
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr ""
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr ""
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, c-format
+msgid "Running in VM: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr ""
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr ""
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr ""
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr ""
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr ""
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr ""
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr ""
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr ""
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr ""
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr ""
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr ""
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
-"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
-"If you do it nonetheless then it's your own fault if things don't work as expected.\n"
-"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."
+"OK, so you are running PA in system mode. Please note that you most likely "
+"shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as "
+"expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
+"explanation why system mode is usually a bad idea."
 msgstr ""
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr ""
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr ""
 
-#: ../src/daemon/main.c:821
-msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
+#: ../src/daemon/main.c:922
+msgid ""
+"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
+"resolution timers enabled!"
 msgstr ""
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr ""
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr ""
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr ""
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr ""
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr ""
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr ""
 
@@ -377,37 +413,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"
@@ -418,10 +465,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"
@@ -436,7 +485,9 @@ msgid "--fail expects boolean argument"
 msgstr ""
 
 #: ../src/daemon/cmdline.c:264
-msgid "--log-level expects log level argument (either numeric in range 0..4 or one of 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 ""
 
 #: ../src/daemon/cmdline.c:276
@@ -533,76 +584,83 @@ msgstr ""
 msgid "Path: %s\n"
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr ""
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:562
-msgid "The specified default channel map has a different number of channels than the specified default number of channels."
+#: ../src/daemon/daemon-conf.c:602
+msgid ""
+"The specified default channel map has a different number of channels than "
+"the specified default number of channels."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr ""
@@ -619,8 +677,7 @@ msgstr "מערכת הקול PulseAudio"
 msgid "Start the PulseAudio Sound System"
 msgstr "התחל את מערכת הקול PulseAudio"
 
-#: ../src/pulse/channelmap.c:105
-#: ../src/pulse/channelmap.c:757
+#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757
 msgid "Mono"
 msgstr "מונו"
 
@@ -649,7 +706,7 @@ msgid "Rear Right"
 msgstr "ימני אחורי"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
+msgid "Subwoofer"
 msgstr ""
 
 #: ../src/pulse/channelmap.c:117
@@ -824,12 +881,9 @@ msgstr "עליון שמאלי אחורי"
 msgid "Top Rear Right"
 msgstr "עליון ימני אחורי"
 
-#: ../src/pulse/channelmap.c:484
-#: ../src/pulse/sample.c:170
-#: ../src/pulse/volume.c:295
-#: ../src/pulse/volume.c:321
-#: ../src/pulse/volume.c:341
-#: ../src/pulse/volume.c:371
+#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170
+#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321
+#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371
 msgid "(invalid)"
 msgstr "(לא תקף)"
 
@@ -990,8 +1044,7 @@ msgstr ""
 msgid "%u B"
 msgstr ""
 
-#: ../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 ""
 
@@ -999,192 +1052,190 @@ msgstr ""
 msgid "Failed to parse cookie data"
 msgstr ""
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr ""
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr ""
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr ""
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr ""
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr ""
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr ""
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr ""
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:237
-#: ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr ""
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr ""
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr ""
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr ""
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr ""
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "לא"
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:470
-#: ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr ""
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr ""
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr ""
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:609
+#: ../src/utils/pacat.c:630
 #, c-format
 msgid ""
 "%s [options]\n"
@@ -1197,35 +1248,58 @@ 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, s24le, s24be,\n"
-"                                        s24-32le, s24-32be (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, "
+"s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to "
+"s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, "
+"2 for stereo\n"
 "                                        (defaults to 2)\n"
-"      --channel-map=CHANNELMAP          Channel map to use instead of the default\n"
-"      --fix-format                      Take the sample format from the sink 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"
-"      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
+"      --no-remap                        Map channels by index instead of "
+"name.\n"
+"      --latency=BYTES                   Request the specified latency in "
+"bytes.\n"
+"      --process-time=BYTES              Request the specified process time "
+"per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the "
+"specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1233,183 +1307,181 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:764
-#: ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr ""
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr ""
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr ""
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr ""
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr ""
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr ""
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr ""
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr ""
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr ""
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr ""
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr ""
 
-#: ../src/utils/pacat.c:959
-msgid "Warning: specified sample specification will be overwritten with specification from file."
+#: ../src/utils/pacat.c:1000
+msgid ""
+"Warning: specified sample specification will be overwritten with "
+"specification from file."
 msgstr ""
 
-#: ../src/utils/pacat.c:962
-#: ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr ""
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr ""
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr ""
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr ""
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "מקליט"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "× ×’×™× ×”"
 
-#: ../src/utils/pacat.c:1035
-#: ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr ""
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr ""
 
-#: ../src/utils/pacat.c:1061
-#: ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr ""
 
-#: ../src/utils/pacat.c:1069
-#: ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr ""
 
-#: ../src/utils/pacat.c:1082
-#: ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr ""
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
-"  -s, --server=SERVER                   The name of the server to connect to\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
 "\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1417,50 +1489,61 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr ""
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr ""
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
+#, c-format
+msgid ""
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
 #, c-format
 msgid ""
-"User name: %s\n"
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1468,15 +1551,15 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr ""
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1498,24 +1581,22 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:268
-#: ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:274
-#: ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr ""
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1537,28 +1618,20 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:345
-#: ../src/utils/pactl.c:401
-#: ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473
-#: ../src/utils/pactl.c:532
-#: ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543
-#: ../src/utils/pactl.c:587
-#: ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594
-#: ../src/utils/pactl.c:637
-#: ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "לא זמין"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr ""
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1569,12 +1642,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr ""
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1584,12 +1657,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr ""
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1600,22 +1673,22 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tפרופילים:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr ""
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1636,12 +1709,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr ""
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1658,12 +1731,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr ""
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1681,26 +1754,78 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:653
-#: ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "כשל: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr ""
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr ""
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+msgid "server"
+msgstr ""
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr ""
 
-#: ../src/utils/pactl.c:869
+#: ../src/utils/pactl.c:961
 #, c-format
 msgid ""
 "%s [options] stat\n"
@@ -1724,15 +1849,18 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\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:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1740,104 +1868,104 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr ""
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr ""
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr ""
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr ""
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr ""
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr ""
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr ""
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr ""
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr ""
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 
-#: ../src/utils/pactl.c:1103
-msgid "You may not specify more than one source. You have to specify a boolean value."
+#: ../src/utils/pactl.c:1196
+msgid ""
+"You may not specify more than one source. You have to specify a boolean "
+"value."
 msgstr ""
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr ""
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr ""
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr ""
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr ""
 
-#: ../src/utils/pactl.c:1154
-#: ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193
-#: ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226
-#: ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr ""
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr ""
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr ""
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr ""
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr ""
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr ""
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr ""
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr ""
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr ""
 
@@ -1848,7 +1976,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 ""
 
@@ -1912,101 +2041,106 @@ msgstr ""
 msgid "Not yet implemented.\n"
 msgstr ""
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr ""
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr ""
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr ""
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr ""
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr ""
 
-#: ../src/utils/pacmd.c:171
-#: ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr ""
 
-#: ../src/utils/pacmd.c:207
-#: ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr ""
 
-#: ../src/pulsecore/lock-autospawn.c:136
-#: ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-sink.c:530
-#: ../src/modules/alsa/alsa-sink.c:689
+#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
 #, c-format
 msgid ""
-"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
-"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
+"ALSA woke us up to write new data to the device, but there was actually "
+"nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-source.c:506
-#: ../src/modules/alsa/alsa-source.c:656
+#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
 #, c-format
 msgid ""
-"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
-"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
+"ALSA woke us up to read new data from the device, but there was actually "
+"nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
 msgstr ""
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "מכובה"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr ""
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr ""
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr ""
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "שרת הקול PulseAudio"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "התקני פלט"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "התקני קלט"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr ""
 
@@ -2070,134 +2204,154 @@ msgstr "מגבר"
 msgid "No Amplifier"
 msgstr "אין מגבר"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+msgid "Bass Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+msgid "No Bass Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "אוזניות אנלוגיות"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "קלט אנלוגי"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "מיקרופון אנלוגי"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "קו נכנס אנלוגי"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "רדיו אנלוגי"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "וידאו אנלוגי"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "פלט אנלוגי"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "אוזניות אנלוגיות"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "פלט אנלוגי (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "פלט מונו אנלוגי"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "סטראו אנלוגי"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984
-#: ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "מונו אנלוגי"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "סטראו אנלוגי"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "סראונד אנלוגי 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "סראונד אנלוגי 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "סראונד אנלוגי 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "סראונד אנלוגי 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "סראונד אנלוגי 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "סראונד אנלוגי 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "סראונד אנלוגי 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "סראונד אנלוגי 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "סראונד אנלוגי 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "סראונד אנלוגי 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "סראונד אנלוגי 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "סטראו דיגיטלי (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "סראונד דיגיטלי 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "סראונד דיגיטלי 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "סראונד דיגיטלי 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "סטראו דיגיטלי (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "מונו אנלוגי משולב"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "סטראו אנלוגי משולב"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "סטראו דיגיטלי משולב (IEC958)"
-
diff --git a/po/hi.po b/po/hi.po
index 5ebd929..cb2b048 100644
--- a/po/hi.po
+++ b/po/hi.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-13 03:15+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-11-13 15:42+0530\n"
 "Last-Translator: Rajesh Ranjan <rajesh672 at gmail.com>\n"
 "Language-Team: Hindi <hindi.sf.net>\n"
@@ -15,7 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11.4\n"
-"Plural-Forms: nplurals=2; plural=(n!=1);\n\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"\n"
 "\n"
 "\n"
 "\n"
@@ -23,12 +24,12 @@ msgstr ""
 "\n"
 "\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -40,7 +41,7 @@ msgstr ""
 "अधिक संभव है कि यह ALSA ड्राइवर '%s' में एक बग है. इस मुद्दे को ALSA डेवलेपर को रिपोर्ट "
 "करें."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -52,7 +53,7 @@ msgstr ""
 "अधिक संभव है कि यह ALSA ड्राइवर '%s' में एक बग है. इस मुद्दे को ALSA डेवलेपर को रिपोर्ट "
 "करें."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -99,11 +100,11 @@ msgstr "क्लॉक्ड रिक्त सिंक"
 msgid "Null Output"
 msgstr "रिक्त आउटपुट"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "आंतरिक ऑडियो"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "मॉडेम"
 
@@ -119,246 +120,268 @@ msgstr "नया dl लोडर आबंटित करने में व
 msgid "Failed to add bind-now-loader."
 msgstr "bind-now-loader जोड़ने में विफल."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "%s संकेत पाया."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "बाहर हो रहा है."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "'%s' उपयोक्ता ढूंढ़ने में विफल."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "'%s' समूह ढूंढ़ने में विफल."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "'%s' (UID %lu) उपयोक्ता व '%s' (GID %lu) समूह पाया."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "'%s' उपयोक्ता और '%s' समूह का GID मेल नहीं खाता है"
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "'%s' उपयोक्ता की घर निर्देशिका '%s' नहीं है, अनदेखा कर रहा है."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "'%s' बनाने में विफल: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "समूह सूची पाने में विफल: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "GID बदलने में विफल: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "UID बदलने में विफल: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "रूट अधिकार सफलतापूर्वक छोड़ा."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "इस प्लैटफॉर्म पर असमर्थित तंत्र व्यापक विधि."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) विफल: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "कमांड लाइन विश्लेषण में विफल."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "डेमॉन नहीं कार्यशील"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "डेमॉन बतौर PID %u चल रहा है"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "डेमॉन हटाने में विफल: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
-msgstr "यह प्रोग्राम बतौर रूट चलाने के लिए इच्छित नहीं है (unless --system is specified)."
+msgstr ""
+"यह प्रोग्राम बतौर रूट चलाने के लिए इच्छित नहीं है (unless --system is specified)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "रूट अधिकार जरूरी."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start not supported for system instances."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "तंत्र मोड में चल रहा है, लेकिन --disallow-exit सेट नहीं!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr "तंत्र मोड में चल रहा है, लेकिन --disallow-module-loading सेट नहीं!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "तंत्र मोड में चल रहा है, SHM मोड बाध्य रूप से निष्क्रिय!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr "तंत्र मोड में चल रहा है, निकास निष्क्रिय समय बाध्य रूप से निष्क्रिय!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "stdio पाने में विफल."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "पाइप विफल: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() विफल: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() विफल: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "डेमॉन आरंभ विफल."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "डेमॉन आरंभ सफल."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() विफल: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "यह पल्सऑडियो %s है."
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Compilation host: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "Compilation CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "मेजबान पर चल रहा है: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u CPU पाया."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "पृष्ठ आकार %lu बाइट है."
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "वेलग्रिंड समर्थन से कंपाइल: हाँ"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "वेलग्रिंड समर्थन से कंपाइल: नहीं"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "वेलग्रिंड विधि में चल रहा है: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "मेजबान पर चल रहा है: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "अनुकूलित बिल्ड: हाँ"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "अनुकूलित बिल्ड: नहीं"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG परिभाषित, सभी निष्क्रिय."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH परिभाषित, केव तेज पथ एसर्ट निष्क्रिय."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "सभी एसर्ट सक्षम."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "मशीन ID पाने में विफल"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "मशीन ID %s है."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "सत्र ID %s है."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "रनटाइम निर्देशिका %s का प्रयोग कर रहा है."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "स्टेट निर्देशिका %s का प्रयोग कर रहा है."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "मॉड्यूल निर्देशिका %s का प्रयोग कर रहा है."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "तंत्र मोड में चल रहा है: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -372,41 +395,42 @@ msgstr ""
 "कृपया http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode को पढ़ें जानने के लिए "
 "कि क्यों तंत्र मोड एक बढ़िया विचार नहीं है."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() विफल."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "ताज़ा उच्च विभेदन टाइमर उपलब्ध! आनंद लें!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
-msgstr "आपका कर्नेल बुरी स्थिति में है! सलाह है कि उच्च विभेदन युक्त लिनक्स सक्रिय किया जाना चाहिए!"
+msgstr ""
+"आपका कर्नेल बुरी स्थिति में है! सलाह है कि उच्च विभेदन युक्त लिनक्स सक्रिय किया जाना चाहिए!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() विफल."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "डेमॉन आरंभ करने में विफल."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "बिना लोड मॉड्यूल के डेमॉन आरंभ, काम करने से अस्वीकार कर रहा है."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "डेमॉन आरंभन पूर्ण."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "डेमॉन बन्द किया जाना आरंभ."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "डेमॉन अवरोधित."
 
@@ -663,72 +687,77 @@ msgstr "अवमूल्यन चेतावनी: %s\n"
 msgid "Path: %s\n"
 msgstr "पथ: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] अवैध लॉग लक्ष्य '%s'."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] अवैध लॉग स्तर '%s'."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] अवैध पुनः नमूना विधि '%s'."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] अवैध rlimit '%s'."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit इस प्लेटफॉर्म पर समर्थित नहीं."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] अवैध प्रतिदर्श प्रारूप '%s'."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] अवैध प्रतिदर्श दर '%s'."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] अवैध प्रतिदर्श चैनल '%s'."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] अवैध चैनल मानचित्र '%s'."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] टुकड़े '%s' की अवैध संख्या."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] अवैध खंड आकार '%s'."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] अवैध नाइस स्तर '%s'."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] अवैध प्रतिदर्श दर '%s'."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "विन्यास फ़ाइल खोलने में विफल: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -736,7 +765,7 @@ msgstr ""
 "निर्दिष्ट तयशुदा चैनल मानचित्र के पास चैनल की भिन्न संख्या है चैनल की तयशुदा निर्दिष्ट संख्या "
 "के बनिस्पत."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### विन्यास फ़ाइल से पढ़ें: %s ###\n"
@@ -782,8 +811,8 @@ msgid "Rear Right"
 msgstr "पश्च दाहिना"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "निम्न आवृत्ति निकासकर्ता"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1128,191 +1157,191 @@ msgstr "XOpenDisplay() विफल"
 msgid "Failed to parse cookie data"
 msgstr "कुकी आंकड़ा के विश्लेषण में विफल"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "विन्यास फ़ाइल '%s' खोलने में विफल: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "कोई कुकी नहीं लोड किया गया. इसके बिना कनेक्ट करने की कोशिश कर रहा हूँ."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "अज्ञात विस्तार '%s' के लिए संदेश प्राप्त"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "स्ट्रीम से खींचने में विफल: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "प्लेबैक स्ट्रीम खत्म."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "सर्वर में कनेक्शन ले जा रहा है."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() विफल: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() विफल: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() विफल: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "स्ट्रीम सफलतापूर्वक निर्मित."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() विफल: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "बफ़र मेट्रिक्स: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "बफ़र मेट्रिक्स: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "नमूना स्पेक '%s' का प्रयोग, चैनल मैप '%s'."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "युक्ति %s (%u, %ssuspended) से कनेक्टेड."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "स्ट्रीम त्रुटि: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "स्ट्रीम युक्ति स्थगित.%s "
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "स्ट्रीम युक्ति पुनर्बहाल.%s "
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "स्ट्रीम अंडररन.%s "
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "स्ट्रीम ओवररन.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "स्ट्रीम आरंभ.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "स्ट्रीम युक्ति %s (%u, %ssuspended).%s में खिसकाया गया"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "नहीं "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "स्ट्रीम बफ़र गुण परिवर्तित.%s "
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "कनेक्शन स्थापित.%s "
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() विफल: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() विफल: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() विफल: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "कनेक्शन विफल.%s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "EOF पाया."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() विफल: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "संकेत पाया, निकल रहा है."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "लेटेंसी पाने में विफल: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "समय: %0.3f सेकेंड; लैटेंसी: %0.0f usec."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() विफल: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1364,10 +1393,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [options]\n"
@@ -1426,7 +1459,7 @@ msgstr ""
 "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1437,168 +1470,169 @@ msgstr ""
 "लिबपल्स %s के साथ कंपाइल\n"
 "लिबपल्स %s के साथ लिंक\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "अवैध क्लाइंट नाम '%s'"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "अवैध स्ट्रीम नाम '%s'"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "अवैध चैनल मानचित्र '%s'"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "अवैध लैटेंसी विनिर्दिष्टता '%s'"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "अवैध प्रक्रिया समय विनिर्दिष्टता '%s'"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "अवैध गुण '%s'"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "अज्ञात फ़ाइल प्रारूप %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "अवैध नमूना विनिर्दिष्टता"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "कई वितर्क."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "फ़ाइल के लिए नमूना विनिर्दिष्टता पाने में विफल."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "ध्वनि फ़ाइल खोलने में विफल."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
 msgstr "चेतावनी: निर्दिष्ट नमूना विनिर्दिष्टता को फ़ाइल की विनिर्दिष्टता से लिखा जाएगा."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "फ़ाइल से नमूना विनिर्दिष्टता निर्धारित करने में विफल."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "चेतावनी: फ़ाइल से चैनल मैप पाने में विफल."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "चैनल मैप नमूना विनिर्दिष्टता से मेल नहीं खाता है"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "चेतावनी: फ़ाइल में चैनल मैप लिखने में विफल."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "किसी %s स्ट्रीम को किसी नमूना विनिर्दिष्ता '%s' और चैनल मैप '%s' से खोल रहा है."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "रिकार्डिंग"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "प्लेबैक"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() विफल."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() विफल."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() विफल."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() विफल: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() विफल."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() विफल."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "स्थगन में विफल: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "पुनर्बहाली में विफल: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "चेतावनी: ध्वनि सर्वर स्थानीय नहीं है, स्थगित नहीं कर रहा है.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "कनेक्शन विफल.%s \n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "SIGINT पाया, निकल रहा है.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "चेतावनी: संतति प्रक्रिया %u संकेत से रूका\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1617,7 +1651,7 @@ msgstr ""
 "to\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1628,50 +1662,61 @@ msgstr ""
 "लिबपल्स %s से कंपाइल\n"
 "लिबपल्स %s से कड़ीबद्ध\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() विफल.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() विफल.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() विफल.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "आंकड़े पाने में विफल: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "प्रयोग में मुद्रा: %u ब्लॉक %s बाइट कुल समाहित करता है.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "संपूर्ण जीवनचक्र के दौरान आबंटित: %u ब्लॉक %s बाइट कुल को समाहित करता है.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "नमूना कैश आकार: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "सर्वर सूचना पाने में विफल: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1679,7 +1724,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "उपयोक्ता नाम: %s\n"
 "मेजबान नाम: %s\n"
@@ -1691,12 +1736,12 @@ msgstr ""
 "तयशुदा स्रोत: %s\n"
 "कुकी: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "सिंक सूचना पाने में विफल: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1735,22 +1780,22 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tPorts:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tActive Port: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "स्रोत सूचना पाने में विफल: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1789,20 +1834,20 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n/a"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "मॉड्यूल सूचना पाने में विफल: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1819,12 +1864,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "क्लाइंट सूचना पाने में विफल: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1839,12 +1884,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "कार्ड सूचना पाने में विफल: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1861,22 +1906,22 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tProfiles:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tActive Profile: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "सिंक इनपुट सूचना पाने में विफल: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1913,12 +1958,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "स्रोत आउटपुट सूचना पाने में विफल: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1947,12 +1992,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "नमूना सूचना पाने में विफल: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1983,26 +2028,80 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "विफलता: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "नमूना अफलोड करने में विफल: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "फ़ाइल का असामयिक अंत"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "अवैध सर्वर"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT पाया, निकल रहा है."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2025,6 +2124,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2064,7 +2164,7 @@ msgstr ""
 "  -n, --client-name=NAME                How to call this client on the "
 "server\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2075,47 +2175,49 @@ msgstr ""
 "लिबपल्स %s से कंपाइल\n"
 "लिबपल्स %s से कड़ीबद्ध\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "लोड करने के लिए किसी नमूना फ़ाइल निर्दिष्ट करें"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "ध्वनि फ़ाइल खोलने में विफल."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "%s स्ट्रीम को किसी नमूना विनिर्दिष्टता '%s' के साथ खोल रहा है."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "आपको किसी नमूना नाम को बजाने के लिए निर्दिष्ट करना है"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "आपको किसी नमूना नाम को हटाने के लिए निर्दिष्ट करना है"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "आपको किसी सिंक इनपुट सूची और सिंक को निर्दिष्ट करना है"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "आपको किसी सिंक स्रोत आउटपुट और स्रोत को निर्दिष्ट करना है"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "आपको किसी मॉड्यूल नाम और वितर्क को निर्दिष्ट करना है"
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "आपको किसी मॉड्यूल सूची को निर्दिष्ट करना है"
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
-msgstr "आप एक सिंक से अधिक निर्दिष्ट नहीं कर सकते हैं. आपको किसी बुलियन मान को निर्दिष्ट करना है."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
+msgstr ""
+"आप एक सिंक से अधिक निर्दिष्ट नहीं कर सकते हैं. आपको किसी बुलियन मान को निर्दिष्ट करना है."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
@@ -2123,57 +2225,57 @@ msgstr ""
 "आप एक स्रोत से अधिक निर्दिष्ट नहीं कर सकते हैं. आपको किसी बुलियन मान को निर्दिष्ट करना "
 "है."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "आपको किसी कार्ड नाम/सूची और प्रोफ़ाइल नाम को निर्दिष्ट करना है."
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "आपको किसी कार्ड नाम/सूची और पोर्ट नाम को निर्दिष्ट करना है."
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "आपको किसी स्रोत नाम/सूची और पोर्ट नाम को निर्दिष्ट करना है."
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "आपको किसी सिंक नाम/सूची और वाल्यूम को निर्दिष्ट करना है."
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "अवैध आयतन विनिर्दिष्टता"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "आपको किसी स्रोत नाम/सूची और आयतन को निर्दिष्ट करना है."
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "आपने किसी सिंक इनपुट सूची और आयतन को निर्दिष्ट किया है"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "अवैध सिंक इनपुट सूची"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "आपको किसी कार्ड नाम/सूची और मूक बुलियन नाम को निर्दिष्ट करना है."
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "आपको किसी स्रोत नाम/सूची और मूल बुलियन को निर्दिष्ट करना है."
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "आपने किसी सिंक इनपुट सूची और मूल बुलियन को निर्दिष्ट किया है"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "अवैध सिंक इनपुट सूची विनिर्दिष्टता"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "कोई वैध कमांड निर्दिष्ट नहीं."
 
@@ -2256,44 +2358,44 @@ msgstr "कुकी आंकड़ा लोड करने में वि
 msgid "Not yet implemented.\n"
 msgstr "अभी तक कार्यान्वित नहीं.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr "कोई पल्सऑडियो डेमॉन चल रहा है, या चयन डेमॉन के तहत चल रहा है."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "PulseAudio डेमॉन को मारने में विफल."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "डेमॉन प्रतिक्रिया नहीं दे रहा है."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "autospawn लॉक की पहुँच नहीं ले सकता है."
 
@@ -2332,38 +2434,42 @@ msgstr ""
 "दूसरा मान < min_avail दिया."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "बंद"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "उच्च विश्वसनीयतायुक्ति प्लेबैक (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "उच्च विश्वसनीयता कैप्चर (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "टेलिफोनी ड्यूप्लेक्स (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "पल्सऑडियो ध्वनि सर्वर"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "आउटपुट युक्ति"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "इनपुट युक्ति"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "@HOSTNAME@ पर ऑडियो"
 
@@ -2427,133 +2533,159 @@ msgstr "एंप्लीफायर"
 msgid "No Amplifier"
 msgstr "कोई एंप्लीफायर नहीं"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "बूस्ट"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "कोई बढ़ावा नहीं"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "एनालॉग हेडफोन"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "एनालॉग इनपुट"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "एनालॉग माइक्रोफोन"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "एनालॉग लाइन इन"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "एनालॉग रेडियो"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "एनालॉग वीडियो"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "एनालॉग आउटपुट"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "एनालॉग हेडफोन"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "एनालॉग आउटपुट (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "एनालॉग एकल आउटपुट"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "एनालॉग स्टीरियो"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "एनालॉग मोनो"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "एनालॉग स्टीरियो"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "एनालॉग सर्राउंड 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "एनालॉग सर्राउंड 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "एनालॉग सर्राउंड 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "एनालॉग सर्राउंड 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "एनालॉग सर्राउंड 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "एनालॉग सर्राउंड 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "एनालॉग सर्राउंड 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "एनालॉग सर्राउंड 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "एनालॉग सर्राउंड 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "एनालॉग सर्राउंड 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "एनालॉग सर्राउंड 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "डिजिटल स्टीरियो (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "डिजिटल सर्राउंड 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "डिजिटल सर्राउंड 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "डिजिटल सर्राउंड 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "डिजिटल सेटअप (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "एनालॉग एकल डुप्लेक्स"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "एनालॉग स्टीरियो डुप्लेक्स"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "डिजिटल स्टीरियो डुप्लेक्स (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "निम्न आवृत्ति निकासकर्ता"
diff --git a/po/hu.po b/po/hu.po
index a6d059e..6dae81e 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-17 04:45+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: \n"
 "Last-Translator: KAMI <kami911 at gmail.com>\n"
 "Language-Team: \n"
@@ -14,38 +14,49 @@ msgstr ""
 "X-Poedit-SourceCharset: utf-8\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ../src/modules/alsa/alsa-util.c:858
-#: ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
-"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
+"ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
-"A „snd_pcm_avail()” függvény visszatérési értéke váratlanul nagy értékű: %lu bájt (%lu ms).\n"
-"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé."
+"A „snd_pcm_avail()” függvény visszatérési értéke váratlanul nagy értékű: %lu "
+"bájt (%lu ms).\n"
+"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a "
+"problémát az ALSA fejlesztői felé."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
-"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
+"lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
-"A „snd_pcm_delay()” függvény visszatérési értéke váratlanul nagy értékű: %li bájt (%s%lu ms).\n"
-"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé."
+"A „snd_pcm_delay()” függvény visszatérési értéke váratlanul nagy értékű: %li "
+"bájt (%s%lu ms).\n"
+"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a "
+"problémát az ALSA fejlesztői felé."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
-"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
-"A „snd_pcm_mmap_begin()” függvény visszatérési értéke váratlanul nagy értékű: %lu bájt (%lu ms).\n"
-"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé."
+"A „snd_pcm_mmap_begin()” függvény visszatérési értéke váratlanul nagy "
+"értékű: %lu bájt (%lu ms).\n"
+"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a "
+"problémát az ALSA fejlesztői felé."
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
@@ -60,8 +71,18 @@ msgid "Virtual LADSPA sink"
 msgstr "Látszólagos LADSPA nyelő"
 
 #: ../src/modules/module-ladspa-sink.c:53
-msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
-msgstr "sink_name=<nyelő neve> sink_properties=<nyelő tulajdonságai> master=<szűrendő nyelő neve> format=<sample format> rate=<mintavételezési ráta> channels=<csatornák száma> channel_map=<csatornaleképzés> plugin=<ladspa bővítmény neve> label=<ladspa bővítmény címkéje> control=<bemenetszabályzó értékek vesszővel elválasztott listája>"
+msgid ""
+"sink_name=<name for the sink> sink_properties=<properties for the sink> "
+"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
+"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
+"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
+"input control values>"
+msgstr ""
+"sink_name=<nyelő neve> sink_properties=<nyelő tulajdonságai> "
+"master=<szűrendő nyelő neve> format=<sample format> rate=<mintavételezési "
+"ráta> channels=<csatornák száma> channel_map=<csatornaleképzés> "
+"plugin=<ladspa bővítmény neve> label=<ladspa bővítmény címkéje> "
+"control=<bemenetszabályzó értékek vesszővel elválasztott listája>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
@@ -71,11 +92,11 @@ msgstr "Órajelezett semmis nyelő"
 msgid "Null Output"
 msgstr "Semmis kimenet"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Belső hangforrás"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Modem"
 
@@ -91,288 +112,330 @@ msgstr "Nem foglalható le hely az új dl betöltő számára."
 msgid "Failed to add bind-now-loader."
 msgstr "Nem sikerült hozzáadni az azonnali betöltés csatolást."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Szignál: %s."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Kilépés."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Nem található a(z) „%s” felhasználó."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Nem található a(z) „%s” csoport."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Létező felhasználó „%s” (UID: %lu) és csoport „%s” (GID: %lu)."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
-msgstr "A(z) „%s” felhasználó GID azonosítója és „%s” csoportja nem egyezik meg."
+msgstr ""
+"A(z) „%s” felhasználó GID azonosítója és „%s” csoportja nem egyezik meg."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "A(z) „%s” felhasználó Saját mappája nem „%s”. Kihagyás."
 
-#: ../src/daemon/main.c:208
-#: ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Nem sikerült létrehozni a(z) „%s” fájlt: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "Nem sikerült megváltoztatni a csoportlistát: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "Nem sikerült megváltoztatni az GID azonosítót: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "Nem sikerült megváltoztatni az UID azonosítót: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "A rendszergazdai jogosultságok sikeresen visszaadva."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "A rendszer üzemmód nem támogatott ezen az operációs rendszeren."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) meghiúsult: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "Nem sikerült feldolgozni a parancssort."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "A démon nem fut."
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "A démon a következő PID azonosítóval fut: %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "A démon kilövése nem sikerült: %s"
 
-#: ../src/daemon/main.c:571
-msgid "This program is not intended to be run as root (unless --system is specified)."
-msgstr "Ez a program nincsen felkészítve arra, hogy rendszergazdai jogosultságokkal fusson (kivéve, ha a --system paraméter megadásra kerül)."
+#: ../src/daemon/main.c:662
+msgid ""
+"This program is not intended to be run as root (unless --system is "
+"specified)."
+msgstr ""
+"Ez a program nincsen felkészítve arra, hogy rendszergazdai jogosultságokkal "
+"fusson (kivéve, ha a --system paraméter megadásra kerül)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Rendszergazdai jogosultságok szükségesek."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start nem támogatott rendszer üzemmód használata esetén."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
-msgstr "Futtatás rendszer üzemmódban, de a --disallow-exit paraméter nincs beállítva."
+msgstr ""
+"Futtatás rendszer üzemmódban, de a --disallow-exit paraméter nincs beállítva."
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr "Futtatás rendszer üzemmódban, de a --disallow-module-loading paraméter nincs beállítva."
+msgstr ""
+"Futtatás rendszer üzemmódban, de a --disallow-module-loading paraméter nincs "
+"beállítva."
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "Futtatás rendszer üzemmódban, az SHM üzemmód forszírozott letiltása."
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
-msgstr "Futtatás rendszer üzemmódban, kilépés üresjárati időtúllépés esetén beállítás forszírozott letiltása."
+msgstr ""
+"Futtatás rendszer üzemmódban, kilépés üresjárati időtúllépés esetén "
+"beállítás forszírozott letiltása."
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
-msgstr "Nem sikerült jogot szerezni az alapértelmezett ki- és bemenetre (stdio)."
+msgstr ""
+"Nem sikerült jogot szerezni az alapértelmezett ki- és bemenetre (stdio)."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "Cső létrehozás meghiúsult: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "Programindítás meghiúsult: %s"
 
-#: ../src/daemon/main.c:646
-#: ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "Olvasás meghiúsult: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "A démon elindítása nem sikerült."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "A démon sikeresen elindult."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "Olvasás meghiúsult: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Összeépítő számítógép: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "Összeépítési CFLAGS jelzők: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "Kiszolgáló: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u CPU található a rendszerben."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "Oldalméret: %lu bájt"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Összeépítés Valgrind támogatással: Igen"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Összeépítés Valgrind támogatással: Nem"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Futás Valgrind üzemmódban: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "Kiszolgáló: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Optimalizált összeépítés: Igen"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Optimalizált összeépítés: Nem"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG megadva, minden érvényesítés letiltva."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH megadva, így csak a gyors útvonal-érvényesítés lesz letiltva."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "Minden érvényesítés engedélyezve."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "Nem sikerült lekérdezni a számítógép azonosítóját"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "Számítógép-azonosító: %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "Munkamenet-azonosító: %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "A futásidőben használt mappa: %s."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "Az állapottároló mappa: %s."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "A modulok mappája: %s."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Futás rendszer üzemmódban: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
-"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
-"If you do it nonetheless then it's your own fault if things don't work as expected.\n"
-"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."
+"OK, so you are running PA in system mode. Please note that you most likely "
+"shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as "
+"expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
+"explanation why system mode is usually a bad idea."
 msgstr ""
-"A PulseAudio rendszer üzemmódban fut. Általánosságban ezen üzemmód használata nem ajánlott.\n"
-"Ha mindenképpen ilyen üzemmódban kívánja futtatni a PulseAudio rendszert, ne lepődjön meg, ha egyes funkciók esetleg nem az elvárások szerint működnek.\n"
-"További tájékoztatás: http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode amelyből megtudhatja miért nem tanácsos a rendszer üzemmód használata."
-
-#: ../src/daemon/main.c:809
+"A PulseAudio rendszer üzemmódban fut. Általánosságban ezen üzemmód "
+"használata nem ajánlott.\n"
+"Ha mindenképpen ilyen üzemmódban kívánja futtatni a PulseAudio rendszert, ne "
+"lepődjön meg, ha egyes funkciók esetleg nem az elvárások szerint működnek.\n"
+"További tájékoztatás: http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode "
+"amelyből megtudhatja miért nem tanácsos a rendszer üzemmód használata."
+
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "A „pa_pid_file_create()” függvényhívás meghiúsult: %s"
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "A nagypontosságú időzítők elérhetőek."
 
-#: ../src/daemon/main.c:821
-msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
-msgstr "A nagypontosságú időzítők nem érhetőek el. Napjaink Linux rendszereiben érdemes engedélyezni a nagypontosságú időzítőket."
+#: ../src/daemon/main.c:922
+msgid ""
+"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
+"resolution timers enabled!"
+msgstr ""
+"A nagypontosságú időzítők nem érhetőek el. Napjaink Linux rendszereiben "
+"érdemes engedélyezni a nagypontosságú időzítőket."
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "A „pa_core_new()” függvényhívás meghiúsult: %s"
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "Nem sikerült előkészíteni a démont."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
-msgstr "A démont noha elindult, de nem töltött be modulokat, így a hangrendszer nem üzemképes."
+msgstr ""
+"A démont noha elindult, de nem töltött be modulokat, így a hangrendszer nem "
+"üzemképes."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "A démon elindítása sikeres."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "A démon leállítása kezdeményezve."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "A démon leállítva."
 
@@ -387,37 +450,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"
@@ -428,10 +502,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"
@@ -446,8 +522,13 @@ msgid "--fail expects boolean argument"
 msgstr "--fail paraméter logikai értéket vár el"
 
 #: ../src/daemon/cmdline.c:264
-msgid "--log-level expects log level argument (either numeric in range 0..4 or one of debug, info, notice, warn, error)."
-msgstr "--log-level paraméter a naplózás szintjének értékét várja el (Ez lehet a 0..4 számtartomány, vagy a következők egyike: debug, info, notice, warn, error)."
+msgid ""
+"--log-level expects log level argument (either numeric in range 0..4 or one "
+"of debug, info, notice, warn, error)."
+msgstr ""
+"--log-level paraméter a naplózás szintjének értékét várja el (Ez lehet a "
+"0..4 számtartomány, vagy a következők egyike: debug, info, notice, warn, "
+"error)."
 
 #: ../src/daemon/cmdline.c:276
 msgid "--high-priority expects boolean argument"
@@ -471,7 +552,9 @@ msgstr "--use-pid-file paraméter logikai értéket vár el"
 
 #: ../src/daemon/cmdline.c:321
 msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
-msgstr "Érvénytelen naplózási cél: használja a „syslog”, a „stderr” vagy az „auto” értéket."
+msgstr ""
+"Érvénytelen naplózási cél: használja a „syslog”, a „stderr” vagy az „auto” "
+"értéket."
 
 #: ../src/daemon/cmdline.c:328
 msgid "--log-time expects boolean argument"
@@ -543,76 +626,85 @@ msgstr "VISSZAVONÁSI FIGYELMEZTETÉS: %s\n"
 msgid "Path: %s\n"
 msgstr "Elérési útvonal: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Érvénytelen naplózási cél: „%s”."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Érvénytelen naplózási szint: „%s”."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Érvénytelen újramintavételezési eljárás: „%s”."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] Érvénytelen rlimit érték: „%s”."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] Az rlimit nem támogatott ezen az operációs rendszeren."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Érvénytelen mintavételi formátum: „%s”."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Érvénytelen mintavételi ráta: „%s”."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Érvénytelen minta csatornák: „%s”."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Érvénytelen csatornaleképzés: „%s”."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Érvénytelen a részek száma: „%s”."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Érvénytelen a részek mérete: „%s”."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Érvénytelen a prioritási érték: „%s”."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Érvénytelen mintavételi ráta: „%s”."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Nem sikerült megnyitni a konfigurációs fájlt: %s"
 
-#: ../src/daemon/daemon-conf.c:562
-msgid "The specified default channel map has a different number of channels than the specified default number of channels."
-msgstr "Az alapértelmezetten megadott mintavételi leírás csatornáinak száma eltér az alapértelmezetten megadott csatornaszámtól."
+#: ../src/daemon/daemon-conf.c:602
+msgid ""
+"The specified default channel map has a different number of channels than "
+"the specified default number of channels."
+msgstr ""
+"Az alapértelmezetten megadott mintavételi leírás csatornáinak száma eltér az "
+"alapértelmezetten megadott csatornaszámtól."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Olvasás a következő konfigurációs fájlból: %s ###\n"
@@ -629,8 +721,7 @@ msgstr "PulseAudio hangrendszer"
 msgid "Start the PulseAudio Sound System"
 msgstr "A PulseAudio hangrendszer elindítása"
 
-#: ../src/pulse/channelmap.c:105
-#: ../src/pulse/channelmap.c:757
+#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757
 msgid "Mono"
 msgstr "Mono"
 
@@ -659,8 +750,8 @@ msgid "Rear Right"
 msgstr "Hátsó jobb"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Mély-hangszóró (LFE)"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -834,12 +925,9 @@ msgstr "Felső hátsó bal"
 msgid "Top Rear Right"
 msgstr "Felső hátsó jobb"
 
-#: ../src/pulse/channelmap.c:484
-#: ../src/pulse/sample.c:170
-#: ../src/pulse/volume.c:295
-#: ../src/pulse/volume.c:321
-#: ../src/pulse/volume.c:341
-#: ../src/pulse/volume.c:371
+#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170
+#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321
+#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371
 msgid "(invalid)"
 msgstr "(Érvénytelen)"
 
@@ -1000,8 +1088,7 @@ msgstr "%0.1f KiB"
 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 "Az XOpenDisplay() függvényhívás meghiúsult."
 
@@ -1009,193 +1096,196 @@ msgstr "Az XOpenDisplay() függvényhívás meghiúsult."
 msgid "Failed to parse cookie data"
 msgstr "Nem sikerült feldolgozni a süti adatokat."
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Nem sikerült megnyitni a(z) „%s” konfigurációs fájlt: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
-msgstr "Nincs betölthető süti. Kísérlet a kapcsolat felvételére sütik használata nélkül."
+msgstr ""
+"Nincs betölthető süti. Kísérlet a kapcsolat felvételére sütik használata "
+"nélkül."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "Programindítás: %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "Üzenet érkezett az ismeretlen „%s” kiterjesztéstől"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Nem sikerült csatlakozni a következő adatfolyamhoz: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "A lejátszás adatfolyamához csatlakozva."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "Csatlakozás a kiszolgálóhoz kapcsolathoz."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "A „pa_stream_write()” függvényhívás meghiúsult: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "A „pa_stream_begin_write()” függvényhívás meghiúsult: %s"
 
-#: ../src/utils/pacat.c:237
-#: ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "A „pa_stream_peek()” függvényhívás meghiúsult: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Az adatfolyam sikeresen létrejött."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "A „pa_stream_get_buffer_attr()” függvényhívás meghiúsult: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
-msgstr "Pufferméretek: maximális nagyság: %u, hossz: %u, előpufferelés: %u, minimum: %u"
+msgstr ""
+"Pufferméretek: maximális nagyság: %u, hossz: %u, előpufferelés: %u, minimum: "
+"%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Pufferméretek: maximális nagyság: %u, részek mérete: %u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "Mintavételi leírás: „%s” és csatornaleképzés: „%s” használata."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Csatlakozva a következő eszközhöz: „%s” (%u, %ssuspended)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "Adatfolyam hiba: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Adatfolyam-eszköz készenléti állapotban: %s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "Adatfolyam-eszköz visszatért a készenléti állapotból: %s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "%s adatfolyam alulcsordulás."
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "%s adatfolyam túlcsordulás."
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "%s adatfolyam elindítva."
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
-msgstr "Az adatfolyam áthelyezve a következő eszközre: „%s” (%u, %ssuspended). %s"
+msgstr ""
+"Az adatfolyam áthelyezve a következő eszközre: „%s” (%u, %ssuspended). %s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "nem"
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Az adatfolyam-puffer beállításai megváltoztak: %s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "Kapcsolat létrehozva. %s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "A „pa_stream_new()” függvényhívás meghiúsult: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "A „pa_stream_connect_playback()” függvényhívás meghiúsult: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "A „pa_stream_connect_record()” függvényhívás meghiúsult: %s"
 
-#: ../src/utils/pacat.c:470
-#: ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Kapcsolódási hiba: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "A fájl vége elérve."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "Az írás sikertelen: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "Kilépés, szignál hatására…"
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "Nem sikerült lekérdezni a késleltetést: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Idő: %0.3f másodperc, késleltetés: %0.0f ezredmásodperc."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "A „pa_stream_update_timing_info()” függvényhívás meghiúsult: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1207,71 +1297,114 @@ 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, s24le, s24be,\n"
-"                                        s24-32le, s24-32be (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, "
+"s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to "
+"s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, "
+"2 for stereo\n"
 "                                        (defaults to 2)\n"
-"      --channel-map=CHANNELMAP          Channel map to use instead of the default\n"
-"      --fix-format                      Take the sample format from the sink 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"
-"      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
+"      --no-remap                        Map channels by index instead of "
+"name.\n"
+"      --latency=BYTES                   Request the specified latency in "
+"bytes.\n"
+"      --process-time=BYTES              Request the specified process time "
+"per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the "
+"specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [KAPCSOLÓ]\n"
 "\n"
 "  -h, --help                            Ezen súgó megjelenítése\n"
-"      --version                         Az alkalmazás verziószámának megjelenítése\n"
+"      --version                         Az alkalmazás verziószámának "
+"megjelenítése\n"
 "\n"
 "  -r, --record                          Kapcsolat létrehozása felvételhez\n"
 "  -p, --playback                        Kapcsolat létrehozása lejátszáshoz\n"
 "\n"
 "  -v, --verbose                         Történések részletezése\n"
 "\n"
-"  -s, --server=KISZOLGÁLÓ                   Kapcsolódás a megadott KISZOLGÁLÓ kiszolgálóhoz\n"
-"  -d, --device=ESZKÖZ                   Kapcsolódás az ESZKÖZ nevű nyelőhöz vagy forráshoz\n"
+"  -s, --server=KISZOLGÁLÓ                   Kapcsolódás a megadott "
+"KISZOLGÁLÓ kiszolgálóhoz\n"
+"  -d, --device=ESZKÖZ                   Kapcsolódás az ESZKÖZ nevű nyelőhöz "
+"vagy forráshoz\n"
 "  -n, --client-name=NÉV                A kliens neve ezen a szerveren\n"
 "      --stream-name=NÉV                Adatfolyam neve a kiszolgálón\n"
-"      --volume=HANGERŐ                   Kezdeti (lineáris) hangerő megadása a következő tartományban: 0...65536\n"
-"      --rate=MINTAVÉTEL                 Mintavételezés érzéke Hz-ben (alapértelmezés: 44100)\n"
-"      --format=MINTAFORMÁTUM             A mintavétel típusa a következőkből: s16le, s16be, u8, float32le,\n"
-"                                        float32be, ulaw, alaw, s32le, s32be, s24le, s24be,\n"
-"                                        s24-32le, s24-32be (alapértelmezés: s16ne)\n"
-"      --channels=CSATORNÁK               Csatornák száma: 1 - mono, 2 - sztereó\n"
+"      --volume=HANGERŐ                   Kezdeti (lineáris) hangerő megadása "
+"a következő tartományban: 0...65536\n"
+"      --rate=MINTAVÉTEL                 Mintavételezés érzéke Hz-ben "
+"(alapértelmezés: 44100)\n"
+"      --format=MINTAFORMÁTUM             A mintavétel típusa a "
+"következőkből: s16le, s16be, u8, float32le,\n"
+"                                        float32be, ulaw, alaw, s32le, s32be, "
+"s24le, s24be,\n"
+"                                        s24-32le, s24-32be (alapértelmezés: "
+"s16ne)\n"
+"      --channels=CSATORNÁK               Csatornák száma: 1 - mono, 2 - "
+"sztereó\n"
 "                                        (defaults to 2)\n"
-"      --channel-map=CSATORNALEKÉPZÉS          Az alapértelmezés helyett használandó csatornaleképzés\n"
-"      --fix-format                      Take the sample format from the sink the stream is\n"
+"      --channel-map=CSATORNALEKÉPZÉS          Az alapértelmezés helyett "
+"használandó csatornaleképzés\n"
+"      --fix-format                      Take the sample format from the sink "
+"the stream is\n"
 "                                        being connected to.\n"
-"      --fix-rate                        Take the sampling rate from the sink the stream is\n"
+"      --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"
-"      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
-"      --raw                             Nyers PCM adatok felvétele vagy lejátszása.\n"
-"      --file-format=FORMÁTUM             FORMÁTUM alakú PCM adatok felvétele vagy lejátszása.\n"
+"      --no-remap                        Map channels by index instead of "
+"name.\n"
+"      --latency=BYTES                   Request the specified latency in "
+"bytes.\n"
+"      --process-time=BYTES              Request the specified process time "
+"per request in bytes.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the "
+"specified value.\n"
+"      --raw                             Nyers PCM adatok felvétele vagy "
+"lejátszása.\n"
+"      --file-format=FORMÁTUM             FORMÁTUM alakú PCM adatok felvétele "
+"vagy lejátszása.\n"
 "      --list-file-formats               Elérhető fájlformátumok listája.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1282,188 +1415,194 @@ msgstr ""
 "Összeépítve a libpulse %s programkönyvtárral\n"
 "Csatolva a libpulse %s programkönyvtárhoz\n"
 
-#: ../src/utils/pacat.c:764
-#: ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Érvénytelen kliensnév: „%s”"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Érvénytelen adatfolyam-név: „%s”"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Érvénytelen csatornaleképzés: „%s”"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Érvénytelen késleltetés leírás: „%s”"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Érvénytelen műveleti idő leírás: „%s”"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Érvénytelen tulajdonság: „%s”"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Ismeretlen fájlformátum: „%s”"
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Érvénytelen mintavételi leírás."
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "Megnyitás: %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Túl sok paraméter."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "Nem sikerült létrehozni a mintavételi leírást a fájlhoz."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "Nem sikerült megnyitni a hangfájlt."
 
-#: ../src/utils/pacat.c:959
-msgid "Warning: specified sample specification will be overwritten with specification from file."
-msgstr "Figyelmeztetés: a megadott mintavételi leírás felül lesz írva a fájlból származó mintavételi leírással."
+#: ../src/utils/pacat.c:1000
+msgid ""
+"Warning: specified sample specification will be overwritten with "
+"specification from file."
+msgstr ""
+"Figyelmeztetés: a megadott mintavételi leírás felül lesz írva a fájlból "
+"származó mintavételi leírással."
 
-#: ../src/utils/pacat.c:962
-#: ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "Nem sikerült meghatározni a mintavételi leírást a fájlból."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
-msgstr "Figyelmeztetés: Nem sikerült meghatározni a csatornaleképzést a fájlból."
+msgstr ""
+"Figyelmeztetés: Nem sikerült meghatározni a csatornaleképzést a fájlból."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "A csatornaleképzés nem feleltethető meg a mintavételi leírásnak."
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "Hiba történt a csatornaleképzés fájlba írása közben."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr "A(z) „%s” adatfolyam megnyitása a következő mintavételi leírás: „%s” és csatornaleképzés: „%s” használatával."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr ""
+"A(z) „%s” adatfolyam megnyitása a következő mintavételi leírás: „%s” és "
+"csatornaleképzés: „%s” használatával."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "Felvétel"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "Lejátszás"
 
-#: ../src/utils/pacat.c:1035
-#: ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "A „pa_mainloop_new()” függvényhívás meghiúsult."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "A „io_new()” függvényhívás meghiúsult."
 
-#: ../src/utils/pacat.c:1061
-#: ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "A „pa_context_new()” függvényhívás meghiúsult."
 
-#: ../src/utils/pacat.c:1069
-#: ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "A „pa_context_connect()” függvényhívás meghiúsult: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "A „pa_context_rttime_new()” függvényhívás meghiúsult."
 
-#: ../src/utils/pacat.c:1082
-#: ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "A „pa_mainloop_run()” függvényhívás meghiúsult."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "Programindítás: %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "Hiba lépett fel a készenléti állapotba térés közben: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "Hiba lépett fel a készenléti állapotból visszatérés közben: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
-msgstr "FIGYELMEZTETÉS: A hangkiszolgáló nem helyi és nincs is felfüggesztve.\n"
+msgstr ""
+"FIGYELMEZTETÉS: A hangkiszolgáló nem helyi és nincs is felfüggesztve.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Kapcsolódási hiba: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "Kilépés, SIGINT szignál hatására…\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
-msgstr "FIGYELMEZTETÉS: A gyermek folyamat a következő szignállal fejeződött be: %u\n"
+msgstr ""
+"FIGYELMEZTETÉS: A gyermek folyamat a következő szignállal fejeződött be: %u\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
-"  -s, --server=SERVER                   The name of the server to connect to\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
 "\n"
 msgstr ""
 "%s [KAPCSOLÓ] ... \n"
 "\n"
 "  -h, --help                            Megjeleníti ezt a súgót\n"
-"      --version                         Az alkalmazás verziószámának megjelenítése\n"
+"      --version                         Az alkalmazás verziószámának "
+"megjelenítése\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1474,50 +1613,64 @@ msgstr ""
 "Összeépítve a libpulse %s programkönyvtárral\n"
 "Csatolva a libpulse %s programkönyvtárhoz\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "A „pa_mainloop_new()” függvényhívás meghiúsult.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "A „pa_context_new()” függvényhívás meghiúsult.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "A „pa_mainloop_run()” függvényhívás meghiúsult.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Nem sikerült a statisztika lekérdezése: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
-msgstr "Jelenleg lefoglalt blokkok száma: %u, amely összesen %s bájtot jelent.\n"
+msgstr ""
+"Jelenleg lefoglalt blokkok száma: %u, amely összesen %s bájtot jelent.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
-msgstr "A futás során összesen lefoglalt blokkok száma: %u, amely összesen %s bájtot jelent.\n"
+msgstr ""
+"A futás során összesen lefoglalt blokkok száma: %u, amely összesen %s bájtot "
+"jelent.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Minta-gyorsítótár mérete: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "Nem sikerült lekérdezni a kiszolgáló adatait: „%s”"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1525,7 +1678,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Felhasználónév: %s\n"
 "Számítógépnév: %s\n"
@@ -1537,12 +1690,12 @@ msgstr ""
 "Alapértelmezett forrás: %s\n"
 "Süti: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Nem sikerült lekérdezni a nyelő adatait: „%s”"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1581,24 +1734,22 @@ msgstr ""
 "\tTulajdonságok:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268
-#: ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tPort:\n"
 
-#: ../src/utils/pactl.c:274
-#: ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tAktív Port: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "Nem sikerült lekérdezni a forrás adatait: „%s”"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1637,28 +1788,20 @@ msgstr ""
 "\tTulajdonságok:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345
-#: ../src/utils/pactl.c:401
-#: ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473
-#: ../src/utils/pactl.c:532
-#: ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543
-#: ../src/utils/pactl.c:587
-#: ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594
-#: ../src/utils/pactl.c:637
-#: ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "ismeretlen"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "Nem sikerült lekérdezni a modul adatait: „%s”"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1675,12 +1818,12 @@ msgstr ""
 "\tTulajdonságok:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "Nem sikerült lekérdezni a kliens adatait: „%s”"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1695,12 +1838,12 @@ msgstr ""
 "\tTulajdonságok:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "Nem sikerült lekérdezni a kártya adatait: „%s”"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1717,22 +1860,22 @@ msgstr ""
 "\tTulajdonságok:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tProfil:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tAktív profil: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Nem sikerült lekérdezni a nyelő bemeneti adatait: „%s”"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1769,12 +1912,12 @@ msgstr ""
 "\tTulajdonságok:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "Nem sikerült lekérdezni a forrás kimeneti adatait: „%s”"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1803,12 +1946,12 @@ msgstr ""
 "\tTulajdonságok:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Nem sikerült lekérdezni a mintavétel adatait: „%s”"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1839,27 +1982,80 @@ msgstr ""
 "\tTulajdonságok:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653
-#: ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Hiba: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Nem sikerült feltölteni a mintát: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "Idő előtti fájlvége"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Érvénytelen kiszolgáló"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "Kilépés, SIGINT szignál hatására…"
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -1882,12 +2078,15 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\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 ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -1912,12 +2111,14 @@ msgstr ""
 "%s [options] set-sink-input-mute NYELŐBEMENET 1|0\n"
 "\n"
 "  -h, --help                            Megjeleníti ezt a súgót\n"
-"      --version                         Az alkalmazás verziószámának megjelenítése\n"
+"      --version                         Az alkalmazás verziószámának "
+"megjelenítése\n"
 "\n"
-"  -s, --server=KISZOLGÁLÓ                   Kapcsolódás a megadott KISZOLGÁLÓ kiszolgálóhoz\n"
+"  -s, --server=KISZOLGÁLÓ                   Kapcsolódás a megadott "
+"KISZOLGÁLÓ kiszolgálóhoz\n"
 "  -n, --client-name=NÉV                A kliens neve ezen a szerveren\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1928,104 +2129,110 @@ msgstr ""
 "Összeépítve a libpulse %s programkönyvtárral\n"
 "Csatolva a libpulse %s programkönyvtárhoz\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Adja meg a betöltendő mintafájlt"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Nem sikerült megnyitni az hangfájlt."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
-msgstr "Figyelmeztetés: Nem sikerült meghatározni a mintavételi leírást a fájlból."
+msgstr ""
+"Figyelmeztetés: Nem sikerült meghatározni a mintavételi leírást a fájlból."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "Meg kell adnia lejátszandó minta nevét."
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "Meg kell adnia az eltávolítandó minta nevét."
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "Meg kell adnia a nyelő bemeneti azonosítóját és a nyelőt."
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "Meg kell adnia a forrás kimeneti azonosítóját és a forrást."
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "Meg kell adnia a modul nevét és a paramétereit."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "Meg kell adnia a modul azonosítóját."
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
 msgstr "Nem adhat meg egynél több nyelőt. Egy logikai értéket kell megadnia."
 
-#: ../src/utils/pactl.c:1103
-msgid "You may not specify more than one source. You have to specify a boolean value."
+#: ../src/utils/pactl.c:1196
+msgid ""
+"You may not specify more than one source. You have to specify a boolean "
+"value."
 msgstr "Nem adhat meg egynél több forrást. Egy logikai értéket kell megadnia."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "Meg kell adnia a kártya nevét vagy azonosítóját és a profil nevét"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "Meg kell adnia a nyelő nevét vagy azonosítóját és a port nevét."
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "Meg kell adnia a forrás nevét vagy azonosítóját és a port nevét"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "Meg kell adnia a nyelő nevét vagy azonosítóját és a hangerejét."
 
-#: ../src/utils/pactl.c:1154
-#: ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193
-#: ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226
-#: ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "A hangerő megadása érvénytelen."
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "Meg kell adnia a forrás nevét vagy azonosítóját és a hangerejét"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "Meg kell adnia a nyelő bemenet azonosítóját és a hangerejét"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "A nyelő bemeneti azonosítója érvénytelen."
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr "Meg kell adnia a nyelő nevét vagy azonosítóját és a némítás logikai változóját."
+msgstr ""
+"Meg kell adnia a nyelő nevét vagy azonosítóját és a némítás logikai "
+"változóját."
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
-msgstr "Meg kell adnia a forrás nevét vagy azonosítóját és a némítás logikai változóját"
+msgstr ""
+"Meg kell adnia a forrás nevét vagy azonosítóját és a némítás logikai "
+"változóját"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr "Meg kell adnia a nyelő bemenet azonosítóját és a némítás logikai változóját"
+msgstr ""
+"Meg kell adnia a nyelő bemenet azonosítóját és a némítás logikai változóját"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "A nyelő bemeneti azonosítójának megadása érvénytelen."
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "Érvénytelen parancs lett megadva."
 
@@ -2036,14 +2243,18 @@ 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 megjelenítő] [-S kiszolgáló] [-O nyelő] [-I forrás] [-c fájl]  [-d|-e|-i|-r]\n"
+"%s [-D megjelenítő] [-S kiszolgáló] [-O nyelő] [-I forrás] [-c fájl]  [-d|-"
+"e|-i|-r]\n"
 "\n"
-" -d    Megjeleníti az aktuális X11 megjelenítőhöz csatlakoztatott PulseAudio adatokat (alapértelmezés)\n"
+" -d    Megjeleníti az aktuális X11 megjelenítőhöz csatlakoztatott PulseAudio "
+"adatokat (alapértelmezés)\n"
 " -e    Helyi PulseAudio adatok exportálása az X11 megjelenítőre\n"
-" -i    Helyi PulseAudio adatok importálása az X11 megjelenítőről helyi környezeti változókba és süti fájlokba\n"
+" -i    Helyi PulseAudio adatok importálása az X11 megjelenítőről helyi "
+"környezeti változókba és süti fájlokba\n"
 " -r    Eltávolítja a PulseAudio adatokat z X11 megjelenítőről\n"
 
 #: ../src/utils/pax11publish.c:94
@@ -2106,107 +2317,120 @@ msgstr "Nem sikerült betölteni a süti adatokat.\n"
 msgid "Not yet implemented.\n"
 msgstr "Még nincs elkészítve.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr "Nem fut a PulseAudio démon vagy nem fut munkamenet démonként sem."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "Kapcsolódás: %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "A PulseAudio démon kilövése nem sikerült."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "A démon nem válaszol."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "Lekérdezés: %s"
 
-#: ../src/utils/pacmd.c:171
-#: ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "Olvasás: %s"
 
-#: ../src/utils/pacmd.c:207
-#: ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "Írás: %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136
-#: ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "Nem érhető zárolás az automatikus indításhoz."
 
-#: ../src/modules/alsa/alsa-sink.c:530
-#: ../src/modules/alsa/alsa-sink.c:689
+#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
 #, c-format
 msgid ""
-"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
-"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
+"ALSA woke us up to write new data to the device, but there was actually "
+"nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
 msgstr ""
-"Az ALSA modul értesítése nyomán új adatokat kellett volna írni az eszközre, de jelenleg semmilyen írandó adat nincsen.\n"
-"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé.\n"
-"Az értesítés a POLLOUT jelzésen keresztül érkezett – viszont a „snd_pcm_avail()” függvény visszatérési értéke 0 volt vagy a második érték kisebb volt, mint a minimum."
+"Az ALSA modul értesítése nyomán új adatokat kellett volna írni az eszközre, "
+"de jelenleg semmilyen írandó adat nincsen.\n"
+"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a "
+"problémát az ALSA fejlesztői felé.\n"
+"Az értesítés a POLLOUT jelzésen keresztül érkezett – viszont a „snd_pcm_avail"
+"()” függvény visszatérési értéke 0 volt vagy a második érték kisebb volt, "
+"mint a minimum."
 
-#: ../src/modules/alsa/alsa-source.c:506
-#: ../src/modules/alsa/alsa-source.c:656
+#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
 #, c-format
 msgid ""
-"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
-"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
+"ALSA woke us up to read new data from the device, but there was actually "
+"nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
 msgstr ""
-"Az ALSA modul értesítése nyomán új adatokat kellett volna olvasni az eszközről, de jelenleg semmilyen olvasandó adat nincsen.\n"
-"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a problémát az ALSA fejlesztői felé.\n"
-"Az értesítés a POLLIN jelzésen keresztül érkezett – viszont a „snd_pcm_avail()” függvény visszatérési értéke 0 volt vagy a második érték kisebb volt, mint a minimum."
+"Az ALSA modul értesítése nyomán új adatokat kellett volna olvasni az "
+"eszközről, de jelenleg semmilyen olvasandó adat nincsen.\n"
+"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a "
+"problémát az ALSA fejlesztői felé.\n"
+"Az értesítés a POLLIN jelzésen keresztül érkezett – viszont a „snd_pcm_avail"
+"()” függvény visszatérési értéke 0 volt vagy a második érték kisebb volt, "
+"mint a minimum."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Kikapcsolva"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "HiFi lejátszás (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "HiFi felvétel (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Telefon duplex (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio hangkiszolgáló"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "Kimeneti eszközök"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "Bemeneti eszközök"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "Hangforrások a(z) @HOSTNAME@ számítógépen"
 
@@ -2270,134 +2494,159 @@ msgstr "Erősítő"
 msgid "No Amplifier"
 msgstr "Nincs erősítő"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "Erősítés"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "Nincs erősítés"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "Analóg fejhallgató"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "Analóg bemenet"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "Analóg mikrofon"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "Analóg vonalbemenet"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "Analóg rádió"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "Analóg videó"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "Analóg kimenet"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "Analóg fejhallgató"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "Analóg kimenet (mély)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "Analóg mono kimenet"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Analóg sztereó"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984
-#: ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Analóg mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Analóg sztereó"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "Analóg térhatású 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "Analóg térhatású 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "Analóg térhatású 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Analóg térhatású 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Analóg térhatású 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Analóg térhatású 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Analóg térhatású 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "Analóg térhatású 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "Analóg térhatású 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "Analóg térhatású 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Analóg térhatású 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Digitális sztereó (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Digitális térhatású 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Digitális térhatású 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Digitális térhatású 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Digitális térhatású (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "Analóg mono duplex"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "Analóg sztereó duplex"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Analóg sztereó duplex (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Mély-hangszóró (LFE)"
diff --git a/po/it.po b/po/it.po
index c0c70e4..1e8c4b6 100644
--- a/po/it.po
+++ b/po/it.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-18 05:22+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-10-18 11:46+0200\n"
 "Last-Translator: Milo Casagrande <milo at ubuntu.com>\n"
 "Language-Team: Italian <tp at lists.linux.it>\n"
@@ -18,12 +18,12 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -35,7 +35,7 @@ msgstr ""
 "Molto probabilmente si tratta di un bug nel driver ALSA \"%s\". Segnalare "
 "questo problema agli sviluppatori ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -47,7 +47,7 @@ msgstr ""
 "Molto probabilmente si tratta di un bug nel driver ALSA \"%s\". Segnalare "
 "questo problema agli sviluppatori ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -94,11 +94,11 @@ msgstr "Sink NULL temporizzato"
 msgid "Null Output"
 msgstr "Output nullo"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Audio interno"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Modem"
 
@@ -114,93 +114,99 @@ msgstr "Allocazione del nuovo loader dl non riuscita."
 msgid "Failed to add bind-now-loader."
 msgstr "Aggiunta di bind-now-loader non riuscita."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Ottenuto il segnale %s."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Uscita."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Ricerca dell'utente \"%s\" non riuscita."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Ricerca del gruppo \"%s\" non riuscita."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Trovato l'utente \"%s\" (UID %lu) e il gruppo \"%s\" (GID %lu)."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "Il GID dell'utente \"%s\" e del gruppo \"%s\" non corrispondono."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "La directory home dell'utente \"%s\" non è \"%s\", ignorato."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Creazione di \"%s\" non riuscita: %s"
 
 # group list ????
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "Cambio dell'elenco di gruppo non riuscito: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "Cambio di GID non riuscito: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "Cambio di UID non riuscito: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "Privilegi di root abbandonati con successo."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "Modalità di sistema non supportata su questa piattaforma."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) non riuscita: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "Analisi della riga di comando non riuscita."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "Demone non in esecuzione"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Demone in esecuzione con PID %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Terminazione del demone non riuscita: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -208,163 +214,178 @@ msgstr ""
 "Questo programma non è pensato per essere eseguito come root (a meno di "
 "specificare --system)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Richiesti privilegi di root."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start non supportato per le istanze di sistema."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "In esecuzione in modalità sistema, ma --disallow-exit non impostato."
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 "In esecuzione in modalità sistema, ma --disallow-module-loading non "
 "impostato."
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr ""
 "In esecuzione in modalità sistema, disabilitata in modo forzoso la modalità "
 "SHM."
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 "In esecuzione in modalità sistema, disabilitato in modo forzoso il tempo di "
 "uscita per inattività."
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "Acquisizione di STDIO non riuscita."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "pipe non riuscita: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() non riuscita: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() non riuscita: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "Avvio del demone non riuscito."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "Avvio del demone riuscito."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() non riuscita: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Questo è PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Host di compilazione: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "CFLAGS di compilazione: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "In esecuzione sull'host: %s"
 
 # evviva il rispetto della l10n!!!
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "Trovate %u CPU."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "La dimensione di pagina è %lu byte"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Compilato con supporto a Valgrind: sì"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Compilato con supporto a Valgrind: no"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "In esecuzione in modalità valgrind: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "In esecuzione sull'host: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Build ottimizzata: sì"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Build ottimizzata: no"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG definito, tutte le dichiarazioni sono disabilitate."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr ""
 "FASTPATH definito, solo le dichiarazioni veloci di path sono disabilitate."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "Tutte le dichiarazioni sono abilitate."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "Recupero dell'ID della macchina non riuscito"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "L'ID della macchina è %s"
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "L'ID della sessione è %s"
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "In uso directory di runtime %s."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "In uso directory di stato %s."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "In uso directory dei moduli %s."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "In esecuzione in modalità sistema: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -380,17 +401,17 @@ msgstr ""
 "Consultare http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode per maggiori "
 "informazioni sul perché la modalità sistema è una pessima idea."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() non riuscita."
 
 # io mi domando e dico..... mah!
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Disponibili timer high-resolution freschi freschi! Buon appetito!"
 
 # $REPEAT_PREVIOUS_COMMENT_HERE
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -398,27 +419,27 @@ msgstr ""
 "Hey, questo kernel è andato a male! Lo chef oggi raccomanda Linux con i "
 "timer high-resolution abilitati!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() non riuscita."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "Inizializzazione del demone non riuscita."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "Avvio del demone senza alcun modulo caricato, rifiuta di lavorare."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "Completato l'avvio del demone."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "Iniziato l'arresto del demone."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "Demone terminato."
 
@@ -709,73 +730,78 @@ msgstr "ATTENZIONE, DEPRECATI: %s\n"
 msgid "Path: %s\n"
 msgstr "Percorso: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Destinazione di registro \"%s\" non valida."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Livello di registro \"%s\" non valido."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Metodo di ricampionamento \"%s\" non valido."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] rlimit \"%s\" non valido."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit non supportato su questa piattaforma."
 
 # o campionamento?? ma campionamento non è sampling?
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Formato di campionamento \"%s\" non valido."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Frequenza di campionamento '%s' non valida."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Canali di campionamento \"%s\" non validi."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Mappa del canale \"%s\" non valida."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Numero di frammenti \"%s\" non valido."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Dimensione dei frammenti \"%s\" non valida."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Livello di nice \"%s\" non valido."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Frequenza di campionamento '%s' non valida."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Apertura del file di configurazione non riuscita: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -783,7 +809,7 @@ msgstr ""
 "La mappa del canale predefinita specificata presenta un numero diverso di "
 "canali rispetto a quello predefinito specificato."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Lettura dal file di configurazione: %s ###\n"
@@ -831,8 +857,8 @@ msgid "Rear Right"
 msgstr "Posteriore destro"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Emettitore basse frequenze"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1177,194 +1203,194 @@ msgstr "XOpenDisplay() non riuscita"
 msgid "Failed to parse cookie data"
 msgstr "Analisi dei dati cookie non riuscita"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Apertura del file di configurazione \"%s\" non riuscita: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Nessun cookie caricato. Tentativo di connettersi senza."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "Ricevuto messaggio per l'estensione sconosciuta \"%s\""
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Svuotamento dello stream non riuscito: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "Stream di riproduzione svuotato."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "Svuotamento della connessione sul server."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() non riuscita: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() non riuscita: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() non riuscita: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Creazione dello stream riuscita."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() non riuscita: %s"
 
 # maxlength, fragsize e gli altri non so se vanno tradotti...
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Metriche del buffer: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
 # maxlength e fragsize non so se vanno tradotti...
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Metriche del buffer: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "In uso specifica di campionamento \"%s\", mappa dei canali \"%s\"."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Connesso al device %s (%u, %ssospeso)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "Errore di stream: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Device stream sospeso.%s "
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "Device stream ripristinato.%s "
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "Underrun dello stream.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "Overrun dello stream.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "Stream avviato.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Stream spostato sul device %s (%u, %ssospeso).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "non "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Attributi del buffer di stream cambiati.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "Connessione stabilita.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() non riuscita: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() non riuscita: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() non riuscita: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Connessione non riuscita: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "Ricevuto EOF."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() non riuscita: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "Ricevuto il segnale, uscita."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "Recupero della latenza non riuscito: %s"
 
 # dubbio: tempo o durata??
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Tempo: %0.3f sec; Latenza: %0.0f microsec."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() non riuscita: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1416,10 +1442,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [OPZIONI]\n"
@@ -1489,7 +1519,7 @@ msgstr ""
 "formattati\n"
 "      --list-file-FORMATI               Elenca i formati disponibili.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1500,69 +1530,69 @@ msgstr ""
 "Compilato con libpulse %s\n"
 "Link eseguito con libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Nome del client \"%s\" non valido"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Nome dello stream \"%s\" non valido"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Mappa dei canali \"%s\" non valida"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Specifica di latenza \"%s\" non valida"
 
 # esecuzione???
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Specifica di tempo di elaborazione \"%s\" non valida"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Proprietà \"%s\" non valida"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Formato file %s sconosciuto."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Specifica di campionamento non valida"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Troppi argomenti."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "Generazione della specifica di campionamento per il file non riuscita."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "Apertura del file audio non riuscita."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
@@ -1570,24 +1600,24 @@ msgstr ""
 "Attenzione: la specifica di campionamento indicata verrà soprascritta con "
 "quella dal file."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "Determinazione della specifica di campionamento dal file non riuscita."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr ""
 "Attenzione: determinazione della mappa dei canali dal file non riuscita."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "La mappa dei canali non corrisponde alla specifica di campionamento"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "Attenzione: scrittura della mappa dei canali su file non riuscita."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
 msgid ""
 "Opening a %s stream with sample specification '%s' and channel map '%s'."
@@ -1595,81 +1625,81 @@ msgstr ""
 "Apertura di uno stream %s con specifica di campionamento \"%s\" e mappa dei "
 "canali \"%s\"."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "registrazione"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "riproduzione"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() non riuscita."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() non riuscita."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() non riuscita."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() non riuscita: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() non riuscita."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() non riuscita."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "Sospensione non riuscita: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "Ripristino non riuscito: %s\n"
 
 # cambiato un po' la parte finale...
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "ATTENZIONE: server audio non locale, impossibile sospendere.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Connessione non riuscita: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "Ricevuto SIGINT, in uscita.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "ATTENZIONE: processo figlio terminato dal segnale %u\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1688,7 +1718,7 @@ msgstr ""
 "connettersi\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1699,52 +1729,63 @@ msgstr ""
 "Compilato con libpulse %s\n"
 "Link eseguito con libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() non riuscita.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() non riuscita.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() non riuscita.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Recupero delle statistiche non riuscito: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "Attualmente in uso: %u blocchi contenenti %s byte in totale.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr ""
 "Allocati durante l'intera esecuzione: %u blocchi contenenti %s byte in "
 "totale.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Dimensione della cache dei campioni: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "Recupero delle informazioni del server non riuscito: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1752,7 +1793,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Nome utente: %s\n"
 "Nome host: %s\n"
@@ -1764,7 +1805,7 @@ msgstr ""
 "Sorgente predefinita: %s\n"
 "Cookie: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Recupero delle informazioni del sink non riuscito: %s"
@@ -1772,7 +1813,7 @@ msgstr "Recupero delle informazioni del sink non riuscito: %s"
 # nel relativo messaggio per il source
 # c'è "monitor of sink", quindi assumo che
 # qui dovesse essere "monitor of source"
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1811,22 +1852,22 @@ msgstr ""
 "\tProprietà:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tPorte:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tPorta attiva: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "Recupero delle informazioni della sorgente non riuscito: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1865,20 +1906,20 @@ msgstr ""
 "\tProprietà:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "N/D"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "Recupero delle informazioni del modulo non riuscito: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1895,12 +1936,12 @@ msgstr ""
 "\tProprietà:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "Recupero delle informazioni del client non riuscito: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1915,12 +1956,12 @@ msgstr ""
 "\tProprietà:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "Recupero delle informazioni della scheda non riuscito: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1937,12 +1978,12 @@ msgstr ""
 "\tProprietà:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tProfili:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tProfilo attivo: %s\n"
@@ -1951,12 +1992,12 @@ msgstr "\tProfilo attivo: %s\n"
 # A stream that is connected to an output device, i.e. an input for a sink.
 #
 # from http://pulseaudio.org/wiki/WritingVolumeControlUIs
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Recupero delle informazioni dell'ingresso per il sink non riuscito: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1997,13 +2038,13 @@ msgstr ""
 # A stream that is connected to an input device, i.e. an output of a source.
 #
 # from http://pulseaudio.org/wiki/WritingVolumeControlUIs
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr ""
 "Recupero delle informazioni dell'uscita per la sorgente non riuscito: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -2032,13 +2073,13 @@ msgstr ""
 "\tProprietà:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Recupero delle informazioni del campione non riuscito: %s"
 
 # campiona lazy??
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -2069,26 +2110,80 @@ msgstr ""
 "\tProprietà:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Fallimento: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Caricamento del campione non riuscito: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "Fine del file prematura"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Server non valido"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "Ricevuto SIGINT, uscita."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2111,6 +2206,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2148,7 +2244,7 @@ msgstr ""
 "  -s, --server=SERVER              Il nome del server a cui connettersi\n"
 "  -n, --client-name=NOME           Come chiamare questo client sul server\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2159,53 +2255,53 @@ msgstr ""
 "Compilato con libpulse %s\n"
 "Link eseguito con libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Specificare un file campione da caricare"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Apertura del file audio non riuscita."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr ""
 "Attenzione: determinazione della specifica di campionamento dal file non "
 "riuscita."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "È necessario specificare un nome di campione da riprodurre"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "È necessario specificare un nome di campione da rimuovere"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "È necessario specificare un indice di ingresso per sink e un sink"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr ""
 "È necessario specificare una indice di uscita per sorgente e una sorgente"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "È necessario specificare un nome di modulo e gli argomenti."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "È necessario specificare un indice di modulo"
 
-#: ../src/utils/pactl.c:1090
+#: ../src/utils/pactl.c:1183
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 "Non è possibile specificare più di un sink. È necessario specificare un "
 "valore booleano."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
@@ -2213,58 +2309,58 @@ msgstr ""
 "Non è possibile specificare più di una sorgente. È necessario specificare un "
 "valore booleano."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr ""
 "È necessario specificare un nome/indice di scheda e un nome di profilo."
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "È necessario specificare un nome/indice di sink e un nome di porta"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "È necessario specificare un nome/indice di sorgente e un nome di porta"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "È necessario specificare un nome/indice di sink e un nome di porta"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "Specifica di volume non valida"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "È necessario specificare un nome/indice di sorgente e un nome di porta"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "È necessario specificare un indice di ingresso per sink e un sink"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "Indice dell'input del sink non valido"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "È necessario specificare un nome/indice di sink e un nome di porta"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "È necessario specificare un nome/indice di sorgente e un nome di porta"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "È necessario specificare un indice di ingresso per sink e un sink"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "Specifica dell'indice di input del sink non valida"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "Nessun comando valido specificato."
 
@@ -2349,46 +2445,46 @@ msgstr "Caricamento dei dati cookie non riuscito\n"
 msgid "Not yet implemented.\n"
 msgstr "Non ancora implementato.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
 "Nessun demone PulseAudio in esecuzione o non in esecuzione come demone di "
 "sessione."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "Uccisione del demone PulseAudio non riuscita."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "Il demone non sta rispondendo."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "Impossibile accedere al lock di autospawn."
 
@@ -2427,38 +2523,42 @@ msgstr ""
 "snd_pcm_avail() ha ritornato 0 o un altro valore < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Spento"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "Riproduzione ad alta fedeltà (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "Cattura ad alta fedeltà (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Doppino telefonico (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "Server sonoro PulseAudio"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "Dispositivi di uscita"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "Dispositivi di ingresso"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "Audio su @HOSTNAME@"
 
@@ -2522,132 +2622,159 @@ msgstr "Amplificatore"
 msgid "No Amplifier"
 msgstr "Nessun amplificatore"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "Boost"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "Nessun boost"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "Cuffie analogiche"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "Ingresso analogico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "Microfono analogico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "Line-in analogico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "Radio analogica"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "Video analogico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "Uscita analogica"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "Cuffie analogiche"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "Uscita analogica (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "Uscita mono analogica"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Stereo analogico"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Mono analogico"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Stereo analogico"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "Surround analogico 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "Surround analogico 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "Surround analogico 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Surround analogico 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Surround analogico 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Surround analogico 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Surround analogico 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "Surround analogico 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "Surround analogico 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "Surround analogico 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Surround analogico 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Stereo digitale (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Surround digitale 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Surround digitale 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Surround digitale 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Stereo digitale (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "Duplex mono analogico"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "Duplex stereo analogico"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Duplex stereo digitale (IEC958)"
+
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Emettitore basse frequenze"
diff --git a/po/ja.po b/po/ja.po
index 8e85a48..b23297b 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: ja\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-08 02:51+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-12-10 11:49+0900\n"
 "Last-Translator: Kiyoto Hashida <khashida at redhat.com>\n"
 "Language-Team: Japanese <jp at li.org>\n"
@@ -17,14 +17,15 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11.4\n"
-"Plural-Forms: Plural-Forms: nplurals=1; plural=0;\n\n"
+"Plural-Forms: Plural-Forms: nplurals=1; plural=0;\n"
+"\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -32,12 +33,11 @@ msgid ""
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 "to the ALSA developers."
 msgstr ""
-"snd_pcm_avail() は 例外的に大きな値を返しました: %lu バイト(%lu "
-"ms)。\n"
-"これは多分、ALSA ドライバー '%s' 内のバグです。この問題は ALSA 開発者宛に "
-"報告を提出して下さい。"
+"snd_pcm_avail() は 例外的に大きな値を返しました: %lu バイト(%lu ms)。\n"
+"これは多分、ALSA ドライバー '%s' 内のバグです。この問題は ALSA 開発者宛に 報"
+"告を提出して下さい。"
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -45,12 +45,11 @@ msgid ""
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 "to the ALSA developers."
 msgstr ""
-"snd_pcm_delay() は 例外的に大きな値を返しました: %li バイト(%s%lu"
-" ms)。\n"
-"これは多分、ALSA ドライバー '%s' 内のバグです。この問題は ALSA 開発者宛に "
-"報告を提出して下さい。"
+"snd_pcm_delay() は 例外的に大きな値を返しました: %li バイト(%s%lu ms)。\n"
+"これは多分、ALSA ドライバー '%s' 内のバグです。この問題は ALSA 開発者宛に 報"
+"告を提出して下さい。"
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -60,12 +59,13 @@ msgid ""
 msgstr ""
 "snd_pcm_mmap_begin() は 例外的に大きな値を返しました: %lu バイト(%lu "
 "ms)。\n"
-"これは多分、ALSA ドライバー '%s' 内のバグです。この問題は ALSA 開発者宛に "
-"報告を提出して下さい。"
+"これは多分、ALSA ドライバー '%s' 内のバグです。この問題は ALSA 開発者宛に 報"
+"告を提出して下さい。"
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr "null である場合でも、常に最低でもシンクが1つロードされるように維持します"
+msgstr ""
+"null である場合でも、常に最低でもシンクが1つロードされるように維持します"
 
 #: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
@@ -83,11 +83,10 @@ msgid ""
 "plugin name> label=<ladspa plugin label> control=<comma seperated list of "
 "input control values>"
 msgstr ""
-"sink_name=<シンクの名前> sink_properties=<シンクのプロパティ> "
-"master=<フィルタするシンク名> format=<サンプル形式> rate=<サンプルレート> "
-"channels=<チャンネル数> channel_map=<チャンネルマップ> plugin=<ladspa "
-"plugin の名前> label=<ladspa plugin のラベル> control=<コンマで隔離した入力制御値の "
-"一覧>"
+"sink_name=<シンクの名前> sink_properties=<シンクのプロパティ> master=<フィル"
+"タするシンク名> format=<サンプル形式> rate=<サンプルレート> channels=<チャン"
+"ネル数> channel_map=<チャンネルマップ> plugin=<ladspa plugin の名前> "
+"label=<ladspa plugin のラベル> control=<コンマで隔離した入力制御値の 一覧>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
@@ -97,11 +96,11 @@ msgstr "クロック付き NULL シンク"
 msgid "Null Output"
 msgstr "Null 出力"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "内部オーディオ"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "モデム"
 
@@ -117,92 +116,98 @@ msgstr "新規の dl ローダーの割り当てに失敗しました。"
 msgid "Failed to add bind-now-loader."
 msgstr "bind-now-loader の追加に失敗しました。"
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "信号 %s を得ました。"
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "終了しています。"
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "ユーザー '%s' が見付かりませんでした。"
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "グループ '%s' が見付かりませんでした。"
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "ユーザー'%s' (UID %lu) とグループ  '%s' (GID %lu) を見つけました。"
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "ユーザー'%s' と グループ '%s' の GID が一致しません。"
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "ユーザー '%s' のホームディレクトリは '%s' ではありません。無視します。"
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "'%s' の作成に失敗しました: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "グループ一覧の変更に失敗しました: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "GID の変更に失敗しました: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "UID の変更に失敗しました: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "root の権限を正しく破棄しました。"
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "このプラットフォームではシステム全域のモードはサポートがありません。"
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) は失敗: %s "
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "コマンドラインの構文解析に失敗しました。"
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "デーモンは稼働していません"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "デーモンは PID %u として稼働していません"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "デーモンのキルに失敗しました: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -210,155 +215,174 @@ msgstr ""
 "このプログラムは root として実行されるように意図されていません(--system を "
 "指定していない限り)。"
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Root の権限が必要です。"
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start はシステムインスタンスではサポートがありません。"
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
-msgstr "システムモードで実行中です、しかし --disallow-exit がセットされていません!"
+msgstr ""
+"システムモードで実行中です、しかし --disallow-exit がセットされていません!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr "システムモードで実行中です、しかし --disallow-module-loading がセットされていません!"
+msgstr ""
+"システムモードで実行中です、しかし --disallow-module-loading がセットされてい"
+"ません!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "システムモードで実行中です、強制的に SHM モードを無効にしています!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
-msgstr "システムモードで実行中です、強制的に exit の遊び時間を無効にしています!"
+msgstr ""
+"システムモードで実行中です、強制的に exit の遊び時間を無効にしています!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "stdio の取得に失敗しました。"
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "パイプは失敗: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() は失敗: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() は失敗: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "デーモン開始に失敗しました。"
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "デーモンが正常に開始しました。"
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() は失敗: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "これは PulseAudio %s です。"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "コンパイルホスト: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "コンパイル CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "ホスト上で実行中: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u CPU を見つけました。"
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "ページサイズは %lu バイトです"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Valgrind サポートでのコンパイル: はい"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Valgrind サポートでのコンパイル: いいえ"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "valgrind モードで実行中: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "ホスト上で実行中: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "最適化したビルド: はい"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "最適化したビルド: いいえ"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG は定義済みです。アサーションは全て無効です。"
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH は定義済みです。ファーストパスアサーションのみが無効です。"
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "アサーションは全て有効です。"
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "マシン ID の取得に失敗"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "マシン ID は %s"
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "セッション ID は %s"
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "ランタイムディレクトリ %s を使用 "
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "状態ディレクトリ %s を使用"
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "モジュールディレクトリ %s を使用"
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "システムモードで実行中: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -367,50 +391,51 @@ msgid ""
 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
 "explanation why system mode is usually a bad idea."
 msgstr ""
-"そうすると、ユーザーはシステムモードで PA を実行している訳です。その場合、 "
-"実際にはそうすべきでないことに注意して下さい。\n"
-"それでも実行するのでしたら、期待どおりに機能しなくても責任はユーザー自身に "
-"あります。\n"
-"システムモードの使用が通常は良くない方針であることの説明については、 "
-"http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode をお読み下さい。"
-
-#: ../src/daemon/main.c:809
+"そうすると、ユーザーはシステムモードで PA を実行している訳です。その場合、 実"
+"際にはそうすべきでないことに注意して下さい。\n"
+"それでも実行するのでしたら、期待どおりに機能しなくても責任はユーザー自身に あ"
+"ります。\n"
+"システムモードの使用が通常は良くない方針であることの説明については、 http://"
+"pulseaudio.org/wiki/WhatIsWrongWithSystemMode をお読み下さい。"
+
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() は失敗"
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "最新の高解像度タイマーが使用できます! 楽しんで下さい!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
 msgstr ""
-"あらあら、ユーザーのカーネルはダメですよ! 今日のシェフのお薦めは高解像度タイマーが "
-"有効になっている Linux です!"
+"あらあら、ユーザーのカーネルはダメですよ! 今日のシェフのお薦めは高解像度タイ"
+"マーが 有効になっている Linux です!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() は失敗"
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "デーモンの初期化に失敗しました。"
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
-msgstr "デーモンはモジュールの読み込みなしで開始しており、動作を拒否しています。"
+msgstr ""
+"デーモンはモジュールの読み込みなしで開始しており、動作を拒否しています。"
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "デーモンの開始が完了です。"
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "デーモンのシャットダウンが始まりました。"
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "デーモンは取り消されました。"
 
@@ -495,22 +520,25 @@ msgstr ""
 "      --dump-conf                       デフォルト設定をダンプ\n"
 "      --dump-modules                    使用可能なモジュール一覧をダンプ\n"
 "      --dump-resample-methods           使用可能な再サンプル方法をダンプ\n"
-"      --cleanup-shm                     古い共有メモリーセグメントをクリーンアップ \n"
+"      --cleanup-shm                     古い共有メモリーセグメントをクリーン"
+"アップ \n"
 "      --start                           実行していない場合、デーモンを開始 \n"
 "  -k  --kill                            実行中のデーモンをキル\n"
-"      --check                           実行中のデーモンをチェック (退出コードを返すのみ)\n"
+"      --check                           実行中のデーモンをチェック (退出コー"
+"ドを返すのみ)\n"
 "\n"
 "オプション:\n"
 "      --system[=BOOL]                   システム全域インスタンスとして実行\n"
 "  -D, --daemonize[=BOOL]                開始後デーモン化\n"
 "      --fail[=BOOL]                     開始失敗なら終了\n"
 "      --high-priority[=BOOL]            高度なナイスレベルの設定を試行\n"
-"                                        (root としてのみ可能, SUID の時、"
-"又は\n"
+"                                        (root としてのみ可能, SUID の時、又"
+"は\n"
 "                                        昇格した RLIMIT_NICE で)\n"
-"      --realtime[=BOOL]                 リアルタイムスケジュールを有効にする試行\n"
-"                                        (root としてのみ可能, SUID の時、"
-"又は\n"
+"      --realtime[=BOOL]                 リアルタイムスケジュールを有効にする"
+"試行\n"
+"                                        (root としてのみ可能, SUID の時、又"
+"は\n"
 "                                        昇格した RLIMIT_RTPRIO で)\n"
 "      --disallow-module-loading[=BOOL]  起動後のユーザー要求のモジュールの "
 "ロード/アンロードを 許可しない\n"
@@ -518,36 +546,43 @@ msgstr ""
 "      --disallow-exit[=BOOL]            ユーザー要求の退出を許可しない\n"
 "      --exit-idle-time=SECS             遊休時と指定時間後にデーモンを終了 \n"
 "\n"
-"      --module-idle-time=SECS           遊休時と指定時間後に自動ロードモジュールをアンロード \n"
+"      --module-idle-time=SECS           遊休時と指定時間後に自動ロードモ"
+"ジュールをアンロード \n"
 "\n"
-"      --scache-idle-time=SECS           遊休時と指定時間後に自動ロードサンプルをアンロード \n"
+"      --scache-idle-time=SECS           遊休時と指定時間後に自動ロードサンプ"
+"ルをアンロード \n"
 "\n"
 "      --log-level[=LEVEL]               詳細レベルを上げるか、又はセット\n"
 "  -v                                    詳細レベルを上げる \n"
 "--log-target={auto,syslog,stderr} ログターゲットを指定 \n"
-"--log-meta[=BOOL]                 ログメッセージ内にコードの場所を含む "
-"\n"
-"      --log-time[=BOOL]                 ログメッセージ内にタイムスタンプを含む\n "
-"     --log-backtrace=FRAMES            ログメッセージ内にバックトレースを含む\n"
-"  -p, --dl-search-path=PATH             動的共有オブジェクト(plugins)用に検索パスをセット\n"
+"--log-meta[=BOOL]                 ログメッセージ内にコードの場所を含む \n"
+"      --log-time[=BOOL]                 ログメッセージ内にタイムスタンプを含"
+"ã‚€\n"
+"      --log-backtrace=FRAMES            ログメッセージ内にバックトレースを含"
+"ã‚€\n"
+"  -p, --dl-search-path=PATH             動的共有オブジェクト(plugins)用に検索"
+"パスをセット\n"
 "\n"
 "      --resample-method=METHOD          指定した再サンプリング方法を使用\n"
-"                                        (使用可能な値は --dump-resample-methods で\n"
+"                                        (使用可能な値は --dump-resample-"
+"methods で\n"
 "                                        参照)\n"
 "      --use-pid-file[=BOOL]             PID ファイルを作成\n"
 "      --no-cpu-limit[=BOOL]             サポート元のプラットフォームに CPU\n"
-"                                         ロードリミッターをインストールしない\n"
+"                                         ロードリミッターをインストールしな"
+"い\n"
 "      --disable-shm[=BOOL]              共有メモリーサポートを無効にする\n"
 "\n"
 "スタートアップスクリプト:\n"
-"  -L, --load=\"MODULE ARGUMENTS\"         指定した引数で指定したプラグインモジュールを "
-"ロード\n"
+"  -L, --load=\"MODULE ARGUMENTS\"         指定した引数で指定したプラグインモ"
+"ジュールを ロード\n"
 "\n"
 "  -F, --file=FILENAME                   指定したスクリプトを実行\n"
-"  -C                                    スタートアップ後に実行中の TTY 上でコマンドラインを "
-"開く\n"
+"  -C                                    スタートアップ後に実行中の TTY 上でコ"
+"マンドラインを 開く\n"
 "\n"
-"  -n                                    デフォルトのスクリプトファイルをロードしない\n"
+"  -n                                    デフォルトのスクリプトファイルをロー"
+"ドしない\n"
 
 #: ../src/daemon/cmdline.c:247
 msgid "--daemonize expects boolean argument"
@@ -562,8 +597,8 @@ msgid ""
 "--log-level expects log level argument (either numeric in range 0..4 or one "
 "of debug, info, notice, warn, error)."
 msgstr ""
-"--log-level はログレベル引数を予期します(数値幅0〜4、又はデバグ、情報、注記、警告、エラーの "
-"中の1つ)"
+"--log-level はログレベル引数を予期します(数値幅0〜4、又はデバグ、情報、注"
+"記、警告、エラーの 中の1つ)"
 
 #: ../src/daemon/cmdline.c:276
 msgid "--high-priority expects boolean argument"
@@ -587,7 +622,8 @@ msgstr "--use-pid-file はブーリアン引数を予期します "
 
 #: ../src/daemon/cmdline.c:321
 msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
-msgstr "無効なログターゲット: 'syslog' か、 'stderr' か、'auto' を使用して下さい。"
+msgstr ""
+"無効なログターゲット: 'syslog' か、 'stderr' か、'auto' を使用して下さい。"
 
 #: ../src/daemon/cmdline.c:328
 msgid "--log-time expects boolean argument"
@@ -659,80 +695,85 @@ msgstr "破棄の警告: %s\n"
 msgid "Path: %s\n"
 msgstr "パス: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] 無効なログターゲット '%s'"
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] 無効なログレベル '%s'"
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] 無効な再サンプル方法 '%s'"
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] 無効な rlimit '%s'"
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit はこのプラットフォームではサポートがありません。"
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] 無効なサンプル形式 '%s'"
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] 無効なサンプルレート '%s'"
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] 無効なサンプルチャンネル '%s'"
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] 無効なチャンネルマップ '%s'"
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] 無効なフラグメントの数 '%s'"
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] 無効なフラグメントサイズ '%s'"
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] 無効なナイスレベル '%s'"
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] 無効なサンプルレート '%s'"
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "設定ファイルを開くのに失敗: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
 msgstr ""
-"指定されたデフォルトのチャンネルマップは、指定されたデフォルトの "
-"チャンネル数とは異なる チャンネル数を持っています。"
+"指定されたデフォルトのチャンネルマップは、指定されたデフォルトの チャンネル数"
+"とは異なる チャンネル数を持っています。"
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### 設定ファイルから読み込み: %s ###\n"
@@ -778,8 +819,8 @@ msgid "Rear Right"
 msgstr "右後ろ"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "低周波エミッタ"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1124,191 +1165,191 @@ msgstr "XOpenDisplay() は失敗"
 msgid "Failed to parse cookie data"
 msgstr "クッキーデータの構文解析に失敗"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "設定ファイル'%s' を開くのに失敗: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "クッキーがロードされていません。無い状態で接続を試行"
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "不明な拡張子 '%s' のメッセージを受信"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "ストリームの排出に失敗: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "排出したストリームを再生"
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "サーバーへの排出接続"
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() は失敗: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() は失敗: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() は失敗: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "ストリームは正常に作成完了"
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() は失敗: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "バッファメトリックス: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "バッファメトリックス: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "サンプル仕様 '%s' 、チャンネルマップ '%s' を使用。"
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "デバイス %s に接続 (%u, %ssuspended)"
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "ストリームエラー: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "ストリームデバイス休止 %s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "ストリームデバイス復帰 %s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "ストリームアンダーラン %s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "ストリームオーバーラン %s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "ストリーム開始 %s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "ストリームはデバイス %s へ移動 (%u, %ssuspended).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "not "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "ストリームバッファの属性変更 %s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "接続が確立 %s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() は失敗: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() は失敗: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() は失敗: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "接続失敗: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "EOF 取得"
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() は失敗: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "信号取得、退出中"
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "レイテンシー取得に失敗: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "時間: %0.3f sec ; レイテンシー: %0.0f usec"
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() は失敗: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1360,10 +1401,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [options]\n"
@@ -1376,52 +1421,50 @@ msgstr ""
 "\n"
 "  -v, --verbose                         詳細操作を有効にする\n"
 "\n"
-"  -s, --server=SERVER                   接続先サーバーの名前 "
-"\n"
-"  -d, --device=DEVICE                   接続先シンク/ソースの名前 "
-"\n"
-"  -n, --client-name=NAME                サーバーでこのクライアントへのコール方法 "
-"\n"
-"      --stream-name=NAME                サーバー上でこのストリームへのコール方法"
-"\n"
-"      --volume=VOLUME                   初期 (リニア) ボリューム幅を指定 "
-" 0...65536\n"
-"      --rate=SAMPLERATE                 サンプルレートを Hz で表示 (デフォルトは "
-"44100)\n"
+"  -s, --server=SERVER                   接続先サーバーの名前 \n"
+"  -d, --device=DEVICE                   接続先シンク/ソースの名前 \n"
+"  -n, --client-name=NAME                サーバーでこのクライアントへのコール"
+"方法 \n"
+"      --stream-name=NAME                サーバー上でこのストリームへのコール"
+"方法\n"
+"      --volume=VOLUME                   初期 (リニア) ボリューム幅を指定  "
+"0...65536\n"
+"      --rate=SAMPLERATE                 サンプルレートを Hz で表示 (デフォル"
+"トは 44100)\n"
 "      --format=SAMPLEFORMAT             サンプルタイプ, 次の1つ s16le, "
 "s16be, u8, float32le,\n"
 "                                        float32be, ulaw, alaw, s32le, s32be, "
 "s24le, s24be,\n"
 "                                        s24-32le, s24-32be (デフォルトは "
 "s16ne)\n"
-"      --channels=CHANNELS               チャンネルの数, モノ用に1, "
-"ステレオ用に2\n"
+"      --channels=CHANNELS               チャンネルの数, モノ用に1, ステレオ"
+"用に2\n"
 "                                        (デフォルトは 2)\n"
-"      --channel-map=CHANNELMAP          デフォルトの代わりに使用するチャンネルマップ "
-"\n"
-"      --fix-format                      ストリームの接続先であるシンクからサンプル形式を取る "
-"\n"
-"\n"
-"      --fix-rate                        ストリームの接続先であるシンクからサンプルレートを取る "
-"\n"
+"      --channel-map=CHANNELMAP          デフォルトの代わりに使用するチャンネ"
+"ルマップ \n"
+"      --fix-format                      ストリームの接続先であるシンクからサ"
+"ンプル形式を取る \n"
 "\n"
-"      --fix-channels                    ストリームの接続先であるシンクからチャンネル数と "
-"チャンネルマップを取る\n"
+"      --fix-rate                        ストリームの接続先であるシンクからサ"
+"ンプルレートを取る \n"
 "\n"
-"      --no-remix                         チャンネルのアップミックスやダウンミックスをしない\n"
-"      --no-remap                        名前の代わりにインデックスでチャンネルをマップする"
-"\n"
-"      --latency=BYTES                   指定レイテンシーをバイトで要求 "
-"\n"
-"      --process-time=BYTES              要求毎の指定プロセスタイムをバイトで要求 "
-"\n"
-"      --property=PROPERTY=VALUE         指定プロパティを指定値にセット"
+"      --fix-channels                    ストリームの接続先であるシンクから"
+"チャンネル数と チャンネルマップを取る\n"
 "\n"
+"      --no-remix                         チャンネルのアップミックスやダウン"
+"ミックスをしない\n"
+"      --no-remap                        名前の代わりにインデックスでチャンネ"
+"ルをマップする\n"
+"      --latency=BYTES                   指定レイテンシーをバイトで要求 \n"
+"      --process-time=BYTES              要求毎の指定プロセスタイムをバイトで"
+"要求 \n"
+"      --property=PROPERTY=VALUE         指定プロパティを指定値にセット\n"
 "      --raw                             録音/再生の生の PCM データ\n"
-"      --file-format=FFORMAT             録音/再生のフォーマットした PCM データ\n"
+"      --file-format=FFORMAT             録音/再生のフォーマットした PCM デー"
+"ã‚¿\n"
 "      --list-file-formats               利用可能なファイル形式を一覧表示\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1432,168 +1475,170 @@ msgstr ""
 "libpulse %s でコンパイル \n"
 "libpulse %s で接続\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "無効なクライアント名 '%s'"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "無効なストリーム名 '%s'"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "無効なチャンネルマップ '%s'"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "無効なレイテンシー仕様 '%s'"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "無効なプロセスタイム仕様 '%s'"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "無効なプロパティ '%s'"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "不明なファイル形式 '%s'"
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "無効なサンプル仕様"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "引数が多過ぎます。"
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "ファイル用のサンプル仕様の生成に失敗しました。"
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "オーディオファイルを開くのに失敗しました。"
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
 msgstr "警告: 指定されたサンプルの仕様はファイルからの仕様で上書きされます。"
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "ファイルからのサンプル仕様の決定に失敗しました。"
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "警告: ファイルからのチャンネルマップの決定に失敗しました。"
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "チャンネルマップはサンプル仕様に一致しません。"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "警告: ファイルへのチャンネルマップ書き込みに失敗しました。"
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr "サンプル仕様 '%s' と チャンネルマップ '%s' で  %s ストリームを開いています。"
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr ""
+"サンプル仕様 '%s' と チャンネルマップ '%s' で  %s ストリームを開いています。"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "録音"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "再生"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() は失敗"
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() は失敗"
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() は失敗"
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() は失敗: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() は失敗"
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() は失敗"
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "休止の失敗: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "復帰の失敗: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "警告: サウンドサーバーはローカルではありません。休止しません。\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "接続失敗 : %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "SIGINT 取得、退出中 \n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "警告: 子プロセスは信号 %u で終了しました\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1608,11 +1653,10 @@ msgstr ""
 "\n"
 "  -h, --help                            このヘルプを表示\n"
 "      --version                         バージョンを表示\n"
-"  -s, --server=SERVER                   接続先サーバーの名前 "
-"\n"
+"  -s, --server=SERVER                   接続先サーバーの名前 \n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1623,50 +1667,61 @@ msgstr ""
 "libpulse %s でコンパイル\n"
 "libpulse %s でリンク\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() は失敗\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() は失敗\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() は失敗\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "統計の取得に失敗しました: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "現在使用中: %u ブロックは合計 %s バイトを含む \n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "総寿命の期間中に割り当て: %u ブロックは合計  %s バイトを含む\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "サンプルのキャッシュサイズ: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "サーバー情報の取得に失敗 : %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1674,7 +1729,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "ユーザー名: %s\n"
 "ホスト名: %s\n"
@@ -1686,12 +1741,12 @@ msgstr ""
 "デフォルトソース: %s\n"
 "クッキー: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "シンク情報の取得に失敗しました: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1730,22 +1785,22 @@ msgstr ""
 "\tプロパティ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tポート:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\t活動中ポート: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "ソース情報の取得に失敗しました: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1784,20 +1839,20 @@ msgstr ""
 "\tプロパティ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n/a"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "モジュール情報の取得に失敗しました: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1814,12 +1869,12 @@ msgstr ""
 "\tプロパティ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "クライアント情報の取得に失敗しました: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1834,12 +1889,12 @@ msgstr ""
 "\tプロパティ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "カード情報の取得に失敗しました: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1856,22 +1911,22 @@ msgstr ""
 "\tプロパティ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tプロフィール:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\t有効なプロフィール: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "シンク入力情報の取得に失敗しました: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1908,12 +1963,12 @@ msgstr ""
 "\tプロパティ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "ソース出力情報の取得に失敗しました: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1942,12 +1997,12 @@ msgstr ""
 "\tプロパティ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "サンプル情報の取得に失敗しました: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1978,26 +2033,80 @@ msgstr ""
 "\tプロパティ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "失敗: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "サンプルのアップロードに失敗しました: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "ファイルの早期終了"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "無効なサーバー"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT を取得、退出中"
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2020,6 +2129,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2054,12 +2164,11 @@ msgstr ""
 "  -h, --help                            このヘルプを表示\n"
 "      --version                         バージョンを表示\n"
 "\n"
-"  -s, --server=SERVER                   接続先サーバーの名前 "
-"\n"
-"  -n, --client-name=NAME                サーバーでこのクライアントへのコール方法 "
-"\n"
+"  -s, --server=SERVER                   接続先サーバーの名前 \n"
+"  -n, --client-name=NAME                サーバーでこのクライアントへのコール"
+"方法 \n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2070,103 +2179,106 @@ msgstr ""
 "libpulse %s でコンパイル\n"
 "libpulse %s でリンク\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "ロードするサンプルファイルを指定して下さい"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "サウンドファイルを開くのに失敗しました。"
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "警告: ファイルからサンプル仕様を決定するのに失敗しました。"
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "再生するサンプル名を指定する必要があります"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "削除するサンプル名を指定する必要があります。"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "シンク入力インデックスとシンクを指定する必要があります"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "ソース出力インデックスとソースを指定する必要があります"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "モジュール名と引数を指定する必要があります"
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "モジュールインデックスを指定する必要があります"
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
-msgstr "シンクは1つ以上は指定できません。ブーリアン値を1つ指定する必要があります。"
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
+msgstr ""
+"シンクは1つ以上は指定できません。ブーリアン値を1つ指定する必要があります。"
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr "ソースは1つ以上は指定できません。ブーリアン値を1つ指定する必要があります。"
+msgstr ""
+"ソースは1つ以上は指定できません。ブーリアン値を1つ指定する必要があります。"
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "カードの名前/インデックスとプロフィール名を指定する必要があります"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "シンクの名前/インデックスとポート名を指定する必要があります"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "ソースの名前/インデックスとポート名を指定する必要があります"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "シンクの名前/インデックスとボリュームを指定する必要があります"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "無効なボリューム仕様"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "ソースの名前/インデックスとボリュームを指定する必要があります"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "シンク入力インデックスとボリュームを指定する必要があります"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "無効なシンク入力インデックス"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "シンクの名前/インデックスとミュートブーリアンを指定する必要があります"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "ソースの名前/インデックスとミュートブーリアンを指定する必要があります"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "シンク入力インデックスとミュートブーリアンを指定する必要があります"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "無効なシンク入力インデックス仕様"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "有効なコマンドが指定されていません"
 
@@ -2183,10 +2295,11 @@ msgid ""
 msgstr ""
 "%s [-D display] [-S server] [-O sink] [-I source] [-c file]  [-d|-e|-i|-r]\n"
 "\n"
-" -d    X11 ディスプレイに接続した現在の PulseAudio のデータを表示 (デフォルト)\n"
+" -d    X11 ディスプレイに接続した現在の PulseAudio のデータを表示 (デフォル"
+"ト)\n"
 " -e    X11 ディスプレイにローカル PulseAudio データをエキスポート\n"
-" -i    X11 ディスプレイからローカル環境変数とクッキーに PulseAudio データをインポート "
-"\n"
+" -i    X11 ディスプレイからローカル環境変数とクッキーに PulseAudio データをイ"
+"ンポート \n"
 " -r    X11 ディスプレイから PulseAudio データを削除\n"
 
 #: ../src/utils/pax11publish.c:94
@@ -2249,44 +2362,46 @@ msgstr "クッキーデータのロードに失敗\n"
 msgid "Not yet implemented.\n"
 msgstr "まだ実装されていません\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
-msgstr "PulseAudio デーモン自身が稼働していないか、又はセッションデーモンとして稼働していません。"
+msgstr ""
+"PulseAudio デーモン自身が稼働していないか、又はセッションデーモンとして稼働し"
+"ていません。"
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "ソケット (PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "PulseAudio のキルに失敗"
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "デーモンが応答しません"
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "autospawn ロックにアクセスできません"
 
@@ -2302,10 +2417,10 @@ msgid ""
 msgstr ""
 "ALSA が新規のデータをデバイスに書き込むように催促しましたが、書き込むことが "
 "ありません!\n"
-"これは多分、ALSA ドライバー '%s' 内のバグです。この問題を ALSA 開発者に "
-"報告して下さい。\n"
-"POLLOUT セットで呼び起こされましたが、その結果としての snd_pcm_avail() は "
-"0 又は 他の値 < min_avail を返しました。"
+"これは多分、ALSA ドライバー '%s' 内のバグです。この問題を ALSA 開発者に 報告"
+"して下さい。\n"
+"POLLOUT セットで呼び起こされましたが、その結果としての snd_pcm_avail() は 0 "
+"又は 他の値 < min_avail を返しました。"
 
 #: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
 #, c-format
@@ -2319,44 +2434,48 @@ msgid ""
 msgstr ""
 "ALSA はデバイスから新規データを読み込むように催促しましたが、読み込むものが "
 "ありません!\n"
-"これは多分、ALSA ドライバー'%s' 内のバグです。この問題を ALSA 開発者に "
-"報告して下さい。\n"
-"POLLIN セットで呼び起こされましたが、その結果としての snd_pcm_avail() は "
-"0 又は 他の値 < min_avail を返しました。"
+"これは多分、ALSA ドライバー'%s' 内のバグです。この問題を ALSA 開発者に 報告し"
+"て下さい。\n"
+"POLLIN セットで呼び起こされましたが、その結果としての snd_pcm_avail() は 0 又"
+"は 他の値 < min_avail を返しました。"
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "オフ"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "ハイファイ再生 (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "ハイファイキャプチャ (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "テレフォニーデュプレックス (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio サウンドサーバー"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "出力デバイス"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "入力デバイス"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "@HOSTNAME@ 上のオーディオ"
 
@@ -2420,133 +2539,159 @@ msgstr "アンプ"
 msgid "No Amplifier"
 msgstr "アンプなし"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "ブースト"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "ブーストなし"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "アナログヘッドフォン"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "アナログ入力"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "アナログマイクロフォン"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "アナログラインイン"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "アナログラジオ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "アナログビデオ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "アナログ出力"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "アナログヘッドフォン"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "アナログ出力 (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "アナログモノ出力"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "アナログステレオ"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "アナログモノ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "アナログステレオ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "アナログサラウンド 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "アナログサラウンド 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "アナログサラウンド 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "アナログサラウンド 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "アナログサラウンド 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "アナログサラウンド 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "アナログサラウンド 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "アナログサラウンド 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "アナログサラウンド 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "アナログサラウンド 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "アナログサラウンド 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "デジタルステレオ (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "デジタルサラウンド 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "デジタルサラウンド 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "デジタルサラウンド 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "デジタルステレオ (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "アナログモノデュプレックス"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "アナログステレオデュプレックス"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "デジタルステレオデュプレックス (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "低周波エミッタ"
diff --git a/po/kn.po b/po/kn.po
index f11ef80..96afa31 100644
--- a/po/kn.po
+++ b/po/kn.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.kn\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-07 02:45+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-12-08 11:50+0530\n"
 "Last-Translator: Shankar Prasad <svenkate at redhat.com>\n"
 "Language-Team: Kannada <kde-l10n-kn at kde.org>\n"
@@ -17,12 +17,12 @@ msgstr ""
 "X-Generator: Lokalize 1.0\n"
 "Plural-Forms:  nplurals=2; plural=(n != 1);\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -34,7 +34,7 @@ msgstr ""
 "ಇದಕ್ಕೆ ALSA ಚಾಲಕ '%s' ದಲ್ಲಿನ ಒಂದು ದೋಷದ ಕಾರಣವಿರಬಹುದು. ದಯವಿಟ್ಟುಈ ತೊಂದರೆಯನ್ನು ALSA "
 "ವಿಕಸನಗಾರರ ಗಮನಕ್ಕೆ ತನ್ನಿ."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -46,7 +46,7 @@ msgstr ""
 "ಇದಕ್ಕೆ ALSA ಚಾಲಕ '%s' ದಲ್ಲಿನ ಒಂದು ದೋಷದ ಕಾರಣವಿರಬಹುದು. ದಯವಿಟ್ಟುಈ ತೊಂದರೆಯನ್ನು ALSA "
 "ವಿಕಸನಗಾರರ ಗಮನಕ್ಕೆ ತನ್ನಿ."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -92,11 +92,11 @@ msgstr "ಕ್ಲಾಕ್‌ ಮಾಡಲಾದ NULL ಸಿಂಕ್"
 msgid "Null Output"
 msgstr "ಶೂನ್ಯ ಔಟ್‌ಪುಟ್"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "ಆಂತರಿಕ ಆಡಿಯೊ"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "ಮಾಡೆಮ್"
 
@@ -112,92 +112,98 @@ msgstr "ಹೊಸ dl ಲೋಡರ್ ಅನ್ನು ನಿಯೋಜಿಸುವ
 msgid "Failed to add bind-now-loader."
 msgstr "bind-now-ಲೋಡರ್ ಅನ್ನು ಸೇರಿಸಲಾಗಿಲ್ಲ."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "%s ನಿಂದ ಸಂಕೇತವು ದೊರೆತಿದೆ."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "ನಿರ್ಗಮಿಸುತ್ತಿದೆ."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "ಬಳಕೆದಾರ '%s' ಅನ್ನು ಪತ್ತೆ ಮಾಡಲು ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "ಗುಂಪು '%s' ಅನ್ನು ಪತ್ತೆ ಮಾಡಲು ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "ಬಳಕೆದಾರ '%s' (UID %lu) ಹಾಗು ಗುಂಪು '%s' (GID %lu) ಕಂಡುಬಂದಿದೆ."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "ಬಳಕೆದಾರ '%s' ರ GID ಹಾಗು ಗುಂಪು '%s' ತಾಳೆಯಾಗುತ್ತಿಲ್ಲ."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "ಬಳಕೆದಾರ '%s' ರ ನೆಲೆ ಕೋಶವು '%s' ಆಗಿಲ್ಲ, ಆಲಕ್ಷಿಸಲಾಗುತ್ತಿದೆ."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "'%s' ಅನ್ನು ರಚಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "ಗುಂಪಿನ ಪಟ್ಟಿಯನ್ನು ಬದಲಾಯಿಸಲು ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "GID ಅನ್ನು ಬದಲಾಯಿಸಲು ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "UID ಅನ್ನು ಬದಲಾಯಿಸಲು ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "ರೂಟ್ ಸವಲತ್ತುಗಳನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಬಿಡಲಾಗಿದೆ."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "ವ್ಯವಸ್ಥೆಯಾದ್ಯಂತದ ಕ್ರಮಕ್ಕೆ ಈ ಪ್ಲಾಟ್‌ಫಾರ್ಮಿನಲ್ಲಿ ಬೆಂಬಲವಿಲ್ಲ."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "ಆಜ್ಞಾ ಸಾಲನ್ನು ಪಾರ್ಸ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "ಡೀಮನ್ ಚಲಾಯಿತಗೊಳ್ಳುತ್ತಿದೆ"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "ಡೀಮನ್ PID %u ಯಾಗಿ ಚಲಾಯಿಗೊಳ್ಳುತ್ತಿದೆ"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "ಡೀಮನ್ ಅನ್ನು ಕೊಲ್ಲಲು ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -205,162 +211,178 @@ msgstr ""
 "ಈ ಪ್ರೋಗ್ರಾಮನ್ನು ರೂಟ್‌ ಆಗಿ ಚಲಾಯಿಸುವ ಉದ್ಧೇಶವನ್ನು ಹೊಂದಿಲ್ಲ (--system ಅನ್ನು ಸೂಚಿಸದೆ "
 "ಇದ್ದಲ್ಲಿ ಮಾತ್ರ)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "ನಿರ್ವಾಹಕ ಸವಲತ್ತುಗಳ ಅಗತ್ಯವಿದೆ."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "ವ್ಯವಸ್ಥೆಯ ಸನ್ನಿವೇಶದಿಂದ --start ಬೆಂಬಲಿತವಾಗಿಲ್ಲ."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr ""
 "ವ್ಯವಸ್ಥೆಯ ಕ್ರಮದಲ್ಲಿ ಚಲಾಯಿತಗೊಳ್ಳುತ್ತಿದೆ, ಆದರೆ --disallow-exit ಅನ್ನು ಹೊಂದಿಸಲಾಗಿಲ್ಲ!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 "ವ್ಯವಸ್ಥೆಯ ಕ್ರಮದಲ್ಲಿ ಚಲಾಯಿತಗೊಳ್ಳುತ್ತಿದೆ, ಆದರೆ --disallow-module-loading ಅನ್ನು "
 "ಹೊಂದಿಸಲಾಗಿಲ್ಲ!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr ""
 "ವ್ಯವಸ್ಥೆಯ ಕ್ರಮದಲ್ಲಿ ಚಲಾಯಿತಗೊಳ್ಳುತ್ತಿದ್ದು, SHM ಕ್ರಮವನ್ನು ಒತ್ತಾಯಪೂರ್ವಕವಾಗಿ "
 "ಅಶಕ್ತಗೊಳಿಸುತ್ತಿದೆ!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 "ವ್ಯವಸ್ಥೆಯ ಕ್ರಮದಲ್ಲಿ ಚಲಾಯಿತಗೊಳ್ಳುತ್ತಿದ್ದು, ನಿರ್ಗಮಿಸುವ ಜಡ ಸಮಯವನ್ನು ಒತ್ತಾಯಪೂರ್ವಕವಾಗಿ "
 "ಅಶಕ್ತಗೊಳಿಸುತ್ತಿದೆ!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "stdio ಅನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "ಪೈಪ್‌ ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "ಡೀಮನ್ ಆರಂಭಗೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "ಡೀಮನ್ ಅನ್ನು ಯಶಸ್ವಿಯಾಗಿ ಆರಂಭಿಸಲಾಗಿದೆ."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() ವಿಫಲಗೊಂಡಿದೆ: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "ಇದು PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "ಕಂಪೈಲ್ ಮಾಡುವ ಅತಿಥೇಯ: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "ಕಂಪೈಲ್ ಮಾಡುವ CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "ಅತಿಥೇಯದಲ್ಲಿ ಚಲಾಯಿತಗೊಳ್ಳುತ್ತಿದೆ: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u CPUಗಳು ಕಂಡುಬಂದಿವೆ."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "ಪುಟದ ಗಾತ್ರವು %lu ಬೈಟ್‌ಗಳಾಗಿವೆ"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Valgrind ಬೆಂಬಲದೊಂದಿಗೆ ಕಂಪೈಲ್ ಮಾಡಲಾಗಿದೆ: ಹೌದು"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Valgrind ಬೆಂಬಲದೊಂದಿಗೆ ಕಂಪೈಲ್ ಮಾಡಲಾಗಿದೆ: ಇಲ್ಲ"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "valgrind ಕ್ರಮದಲ್ಲಿ ಚಲಾಯಿಸಲಾಗುತ್ತಿದೆ: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "ಅತಿಥೇಯದಲ್ಲಿ ಚಲಾಯಿತಗೊಳ್ಳುತ್ತಿದೆ: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "ಪ್ರಶಸ್ತವಾದ ನಿರ್ಮಾಣ: ಹೌದು"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "ಪ್ರಶಸ್ತವಾದ ನಿರ್ಮಾಣ: ಇಲ್ಲ"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG ಅನ್ನು ಸೂಚಿಸಲಾಗಿದೆ, ಎಲ್ಲಾ ಪ್ರತಿಪಾದನೆಗಳನ್ನೂ ಅಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
-msgstr "FASTPATH ಅನ್ನು ಸೂಚಿಸಲಾಗಿದೆ, ಕೇವಲ ವೇಗ ಮಾರ್ಗದ ಪ್ರತಿಪಾದನೆಗಳನ್ನೂ ಅಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ."
+msgstr ""
+"FASTPATH ಅನ್ನು ಸೂಚಿಸಲಾಗಿದೆ, ಕೇವಲ ವೇಗ ಮಾರ್ಗದ ಪ್ರತಿಪಾದನೆಗಳನ್ನೂ ಅಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "ಎಲ್ಲಾ ಪ್ರತಿಪಾದನೆಗಳನ್ನೂ ಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "ಮೆಶೀನ್ ID ಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "ಮೆಶೀನ್ ID ಯು %s ಆಗಿದೆ."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "ಅಧಿವೇಶನ ID ಯು %s ಆಗಿದೆ."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "ಚಲಾವಣಾಸಮಯ(ರನ್‌ಟೈಮ್) ಕೋಶ %s ಅನ್ನು ಬಳಸಿಕೊಂಡು."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "ಸ್ಥಿತಿ ಕೋಶ %s ಅನ್ನು ಬಳಸಿಕೊಂಡು."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "ಘಟಕಗಳ ಕೋಶ %s ಅನ್ನು ಬಳಸಿಕೊಂಡು."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "ವ್ಯವಸ್ಥೆಯ ಕ್ರಮದಲ್ಲಿ ಚಲಾಯಿಸಲಾಗುತ್ತಿದೆ: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -376,15 +398,15 @@ msgstr ""
 "ವ್ಯವಸ್ಥೆಯ ಕ್ರಮವು (ಸಿಸ್ಟಮ್ ಮೋಡ್) ಏಕೆ ಒಂದು ಸರಿಯಲ್ಲದ ಬಳಕೆ ಎಂದು ಅರಿಯಲು ದಯವಿಟ್ಟು http://"
 "pulseaudio.org/wiki/WhatIsWrongWithSystemMode ಅನ್ನು ನೋಡಿ."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "ತಾಜಾ ರೆಸಲ್ಯೂಶನ್ ಟೈಮರ್ ಲಭ್ಯವಿದೆ! Bon appetit!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -392,27 +414,27 @@ msgstr ""
 "ಮಹಾಶಯರೆ, ನಿಮ್ಮ ಕರ್ನಲ್ ಕೊಳೆತುಹೋಗಿದೆ! ಅತ್ಯುತ್ತಮ ರೆಸಲ್ಯೂಶನ್ ಟೈಮರ್ ಅನ್ನು ಶಕ್ತಗೊಳಿಸಲಾದ "
 "ಲಿನಕ್ಸನ್ನು ಬಳಸುವಂತೆ ಅಡುಗೆಯವರು ಸಲಹೆ ಮಾಡುತ್ತಿದ್ದಾರೆ!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "ಡೀಮನ್ ಅನ್ನು ಆರಂಭಿಸಲು ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "ಲೋಡ್ ಮಾಡಲಾದ ಯಾವುದೆ ಡೀಮನ್ ಇಲ್ಲದೆ ಆರಂಭಗೊಂಡಿದೆ, ಕೆಲಸ ಮಾಡಲು ನಿರಾಕರಿಸಿದೆ."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "ಡೀಮನ್ ಆರಂಭಗೊಳಿಕೆ ಪೂರ್ಣಗೊಂಡಿದೆ."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "ಡೀಮನ್ ಸ್ಥಗಿತಗೊಳಿಕೆಯನ್ನು ಆರಂಭಿಸಲಾಗಿದೆ."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "ಡೀಮನ್ ಅನ್ನು ಅಂತ್ಯಗೊಳಿಸಲಾಗಿದೆ."
 
@@ -674,72 +696,77 @@ msgstr "DEPRECATION WARNING: %s\n"
 msgid "Path: %s\n"
 msgstr "ಮಾರ್ಗ: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ದಾಖಲೆ ಗುರಿ '%s'."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ದಾಖಲೆ ಮಟ್ಟ '%s'."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ಮರುನಮೂನೆ ವಿಧಾನ '%s'."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ rlimit '%s'."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit ಗೆ ಈ ಪ್ಲಾಟ್‌ಫಾರ್ಮಿನಲ್ಲಿ ಬೆಂಬಲವಿಲ್ಲ."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ನಮೂನೆ ರಚನೆ '%s'."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ನಮೂನೆ ದರ '%s'."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ನಮೂನೆ ಚಾನಲ್‌ಗಳು '%s'."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ಚಾನಲ್ ನಕ್ಷೆ '%s'."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] ಅಮಾನ್ತವಾದ ಫ್ರಾಗ್ಮೆಂಟುಗಳ ಸಂಖ್ಯೆ '%s'."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ಫ್ರಾಗ್ಮೆಂಟ್ ಗಾತ್ರ '%s'."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ನೈಸ್‌ ಹಂತ '%s'."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] ಅಮಾನ್ಯವಾದ ನಮೂನೆ ದರ '%s'."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "ಸಂರಚನಾ ಕಡತವನ್ನು ತೆರೆಯಲು ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -747,7 +774,7 @@ msgstr ""
 "ಸೂಚಿಸಲಾದ ಪೂರ್ವನಿಯೋಜಿತ ಚಾನಲ್ ನಕ್ಷೆಯು ಪೂರ್ವನಿಯೋಜಿತ ಚಾನಲ್‌ಗಳ ಸಂಖ್ಯೆಗಳಿಗಿಂತ ವಿಭಿನ್ನವಾದ "
 "ಮಾರ್ಗಗಳ ಸಂಖ್ಯೆಯನ್ನು ಹೊಂದಿದೆ."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### ಸಂರಚನಾ ಕಡತದಿಂದ ಓದು: %s ###\n"
@@ -793,8 +820,8 @@ msgid "Rear Right"
 msgstr "ಹಿಂಬದಿಯ ಬಲಭಾಗ"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "ಕೆಳಮಟ್ಟದ ಫ್ರೀಕ್ವೆನ್ಸಿ ಉತ್ಪಾದಕ"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1139,192 +1166,192 @@ msgstr "XOpenDisplay() ವಿಫಲಗೊಂಡಿದೆ"
 msgid "Failed to parse cookie data"
 msgstr "ಕುಕಿ ದತ್ತಾಂಶವನ್ನು ಪಾರ್ಸ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "ಸಂರಚನಾ ಕಡತ '%s' ಅನ್ನು ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr ""
 "ಯಾವುದೆ ಕುಕಿಯನ್ನು ಲೋಡ್ ಮಾಡಲಾಗಿಲ್ಲ. ಕುಕಿ ಇಲ್ಲದೆ ಸಂಪರ್ಕಸಾಧಿಸಲು ಪ್ರಯತ್ನಿಸಲಾಗುತ್ತಿದೆ."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "ಫೋರ್ಕ್(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "ಅಜ್ಞಾತ ವಿಸ್ತರಣೆ '%s' ಇಂದ ಸಂದೇಶವನ್ನು ಪಡೆದುಕೊಳ್ಳಲಾಗಿದೆ"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "ಸ್ಟ್ರೀಮನ್ನು ಬರಿದಾಗಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "ಪ್ಲೇಬ್ಯಾಕ್ ಸ್ಟ್ರೀಮನ್ನು ಬರಿದಾಗಿಸಲಾಗಿದೆ."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "ಪರಿಚಾರಕಕ್ಕೆ ಬರಿದಾಗಿಸುವ ಸಂಪರ್ಕ."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "ಸ್ಟ್ರೀಮನ್ನು ಯಶಸ್ವಿಯಾಗಿ ನಿರ್ಮಿಸಲಾಗಿದೆ."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "ಬಫರ್ ಮೆಟ್ರಿಕ್‌ಗಳು: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "ಬಫರ್ ಮೆಟ್ರಿಕ್‌ಗಳು: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "ನಮೂನೆಯ ವಿವರ '%s' ಅನ್ನು, ಚಾನಲ್‌ ನಕ್ಷೆ '%s' ಅನ್ನು ಬಳಸಿಕೊಂಡು."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "ಸಾಧನ %s ಕ್ಕೆ ಸಂಪರ್ಕ ಜೋಡಿಸಲಾಗಿದೆ (%u, %ssuspended)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "ಸ್ಟ್ರೀಮ್ ದೋಷ: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "ಸ್ಟ್ರೀಮ್ ಸಾಧನವನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ ತಡೆಹಿಡಿಯಲಾಗಿದೆ.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "ಸ್ಟ್ರೀಮ್ ಸಾಧನವನ್ನು ಮರಳಿ ಆರಂಭಿಸಲಾಗಿದೆ.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "ಸ್ಟ್ರೀಮ್ ಅನ್ನು ಕಡಿಮೆ ಚಲಾಯಿಸಲಾಗಿದೆ.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "ಸ್ಟ್ರೀಮ್ ಅನ್ನು ಹೆಚ್ಚು ಚಲಾಯಿಸಲಾಗಿದೆ.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "ಸ್ಟ್ರೀಮ್ ಅನ್ನು ಆರಂಭಿಸಲಾಗಿದೆ.%s "
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "ಸಾಧನ %s ಕ್ಕೆ ಸ್ಟ್ರೀಮ್‌ ಅನ್ನು ಸ್ಥಳಾಂತರಿಸಲಾಗಿದೆ (%u, %ssuspended).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "ಇಲ್ಲ "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "ಸ್ಟ್ರೀಮ್ ಬಫರ್ ಗುಣವಿಶೇಷತೆಗಳನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "ಸಂಪರ್ಕವನ್ನು ಸಾಧಿಸಲಾಗಿದೆ.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "ಸಂಪರ್ಕದ ವಿಫಲತೆ: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "EOF ಅನ್ನು ಪಡೆಯಲಾಗಿದೆ."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "ಸಂಕೇತ ದೊರೆತಿದೆ, ನಿರ್ಗಮಿಸುತ್ತಿದೆ."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "ಅಗೋಚರತೆಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "ಸಮಯ: %0.3f sec; ಅಗೋಚರತೆ: %0.0f usec."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1376,10 +1403,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [ಆಯ್ಕೆಗಳು]\n"
@@ -1435,7 +1466,7 @@ msgstr ""
 "ಮಾಡು/ಚಲಾಯಿಸು.\n"
 "      --list-file-formats               ಲಭ್ಯವಿರುವ ಕಡತ ವಿನ್ಯಾಸಗಳ ಪಟ್ಟಿ.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1446,170 +1477,172 @@ msgstr ""
 "libpulse %s ನೊಂದಿಗೆ ಕಂಪೈಲ್ ಮಾಡಲಾಗಿದೆ\n"
 "libpulse %s ನೊಂದಿಗೆ ಜೋಡಿಸಲಾಗಿದೆ\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "ಅಮಾನ್ಯವಾದ ಕ್ಲೈಂಟಿನ ಹೆಸರು '%s'"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "ಅಮಾನ್ಯವಾದ ಸ್ಟ್ರೀಮ್‌ನ ಹೆಸರು '%s'"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "ಅಮಾನ್ಯವಾದ ಚಾನಲ್ ನಕ್ಷೆ '%s'"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "ಅಮಾನ್ಯವಾದ ಅಗೋಚರತೆ ವಿವರಣೆ '%s'"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "ಅಮಾನ್ಯವಾದ ಪ್ರಕ್ರಿಯೆ ಸಮಯದ ವಿವರಣೆ '%s'"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "ಅಮಾನ್ಯವಾದ ಗುಣಲಕ್ಷಣ '%s'"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "ಅಮಾನ್ಯವಾದ ಕಡತ ವಿನ್ಯಾಸ %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "ಅಮಾನ್ಯವಾದ ನಮೂನೆ ವಿವರ"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "ಬಹಳಷ್ಟು ಆರ್ಗುಮೆಂಟ್‌ಗಳು."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "ನಮೂನೆಯ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "ಧ್ವನಿ ಕಡತವನ್ನು ತೆರೆಯುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
-msgstr "ಎಚ್ಚರಿಕೆ: ಸೂಚಿಸಲಾದ ನಮೂನೆ ವಿವರಣೆಯನ್ನು ಕಡತದಲ್ಲಿನ ವಿವರಣೆಯಿಂದ ತಿದ್ದಿಬರೆಯಲಾಗುತ್ತದೆ."
+msgstr ""
+"ಎಚ್ಚರಿಕೆ: ಸೂಚಿಸಲಾದ ನಮೂನೆ ವಿವರಣೆಯನ್ನು ಕಡತದಲ್ಲಿನ ವಿವರಣೆಯಿಂದ ತಿದ್ದಿಬರೆಯಲಾಗುತ್ತದೆ."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "ಕಡತದಿಂದ ನಮೂನೆಯ ವಿವರಣೆಯನ್ನು ನಿರ್ಧರಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "ಎಚ್ಚರಿಕೆ: ಕಡತದಿಂದ ಚಾನಲ್ ನಕ್ಷೆಯನ್ನು ನಿರ್ಧರಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "ಚಾನಲ್ ನಕ್ಷೆಯು ನಮೂನೆಯ ವಿವರಣೆಯೊಂದಿಗೆ ತಾಳೆಯಾಗುತ್ತಿಲ್ಲ"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "ಎಚ್ಚರಿಕೆ: ಕಡತಕ್ಕೆ ಚಾನಲ್ ನಕ್ಷೆಯನ್ನು ಬರೆಯುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
 "ಒಂದು %s ಸ್ಟ್ರೀಮ್‌ ಅನ್ನು ನಮೂನೆ ವಿವರಣೆ '%s' ಯೊಂದಿಗೆ ಹಾಗು ಚಾನಲ್ ನಕ್ಷೆ '%s' ಯೊಂದಿಗೆ "
 "ತೆರೆಯಲಾಗುತ್ತಿದೆ."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "ರೆಕಾರ್ಡಿಂಗ್"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "ಪ್ಲೇಬ್ಯಾಕ್‌"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "ಫೋರ್ಕ್(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "ಸ್ಥಗಿತಗೊಳಿಸಲು ವಿಫಲಗೊಂಡಿದೆ: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "ಮರಳಿ ಆರಂಭಿಸಲು ವಿಫಲಗೊಂಡಿದೆ: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "ಎಚ್ಚರಿಕೆ: ಧ್ವನಿ ಪರಿಚಾರಕವು ಸ್ಥಳೀಯವಾಗಿಲ್ಲ, ತಾತ್ಕಾಲಿಕವಾಗಿ ತಡೆಹಿಡಿಯಲಾಗುತ್ತಿಲ್ಲ.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "ಸಂಪರ್ಕದ ವಿಫಲತೆ: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "SIGINT ದೊರೆತಿದೆ, ನಿರ್ಗಮಿಸುತ್ತಿದೆ.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "ಎಚ್ಚರಿಕೆ: ಉಪ ಪ್ರಕ್ರಿಯೆಯು %u ಸಂಕೇತದೊಂದಿಗೆ ಅಂತ್ಯಗೊಂಡಿದೆ\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1627,7 +1660,7 @@ msgstr ""
 "  -s, --server=SERVER                   ಸಂಪರ್ಕಸಾಧಿಸಬೇಕಿರುವ ಪರಿಚಾರಕದ ಹೆಸರು\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1638,52 +1671,63 @@ msgstr ""
 "libpulse %s ನೊಂದಿಗೆ ಕಂಪೈಲ್ ಮಾಡಲಾಗಿದೆ\n"
 "libpulse %s ನೊಂದಿಗೆ ಜೋಡಿಸಲಾಗಿದೆ\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() ವಿಫಲಗೊಂಡಿದೆ.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() ವಿಫಲಗೊಂಡಿದೆ.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() ವಿಫಲಗೊಂಡಿದೆ.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "ಅಂಕಿಅಂಶಗಳನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "ಪ್ರಸಕ್ತ ಬಳಕೆಯಲ್ಲಿರುವುದು: %u ಖಂಡಗಳು ಒಟ್ಟು %s ಬೈಟ್‌ಗಳನ್ನು ಹೊಂದಿದೆ.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr ""
 "ಸಂಪೂರ್ಣ ಜೀವಿತಾವಧಿಯ ಸಮಯದಲ್ಲಿ ನಿಯೋಜಿಸಲಾಗಿದ್ದು: %u ಖಂಡಗಳು ಒಟ್ಟು %s ಬೈಟ್‌ಗಳನ್ನು "
 "ಹೊಂದಿದೆ.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "ನಮೂನೆಯ ಕ್ಯಾಶೆ ಗಾತ್ರ: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "ಪರಿಚಾರಕದ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1691,7 +1735,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "ಬಳಕೆದಾರ ಹೆಸರು: %s\n"
 "ಅತಿಥೇಯದ ಹೆಸರು: %s\n"
@@ -1703,12 +1747,12 @@ msgstr ""
 "ಪೂರ್ವನಿಯೋಜಿತ ಆಕರ: %s\n"
 "ಕುಕಿ: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "ಸಿಂಕ್‌ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1747,22 +1791,22 @@ msgstr ""
 "\tಗುಣಗಳು:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tಸಂಪರ್ಕಸ್ಥಾನಗಳು:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tಸಕ್ರಿಯ ಸಂಪರ್ಕಸ್ಥಾನ: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "ಆಕರದ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1801,20 +1845,20 @@ msgstr ""
 "\tಗುಣಗಳು:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "ಅನ್ವಯಿಸುವುದಿಲ್ಲ"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "ಘಟಕದ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1831,12 +1875,12 @@ msgstr ""
 "\tಗುಣಗಳು:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "ಕ್ಲೈಂಟಿನ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1851,12 +1895,12 @@ msgstr ""
 "\tಗುಣಗಳು:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "ಕಾರ್ಡಿನ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1873,22 +1917,22 @@ msgstr ""
 "\tಗುಣಗಳು:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tಪ್ರೊಫೈಲುಗಳು:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tಸಕ್ರಿಯ ಪ್ರೊಫೈಲುಗಳು: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "ಸಿಂಕ್‌ ಇನ್‌ಪುಟ್ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1925,12 +1969,12 @@ msgstr ""
 "\tಗುಣಗಳು:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "ಆಕರದ ಔಟ್‌ಪುಟ್ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1959,12 +2003,12 @@ msgstr ""
 "\tಗುಣಗಳು:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "ನಮೂನೆಯ ಮಾಹಿತಿಯನ್ನು ಪಡೆದುಕೊಳ್ಳುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1995,26 +2039,80 @@ msgstr ""
 "\tಗುಣಗಳು:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "ವಿಫಲತೆ: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "ನಮೂನೆಯನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "ಕಡತದ ಅಪ್ರಾಪ್ತ ಸಮಯದಲ್ಲಿ ಅಂತ್ಯ"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "ಅಮಾನ್ಯವಾದ ಪರಿಚಾರಕ"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT ದೊರೆತಿದೆ, ನಿರ್ಗಮಿಸುತ್ತಿದೆ."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2037,6 +2135,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2075,7 +2174,7 @@ msgstr ""
 "  -n, --client-name=NAME                ಪರಿಚಾರಕದಲ್ಲಿ ಈ ಕ್ಲೈಂಟಿನಲ್ಲಿ ಏನೆಂದು "
 "ಕರೆಯಬೇಕು\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2086,49 +2185,50 @@ msgstr ""
 "libpulse %s ನೊಂದಿಗೆ ಕಂಪೈಲ್ ಮಾಡಲಾಗಿದೆ\n"
 "libpulse %s ನೊಂದಿಗೆ ಜೋಡಿಸಲಾಗಿದೆ\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "ಲೋಡ್ ಮಾಡಬೇಕಿರುವ ಒಂದು ಕಡತದ ನಮೂನೆಯನ್ನು ಸೂಚಿಸಿ"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "ಧ್ವನಿ ಕಡತವನ್ನು ತೆರೆಯುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "ಎಚ್ಚರಿಕೆ: ಕಡತದಿಂದ ನಮೂನೆಯ ವಿವರವನ್ನು ನಿರ್ಧರಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "ಚಲಾಯಿಸಲು ನೀವು ಒಂದು ನಮೂನೆಯ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕಾಗುತ್ತದೆ"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "ತೆಗೆದು ಹಾಕಲು ನೀವು ಒಂದು ನಮೂನೆಯ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "ನೀವು ಒಂದು ಸಿಂಕ್ ಇನ್‌ಪುಟ್ ಸೂಚಿಯನ್ನು ಹಾಗು ಒಂದು ಸಿಂಕ್‌ ಅನ್ನು ಸೂಚಿಸಬೇಕು."
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "ನೀವು ಒಂದು ಆಕರ ಔಟ್‌ಪುಟ್ ಸೂಚಿಯನ್ನು ಹಾಗು ಒಂದು ಆಕರವನ್ನು ಸೂಚಿಸಬೇಕು."
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "ನೀವು ಒಂದು ಘಟಕದ ಹೆಸರನ್ನು ಹಾಗು ಆರ್ಗುಮೆಂಟುಗಳನ್ನು ಸೂಚಿಸಬೇಕು."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "ನೀವು ಒಂದು ಘಟಕ ಸೂಚಿಯನ್ನು ಸೂಚಿಸಬೇಕು"
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 "ನೀವು ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಸಿಂಕನ್ನು ಸೂಚಿಸಲಾಗುವುದಿಲ್ಲ. ನೀವು ಒಂದು ಬೂಲಿಯನ್‌ ಮೌಲ್ಯವನ್ನು "
 "ಸೂಚಿಸಬೇಕಾಗುತ್ತದೆ."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
@@ -2136,57 +2236,57 @@ msgstr ""
 "ನೀವು ಒಂದಕ್ಕಿಂತ ಹೆಚ್ಚಿನ ಆಕರವನ್ನು ಸೂಚಿಸಲಾಗುವುದಿಲ್ಲ. ನೀವು ಒಂದು ಬೂಲಿಯನ್‌ ಮೌಲ್ಯವನ್ನು "
 "ಸೂಚಿಸಬೇಕಾಗುತ್ತದೆ."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "ಒಂದು ಕಾರ್ಡಿನ ಹೆಸರು/ಸೂಚಿಯನ್ನು ಹಾಗು ಪ್ರೊಫೈಲ್‌ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "ನೀವು ಒಂದು ಸಿಂಕಿನ ಹೆಸರು/ಸೂಚಿಯನ್ನು ಹಾಗು ಸಂಪರ್ಕಸ್ಥಾನದ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "ನೀವು ಒಂದು ಆಕರದ ಹೆಸರು/ಸೂಚಿಯನ್ನು ಹಾಗು ಸಂಪರ್ಕಸ್ಥಾನದ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "ನೀವು ಒಂದು ಸಿಂಕಿನ ಹೆಸರು/ಸೂಚಿಯನ್ನು ಹಾಗು ಸಂಪರ್ಕಸ್ಥಾನದ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "ಅಮಾನ್ಯವಾದ ಧ್ವನಿ ಪ್ರಮಾಣದ ವಿವರ"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "ನೀವು ಒಂದು ಆಕರದ ಹೆಸರು/ಸೂಚಿಯನ್ನು ಹಾಗು ಸಂಪರ್ಕಸ್ಥಾನದ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "ನೀವು ಒಂದು ಸಿಂಕ್ ಇನ್‌ಪುಟ್ ಸೂಚಿಯನ್ನು ಹಾಗು ಒಂದು ಸಿಂಕ್‌ ಅನ್ನು ಸೂಚಿಸಬೇಕು"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "ಅಮಾನ್ಯವಾದ ಸಿಂಕ್ ಇನ್‌ಪುಟ್ ಸೂಚಿ"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "ನೀವು ಒಂದು ಸಿಂಕಿನ ಹೆಸರು/ಸೂಚಿಯನ್ನು ಹಾಗು ಸಂಪರ್ಕಸ್ಥಾನದ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "ನೀವು ಒಂದು ಆಕರದ ಹೆಸರು/ಸೂಚಿಯನ್ನು ಹಾಗು ಸಂಪರ್ಕಸ್ಥಾನದ ಹೆಸರನ್ನು ಸೂಚಿಸಬೇಕು"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "ನೀವು ಒಂದು ಸಿಂಕ್ ಇನ್‌ಪುಟ್ ಸೂಚಿಯನ್ನು ಹಾಗು ಒಂದು ಸಿಂಕ್‌ ಅನ್ನು ಸೂಚಿಸಬೇಕು"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "ಅಮಾನ್ಯವಾದ ಸಿಂಕ್ ಇನ್‌ಪುಟ್ ಸೂಚಿ ವಿವರ"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "ಮಾನ್ಯವಾದ ಯಾವುದೆ ಆಜ್ಞೆಯನ್ನು ಸೂಚಿಸಲಾಗಿಲ್ಲ."
 
@@ -2270,45 +2370,45 @@ msgstr "ಕುಕಿ ದತ್ತಾಂಶವನ್ನು ಲೋಡ್ ಮಾಡ
 msgid "Not yet implemented.\n"
 msgstr "ಇನ್ನೂ ಸಹ ಅನ್ವಯಿಸಲಾಗಿಲ್ಲ.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
 "ಯಾವುದೆ PulseAudio ಡೆಮನ್ ಚಾಲಿತಗೊಳ್ಳುತ್ತಿಲ್ಲ, ಅಥವ ಅಧಿವೇಶನ ಡೆಮನ್ ಆಗಿ ಚಾಲಿತಗೊಳ್ಳುತ್ತಿಲ್ಲ."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "ಸಾಕೆಟ್(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "ಸಂಪರ್ಕಿಸು(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "PulseAudio ಡೀಮನ್ ಅನ್ನು ಕೊಲ್ಲುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "ಡೀಮನ್ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "ಪೋಲ್(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "ಓದು(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "ಬರೆ(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "ಸ್ವಯಂಹೆಚ್ಚಿಸುವಿಕೆಯ ಲಾಕ್ ಅನ್ನು ನಿಲುಕಿಸಿಕೊಳ್ಳಲು ಸಾಧ್ಯವಿಲ್ಲ."
 
@@ -2343,38 +2443,42 @@ msgstr ""
 "snd_pcm_avail() 0 ಅಥವ min_avail ಕ್ಕಿಂತ ಚಿಕ್ಕದಾದ ಇನ್ನೊಂದು ಮೌಲ್ಯವನ್ನು ಮರಳಿಸಿದೆ."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "ಜಡ"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "ಹೈ ಫಿಡಿಲಿಟಿ ಪ್ಲೇಬ್ಯಾಕ್ (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "ಹೈ ಫಿಡಿಲಿಟಿ ಕ್ಯಾಪ್ಚರ್ (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "ಟೆಲಿಫೋನಿ ಡ್ಯೂಪ್ಲೆಕ್ಸ್‌ (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio ಧ್ವನಿ ಪರಿಚಾರಕ"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "ಔಟ್‌ಪುಟ್ ಸಾಧನಗಳು"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "ಇನ್‌ಪುಟ್‌ ಸಾಧನಗಳು"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "@HOSTNAME@ ನಲ್ಲಿನ ಆಡಿಯೊ"
 
@@ -2438,131 +2542,159 @@ msgstr "ಆಂಪ್ಲಿಫಯರ್"
 msgid "No Amplifier"
 msgstr "ಯಾವುದೆ ಆಂಪ್ಲಿಫಯರ್ ಇಲ್ಲ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "ಬೂಸ್ಟ್"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "ಯಾವುದೆ ಬೂಸ್ಟ್ ಇಲ್ಲ"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "ಅನಲಾಗ್ ಹೆಡ್‌ಫೋನ್‌ಗಳು"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "ಅನಲಾಗ್ ಇನ್‌ಪುಟ್"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "ಅನಲಾಗ್ ಮೈಕ್ರೊಫೋನ್"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "ಅನಲಾಗ್ ಲೈನ್-ಇನ್"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "ಅನಲಾಗ್ ರೇಡಿಯೊ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "ಅನಲಾಗ್ ವೀಡಿಯೊ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "ಅನಲಾಗ್ ಔಟ್‌ಪುಟ್"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "ಅನಲಾಗ್ ಹೆಡ್‌ಫೋನ್‌ಗಳು"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "ಅನಲಾಗ್ ಔಟ್‌ಪುಟ್ (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "ಅನಲಾಗ್ ಮೊನೊ ಔಟ್‌ಪುಟ್"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981, c-format
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "ಅನಲಾಗ್ ಸ್ಟೀರಿಯೋ"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
+#, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404, c-format
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
+#, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "ಅನಲಾಗ್ ಮೊನೊ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "ಅನಲಾಗ್ ಸ್ಟೀರಿಯೋ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "ಅನಲಾಗ್ ಸರೌಂಡ್‌ 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "ಡಿಜಿಟಲ್ ಸ್ಟೀರಿಯೊ (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "ಡಿಜಿಟಲ್ ಸರೌಂಡ್ 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "ಡಿಜಿಟಲ್ ಸರೌಂಡ್ 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "ಡಿಜಿಟಲ್ ಸರೌಂಡ್ 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "ಡಿಜಿಟಲ್ ಸ್ಟೀರಿಯೊ (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "ಅನಲಾಗ್ ಮೊನೊ ಡ್ಯೂಪ್ಲೆಕ್ಸ್"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "ಅನಲಾಗ್ ಸ್ಟೀರಿಯೊ ಡ್ಯೂಪ್ಲೆಕ್ಸ್"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "ಅನಲಾಗ್ ಸ್ಟೀರಿಯೊ ಡ್ಯೂಪ್ಲೆಕ್ಸ್ (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "ಕೆಳಮಟ್ಟದ ಫ್ರೀಕ್ವೆನ್ಸಿ ಉತ್ಪಾದಕ"
diff --git a/po/ml.po b/po/ml.po
index c8c557d..492070f 100644
--- a/po/ml.po
+++ b/po/ml.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.ml\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-08 08:37+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-12-09 12:18+0530\n"
 "Last-Translator: \n"
 "Language-Team:  <en at li.org>\n"
@@ -17,12 +17,12 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11.4\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -33,7 +33,7 @@ msgstr ""
 "snd_pcm_avail() നല്‍കിയ മൂല്ല്യം വളരെ വലുതാണു്: %lu ബൈറ്റുകള്‍ (%lu ms).\n"
 "ഇതു് ALSA ഡ്രൈവര്‍ '%s'-ലുള്ള ഒരു ബഗാവാം. ദയവായി ഈ പ്രശ്നം ALSA ഡവലപ്പര്‍സിനെ അറിയിക്കുക."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -44,7 +44,7 @@ msgstr ""
 "snd_pcm_delay() നല്‍കിയ മൂല്ല്യം വളരെ വലുതാണു്: %li ബൈറ്റുകള്‍ (%s%lu ms).\n"
 "ഇതു് ALSA ഡ്രൈവര്‍ '%s'-ലുള്ള ഒരു ബഗാവാം. ദയവായി ഈ പ്രശ്നം ALSA ഡവലപ്പര്‍സിനെ അറിയിക്കുക."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -89,11 +89,11 @@ msgstr "ക്ലോക്കഡ് NULL സിങ്ക്"
 msgid "Null Output"
 msgstr "നള്‍ ഔട്ട്പുട്ട്"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "ഇന്റേര്‍ണല്‍ ഓഡിയോ"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "മോഡം"
 
@@ -109,92 +109,98 @@ msgstr "പുതിയ dl ലോഡര്‍ അനുവദിക്കുന
 msgid "Failed to add bind-now-loader."
 msgstr "bind-now-loader ചേര്‍ക്കുന്നതില്‍ പരാജയപ്പെട്ടു."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "%s സിഗ്നല്‍ ലഭ്യമായി."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "പുറത്തു് കടക്കുന്നു."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "'%s' എന്ന ഉപയോക്താവു് ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "'%s' എന്ന ഗ്രൂപ്പ് ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "ഉപയോക്താവു് '%s' (UID %lu) , ഗ്രൂപ്പ് '%s' (GID %lu) ലഭ്യമായി."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "ഉപയോക്താവു് '%s'-ന്റെയും ഗ്രൂപ്പ് '%s'-ന്റെയും GID ചേരുന്നില്ല."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "ഉപയോക്താവു് '%s'-ന്റെ ഹോം ഡയറക്ടറി '%s' അല്ല, ഉപേക്ഷിക്കുന്നു."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "'%s' ഉണ്ടാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "ഗ്രൂപ്പ് ലിസ്റ്റ് മാറ്റുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "GID മാറ്റുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "UID മാറ്റുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "റൂട്ട് ആനുകൂല്യങ്ങള്‍ വിജയകരമായി ഉപേക്ഷിച്ചിരിക്കുന്നു."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "ഈ പ്ലാറ്റ്ഫോമില്‍ സിസ്റ്റം വൈഡ് മോഡ് പിന്തുണയ്ക്കുന്നില്ല."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) പരാജയപ്പെട്ടു: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "കമാന്‍ഡ് ലൈന്‍ പാഴ്സ് ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "ഡെമണ്‍ പ്രവര്‍ത്തനത്തിലില്ല"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "ഡെമണ്‍ PID %u ആയി പ്രവര്‍ത്തിക്കുന്നു"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "ഡെമണ്‍ നശിപ്പിക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -202,155 +208,172 @@ msgstr ""
 "ഈ പ്രോഗ്രാം റൂട്ടായി പ്രവര്‍ത്തിപ്പിക്കേണ്ടതല്ല (--system എന്നു് പറഞ്ഞിട്ടുണ്ടെങ്കില്‍ മാത്രം റൂട്ട് "
 "ആവശ്യമുണ്ടു്)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "റൂട്ട് ആനുകൂല്യങ്ങള്‍ ആവശ്യമുണ്ടു്."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "സിസ്റ്റം ഇന്‍സ്റ്റന്‍സുകള്‍ക്ക് --start പിന്തുണയ്ക്കുന്നില്ല."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത്തിക്കുന്നു, പക്ഷേ --disallow-exit സജ്ജമാക്കിയിട്ടില്ല!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr "സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത്തിക്കുന്നു, പക്ഷേ --disallow-module-loading സജ്ജമാക്കിയിട്ടില്ല!"
+msgstr ""
+"സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത്തിക്കുന്നു, പക്ഷേ --disallow-module-loading സജ്ജമാക്കിയിട്ടില്ല!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത്തിക്കുന്നു, നിര്‍ബന്ധമായും SHM മോഡ് പ്രവര്‍ത്ത രഹിതമാക്കുന്നു!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
-msgstr "സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത്തിക്കുന്നു, നിര്‍ബന്ധമായും എക്സിറ്റ് ഐഡില്‍ സമയം പ്രവര്‍ത്ത രഹിതമാക്കുന്നു!"
+msgstr ""
+"സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത്തിക്കുന്നു, നിര്‍ബന്ധമായും എക്സിറ്റ് ഐഡില്‍ സമയം പ്രവര്‍ത്ത രഹിതമാക്കുന്നു!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "stdio ലഭിക്കുന്നതില്‍ പരാജയപ്പെട്ടു."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "pipe പരാജയപ്പെട്ടു: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() പരാജയപ്പെട്ടു: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() പരാജയപ്പെട്ടു: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "ഡെമണിന്റെ തുടക്കം പരാജയപ്പെട്ടു."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "ഡെമണിന്റെ തുടക്കം വിജയിച്ചു."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() പരാജയപ്പെട്ടു: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "ഇതു് PulseAudio %s ആണു്"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "കംപൈലേഷന്‍ ഹോസ്റ്റ്: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "കംപൈലേഷന്‍ CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "ഹോസ്റ്റില്‍ പ്രവര്‍ത്തിക്കുന്നു: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u സിപിയു ലഭ്യമായി."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "താളിന്റെ വ്യാപ്തി %lu ബൈറ്റുകളാണു്"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Valgrind പിന്തുണയോടെ കംപൈല്‍ ചെയ്തിരിക്കുന്നു: ഉവ്വു്"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Valgrind പിന്തുണയോടെ കംപൈല്‍ ചെയ്തിരിക്കുന്നു: ഇല്ല"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "valgrind മോഡില്‍ പ്രവര്‍ത്തിപ്പിക്കുന്നു: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "ഹോസ്റ്റില്‍ പ്രവര്‍ത്തിക്കുന്നു: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "ഒപ്ടിമൈസ്ഡ് ബിള്‍ഡ്: ഉവ്വു്"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "ഒപ്ടിമൈസ്ഡ് ബിള്‍ഡ്: ഇല്ല"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG നിഷ്കര്‍ഷിച്ചിരിക്കുന്നു, എല്ലാ asserts-ഉം പ്രവര്‍‌ത്ത രഹിതം."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH നിഷ്കര്‍ഷിച്ചിരിക്കുന്നു, fast path asserts മാത്രം പ്രവര്‍‌ത്ത രഹിതം."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "എല്ലാ asserts-ഉം പ്രവര്‍‌ത്ത സജ്ജം"
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "മഷീന്‍ ID ലഭ്യമാക്കുവാന്‍ സാധ്യമായില്ല"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "മഷീന്‍ ID %s ആണു്."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "സെഷന്‍ ID %s ആണു്."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "റണ്‍ടൈം ഡയറക്ടറി %s ഉപയോഗിക്കുന്നു."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "സ്റ്റേറ്റ് ഡയറക്ടറി %s ഉപയോഗിക്കുന്നു."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "മൊഡ്യൂള്‍സ് ഡയറക്ടറി %s ഉപയോഗിക്കുന്നു."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "സിസ്റ്റം മോഡില്‍ പ്രവര്‍ത്തിക്കുന്നു: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -364,15 +387,15 @@ msgstr ""
 "സിസ്റ്റം മോഡിലുള്ള പ്രവര്‍ത്തനം ഉത്തമമല്ലാത്തതിന്റെ കാരണങ്ങള്‍ക്കായിhttp://pulseaudio.org/"
 "wiki/WhatIsWrongWithSystemMode കാണുക."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() പരാജയപ്പെട്ടു."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Fresh high-resolution timers available! Bon appetit!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -380,27 +403,27 @@ msgstr ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() പരാജയപ്പെട്ടു."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "ഡെമണ്‍ ആരംഭിക്കുന്നതില്‍ പരാജയപ്പെട്ടു."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "ഒരു ഘടകങ്ങളും ലഭ്യമാകാതെ ഡെമണ്‍ ആരംഭിച്ചിരിക്കുന്നു, പ്രവര്‍ത്തനം നിഷേധിച്ചിരിക്കുന്നു."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "ഡെമണിന്റെ തുടക്കം പൂര്‍ണ്ണമായി."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "ഡെമണ്‍ അടച്ചുപൂട്ടുന്നതു് ആരംഭിച്ചിരിക്കുന്നു."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "ഡെമണ്‍ നിര്‍ത്തിയിരിക്കുന്നു."
 
@@ -657,72 +680,77 @@ msgstr "DEPRECATION WARNING: %s\n"
 msgid "Path: %s\n"
 msgstr "പാഥ്: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] തെറ്റായ ലോഗ് ടാര്‍ഗറ്റ് '%s'."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] തെറ്റായ ലോഗ് ലവല്‍ '%s'."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] തെറ്റായ റീസാംപിള്‍ മാര്‍ഗ്ഗം '%s'."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] അസാധുവായ rlimit '%s'."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] ഈ പ്ലാറ്റ്ഫോമില്‍ rlimit-നുള്ള പിന്തുണ ലഭ്യമല്ല."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] തെറ്റായ സാംപിള്‍ മാതൃക '%s'."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] തെറ്റായ സാംപിള്‍ റേറ്റ് '%s'."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] തെറ്റായ സാംപിള്‍ ചാനലുകള്‍ '%s'."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] അസാധുവായ ചാനല്‍ മാപ്പ് '%s'."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] '%s' ഫ്രാഗ്മെന്റുകളുടെ തെറ്റായ എണ്ണം."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] തെറ്റായ ഫ്രാഗ്മെന്റ് വ്യാപ്തി '%s'."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] അസാധുവായ nice സ്ഥാനം '%s'."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] തെറ്റായ സാംപിള്‍ റേറ്റ് '%s'."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "ക്രമീകരണ ഫയല്‍ തുറക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -730,7 +758,7 @@ msgstr ""
 "വ്യക്തമാക്കിയിട്ടുള്ള സ്വതവേയുള്ള ചാനല്‍ മാപ്പിനുള്ള ചാനലുകളുടെ എണ്ണം നല്‍കിയിരിക്കുന്ന സ്വതവേയുള്ള "
 "ചാനലുകളുടെ എണ്ണത്തേക്കാള്‍ വ്യത്യസ്ഥമാണു്."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### ക്രമീകരണ ഫയലില്‍ നിന്നും ലഭ്യമാക്കുക: %s ###\n"
@@ -776,8 +804,8 @@ msgid "Rear Right"
 msgstr "വലതു് അവസാനം"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "ലോ ഫ്രീക്വന്‍സി എമ്മിറ്റര്‍"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1122,191 +1150,191 @@ msgstr "XOpenDisplay() പരാജയപ്പെട്ടു"
 msgid "Failed to parse cookie data"
 msgstr "കുക്കി ഡേറ്റാ പാഴ്സ് ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "ക്രമീകരണ ഫയല്‍ '%s' തുറക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "ഒരു കുക്കിയും ലഭ്യമല്ല. അതില്ലാതെ കണക്ട് ചെയ്യുവാന്‍‌ ശ്രമിക്കുന്നു."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "അപരിചിതമായ എക്സ്റ്റെന്‍ഷന്‍ '%s'-നുള്ള സന്ദേശം ലഭിച്ചിരിക്കുന്നു"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "സ്ട്രീം ഡ്രെയിന്‍ ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "പ്ലേബാക്ക് സ്ട്രീം ഡ്രെയിന്‍ ചെയ്തിരിക്കുന്നു."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "സര്‍വറിലേക്കുള്ള കണക്ഷന്‍ ഡ്രെയിന്‍ ചെയ്യുന്നു."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "സ്ട്രീം വിജയകരമായി ഉണ്ടാക്കിയിരിക്കുന്നു."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "ബഫര്‍ മെട്രിക്സ്: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "ബഫര്‍ മെട്രിക്സ്: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "സാംപിള്‍ സ്പെക് '%s', ചാനല്‍ മാപ്പ് '%s' ഉപയോഗിക്കുന്നു."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "ഡിവൈസ് %s-ലേക്ക് കണക്ട് ചെയ്തിരിക്കുന്നു (%u, %ssuspended)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "സ്ട്രീം പിശക്: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "സ്ട്രീം ഡിവൈസ് സസ്പെന്‍ഡ് ചെയ്തിരിക്കുന്നു.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "സ്ട്രീം ഡിവൈസ് വീണ്ടും ആരംഭിച്ചിരിക്കുന്നു.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "സ്ട്രീം അണ്ടര്‍റണ്‍.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "സ്ട്രീ ഓവര്‍റണ്‍.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "സ്ട്രീം ആരംഭിച്ചിരിക്കുന്നു.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "ഡിവൈസ് %s-ലേക്ക് സ്ട്രീം നീക്കം ചെയ്തിരിക്കുന്നു (%u, %ssuspended).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "അല്ല"
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "സ്ട്രീം ബഫര്‍ വിശേഷതകള്‍ മാറ്റിയിരിക്കുന്നു.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "കണക്ഷന്‍ സ്ഥാപിച്ചിരിക്കുന്നു.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "കണക്ഷനില്‍ തകരാര്‍: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "EOF ലഭ്യമായിരിക്കുന്നു"
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "സിഗ്നല്‍ ലഭ്യമായി, പുറത്തു് കടക്കുന്നു."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "ലാറ്റന്‍സി ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "സമയം: %0.3f sec; ലാറ്റന്‍സി: %0.0f usec."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1358,10 +1386,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [options]\n"
@@ -1420,7 +1452,7 @@ msgstr ""
 "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1431,168 +1463,170 @@ msgstr ""
 "libpulse %s-നൊപ്പം കംപൈല്‍ ചെയ്തിരിക്കുന്നു\n"
 "libpulse %s-നൊപ്പം ലിങ്ക് ചെയ്തിരിക്കുന്നു\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "തെറ്റായ ക്ലൈന്റ് നാമം '%s'"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "തെറ്റായ സ്ട്രീം നാമം '%s'"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "തെറ്റായ ചാനല്‍ മാപ്പ് '%s'"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "തെറ്റായ ലാറ്റന്‍സി വിവരണം '%s'"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "തെറ്റായ പ്രക്രിയ സമയ വിവരണം '%s'"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "തെറ്റായ വിശേഷത '%s'"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "അപരിചിതമായ ഫയല്‍ രീതി %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "തെറ്റായ മാതൃക വിവരണം"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "അനവധി ആര്‍ഗ്യുമെന്റുകള്‍."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "ഫയലിനുള്ള സാംപിള്‍ വിവരണം ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "ഓ‍ഡിയോ ഫയല്‍ തുറക്കുന്നതില്‍ പരാജയപ്പെട്ടു."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
-msgstr "മുന്നറിയിപ്പു്: ഫയലില്‍ നിന്നുള്ള വിവരണം വ്യക്തമാക്കിയിരിക്കുന്ന സാംപിള്‍ വിവരണം മാറ്റിയെഴുതുന്നു."
+msgstr ""
+"മുന്നറിയിപ്പു്: ഫയലില്‍ നിന്നുള്ള വിവരണം വ്യക്തമാക്കിയിരിക്കുന്ന സാംപിള്‍ വിവരണം മാറ്റിയെഴുതുന്നു."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "ഫയലില്‍ നിന്നും സാംപിള്‍ വിവരണം ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "മുന്നറിയിപ്പു്: ഫയലില്‍ നിന്നും ചാനല്‍ മാപ്പ് ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "ചാനല്‍ മാപ്പ് സാംപിള്‍ വിവരണവുമായി ചേരുന്നില്ല"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "മുന്നറിയിപ്പു്: ഫയലിലേക്ക് ചാനല്‍ മാപ്പ് സൂക്ഷിക്കുന്നതില്‍ പരാജയപ്പെട്ടു."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "%s സ്ട്രീം തുറക്കുന്നു. ഇതിന്റെ സാംപിള്‍ വിവരണം '%s'-ഉം ചാനല്‍ മാപ്പ് '%s'-ഉം ആണു്."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "റിക്കോര്‍ഡ് ചെയ്യുന്നു"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "പ്ലേബാക്ക്"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() പരാജയപ്പെട്ടു."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() പരാജയപ്പെട്ടു."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() പരാജയപ്പെട്ടു."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() പരാജയപ്പെട്ടു."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() പരാജയപ്പെട്ടു."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "സസ്പെന്‍ഡ് ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "വീണ്ടും ആരംഭിക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "മുന്നറിയിപ്പു്: ശബ്ദ സര്‍വര്‍ ലോക്കലല്ല, സസ്പെന്‍ഡ് ചെയ്യുന്നില്ല.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "കണക്ഷനില്‍ തകരാര്‍: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "SIGINT ലഭിച്ചു, പുറത്തു് കടക്കുന്നു.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "മുന്നറിയിപ്പു്: %u സിഗ്നല്‍ വഴി ചൈള്‍ പ്രക്രിയ അവസാനിച്ചിരിക്കുന്നു\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1611,7 +1645,7 @@ msgstr ""
 "to\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1622,50 +1656,61 @@ msgstr ""
 "libpulse %s-നൊപ്പം കംപൈല്‍ ചെയ്തിരിക്കുന്നു\n"
 "libpulse %s-നൊപ്പം ലിങ്ക് ചെയ്തിരിക്കുന്നു\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() പരാജയപ്പെട്ടു.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() പരാജയപ്പെട്ടു..\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() പരാജയപ്പെട്ടു.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "സ്ഥിതിവിവരക്കണക്കുകള്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "നിലവില്‍ ഉപയോഗത്തില്‍: %u ബ്ലോക്കുകള്‍, മൊത്തം %s ബൈറ്റുകള്‍ അടങ്ങുന്നു.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "കാലാവധിയ്ക്കുള്ളില്‍ അനുവദിക്കുന്നു: %u ബ്ലോക്കുകള്‍, മൊത്തം %s ബൈറ്റുകള്‍ അടങ്ങുന്നു.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "സാംപിള്‍ കാഷ് വ്യപ്തി: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "സര്‍വര്‍ വിവരങ്ങള്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1673,7 +1718,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "User name: %s\n"
 "Host Name: %s\n"
@@ -1685,12 +1730,12 @@ msgstr ""
 "Default Source: %s\n"
 "Cookie: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "സിങ്ക് വിവരം ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1729,22 +1774,22 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tപോര്‍ട്ടുകള്‍:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tസജീവമായ പോര്‍ട്ട്: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "സോഴ്സ് വിവരങ്ങള്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1783,20 +1828,20 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n/a"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "ഘടക വിവരങ്ങള്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1813,12 +1858,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "ക്ലൈന്റ് വിവരങ്ങള്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1833,12 +1878,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "കാര്‍ഡ് വിവരങ്ങള്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1855,22 +1900,22 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tപ്രൊഫൈലുകള്‍:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tസജീവമായ പ്രൊഫൈല്‍: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "സിങ്ക് ഇന്‍പുട്ട് വിവരങ്ങള്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1907,12 +1952,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "സോഴ്സ് ഔട്ട്പുട്ട് വിവരം ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1941,12 +1986,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "മാതൃകയുടെ വിവരങ്ങള്‍ ലഭ്യമാക്കുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1977,26 +2022,80 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "പരാജയം: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "മാതൃക അപ്ലോഡ് ചെയ്യുന്നതില്‍ പരാജയപ്പെട്ടു: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "ഫയല്‍ അനുചിതമായ അവസാനം"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "തെറ്റായ സര്‍വര്‍"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT ലഭ്യമായി, പുറത്തു് കടക്കുന്നു."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2019,6 +2118,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2058,7 +2158,7 @@ msgstr ""
 "  -n, --client-name=NAME                How to call this client on the "
 "server\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2069,103 +2169,106 @@ msgstr ""
 "libpulse %s-നൊപ്പം കംപൈല്‍ ചെയ്തിരിക്കുന്നു\n"
 "libpulse %s-നൊപ്പം ലിങ്ക് ചെയ്തിരിക്കുന്നു\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "ലഭ്യമാക്കുന്നതിലുള്ള മാതൃകാ ഫയല്‍ ദയവായി വ്യക്തമാക്കുക"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "ശബ്ദ ഫയല്‍ തുറക്കുന്നതില്‍ പരാജയപ്പെട്ടു."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "മുന്നറിയിപ്പു്: ഫയലില്‍ നിന്നും മാതൃകയുടെ വിവരണം കണ്ടുപിടിക്കുന്നതില്‍ പരാജയപ്പെട്ടു."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "പ്രവര്‍ത്തിപ്പിക്കുവാനുള്ള മാതൃകയുടെ പേരു് നല്‍കേണ്ടതുണ്ടു്"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "നീക്കം ചെയ്യുന്നതിനുള്ള മാതൃകയുടെ പേരു് നല്‍കേണ്ടതുണ്ടു്"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "ഒരു സിങ്ക് ഇന്‍പുട്ട് ഇന്‍ഡക്സും സിങ്കും നല്‍കേണ്ടതുണ്ടു്"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "ഒരു സോഴ്സ് ഔട്ട്പുട്ട് ഇന്‍ഡക്സും സോഴ്സും നല്‍കേണ്ടതുണ്ടു്"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "ഒരു മൌഡ്യൂള്‍ നാമവും ആര്‍ഗ്യുമെന്റുകളും നല്‍കേണ്ടതുണ്ടു്."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "ഒരു മൌഡ്യൂള്‍ ഇന്‍ഡക്സ് നല്‍കേണ്ടതുണ്ടു്"
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
-msgstr "ഒരു സിങ്കില്‍ കൂടുതല്‍ നിങ്ങള്‍ നല്‍കേണ്ടതില്ല. കൂടാതെ, ഒരു ബൂളിയന്‍ മൂല്ല്യവും നിങ്ങള്‍ നല്‍കേണ്ടതാണു്."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
+msgstr ""
+"ഒരു സിങ്കില്‍ കൂടുതല്‍ നിങ്ങള്‍ നല്‍കേണ്ടതില്ല. കൂടാതെ, ഒരു ബൂളിയന്‍ മൂല്ല്യവും നിങ്ങള്‍ നല്‍കേണ്ടതാണു്."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr "ഒരു സോഴ്സില്‍ കൂടുതല്‍ നിങ്ങള്‍ നല്‍കേണ്ടതില്ല. കൂടാതെ, ഒരു ബൂളിയന്‍ മൂല്ല്യവും നിങ്ങള്‍ നല്‍കേണ്ടതാണു്."
+msgstr ""
+"ഒരു സോഴ്സില്‍ കൂടുതല്‍ നിങ്ങള്‍ നല്‍കേണ്ടതില്ല. കൂടാതെ, ഒരു ബൂളിയന്‍ മൂല്ല്യവും നിങ്ങള്‍ നല്‍കേണ്ടതാണു്."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "ഒരു കാര്‍ഡ് നാമം/ഇന്‍ഡക്സും പ്രൊഫൈല്‍ നാമവും നല്‍കേണ്ടതുണ്ടു്"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "ഒരു സിങ്ക് നാമം/ഇന്‍ഡക്സും പോര്‍ട്ട് നാമവും നല്‍കേണ്ടതുണ്ടു്"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "ഒരു സോഴ്സ് നാമം/ഇന്‍ഡക്സും പോര്‍ട്ട് നാമവും നല്‍കേണ്ടതുണ്ടു്"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "ഒരു സിങ്ക് നാമം/ഇന്‍ഡക്സും വോള്യവും നല്‍കേണ്ടതുണ്ടു്"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "തെറ്റായ വോള്യം വിവരണങ്ങള്‍"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "ഒരു സോഴ്സ് നാമം/ഇന്‍ഡക്സും വോള്യവും നല്‍കേണ്ടതുണ്ടു്"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "ഒരു സിങ്ക് ഇന്‍പുട്ട് ഇന്‍ഡക്സും വോള്യവും നല്‍കേണ്ടതുണ്ടു്"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "തെറ്റായ സിങ്ക് ഇന്‍പുട്ട് ഇന്‍ഡക്സ്"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "ഒരു സിങ്ക് നാമം/ഇന്‍ഡക്സും മ്യൂട്ട് ബൂളിയനും നല്‍കേണ്ടതുണ്ടു്"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "ഒരു സോഴ്സ് നാമം/ഇന്‍ഡക്സും മ്യൂട്ട് ബൂളിയനും നല്‍കേണ്ടതുണ്ടു്"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "ഒരു സിങ്ക് ഇന്‍പുട്ട് ഇന്‍ഡക്സും മ്യൂട്ട് ബൂളിയനും നല്‍കേണ്ടതുണ്ടു്"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "തെറ്റായ സിങ്ക് ഇന്‍പുട്ട് ഇന്‍ഡക്സ് സ്പെസിഫിക്കേഷന്‍"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "ശരിയായ കമാന്‍ഡുകള്‍ നല്‍കിയിട്ടില്ല."
 
@@ -2248,44 +2351,44 @@ msgstr "കുക്കീ ഡേറ്റാ ലഭ്യമാക്കുന
 msgid "Not yet implemented.\n"
 msgstr "ഇതുവരെ ലഭ്യമാക്കിയിട്ടില്ല.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr "പള്‍സ്ഓഡിയോ ഡെമണ്‍ പ്രവര്‍ത്തനതിലില്ല, സെഷന്‍ ഡെമണായും പ്രവര്‍ത്തിക്കുന്നില്ല."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "പള്‍സ്ഓഡിയോ ഡെമണ്‍ ഇല്ലാതാക്കുന്നതില്‍ പരാജയപ്പെട്ടു."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "ഡെമണ്‍ മറുപടി നല്‍കുന്നില്ല."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "ഓട്ടോസ്പൌണ്‍ ലോക്ക് ലഭ്യമാക്കുവാന്‍ സാധ്യമല്ല."
 
@@ -2322,38 +2425,42 @@ msgstr ""
 "അല്ലെങ്കില്‍ മറ്റൊരു മൂല്ല്യം < min_avail ആണു്."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "ഓഫ്"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "ഹൈ ഫിഡലിറ്റി പ്ലേബാക്ക് (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "ഹൈ ഫിഡലിറ്റി കാപ്ചര്‍ (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "ടെലിഫോണി ഡ്യൂപ്ലെക്സ് (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "പള്‍സ്ഓഡിയോ സൌണ്ട് സര്‍വര്‍"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "ഔട്ട്പുട്ട് ഡിവൈസുകള്‍"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "ഇന്‍പുട്ട് ഡിവൈസുകള്‍"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "@HOSTNAME at -ലുള്ള ഓഡിയോ"
 
@@ -2417,133 +2524,159 @@ msgstr "ആംപ്ലിഫയര്‍"
 msgid "No Amplifier"
 msgstr "ആംപ്ലിഫയര്‍ ലഭ്യമല്ല"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "ബൂസ്റ്റ്"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "ബൂസ്റ്റ് ലഭ്യമല്ല"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "അനലോഗ് ഹെഡ്ഫോണുകള്‍"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "അനലോഗ് ഇന്‍പുട്ട്"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "അനലോഗ് മൈക്രോഫോണ്‍"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "അനലോഗ് ലൈന്‍-ഇന്‍"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "അനലോഗ് റേഡിയോ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "അനലോഗ് വീഡിയോ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "അനലോഗ് ഔട്ട്പുട്ട്"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "അനലോഗ് ഹെഡ്ഫോണുകള്‍"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "അനലോഗ് ഔട്ട്പുട്ട് (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "അനലോഗ് മോണോ ഔട്ട്പുട്ട്"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "അനലോഗ് സ്റ്റീരിയോ"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "അനലോഗ് മോണോ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "അനലോഗ് സ്റ്റീരിയോ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "അനലോഗ് സറൌണ്ട് 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "അനലോഗ് സറൌണ്ട് 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "അനലോഗ് സറൌണ്ട് 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "അനലോഗ് സറൌണ്ട് 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "അനലോഗ് സറൌണ്ട് 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "അനലോഗ് സറൌണ്ട് 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "അനലോഗ് സറൌണ്ട് 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "അനലോഗ് സറൌണ്ട് 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "അനലോഗ് സറൌണ്ട് 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "അനലോഗ് സറൌണ്ട് 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "അനലോഗ് സറൌണ്ട് 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "ഡിജിറ്റല്‍ സ്റ്റീരിയോ (IEC958) "
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "ഡിജിറ്റല്‍ സറൌണ്ട് 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "ഡിജിറ്റല്‍ സറൌണ്ട് 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "ഡിജിറ്റല്‍ സറൌണ്ട് 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "ഡിജിറ്റല്‍ സ്റ്റീരിയോ (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "അനലോഗ് മോണോ ഡ്യൂപ്ലെക്സ്"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "അനലോഗ് സ്റ്റീരിയോ ഡ്യൂപ്ലെക്സ്"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "ഡിജിറ്റല്‍ സ്റ്റീരിയോ ഡ്യൂപ്ലെക്സ് (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "ലോ ഫ്രീക്വന്‍സി എമ്മിറ്റര്‍"
diff --git a/po/mr.po b/po/mr.po
index 5c05cc5..329b271 100644
--- a/po/mr.po
+++ b/po/mr.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-07 08:36+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-12-09 18:30+0530\n"
 "Last-Translator: Sandeep Shedmake <sshedmak at redhat.com>\n"
 "Language-Team: Marathi <fedora-trans-mr at redhat.com>\n"
@@ -18,12 +18,12 @@ msgstr ""
 "X-Generator: KBabel 1.11.4\n"
 "Plural-Forms: nplurals=2; plural=(n!=1);\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -35,7 +35,7 @@ msgstr ""
 "हे सहसा ALSA ड्राइवर '%s' अंतर्गत बग अशू शकते. कृपया या अडचणीस ALSA डेव्हलपर करीता "
 "कळवा."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -47,7 +47,7 @@ msgstr ""
 "हे सहसा ALSA ड्राइवर '%s' अंतर्गत बग अशू शकते. कृपया या अडचणीस ALSA डेव्हलपर करीता "
 "कळवा."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -93,11 +93,11 @@ msgstr "क्लॉक्ड् NULL सींक"
 msgid "Null Output"
 msgstr "Null आऊटपुट"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "आंतरीक ऑडिओ"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "मोडेम"
 
@@ -113,246 +113,268 @@ msgstr "नवीन dl दाखलकर्ता वाटप करण्य
 msgid "Failed to add bind-now-loader."
 msgstr "bind-now-loader समावेष करण्यास अपयशी."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "संकेत %s प्राप्त झाले."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "बाहेर पडत आहे."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "वापरकर्ता '%s' शोधणे अशक्य."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "गट '%s' शोधण्यास अपयशी."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "वापरकर्ता '%s' (UID %lu) व गट '%s' (GID %lu) आढळले."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "वापरकर्ता '%s' व गट '%s' चे GID जुळत नाही."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "वापरकर्ता '%s' ची मुख्य डिरेक्ट्री '%s' नाही, दुर्लक्ष करत आहे."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "'%s' बनवण्यास अपयशी: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "गट यादी बदलवण्यास अपयशी: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "GID बदलवण्यास अपयशी: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "UID बदलवण्यास अपयशी: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "रूट परवानगी यशस्वीरित्या वगळले."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "प्रणाली भर पद्धत या प्लॅटफॉर्म करीता समर्थीत नाही."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) अपयशी: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "आदेश ओळ वाचण्यास अपयशी."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "डिमन कार्यरत नाही"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "डिमन PID %u नुरूप कार्यरत आहे"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "डिमन नष्ट करण्यास अपयशी: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
 msgstr "हा कार्यक्रम रूट नुरूप चालविण्याकरीता नाही (जोपर्यंत --system निश्चित नाही)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "रूट परवानगी आवश्यक."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "प्रणाली घटनांकरीता --start समर्थीत नाही."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "प्रणाली पद्धती अंतर्गत कार्यरत, परंतु --disallow-exit निश्चित केले नाही!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr "प्रणाली पद्धती अंतर्गत कार्यरत, परंतु --disallow-module-loading निश्चित केले नाही!"
+msgstr ""
+"प्रणाली पद्धती अंतर्गत कार्यरत, परंतु --disallow-module-loading निश्चित केले नाही!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "प्रणाली पद्धती अंतर्गत कार्यरत, SHM पद्धत जबरनरित्या अकार्यान्वीत करत आहे!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr "प्रणाली पद्धती अंतर्गत कार्यरत, रिकामे वेळ जबरनरित्या अकार्यान्वीत करत आहे!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "stdio प्राप्त करण्यास अपयशी."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "पाइप अपयशी: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() अपयशी: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() अपयशी: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "डिमन स्टार्टअप अपयशी."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "डिमन स्टार्टअप यशस्वी."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() अपयशी: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "हे PulseAudio %s आहे"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "कंपाइलेशन यजमान: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "कंपाइलेशन CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "यजमान वर कार्यरत: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u CPUs आढळले."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "पान आकार %lu बाईटस् आहे"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Valgrind समर्थनशी कंपाईल केले: होय"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Valgrind समर्थनशी कंपाईल केले: नाही"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "valgrind पद्धतीत कार्यरत: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "यजमान वर कार्यरत: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "अनुकूल बिल्ड: होय"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "अनुकूल बिल्ड: नाही"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG वर्णीकृत, सर्व asserts अकार्यान्वीत."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH वर्णीकृत, फक्त जलद मार्गीय asserts अकार्यान्वीत केले."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "सर्व asserts कार्यान्वीत केले."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "मशीन ID प्राप्त करण्यास अपयशी"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "मशीन ID %s आहे."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "सत्र ID %s आहे."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "रनटाईम डिरेक्ट्री %s वापरत आहे."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "स्थिती डिरेक्ट्री %s वापरत आहे."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "घटक डिरेक्ट्री %s वापरत आहे."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "प्रणाली पद्धतीत कार्यरत: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -368,15 +390,15 @@ msgstr ""
 "प्रणाली मोड दोकादायक आहे यासाठी कृपया http://pulseaudio.org/wiki/"
 "WhatIsWrongWithSystemMode वाचा."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() अपयशी."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "नवीन उच्च-बिंदूता टाइमर उपलब्ध! Bon appetit!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -384,27 +406,27 @@ msgstr ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() अपयशी."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "डिमन प्रारंभ करण्यास अपयशी."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "विना विभाग दाखल केल्यास डिमन प्रारंभ झाले, कार्य करण्यास नकार."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "डिमन स्टार्टअप पूर्ण झाले."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "डिमन पूर्णपणे बंद करण्यास प्रारंभ केले."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "डिमन नष्ट केले."
 
@@ -661,72 +683,77 @@ msgstr "DEPRECATION WARNING: %s\n"
 msgid "Path: %s\n"
 msgstr "मार्ग: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] अवैध लॉग लक्ष्य '%s'."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] अवैध लॉग स्तर '%s'."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] अवैध पुन्ह सॅम्पल पद्धत '%s'."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] अवैध rlimit '%s'."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit या प्लॅटफॉर्म वर समर्थीत नाही."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] अवैध सॅम्पल स्वरूप '%s'."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] अवैध सॅम्पल दर '%s'."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] अवैध सॅम्पल मार्ग '%s'."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] अवैध मार्ग मॅप '%s'."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] अवैध तुकडे '%s' यांची एकूण संख्या."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] अवैध तुकड्याचे आकार '%s'."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] अवैध nice स्तर '%s'."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] अवैध सॅम्पल दर '%s'."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "संयोजना फाइल उघडण्यास अपयशी: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -734,7 +761,7 @@ msgstr ""
 "निश्चित मुलभूत वाहिनी मॅपकडे निश्चित एकूण मुलभूत वाहिनी पेक्षा वेगळे वाहिनी संख्या "
 "समाविष्टीत आहे."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### संयोजना फाइल: %s पासून वाचा ###\n"
@@ -780,8 +807,8 @@ msgid "Rear Right"
 msgstr "पाठीमागे उजवीकडे"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "कमी क्रिक्वेन्सी स्रोत"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1126,191 +1153,191 @@ msgstr "XOpenDisplay() अपयशी"
 msgid "Failed to parse cookie data"
 msgstr "कुकी डेटा वाचण्यास अपयशी"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "संयोजना फाइल '%s' उघडण्यास अपयशी: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "कुकी दाखल केले नाही. जुळवणीचा प्रयत्न करत आहे."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "अपरिचीत वाढ '%s' करीता संदेश प्राप्त झाले"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "स्ट्रीम रिकामे करण्यास अपयशी: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "प्लेबॅक स्ट्रीम रिकामे झाले."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "सर्व्हर करीता जुळवणी ड्रेन केली."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() अपयशी: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() अपयशी: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() अपयशी: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "स्ट्रीम यशस्वीरित्या निर्माण केले."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() अपयशी: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "बफर मेट्रीक्स्: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "बफर मेट्रीक्स्: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "उदाहरणार्थ spec '%s', वाहिनी नकाशा '%s' वापरत आहे."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "साधन %s शी जुळले (%u, %s सस्पेंड केले)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "स्ट्रीम त्रुटी: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "स्ट्रीम साधन सस्पेंड केले.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "स्ट्रीम साधन पुनः सुरू केले.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "स्ट्रीम underrun.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "स्ट्रीम overrun.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "स्ट्रीम started.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "स्ट्रीम साधन %s कडे स्थानांतरीत केले (%u, %ssuspended).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "नाही "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "स्ट्रीम बफर गुणधर्म बदलले.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "जुळवणी स्थापीत केली.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() अपयशी: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() अपयशी: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() अपयशी: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "जुळवणी अपयशी: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "EOF प्राप्त झाले."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() अपयशी: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "संकेत प्राप्त झाले, बाहेर पडत आहे."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "विलंब प्राप्त करण्यास अपयशी: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "वेळ: %0.3f sec; विलंब: %0.0f usec."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() अपयशी: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1362,10 +1389,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [options]\n"
@@ -1424,7 +1455,7 @@ msgstr ""
 "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1435,168 +1466,169 @@ msgstr ""
 "libpulse %s शी कंपाई केले\n"
 "libpulse %s शी लिंक केले\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "अवैध क्लाएंटचे नाव '%s'"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "अवैध स्ट्रीमचे नाव '%s'"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "अवैध वाहिनी नकाशा '%s'"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "अवैध विलंब संयोजना '%s'"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "अवैध कार्य वेळ संयोजना '%s'"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "अवैध गुणधर्म '%s'"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "अपरिचीत फाइल रूपण %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "अवैध सॅम्पल संयोजना"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "खूप जास्त बाब."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "फाइलसाठी सॅम्पल माहिती प्राप्त करण्यास अपयशी."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "आवाज फाइल उघडण्यास अपयशी."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
 msgstr "सावधानता: निर्देशीत चाचणी संयोजना फाइलमधील संयोजनाशी खोडून पुनः लिहीली जाईल."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "फाइलपासून चाचणी संयोजना माहिती प्राप्त करण्यास अपयशी."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "सावधानता: फाइलपासून वाहिनी नकाशा ओळखण्यास अपयशी."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "वाहिनी नकाशा चाचणी संयोजनाशी जुळत नाही"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "सावधानता: वाहिनी नकाशा फाइलमध्ये लिहण्यास अपयशी."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "%s स्ट्रीम चाचणी संयोजना '%s' व वाहिनी नकाशा '%s' सह उघडत आहे."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "रेकॉर्डींग"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "प्लेबॅक"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() अपयशी."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() अपयशी."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() अपयशी."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() अपयशी: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rrttime_new() अपयशी."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() अपयशी."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "सस्पेंड करण्यास अपयशी: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "पुन्हा चालू करण्यास अपयशी: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "सावधानता: आवाज सर्वर स्थानीय नाही, सस्पेंड करत नाही.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "जुळवणी अपयशी: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "SIGINT प्राप्त झाले, बाहेर पडत आहे.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "सावधानता: उप कार्य संकेत %u द्वारे नष्ट करण्यात आले\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1615,7 +1647,7 @@ msgstr ""
 "to\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1626,50 +1658,61 @@ msgstr ""
 "libpulse %s शी कंपाई केले\n"
 "libpulse %s शी लिंक केले\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() अपयशी.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() अपयशी.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() अपयशी.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "आकडेवारी प्राप्त करण्यास अपयशी: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "वर्तमानक्षणी वापरणीत आहे: %2$s बाईटस् समाविष्टीत एकूण %1$u ब्लॉक्स् .\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "संपूर्ण कार्यकाळवेळी लागू केले: %2$s बाईटस् समाविष्टीत एकूण %1$u ब्लॉक्स् .\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "सॅपल कॅशे आकार: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "सर्वर माहिती प्राप्त करण्यास अपयशी: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1677,7 +1720,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "वापरकर्ता नाव: %s\n"
 "आयोजक नाव: %s\n"
@@ -1689,12 +1732,12 @@ msgstr ""
 "मुलभूत स्रोत: %s\n"
 "कुकीज: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "sink माहिती प्राप्त करण्यास अपयशी: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1733,22 +1776,22 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tपोर्टस्:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tसक्रीय पोर्ट: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "स्रोत माहिती प्राप्त करण्यास अपयशी: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1787,20 +1830,20 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n/a"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "विभाग माहिती प्राप्त करण्यास अपयशी: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1817,12 +1860,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "क्लाऐंट माहिती प्राप्त करण्यास अपयशी: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1837,12 +1880,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "कार्ड माहिती प्राप्त करण्यास अपयशी: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1859,22 +1902,22 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tसंक्षिप्त माहिती:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tसक्रीय संक्षिप्त माहिती: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "सींक इंपुट माहिती प्राप्त करण्यास अपयशी: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1911,12 +1954,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "स्रोत आऊटपुट माहिती प्राप्त करण्यास अपयशी: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1945,12 +1988,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "सॅम्पल माहिती प्राप्त करण्यास अपयशी: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1981,26 +2024,80 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "अपयशी: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "सॅम्पल अपलोड करण्यास अपयशी: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "फाइलची अयोग्य समाप्ती"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "अवैध सर्वर"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT प्राप्त झाले, बाहेर पडत आहे."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2023,6 +2120,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2062,7 +2160,7 @@ msgstr ""
 "  -n, --client-name=NAME                How to call this client on the "
 "server\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2073,103 +2171,106 @@ msgstr ""
 "libpulse %s सह कंपाईल केले\n"
 "libpulse %s सह जुळले\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "कृपया दाखल करण्याजोगी तात्पूर्ती फाइल निर्देशीत करा"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "आवाज फाइल उघडण्यास अपयशी."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "सावधानता: फाइलपासून चाचणी संयोजना ओळखण्यास अपयशी."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "चालवण्याकरीता तुम्हाला तात्पूर्ते नाव निश्चित करावे लागेल"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "काढून टाकण्याकरीता तुम्हाला तात्पूर्ते नाव निश्चित करावे लागेल"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "तुम्हाला सींक इंपुट निर्देशांक व सींक निश्चित करावे लागेल"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "तुम्हाला आऊटपुट इंडेक्स स्रोत व स्रोत निश्चित करावे लागेल"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "तुम्हाला विभागाचे नाव व बाब निश्चित करावे लागेल."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "तुम्हाला विभाग इंडेक्स् निश्चित करावे लागेल"
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
-msgstr "तुम्ही एकापेक्षा जास्त सींक निश्चित करू शकत नाही. तुम्हाला बूलीयन मूल्य निश्चित करावे लागेल."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
+msgstr ""
+"तुम्ही एकापेक्षा जास्त सींक निश्चित करू शकत नाही. तुम्हाला बूलीयन मूल्य निश्चित करावे लागेल."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr "तुम्ही एकापेक्षा जास्त स्रोत निश्चित करू शकत नाही. तुम्हाला बूलीयन मूल्य निश्चित करावे लागेल."
+msgstr ""
+"तुम्ही एकापेक्षा जास्त स्रोत निश्चित करू शकत नाही. तुम्हाला बूलीयन मूल्य निश्चित करावे लागेल."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "तुम्हाला कार्डचे नाव/इंडेक्स् व प्रोफाइल नाव निश्चित करावे लागेल"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "तुम्हाला सींक नाव/इंडेक्स् व पोर्टचे नाव निश्चित करावे लागेल"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "तुम्हाला स्रोत नाव/इंडेक्स् व पोर्टचे नाव निश्चित करावे लागेल"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "तुम्हाला सींक नाव/इंडेक्स् व पोर्टचे नाव निश्चित करावे लागेल"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "अवैध खंडाची संयोजना"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "तुम्हाला स्रोत नाव/इंडेक्स् व खंडाचे नाव निश्चित करावे लागेल"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "तुम्हाला सींक इंपुट इंडेक्स् व सींक निश्चित करावे लागेल"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "अवैध सींक इंपुट इंडेक्स्"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "तुम्हाला सींक नाव/इंडेक्स् व पोर्टचे नाव निश्चित करावे लागेल"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "तुम्हाला स्रोत नाव/इंडेक्स् व पोर्टचे नाव निश्चित करावे लागेल"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "तुम्हाला सींक इंपुट निर्देशांक व सींक निश्चित करावे लागेल"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "अवैध सींक इंपुट इंडेक्स् संयोजना"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "वैध आदेश निश्चित केले नाही."
 
@@ -2252,44 +2353,44 @@ msgstr "कुकी डेटा दाखल करण्यास अपय
 msgid "Not yet implemented.\n"
 msgstr "अजूनही लागू केले नाही.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr "PulseAudio डिमन कार्यरत नाही, किंवा सत्र डिमन नुरूप कार्यरत नाही."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "PulseAudio डिमन पूर्णपणे नष्ट करण्यास अपयशी."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "डिमन प्रतिसाद देत नाही."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "autospawn कुलूप करीता प्रवेश प्राप्य अशक्य."
 
@@ -2324,38 +2425,42 @@ msgstr ""
 "मूल्य < min_avail असावे."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "बंद करा"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "हाय फिडेलिटी प्लेबॅक (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "हाय फिडीलीटी कॅपचर (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "टेलिफोनी ड्युप्लेक्स् (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio आवाज सर्वर"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "आऊट साधणे"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "इंपुट साधणे"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "@HOSTNAME@ वरील ऑडिओ"
 
@@ -2419,133 +2524,159 @@ msgstr "ऍमप्लिफायर"
 msgid "No Amplifier"
 msgstr "ऍमप्लिफायर अशक्य"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "बूस्ट"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "बूस्ट अशक्य"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "ऍनलॉग हेडफोन्स्"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "ऍनलॉग इंपुट"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "ऍनलॉग माइक्रोफोन"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "ऍनलॉग लाइन-इन"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "ऍनलॉग रेडिओ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "ऍनलॉग विडीओ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "ऍनलॉग आऊटपुट"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "ऍनलॉग हेडफोन्स्"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "ऍनलॉग आऊटपुट (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "ऍनलॉग मोनो आऊटपुट"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "ऍनलॉग स्टिरीओ"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "ऍनलॉग मोनो"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "ऍनलॉग स्टिरीओ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "ऍनलॉग सर्राउंड 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "ऍनलॉग सर्राउंड 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "ऍनलॉग सर्राउंड 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "ऍनलॉग सर्राउंड 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "ऍनलॉग सर्राउंड 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "ऍनलॉग सर्राउंड 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "ऍनलॉग सर्राउंड 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "ऍनलॉग सर्राउंड 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "ऍनलॉग सर्राउंड 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "ऍनलॉग सर्राउंड 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "ऍनलॉग सर्राउंड 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "डिजीटल स्टिरीओ (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "डिजीटल सर्राउंड 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "डिजीटल सर्राउंड 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "डिजीटल सर्राउंड 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "डिजीटल स्टिरीओ (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "ऍनलॉग मोनो ड्युप्लेक्स्"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "ऍनलॉग स्टिरीओ ड्युप्लेक्स्"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "डिजीटल स्टिरीओ ड्युप्लेक्स् (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "कमी क्रिक्वेन्सी स्रोत"
diff --git a/po/nl.po b/po/nl.po
index a1c127e..bb44e54 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-14 04:44+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-10-14 11:00+0100\n"
 "Last-Translator: Reinout van Schouwen <reinout at gmail.com>\n"
 "Language-Team: Dutch <vertaling at vrijschrift.org>\n"
@@ -17,12 +17,12 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding:  \n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -35,7 +35,7 @@ msgstr ""
 "Waarschijnlijk is dit een fout in het ALSA-stuurprogramma ‘%s’. Meld dit "
 "probleem alstublieft aan de ALSA-ontwikkelaars."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -48,7 +48,7 @@ msgstr ""
 "Waarschijnlijk is dit een fout in het ALSA-stuurprogramma ‘%s’. Meld dit "
 "probleem alstublieft aan de ALSA-ontwikkelaars."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -82,11 +82,11 @@ msgid ""
 "plugin name> label=<ladspa plugin label> control=<comma seperated list of "
 "input control values>"
 msgstr ""
-"sink_name=<naam voor de afvoer> sink_properties=<eigenschappen van de afvoer> "
-"master=<naam van de te filteren afvoer> format=<sampleformaat> rate=<sample "
-"snelheid> channels=<aantal kanalen> channel_map=<kanaalkaart> plugin=<ladspa "
-"pluginnaam> label=<ladspa pluginlabel> control=<kommagescheiden "
-"lijst van invoercontrolewaarden>"
+"sink_name=<naam voor de afvoer> sink_properties=<eigenschappen van de "
+"afvoer> master=<naam van de te filteren afvoer> format=<sampleformaat> "
+"rate=<sample snelheid> channels=<aantal kanalen> channel_map=<kanaalkaart> "
+"plugin=<ladspa pluginnaam> label=<ladspa pluginlabel> "
+"control=<kommagescheiden lijst van invoercontrolewaarden>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
@@ -96,11 +96,11 @@ msgstr "Geklokte NULL afvoer"
 msgid "Null Output"
 msgstr "Null-uitvoer"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Intern geluid"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Modem"
 
@@ -116,92 +116,98 @@ msgstr "Kon die nieuwe dl lader niet toekennen."
 msgid "Failed to add bind-now-loader."
 msgstr "Kon bind-now-loader niet toevoegen."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Signaal %s ontvangen."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Afsluiten."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Kon gebruiker '%s' niet vinden."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Kon groep ‘%s’ niet vinden."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Gebruiker ‘%s’ (UID %lu) en groep ‘%s’ (GID %lu) gevonden."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "GID van gebruiker ‘%s’ en van groep ‘%s’ passen niet bij elkaar."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "Persoonlijke map van gebruiker ‘%s’ is niet ‘%s’, negeer het."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Aanmaken van ‘%s’ mislukt: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "Veranderen van groepslijst mislukt: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "Veranderen van GID mislukt: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "Veranderen van UID mislukt: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "Beheerdersrechten met succes laten vervallen."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "Systeembrede modus wordt op dit platform niet ondersteund."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) mislukte: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "Analyseren van de opdrachtregel mislukte."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "Voorziening draait niet"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Voorziening draait met PID %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Elimineren van voorziening mislukt: ‘%s’"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -209,156 +215,171 @@ msgstr ""
 "Dit programma is niet bedoeld om als root gedraaid te worden (behalve als --"
 "system is opgegeven)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Beheerdersrechten vereist."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start wordt niet ondersteund voor systeeminstanties"
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "Draaiend in systeemmodus, maar --disallow-exit is niet ingesteld!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 "Draaiend in systeemmodus, maar --disallow-module-loading is niet gezet!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "Draaiend in systeemmodus, geforceerd uitzetten van SHM-modus!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr "Draaiend in systeemmodus, geforceerd uitzetten van exit idle time!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "Verkrijgen van stdio mislukte."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "pipe mislukte: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() mislukte: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() mislukte: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "Voorziening opstarten mislukt."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "Voorziening met succes opgestart."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() mislukte: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Dit is PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Compilatiehost: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "Compilatie-CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "Draaiend op host: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u CPU's gevonden."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "Pagina grootte is %lu bytes"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Gecompileerd met Valgrind ondersteuning: ja"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Gecompileerd met Valgrind ondersteuning: nee"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Draaiend in valgrind-modus: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "Draaiend op host: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Geoptimaliseerd gebouwd: ja"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Geoptimaliseerd gebouwd: nee"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG gedefinieerd, alle asserts uitgezet."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH gedefinieerd, alleen fast path-asserts uitgezet."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "Alle asserts aangezet."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "Machine-ID verkrijgen mislukt"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "Machine-ID is: %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "Sessie-ID is: %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Gebruik van runtime-map %s."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "Verbruik van state-map %s."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "Gebruik van module-map %s."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Draaiend in systeemmodus: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -367,22 +388,22 @@ msgid ""
 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
 "explanation why system mode is usually a bad idea."
 msgstr ""
-"OK, dus u draait PA in systeemmodus. Merk op dat u dit "
-"waarschijnlijk beter niet kunt doen.\n"
+"OK, dus u draait PA in systeemmodus. Merk op dat u dit waarschijnlijk beter "
+"niet kunt doen.\n"
 "Als u het toch doet dan is het uw eigen schuld als dingen niet werken zoals "
 "verwacht.\n"
-"Lees http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode voor een "
-"uitleg waarom systeemmodus gewoonlijk een slecht idee is."
+"Lees http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode voor een uitleg "
+"waarom systeemmodus gewoonlijk een slecht idee is."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() mislukte."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Verse high-resolution timers beschikbaar! Smakelijk eten!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -390,27 +411,27 @@ msgstr ""
 "Kerel, je kernel stinkt! De aanbeveling van de chef is vandaag Linux met "
 "aangezette high-resolution timers!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() mislukte."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "Initialiseren van de voorziening mislukt."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "Voorziening opgestart zonder geladen modules, dat werkt niet."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "Voorziening opstarten is klaar."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "Voorziening afsluiten is begonnen."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "Voorziening is afgesloten."
 
@@ -677,72 +698,77 @@ msgstr "ACHTERHAALDHEIDSWAARSCHUWING: %s\n"
 msgid "Path: %s\n"
 msgstr "Pad: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Ongeldig logdoel '%s'."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Ongeldig logniveau '%s'."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Ongeldige resample-methode ‘%s’."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] Ongeldige rlimit ‘%s’."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit wordt niet ondersteund op dit platform."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Ongeldig sampleformaat ‘%s’."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Ongeldige samlperate ‘%s’."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Ongeldige sample-kanalen ‘%s’."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Ongeldige kanalenkaart ‘%s’."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Ongeldig aantal fragmenten '%s'."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Ongeldige fragmentgrootte ‘%s’."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Ongeldig nice niveau ‘%s’."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Ongeldige samlperate ‘%s’."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Openen van configuratiebestand %s mislukt."
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -750,7 +776,7 @@ msgstr ""
 "De opgegeven standaard kanalenkaart heeft een ander aantal kanalen dan de "
 "opgegeven standaard aantal kanalen."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Lees uit het configuratiebestand: %s ###\n"
@@ -796,8 +822,8 @@ msgid "Rear Right"
 msgstr "Achter rechts"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Lage-frequentiezender"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1142,191 +1168,191 @@ msgstr "XOpenDisplay() mislukte"
 msgid "Failed to parse cookie data"
 msgstr "Analyseren van cookie-data mislukt"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Open van configuratiebestand ‘%s’ mislukte: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Geen cookie geladen. Probeer zonder cookie te verbinden."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "Ontving boodschap voor onbekende extensie ‘%s’"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Afvoeren stroom %s mislukte"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "Afspelen van afgevoerde stroom."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "Vervinding naar server afvoeren."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() mislukte: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() mislukte: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() mislukte: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Stroom met succes aangemaakt."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() mislukte: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Buffermetriek: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Buffermetriek: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "Gebruik sample-spec  '%s', kanaal map '%s'."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Verbonden met apparaat %s (%u, %sopgeschort)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "Stroomfout: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Stroomapparaat opgeschort.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "Stroomapparaat hervat.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "Te weinig data voor stroom.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "Data-overschrijding voor stroom.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "Stroom gestart.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Stroom verplaatst naar apparaat %s (%u, %sopgeschort).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "niet "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Stroom buffer attributen veranderden.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "Verbinding bereikt.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() mislukte: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() mislukte: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() mislukte: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Verbindingsfout: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "Kreeg EOF."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() mislukte: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "Ontving signaal, afsluiten."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "Latentie krijgen mislukte: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Tijd: %0.3f sec; Latentie: %0.0f usec."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() mislukte: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1378,10 +1404,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [opties]\n"
@@ -1404,8 +1434,8 @@ msgstr ""
 "genoemd\n"
 "      --volume=VOLUME                   Geef het begins (lineare) volume in "
 "reeks 0...65536\n"
-"      --rate=SAMPLERATE                 De samplerate in Hz "
-"(standaard 44100)\n"
+"      --rate=SAMPLERATE                 De samplerate in Hz (standaard "
+"44100)\n"
 "      --format=SAMPLEFORMAT             Het sampletype, een van s16le, "
 "s16be, u8, float32le,\n"
 "                                        float32be, ulaw, alaw, s32le, s32be, "
@@ -1417,11 +1447,11 @@ msgstr ""
 "                                        (standaard 2)\n"
 "      --channel-map=CHANNELMAP          Kanaalkaart te gebruiken in plaats "
 "van de standaard\n"
-"      --fix-format                      Neem het sampleformaat over "
-"van de afvoer waar de stroom\n"
+"      --fix-format                      Neem het sampleformaat over van de "
+"afvoer waar de stroom\n"
 "                                        mee verbonden is.\n"
-"      --fix-rate                        Neem de samplerate over "
-"van de afvoer waar de stroom\n"
+"      --fix-rate                        Neem de samplerate over van de "
+"afvoer waar de stroom\n"
 "                                        mee verbonden is.\n"
 "      --fix-channels                    Neem het aantal kanalen en de kanaal "
 "map over\n"
@@ -1443,7 +1473,7 @@ msgstr ""
 "      --list-file-formats               Laat beschikbare bestandsformaten "
 "zien.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1454,68 +1484,68 @@ msgstr ""
 "Gecompileerd met libpulse %s\n"
 "Gelinkt met libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Ongeldige clientnaam ‘%s’."
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Ongeldige stroomnaam ‘%s’."
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Ongeldige kanaalkaart ‘%s’."
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Ongeldige latentie-specificatie ‘%s’."
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Ongeldige procestijdspecificatie ‘%s’."
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Ongeldige eigenschap ‘%s’."
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Ongeldig bestandsformaat %s"
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Ongeldige samplespecificatie"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Te veel argumenten."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "Aanmaken van samplespecificatie voor bestand mislukt."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "Openen van geluidsbestand mislukte."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
@@ -1523,103 +1553,103 @@ msgstr ""
 "Waarschuwing: opgegeven bemonster specificatie zal overschreven worden met "
 "de specificatie van het bestand."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "Bepalen van samplespecificatie van het bestand mislukte."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "Waarschuwing: Bepalen van kanaalkaart van bestand mislukte."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "Kanaal map komt niet overeen met bemonster specificatie."
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "Waarschuwing: schrijven van kanaalkaart naar bestand mislukte."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
 msgid ""
 "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
 "Openen van een %s stroom met samplespecificatie ‘%s’ en kanaalkaart ‘%s’."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "opnemen"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "afspelen"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() mislukte."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() mislukte."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_cotext_new() mislukte."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() mislukte: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() mislukte."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() mislukte."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "Opschorten mislukte: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "Vervolgen mislukte: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "WAARSCHUWING: Geluidsserver is niet lokaal, geen opschorten.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Verbonding mislukte: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "Kreeg SIGINT, verlaten.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "WAARSCHUWING: kind proces afgesloten door signaal %u\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1638,7 +1668,7 @@ msgstr ""
 "verbonden wordt\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1649,52 +1679,63 @@ msgstr ""
 "Gecompileerd met libpulse %s\n"
 "Gelinkt met libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() mislukte.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() mislukte.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() mislukte.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Verkrijgen van statistiek %s mislukte"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "Op dit moment in gebruik: %u blokken bevattende in totaal %s bytes.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr ""
 "Toegewezen tijdens de gehele levensduur: %u blokken bevattende in totaal %s "
 "butes.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Sample-buffergrootte: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "Server informatie verkrijgen mislukte: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1702,7 +1743,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Gebruikersnaam: %s\n"
 "Hostnaam: %s\n"
@@ -1714,12 +1755,12 @@ msgstr ""
 "Standaard bron: %s\n"
 "Cookie: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Verkrijgen afvoerinformatie mislukte: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1758,22 +1799,22 @@ msgstr ""
 "\tEigenschappen:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tPoorten:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tActieve poort: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "Verkrijgen van broninformatie mislukt: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1812,20 +1853,20 @@ msgstr ""
 "\tEigenschappen:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n.v.t."
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "Verkrijgen van module informatie mislukte: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1842,12 +1883,12 @@ msgstr ""
 "\tEigenschappen:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "Verkrijgen van clientinformatie mislukt: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1862,12 +1903,12 @@ msgstr ""
 "\tEigenschappen:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "Verkrijgen van kaartinformatie mislukt: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1884,22 +1925,22 @@ msgstr ""
 "\tEigenschappen:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tProfielen:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tActieve profiel: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Verkrijgen van afvoer-invoerinformatie mislukt: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1936,12 +1977,12 @@ msgstr ""
 "\tEigenschappen:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "Verkrijgen van bron-uitvoerinformatie mislukt: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1970,12 +2011,12 @@ msgstr ""
 "\tEigenschappen:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Verkrijgen van sample-informatie mislukt: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -2006,26 +2047,80 @@ msgstr ""
 "\tEigenschappen:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Mislukt: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Uploaden van monster mislukte: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "Voortijdig einde van bestand"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Ongeldige server"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "Ontving SIGINT, afsluiten."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2048,6 +2143,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2087,7 +2183,7 @@ msgstr ""
 "  -n, --client-name=NAME                How to call this client on the "
 "server\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2098,107 +2194,108 @@ msgstr ""
 "Gecompileerd met libpulse %s\n"
 "Gelinkt met libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Geef een te laden samplebestand op"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Openen geluidsbestand mislukt."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
-msgstr ""
-"Waarschuwing: Bepalen van samplespecificatie van bestand mislukte."
+msgstr "Waarschuwing: Bepalen van samplespecificatie van bestand mislukte."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "U dient een samplenaam op te geven om af te spelen"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "U dient een samplenaam op te geven om te verwijderen"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "U dient een afvoer-invoerindex en een afvoer op te geven"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "U dient een bron-uitvoerindex en een bron op te geven"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "U dient een modulenaam en argumenten op te geven."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "U dient een module index op te geven"
 
-#: ../src/utils/pactl.c:1090
+#: ../src/utils/pactl.c:1183
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
-"U kunt niet meer dan een afvoer opgeven. U dient een boolean waarde op te geven."
+"U kunt niet meer dan een afvoer opgeven. U dient een boolean waarde op te "
+"geven."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
 msgstr ""
-"U kunt niet meer dan één bron opgeven. u dient een boolean waarde op te geven."
+"U kunt niet meer dan één bron opgeven. u dient een boolean waarde op te "
+"geven."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "U dient een kaartnaam/index en een profielnaam op te geven"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "U dient een afvoernaam/index en een poortnaam op te geven"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "U dient een bronnaam/index en een poortnaam op te geven"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "U dient een afvoernaam/index en een volume op te geven"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "Ongeldige volume-opgave"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "U dient een bronnaam/index en een volume op te geven"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "U dient een afvoer-invoerindex en een volume op te geven"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "Ongeldige afvoer-invoerindex"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "U dient een afvoernaam/index en een dempingsboolean op te geven"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "U dient een bronnaam/index en een dempingsboolean op te geven"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "U dient een afvoer-invoerindex en een dempingsboolean op te geven"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "Ongeldige afvoer-invoerindex opgave"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "Geen geldige opdracht opgegeven."
 
@@ -2282,45 +2379,46 @@ msgstr "Cookiedata laden mislukt\n"
 msgid "Not yet implemented.\n"
 msgstr "Nog niet geïmplementeerd.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
-"Er draait geen PulseAudio-voorziening, of het draait niet als sessievoorziening."
+"Er draait geen PulseAudio-voorziening, of het draait niet als "
+"sessievoorziening."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "PulseAudio-voorziening uitzetten mislukt."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "Voorziening reageert niet."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "Kan geen toegang krijgen tot autospawn blokkade."
 
@@ -2359,38 +2457,42 @@ msgstr ""
 "() gaf 0 terug of een andere waarde < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Uit"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "High Fidelity Playback (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "High Fidelity afvangen (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Telefonie duplex (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio-geluidsserver"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "Uitvoerapparaten"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "Invoerapparaten"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "Geluid op @HOSTNAME@"
 
@@ -2454,136 +2556,163 @@ msgstr "Versterker"
 msgid "No Amplifier"
 msgstr "Geen versterker"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "Boostversterking"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "Geen boostversterking"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "Analoge koptelefoon"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "Analoge invoer"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "Analoge microfoon"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "Analoge lijn-in"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "Analoge radio"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "Analoge video"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "Analoge output"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "Analoge koptelefoon"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "Analoge output (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "Analoge mono-uitvoer"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Analoog stereo"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s/%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Analoog mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Analoog stereo"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "Analoog surround 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "Analoog surround 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "Analoog surround 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Analoog surround 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Analoog surround 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Analoog surround 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Analoog surround 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "Analoog surround 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "Analoog surround 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "Analoog surround 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Analoog surround 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Digitaal stereo (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Digitaal surround 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Digitaal surround 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Digitaal surround 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Digitaal stereo (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "Analoog mono duplex"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "Analoog stereo duplex"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Digitaal stereo duplex (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Lage-frequentiezender"
+
 #, fuzzy
 #~ msgid "Invalid client name '%s'\n"
 #~ msgstr "Ongeldige resample methode '%s'."
diff --git a/po/or.po b/po/or.po
index 4efdc1f..47337a0 100644
--- a/po/or.po
+++ b/po/or.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.or\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-14 08:57+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-11-14 15:33+0530\n"
 "Last-Translator: Manoj Kumar Giri <mgiri at redhat.com>\n"
 "Language-Team: Oriya <oriya-it at googlegroups.com>\n"
@@ -15,7 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11.4\n"
-"Plural-Forms:  nplurals=2; plural=(n!=1);\n\n"
+"Plural-Forms:  nplurals=2; plural=(n!=1);\n"
+"\n"
 "\n"
 "\n"
 "\n"
@@ -32,12 +33,12 @@ msgstr ""
 "\n"
 "\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -50,7 +51,7 @@ msgstr ""
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 "to the ALSA developers."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -63,7 +64,7 @@ msgstr ""
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 "to the ALSA developers."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -109,11 +110,11 @@ msgstr "ସମୟାନୁବର୍ତ୍ତି ଶୂନ୍ୟ ସିଙ୍କ"
 msgid "Null Output"
 msgstr "ଶୂନ୍ୟ ଫଳାଫଳ"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "ଆଭ୍ୟନ୍ତରୀଣ ଧ୍ୱନି"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "ମଡେମ"
 
@@ -129,92 +130,98 @@ msgstr "ନୂତନ dl ଧାରକକୁ ବଣ୍ଟନ କରିବାରେ
 msgid "Failed to add bind-now-loader."
 msgstr "bind-now-loaderକୁ ଯୋଗ କରିବାରେ ବିଫଳ।"
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "ସଂକେତ %s ପାଇଲା।"
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "ଉତ୍ତେଜିତ କରୁଅଛି।"
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "ଚାଳକ '%s' କୁ ଖୋଜିବାରେ ବିଫଳ।"
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "ସମୂହ '%s' କୁ ଖୋଜି ପାଇବାରେ ବିଫଳ।"
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "ଚାଳକ '%s' (UID %lu) ଏବଂ ସମୂହ '%s' (GID %lu) ମିଳିଲା।"
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "ଚାଳକ '%s' ଏବଂ ସମୂହ '%s' ର GID ମେଳଖାଏନାହିଁ।"
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "ଚାଳକ '%s' ର ମୂଖ୍ୟ ଡିରେକ୍ଟୋରୀଟି '%s' ନୁହଁ, ଅଗ୍ରାହ୍ୟ କରୁଅଛି।"
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "'%s' ନିର୍ମାଣ କରିବାରେ ବିଫଳ: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "ସମୂହ ତାଲିକାକୁ ପରିବର୍ତ୍ତନ କରିବାରେ ବିଫଳ: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "GID କୁ ପରିବର୍ତ୍ତନ କରିବାରେ ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "UID କୁ ପରିବର୍ତ୍ତନ କରିବାରେ ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "ମୂଖ୍ୟ ଚାଳକ ଅଧିକାରକୁ ସଫଳତାର ସହିତ ପକାଯାଇଛି।"
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "ତନ୍ତ୍ରମୟ ଧାରା ଏହି ପ୍ଲାଟଫର୍ମରେ ଅସମର୍ଥିତ।"
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "ପାଠ୍ୟ ନିର୍ଦ୍ଦେଶକୁ ବିଶ୍ଳେଷଣ କରିବାରେ ବିଫଳ।"
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "ଡେମନ ଚାଲୁନାହିଁ"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "ଡେମନ PID %u ପରି ଚାଲୁଅଛି"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "ଡେମନକୁ ବନ୍ଦ କରିବାରେ ବିଫଳ: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -222,155 +229,170 @@ msgstr ""
 "ଏହି ପ୍ରଗ୍ରାମଟି ମୂଖ୍ୟ ଚାଳକ ଭାବରେ ଚଲାଇବା ପାଇଁ ନିର୍ଦ୍ଦିଷ୍ଟ ହୋଇନାହିଁ (unless --system is "
 "specified)।"
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "ମୂଖ୍ୟ ଚାଳକ ଅଧିକାର ଆବଶ୍ୟକ।"
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start ତନ୍ତ୍ର ସ୍ଥିତି ପାଇଁ ସମର୍ଥିତ ନୁହଁ।"
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "ତନ୍ତ୍ର ଧାରାରେ ଚାଲୁଅଛି, କିନ୍ତୁ --disallow-exit କୁ ସେଟ କରାଯାଇନାହିଁ!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr "ତନ୍ତ୍ର ଧାରାରେ ଚାଲୁଅଛି, କିନ୍ତୁ --disallow-module-loading କୁ ସେଟ କରାଯାଇନାହିଁ!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "ତନ୍ତ୍ର ଧାରାରେ ଚାଲୁଅଛି, SHM ଧାରାକୁ ବାଧ୍ଯତାମୁଳକ ଭାବରେ ନିଷ୍କ୍ରିୟ କରିଥାଏ!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr "ତନ୍ତ୍ର ଧାରାରେ ଚାଲୁଅଛି, ପ୍ରସ୍ଥାନ ସ୍ଥିର ସମୟକୁ ବାଧ୍ଯତାମୁଳକ ଭାବରେ ନିଷ୍କ୍ରିୟ କରିଥାଏ!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "stdio କୁ ଅଧିକାର କରିବାରେ ବିଫଳ।"
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "ପାଇପ ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "ଡେମନ ଆରମ୍ଭ ବିଫଳ ହୋଇଛି।"
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "ଡେମନ ଆରମ୍ଭ ସଫଳ ହୋଇଛି।"
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() ବିଫଳ ହୋଇଛି: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "ଏହା ହେଉଛି PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "ସଂକଳନ ଆଧାର: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "ସଂକଳନ CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "ଆଧାରରେ ଚାଲୁଅଛି: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u CPUs ମିଳିଛି।"
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "ପୃଷ୍ଠା ଆକାରଟି ହେଉଛି %lu ବାଇଟ"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Valgrind ସମର୍ଥନ ସହିତ ସଂକଳନ ହୋଇଛି: yes"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Valgrind ସମର୍ଥନ ସହିତ ସଂକଳନ ହୋଇଛି: no"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "valgrind ଧାରାରେ ଚାଲୁଅଛି: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "ଆଧାରରେ ଚାଲୁଅଛି: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "ଉପଯୁକ୍ତ ନିର୍ମାଣ: yes"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "ଉପଯୁକ୍ତ ନିର୍ମାଣ: no"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG କୁ ବ୍ୟାଖ୍ୟା କରାଯାଇଛି, ସମସ୍ତ ନିଶ୍ଚୟକୁ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି।"
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH କୁ ବ୍ୟାଖ୍ୟା କରାଯାଇଛି, କେବଳ ତୀବ୍ର ପଥ ନିଶ୍ଚୟକୁ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି।"
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "ସମସ୍ତ ନିଶ୍ଚୟକୁ ସକ୍ରିୟ କରାଯାଇଛି।"
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "ଯନ୍ତ୍ର ID ପାଇବାରେ ବିଫଳ"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "ଯନ୍ତ୍ର ID ଟି ହେଉଛି %s।"
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "ଅଧିବେଶନ ID ଟି ହେଉଛି %s।"
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "ପ୍ରଚଳିତ ଡିରେକ୍ଟୋରୀ %s କୁ ବ୍ୟବହାର କରୁଅଛି।"
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "ସ୍ଥିତି ଡିରେକ୍ଟୋରୀ %s କୁ ବ୍ୟବହାର କରି।"
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "ଏକକାଂଶ ଡିରେକ୍ଟୋରୀ %s କୁ ବ୍ୟବହାର କରି।"
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "ତନ୍ତ୍ର ଧାରାରେ ଚାଲୁଅଛି: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -385,15 +407,15 @@ msgstr ""
 "ତନ୍ତ୍ର ଧାରାଟି ସାଧାରଣତଃ କାହିଁକି ଖରାପ ତାହା ବିଷୟରେ ଜାଣିବା ପାଇଁ ଦୟାକରି http://pulseaudio."
 "org/wiki/WhatIsWrongWithSystemMode କୁ ପଢ଼ନ୍ତୁ।"
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() ବିଫଳ ହୋଇଛି।"
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "ସତେଜ ଉଚ୍ଚ-ବିଭେଦନ ସମୟ ମାପକ ଉପଲବ୍ଧ! Bon appetit!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -401,27 +423,27 @@ msgstr ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() ବିଫଳ ହୋଇଛି।"
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "ଡେମନକୁ ଆରମ୍ଭ କରିବାରେ ବିଫଳ।"
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "ଧାରଣ ହୋଇଥିବା ଏକକାଂଶଗୁଡ଼ିକ ବିନା ଡେମନ ଆରମ୍ଭ ହୋଇଛି, କାର୍ଯ୍ୟ କରିବାକୁ ବାରଣ କରୁଅଛି।"
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "ଡେମନ ଆରମ୍ଭ ସମ୍ପୂର୍ଣ୍ଣ ହୋଇଛି।"
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "ଡେମନ ବନ୍ଦକୁ ଆରମ୍ଭ କରାଯାଇଛି।"
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "ଡେମନକୁ ସମାପ୍ତ କରାଯାଇଛି।"
 
@@ -677,72 +699,77 @@ msgstr "DEPRECATION WARNING: %s\n"
 msgid "Path: %s\n"
 msgstr "ପଥ: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] ଅବୈଧ ଲଗ ଲକ୍ଷ୍ଯସ୍ଥଳ '%s'।"
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] ଅବୈଧ ଲଗ ସ୍ତର%s'."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] ଅବୈଧ ପୁନଃ ମିଶ୍ରଣ ଧାରା '%s'।"
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] ଅବୈଧ rlimit '%s'."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit ଏହି ପ୍ଲାଟଫର୍ମରେ ସମର୍ଥିତ ନୁହଁ।"
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] ଅବୈଧ ନମୁନା ଶୈଳୀ '%s'।"
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] ଅବୈଧ ନମୁନା ହାର '%s'।"
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] ଅବୈଧ ନମୁନା ଚ୍ୟାନେଲ '%s'।"
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] ଅବୈଧ ଚ୍ୟାନେଲ ମ୍ୟାପ '%s'."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] ଅବୈଧ ସଂଖ୍ୟକ ଖଣ୍ଡଗୁଡ଼ିକ '%s'."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] ଅବୈଧ ଖଣ୍ଡ ଆକାର '%s'."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] ଅବୈଧ ସୁନ୍ଦର ସ୍ତର '%s'."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] ଅବୈଧ ନମୁନା ହାର '%s'।"
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "ବିନ୍ୟାସ ଫାଇଲ ଖୋଲିବାରେ ବିଫଳ: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -750,7 +777,7 @@ msgstr ""
 "ନିର୍ଦ୍ଦିଷ୍ଟିତ ପୂର୍ବନିର୍ଦ୍ଧାରିତ ଚ୍ୟାନେଲ ମ୍ୟାପରେ ପୂର୍ବନିର୍ଦ୍ଧାରିତ ସଂଖ୍ୟକ ଚ୍ୟାନେଲ ବ୍ୟତିତ ଭିନ୍ନ ସଂଖ୍ୟକ "
 "ଚ୍ୟାନେଲ ଉଲ୍ଲେଖ ଅଛି।"
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### ବିନ୍ୟାସ ଫାଇଲରୁ ପଢ଼ନ୍ତୁ: %s ###\n"
@@ -796,8 +823,8 @@ msgid "Rear Right"
 msgstr "ପଛ ଡ଼ାହାଣ ପାଖ"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "ନିମ୍ନ ଆବୃତ୍ତି ପରିତ୍ୟାଗ କାରୀ"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1142,191 +1169,191 @@ msgstr "XOpenDisplay() ବିଫଳ ହୋଇଛି"
 msgid "Failed to parse cookie data"
 msgstr "କୁକି ତଥ୍ୟକୁ ବିଶ୍ଳେଷଣ କରିବାରେ ବିଫଳ"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "ବିନ୍ୟାସ ଫାଇଲ '%s' କୁ ଖୋଲିବାରେ ବିଫଳ: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "କୌଣସି କୁକି ଧାରଣ କରାଯାଇନାହିଁ। ତାହା ବିନା ସଂଯୋଗ କରିବାକୁ ପ୍ରଚେଷ୍ଚା କରୁଅଛି।"
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "ଅଜଣା ଅନୁଲଗ୍ନ '%s' ପାଇଁ ସନ୍ଦେଶ ଗ୍ରହଣ କରିଅଛି"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "ଧାରାକୁ ବାହାର କରିବାରେ ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "ପଛଚଲା ଧାରାକୁ ବାହାର କରାଯାଇଛି।"
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "ସର୍ଭର ପ୍ରତି ଡ୍ରେନିଙ୍ଗ ସଂଯୋଗ।"
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "ଧାରା ସଫଳତାର ସହିତ ନିର୍ମାଣ ହୋଇଛି।"
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "ବଫର ମେଟ୍ରିକସ: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "ବଫର ମେଟ୍ରିକସ: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "ନମୁନା spec '%s' ବ୍ୟବହାର କରି, ଚ୍ୟାନେଲ ମ୍ୟାପ '%s'।"
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "ଉପକରଣ %s ସହିତ ସଂଯୁକ୍ତ ହୋଇଛି (%u, %ssuspended)।"
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "ଧାରା ତ୍ରୁଟି: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "ଧାରା ଉପକରଣ ନିଲମ୍ବିତ ହୋଇଛି।%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "ଧାରା ଉପକରଣ ପୁନଃ ଚଳନ ହୋଇଛି।%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "ଧାରା underrun.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "ଧାରା overrun.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "ଧାରା ଆରମ୍ଭ ହୋଇଛି।%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "ଧାରା ଉପକରଣ %sକୁ ଗତି କରିଛି (%u, %ssuspended).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "not "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "ଧାରା ବଫର ଗୁଣଗୁଡ଼ିକ ପରିବର୍ତ୍ତନ ହୋଇଛି।%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "ସଂଯୋଗ ସ୍ଥାପିତ ହୋଇଛି।%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "ସଂଯୋଗ ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "EOF ପାଇଅଛି।"
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "ସଂକେତ ପାଇଲା, ପ୍ରସ୍ଥାନ କରୁଅଛି।"
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "ବିଳମ୍ବତା ପାଇବାରେ ବିଫଳ: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "ସମୟ: %0.3f ସେକଣ୍ଡ; ବିଳମ୍ବତା: %0.0f usec."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1378,10 +1405,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [ବିକଳ୍ପଗୁଡ଼ିକ]\n"
@@ -1434,7 +1465,7 @@ msgstr ""
 "      --file-format=FFORMAT             ସଜ୍ଜିକୃତ PCM ତଥ୍ୟକୁ ଲିପିବଦ୍ଧ କରନ୍ତୁ/ଚଲାନ୍ତୁ।\n"
 "      --list-file-formats               ତାଲିକା ଉପଲବ୍ଧ ଫାଇଲ ସଜ୍ଜିକରଣ ଶୈଳୀ।\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1445,168 +1476,169 @@ msgstr ""
 "libpulse %s ସହିତ ସଂକଳିତ\n"
 "libpulse %s ସହିତ ସଂଯୁକ୍ତ\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "ଅବୈଧ କ୍ଲାଏଣ୍ଟ ନାମ '%s'"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "ଅବୈଧ ଧାରା ନାମ '%s'"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "ଅବୈଧ ଚ୍ୟାନେଲ ମ୍ୟାପ '%s'"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "ଅବୈଧ ବିଳମ୍ବତା ବିଶେଷ ଲକ୍ଷଣ '%s'"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "ଅବୈଧ ପଦ୍ଧତି ସମୟ ବିଶେଷ ଲକ୍ଷଣ '%s'"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "ଅବୈଧ ଗୁଣଧର୍ମ '%s'"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "ଅଜଣା ଫାଇଲ ସଜ୍ଜିକରଣ ଶୈଳୀ %s।"
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "ଅବୈଧ ନମୁନା ବିଶେଷ ଲକ୍ଷଣ"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "ଅତ୍ୟଧିକ ସ୍ୱତନ୍ତ୍ରଚର।"
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "ଫାଇଲ ପାଇଁ ନମୁନା ସୂଚନା ସୃଷ୍ଟି କରିବାରେ ବିଫଳ।"
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "ଧ୍ୱନି ଫାଇଲ ଖୋଲିବାରେ ବିଫଳ।"
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
 msgstr "ଚେତାବନୀ: ଉଲ୍ଲିଖିତ ନମୁନା ବିଶେଷ ଲକ୍ଷଣକୁ ଫାଇଲରୁ ବିଶେଷ ଲକ୍ଷଣ ସହିତ ନବଲିଖନ କରାଯିବ।"
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "ଫାଇଲରୁ ନମୁନା ସୂଚନା ନିର୍ଦ୍ଧାରଣ କରିବାରେ ବିଫଳ।"
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "ଚେତାବନୀ: ଫାଇଲରୁ ଚ୍ୟାନେଲ ମ୍ୟାପ ନିର୍ଦ୍ଧାରଣ କରିବାରେ ବିଫଳ।"
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "ନମୁନା ବିଶେଷ ଲକ୍ଷଣ ସହିତ ଚ୍ୟାନେଲ ମ୍ୟାପ ମେଳ ଖାଉନାହିଁ"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "ଚେତାବନୀ: ଚ୍ୟାନେଲ ମ୍ୟାପକୁ ଫାଇଲରେ ଲେଖିବାରେ ବିଫଳ।"
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "ନମୁନା ବିଶେଷ ଲକ୍ଷଣ '%s' ଏବଂ ଚ୍ୟାନେଲ ମ୍ୟାପ '%s' ସହିତ ଗୋଟିଏ %s ଧାରାକୁ ଖୋଲୁଅଛି।"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "ଅନୁଲିପି କରୁଅଛି"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "ପଛଚଲା"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() ବିଫଳ ହୋଇଛି।"
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() ବିଫଳ ହୋଇଛି।"
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() ବିଫଳ ହୋଇଛି।"
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() ବିଫଳ ହୋଇଛି: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() ବିଫଳ ହୋଇଛି।"
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() ବିଫଳ ହୋଇଛି।"
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "ନିଲମ୍ବନ କରିବାରେ ବିଫଳ: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "ପୁନଃ ଚଳନ କରିବାରେ ବିଫଳ: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "WARNING: ଧ୍ୱନି ସର୍ଭରଟି ସ୍ଥାନୀୟ ନୁହଁ, ନିଲମ୍ବିତ କରୁନାହିଁ।\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "ସଂଯୋଗ ବିଫଳ ହୋଇଛି: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "SIGINT ପାଇଛି, ଉତ୍ସାହିତ କରୁଅଛି।\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "WARNING: ନିମ୍ନ ସ୍ତରର ପ୍ରକ୍ରିୟାଟି ସଂକେତ %u ଦ୍ୱାରା ସମାପ୍ତ\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1624,7 +1656,7 @@ msgstr ""
 "  -s, --server=SERVER                   ସଂଯୋଗ କରିବା ପାଇଁ ସର୍ଭରର ନାମ\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1635,50 +1667,61 @@ msgstr ""
 "libpulse %s ସହିତ ସଂକଳିତ\n"
 "libpulse %s ସହିତ ସଂଯୁକ୍ତ\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() ବିଫଳ ହୋଇଛି।\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() ବିଫଳ ହୋଇଛି।\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() ବିଫଳ ହୋଇଛି।\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "ପରିସଂଖ୍ୟାନ ପାଇବାରେ ବିଫଳ: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "ବର୍ତ୍ତମାନ ବ୍ୟବହାରରେ ଅଛି: %u ବ୍ଲକ ସମୁଦାୟ %s ବାଇଟ ଧାରଣ କରିଥାଏ।\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "ସମଗ୍ର ଜୀବନରେ ବଣ୍ଟିତ ହୋଇଥାଏ: %u ବ୍ଲକ ସମୁଦାୟ %s ବାଇଟ ଧାରଣ କରିଥାଏ।\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "ନମୁନା କ୍ୟାଶେ ଆକାର: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "ସର୍ଭର ସୂଚନା ପାଇବାରେ ବିଫଳ: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1686,7 +1729,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "ଚାଳକ ନାମ: %s\n"
 "ଆଧାର ନାମ: %s\n"
@@ -1698,12 +1741,12 @@ msgstr ""
 "ପୂର୍ବନିର୍ଦ୍ଧାରିତ ଉତ୍ସ: %s\n"
 "କୁକି: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "ସିଙ୍କ ସୂଚନା ପାଇବାରେ ବିଫଳ: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1742,22 +1785,22 @@ msgstr ""
 "\tଗୁଣଧର୍ମ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tସଂଯୋଗିକୀଗୁଡ଼ିକ:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tସକ୍ରିୟ ସଂଯୋଗିକୀ: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "ଉତ୍ସ ସୂଚନା ପାଇବାରେ ବିଫଳ: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1796,20 +1839,20 @@ msgstr ""
 "\tଗୁଣଧର୍ମ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n/a"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "ଏକକାଂଶ ସୂଚନା ପାଇବାରେ ବିଫଳ: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1826,12 +1869,12 @@ msgstr ""
 "\tଗୁଣଧର୍ମ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "ଗ୍ରାହକ ସୂଚନା ପାଇବାରେ ବିଫଳ: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1846,12 +1889,12 @@ msgstr ""
 "\tଗୁଣଧର୍ମ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "କାର୍ଡ ସୂଚନା ପାଇବାରେ ବିଫଳ: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1868,22 +1911,22 @@ msgstr ""
 "\tଗୁଣଧର୍ମ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tରୂପରେଖଗୁଡ଼ିକ:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tସକ୍ରିୟ ରୂପରେଖା: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "ସିଙ୍କ ନିବେଶ ସୂଚନା ପାଇବାରେ ବିଫଳ: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1920,12 +1963,12 @@ msgstr ""
 "\tଗୁଣଧର୍ମ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "ଉତ୍ସ ଫଳାଫଳ ସୂଚନା ପାଇବାରେ ବିଫଳ: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1954,12 +1997,12 @@ msgstr ""
 "\tଗୁଣଧର୍ମ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "ନମୁନା ସୂଚନା ପାଇବାରେ ବିଫଳ: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1990,26 +2033,80 @@ msgstr ""
 "\tଗୁଣଧର୍ମ:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "ବିଫଳତା: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "ନମୁନାକୁ ଧାରଣ କରିବାରେ ବିଫଳ: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "ଫାଇଲର ସମୟ ପୂର୍ବ ସମାପ୍ତି"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "ଅବୈଧ ସର୍ଭର"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT ପାଇଛି, ଉତ୍ସାହିତ କରୁଅଛି।"
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2032,6 +2129,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2069,7 +2167,7 @@ msgstr ""
 "  -s, --server=SERVER                   ସଂଯୋଗ କରିବା ପାଇଁ ସର୍ଭରର ନାମ\n"
 "  -n, --client-name=NAME                ସର୍ଭରରେ ଏହି କ୍ଲାଏଣ୍ଟକୁ କିପରି ଡାକିବେ\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2080,103 +2178,106 @@ msgstr ""
 "libpulse %s ସହିତ ସଂକଳିତ\n"
 "libpulse %s ସହିତ ସଂଯୁକ୍ତ\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "ଧାରଣ କରିବା ପାଇଁ ଗୋଟିଏ ନୁମନା ଫାଇଲ ଉଲ୍ଲେଖ କରନ୍ତୁ"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "ଧ୍ୱନି ଫାଇଲ ଖୋଲିବାରେ ବିଫଳ।"
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "ଚେତାବନୀ: ଫାଇଲରୁ ନମୁନା ବିଶେଷ ଲକ୍ଷଣକୁ ନିର୍ଦ୍ଧାରଣ କରିବାରେ ବିଫଳ।"
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "ଚଲାଇବା ପାଇଁ ଆପଣଙ୍କୁ ଗୋଟିଏ ନମୁନା ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "କାଢ଼ିବା ପାଇଁ ଆପଣଙ୍କୁ ଗୋଟିଏ ନମୁନା ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ସିଙ୍କ ନିବେଶ ଅନୁକ୍ରମଣିକା ଏବଂ ଗୋଟିଏ ସିଙ୍କ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ଉତ୍ସ ନିର୍ଗମ ଅନୁକ୍ରମଣିକା ଏବଂ ଗୋଟିଏ ଉତ୍ସ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ଏକକାଂଶ ନାମ ଏବଂ ସ୍ୱତନ୍ତ୍ରଚରଗୁଡ଼ିକୁ ଉଲ୍ଲେଖ କରିବା ଉଚିତ।"
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ଏକକାଂଶ ଅନୁକ୍ରମଣିକାକୁ ଉଲ୍ଲେଖ କରିବା ଉଚିତ ନୁହଁ"
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
-msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏରୁ ଅଧିକ ସିଙ୍କ ଉଲ୍ଲେଖ କରିବାକୁ ପଡ଼ିନପାରେ। ଆପଣଙ୍କୁ ଗୋଟିଏ ବୁଲିଆନ ମୂଲ୍ୟ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ।"
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
+msgstr ""
+"ଆପଣଙ୍କୁ ଗୋଟିଏରୁ ଅଧିକ ସିଙ୍କ ଉଲ୍ଲେଖ କରିବାକୁ ପଡ଼ିନପାରେ। ଆପଣଙ୍କୁ ଗୋଟିଏ ବୁଲିଆନ ମୂଲ୍ୟ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ।"
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏରୁ ଅଧିକ ଉତ୍ସ ଉଲ୍ଲେଖ କରିବାକୁ ପଡ଼ିନପାରେ। ଆପଣଙ୍କୁ ଗୋଟିଏ ବୁଲିଆନ ମୂଲ୍ୟ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ।"
+msgstr ""
+"ଆପଣଙ୍କୁ ଗୋଟିଏରୁ ଅଧିକ ଉତ୍ସ ଉଲ୍ଲେଖ କରିବାକୁ ପଡ଼ିନପାରେ। ଆପଣଙ୍କୁ ଗୋଟିଏ ବୁଲିଆନ ମୂଲ୍ୟ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ।"
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ କାର୍ଡ ନାମ/ଅନୁକ୍ରମଣିକା ଏବଂ ରୂପରେଖା ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ସିଙ୍କ ନାମ/ଅନୁକ୍ରମଣିକା ଏବଂ ସଂଯୋଗିକୀ ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ଉତ୍ସ ନାମ/ଅନୁକ୍ରମଣିକା ଏବଂ ସଂଯୋଗିକୀ ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ସିଙ୍କ ନାମ/ଅନୁକ୍ରମଣିକା ଏବଂ ସଂଯୋଗିକୀ ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "ଅବୈଧ ନମୁନା ବିଶେଷ ଲକ୍ଷଣ"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ଉତ୍ସ ନାମ/ଅନୁକ୍ରମଣିକା ଏବଂ ସଂଯୋଗିକୀ ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ସିଙ୍କ ନିବେଶ ଅନୁକ୍ରମଣିକା ଏବଂ ଗୋଟିଏ ସିଙ୍କ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "ଅବୈଧ ସିଙ୍କ ନିବେଶ ଅନୁକ୍ରମଣିକା"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ସିଙ୍କ ନାମ/ଅନୁକ୍ରମଣିକା ଏବଂ ସଂଯୋଗିକୀ ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ଉତ୍ସ ନାମ/ଅନୁକ୍ରମଣିକା ଏବଂ ସଂଯୋଗିକୀ ନାମ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "ଆପଣଙ୍କୁ ଗୋଟିଏ ସିଙ୍କ ନିବେଶ ଅନୁକ୍ରମଣିକା ଏବଂ ଗୋଟିଏ ସିଙ୍କ ଉଲ୍ଲେଖ କରିବାକୁ ହେବ"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "ଅବୈଧ ସିଙ୍କ ନିବେଶ ଅନୁକ୍ରମଣିକା ବିଶେଷ ଲକ୍ଷଣ"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "କୌଣସି ବୈଧ ନିର୍ଦ୍ଦେଶ ଉଲ୍ଲେଖ କରାଯାଇନାହିଁ।"
 
@@ -2258,44 +2359,44 @@ msgstr "କୁକି ତଥ୍ୟ ଧାରଣ କରିବାରେ ବିଫ
 msgid "Not yet implemented.\n"
 msgstr "ଅପର୍ଯ୍ୟନ୍ତ କାର୍ଯ୍ୟକାରୀ ହୋଇନାହିଁ।\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr "କୌଣସି PulseAudio ଡେମନ ଚାଲୁନାହିଁ, କିମ୍ବା ଅଧିବେଶନ ଡେମନ ପରି ଚାଲୁନାହିଁ।"
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "ସକେଟ(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "ସଂଯୋଗ କରନ୍ତୁ(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "PulseAudio ଡେମନକୁ ବନ୍ଦ କରିବାରେ ବିଫଳ।"
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "ଡେମନ ଉତ୍ତର ଦେଉନାହିଁ।"
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "ପଢ଼ନ୍ତୁ(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "ଲେଖନ୍ତୁ(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "autospawn ଅପରିବର୍ତ୍ତନୀୟତାକୁ ଅଭିଗମ୍ୟ କରିହେଉ ନାହିଁ"
 
@@ -2334,38 +2435,42 @@ msgstr ""
 "returned 0 or another value < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "ଅଫ"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "ଉଚ୍ଚ ଫିଡିଲିଟି ପଛଚଲା (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "ଉଚ୍ଚ ଫିଡିଲିଟି ପଛଚଲା (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "ଟେଲିଫୋନି ଡ୍ୟୁପ୍ଲେକ୍ସ (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio ଧ୍ୱନି ସର୍ଭର"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "ଫଳାଫଳ ଉପକରଣ"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "ନିବେଶ ଉପକରଣ"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "@HOSTNAME@ ରେ ଧ୍ୱନି"
 
@@ -2429,133 +2534,159 @@ msgstr "ଏମ୍ପ୍ଲିଫାୟର"
 msgid "No Amplifier"
 msgstr "ଏମ୍ପ୍ଲିଫାୟର ନାହିଁ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "ବୃଦ୍ଧି"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "ବୃଦ୍ଧି ନାହିଁ"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "ଏନାଲୋଗ ହେଡ଼ଫୋନଗୁଡ଼ିକ"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "ଏନାଲୋଗ ନିବେଶ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "ଏନାଲୋଗ ମାଇକ୍ରୋଫୋନ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "ଏନାଲୋଗ ଲାଇନ-ଇନ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "ଏନାଲୋଗ ରେଡ଼ିଓ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "ଏନାଲୋଗ ଭିଡ଼ିଓ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "ଏନାଲୋଗ ଫଳାଫଳ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "ଏନାଲୋଗ ହେଡ଼ଫୋନଗୁଡ଼ିକ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "ଏନାଲୋଗ ଫଳାଫଳ (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "ଏନାଲୋଗ ମୋନୋ ଫଳାଫଳ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "ଏନାଲୋଗ ଷ୍ଟେରିଓ"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "ଏନାଲୋଗ ମୋନୋ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "ଏନାଲୋଗ ଷ୍ଟେରିଓ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "ଏନାଲୋଗ ଚତୁଃ ପାର୍ଶ୍ୱ 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "ଡିଜିଟାଲ ଷ୍ଟେରିଓ (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "ଡିଜିଟାଲ ଚତୁଃ ପାର୍ଶ୍ୱ 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "ଡିଜିଟାଲ ଚତୁଃ ପାର୍ଶ୍ୱ 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "ଡିଜିଟାଲ ଚତୁଃ ପାର୍ଶ୍ୱ 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "ଡିଜିଟାଲ ଷ୍ଟେରିଓ (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "ଏନାଲୋଗ ମୋନୋ ଡ଼ୁପ୍ଲେକ୍ସ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "ଏନାଲୋଗ ଷ୍ଟେରିଓ ଡ଼ୁପ୍ଲେକ୍ସ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "ଡିଜିଟାଲ ଷ୍ଟେରିଓ ଡ଼ୁପ୍ଲେକ୍ସ (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "ନିମ୍ନ ଆବୃତ୍ତି ପରିତ୍ୟାଗ କାରୀ"
diff --git a/po/pa.po b/po/pa.po
index ab97ac0..1cc19e7 100644
--- a/po/pa.po
+++ b/po/pa.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.pa\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-08 08:37+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-12-08 15:04+0530\n"
 "Last-Translator: Jaswinder Singh <jsingh at redhat.com>\n"
 "Language-Team: Punjabi/Panjabi <kde-i18n-doc at kde.org>\n"
@@ -19,12 +19,12 @@ msgstr ""
 "X-Generator: Lokalize 1.0\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -35,7 +35,7 @@ msgstr ""
 "snd_pcm_avail() ਤੋਂ ਇੱਕ ਮੁੱਲ ਮਿਲਿਆ ਹੈ, ਜੋ ਬਹੁਤ ਵੱਡਾ ਹੈ: %lu ਬਾਈਟ (%lu ms)।\n"
 "ਇਹ ALSA ਡਰਾਈਵਰ '%s' ਵਿਚਲਾ ਬੱਗ ਲੱਗਦਾ ਹੈ। ਇਸ ਮੁੱਦੇ ਦੀ ALSA ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਰਿਪੋਰਟ ਦਿਓ ਜੀ।"
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -46,7 +46,7 @@ msgstr ""
 "snd_pcm_delay() ਤੋਂ ਇੱਕ ਮੁੱਲ ਮਿਲਿਆ ਹੈ, ਜੋ ਬਹੁਤ ਵੱਡਾ ਹੈ: %li ਬਾਈਟ (%s%lu ms)।\n"
 "ਇਹ ALSA ਡਰਾਈਵਰ '%s' ਵਿਚਲਾ ਬੱਗ ਲੱਗਦਾ ਹੈ। ਇਸ ਮੁੱਦੇ ਦੀ ALSA ਡਿਵੈਲਪਰਾਂ ਨੂੰ ਰਿਪੋਰਟ ਦਿਓ ਜੀ।"
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -91,11 +91,11 @@ msgstr "ਕਲਾਕਡ NULL ਸਿੰਕ"
 msgid "Null Output"
 msgstr "ਜ਼ੀਰੋ (Null) ਆਉਟਪੁੱਟ"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "ਅੰਦਰੂਨੀ ਆਡੀਓ"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "ਮਾਡਮ"
 
@@ -111,246 +111,267 @@ msgstr "ਨਵਾਂ dl ਲੋਡਰ ਦੇਣ ਲਈ ਫੇਲ੍ਹ।"
 msgid "Failed to add bind-now-loader."
 msgstr "ਬਾਈਂਡ-ਨਾਓ-ਲੋਡਰ ਜੋੜਨ ਵਿੱਚ ਫੇਲ੍ਹ ਹੋਇਆ।"
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "%s ਸਿਗਨਲ ਮਿਲਿਆ ਹੈ।"
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "ਬੰਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।"
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "'%s' ਯੂਜ਼ਰ ਲੱਭਣ ਵਿੱਚ ਫੇਲ੍ਹ ਹੋਇਆ ਹੈ।"
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "'%s' ਗਰੁੱਪ ਲੱਭਣ ਵਿੱਚ ਫੇਲ ਹੋਇਆ ਹੈ।"
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "ਯੂਜ਼ਰ '%s' (UID %lu) ਅਤੇ ਗਰੁੱਪ '%s' (GID %lu) ਲੱਭੇ ਹਨ।"
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "ਯੂਜ਼ੂ '%s' ਅਤੇ ਗਰੁੱਪ '%s' ਦਾ GID ਮੇਲ ਨਹੀਂ ਖਾਂਦੇ।"
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "ਯੂਜ਼ੂ '%s' ਦੀ ਘਰ ਡਾਇਰੈਕਟਰੀ '%s' ਨਹੀਂ, ਅਣਡਿੱਠਾ ਕਰ ਰਿਹਾ।"
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "'%s' ਬਣਾਉਣ ਵਿੱਚ ਫੇਲ੍ਹ: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "ਗਰੁੱਪ ਲਿਸਟ ਬਦਲਣ ਲਈ ਫੇਲ੍ਹ: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "GID ਬਦਲਣ ਲਈ ਫੇਲ੍ਹ: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "UID ਬਦਲਣ ਲਈ ਫੇਲ੍ਹ: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "ਰੂਟ ਅਧਿਕਾਰ ਸਫਲਤਾਪੂਰਕ ਹਟਾਏ ਗਏ।"
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "ਇਸ ਪਲੇਟਫਾਰਮ ਤੇ ਸਿਸਟਮ ਸੰਬੰਧੀ ਮੋਡ ਨੂੰ ਸਹਿਯੋਗ ਨਹੀਂ ਹੈ।"
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) ਫੇਲ੍ਹ ਹੋਇਆ: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "ਕਮਾਂਡ ਲਾਈਨ ਪਾਰਸ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ।"
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "ਡੈਮਨ ਚੱਲ ਨਹੀਂ ਰਿਹਾ"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "ਡੈਮਨ PID %u ਤੌਰ ਤੇ ਚੱਲ ਰਿਹਾ ਹੈ"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "ਡੈਮਨ ਖਤਮ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
 msgstr "ਇਹ ਪਰੋਗਰਾਮ ਰੂਟ ਦੇ ਤੌਰ ਤੇ ਚਲਾਉਣ ਲਈ ਨਹੀਂ ਹੈ (ਜਦੋਂ ਤੱਕ --system ਦਿੱਤਾ ਨਹੀਂ ਜਾਂਦਾ)।"
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "ਰੂਟ ਅਧਿਕਾਰਾਂ ਦੀ ਲੋੜ ਹੈ।"
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start ਨੂੰ ਸਿਸਟਮ ਮੌਕਿਆਂ ਲਈ ਸਹਿਯੋਗ ਨਹੀਂ ਹੈ।"
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "ਸਿਸਟਮ ਮੋਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ, ਪਰ --disallow-exit ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr "ਸਿਸਟਮ ਮੋਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ, ਪਰ --disallow-module-loading ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "ਸਿਸਟਮ ਮੋਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ, ਜ਼ਬਰਦਸਤੀ SHM ਮੋਡ ਨੂੰ ਅਯੋਗ ਕਰ ਰਿਹਾ ਹੈ!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr "ਸਿਸਟਮ ਮੋਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ, ਜ਼ਬਰਦਸਤੀ idle ਟਾਈਲ ਬੰਦ ਨੂੰ ਅਯੋਗ ਕਰ ਰਿਹਾ ਹੈ!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "ਸਟੂਡੀਓ ਪ੍ਰਾਪਤ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ।"
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "pipe ਫੇਲ੍ਹ: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() ਫੇਲ੍ਹ ਹੈ: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() ਫੇਲ੍ਹ ਹੈ: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "ਡੈਮਨ ਸ਼ੁਰੂਆਤੀ ਫੇਲ੍ਹ ਹੋਈ।"
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "ਡੈਮਨ ਸ਼ੁਰੂਆਤੀ ਸਫ਼ਲ ਹੋਈ।"
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() ਫੇਲ੍ਹ ਹੈ: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "ਇਹ ਪਲਸਆਡੀਓ %s ਹੈ"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "ਕੰਪਾਈਲੇਸ਼ਨ ਹੋਸਟ: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "ਕੰਪਾਈਲੇਸ਼ਨ CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "ਹੋਸਟ ਤੇ ਚੱਲ ਰਿਹਾ ਹੈ: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u CPUs ਲੱਭੇ।"
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "ਪੇਜ਼ ਸਾਈਜ਼ %lu ਬਾਈਟ ਹੈ"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Valgrind ਸਹਿਯੋਗ ਨਾਲ ਕੰਪਾਈਲ: ਹਾਂ"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Valgrind ਸਹਿਯੋਗ ਨਾਲ ਕੰਪਾਈਲ: ਨਹੀਂ"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Valgrind ਮੋਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "ਹੋਸਟ ਤੇ ਚੱਲ ਰਿਹਾ ਹੈ: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "ਓਪਟੀਮਾਈਜ਼ਡ ਬਿਲਡ: ਹਾਂ"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "ਓਪਟੀਮਾਈਜ਼ਡ ਬਿਲਡ: ਨਹੀਂ"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG ਪਰਿਭਾਸ਼ਤ, ਸਭ asserts ਅਯੋਗ ਹਨ।"
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH ਪਰਿਭਾਸ਼ਤ, ਸਿਰਫ ਫਾਸਟ ਪਾਥ asserts ਅਯੋਗ ਹਨ।"
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "ਸਭ asserts ਯੋਗ ਕੀਤੇ ਹਨ।"
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "ਮਸ਼ੀਨ ID ਪ੍ਰਾਪਤ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "ਮਸ਼ੀਨ ID %s ਹੈ।"
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "ਸ਼ੈਸ਼ਨ ID %s ਹੈ।"
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "ਰਨਟਾਈਮ ਡਾਇਰੈਕਟਰੀ %s ਦੀ ਵਰਤੋਂ।"
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "ਸਟੇਟ ਡਾਇਰੈਕਟਰੀ %s ਦੀ ਵਰਤੋਂ।"
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "ਮੈਡਿਊਲ ਡਾਇਰੈਕਟਰੀ %s ਦੀ ਵਰਤੋਂ।"
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "ਸਿਸਟਮ ਮੋਡ ਵਿੱਚ ਚੱਲ ਰਿਹਾ ਹੈ: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -365,42 +386,42 @@ msgstr ""
 "ਕਿਰਪਾ ਕਰਕੇ ਸਿਸਟਮ ਮੋਡ ਦੇ ਗਲਤ ਹੋਣ ਬਾਰੇ ਵਧੇਰੇ ਜਾਣਕਾਰੀ ਲਈ http://pulseaudio.org/wiki/"
 "WhatIsWrongWithSystemMode ਵੇਖੋ।"
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() ਫੇਲ੍ਹ ਹੈ।"
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "ਤਾਜ਼ੀ ਹਾਈ-ਰੈਜ਼ੋਲੂਸ਼ਨ ਟਾਈਮਰ ਉਪਲੱਬਧ ਹੈ! Bon appetit!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
 msgstr ""
 "ਮਿੱਤਰਾ, ਤੇਰਾ ਕਰਨਲ ਪੁਰਾਣਾ ਹੈ! ਚੀਫ ਦੀ ਅੱਜ ਦੀ ਸਿਫਾਰਸ਼ ਹਾਈ-ਰੈਜ਼ੋਲੂਸ਼ਨ ਟਾਈਮਰ ਯੋਗ ਨਾਲ ਲੀਨਕਸ ਹੈ!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() ਫੇਲ੍ਹ ਹੈ।"
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "ਡੈਮਨ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ।"
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "ਡੈਮਨ ਸ਼ੁਰੂਆਤੀ ਬਿਨਾਂ ਕਿਸੇ ਲੋਡ ਕੀਤੇ ਮੈਡਿਊਲ, ਕੰਮ ਕਰਨ ਤੋਂ ਰੋਕ ਰਿਹਾ ਹੈ।"
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "ਡੈਮਨ ਸ਼ੁਰੂਆਤੀ ਮੁਕੰਮਲ।"
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "ਡੈਮਨ ਬੰਦ ਕਰਨਾ ਸ਼ੁਰੂ ਹੋ ਗਿਆ।"
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "ਡੈਮਨ ਬੰਦ ਹੋ ਗਿਆ।"
 
@@ -657,78 +678,83 @@ msgstr "DEPRECATION WARNING: %s\n"
 msgid "Path: %s\n"
 msgstr "ਪਾਥ: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] ਗਲਤ ਲਾਗ ਟਾਰਗੇਟ '%s'।"
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] ਗਲਤੀ ਲਾਗ ਲੈਵਲ '%s'।"
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] ਅਢੁੱਕਵੀਂ ਰੀਸੈਂਪਲ ਢੰਗ '%s'।"
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] ਅਢੁੱਕਵੀਂ rlimit '%s'।"
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit ਨੂੰ ਇਸ ਪਲੇਟਫਾਰਮ ਤੇ ਸਹਿਯੋਗ ਨਹੀਂ ਹੈ।"
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] ਅਢੁੱਕਵਾਂ ਸੈਂਪਲ ਫਾਰਮੈਟ '%s'।"
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] ਅਢੁੱਕਵਾਂ ਸੈਂਪਲ ਰੇਟ '%s'।"
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] ਅਢੁੱਕਵਾਂ ਸੈਂਪਲ ਚੈਨਲ '%s'।"
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] ਅਢੁੱਕਵਾਂ ਚੈਨਲ ਮੈਪ '%s'।"
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] ਫਰੈਗਮੈਂਟਾਂ ਦਾ ਅਢੁੱਕਵਾਂ ਨੰਬਰ '%s'।"
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] ਅਢੁੱਕਵਾਂ ਫਰੈਗਮੈਂਟ ਅਕਾਰ '%s'।"
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] ਅਢੁੱਕਵਾਂ nice ਲੈਵਲ '%s'।"
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] ਅਢੁੱਕਵਾਂ ਸੈਂਪਲ ਰੇਟ '%s'।"
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "ਸੰਰਚਨਾ ਫਾਇਲ ਖੋਲ੍ਹਣ ਵਿੱਚ ਫੇਲ੍ਹ: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
 msgstr "ਦਿੱਤੇ ਡਿਫਾਲਟ ਚੈਨਲ ਮੈਪ ਦੀ ਦਿੱਤੇਤ ਚੈਨਲ ਗਿਣਤੀ ਨਾਲੋਂ ਇੱਕ ਵੱਖਰੀ ਚੈਨਲ ਗਿਣਤੀ ਹੈ।"
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### ਸੰਰਚਨਾ ਫਾਇਲ ਵਿੱਚੋਂ ਪੜਿਆ: %s ###\n"
@@ -774,8 +800,8 @@ msgid "Rear Right"
 msgstr "ਪਿੱਛੇ ਸੱਜਾ"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "ਘੱਟ ਫਰੀਕਿਊਂਸੀ ਇੱਮਟਰ"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1120,191 +1146,191 @@ msgstr "XOpenDisplay() ਫੇਲ੍ਹ ਹੈ"
 msgid "Failed to parse cookie data"
 msgstr "ਕੂਕੀ ਡਾਟਾ ਪਾਰਸ ਕਰਨ ਵਿੱਚ ਫੇਲ੍ਹ"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "ਸੰਰਚਨਾ ਫਾਇਲ '%s' ਨੂੰ ਖੋਲ੍ਹਣ ਵਿੱਚ ਫੇਲ੍ਹ: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "ਕੋਈ ਕੂਕੀ ਲੋਡ ਨਹੀਂ ਕੀਤੀ। ਇਸ ਤੋਂ ਬਿਨਾਂ ਕੁਨੈਕਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ।"
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "ਅਣਜਾਣੀ ਇਕਸਟੈਂਸ਼ਨ '%s' ਲਈ ਸੁਨੇਹਾ ਮਿਲਿਆ ਹੈ"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "ਸਟਰੀਮ ਡਰੇਨ ਫੇਲ੍ਹ ਹੋਇਆ: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "ਪਲੇਬੈਕ ਸਟਰੀਮ ਡਰੇਨ ਕੀਤੀ।"
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "ਸਰਵਰ ਨਾਲ ਕੁਨੈਕਸ਼ਨ ਡਰੇਨ ਹੋ ਰਿਹਾ ਹੈ।"
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() ਫੇਲ੍ਹ ਹੈ: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_write() ਫੇਲ੍ਹ ਹੈ: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() ਫੇਲ੍ਹ ਹੈ: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "ਸਟਰੀਮ ਸਫਲਤਾਪੂਰਕ ਬਣ ਗਈ ਹੈ।"
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() ਫੇਲ੍ਹ ਹੈ: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Buffer metrics: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "ਸਧਾਰਨ spec '%s', ਚੈਨਲ ਮੈਪ '%s' ਦੀ ਵਰਤੋਂ।"
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "%s ਜੰਤਰ ਨਾਲ ਕੁਨਕੈਟ ਕੀਤਾ (%u, %ssuspended)।"
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "ਸਟਰੀਮ ਗਲਤੀ: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "ਸਟਰੀਮ ਜੰਤਰ ਸਸਪੈਂਡ ਕੀਤਾ ਹੈ।%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "ਸਟਰੀਮ ਜੰਤਰ ਮੁੜ-ਪ੍ਰਾਪਤ ਕੀਤਾ।%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "ਸਟਰੀਮ ਅੰਡਰਰਨ।%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "ਸਟਰੀਮ ਓਵਰਰਨ।%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "ਸਟਰੀਮ ਸ਼ੁਰੂ ਕੀਤੀ। %s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "ਸਟਰੀਮ ਨੂੰ ਜੰਤਰ %s ਤੋਂ ਤਬਦੀਲ ਕੀਤਾ ਗਿਆ ਹੈ (%u, %ssuspended)।%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "ਨਹੀਂ "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "ਸਟਰੀਮ ਬਫਰ ਐਟਰੀਬਿਊਟ ਤਬਦੀਲ ਕੀਤੇ ਗਏ।%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "ਕੁਨੈਕਸ਼ਨ ਬਣ ਗਿਆ।%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() ਫੇਲ੍ਹ ਹੈ: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() ਫੇਲ੍ਹ ਹੈ: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() ਫੇਲ੍ਹ ਹੈ: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "ਕੁਨੈਕਸ਼ਨ ਫੇਲ: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "EOF ਮਿਲਿਆ।"
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() ਫੇਲ੍ਹ ਹੈ: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "ਸਿਗਨਲ ਮਿਲਿਆ, ਬੰਦ ਹੋ ਰਿਹਾ ਹੈ।"
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "ਵਕਫਾ ਪ੍ਰਾਪਤੀ ਫੇਲ ਹੋਈ: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "ਟਾਈਮ: %0.3f ਸਕਿੰਟ; ਵਕਫਾ: %0.0f usec।"
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() ਫੇਲ੍ਹ ਹੈ: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1356,10 +1382,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [options]\n"
@@ -1418,7 +1448,7 @@ msgstr ""
 "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1429,168 +1459,169 @@ msgstr ""
 "libpulse %s ਦੇ ਕੰਪਾਇਲ\n"
 "libpulse %s ਨਾਲ ਲਿੰਕ ਕੀਤਾ\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "ਅਢੁੱਕਵਾਂ ਚੈਨਲ ਮੈਪ '%s'"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "ਅਢੁੱਕਵਾਂ ਰੀਸੈਂਪਲ ਢੰਗ '%s'"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "ਅਢੁੱਕਵਾਂ ਚੈਨਲ ਮੈਪ '%s'"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "ਅਢੁੱਕਵਾਂ ਵਕਫਾ ਹਦਾਇਤ '%s'"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "ਅਢੁੱਕਵਾਂ ਪਰੋਸੈੱਸ ਟਾਈਮ ਹਦਾਇਤ '%s'"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "ਅਢੁੱਕਵਾਂ ਰੀਸੈਂਪਲ ਢੰਗ '%s'"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "ਅਣਜਾਣ ਫਾਇਲ ਫਾਰਮੈਟ %s"
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "ਅਢੁੱਕਵਾਂ ਸੈਂਪਲ ਹਦਾਇਤ"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "ਬਹੁਤ ਵੱਧ ਆਰਗੂਮੈਂਟ।"
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "ਸੈਂਪਲ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ: %s"
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "ਸਾਊਂਡ ਫਾਇਲ ਖੋਲ੍ਹਣ ਲਈ ਫੇਲ੍ਹ ਹੈ।"
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
 msgstr "ਇੱਕ %s ਸਟਰੀਮ ਨੂੰ ਸੈਂਪਲ ਹਦਾਇਤ '%s' ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ।"
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "ਸੈਂਪਲ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ: %s"
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "ਇੱਕ %s ਸਟਰੀਮ ਨੂੰ ਸੈਂਪਲ ਹਦਾਇਤ '%s' ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ।"
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "ਚੈਨਲ ਮੈਪ ਸੈਂਪਲ ਹਦਾਇਤ ਨਾਲ ਨਹੀਂ ਮਿਲਦਾ"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "ਇੱਕ %s ਸਟਰੀਮ ਨੂੰ ਸੈਂਪਲ ਹਦਾਇਤ '%s' ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ।"
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "ਇੱਕ %s ਸਟਰੀਮ ਨੂੰ ਸੈਂਪਲ ਹਦਾਇਤ '%s' ਅਤੇ ਚੈਨਲ ਮੈਪ '%s' ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ।"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "ਰਿਕਾਰਡਿੰਗ"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "ਪਲੇਅਬੈਕ"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() ਫੇਲ੍ਹ ਹੈ।"
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() ਫੇਲ੍ਹ ਹੈ।"
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() ਫੇਲ੍ਹ ਹੈ।"
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() ਫੇਲ੍ਹ ਹੈ: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_new() ਫੇਲ੍ਹ ਹੈ।"
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() ਫੇਲ੍ਹ ਹੈ।"
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "ਸਸਪੈਂਡ ਕਰਨ ਵਿੱਚ ਫੇਲ: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "ਮੁੜ-ਪ੍ਰਾਪਤੀ ਫੇਲ: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "ਚੇਤਾਵਨੀ: ਸਾਊਂਡ ਸਰਵਰ ਲੋਕਲ ਨਹੀਂ ਹੈ, ਸਸਪੈਂਡ ਨਹੀਂ ਹੋ ਰਿਹਾ।\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "ਕੁਨੈਕਸ਼ਨ ਫੇਲ: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "SIGINT ਮਿਲਿਆ, ਬੰਦ ਹੋ ਰਿਹਾ ਹੈ।\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "ਚੇਤਾਵਨੀ: ਚਲਾਈਡ ਪਰੋਸੈੱਸ ਨੂੰ ਸਿਗਨਲ %u ਵਲੋਂ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1609,7 +1640,7 @@ msgstr ""
 "to\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1620,50 +1651,61 @@ msgstr ""
 "libpulse %s ਨਾਲ ਕੰਪਾਇਲ\n"
 "libpulse %s ਨਾਲ ਲਿੰਕ\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() ਫੇਲ੍ਹ ਹੈ।\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() ਫੇਲ੍ਹ ਹੈ।\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() ਫੇਲ੍ਹ ਹੈ।\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "ਅੰਕੜੇ ਪ੍ਰਾਪਤੀ ਫੇਲ੍ਹ: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "ਹੁਣ ਵਰਤੋਂ ਵਿੱਚ ਹੈ: %u ਬਲਾਕ ਵਿੱਚ ਕੁੱਲ %s ਬਾਈਟ ਹਨ।\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "ਪੂਰੇ ਲਾਈਫਟਾਈਮ ਵਿੱਚ ਜਾਰੀ ਕੀਤਾ ਗਿਆ: %u ਬਲਾਕ ਵਿੱਚ ਕੁੱਲ %s ਬਾਈਟ ਹਨ।\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "ਸੈਂਪਲ ਕੈਸ਼ ਸਾਈਜ਼: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "ਸਰਵਰ ਜਾਣਕਾਰੀ ਪ੍ਰਾਪਤ ਕਰਨ ਵਿੱਚ ਫੇਲ ਹੋਇਆ: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1671,7 +1713,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "User name: %s\n"
 "Host Name: %s\n"
@@ -1683,12 +1725,12 @@ msgstr ""
 "Default Source: %s\n"
 "Cookie: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "ਸਿੰਕ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ੍ਹ: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1727,22 +1769,22 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tਪੋਰਟ:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tਸਰਗਰਮ ਪੋਰਟ: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "ਸਰੋਤ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1781,20 +1823,20 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "ਉਪਲੱਬਧ ਨਹੀਂ"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "ਮੋਡੀਊਲ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1811,12 +1853,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "ਕਲਾਇਟ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1831,12 +1873,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "ਕਾਰਡ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1853,22 +1895,22 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tਪਰੋਫਾਈਲ:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tਸਰਗਰਮ ਪਰੋਫਾਈਲ: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "ਇੰਪੁੱਟ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ੍ਹ: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1905,12 +1947,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "ਸਰੋਤ ਆਉਟਪੁੱਟ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1939,12 +1981,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "ਸੈਂਪਲ ਜਾਣਕਾਰੀ ਲੈਣ ਵਿੱਚ ਫੇਲ: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1975,26 +2017,80 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "ਫੇਲ੍ਹ: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "ਸੈਂਪਲ ਅੱਪਲੋਡ ਕਰਨ ਵਿੱਚ ਫੇਲ: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "ਫਾਇਲ ਦਾ ਸਮੇਂ ਤੋਂ ਪਹਿਲਾਂ ਅੰਤ"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "ਅਢੁੱਕਵਾਂ ਸਰਵਰ"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT ਮਿਲਿਆ, ਬੰਦ ਹੋ ਰਿਹਾ ਹੈ।"
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2017,6 +2113,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2056,7 +2153,7 @@ msgstr ""
 "  -n, --client-name=NAME                How to call this client on the "
 "server\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2067,103 +2164,104 @@ msgstr ""
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "ਲੋਡ ਕਰਨ ਲਈ ਸੈਂਪਲ ਫਾਇਲ ਦਿਓ"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "ਸਾਊਂਡ ਫਾਇਲ ਖੋਲ੍ਹਣ ਲਈ ਫੇਲ੍ਹ ਹੈ।"
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "ਇੱਕ %s ਸਟਰੀਮ ਨੂੰ ਸੈਂਪਲ ਹਦਾਇਤ '%s' ਨਾਲ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ।"
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "ਖੇਡਣ ਲਈ ਤੁਹਾਨੂੰ ਸੈਂਪਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "ਹਟਾਉਣ ਲਈ ਤੁਹਾਨੂੰ ਸੈਂਪਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "ਤੁਹਾਨੂੰ ਇੰਪੁੱਟ ਲਿਸਟ ਅਤੇ ਇੱਕ ਸਿੰਕ ਨੂੰ ਸਿੰਕ ਕਰਨਾ ਪਵੇਗਾ"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਸਰੋਤ ਆਉਟਪੁੱਟ ਲਿਸਟ ਅਤੇ ਇੱਕ ਸਰੋਤ ਦੇਣਾ ਪਵੇਗਾ"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਮੋਡੀਊਲ ਨਾਂ ਅਤੇ ਆਰਗੂਮੈਂਟ ਦੇਣਾ ਪਵੇਗਾ।"
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਮੈਡੀਊਲ ਲਿਸਟ ਦੇਣੀ ਪਵੇਗੀ"
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
 msgstr "ਤੁਸੀਂ ਇੱਕ ਤੋਂ ਵੱਧ ਸਿੰਕ ਨਹੀਂ ਦੇ ਸਕਦੇ। ਤੁਹਾਨੂੰ ਇੱਕ ਬੁਲੀਅਨ ਮੁੱਲ ਦੇਣਾ ਪਵੇਗਾ।"
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
 msgstr "ਤੁਸੀਂ ਇੱਕ ਤੋਂ ਵੱਧ ਸਰੋਤ ਨਹੀਂ ਦੇ ਸਕਦੇ। ਤੁਹਾਨੂੰ ਬੁਲੀਅਨ ਮੁੱਲ ਦੇਣਾ ਪਵੇਗਾ।"
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਕਾਰਡ ਨਾਂ/ਲਿਸਟ ਅਤੇ ਪਰੋਫਾਈਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਕਾਰਡ ਨਾਂ/ਲਿਸਟ ਅਤੇ ਪਰੋਫਾਈਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਕਾਰਡ ਨਾਂ/ਲਿਸਟ ਅਤੇ ਪਰੋਫਾਈਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਕਾਰਡ ਨਾਂ/ਲਿਸਟ ਅਤੇ ਪਰੋਫਾਈਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "ਅਢੁੱਕਵਾਂ ਸੈਂਪਲ ਹਦਾਇਤ"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਕਾਰਡ ਨਾਂ/ਲਿਸਟ ਅਤੇ ਪਰੋਫਾਈਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "ਤੁਹਾਨੂੰ ਇੰਪੁੱਟ ਲਿਸਟ ਅਤੇ ਇੱਕ ਸਿੰਕ ਨੂੰ ਸਿੰਕ ਕਰਨਾ ਪਵੇਗਾ"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "ਅਢੁੱਕਵੀਂ ਸਿੰਕ ਇੰਪੁੱਟ ਸੂਚੀ"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਕਾਰਡ ਨਾਂ/ਲਿਸਟ ਅਤੇ ਪਰੋਫਾਈਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "ਤੁਹਾਨੂੰ ਇੱਕ ਕਾਰਡ ਨਾਂ/ਲਿਸਟ ਅਤੇ ਪਰੋਫਾਈਲ ਨਾਂ ਦੇਣਾ ਪਵੇਗਾ"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "ਤੁਹਾਨੂੰ ਇੰਪੁੱਟ ਲਿਸਟ ਅਤੇ ਇੱਕ ਸਿੰਕ ਨੂੰ ਸਿੰਕ ਕਰਨਾ ਪਵੇਗਾ"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "ਅਢੁੱਕਵਾਂ ਸੈਂਪਲ ਹਦਾਇਤ"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "ਕੋਈ ਯੋਗ ਕਮਾਂਡ ਨਹੀਂ ਦਿੱਤੀ।"
 
@@ -2246,44 +2344,44 @@ msgstr "ਕੂਕੀ ਡਾਟਾ ਲੋਡ ਕਰਨ ਵਿੱਚ ਫੇਲ\n"
 msgid "Not yet implemented.\n"
 msgstr "ਹਾਲੇ ਬਣਾਇਆ ਨਹੀਂ।\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr "ਕੋਈ ਪਲਸ-ਆਡੀਓ ਡੈਮਨ ਨਹੀਂ ਚੱਲ ਰਿਹਾ, ਜਾਂ ਸ਼ੈਸ਼ਨ ਡੈਮਨ ਤੌਰ ਤੇ ਨਹੀਂ ਚੱਲ ਰਿਹਾ।"
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "ਪਲਸਆਡੀਓ ਡੈਮਨ ਬੰਦ ਕਰਨ ਵਿੱਚ ਫੇਲ।"
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "ਡੈਮਨ ਜਵਾਬ ਨਹੀਂ ਦੇ ਰਹੀ।"
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "autospawn ਲਾਕ ਵਰਤ ਨਹੀਂ ਸਕਦਾ।"
 
@@ -2322,38 +2420,42 @@ msgstr ""
 "returned 0 or another value < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "ਬੰਦ"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "ਹਾਈ ਫਡੈਲਿਟੀ ਪਲੇਅਬੈਕ (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "ਹਾਈ ਫਡੈਲਿਟੀ ਪਲੇਅਬੈਕ (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "ਟੈਲੀਫੋਨੀ ਡੁਪਲੈਕਸ (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "ਪਲਸਆਡੀਓ ਸਾਊਂਡ ਡਰਾਇਵਰ"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "ਆਊਟਪੁੱਟ ਜੰਤਰ"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "ਇੰਪੁੱਟ ਜੰਤਰ"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "@HOSTNAME@ ਉੱਪਰ ਆਡੀਓ"
 
@@ -2417,131 +2519,159 @@ msgstr "ਐਂਪਲੀਫਾਇਰ"
 msgid "No Amplifier"
 msgstr "ਕੋਈ ਐਂਪਲੀਫਾਇਰ ਨਹੀਂ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "ਬੂਸਟ"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "ਕੋਈ ਬੂਸਟ ਨਹੀਂ"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "ਐਨਾਲਾਗ ਹੈੱਡਫੋਨ"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "ਐਨਾਲਾਗ ਇੰਪੁੱਟ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "ਐਨਾਲਾਗ ਮਾਈਕਰੋਫੋਨ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "ਐਨਾਲਾਗ ਲਾਈਨ-ਇਨ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "ਐਨਾਲਾਗ ਰੇਡੀਓ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "ਐਨਾਲਾਗ ਵੀਡੀਓ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "ਐਨਾਲਾਗ ਆਉਟਪੁੱਟ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "ਐਨਾਲਾਗ ਹੈੱਡਫੋਨ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "ਐਨਾਲਾਗ ਆਊਟਪੁੱਟ (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "ਐਨਾਲਾਗ ਮੋਨੋ ਆਊਟਪੁੱਟ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981, c-format
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "ਐਨਾਲਾਗ ਸਟੀਰੀਓ"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
+#, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404, c-format
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
+#, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "ਐਨਾਲਾਗ ਮੋਨੋ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "ਐਨਾਲਾਗ ਸਟੀਰੀਓ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "ਐਨਾਲਾਗ ਸਰਾਊਂਡ 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "ਡਿਜ਼ੀਟਲ ਸਟੀਰੀਓ (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "ਡਿਜ਼ੀਟਲ ਸਰਾਊਂਡ 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "ਡਿਜ਼ੀਟਲ ਸਰਾਊਂਡ 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "ਡਿਜ਼ੀਟਲ ਸਰਾਊਂਡ 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "ਡਿਜ਼ੀਟਲ ਸਟੀਰੀਓ (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "ਐਨਾਲਾਗ ਮੋਨੋ ਡੁਪਲੈਕਸ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "ਐਨਾਲਾਗ ਸਟੀਰੀਓ ਡੁਪਲੈਕਸ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "ਡਿਜ਼ੀਟਲ ਸਟੀਰੀਓ ਡੁਪਲੈਕਸ (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "ਘੱਟ ਫਰੀਕਿਊਂਸੀ ਇੱਮਟਰ"
diff --git a/po/pl.po b/po/pl.po
index 5d7f3a0..b241a1c 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-09-30 09:44+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-09-30 17:04+0200\n"
 "Last-Translator: Piotr DrÄ…g <piotrdrag at gmail.com>\n"
 "Language-Team: Polish <fedora-trans-pl at redhat.com>\n"
@@ -13,12 +13,12 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -30,7 +30,7 @@ msgstr ""
 "Prawdopodobnie jest to błąd sterownika ALSA \"%s\". Proszę zgłosić ten "
 "problem programistom ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -42,7 +42,7 @@ msgstr ""
 "Prawdopodobnie jest to błąd sterownika ALSA \"%s\". Proszę zgłosić ten "
 "problem programistom ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -90,11 +90,11 @@ msgstr "Zegarowy PUSTY odpływ"
 msgid "Null Output"
 msgstr "Puste wyjście"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Wewnętrzny dźwięk"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Modem"
 
@@ -111,92 +111,98 @@ msgstr "Przydzielenie nowego programu wczytującego dl nie powiodło się."
 msgid "Failed to add bind-now-loader."
 msgstr "Dodanie bind-now-loader nie powiodło się."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Otrzymano sygnał %s."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Kończenie pracy."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Odnalezienie użytkownika \"%s\" nie powiodło się."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Odnalezienie grupy \"%s\" nie powiodło się."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Odnaleziono użytkownika \"%s\" (UID %lu) i grupę \"%s\" (GID %lu)."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "GID użytkownika \"%s\" i grupy \"%s\" nie zgadzają się."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "Katalog domowy użytkownika \"%s\" nie jest \"%s\", ignorowanie."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Utworzenie \"%s\" nie powiodło się: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "Zmiana listy grup nie powiodła się: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "Zmiana GID nie powiodła się: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "Zmiana UID nie powiodła się: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "Pomyślnie porzucono uprawnienia roota."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "Tryb systemowy nie jest obsługiwany na tej platformie."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) nie powiodło się: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "Przetworzenie wiersza poleceń nie powiodła się."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "Demon nie jest uruchomiony"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Demon jest uruchomiony jako PID %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Zniszczenie demona nie powiodło się: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -204,160 +210,175 @@ msgstr ""
 "Ten program nie powinien być uruchomiany jako root (chyba, że podano --"
 "system)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Wymagane sÄ… uprawnienia roota."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start nie jest obsługiwane przy uruchamianiu systemowym."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 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:586
+#: ../src/daemon/main.c:686
 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:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "Uruchamianie w trybie systemowym, wymuszanie wyłączenia trybu SHM."
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 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:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "Uzyskanie standardowego wejścia/wyjścia nie powiodło się."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "potok nie powiódł się: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() nie powiodło się: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() nie powiodło się: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "Uruchomienie demona nie powiodło się."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "Pomyślnie uruchomiono demona."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() nie powiodło się: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "To jest PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Komputer kompilacji: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "CFLAGS kompilacji: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "Uruchamianie na komputerze: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "Odnaleziono %u procesorów."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "Rozmiar strony to %lu bajtów"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Skompilowano z obsługą Valgrind: tak"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Skompilowano z obsługą Valgrind: nie"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Uruchamianie w trybie Valgrind: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "Uruchamianie na komputerze: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Budowanie optymalizowane: tak"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Budowanie optymalizowane: nie"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "Podano NDEBUG, wszystkie asercje zostały wyłączone."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "Podano FASTPATH, tylko szybkie asercje ścieżek zostały wyłączone."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "Wszystkie asercje są włączone."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "Uzyskanie identyfikatora komputera nie powiodło się"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "Identyfikator komputera to %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "Identyfikator sesji to %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Używanie katalogu wykonywania %s."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "Używanie katalogu stanu %s."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "Używanie katalogu modułów %s."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Uruchamianie w trybie systemowym: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -373,15 +394,15 @@ msgstr ""
 "Proszę przeczytać http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode, "
 "gdzie wyjaśniono, dlaczego tryb systemowy jest zwykle złym pomysłem."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() nie powiodło się."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Świeże zegary o wysokiej rozdzielczości! Smacznego!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -389,27 +410,27 @@ msgstr ""
 "Koleś, twoje jądro śmierdzi! Szef kuchni poleca dzisiaj Linuksa z włączonymi "
 "zegarami o wysokiej rozdzielczości!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() nie powiodło się."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "Zainicjowanie demona nie powiodło się."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "Uruchamianie demona bez żadnych wczytanych modułów, odmawianie pracy."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "Ukończono uruchamianie demona."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "Zainicjowano wyłączenie demona."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "Demon został zniszczony."
 
@@ -675,72 +696,77 @@ msgstr "OSTRZEŻENIE O PRZESTARZAŁOŚCI: %s\n"
 msgid "Path: %s\n"
 msgstr "Ścieżka: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Nieprawidłowy dziennik docelowy \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Nieprawidłowy poziom dziennika \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Nieprawidłowa metoda resamplingu \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] Nieprawidłowy rlimit \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit nie jest obsługiwany na tej platformie."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Nieprawidłowy format próbki \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Nieprawidłowa częstotliwość próbki \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Nieprawidłowe kanały próbki \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Nieprawidłowa mapa kanałów \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Nieprawidłowa liczba fragmentów \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Nieprawidłowy rozmiar fragmentu \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Nieprawidłowy poziom nice \"%s\"."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Nieprawidłowa częstotliwość próbki \"%s\"."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Otwarcie pliku konfiguracji nie powiodło się: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -748,7 +774,7 @@ msgstr ""
 "Podana domyślna mapa kanałów ma inną liczbę kanałów niż podana domyślna "
 "liczba kanałów."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Odczytano z pliku konfiguracji: %s ###\n"
@@ -794,8 +820,8 @@ msgid "Rear Right"
 msgstr "Tylny prawy"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Subwoofer"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1140,191 +1166,191 @@ msgstr "XOpenDisplay() nie powiodło się"
 msgid "Failed to parse cookie data"
 msgstr "Przetworzenie danych ciasteczka nie powiodło się"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Otwarcie pliku konfiguracji \"%s\" nie powiodło się: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Nie wczytano ciasteczka. Próba połączenia się bez niego."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "Otrzymano komunikat z nieznanego powodu \"%s\""
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Opróżnienie strumienia nie powiodło się: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "Opróżniono strumień odtwarzania."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "Opróżnianie połączenia z serwerem."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() nie powiodło się: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() nie powiodło się: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() nie powiodło się: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Pomyślnie utworzono strumień."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() nie powiodło się: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Metryka bufora: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Metryka bufora: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "Używanie przykładowej specyfikacji \"%s\", mapa kanałów \"%s\"."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Połączono się z urządzeniem %s (%u, %swstrzymane)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "BÅ‚Ä…d strumienia: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Wstrzymano urzÄ…dzenie strumienia.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "Wznowiono urzÄ…dzenie strumienia.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "Niedopełniono strumień.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "Przepełniono strumień.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "Utworzono strumień.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Strumień został przeniesiony do urządzenia %s (%u, %swstrzymane).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "nie "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Zmieniono atrybuty bufora strumienia.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "Ustanowiono połączenie.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() nie powiodło się: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() nie powiodło się: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() nie powiodło się: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Połączenie nie powiodło się: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "Otrzymano EOF."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() nie powiodło się: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "Otrzymano sygnał, kończenie pracy."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "Uzyskanie opóźnienia nie powiodło się: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Czas: %0.3f sekundy; opóźnienie: %0.0f usekundy."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() nie powiodło się: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1376,10 +1402,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [opcje]\n"
@@ -1438,7 +1468,7 @@ msgstr ""
 "      --list-file-formats               Wyświetla listę dostępnych formatów\n"
 "                                        plików.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1449,68 +1479,68 @@ msgstr ""
 "Skompilowane za pomocÄ… libpulse %s\n"
 "Skonsolidowane za pomocÄ… libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Nieprawidłowa nazwa klienta \"%s\""
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Nieprawidłowa nazwa strumienia \"%s\""
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Nieprawidłowa mapa kanałów \"%s\""
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Nieprawidłowe określenie opóźnienia \"%s\""
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Nieprawidłowe określenie czasu procesu \"%s\""
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Nieprawidłowa własność \"%s\""
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Nieznany format pliku %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Nieprawidłowe określenie próbki"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Za dużo parametrów."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "Utworzenie określenia próbki dla pliku nie powiodło się."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "Otwarcie pliku dźwiękowego nie powiodło się."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
@@ -1518,23 +1548,23 @@ msgstr ""
 "Ostrzeżenie: podane określenie próbki zostanie zastąpione przez określenie z "
 "pliku."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "Ustalenie określenia próbki z pliku nie powiodło się."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "Ostrzeżenie: ustalenie mapy kanałów z pliku nie powiodło się."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "Mapa kanałów nie zgadza się z określeniem próbki"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "Ostrzeżenie: zapisanie mapy kanałów do pliku nie powiodło się."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
 msgid ""
 "Opening a %s stream with sample specification '%s' and channel map '%s'."
@@ -1542,81 +1572,81 @@ msgstr ""
 "Otwieranie strumienia %s za pomocą określenie próbki \"%s\" i mapy kanałów "
 "\"%s\"."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "nagrywanie"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "odtwarzanie"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() nie powiodło się."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() nie powiodło się."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() nie powiodło się."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() nie powiodło się: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() nie powiodło się."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() nie powiodło się."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "Wstrzymanie nie powiodło się: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "Wznowienie nie powiodło się: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 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:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Połączenie nie powiodło się: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "Otrzymano SIGINT, kończenie pracy.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "OSTRZEŻENIE: proces potomny został zniszczony przez sygnał %u\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1634,7 +1664,7 @@ msgstr ""
 "  -s, --server=SERWER                   Nazwa serwera do połączenia się\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1645,52 +1675,63 @@ msgstr ""
 "Skompilowane za pomocÄ… libpulse %s\n"
 "Skonsolidowane za pomocÄ… libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() nie powiodło się.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() nie powiodło się.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() nie powiodło się.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Uzyskanie statystyk nie powiodło się: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "Obecnie używane: %u bloków zawierających razem %s bajtów.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr ""
 "Przydzielono podczas całego czasu uruchomienia: %u bloków zawierających "
 "razem %s bajtów.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Rozmiar pamięci podręcznej próbek: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "Uzyskanie informacji o serwerze nie powiodło się: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1698,7 +1739,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Nazwa użytkownika: %s\n"
 "Nazwa komputera: %s\n"
@@ -1710,12 +1751,12 @@ msgstr ""
 "Domyślne źródło: %s\n"
 "Ciasteczko: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Uzyskanie informacji o odpływie nie powiodło się: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1754,22 +1795,22 @@ msgstr ""
 "\tWłaściwości:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tPorty:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tAktywny port: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "Uzyskanie informacji o źródle nie powiodło się: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1808,20 +1849,20 @@ msgstr ""
 "\tWłaściwości:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "nie dotyczy"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "Uzyskanie informacji o module nie powiodło się: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1838,12 +1879,12 @@ msgstr ""
 "\tWłaściwości:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "Uzyskanie informacji o kliencie nie powiodło się: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1858,12 +1899,12 @@ msgstr ""
 "\tWłaściwości:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "Uzyskanie informacji o karcie nie powiodło się: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1880,22 +1921,22 @@ msgstr ""
 "\tWłaściwości:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tProfile:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tAktywny profil: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Uzyskanie informacji o wejściu odpływu nie powiodło się: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1932,12 +1973,12 @@ msgstr ""
 "\tWłaściwości:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "Uzyskanie informacji o wyjściu źródła nie powiodło się: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1966,12 +2007,12 @@ msgstr ""
 "\tWłaściwości:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Uzyskanie informacji o próbce nie powiodło się: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -2002,26 +2043,80 @@ msgstr ""
 "\tWłaściwości:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Niepowodzenie: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Wysłanie próbki nie powiodło się: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "Przedwczesny koniec pliku"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Nieprawidłowy serwer"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "Otrzymano SIGINT, kończenie pracy."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2044,6 +2139,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2082,7 +2178,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:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2093,106 +2189,106 @@ msgstr ""
 "Skompilowane za pomocÄ… libpulse %s\n"
 "Skonsolidowane za pomocÄ… libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Proszę podać plik próbki do wczytania"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Otwarcie pliku dźwiękowego nie powiodło się."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "Ostrzeżenie: ustalenie określenia próbki z pliku nie powiodło się."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "Należy podać nazwę próbki do odtworzenia"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "Należy podać nazwę próbki do usunięcia"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "Należy podać indeks odpływu wejścia i odpływ"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "Należy podać indeks źródła wyjścia i źródło"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "Należy podać nazwę modułu i parametry."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "Należy podać indeks modułu"
 
-#: ../src/utils/pactl.c:1090
+#: ../src/utils/pactl.c:1183
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 "Nie można podać więcej niż jednego odpływu. Należy podać wartość logiczną."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
 msgstr ""
 "Nie można podać więcej niż jednego źródła. Należy podać wartość logiczną."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "Należy podać nazwę karty/indeks i nazwę profilu"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "Należy podać nazwę odpływu/indeks i nazwę portu"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "Należy podać nazwę źródła/indeks i nazwę portu"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "Należy podać nazwę odpływu/indeks i głośność"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "Nieprawidłowe określenie głośności"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "Należy podać nazwę źródła/indeks i głośność"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "Należy podać indeks odpływu wejścia i głośność"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "Nieprawidłowy indeks wejścia odpływu"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "Należy podać nazwę odpływu/indeks i zmienną logiczną wyciszenia"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "Należy podać nazwę źródła/indeks i zmienną logiczną wyciszenia"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "Należy podać indeks odpływu wejścia i zmienną logiczną wyciszenia"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "Nieprawidłowe określenie indeksu wejścia odpływu"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "Nie podano prawidłowego polecenia."
 
@@ -2275,46 +2371,46 @@ msgstr "Wczytanie danych ciasteczka nie powiodło się\n"
 msgid "Not yet implemented.\n"
 msgstr "Niezaimplementowane.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
 "Demon PulseAudio nie jest uruchomiony, lub nie jest uruchomiony jako demon "
 "sesji."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "gniazdo(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "Zniszczenie demona PulseAudio nie powiodło się."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "Demon nie odpowiada."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "Nie można uzyskać dostępu do blokady automatycznego wznawiania."
 
@@ -2353,38 +2449,42 @@ msgstr ""
 "snd_pcm_avail() zwróciło zero lub inną wartość < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Wyłącz"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "Odtwarzanie o wysokiej dokładności (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "Przechwytywanie o wysokiej dokładności (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Duplex telefoniczny (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "Serwer dźwięku PulseAudio"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "Urządzenia wyjściowe"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "Urządzenia wejściowe"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "Dźwięk na @HOSTNAME@"
 
@@ -2448,132 +2548,159 @@ msgstr "Amplituner"
 msgid "No Amplifier"
 msgstr "Brak amplitunera"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "Podbicie"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "Brak podbicia"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "SÅ‚uchawki analogowe"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "Wejście analogowe"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "Mikrofon analogowy"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "Analogowe wejście liniowe"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "Radio analogowe"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "Wideo analogowe"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "Wyjście analogowe"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "SÅ‚uchawki analogowe"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "Wyjście analogowe (subwoofer)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "Analogowe wyjście mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Analogowe stereo"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s/%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Analogowe mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Analogowe stereo"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "Analogowe surround 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "Analogowe surround 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "Analogowe surround 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Analogowe surround 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Analogowe surround 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Analogowe surround 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Analogowe surround 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "Analogowe surround 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "Analogowe surround 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "Analogowe surround 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Analogowe surround 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Cyfrowe stereo (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Cyfrowe surround 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Cyfrowe surround 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Cyfrowe surround 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Cyfrowe stereo (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "Analogowy dupleks mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "Analogowy dupleks stereo"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Cyfrowy dupleks stereo (IEC958)"
+
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Subwoofer"
diff --git a/po/pt.po b/po/pt.po
index bca8d93..b24abfa 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-09-29 23:47+0200\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: \n"
 "Last-Translator: Rui Gouveia <rui.gouveia at globaltek.pt>\n"
 "Language-Team: pt <fedora-trans-pt at redhat.com>\n"
@@ -12,12 +12,12 @@ msgstr ""
 "X-Poedit-Language: Portuguese\n"
 "X-Poedit-Country: PORTUGAL\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -30,7 +30,7 @@ msgstr ""
 "Provavelmente isto é um erro no driver ALSA '%s'. Por favor, reporte este "
 "problema aos programadores do ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -43,7 +43,7 @@ msgstr ""
 "Provavelmente isto é um erro no driver ALSA '%s'. Por favor, reporte este "
 "problema aos programadores do ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -91,11 +91,11 @@ msgstr ""
 msgid "Null Output"
 msgstr "Saída nula"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Áudio Interno"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Modem"
 
@@ -111,92 +111,98 @@ msgstr "Não foi possível alocar o novo carregador \"dl\"."
 msgid "Failed to add bind-now-loader."
 msgstr "Não foi possível adicionar \"bind-now-loader\"."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Foi obtido o sinal %s."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "A sair."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Falha ao procurar o utilizador '%s'."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Falha ao procurar o grupo '%s'."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Foi encontrado utilizador '%s' (UID %lu) e grupo '%s' (GID %lu)."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "GID do utilizador '%s' e do grupo '%s' não coincidem."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "Directório pessoal do utilizador '%s' não é '%s'. A ignorar."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Falha ao criar o '%s': %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "Falhou a alteração da lista de grupos: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "Não foi possível mudar o GID: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "Não foi possível mudar o UID: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "Privilégios de root cedidos com sucesso."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "Modo de sistema não suportado nesta plataforma."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) falhou: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "Não foi possível processar linha de comando."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "Serviço não está a executar"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Serviço a executar como PID %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Tentativa de matar serviço falhou: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -204,159 +210,174 @@ msgstr ""
 "Este programa não pretende ser executado como root (a não ser que a opção --"
 "system seja especificada)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "São necessários privilégios de root."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start não é suportado para instâncias do sistema."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "A executar em modo de sistema, mas --disallow-exit não está definido!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 "A executar em modo de sistema, mas --disallow-module-loading não está "
 "definido!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "A executar em modo de sistema, a forçar a desactivação do modo SHM!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 "A executar em modo de sistema, a forçar a desactivação da saída por "
 "inactividade!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "Não foi possível adquirir o stdio."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "pipe falhou: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() falhou: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() falhou: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "Arranque do serviço falhou."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "Arranque do serviço sucedeu."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() falhou: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Isto é PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Máquina de compilação: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "CFLAGS utilizadas na compilação: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "A executar na máquina: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "Foram encontrados %u CPUs."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "Tamanho da página é %lu bytes"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Compilado com suporte para Valgrind: sim"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Compilado com suporte para Valgrind: não"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "A executar em modo \"valgrind\": %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "A executar na máquina: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Optimizado: sim"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Compilação optimizada: não"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG definido, todas as declarações desactivadas."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH definido, apenas as declarações \"fast path\" desactivadas."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "Todas as declarações desactivadas."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "A tentativa de ler o ID da máquina falhou"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "O ID da máquina é %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "O ID da sessão é %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Execução a utilizar o directório %s"
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "A manter o estado no directório %s."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "A utilizar o directório de módulos %s"
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Execução em modo de sistema: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -372,15 +393,15 @@ msgstr ""
 "Por favor leia http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode para uma "
 "explicação de como o modo de sistema é usualmente uma má ideia."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() falhou."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Timer \"frescos\" de alta resolução disponíveis. Bom apetite!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -388,27 +409,27 @@ msgstr ""
 "Oh pá, o teu kernel não presta! O prato do dia recomendado é Linux com "
 "timers de alta resolução activos!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() falhou."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "Falha ao inicializar serviço."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "Serviço arrancou sem módulos carregados. A recusar trabalhar."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "Arranque do serviço completo."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "Encerramento do serviço iniciado."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "Serviço terminado."
 
@@ -678,72 +699,77 @@ msgstr "AVISO DE DESCONTINUIDADE: %s\n"
 msgid "Path: %s\n"
 msgstr "Caminho: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] ficheiro registo de destino inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Nível do ficheiro de registo inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Método de reamostragem inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] rlimit inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit não é suportado nesta plataforma."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Formato da amostra inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Taxa de amostragem '%s' inválida."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Canais de amostragem inválidos '%s'."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Mapa de canais inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Número inválido de fragmentos '%s'."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Tamanho do fragmento inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] nível nice inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Taxa de amostragem '%s' inválida."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Falha ao abrir ficheiro de configuração: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -751,7 +777,7 @@ msgstr ""
 "O mapa de canais especificado tem um número de canais diferente do número de "
 "canais definido por omissão."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Ler configuração a partir do ficheiro: %s ###\n"
@@ -797,8 +823,8 @@ msgid "Rear Right"
 msgstr "Traseira Direita"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Emissor de Baixa Frequência"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1143,191 +1169,191 @@ msgstr "XOpenDisplay() falhou"
 msgid "Failed to parse cookie data"
 msgstr "Não foi possível processar dados da cookie"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Falha ao abrir ficheiro de configuração '%s': %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Nenhuma cookie carregada. A tentar ligar sem cookie."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "Recebida mensagem para extensão desconhecida '%s'"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Falha ao esvaziar fluxo: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "Fluxo de leitura drenado."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "A drenar ligação ao servidor."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() falhou: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_write() falhou: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() falhou: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Fluxo criado com sucesso."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() falhou: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Métricas do Buffer: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Métricas do Buffer: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "Utilizando especificação da amostra '%s', mapa de canal '%s'."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Ligado ao dispositivo %s (%u, %ssuspended)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "Erro de fluxo: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Dispositivo de fluxo suspenso.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "Dispositivo de fluxo retomado.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "Fluxo com falta de dados.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "Fluxo com excesso de dados.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "Fluxo iniciado.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Fluxo movido para o dispositivo %s (%u, %ssuspended).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "negação"
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Atributos do buffer de fluxo alterados.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "Ligação estabelecida.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() falhou: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() falhou: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() falhou: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Ligação falhou: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "Obtive EOF."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() falhou: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "Recebido sinal, a sair."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "Falhou a obtenção da cadência: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Tempo: %0.3f sec; Cadência: %0.0f usec."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() falhou: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1379,10 +1405,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [opções]\n"
@@ -1440,7 +1470,7 @@ msgstr ""
 "      --list-file-formats               Lista o formato de ficheiros "
 "disponíveis.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1451,68 +1481,68 @@ msgstr ""
 "Compilado com libpulse %s\n"
 "Ligado com libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Nome de cliente inválido '%s'"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Nome de fluxo inválido '%s'"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Mapa de canais inválido '%s'"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Especificação da cadência inválida '%s'"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Especificação de tempo de processamento inválido '%s'"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Propriedade inválida '%s'"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Formato de ficheiro desconhecido %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Especificação de amostra inválida"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Demasiados argumentos."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "Falha ao gerar especificação de amostra para o ficheiro."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "Falha ao abrir ficheiro de audio"
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
@@ -1520,103 +1550,103 @@ msgstr ""
 "Aviso: a especificação da amostra será sobrescrita com a especificação do "
 "ficheiro."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "Falha ao determinar a especificação da amostra a partir do ficheiro."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "Aviso: Falha a determinar o mapa de canal do ficheiro."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "Mapa de canais não corresponde à especificação da amostra"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "Aviso: falha na escrita do mapa de canais no ficheiro."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
 msgid ""
 "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
 "Abrindo um %s fluxo com especificação da amostra '%s' e mapa de canais '%s'."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "a gravar"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "reprodução"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() falhou."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() falhou."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() falhou."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() falhou: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() falhou."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() falhou."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "Falhou ao suspender: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "Falhou ao restaurar: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "Atenção: Servidor de Som não local, suspender ignorado.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Ligação falhou: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "Obtido SIGINT, a sair.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "Atenção: Processo filho terminado por sinal %u\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1634,7 +1664,7 @@ msgstr ""
 "  -s, --server=SERVER                   Nome do servidor ao qual ligar\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1645,51 +1675,62 @@ msgstr ""
 "Compilado com libpulse %s\n"
 "Ligado com libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() falhou.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() falhou.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() falhou.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Falhou a obtenção de estatísticas: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "Correntemente em uso: %u blocos contendo %s bytes no total.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr ""
 "Alocado durante todo o tempo de vida: %u blocos contendo %s bytes no total.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Tamanho cache da amostra: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "Falha ao obter informações do servidor: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1697,7 +1738,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Nome de utilizador: %s\n"
 "Nome da máquina: %s\n"
@@ -1709,12 +1750,12 @@ msgstr ""
 "Fonte por omissão: %s\n"
 "Cookie: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Falha ao obter informações do depósito: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1753,22 +1794,22 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tPorto:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tPorto Activo: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "Falha ao obter informações da fonte: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1807,20 +1848,20 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n/d"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "Falha ao obter informações do módulo: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1837,12 +1878,12 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "Falha ao obter informações do cliente: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1857,12 +1898,12 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "Falha ao obter informações da carta: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1879,22 +1920,22 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tPrefis:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tPerfil Activo: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Falha ao obter informação de entrada do depósito: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1931,12 +1972,12 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "Falha ao obter informações da fonte: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1965,12 +2006,12 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Falha ao obter informações da amostra: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -2001,26 +2042,80 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Falha: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Falha ao enviar amostra: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "Fim prematuro do ficheiro"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Servidor Inválido"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "Obtido SIGINT, a sair."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2043,6 +2138,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2081,7 +2177,7 @@ msgstr ""
 "  -n, --client-name=NAME                Como chamar este cliente no "
 "servidor\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2092,50 +2188,50 @@ msgstr ""
 "Compilado com libpulse %s\n"
 "Linkado com libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Por favor, especifique um ficheiro de amostra para carregar"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Falha ao abrir ficheiro de som."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "Aviso: Falha ao determinar a especificação da amostra do ficheiro."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "Tem de especificar um nome de amostra para reproduzir"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "Tem de especificar um nome de amostra para remover"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "Tem de especificar um índice de entrada de depósito e um depósito"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "Tem de especificar um índice de saída de fonte e uma fonte"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "Tem de especificar um nome de módulo e argumentos."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "Tem de especificar um índice de módulo"
 
-#: ../src/utils/pactl.c:1090
+#: ../src/utils/pactl.c:1183
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 "Não pode especificar mais do que um depósito.  Tem de especificar um valor "
 "booleano."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
@@ -2143,57 +2239,57 @@ msgstr ""
 "Não pode especificar mais do que uma fonte.  Tem de especificar um valor "
 "booleano."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "Tem de especificar um nome/índice de placa e um nome de perfil"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "Tem de especificar um nome/índice de depósito e nome de um porto"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "Tem de especificar um nome/índice de fonte e nome de um porto"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "Tem de especificar um nome/índice de depósito e um volume"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "Especificação de volume inválida"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "Tem de especificar um nome/índice de fonte e um volume"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "Tem de especificar um índice de entrada de depósito e um volume"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "Índice de depósito de entrada inválido"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "Tem de especificar um nome/índice de depósito e um booleano mudo"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "Tem de especificar um nome/índice de fonte e um booleano mudo"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "Tem de especificar um índice de entrada de depósito e um booleano mudo"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "Índice de entrada de depósito inválida"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "O comando especificado é inválido."
 
@@ -2278,45 +2374,45 @@ msgstr "Não foi possível carregar os dados da cookie\n"
 msgid "Not yet implemented.\n"
 msgstr "Ainda não implementado.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
 "Não existe um daemon PulseAudio a correr, ou não corre como daemon de sessão."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "Não foi possível terminar o serviço PulseAudio."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "Serviço não responde."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "Impossível aceder ao lock \"autospawn\"."
 
@@ -2355,39 +2451,43 @@ msgstr ""
 "snd_pcm_avail() retornou 0 ou outro valor < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Desligado"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "Reprodução Alta Fidelidade (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "Captação de Alta Fidelidade (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Telefonia Duplex (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "Servidor de Som PulseAudio"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr ""
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 #, fuzzy
 msgid "Input Devices"
 msgstr "Entrada %s"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr ""
 
@@ -2453,154 +2553,179 @@ msgstr ""
 msgid "No Amplifier"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+msgid "Bass Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+msgid "No Bass Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "Mono Analógico"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 #, fuzzy
 msgid "Analog Input"
 msgstr "Mono Analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 #, fuzzy
 msgid "Analog Microphone"
 msgstr "Mono Analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 #, fuzzy
 msgid "Analog Line-In"
 msgstr "Mono Analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 #, fuzzy
 msgid "Analog Radio"
 msgstr "Mono Analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 #, fuzzy
 msgid "Analog Video"
 msgstr "Estéreo Analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 #, fuzzy
 msgid "Analog Output"
 msgstr "Saída nula"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 #, fuzzy
 msgid "Analog Headphones"
 msgstr "Mono Analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 #, fuzzy
 msgid "Analog Mono Output"
 msgstr "Mono Analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Estéreo Analógico"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, fuzzy, c-format
 msgid "%s+%s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, fuzzy, c-format
 msgid "%s / %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Mono Analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Estéreo Analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 #, fuzzy
 msgid "Analog Surround 2.1"
 msgstr "Analog Surround 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 #, fuzzy
 msgid "Analog Surround 3.0"
 msgstr "Analog Surround 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 #, fuzzy
 msgid "Analog Surround 3.1"
 msgstr "Analog Surround 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Analog Surround 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Analog Surround 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Analog Surround 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Analog Surround 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 #, fuzzy
 msgid "Analog Surround 6.0"
 msgstr "Analog Surround 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 #, fuzzy
 msgid "Analog Surround 6.1"
 msgstr "Analog Surround 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 #, fuzzy
 msgid "Analog Surround 7.0"
 msgstr "Analog Surround 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Analog Surround 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Estéreo Digital (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 #, fuzzy
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Surround Digital 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Surround Digital 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Surround Digital 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Estéreo Digital (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 #, fuzzy
 msgid "Analog Mono Duplex"
 msgstr "Mono Analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 #, fuzzy
 msgid "Analog Stereo Duplex"
 msgstr "Estéreo Analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 #, fuzzy
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Estéreo Digital (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Emissor de Baixa Frequência"
+
 #, fuzzy
 #~ msgid "Invalid client name '%s'\n"
 #~ msgstr "Nome de máquina inválido"
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 257aa36..d91484d 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-23 09:53+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-10-23 14:42-0300\n"
 "Last-Translator: Igor Pires Soares <igor at projetofedora.org>\n"
 "Language-Team: Brazilian-Portuguese <fedora-trans-pt_br at redhat.com>\n"
@@ -19,38 +19,49 @@ msgstr ""
 "X-Poedit-Language: Portuguese\n"
 "X-Poedit-Country: Brazil\n"
 
-#: ../src/modules/alsa/alsa-util.c:858
-#: ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
-"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
+"ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
-"O snd_pcm_avail() retornou um valor que é excepcionalmente grande: %lu bytes (%lu ms).\n"
-"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, relate esse problema aos desenvolvedores do ALSA."
+"O snd_pcm_avail() retornou um valor que é excepcionalmente grande: %lu bytes "
+"(%lu ms).\n"
+"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, "
+"relate esse problema aos desenvolvedores do ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
-"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
+"lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
-"O snd_pcm_delay() retornou um valor que é excepcionalmente grande: %li bytes (%s%lu ms).\n"
-"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, relate esse problema aos desenvolvedores do ALSA."
+"O snd_pcm_delay() retornou um valor que é excepcionalmente grande: %li bytes "
+"(%s%lu ms).\n"
+"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, "
+"relate esse problema aos desenvolvedores do ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
-"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
-"O snd_pcm_mmap_begin() retornou um valor que é excepcionalmente grande: %lu bytes (%lu ms).\n"
-"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, relate esse problema aos desenvolvedores do ALSA."
+"O snd_pcm_mmap_begin() retornou um valor que é excepcionalmente grande: %lu "
+"bytes (%lu ms).\n"
+"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, "
+"relate esse problema aos desenvolvedores do ALSA."
 
 #: ../src/modules/module-always-sink.c:39
 msgid "Always keeps at least one sink loaded even if it's a null one"
@@ -65,8 +76,18 @@ msgid "Virtual LADSPA sink"
 msgstr "Destino Virtual LADSPA"
 
 #: ../src/modules/module-ladspa-sink.c:53
-msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
-msgstr "sink_name=<nome do destino> sink_properties=<propriedades do destino> master=<nome do destino a ser filtrado> format=<formato de amostragem> rate=<taxa da amostragem> channels=<número de canais> channel_map=<mapa dos canais> plugin=<nome do plugin ladspa> label=<rótulo do plugin ladspa> control=<lista separada por vírgulas dos valores de controle da entrada>"
+msgid ""
+"sink_name=<name for the sink> sink_properties=<properties for the sink> "
+"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
+"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
+"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
+"input control values>"
+msgstr ""
+"sink_name=<nome do destino> sink_properties=<propriedades do destino> "
+"master=<nome do destino a ser filtrado> format=<formato de amostragem> "
+"rate=<taxa da amostragem> channels=<número de canais> channel_map=<mapa dos "
+"canais> plugin=<nome do plugin ladspa> label=<rótulo do plugin ladspa> "
+"control=<lista separada por vírgulas dos valores de controle da entrada>"
 
 #: ../src/modules/module-null-sink.c:55
 msgid "Clocked NULL sink"
@@ -76,11 +97,11 @@ msgstr "Destino nulo temporizado"
 msgid "Null Output"
 msgstr "Saída nula"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Áudio interno"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Modem"
 
@@ -96,288 +117,326 @@ msgstr "Falha ao alocar o novo carregador dl."
 msgid "Failed to add bind-now-loader."
 msgstr "Falha em adicionar o bind-now-loader."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Sinal %s recebido."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Saindo."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Falha ao localizar o usuário \"%s\"."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Falha ao localizar o grupo \"%s\"."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Usuário \"%s\" (UID %lu) e grupo \"%s\" (GID %lu) localizados."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "O GID do usuário'%s' e do grupo '%s' não combinam."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "O diretório pessoal do usuário \"%s\" não é \"%s\", ignorando."
 
-#: ../src/daemon/main.c:208
-#: ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Falha ao criar \"%s\": %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "Falha ao alterar a lista de grupos: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "Falha ao alterar o GID: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "Falha ao alterar o UID: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "Os privilégios do root foram retirados com sucesso."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "O modo ampliado do sistema não tem suporte nessa plataforma."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) falhou: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "Falha em interpretar a linha de comando."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "O daemon não está em execução"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Daemon executando como PID %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Falha em encerrar o daemon: %s"
 
-#: ../src/daemon/main.c:571
-msgid "This program is not intended to be run as root (unless --system is specified)."
-msgstr "Este programa não é para ser executado como root (a não ser que --system seja especificado)."
+#: ../src/daemon/main.c:662
+msgid ""
+"This program is not intended to be run as root (unless --system is "
+"specified)."
+msgstr ""
+"Este programa não é para ser executado como root (a não ser que --system "
+"seja especificado)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Privilégios de root requeridos."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start não tem suporte para instâncias de sistemas."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 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:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr "Executando no modo system, mas --disallow-module-loading não foi configurado!"
+msgstr ""
+"Executando no modo system, mas --disallow-module-loading não foi configurado!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "Executando no modo system, desabilitando forçadamente o modo SHM!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
-msgstr "Executando no modo system, desabilitando forçadamente o exit idle time!"
+msgstr ""
+"Executando no modo system, desabilitando forçadamente o exit idle time!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "Falha em adquirir o stdio."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "O pipe falhou: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "O fork() falhou: %s"
 
-#: ../src/daemon/main.c:646
-#: ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "A operação read() falhou: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "Falha na partida do daemon."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "Os daemons foram iniciados com sucesso."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "A operação read() falhou: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Este é o PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Host de compilação: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "Compilação CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "Executando no host: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u CPUs localizadas."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "O tamanho da página é %lu bytes"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Compilado com suporte do Valgrind: sim"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Compilado com suporte do Valgrind: não"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Executando em modo valgrind: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "Executando no host: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Build otimizado: sim"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Build otimizado: não"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG definido, todas as declarações desabilitadas."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
-msgstr "FASTPATH definido, somente as declarações do \"fast path\" foram desabilitadas."
+msgstr ""
+"FASTPATH definido, somente as declarações do \"fast path\" foram "
+"desabilitadas."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "Todas as declarações habilitadas."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "Falha em obter o ID da máquina"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "A ID da máquina é %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "O ID da sessão é %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Usando o diretório de runtime %s."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "Usando o diretório de estado %s."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "Usando o diretório de módulos %s."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Executando em modo do sistema: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
-"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
-"If you do it nonetheless then it's your own fault if things don't work as expected.\n"
-"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."
+"OK, so you are running PA in system mode. Please note that you most likely "
+"shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as "
+"expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
+"explanation why system mode is usually a bad idea."
 msgstr ""
-"OK, então você está executando o PA no modo de sistema. Por favor, note que é mais provável que você não deveria estar fazendo isso.\n"
-"Todavia, se você o fizer, então a culpa será sua se as coisas não funcionarem como esperado.\n"
-"Por favor, leia o http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode para obter um explicação sobre porque o modo de sistema é uma má idéia."
-
-#: ../src/daemon/main.c:809
+"OK, então você está executando o PA no modo de sistema. Por favor, note que "
+"é mais provável que você não deveria estar fazendo isso.\n"
+"Todavia, se você o fizer, então a culpa será sua se as coisas não "
+"funcionarem como esperado.\n"
+"Por favor, leia o http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode para "
+"obter um explicação sobre porque o modo de sistema é uma má idéia."
+
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() falhou."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Timers de alta resolução frequinhos disponíveis! Bon appetit!"
 
-#: ../src/daemon/main.c:821
-msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
-msgstr "Cara, teu kernel fede! A recomendação do chef hoje é Linux com timers de alta resolução habilitados!"
+#: ../src/daemon/main.c:922
+msgid ""
+"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
+"resolution timers enabled!"
+msgstr ""
+"Cara, teu kernel fede! A recomendação do chef hoje é Linux com timers de "
+"alta resolução habilitados!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() falhou."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "Falha em iniciar o daemon."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
-msgstr "O Daemon iniciou sem qualquer módulo carregado, recusando-se a trabalhar."
+msgstr ""
+"O Daemon iniciou sem qualquer módulo carregado, recusando-se a trabalhar."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "A partida dos Daemon está completa."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "O encerramento do Daemon foi iniciado."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "Daemon terminado."
 
@@ -392,37 +451,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"
@@ -433,10 +503,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"
@@ -447,56 +519,79 @@ msgstr ""
 "  -h, --help                            Mostra esta ajuda\n"
 "      --version                        Mostra a versão\n"
 "      --dump-conf                       Descarrega a configuração padrão\n"
-"      --dump-modules                   Descarrega a lista de módulos disponíveis\n"
-"      --dump-resample-methods           Descarrega os métodos de reamostragem\n"
-"      --cleanup-shm                     Limpa os segmentos de memória compartilhados\n"
-"      --start                           Inicia o daemon se ele não estiver em execução\n"
+"      --dump-modules                   Descarrega a lista de módulos "
+"disponíveis\n"
+"      --dump-resample-methods           Descarrega os métodos de "
+"reamostragem\n"
+"      --cleanup-shm                     Limpa os segmentos de memória "
+"compartilhados\n"
+"      --start                           Inicia o daemon se ele não estiver "
+"em execução\n"
 "  -k  --kill                            Encerra um daemon em execução\n"
-"      --check                           Verifica se há um daemon em execução (somente retorna o código de saída)\n"
+"      --check                           Verifica se há um daemon em execução "
+"(somente retorna o código de saída)\n"
 "\n"
 "OPÇÕES:\n"
-"      --system[=BOOL]                   Executa como uma instância do sistema em escala ampla\n"
+"      --system[=BOOL]                   Executa como uma instância do "
+"sistema em escala ampla\n"
 "  -D, --daemonize[=BOOL]                Torna-se um daemom após o início\n"
 "      --fail[=BOOL]                     Sai quando a partida falha\n"
 "      --high-priority[=BOOL]            Tenta definir um nível alto de nice\n"
 "                                        (disponível apenas, quando SUID ou\n"
 "                                        com RLIMIT_NICE) elevado\n"
-"      --realtime[=BOOL]                 Tenta habilitar o escalonamento em tempo real\n"
-"                                        (disponível apenas como root, quando SUID ou\n"
+"      --realtime[=BOOL]                 Tenta habilitar o escalonamento em "
+"tempo real\n"
+"                                        (disponível apenas como root, quando "
+"SUID ou\n"
 "                                        com  RLIMIT_RTPRIO) elevado\n"
-"      --disallow-module-loading[=BOOL]  Não permite carga/descarga de módulo requerido pelo usuário\n"
+"      --disallow-module-loading[=BOOL]  Não permite carga/descarga de módulo "
+"requerido pelo usuário\n"
 "                                        depois da partida\n"
-"      --disallow-exit[=BOOL]            Não permite saída requisitada pelo usuário\n"
-"      --exit-idle-time=SECS             Termina um daemon quando ocioso e este\n"
+"      --disallow-exit[=BOOL]            Não permite saída requisitada pelo "
+"usuário\n"
+"      --exit-idle-time=SECS             Termina um daemon quando ocioso e "
+"este\n"
 "                                        tempo foi decorrido\n"
-"      --module-idle-time=SECS           Descarrega os módulos autocarregáveis quando ociosos e\n"
+"      --module-idle-time=SECS           Descarrega os módulos "
+"autocarregáveis quando ociosos e\n"
 "                                        este tempo foi decorrido\n"
-"      --scache-idle-time=SECS           Descarrega amostras quando ociosas e\n"
+"      --scache-idle-time=SECS           Descarrega amostras quando ociosas "
+"e\n"
 "                                        este tempo foi decorrido\n"
-"      --log-level[=LEVEL]               Aumenta ou define o grau de detalhamento\n"
+"      --log-level[=LEVEL]               Aumenta ou define o grau de "
+"detalhamento\n"
 "  -v                                    Aumenta o nível de detalhamento\n"
 "      --log-target={auto,syslog,stderr} Especifica o destino do log\n"
-"      --log-meta[=BOOL]                 Inclui a localização do código na mensagem de log\n"
-"      --log-time[=BOOL]                 Inclui carimbos de hora nas mensagens de log\n"
-"      --log-backtrace=FRAMES            Inclui um backtrace na mensagem de log\n"
-"  -p, --dl-search-path=PATH             Define o caminho de pesquisa para objetos (plugins)\n"
+"      --log-meta[=BOOL]                 Inclui a localização do código na "
+"mensagem de log\n"
+"      --log-time[=BOOL]                 Inclui carimbos de hora nas "
+"mensagens de log\n"
+"      --log-backtrace=FRAMES            Inclui um backtrace na mensagem de "
+"log\n"
+"  -p, --dl-search-path=PATH             Define o caminho de pesquisa para "
+"objetos (plugins)\n"
 "                                            dinamicamente compartilhados\n"
-"      --resample-method=METHOD         Usa o método de reamostragem especificado\n"
+"      --resample-method=METHOD         Usa o método de reamostragem "
+"especificado\n"
 "                                        (Veja --dump-resample-methods para\n"
 "                                        valores possíveis)\n"
 "      --use-pid-file[=BOOL]             Cria um arquivo PID\n"
-"      --no-cpu-limit[=BOOL]            Não instala um limitador de carga de CPU em\n"
+"      --no-cpu-limit[=BOOL]            Não instala um limitador de carga de "
+"CPU em\n"
 "                                        plataformas que o suportem.\n"
-"      --disable-shm[=BOOL]              Desabilita o suporte à memória compartilhada.\n"
+"      --disable-shm[=BOOL]              Desabilita o suporte à memória "
+"compartilhada.\n"
 "\n"
 "SCRIPT DE INÍCIO:\n"
 "  -L, --load=\"ARGUMENTOS DO MÓDULO\"    Carrega um plugin especificado com\n"
 "                                        o argumento especificado\n"
 "  -F, --file=NOME_DO_ARQUIVO          Executa o script especificado\n"
-"  -C                                    Abre uma linha de comando no TTY em execução\n"
+"  -C                                    Abre uma linha de comando no TTY em "
+"execução\n"
 "                                       depois da partida\n"
 "\n"
-"  -n                                    Não carrega o arquivo de script padrão\n"
+"  -n                                    Não carrega o arquivo de script "
+"padrão\n"
 
 #: ../src/daemon/cmdline.c:247
 msgid "--daemonize expects boolean argument"
@@ -507,8 +602,12 @@ msgid "--fail expects boolean argument"
 msgstr "--fail espera argumento booleano"
 
 #: ../src/daemon/cmdline.c:264
-msgid "--log-level expects log level argument (either numeric in range 0..4 or one of debug, info, notice, warn, error)."
-msgstr "--log-level espera um argumento em nível de log  (seja numérico na faixa de 0..4 seja algum entre 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 espera um argumento em nível de log  (seja numérico na faixa de "
+"0..4 seja algum entre debug, info, notice, warn, error)."
 
 #: ../src/daemon/cmdline.c:276
 msgid "--high-priority expects boolean argument"
@@ -604,76 +703,85 @@ msgstr "AVISO DE OBSOLESCÊNCIA: %s\n"
 msgid "Path: %s\n"
 msgstr "Caminho: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Alvo do log inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Nível de log inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Método de reamostragem inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] rlimit inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit não tem suporte nessa plataforma."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Formato de amostragem inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Taxa de amostragem inválida '%s'."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Canais de amostragem inválidos'%s'."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Mapa de canais \"%s\" inválido."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Números de fragmentos inválidos '%s'."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Tamanho de fragmentos inválido '%s'."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Número de nice inválido'%s'."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Taxa de amostragem inválida '%s'."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Falha em abrir o arquivo de configuração: %s"
 
-#: ../src/daemon/daemon-conf.c:562
-msgid "The specified default channel map has a different number of channels than the specified default number of channels."
-msgstr "O mapa padrão dos canais especificado tem um número diferente de canais do que o número de canais padrão especificado."
+#: ../src/daemon/daemon-conf.c:602
+msgid ""
+"The specified default channel map has a different number of channels than "
+"the specified default number of channels."
+msgstr ""
+"O mapa padrão dos canais especificado tem um número diferente de canais do "
+"que o número de canais padrão especificado."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Lido do arquivo de configuração: %s ###\n"
@@ -690,8 +798,7 @@ msgstr "Sistema de som PulseAudio"
 msgid "Start the PulseAudio Sound System"
 msgstr "Iniciar o sistema de som PulseAudio"
 
-#: ../src/pulse/channelmap.c:105
-#: ../src/pulse/channelmap.c:757
+#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757
 msgid "Mono"
 msgstr "Mono"
 
@@ -720,8 +827,8 @@ msgid "Rear Right"
 msgstr "Posterior direito"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Emissor de baixa freqüência"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -895,12 +1002,9 @@ msgstr "Posterior superior esquerdo"
 msgid "Top Rear Right"
 msgstr "Posterior superior direito"
 
-#: ../src/pulse/channelmap.c:484
-#: ../src/pulse/sample.c:170
-#: ../src/pulse/volume.c:295
-#: ../src/pulse/volume.c:321
-#: ../src/pulse/volume.c:341
-#: ../src/pulse/volume.c:371
+#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170
+#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321
+#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371
 msgid "(invalid)"
 msgstr "(Inválido)"
 
@@ -1061,8 +1165,7 @@ msgstr "%0.1f KiB"
 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() falhou"
 
@@ -1070,193 +1173,191 @@ msgstr "XOpenDisplay() falhou"
 msgid "Failed to parse cookie data"
 msgstr "Falhou ao analisar os dados do cookie"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Falha em abrir o arquivo de configuração '%s': %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Nenhum cookie foi carregado. Tentativa de conexão sem eles."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "Foi recebida uma mensagem para uma extensão desconhecida '%s'"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Falha ao drenar o fluxo: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "Fluxo de reprodução drenado."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "Drenando conexão para o servidor."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() falhou: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() falhou: %s"
 
-#: ../src/utils/pacat.c:237
-#: ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() falhou: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Fluxo criado com sucesso."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() falhou: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Métricas do buffer: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Métricas do buffer: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "Usando especificação de amostragem \"%s\", mapa de canais \"%s\"."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Conectado ao dispositivo %s (%u, %ssuspended)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "Erro de fluxo: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Dispositivo de fluxo suspenso.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "O dispositivo de fluxo continuou.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "Subestimação do fluxo.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "Superestimação do fluxo.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "Fluxo iniciado.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Fluxo movido para o dispositivo %s (%u, %ssuspended).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "não"
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Atributos do buffer de fluxo alterados.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "Conexão estabelecida.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() falhou: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() falhou: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() falhou: %s"
 
-#: ../src/utils/pacat.c:470
-#: ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Falha na conexão: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "Atingiu EOF."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() falhou: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "Sinal recebido, saindo."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "Falha ao obter a latência: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Tempo: %0.3f sec;; Latência: %0.0f usec."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() falhou: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1268,31 +1369,54 @@ 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, s24le, s24be,\n"
-"                                        s24-32le, s24-32be (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, "
+"s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to "
+"s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, "
+"2 for stereo\n"
 "                                        (defaults to 2)\n"
-"      --channel-map=CHANNELMAP          Channel map to use instead of the default\n"
-"      --fix-format                      Take the sample format from the sink 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"
-"      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
+"      --no-remap                        Map channels by index instead of "
+"name.\n"
+"      --latency=BYTES                   Request the specified latency in "
+"bytes.\n"
+"      --process-time=BYTES              Request the specified process time "
+"per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the "
+"specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [opções]\n"
@@ -1303,36 +1427,58 @@ msgstr ""
 "  -r, --record                          Cria uma conexão para gravação\n"
 "  -p, --playback                        Cria uma conexão para reprodução\n"
 "\n"
-"  -v, --verbose                         Habilita operações no modo detalhado\n"
+"  -v, --verbose                         Habilita operações no modo "
+"detalhado\n"
 "\n"
 "  -s, --server=SERVIDOR                   Nome do servidor a conectar-se\n"
-"  -d, --device=DISPOSITIVO                   O nome do destino/fonte a conectar-se\n"
-"  -n, --client-name=NOME                Como chamar este cliente no servidor\n"
+"  -d, --device=DISPOSITIVO                   O nome do destino/fonte a "
+"conectar-se\n"
+"  -n, --client-name=NOME                Como chamar este cliente no "
+"servidor\n"
 "      --stream-name=NOME               Como chamar este fluxo no servidor\n"
-"      --volume=VOLUME                   Especifica a faixa (linear) inicial de volume no intervalo 0...65536\n"
-"      --rate=TAXA_DE_AMOSTRAGEM             Taxa de amostragem em Hz (o padrão é 44100)\n"
-"      --format=FORMATO_DE_AMOSTRAGEM       Tipo de amostragem, um de s16le, s16be, u8, float32le,\n"
-"                                        float32be, ulaw, alaw, s32le, s32be, s24le, s24be,\n"
-"                                        s24-32le, s24-32be (o padrão é s16ne)\n"
-"      --channels=CANAIS               O número de canais, 1 para mono, 2 para estéreo\n"
+"      --volume=VOLUME                   Especifica a faixa (linear) inicial "
+"de volume no intervalo 0...65536\n"
+"      --rate=TAXA_DE_AMOSTRAGEM             Taxa de amostragem em Hz (o "
+"padrão é 44100)\n"
+"      --format=FORMATO_DE_AMOSTRAGEM       Tipo de amostragem, um de s16le, "
+"s16be, u8, float32le,\n"
+"                                        float32be, ulaw, alaw, s32le, s32be, "
+"s24le, s24be,\n"
+"                                        s24-32le, s24-32be (o padrão é "
+"s16ne)\n"
+"      --channels=CANAIS               O número de canais, 1 para mono, 2 "
+"para estéreo\n"
 "                                        (o padrão é 2)\n"
-"      --channel-map=MAPA_DE_CANAIS          Mapeamento de canais a ser usado no lugar do padrão\n"
-"      --fix-format                      Obtém o formato da amostragem do destino onde o fluxo\n"
+"      --channel-map=MAPA_DE_CANAIS          Mapeamento de canais a ser usado "
+"no lugar do padrão\n"
+"      --fix-format                      Obtém o formato da amostragem do "
+"destino onde o fluxo\n"
 "                                             está sendo conectado.\n"
-"      --fix-rate                        Obtém a taxa de amostragem do destino onde o fluxo está\n"
+"      --fix-rate                        Obtém a taxa de amostragem do "
+"destino onde o fluxo está\n"
 "                                        sendo conectado.\n"
-"      --fix-channels                    Obtém o número de canais e o mapa de canais\n"
-"                                      do destino onde o fluxo está sendo conectado.\n"
-"      --no-remix                        Não realizar upmix nem downmix dos canais.\n"
-"      --no-remap                        Mapear os canais por índice em vez de nome.\n"
-"      --latency=BYTES                   Requisitar a latência especificada em bytes.\n"
-"      --process-time=BYTES              Requisitar o tempo de processo especificado por requisições em bytes.\n"
-"      --property=PROPRIEDADE=VALOR         Define a propriedade especificada para o valor especificado.\n"
-"      --raw                             Grava/reproduz dados PCM não tratados.\n"
-"      --file-format=FORMATO_DO_ARQ.             Grava/reproduz dados PCM formatados.\n"
-"      --list-file-formats               Lista os formatos de arquivo disponíveis.\n"
-
-#: ../src/utils/pacat.c:731
+"      --fix-channels                    Obtém o número de canais e o mapa de "
+"canais\n"
+"                                      do destino onde o fluxo está sendo "
+"conectado.\n"
+"      --no-remix                        Não realizar upmix nem downmix dos "
+"canais.\n"
+"      --no-remap                        Mapear os canais por índice em vez "
+"de nome.\n"
+"      --latency=BYTES                   Requisitar a latência especificada "
+"em bytes.\n"
+"      --process-time=BYTES              Requisitar o tempo de processo "
+"especificado por requisições em bytes.\n"
+"      --property=PROPRIEDADE=VALOR         Define a propriedade especificada "
+"para o valor especificado.\n"
+"      --raw                             Grava/reproduz dados PCM não "
+"tratados.\n"
+"      --file-format=FORMATO_DO_ARQ.             Grava/reproduz dados PCM "
+"formatados.\n"
+"      --list-file-formats               Lista os formatos de arquivo "
+"disponíveis.\n"
+
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1343,179 +1489,183 @@ msgstr ""
 "Compilado com  libpulse %s\n"
 "Linkado com libpulse %s\n"
 
-#: ../src/utils/pacat.c:764
-#: ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Nome do cliente \"%s\" inválido"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Nome do fluxo \"%s\" inválido"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Mapa de canais \"%s\" inválido"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Especificação de latência inválida \"%s\""
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Especificação do tempo de processo \"%s\" inválida"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Propriedade \"%s\" inválida"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Formato de arquivo %s desconhecido."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Especificação de amostragem inválida"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Argumentos em excesso."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "Falha ao gerar a especificação de amostragem para o arquivo."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "Falha ao abrir o arquivo de áudio."
 
-#: ../src/utils/pacat.c:959
-msgid "Warning: specified sample specification will be overwritten with specification from file."
-msgstr "Aviso: a especificação de amostragem especificada será sobrescrita pela especificação do arquivo."
+#: ../src/utils/pacat.c:1000
+msgid ""
+"Warning: specified sample specification will be overwritten with "
+"specification from file."
+msgstr ""
+"Aviso: a especificação de amostragem especificada será sobrescrita pela "
+"especificação do arquivo."
 
-#: ../src/utils/pacat.c:962
-#: ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "Falha ao determinar a especificação de amostragem a partir do arquivo."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "Aviso: falha ao determinar o mapa de canais a partir do arquivo."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "O mapa de canais não combina com a especificação da amostragem"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "Aviso: falha ao gravar o mapa de canais no arquivo."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr "Abrindo um fluxo %s com a especificação de amostragem \"%s\" e mapeamento de canais \"%s\"."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr ""
+"Abrindo um fluxo %s com a especificação de amostragem \"%s\" e mapeamento de "
+"canais \"%s\"."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "gravando"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "playback"
 
-#: ../src/utils/pacat.c:1035
-#: ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() falhou."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() falhou."
 
-#: ../src/utils/pacat.c:1061
-#: ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() falhou."
 
-#: ../src/utils/pacat.c:1069
-#: ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_new() falhou: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() falhou."
 
-#: ../src/utils/pacat.c:1082
-#: ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() falhou."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "Falha em suspender: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "Falha ao prosseguir: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
-msgstr "AVISO: O servidor de som não é local, Sound server is not local, não está em suspenso.\n"
+msgstr ""
+"AVISO: O servidor de som não é local, Sound server is not local, não está em "
+"suspenso.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Falha na conexão: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "Recebido o SIGINT, saindo.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "AVISO: O processo filho terminou pelo sinal %u \n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
-"  -s, --server=SERVER                   The name of the server to connect to\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
 "\n"
 msgstr ""
 "%s [options] ... \n"
@@ -1525,7 +1675,7 @@ msgstr ""
 "  -s, --server=SERVER                   Nome do servidor a ser conectado\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1536,50 +1686,61 @@ msgstr ""
 "Compilado com libpulse %s\n"
 "Linkado com libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() falhou.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() falhou.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() falhou.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Falha ao obter estatísticas: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "Em uso no momento: %u blocos contendo %s bytes no total.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "Alocado por todo o tempo: %u blocos contendo %s bytes  no total.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Tamanho do cache para amostragem: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "Falha ao obter informações do servidor: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1587,7 +1748,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Nome do usuário: %s\n"
 "Nome da máquina: %s\n"
@@ -1599,12 +1760,12 @@ msgstr ""
 "Fonte padrão %s\n"
 "Cookie: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Falha ao obter informações do destino: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1643,24 +1804,22 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268
-#: ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tPortas:\n"
 
-#: ../src/utils/pactl.c:274
-#: ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tPorta ativa: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "Falha ao obter informações da fonte: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1699,28 +1858,20 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345
-#: ../src/utils/pactl.c:401
-#: ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473
-#: ../src/utils/pactl.c:532
-#: ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543
-#: ../src/utils/pactl.c:587
-#: ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594
-#: ../src/utils/pactl.c:637
-#: ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n/a"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "Falha ao obter informações do módulo: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1737,12 +1888,12 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "Falha ao obter informações do cliente: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1757,12 +1908,12 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "Falha ao obter informações da placa: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1779,22 +1930,22 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tPerfis:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tPerfil ativo: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Falha ao obter informações da entrada do destino: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1831,12 +1982,12 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "Falha ao obter informações da saída da fonte: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1865,12 +2016,12 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Falha ao obter informações sobre a amostragem: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1901,27 +2052,81 @@ msgstr ""
 "\tPropriedades:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653
-#: ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Falha: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Falha ao enviar a amostra: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "Fim prematuro do arquivo"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr "destino"
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr "fonte"
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+#, fuzzy
+msgid "source-output"
+msgstr "fonte"
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Servidor inválido"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT recebido, saindo."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -1944,12 +2149,15 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\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 ""
 "%s [opções] stat\n"
 "%s [opções] list\n"
@@ -1976,10 +2184,12 @@ msgstr ""
 "  -h, --help                            Mostra essa ajuda\n"
 "      --version                        Mostra a versão\n"
 "\n"
-"  -s, --server=SERVIDOR                   O nome do servidor a ser conectado\n"
-"  -n, --client-name=NOME                Como chamar este cliente no servidor \n"
+"  -s, --server=SERVIDOR                   O nome do servidor a ser "
+"conectado\n"
+"  -n, --client-name=NOME                Como chamar este cliente no "
+"servidor \n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1990,104 +2200,111 @@ msgstr ""
 "Compilado com libpulse %s\n"
 "Linkado com libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Por favor, especifique um arquivo de amostra a ser carregado"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Falha ao abrir o arquivo de som."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
-msgstr "Aviso: falha ao determinar a especificação da amostragem a partir do arquivo."
+msgstr ""
+"Aviso: falha ao determinar a especificação da amostragem a partir do arquivo."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "Você deve especificar um nome para amostra a ser reproduzida"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "Você deve especificar um nome para a amostra a ser removida"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "Você deve especificar a entrada do destino e um destino"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "Você deve especificar um índice de saída da fonte e uma fonte"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "Você deve especificar um nome para o módulo e seus argumentos."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "Você deve especificar um índice do módulo"
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
-msgstr "Você não pode especificar mais de um destino. Você deve especificar um valor booleano."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
+msgstr ""
+"Você não pode especificar mais de um destino. Você deve especificar um valor "
+"booleano."
 
-#: ../src/utils/pactl.c:1103
-msgid "You may not specify more than one source. You have to specify a boolean value."
-msgstr "Você não pode especificar mais de uma fonte. Você deve especificar um valor booleano."
+#: ../src/utils/pactl.c:1196
+msgid ""
+"You may not specify more than one source. You have to specify a boolean "
+"value."
+msgstr ""
+"Você não pode especificar mais de uma fonte. Você deve especificar um valor "
+"booleano."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "Você deve especificar um nome/índice para a placa e um nome de perfil"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "Você deve especificar um nome/índice do destino e o nome da porta"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "Você deve especificar um nome/índice da fonte e o nome da porta"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "Você deve especificar um nome/índice do destino e um volume"
 
-#: ../src/utils/pactl.c:1154
-#: ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193
-#: ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226
-#: ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "Especificação de volume inválida"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "Você deve especificar um nome/índice da fonte e um volume"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "Você deve especificar um índice de entrada para o destino e um volume"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "Índice de entrada de destino inválido"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "Você deve especificar um nome/índice do destino e um booleano do mudo"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "Você deve especificar um nome/índice da fonte e um booleano do mudo"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr "Você deve especificar um índice de entrada para o destino e um booleano do mudo"
+msgstr ""
+"Você deve especificar um índice de entrada para o destino e um booleano do "
+"mudo"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "Especificação do índice de entrada de destino inválida"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "Nenhum comando válido especificado."
 
@@ -2098,14 +2315,17 @@ 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    Mostra os dados atuais do PulseAudio associados ao display X11 (padrão)\n"
+" -d    Mostra os dados atuais do PulseAudio associados ao display X11 "
+"(padrão)\n"
 " -e    Exporta os dados locais do PulseAudio para um display X11 \n"
-" -i     Importa os dados do PulseAudio de um display X11 para as variáveis de ambiente locais e para o arquivo de cookie.\n"
+" -i     Importa os dados do PulseAudio de um display X11 para as variáveis "
+"de ambiente locais e para o arquivo de cookie.\n"
 " -r    Remove os dados do PulseAudio do display X11\n"
 
 #: ../src/utils/pax11publish.c:94
@@ -2168,107 +2388,120 @@ msgstr "Falha em carregar os dados do cookie\n"
 msgid "Not yet implemented.\n"
 msgstr "Ainda não implementado.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
-msgstr "Nenhum daemon do PulseAudio em execução ou não está em execução como daemon de sessão."
+msgstr ""
+"Nenhum daemon do PulseAudio em execução ou não está em execução como daemon "
+"de sessão."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "Falha ao matar o daemon do PulseAudio."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "O daemon não responde."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171
-#: ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207
-#: ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136
-#: ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "Não foi possível acessar a trava de autogeração."
 
-#: ../src/modules/alsa/alsa-sink.c:530
-#: ../src/modules/alsa/alsa-sink.c:689
+#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
 #, c-format
 msgid ""
-"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
-"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
+"ALSA woke us up to write new data to the device, but there was actually "
+"nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
 msgstr ""
-"O ALSA nos acordou para gravar novos dados no dispositivo, mas não há nada a ser gravado!\n"
-"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, relate esse problema para os desenvolvedores do ALSA.\n"
-"Nós fomos acordados com o conjunto POLLOUT -- entretanto, a snd_pcm_avail() subseqüente retornou 0 ou outro valor < min_avail."
+"O ALSA nos acordou para gravar novos dados no dispositivo, mas não há nada a "
+"ser gravado!\n"
+"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, "
+"relate esse problema para os desenvolvedores do ALSA.\n"
+"Nós fomos acordados com o conjunto POLLOUT -- entretanto, a snd_pcm_avail() "
+"subseqüente retornou 0 ou outro valor < min_avail."
 
-#: ../src/modules/alsa/alsa-source.c:506
-#: ../src/modules/alsa/alsa-source.c:656
+#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
 #, c-format
 msgid ""
-"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
-"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
+"ALSA woke us up to read new data from the device, but there was actually "
+"nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
 msgstr ""
-"O ALSA nos acordou para ler novos dados no dispositivo, mas não há nada a ser lido!\n"
-"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, relate esse problema para os desenvolvedores do ALSA.\n"
-"Nós fomos acordados com o conjunto POLLIN -- entretanto, a snd_pcm_avail() subseqüente retornou 0 ou outro valor < min_avail."
+"O ALSA nos acordou para ler novos dados no dispositivo, mas não há nada a "
+"ser lido!\n"
+"É mais provável que isso seja um erro no driver \"%s\" do ALSA. Por favor, "
+"relate esse problema para os desenvolvedores do ALSA.\n"
+"Nós fomos acordados com o conjunto POLLIN -- entretanto, a snd_pcm_avail() "
+"subseqüente retornou 0 ou outro valor < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Desligado"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "Reprodução de alta fidelidade (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "Captura de alta fidelidade (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Duplex telefônico (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "Servidor de som PulseAudio"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "Dispositivos de saída"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "Dispositivos de entrada"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "Áudio em @HOSTNAME@"
 
@@ -2332,230 +2565,293 @@ msgstr "Amplificador"
 msgid "No Amplifier"
 msgstr "Sem amplificador"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "Impulso"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "Sem impulso"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "Fones de ouvido analógico"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "Entrada analógica"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "Microfone analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "Entrada de linha analógica"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "Rádio analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "Vídeo analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "Saída analógica"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "Fones de ouvido analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "Saída analógica (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "Saída analógica monofônica"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Estéreo analógico"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984
-#: ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Monofônico analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Estéreo analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "Surround analógico 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "Surround analógico 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "Surround analógico 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Surround analógico 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Surround analógico 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Surround analógico 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Surround analógico 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "Surround analógico 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "Surround analógico 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "Surround analógico 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Surround analógico 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Estéreo digital (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Surround 4.0 digital (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Surround digital 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Surround digital 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Estéreo digital (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "Duplex monofônico analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "Duplex estéreo analógico"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Duplex estéreo digital (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Emissor de baixa freqüência"
+
 #~ msgid "Invalid client name '%s'\n"
 #~ msgstr "Nome do cliente \"%s\" inválido\n"
+
 #~ msgid "Failed to determine sample specification from file.\n"
 #~ msgstr ""
 #~ "Falha ao determinar a especificação de amostragem a partir do arquivo.\n"
+
 #~ msgid "select(): %s"
 #~ msgstr "select(): %s"
+
 #~ msgid "Cannot connect to system bus: %s"
 #~ msgstr "Não foi possível conectar com o barramento do sistema: %s"
+
 #~ msgid "Cannot get caller from PID: %s"
 #~ msgstr "Não foi possível obter quem chamou pelo PID: %s"
+
 #~ msgid "Cannot set UID on caller object."
 #~ msgstr "Não foi possível definir o UID sobre o objeto que chamou."
+
 #~ msgid "Failed to get CK session."
 #~ msgstr "Falha em obter a sessão CK."
+
 #~ msgid "Cannot set UID on session object."
 #~ msgstr "Não foi possível definir o UID do objeto da sessão."
+
 #~ msgid "Cannot allocate PolKitAction."
 #~ msgstr "Não foi possível alocar o PolKitAction."
+
 #~ msgid "Cannot set action_id"
 #~ msgstr "Não foi possível definir a action_id"
+
 #~ msgid "Cannot allocate PolKitContext."
 #~ msgstr "Não foi possível alocar o PolKitContext."
+
 #~ msgid "Cannot initialize PolKitContext: %s"
 #~ msgstr "Não foi possível iniciar o PolKitContext: %s"
+
 #~ msgid "Could not determine whether caller is authorized: %s"
 #~ msgstr "Não foi possível determinar se o solicitante está autorizado: %s"
+
 #~ msgid "Cannot obtain auth: %s"
 #~ msgstr "Não foi possível obter auth: %s"
+
 #~ msgid "PolicyKit responded with '%s'"
 #~ msgstr "PolicyKit respondeu com '%s'"
+
 #~ msgid ""
 #~ "High-priority scheduling (negative Unix nice level) for the PulseAudio "
 #~ "daemon"
 #~ msgstr ""
 #~ "Escalonamento de alta prioridade (nível de nice Unix negativo) para o "
 #~ "daemon do PulseAudio"
+
 #~ msgid "Real-time scheduling for the PulseAudio daemon"
 #~ msgstr "Escalonamento em tempo real para o daemon do PulseAudio"
+
 #~ msgid ""
 #~ "System policy prevents PulseAudio from acquiring high-priority scheduling."
 #~ msgstr ""
 #~ "Uma política do sistema impede que o PulseAudio adquira escalonamento de "
 #~ "alta prioridade."
+
 #~ msgid ""
 #~ "System policy prevents PulseAudio from acquiring real-time scheduling."
 #~ msgstr ""
 #~ "Uma política do sistema impede que o PulseAudio adquira o escalonamento "
 #~ "em tempo real."
+
 #~ msgid "read() failed: %s\n"
 #~ msgstr "read() falhou: %s\n"
+
 #~ msgid "pa_context_connect() failed: %s\n"
 #~ msgstr "pa_context_connect() falhou: %s\n"
+
 #~ msgid "We're in the group '%s', allowing high-priority scheduling."
 #~ msgstr "Estamos no grupo '%s', permitindo escalonamento de alta prioridade."
+
 #~ msgid "We're in the group '%s', allowing real-time scheduling."
 #~ msgstr "Estamos no grupo '%s', permitindo escalonamento em tempo real."
+
 #~ msgid "PolicyKit grants us acquire-high-priority privilege."
 #~ msgstr ""
 #~ "O PolicyKit assegura-nos a aquisição de privilégio de alta prioridade."
+
 #~ msgid "PolicyKit refuses acquire-high-priority privilege."
 #~ msgstr "O PolicyKit recusa a aquisição de privilégios de alta prioridade."
+
 #~ msgid "PolicyKit grants us acquire-real-time privilege."
 #~ msgstr "O PolicyKit assegura-nos a aquisição de privilégios de tempo-real."
+
 #~ msgid "PolicyKit refuses acquire-real-time privilege."
 #~ msgstr "O PolicyKit recusa a aquisição de privilégios de tempo real."
+
 #~ 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."
+
 #~ msgid "Successfully increased RLIMIT_RTPRIO"
 #~ msgstr "RLIMIT_RTPRIO aumentado com sucesso"
+
 #~ msgid "RLIMIT_RTPRIO failed: %s"
 #~ msgstr "RLIMIT_RTPRIO falhou: %s"
+
 #~ msgid "Giving up CAP_NICE"
 #~ msgstr "Abandonando CAP_NICE"
+
 #~ 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."
+
 #~ msgid "Limited capabilities successfully to CAP_SYS_NICE."
 #~ msgstr "As capacidades foram limitadas com sucesso para CAP_SYS_NICE."
+
 #~ msgid "time_new() failed.\n"
 #~ msgstr "time_new() falhou.\n"
+
 #~ msgid "Stream successfully created\n"
 #~ msgstr "Fluxo criado com sucesso\n"
+
 #~ msgid "Stream errror: %s\n"
 #~ msgstr "Erro de fluxo: %s\n"
+
 #~ msgid "Connection established.\n"
 #~ msgstr "Conexão estabelecida.\n"
+
 #~ msgid ""
 #~ "%s [options] [FILE]\n"
 #~ "\n"
@@ -2594,6 +2890,7 @@ msgstr "Duplex estéreo digital (IEC958)"
 #~ "      --volume=VOLUME                   Especifica o volume inicial "
 #~ "(linear) no intervalo 0...65536\n"
 #~ "      --channel-map=CHANNELMAP          Define o mapa do canal para uso\n"
+
 #~ msgid ""
 #~ "paplay %s\n"
 #~ "Compiled with libpulse %s\n"
@@ -2602,12 +2899,16 @@ msgstr "Duplex estéreo digital (IEC958)"
 #~ "paplay %s\n"
 #~ "Compilado com libpulse %s\n"
 #~ "Linkado com  libpulse %s\n"
+
 #~ msgid "Invalid channel map\n"
 #~ msgstr "Mapa de canais inválido\n"
+
 #~ msgid "Failed to open file '%s'\n"
 #~ msgstr "Falha ao abrir o arquivo '%s'\n"
+
 #~ msgid "Channel map doesn't match file.\n"
 #~ msgstr "O mapa dos canais não coincide com o arquivo.\n"
+
 #~ msgid "Using sample spec '%s'\n"
 #~ msgstr "Usando a especificação da amostragem '%s'\n"
 
@@ -2626,14 +2927,19 @@ msgstr "Duplex estéreo digital (IEC958)"
 #, fuzzy
 #~ msgid "--log-time boolean argument"
 #~ msgstr "--disallow-exit argumento booleano"
+
 #~ msgid "Default sink name (%s) does not exist in name register."
 #~ msgstr "O nome padrão do destino (%s) não existe no registro de nomes."
+
 #~ msgid "Buffer overrun, dropping incoming data\n"
 #~ msgstr "Houve estouro de buffer, os dados que chegaram foram descartados\n"
+
 #~ msgid "pa_stream_drop() failed: %s\n"
 #~ msgstr "pa_stream_drop() falhou: %s\n"
+
 #~ msgid "muted"
 #~ msgstr "mudo"
+
 #~ msgid ""
 #~ "*** Autoload Entry #%u ***\n"
 #~ "Name: %s\n"
@@ -2646,10 +2952,7 @@ msgstr "Duplex estéreo digital (IEC958)"
 #~ "Tipo: %s\n"
 #~ "Módulo: %s\n"
 #~ "Argumento: %s\n"
-#~ msgid "sink"
-#~ msgstr "destino"
-#~ msgid "source"
-#~ msgstr "fonte"
+
 #~ msgid ""
 #~ "' and PolicyKit refuse to grant us priviliges. Dropping SUID again.\n"
 #~ "For enabling real-time scheduling please acquire the appropriate "
@@ -2659,12 +2962,13 @@ msgstr "Duplex estéreo digital (IEC958)"
 #~ "outra vez.\n"
 #~ " Para habilitar o escalonamento em tempo real, por favo, adquira os "
 #~ "privilégios adequados pelo PolicyKit, ou torne-se membro do'"
+
 #~ msgid ""
 #~ "', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this "
 #~ "user."
 #~ msgstr ""
 #~ "', ou eleve o RLIMIT_NICE/RLIMIT_RTPRIO dos limites do recurso para este "
 #~ "usuário."
+
 #~ msgid "socketpair(): %s"
 #~ msgstr "socketpair(): %s"
-
diff --git a/po/ru.po b/po/ru.po
index cb109ef..810c26e 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-01-24 06:51+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2010-01-31 15:49+0300\n"
 "Last-Translator: Leonid Kurbatov <llenchikk at rambler.ru>\n"
 "Language-Team: Russian <->\n"
@@ -16,12 +16,12 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: -\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -34,7 +34,7 @@ msgstr ""
 "Вероятно, это ошибка в драйвере ALSA '%s'. Пожалуйста, сообщите об этой "
 "проблеме разработчикам ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -47,7 +47,7 @@ msgstr ""
 "Вероятно, это ошибка в драйвере ALSA '%s'. Пожалуйста, сообщите об этой "
 "проблеме разработчикам ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -96,11 +96,11 @@ msgstr "Синхронизированный NULL аудиоприёмник"
 msgid "Null Output"
 msgstr "Пустой выход"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Встроенное аудио"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Модем"
 
@@ -116,92 +116,98 @@ msgstr "Не удалось выделить новый dl загрузчик."
 msgid "Failed to add bind-now-loader."
 msgstr "Не удалось добавить bind-now-загрузчик."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Получен сигнал %s."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Выход."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Не удалось найти пользователя '%s'."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Не удалось найти группу '%s'."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Найден пользователь '%s' (UID %lu) и группа '%s' (GID %lu)."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "Идентификаторы групп пользователя '%s' и группы '%s' не совпадают."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "Домашняя папка пользователя '%s' не является '%s', игнорирование."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Не удалось создать '%s': %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "Ошибка при изменении списка групп: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "Не удалось изменить идентификатор группы GID: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "Не удалось изменить идентификатор пользователя UID: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "Успешное удаление привилегий администратора."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "Расширенный системный режим не поддерживается на этой платформе."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) не удалось: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "Ошибка разбора командной строки."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "Демон не запущен"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Демон запущен как PID %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Не удалось убить демон: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -209,157 +215,172 @@ msgstr ""
 "Эта программа не предназначена для запуска с правами администратора (если не "
 "указано в системе)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Необходимы права администратора."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start не поддерживается для системных элементов."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "Запущен в системном режиме, но --disallow-exit не задан!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr "Запущен в системном режиме, но --disallow-module-loading не задан!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "Запущен в системном режиме с принудительным отключением режима SHM!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 "Запущен в системном режиме с принудительным отключением времени выхода после "
 "простоя!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "Не удалось запросить stdio."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "Канал не удался: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() ветвь не удалась: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() чтение не удалось: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "Запуск демона не удался."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "Успешный запуск демона."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() чтение не удалось: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Хост компиляции: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "Компиляция CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "Запущен на хосте: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "Найдено процессоров: %u."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "Размер страницы: %lu байт"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Скомпилировано с поддержкой Valgrind: да"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Скомпилировано с поддержкой Valgrind: нет"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Запуск в режиме Valgrind: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "Запущен на хосте: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Оптимизированная сборка: да"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Оптимизированная сборка: нет"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG задан, все ассерты запрещены."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH задан, запрещены только fast path ассерты."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "Все ассерты разрешены."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "Не удалось получить ID машины"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "ID машины %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "ID сессии %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Использование каталога изолированного окружения %s."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "Использование заданного каталога %s."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "Использование каталога модулей %s."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Запуск в системном режиме: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -375,15 +396,15 @@ msgstr ""
 "Пожалуйста прочитайте http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode "
 "для объяснения, почему системный режим обычно является плохой идеей."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() не удалось."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Доступен свежий таймер высокого разрешения! Приятного аппетита!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -391,27 +412,27 @@ msgstr ""
 "Братан, твоё ядро воняет! Сегодняшняя рекомендация шефа - ядро с включенным "
 "таймером высокого разрешения!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() не удалась."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "Ошибка инициализации демона."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "Запуск демона без каких-либо загружаемых модулей, отказ от работы."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "Запуск демона завершён."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "Завершение демона инициализировано."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "Демон завершён."
 
@@ -668,72 +689,77 @@ msgstr "DEPRECATION WARNING: %s\n"
 msgid "Path: %s\n"
 msgstr "Путь: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Недопустимый журнал '%s'."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Недопустимый аргумент протоколирования '%s'."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Недопустимый метод ресэмплирования '%s'."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] Недопустимый rlimit '%s'."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit не поддерживается на этой платформе."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Недопустимый формат сэмпла '%s'."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Неверная частота дискретизации '%s'."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Неверные сэмпл-каналы '%s'."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Неверная схема каналов '%s'."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Неверное число фрагментов '%s'."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Недопустимый размер фрагмента '%s'."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Недопустимый точный уровень '%s'."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Неверная частота дискретизации '%s'."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Не удалось открыть файл конфигурации: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -741,7 +767,7 @@ msgstr ""
 "В указанной схеме каналов число каналов отличается от числа каналов по "
 "умолчанию."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Прочитать из файла конфигурации: %s ###\n"
@@ -787,8 +813,8 @@ msgid "Rear Right"
 msgstr "Сзади право"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Сабвуфер"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1133,191 +1159,191 @@ msgstr "XOpenDisplay() не удалось"
 msgid "Failed to parse cookie data"
 msgstr "Не удалось разобрать данные cookie"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Не удалось открыть файл конфигурации '%s': %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Cookie не загружены. Попытка подключения без них."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "Получено сообщение для неизвестного расширения '%s'"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Не удалось создать туннель для потока: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "Поток воспроизведения туннелирован."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "Туннелирование соединения с сервером."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() не удалось: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() не удалось: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() не удалось: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Поток успешно создан."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() не удалось: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Показатели буфера: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Показатели буфера: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "Использование семплов '%s', схемы каналов '%s'."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Соединён с устройством %s (%u, %sожидание)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "Ошибка потока: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Поток приостановлен.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "Поток возобновлён.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "Поток недогружен.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "Поток переполнен.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "Поток запущен.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Поток перемещён на устройство %s (%u, %sожидание).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "not "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Атрибуты буфера потока изменены.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "Соединение установлено.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() не удалось: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() не удалось: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() не удалось: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Ошибка подключения: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "Достигнут конец файла."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() не удалось: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "Сигнал получен, выход."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "Не удалось получить задержку: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Время: %0.3f с; задержка: %0.0f мкс."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() не удалось: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1369,10 +1395,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [options]\n"
@@ -1431,7 +1461,7 @@ msgstr ""
 "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1442,68 +1472,68 @@ msgstr ""
 "Скомпилировано с libpulse %s\n"
 "Связано с libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Неверное имя клиента '%s'"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Неверное имя потока '%s'"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Неверная схема каналов '%s'"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Неверное значение задержки '%s'"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Неверная спецификация времени процесса '%s'"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Неверное свойство '%s'"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Неизвестный формат файла %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Неверная спецификация сэмпла"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Слишком много аргументов."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "Ошибка создания спецификации сэмпла для файла."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "Не удалось открыть аудио файл."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
@@ -1511,104 +1541,104 @@ msgstr ""
 "Предупреждение: заданная спецификация сэмпла будет перезаписана "
 "спецификацией из файла."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "Не удалось определить спецификацию сэмпла из файла."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "Предупреждение: не удалось определить схему каналов из файла."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "Схема каналов не соответствует спецификации сэмпла"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "Предупреждение: не удалось записать схему каналов в файл."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
 msgid ""
 "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
 "Открытие потока %s со спецификацией сэмплов '%s' и схемой каналов '%s'."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "запись"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "воспроизведение"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() не удалось."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() не удалось."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() не удалось."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() не удалось: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() не удалось."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() не удалось."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "Не удаётся приостановить: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "Не удаётся возобновить: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr ""
 "ПРЕДУПРЕЖДЕНИЕ: Аудио сервер не является локальным, не приостанавливается.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Ошибка соединения: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "Получен сигнал для остановки, выход.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "ПРЕДУПРЕЖДЕНИЕ: Дочерний процесс отменён по сигналу %u\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1627,7 +1657,7 @@ msgstr ""
 "to\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1638,50 +1668,61 @@ msgstr ""
 "Скомпилировано с libpulse %s\n"
 "Связано с libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() не удалось.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() не удалось.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() не удалось.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Не удалось получить статистику: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "Сейчас используется: %u блоков содержащих всего %s байт.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "Выделено за всё время: %u блоков содержащих всего %s байт.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Размер кэша сэмплов: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "Не удалось получить информацию о сервере: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1689,7 +1730,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Имя пользователя: %s\n"
 "Имя хоста: %s\n"
@@ -1701,12 +1742,12 @@ msgstr ""
 "Источник по умолчанию: %s\n"
 "Cookie: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Не удалось получить информацию об аудиоприёмнике: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1745,22 +1786,22 @@ msgstr ""
 "\tСвойства:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tПорты:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tАктивный порт: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "Не удалось получить информацию об источнике: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1799,20 +1840,20 @@ msgstr ""
 "\tСвойства:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "н/д"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "Не удалось получить информацию о модуле: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1829,12 +1870,12 @@ msgstr ""
 "\tСвойства:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "Не удалось получить информацию о клиенте: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1849,12 +1890,12 @@ msgstr ""
 "\tСвойства:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "Не удалось получить информацию о карте: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1871,22 +1912,22 @@ msgstr ""
 "\tСвойства:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tПрофили:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tАктивный профиль: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Не удалось получить информацию о вводе аудиоприёмника: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1923,12 +1964,12 @@ msgstr ""
 "\tСвойства:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "Не удалось получить информацию о выходе источника: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1957,12 +1998,12 @@ msgstr ""
 "\tСвойства:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Не удалось получить информацию о сэмпле: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1993,26 +2034,80 @@ msgstr ""
 "\tСвойства:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Не удалось: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Не удалось загрузить сэмпл: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "Преждевременный конец файла"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Неверный сервер"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "Получен сигнал для остановки, выход."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2035,6 +2130,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2074,7 +2170,7 @@ msgstr ""
 "  -n, --client-name=NAME                How to call this client on the "
 "server\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2085,50 +2181,50 @@ msgstr ""
 "Скомпилировано с libpulse %s\n"
 "Связано с libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Пожалуйста укажите файл сэмпла для загрузки"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Не удалось открыть звуковой файл."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "Предупреждение: не удалось определить спецификации сэмплов из файла."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "Вы должны указать имя сэмпла для воспроизведения"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "Вы должны указать имя сэмпла для удаления"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "Вы должны указать индекс ввода аудиоприёмника и аудиоприёмник"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "Вы должны указать индекс вывода источника и источник"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "Вы должны указать имя модуля и аргументы"
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "Вы должны указать индекс модуля"
 
-#: ../src/utils/pactl.c:1090
+#: ../src/utils/pactl.c:1183
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 "Вы не можете указать более одного аудиоприёмника. Вы должны указать "
 "логическое значение."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
@@ -2136,57 +2232,57 @@ msgstr ""
 "Вы не можете указать более одного источника. Вы должны указать логическое "
 "значение."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "Вы должны указать имя/индекс карты и имя профиля"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "Вы должны указать имя/индекс аудиоприёмника и имя порта"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "Вы должны указать имя/индекс источника и имя порта"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "Вы должны указать имя/индекс аудиоприёмника и громкость"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "Неверное значение громкости"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "Вы должны указать имя/индекс источника и громкость"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "Вы должны указать индекс ввода аудиоприёмника и громкость"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "Неверный индекс ввода аудиоприёмника"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "Вы должны указать имя/индекс аудиоприёмника и выключить логический"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "Вы должны указать имя/индекс источника и выключить логический"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "Вы должны указать индекс ввода аудиоприёмника и выключить логический"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "Неверная спецификация индекса ввода аудиоприёмника"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "Не указаны правильные команды."
 
@@ -2269,46 +2365,46 @@ msgstr "Не удалось загрузить данные cookie\n"
 msgid "Not yet implemented.\n"
 msgstr "Ещё не выполнено.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
 "Нет запущенного демона PulseAudio или не запущен в качестве сессионного "
 "демона."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "Не удалось убить демон PulseAudio."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "Демон не отвечает."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "Cannot access autospawn lock."
 
@@ -2347,38 +2443,42 @@ msgstr ""
 "или другое значение < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Выключено"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "Воспроизведение высокого качества (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "Запись высокого качества (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Дуплексная телефония (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "Звуковой сервер PulseAudio"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "Устройства вывода"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "Устройства ввода"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "Аудио на @HOSTNAME@"
 
@@ -2442,132 +2542,159 @@ msgstr "Усилитель"
 msgid "No Amplifier"
 msgstr "Нет усилителя"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "Усиление"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "Нет усиления"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "Аналоговые наушники"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "Аналоговый ввод"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "Аналоговый микрофон"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "Аналоговый линейный вход"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "Аналоговое радио"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "Аналоговое видео"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "Аналоговый вывод"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "Аналоговые наушники"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "Аналоговый вывод (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "Аналоговый вывод моно"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Аналоговое стерео"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Аналоговое моно"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Аналоговое стерео"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "Аналоговый объёмный 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "Аналоговый объёмный 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "Аналоговый объёмный 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Аналоговый объёмный 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Аналоговый объёмный 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Аналоговый объёмный 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Аналоговый объёмный 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "Аналоговый объёмный 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "Аналоговый объёмный 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "Аналоговый объёмный 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Аналоговый объёмный 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Цифровое стерео (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Цифровой объёмный 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Цифровой объёмный 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Цифровой объёмный 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Цифровое стерео (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "Аналоговый моно дуплекс"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "Аналоговый стерео дуплекс"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Цифровой стерео дуплекс (IEC958)"
+
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Сабвуфер"
diff --git a/po/sr.po b/po/sr.po
index 820b14d..ed1b2b1 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-30 10:22+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-10-30 22:51+0100\n"
 "Last-Translator: Miloš Komarčević <kmilos at gmail.com>\n"
 "Language-Team: Serbian (sr) <fedora-trans-sr at redhat.com>\n"
@@ -18,12 +18,12 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
 "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -36,7 +36,7 @@ msgstr ""
 "Ово је највероватније грешка у „%s“ ALSA управљачком програму. Пријавите "
 "овај проблем ALSA програмерима."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -49,7 +49,7 @@ msgstr ""
 "Ово је највероватније грешка у „%s“ ALSA управљачком програму. Пријавите "
 "овај проблем ALSA програмерима."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -96,11 +96,11 @@ msgstr "Узорак NULL сливника"
 msgid "Null Output"
 msgstr "Празан излаз"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Унутрашњи звук"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Модем"
 
@@ -116,92 +116,98 @@ msgstr "Неуспешно смештање новог dl учитавача."
 msgid "Failed to add bind-now-loader."
 msgstr "Неуспешно додавање „повежи одмах“ учитавача."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Добих сигнал %s."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Напуштам."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Не могу наћи корисника „%s“."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Не могу наћи групу „%s“."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Нађени су корисник „%s“ (UID %lu) и група „%s“ (GID %lu)."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "GID корисника „%s“ се не поклапа са групом „%s“."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "Лични директоријум корисника „%s“ није „%s“, занемарујем."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Неуспешно прављење „%s“: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "Неуспешна промена групног списка: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "Неуспешна промена GID-а: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "Неуспешна промена UID-а: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "Успешно одбачена root овлашћења."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "Режим за читав систем није подржан на овој платформи."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) није успело: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "Неуспешно тумачење командне линије."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "Демон није покренут"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Демон је покренут са PID-ом %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Неуспешно убијање демона: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -209,158 +215,173 @@ msgstr ""
 "Није намеравано да се овај програм покреће из root налога (осим у случају "
 "када је --system наведено)"
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Потребна су root овлашћења."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start није подржано за системске примерке."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "Покренуто у системском режиму, али --disallow-exit није постављено!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 "Покренуто у системском режиму, али --disallow-module-loading није постављено!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "Покренуто у системском режиму, присилно онемогућујем SHM режим!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 "Покренуто у системском режиму, присилно онемогућујем гашење после одређеног "
 "времена мировања!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "Неуспешно проналажење стандардног улаза/излаза."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "Неуспешно пуштање података кроз цев: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "Неуспела функција fork(): %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "Неуспела функција read(): %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "Неуспешно покретање демона."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "Демон успешно покренут."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "Неуспела функција read(): %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Ово је PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Домаћин компајлирања: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "CFLAGS компајлирања: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "Покренут на домаћину: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "Нашао %u процесор(а)"
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "Величина странице је %lu бајтова"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Компајлирано са подршком за Valgrind: да"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Компајлирано са подршком за Valgrind: не"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Покренут у Valgrind режиму: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "Покренут на домаћину: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Оптимизована изградња: да"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Оптимизована изградња: не"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG дефинисан, сва обавештења искључена."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH дефинисан, само обавештења брзе путање искључена."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "Сва обавештења омогућена."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "Неуспешно добављање ИБ машине"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "ИБ машине је %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "ИБ сесије је %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Користи се %s извршни директоријум."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "Користи се %s директоријум стања."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "Користи се %s директоријум модула."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Покренуто у системском режиму: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -376,15 +397,15 @@ msgstr ""
 "Прочитајте http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode ради "
 "објашњења зашто је системски режим обично лоша идеја."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "Неуспела функција pa_pid_file_create()."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Доступни су нови бројачи високе резолуције! Пријатно!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -392,27 +413,27 @@ msgstr ""
 "Ваше језгро није добро подешено за pulseaudio! Препоручује Вам се да "
 "користите Linux језгро са омогућеним бројачима високе резолуције."
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "Неуспела функција pa_core_new()."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "Неуспешно покретање демона."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "Демон је покренут без иједног учитаног модула, одбија да ради."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "Покретање демона успешно."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "Покренуто гашење демона."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "Рад демона је прекинут."
 
@@ -678,72 +699,77 @@ msgstr "УПОЗОРЕЊЕ О ПРЕВАЗИЛАЖЕЊУ: %s\n"
 msgid "Path: %s\n"
 msgstr "Путања: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Неисправан циљни дневник „%s“."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Неисправан ниво опширности у дневнику „%s“."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Неисправан начин дискретизације „%s“."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] Неисправан rlimit „%s“."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit није подржан на овој платформи."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Неисправан формат узорка „%s“."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Неисправна учестаност дискретизације „%s“."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Неисправни канали узорка „%s“."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Неисправна мапа канала „%s“."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Неисправан број одломака „%s“."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Неисправна величина одломка „%s“."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Неисправан ниво приоритета „%s“."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Неисправна учестаност дискретизације „%s“."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Неуспело отварање датотеке подешавања: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -751,7 +777,7 @@ msgstr ""
 "Наведена мапа канала има нема исти број канала као што је наведено у "
 "подразумеваном броју канала."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Прочитај из датотеке подешавања: %s ###\n"
@@ -797,8 +823,8 @@ msgid "Rear Right"
 msgstr "Позадински десни"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Звучник за ниске фреквенције"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1143,191 +1169,191 @@ msgstr "Неуспела функција XOpenDisplay()"
 msgid "Failed to parse cookie data"
 msgstr "Неуспешно тумачење података из колачића"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Неуспешно отварање датотеке подешавања „%s“: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Колачић није учитан. Покушавам се повезати без колачића."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "Примио поруку за непознати локал „%s“"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Неуспешно исушивање тока: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "Репродукциони ток је исушен."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "Веза до сервера се исушује."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "Неуспела функција pa_stream_write(): %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "Неуспела функција pa_stream_write(): %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "Неуспела функција pa_stream_peek(): %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Ток је успешно направљен."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "Неуспела функција pa_stream_get_buffer_attr(): %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Мере бафера: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Мере бафера: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "Користим следеће параметре узорка „%s“ и мапу канала „%s“."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Прикључен на уређај %s (%u, %s обустављено)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "Грешка тока: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Уређај тока обустављен.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "Уређај тока настављен.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "Ток није попуњен.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "Ток се прелива.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "Ток је покренут.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Ток пребачен на уређај %s (%u, %s обустављено).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "није"
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Параметри бафера тока су промењени.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "Веза успостављена.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "Неуспела функција pa_stream_new(): %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "Неуспела функција pa_stream_connect_playback(): %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "Неуспела функција pa_stream_connect_record(): %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Неуспешно повезивање: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "Добих EOF."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "Неуспела функција write(): %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "Добих сигнал, излазим."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "Не могу добити вредност кашњења: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Време: %0.3f s; Кашњење: %0.0f us."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "Неуспела функција pa_stream_update_timing_info(): %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1379,10 +1405,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [опције]\n"
@@ -1440,7 +1470,7 @@ msgstr ""
 "      --list-file-formats               Испиши све доступне формате "
 "података.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1451,68 +1481,68 @@ msgstr ""
 "Компајлирано са libpulse %s\n"
 "Повезано са libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Неисправно име клијента „%s“"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Неисправно име тока „%s“"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Неисправна мапа канала „%s“"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Неисправан параметар кашњења „%s“"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Неисправан параметар за време процеса „%s“"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Неисправно својство „%s“"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Непознат %s формат датотеке."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Неисправан параметар узорка"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Превише аргумената."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "Није успело прављење параметара узорка за датотеку."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "Није успело отварање звучне датотеке."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
@@ -1520,102 +1550,102 @@ msgstr ""
 "Упозорење: наведени параметри узорка ће бити пребрисани параметрима из "
 "датотеке."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "Неуспешно утврђивање параметара узорка из датотеке."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "Упозорење: Неуспешно утврђивање мапе канала из датотеке."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "Мапа канала се не поклапа са параметрима узорка"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "Упозорење: Неуспешно записивање мапе канала у датотеку."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
 msgid ""
 "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "Отварам ток %s са параметрима узорка „%s“ и мапом канала „%s“."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "снима"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "пушта"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "Неуспела функција pa_mainloop_new()."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "Неуспела функција io_new()."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "Неуспела функција pa_context_new()."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "Неуспела функција pa_context_connect(): %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "Неуспела функција pa_context_new()."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "Неуспела функција pa_mainloop_run()."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "Неуспешно заустављање: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "Неуспешно настављање: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "УПОЗОРЕЊЕ: Звучни сервер није локални, не заустављам.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Неуспешно повезивање: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "Добих SIGINT, излазим.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "УПОЗОРЕЊЕ: Потлачени процес је прекинут сигналом %u\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1634,7 +1664,7 @@ msgstr ""
 "повезати\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1645,50 +1675,61 @@ msgstr ""
 "Компајлирано са libpulse %s\n"
 "Повезано са libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "Неуспела функција pa_mainloop_new().\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "Неуспела функција pa_context_new().\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "Неуспела функција pa_mainloop_run().\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Неуспешно добављање статистике: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "Тренутно у употреби: %u блокова садржи укупно %s бајтова.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "Смештено од покретања: %u блокова садржи укупно %s бајтова.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Величина кеш меморије узорка: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "Неуспешно добављање података о серверу: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1696,7 +1737,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Корисничко име: %s\n"
 "Име домаћина: %s\n"
@@ -1708,12 +1749,12 @@ msgstr ""
 "Подразумевани извор: %s\n"
 "Колачић: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Неуспешно добављање података о сливнику: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1752,22 +1793,22 @@ msgstr ""
 "\tСвојства:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tПортови:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tАктивни порт: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "Неуспешно добављање података о извору: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1806,20 +1847,20 @@ msgstr ""
 "\tСвојства:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "непознато"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "Неуспешно добављање података о модулу: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1836,12 +1877,12 @@ msgstr ""
 "\tСвојства:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "Неуспешно добављање података о клијенту: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1856,12 +1897,12 @@ msgstr ""
 "\tСвојства:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "Неуспешно добављање података о картици: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1878,22 +1919,22 @@ msgstr ""
 "\tСвојства:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tПрофили:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tАктивни профил: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Неуспешно добављање података о улазу сливника: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1930,12 +1971,12 @@ msgstr ""
 "\tСвојства:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "Неуспешно добављање података о излазу извора: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1964,12 +2005,12 @@ msgstr ""
 "\tСвојства:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Неуспешно добављање података о узорку: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -2000,26 +2041,80 @@ msgstr ""
 "\tСвојства:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Неуспех: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Није успело постављање узорка: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "Прерани крај датотеке"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Сервер неисправан"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "Добих SIGINT, излазим."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2042,6 +2137,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2081,7 +2177,7 @@ msgstr ""
 "  -n, --client-name=ИМЕ                 Како назвати овог клијента на "
 "серверу\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2092,106 +2188,106 @@ msgstr ""
 "Компајлирано са libpulse %s\n"
 "Повезано са libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Наведите датотеку узорка коју треба учитати"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Није успело отварање звучне датотеке."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "Упозорење: Неуспешно утврђивање параметара узорка из датотеке."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "Морате навести име узорка којег желите репродуковати"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "Морате навести име узорка којег желите уклонити"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "Морате навести индекс улаза сливника и сливник"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "Морате навести индекс излаза извора и извор"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "Морате навести име и аргументе модула."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "Морате навести индекс модула"
 
-#: ../src/utils/pactl.c:1090
+#: ../src/utils/pactl.c:1183
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 "Не можете навести више од једног сливника. Морате навести логичку вредност."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
 msgstr ""
 "Не можете навести више од једног извора. Морате навести логичку вредност."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "Морате навести име/индекс картице и име профила"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "Морате навести име/индекс сливника и име порта"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "Морате навести име/индекс извора и име порта"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "Морате навести име/индекс сливника и јачину"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "Неисправан параметар јачине"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "Морате навести име/индекс извора и јачину"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "Морате навести индекс улаза сливника и јачину"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "Неисправан индекс улаза сливника"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "Морате навести име/индекс сливника и логичку вредност за искључивање"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "Морате навести име/индекс извора и логичку вредност за искључивање"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "Морате навести индекс улаза сливника и логичку вредност за искључивање"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "Неисправан параметар индекса улаза сливника"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "Није наведена исправна наредба."
 
@@ -2276,45 +2372,45 @@ msgstr "Неуспешно учитавање датотека колачића\
 msgid "Not yet implemented.\n"
 msgstr "Није још имплементирано.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
 "Нема покренутог PulseAudio демона, или се не извршава као демон сесије."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "Није успело убијање PulseAudio демона."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "Демон се не одазива."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "Није могуће приступити датотеци закључавања за самоумножавање."
 
@@ -2353,38 +2449,42 @@ msgstr ""
 "вратио 0 или неку другу вредност мању од min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Искључено"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "Репродукција високе тачности (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "Снимање високе тачности (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Двосмерно телефонирање (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio звучни систем"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "Излазни уређаји"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "Улазни уређаји"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "Аудио на @HOSTNAME@"
 
@@ -2448,132 +2548,159 @@ msgstr "Појачало"
 msgid "No Amplifier"
 msgstr "Без појачала"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "Подизање"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "Без подизања"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "Аналогне слушалице"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "Аналогни улаз"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "Аналогни микрофон"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "Аналогна линија у"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "Аналогни радио"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "Аналогни видео"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "Аналогни излаз"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "Аналогне слушалице"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "Аналогни излаз (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "Аналогни моно излаз"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Аналогни стерео"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Аналогни моно"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Аналогни стерео"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "Аналогни окружујући 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "Аналогни окружујући 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "Аналогни окружујући 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Аналогни окружујући 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Аналогни окружујући 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Аналогни окружујући 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Аналогни окружујући 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "Аналогни окружујући 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "Аналогни окружујући 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "Аналогни окружујући 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Аналогни окружујући 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Дигитални стерео (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Дигитални окружујући 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Дигитални окружујући 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Дигитални окружујући 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Дигитални стерео (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "Двосмерни аналогни моно"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "Двосмерни аналогни стерео"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Двосмерни дигитални стерео (IEC958)"
+
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Звучник за ниске фреквенције"
diff --git a/po/sr at latin.po b/po/sr at latin.po
index 45e83d6..c42db98 100644
--- a/po/sr at latin.po
+++ b/po/sr at latin.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-30 10:22+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-10-30 22:51+0100\n"
 "Last-Translator: Miloš Komarčević <kmilos at gmail.com>\n"
 "Language-Team: Serbian (sr) <fedora-trans-sr at redhat.com>\n"
@@ -18,12 +18,12 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
 "10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -36,7 +36,7 @@ msgstr ""
 "Ovo je najverovatnije greška u „%s“ ALSA upravljačkom programu. Prijavite "
 "ovaj problem ALSA programerima."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -49,7 +49,7 @@ msgstr ""
 "Ovo je najverovatnije greška u „%s“ ALSA upravljačkom programu. Prijavite "
 "ovaj problem ALSA programerima."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -96,11 +96,11 @@ msgstr "Uzorak NULL slivnika"
 msgid "Null Output"
 msgstr "Prazan izlaz"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Unutrašnji zvuk"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Modem"
 
@@ -116,92 +116,98 @@ msgstr "Neuspešno smeštanje novog dl učitavača."
 msgid "Failed to add bind-now-loader."
 msgstr "Neuspešno dodavanje „poveži odmah“ učitavača."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Dobih signal %s."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Napuštam."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Ne mogu naći korisnika „%s“."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Ne mogu naći grupu „%s“."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Nađeni su korisnik „%s“ (UID %lu) i grupa „%s“ (GID %lu)."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "GID korisnika „%s“ se ne poklapa sa grupom „%s“."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "Lični direktorijum korisnika „%s“ nije „%s“, zanemarujem."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Neuspešno pravljenje „%s“: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "Neuspešna promena grupnog spiska: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "Neuspešna promena GID-a: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "Neuspešna promena UID-a: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "Uspešno odbačena root ovlašćenja."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "Režim za čitav sistem nije podržan na ovoj platformi."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) nije uspelo: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "Neuspešno tumačenje komandne linije."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "Demon nije pokrenut"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Demon je pokrenut sa PID-om %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Neuspešno ubijanje demona: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -209,159 +215,174 @@ msgstr ""
 "Nije nameravano da se ovaj program pokreće iz root naloga (osim u slučaju "
 "kada je --system navedeno)"
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Potrebna su root ovlašćenja."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start nije podržano za sistemske primerke."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "Pokrenuto u sistemskom režimu, ali --disallow-exit nije postavljeno!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 "Pokrenuto u sistemskom režimu, ali --disallow-module-loading nije "
 "postavljeno!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "Pokrenuto u sistemskom režimu, prisilno onemogućujem SHM režim!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 "Pokrenuto u sistemskom režimu, prisilno onemogućujem gašenje posle određenog "
 "vremena mirovanja!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "Neuspešno pronalaženje standardnog ulaza/izlaza."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "Neuspešno puštanje podataka kroz cev: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "Neuspela funkcija fork(): %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "Neuspela funkcija read(): %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "Neuspešno pokretanje demona."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "Demon uspešno pokrenut."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "Neuspela funkcija read(): %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Ovo je PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Domaćin kompajliranja: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "CFLAGS kompajliranja: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "Pokrenut na domaćinu: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "Našao %u procesor(a)"
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "Veličina stranice je %lu bajtova"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Kompajlirano sa podrškom za Valgrind: da"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Kompajlirano sa podrškom za Valgrind: ne"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Pokrenut u Valgrind režimu: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "Pokrenut na domaćinu: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Optimizovana izgradnja: da"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Optimizovana izgradnja: ne"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG definisan, sva obaveštenja isključena."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH definisan, samo obaveštenja brze putanje isključena."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "Sva obaveštenja omogućena."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "Neuspešno dobavljanje IB mašine"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "IB mašine je %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "IB sesije je %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Koristi se %s izvršni direktorijum."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "Koristi se %s direktorijum stanja."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "Koristi se %s direktorijum modula."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Pokrenuto u sistemskom režimu: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -377,15 +398,15 @@ msgstr ""
 "Pročitajte http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode radi "
 "objašnjenja zašto je sistemski režim obično loša ideja."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "Neuspela funkcija pa_pid_file_create()."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Dostupni su novi brojači visoke rezolucije! Prijatno!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -393,27 +414,27 @@ msgstr ""
 "Vaše jezgro nije dobro podešeno za pulseaudio! Preporučuje Vam se da "
 "koristite Linux jezgro sa omogućenim brojačima visoke rezolucije."
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "Neuspela funkcija pa_core_new()."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "Neuspešno pokretanje demona."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "Demon je pokrenut bez ijednog učitanog modula, odbija da radi."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "Pokretanje demona uspešno."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "Pokrenuto gašenje demona."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "Rad demona je prekinut."
 
@@ -679,72 +700,77 @@ msgstr "UPOZORENJE O PREVAZILAŽENJU: %s\n"
 msgid "Path: %s\n"
 msgstr "Putanja: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Neispravan ciljni dnevnik „%s“."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Neispravan nivo opširnosti u dnevniku „%s“."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Neispravan način diskretizacije „%s“."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] Neispravan rlimit „%s“."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit nije podržan na ovoj platformi."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Neispravan format uzorka „%s“."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Neispravna učestanost diskretizacije „%s“."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Neispravni kanali uzorka „%s“."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Neispravna mapa kanala „%s“."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Neispravan broj odlomaka „%s“."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Neispravna veličina odlomka „%s“."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Neispravan nivo prioriteta „%s“."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Neispravna učestanost diskretizacije „%s“."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Neuspelo otvaranje datoteke podešavanja: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -752,7 +778,7 @@ msgstr ""
 "Navedena mapa kanala ima nema isti broj kanala kao Å¡to je navedeno u "
 "podrazumevanom broju kanala."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Pročitaj iz datoteke podešavanja: %s ###\n"
@@ -798,8 +824,8 @@ msgid "Rear Right"
 msgstr "Pozadinski desni"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Zvučnik za niske frekvencije"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1144,191 +1170,191 @@ msgstr "Neuspela funkcija XOpenDisplay()"
 msgid "Failed to parse cookie data"
 msgstr "Neuspešno tumačenje podataka iz kolačića"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Neuspešno otvaranje datoteke podešavanja „%s“: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Kolačić nije učitan. Pokušavam se povezati bez kolačića."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "Primio poruku za nepoznati lokal „%s“"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Neuspešno isušivanje toka: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "Reprodukcioni tok je isušen."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "Veza do servera se isušuje."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "Neuspela funkcija pa_stream_write(): %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "Neuspela funkcija pa_stream_write(): %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "Neuspela funkcija pa_stream_peek(): %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Tok je uspešno napravljen."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "Neuspela funkcija pa_stream_get_buffer_attr(): %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Mere bafera: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Mere bafera: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "Koristim sledeće parametre uzorka „%s“ i mapu kanala „%s“."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "Priključen na uređaj %s (%u, %s obustavljeno)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "Greška toka: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Uređaj toka obustavljen.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "Uređaj toka nastavljen.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "Tok nije popunjen.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "Tok se preliva.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "Tok je pokrenut.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Tok prebačen na uređaj %s (%u, %s obustavljeno).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "nije"
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Parametri bafera toka su promenjeni.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "Veza uspostavljena.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "Neuspela funkcija pa_stream_new(): %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "Neuspela funkcija pa_stream_connect_playback(): %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "Neuspela funkcija pa_stream_connect_record(): %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Neuspešno povezivanje: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "Dobih EOF."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "Neuspela funkcija write(): %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "Dobih signal, izlazim."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "Ne mogu dobiti vrednost kašnjenja: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Vreme: %0.3f s; Kašnjenje: %0.0f us."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "Neuspela funkcija pa_stream_update_timing_info(): %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1380,10 +1406,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [opcije]\n"
@@ -1442,7 +1472,7 @@ msgstr ""
 "      --list-file-formats               Ispiši sve dostupne formate "
 "podataka.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1453,68 +1483,68 @@ msgstr ""
 "Kompajlirano sa libpulse %s\n"
 "Povezano sa libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Neispravno ime klijenta „%s“"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Neispravno ime toka „%s“"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Neispravna mapa kanala „%s“"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Neispravan parametar kašnjenja „%s“"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Neispravan parametar za vreme procesa „%s“"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Neispravno svojstvo „%s“"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Nepoznat %s format datoteke."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Neispravan parametar uzorka"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Previše argumenata."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "Nije uspelo pravljenje parametara uzorka za datoteku."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "Nije uspelo otvaranje zvučne datoteke."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
@@ -1522,102 +1552,102 @@ msgstr ""
 "Upozorenje: navedeni parametri uzorka će biti prebrisani parametrima iz "
 "datoteke."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "Neuspešno utvrđivanje parametara uzorka iz datoteke."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "Upozorenje: Neuspešno utvrđivanje mape kanala iz datoteke."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "Mapa kanala se ne poklapa sa parametrima uzorka"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "Upozorenje: Neuspešno zapisivanje mape kanala u datoteku."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
 msgid ""
 "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "Otvaram tok %s sa parametrima uzorka „%s“ i mapom kanala „%s“."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "snima"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "pušta"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "Neuspela funkcija pa_mainloop_new()."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "Neuspela funkcija io_new()."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "Neuspela funkcija pa_context_new()."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "Neuspela funkcija pa_context_connect(): %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "Neuspela funkcija pa_context_new()."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "Neuspela funkcija pa_mainloop_run()."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "Neuspešno zaustavljanje: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "Neuspešno nastavljanje: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "UPOZORENJE: Zvučni server nije lokalni, ne zaustavljam.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Neuspešno povezivanje: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "Dobih SIGINT, izlazim.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "UPOZORENJE: Potlačeni proces je prekinut signalom %u\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1636,7 +1666,7 @@ msgstr ""
 "povezati\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1647,50 +1677,61 @@ msgstr ""
 "Kompajlirano sa libpulse %s\n"
 "Povezano sa libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "Neuspela funkcija pa_mainloop_new().\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "Neuspela funkcija pa_context_new().\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "Neuspela funkcija pa_mainloop_run().\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Neuspešno dobavljanje statistike: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "Trenutno u upotrebi: %u blokova sadrži ukupno %s bajtova.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "Smešteno od pokretanja: %u blokova sadrži ukupno %s bajtova.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Veličina keš memorije uzorka: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "Neuspešno dobavljanje podataka o serveru: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1698,7 +1739,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Korisničko ime: %s\n"
 "Ime domaćina: %s\n"
@@ -1710,12 +1751,12 @@ msgstr ""
 "Podrazumevani izvor: %s\n"
 "Kolačić: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Neuspešno dobavljanje podataka o slivniku: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1754,22 +1795,22 @@ msgstr ""
 "\tSvojstva:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tPortovi:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tAktivni port: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "Neuspešno dobavljanje podataka o izvoru: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1808,20 +1849,20 @@ msgstr ""
 "\tSvojstva:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "nepoznato"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "Neuspešno dobavljanje podataka o modulu: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1838,12 +1879,12 @@ msgstr ""
 "\tSvojstva:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "Neuspešno dobavljanje podataka o klijentu: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1858,12 +1899,12 @@ msgstr ""
 "\tSvojstva:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "Neuspešno dobavljanje podataka o kartici: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1880,22 +1921,22 @@ msgstr ""
 "\tSvojstva:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tProfili:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tAktivni profil: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Neuspešno dobavljanje podataka o ulazu slivnika: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1932,12 +1973,12 @@ msgstr ""
 "\tSvojstva:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "Neuspešno dobavljanje podataka o izlazu izvora: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1966,12 +2007,12 @@ msgstr ""
 "\tSvojstva:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Neuspešno dobavljanje podataka o uzorku: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -2002,26 +2043,80 @@ msgstr ""
 "\tSvojstva:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Neuspeh: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Nije uspelo postavljanje uzorka: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "Prerani kraj datoteke"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Server neispravan"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "Dobih SIGINT, izlazim."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2044,6 +2139,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2083,7 +2179,7 @@ msgstr ""
 "  -n, --client-name=IME                 Kako nazvati ovog klijenta na "
 "serveru\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2094,107 +2190,107 @@ msgstr ""
 "Kompajlirano sa libpulse %s\n"
 "Povezano sa libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Navedite datoteku uzorka koju treba učitati"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Nije uspelo otvaranje zvučne datoteke."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "Upozorenje: Neuspešno utvrđivanje parametara uzorka iz datoteke."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "Morate navesti ime uzorka kojeg želite reprodukovati"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "Morate navesti ime uzorka kojeg želite ukloniti"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "Morate navesti indeks ulaza slivnika i slivnik"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "Morate navesti indeks izlaza izvora i izvor"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "Morate navesti ime i argumente modula."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "Morate navesti indeks modula"
 
-#: ../src/utils/pactl.c:1090
+#: ../src/utils/pactl.c:1183
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 "Ne možete navesti više od jednog slivnika. Morate navesti logičku vrednost."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
 msgstr ""
 "Ne možete navesti više od jednog izvora. Morate navesti logičku vrednost."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "Morate navesti ime/indeks kartice i ime profila"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "Morate navesti ime/indeks slivnika i ime porta"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "Morate navesti ime/indeks izvora i ime porta"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "Morate navesti ime/indeks slivnika i jačinu"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "Neispravan parametar jačine"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "Morate navesti ime/indeks izvora i jačinu"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "Morate navesti indeks ulaza slivnika i jačinu"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "Neispravan indeks ulaza slivnika"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "Morate navesti ime/indeks slivnika i logičku vrednost za isključivanje"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "Morate navesti ime/indeks izvora i logičku vrednost za isključivanje"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr ""
 "Morate navesti indeks ulaza slivnika i logičku vrednost za isključivanje"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "Neispravan parametar indeksa ulaza slivnika"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "Nije navedena ispravna naredba."
 
@@ -2279,45 +2375,45 @@ msgstr "Neuspešno učitavanje datoteka kolačića\n"
 msgid "Not yet implemented.\n"
 msgstr "Nije još implementirano.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
 "Nema pokrenutog PulseAudio demona, ili se ne izvršava kao demon sesije."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "Nije uspelo ubijanje PulseAudio demona."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "Demon se ne odaziva."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "Nije moguće pristupiti datoteci zaključavanja za samoumnožavanje."
 
@@ -2356,38 +2452,42 @@ msgstr ""
 "vratio 0 ili neku drugu vrednost manju od min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Isključeno"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "Reprodukcija visoke tačnosti (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "Snimanje visoke tačnosti (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Dvosmerno telefoniranje (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio zvučni sistem"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "Izlazni uređaji"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "Ulazni uređaji"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "Audio na @HOSTNAME@"
 
@@ -2451,132 +2551,159 @@ msgstr "Pojačalo"
 msgid "No Amplifier"
 msgstr "Bez pojačala"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "Podizanje"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "Bez podizanja"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "Analogne slušalice"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "Analogni ulaz"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "Analogni mikrofon"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "Analogna linija u"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "Analogni radio"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "Analogni video"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "Analogni izlaz"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "Analogne slušalice"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "Analogni izlaz (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "Analogni mono izlaz"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Analogni stereo"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Analogni mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Analogni stereo"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "Analogni okružujući 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "Analogni okružujući 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "Analogni okružujući 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Analogni okružujući 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Analogni okružujući 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Analogni okružujući 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Analogni okružujući 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "Analogni okružujući 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "Analogni okružujući 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "Analogni okružujući 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Analogni okružujući 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Digitalni stereo (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Digitalni okružujući 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Digitalni okružujući 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Digitalni okružujući 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Digitalni stereo (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "Dvosmerni analogni mono"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "Dvosmerni analogni stereo"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Dvosmerni digitalni stereo (IEC958)"
+
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Zvučnik za niske frekvencije"
diff --git a/po/sv.po b/po/sv.po
index d08b30e..eee7585 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-09-29 23:47+0200\n"
+"POT-Creation-Date: 2010-02-21 21:15+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,12 +15,12 @@ msgstr ""
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -29,7 +29,7 @@ msgid ""
 "to the ALSA developers."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -38,7 +38,7 @@ msgid ""
 "to the ALSA developers."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -76,12 +76,12 @@ msgstr ""
 msgid "Null Output"
 msgstr ""
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 #, fuzzy
 msgid "Internal Audio"
 msgstr "Internt fel"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr ""
 
@@ -98,92 +98,98 @@ msgstr "Misslyckades med att öppna ljudfil.\n"
 msgid "Failed to add bind-now-loader."
 msgstr ""
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Fick signal %s."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Avslutar."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Misslyckades med att hitta användaren \"%s\"."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Misslyckades med att hitta gruppen \"%s\"."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr ""
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr ""
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "Hemkatalogen för användaren \"%s\" är inte \"%s\", ignorerar."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Misslyckades med att skapa \"%s\": %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr ""
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr ""
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) misslyckades: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr ""
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr ""
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr ""
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -191,156 +197,171 @@ msgstr ""
 "Detta program är inte tänkt att köras som root (såvida inte --system har "
 "angivits)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 #, fuzzy
 msgid "Root privileges required."
 msgstr "Root-behörighet krävs."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start stöds inte för systeminstanser."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr ""
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr ""
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr ""
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "pipe misslyckades: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() misslyckades: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() misslyckades: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr ""
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr ""
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() misslyckades: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Detta är PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr ""
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr ""
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr ""
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr ""
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, c-format
+msgid "Running in VM: %s"
+msgstr ""
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr ""
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr ""
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr ""
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr ""
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr ""
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr ""
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr ""
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr ""
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr ""
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr ""
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr ""
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -350,41 +371,41 @@ msgid ""
 "explanation why system mode is usually a bad idea."
 msgstr ""
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() misslyckades."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr ""
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
 msgstr ""
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() misslyckades."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr ""
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr ""
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr ""
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr ""
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr ""
 
@@ -573,78 +594,83 @@ msgstr ""
 msgid "Path: %s\n"
 msgstr "Sökväg: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "Ogiltig server"
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Misslyckades med att öppna konfigurationsfil: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr ""
@@ -691,7 +717,7 @@ msgid "Rear Right"
 msgstr "Höger bak"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
+msgid "Subwoofer"
 msgstr ""
 
 #: ../src/pulse/channelmap.c:117
@@ -1038,192 +1064,192 @@ msgstr "XOpenDisplay() misslyckades"
 msgid "Failed to parse cookie data"
 msgstr ""
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Misslyckades med att öppna konfigurationsfilen \"%s\": %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr ""
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr ""
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, fuzzy, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Misslyckades med att hitta användaren \"%s\"."
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr ""
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr ""
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, fuzzy, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s\n"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, fuzzy, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() misslyckades: %s\n"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, fuzzy, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_write() misslyckades: %s\n"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, fuzzy, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() misslyckades: %s\n"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr ""
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, fuzzy, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() misslyckades: %s\n"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr ""
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr ""
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr ""
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr ""
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, fuzzy, c-format
 msgid "Stream error: %s"
 msgstr "Strömfel: %s\n"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, fuzzy, c-format
 msgid "Stream underrun.%s"
 msgstr "Strömfel: %s\n"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, fuzzy, c-format
 msgid "Stream overrun.%s"
 msgstr "Strömfel: %s\n"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "inte "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr ""
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, fuzzy, c-format
 msgid "Connection established.%s"
 msgstr "Anslutning etablerad.\n"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, fuzzy, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() misslyckades: %s\n"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, fuzzy, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() misslyckades: %s\n"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, fuzzy, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() misslyckades: %s\n"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, fuzzy, c-format
 msgid "Connection failure: %s"
 msgstr "Anslutningsfel: %s\n"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 #, fuzzy
 msgid "Got EOF."
 msgstr "Fick filslut.\n"
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, fuzzy, c-format
 msgid "write() failed: %s"
 msgstr "write() misslyckades: %s\n"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 #, fuzzy
 msgid "Got signal, exiting."
 msgstr "Fick signal %s."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, fuzzy, c-format
 msgid "Failed to get latency: %s"
 msgstr "Misslyckades med att få statistik: %s\n"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, fuzzy, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Tid: %0.3f sec; Latens: %0.0f ms  \r"
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, fuzzy, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() misslyckades: %s\n"
 
-#: ../src/utils/pacat.c:609
+#: ../src/utils/pacat.c:630
 #, c-format
 msgid ""
 "%s [options]\n"
@@ -1276,14 +1302,18 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1291,180 +1321,180 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, fuzzy, c-format
 msgid "Invalid client name '%s'"
 msgstr "Ogiltig server"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, fuzzy, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Ogiltig server"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, fuzzy, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Ogiltig server"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr ""
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, fuzzy, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Ogiltig server"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, fuzzy, c-format
 msgid "Invalid property '%s'"
 msgstr "Ogiltig server"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr ""
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 #, fuzzy
 msgid "Invalid sample specification"
 msgstr "Misslyckades med att få modulinformation: %s\n"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, fuzzy, c-format
 msgid "open(): %s"
 msgstr "open(): %s\n"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, fuzzy, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s\n"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 #, fuzzy
 msgid "Too many arguments."
 msgstr "För många argument.\n"
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 #, fuzzy
 msgid "Failed to generate sample specification for file."
 msgstr "Misslyckades med att få modulinformation: %s\n"
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 #, fuzzy
 msgid "Failed to open audio file."
 msgstr "Misslyckades med att öppna ljudfil.\n"
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
 msgstr ""
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 #, fuzzy
 msgid "Failed to determine sample specification from file."
 msgstr "Misslyckades med att få modulinformation: %s\n"
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr ""
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 #, fuzzy
 msgid "Channel map doesn't match sample specification"
 msgstr "Misslyckades med att få modulinformation: %s\n"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr ""
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
 msgid ""
 "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr ""
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr ""
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr ""
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 #, fuzzy
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() misslyckades.\n"
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 #, fuzzy
 msgid "io_new() failed."
 msgstr "io_new() misslyckades.\n"
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 #, fuzzy
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() misslyckades.\n"
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, fuzzy, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_new() misslyckades.\n"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 #, fuzzy
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_new() misslyckades.\n"
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 #, fuzzy
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() misslyckades.\n"
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Anslutningsfel: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1476,7 +1506,7 @@ msgid ""
 "\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1487,50 +1517,61 @@ msgstr ""
 "Kompilerad med libpulse %s\n"
 "Länkad med libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() misslyckades.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() misslyckades.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() misslyckades.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, fuzzy, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Misslyckades med att få statistik: %s\n"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, fuzzy, c-format
 msgid "Failed to get server information: %s"
 msgstr "Misslyckades med att få modulinformation: %s\n"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
+#, c-format
+msgid ""
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
 #, c-format
 msgid ""
-"User name: %s\n"
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1538,15 +1579,15 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, fuzzy, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Misslyckades med att få klientinformation: %s\n"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1568,22 +1609,22 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, fuzzy, c-format
 msgid "\tActive Port: %s\n"
 msgstr "pipe misslyckades: %s"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, fuzzy, c-format
 msgid "Failed to get source information: %s"
 msgstr "Misslyckades med att få modulinformation: %s\n"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1605,20 +1646,20 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr ""
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, fuzzy, c-format
 msgid "Failed to get module information: %s"
 msgstr "Misslyckades med att få modulinformation: %s\n"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1629,12 +1670,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, fuzzy, c-format
 msgid "Failed to get client information: %s"
 msgstr "Misslyckades med att få klientinformation: %s\n"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1644,12 +1685,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, fuzzy, c-format
 msgid "Failed to get card information: %s"
 msgstr "Misslyckades med att få modulinformation: %s\n"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1660,22 +1701,22 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, fuzzy, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "pipe misslyckades: %s"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, fuzzy, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Misslyckades med att få klientinformation: %s\n"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1696,12 +1737,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, fuzzy, c-format
 msgid "Failed to get source output information: %s"
 msgstr "Misslyckades med att få modulinformation: %s\n"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1718,12 +1759,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, fuzzy, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Misslyckades med att få modulinformation: %s\n"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1741,26 +1782,81 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, fuzzy, c-format
 msgid "Failure: %s"
 msgstr "Fel: %s\n"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, fuzzy, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Misslyckades med att hitta användaren \"%s\"."
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr ""
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr "sink"
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr "källa"
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+#, fuzzy
+msgid "source-output"
+msgstr "källa"
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Ogiltig server"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 #, fuzzy
 msgid "Got SIGINT, exiting."
 msgstr "Fick signal %s."
 
-#: ../src/utils/pactl.c:869
+#: ../src/utils/pactl.c:961
 #, c-format
 msgid ""
 "%s [options] stat\n"
@@ -1784,6 +1880,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -1794,7 +1891,7 @@ msgid ""
 "server\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1805,108 +1902,108 @@ msgstr ""
 "Kompilerad med libpulse %s\n"
 "Länkad med libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr ""
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 #, fuzzy
 msgid "Failed to open sound file."
 msgstr "Misslyckades med att öppna ljudfil.\n"
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 #, fuzzy
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "Misslyckades med att få modulinformation: %s\n"
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr ""
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr ""
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr ""
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr ""
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr ""
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr ""
 
-#: ../src/utils/pactl.c:1090
+#: ../src/utils/pactl.c:1183
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
 msgstr ""
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr ""
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr ""
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr ""
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr ""
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 #, fuzzy
 msgid "Invalid volume specification"
 msgstr "Misslyckades med att få modulinformation: %s\n"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr ""
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr ""
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr ""
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr ""
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr ""
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr ""
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 #, fuzzy
 msgid "Invalid sink input index specification"
 msgstr "Misslyckades med att få modulinformation: %s\n"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr ""
 
@@ -1982,44 +2079,44 @@ msgstr ""
 msgid "Not yet implemented.\n"
 msgstr "Ännu inte implementerad.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr ""
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr ""
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr ""
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, fuzzy, c-format
 msgid "poll(): %s"
 msgstr "fork(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr ""
 
@@ -2046,38 +2143,42 @@ msgid ""
 msgstr ""
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr ""
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr ""
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr ""
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr ""
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr ""
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr ""
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr ""
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr ""
 
@@ -2142,133 +2243,153 @@ msgstr ""
 msgid "No Amplifier"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+msgid "Bass Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+msgid "No Bass Boost"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+msgid "Headphones"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+msgid "Analog Speakers"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr ""
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr ""
 
@@ -2313,11 +2434,5 @@ msgstr ""
 #~ msgid "muted"
 #~ msgstr "tystad"
 
-#~ msgid "sink"
-#~ msgstr "sink"
-
-#~ msgid "source"
-#~ msgstr "källa"
-
 #~ msgid "socketpair(): %s"
 #~ msgstr "socketpair(): %s"
diff --git a/po/ta.po b/po/ta.po
index 1a88bf2..1fe6bc3 100644
--- a/po/ta.po
+++ b/po/ta.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.ta\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-13 08:56+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-11-13 16:54+0530\n"
 "Last-Translator: I. Felix <ifelix at redhat.com>\n"
 "Language-Team: Tamil <fedora-trans-ta at redhat.com>\n"
@@ -39,12 +39,12 @@ msgstr ""
 "\n"
 "\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -57,7 +57,7 @@ msgstr ""
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 "to the ALSA developers."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -70,7 +70,7 @@ msgstr ""
 "Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
 "to the ALSA developers."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -117,11 +117,11 @@ msgstr "கடிகார பூஜ்ஜிய சிங்"
 msgid "Null Output"
 msgstr "பூஜ்ஜிய வெளிப்பாடு"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "உட்புற ஆடியோ"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "மாதிரி"
 
@@ -137,246 +137,268 @@ msgstr "புதிய dl ஏற்றுபவரை ஒதுக்கிர
 msgid "Failed to add bind-now-loader."
 msgstr "இப்போது பிணைக்கும் ஏற்பியை சேர்ப்பதில் தோல்வி."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "%sக்கு சிக்னல் கிடைத்துவிட்டது."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "வெளியேறுதல்."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "'%s' பயனரை கண்டுபிடிப்பதில் தோல்வி."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "'%s' குழுவை கண்டுபிடிப்பதில் தோல்வி."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "'%s'பயனர் கண்டுபிடிக்கப்பட்டார் (UID %lu) மற்றும் குழு '%s' (GID %lu)."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "GID ன் பயனர் '%s' மற்றும் '%s' குழுவுடன் ஒத்து போகவில்லை."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "முகப்பு அடைவு பயனரான'%s' '%s'ஆல், புறக்கணிக்கப்படவில்லை."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "'%s'ஐ உருவாக்க முடியவில்லை: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "குழுப் பட்டியலை மாற்ற முடியவில்லை: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "GIDக்கு மாற்றுவதில் தோல்வி: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "UIDக்கு மாற்றுவதில் தோல்வி: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "ரூட் முன்னுரிமைகள் வெற்றிகரமாக விடப்பட்டது."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "இந்த தளத்தில் கணினியின் திறந்த முறைமை துணைபுரியவில்லை."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) தோல்வியுற்றது: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "கட்டளை வரியை மாற்றுவதில் தோல்வி."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "டோமோன் இயங்கவில்லை"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "PID %uவாக டோமோன் இயங்குகிறது"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "டோமோனுக்கு முடிவு கட்டுவதில் தோல்வி: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
 msgstr "இந்த நிரல் ரூட்டாக இயங்க முடியவில்லை (--system குறிப்பிடாத வரை)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "ரூட் முன்னுரிமைகள் தேவைப்படுகிறது."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start கணினி நிகழ்வில் துணைபுரியவில்லை."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "கணினி முறைமையில் இயங்குகிறது, ஆனால் --disallow-exit அமைக்கப்படவில்லை!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr "கணினி முறைமையில் இயங்குகிறது, ஆனால் --disallow-module-loading அமைக்கப்படவில்லை!"
+msgstr ""
+"கணினி முறைமையில் இயங்குகிறது, ஆனால் --disallow-module-loading அமைக்கப்படவில்லை!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "கணினி முறைமையில் இயங்குகிறது, SHM முறைமை செயல்நீக்குதல் கட்டாயப்படுத்துகிறது!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr "கணினி முறைமையில் இயங்குகிறது, வெறுமை நேரத்தை செயல்நீக்க கட்டாயப்படுத்துகிறது!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "stdioஐ பெற முடியவில்லை."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "பைப் தோல்வியுற்றது: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() தோல்வியுற்றது: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "வாசிப்பதில்() தோல்வியுற்றது: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "டோமோனை துவக்குவதில் தோல்வியுற்றது."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "டோமோனை வெற்றிகரமாக துவக்ககப்பட்டது."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "வாசிப்பதில்() தோல்வியுற்றது: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "இது தான் பள்ஸ் ஆடியோ %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "தொகுக்கப்பட்ட புரவலன்: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "தொகுப்பு CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "புரவலனாக இயங்குகிறத: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "CPUs %uவில் காணப்படுகிறது ."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "பக்க அளவுகள் %lu பைட்ஸ்"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Compiled with Valgrind support: yes"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Compiled with Valgrind support: no"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "valgrind முறைமையில் இயங்குகிறது: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "புரவலனாக இயங்குகிறத: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Optimized build: yes"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "சுருக்கமான உருவாக்கம்: இல்லை"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG வரையறுக்கப்பட்டது, அனைத்தும் உறுதியாக செயல்நீக்கப்பட்டது."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH வரையறுக்கப்பட்டது, விரைவு பாதை மட்டும் உறுதியாக செயல்நீக்கப்பட்டது."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "அனைத்து உறுதியாக செயல்படுகிறது."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "கணினி குறியீடை பெறுவதில் தோல்வி"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "கணினி குறியீடு %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "அமர்வு குறியீடு %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "ஓடும்நேரம்  %s அடைவை பயன்படுத்துகிறது."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "%s நிலை அடைவினை பயன்படுத்துகிறது."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "தொகுதி %s அடைவை பயன்படுத்துகிறது."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "கணினியின் முறைமையில் இயங்குகிறது: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -392,15 +414,15 @@ msgstr ""
 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
 "explanation why system mode is usually a bad idea."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() தோல்வியுற்றது."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "உயர்ந்த திரைத்திறன் நேரம்காட்டி கிடைக்கிளது! Bon appetit!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -408,27 +430,27 @@ msgstr ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() தோல்வியுற்றது."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "டோமோனை ஆரம்பிப்பதில் தோல்வி."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "டீமான் துவக்கம் எந்த தொகுதிகளும் ஏற்றப்படாமல், வேலையை நிராகரிக்கிறது."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "டோமோன் துவக்குவது முடிவடைந்தது."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "டோமோன் பணிநிறுத்தம் முனைகிறது."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "டோமோன் நீக்கப்பட்டுது."
 
@@ -685,72 +707,77 @@ msgstr "DEPRECATION WARNING: %s\n"
 msgid "Path: %s\n"
 msgstr "பாதை: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] தவறான பதிவு இலக்கு '%s'."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] தவறான பதிவு இலக்கு '%s'."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] தவறான மறுமாதிரி முறை '%s'."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] தவறான rlimit '%s'."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit இந்த தளத்தில் துணைபுரியவில்லை."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] தவறான மாதிரி முறை '%s'."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] தவறான மாதிரி விலை '%s'."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] தவறான மாதிரி சேனல்கள் '%s'."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] தவறான சேனல் படம் '%s'."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] பகுப்பு '%s'க்கு தவறான எண்"
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] தவறான பகுப்பு அளவு '%s'."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] தவறான நல்ல நிலை '%s'."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] தவறான மாதிரி விலை '%s'."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "கட்டமைக்கப்பட்ட கோப்பினை திறப்பதில் தோல்வி: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -758,7 +785,7 @@ msgstr ""
 "குறிப்பிட்ட முன்னிருப்பு சேனல் மேப் வேறுபட்ட சேனல்களின் எண்ணிக்கையை குறிப்பிட்ட "
 "முன்னிருப்பு சேனல்களின் எண்ணிக்கையை விட கொண்டுள்ளது"
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### கட்டமைப்பு கோப்பிலிருந்து வாசிக்கவும்: %s ###\n"
@@ -804,8 +831,8 @@ msgid "Rear Right"
 msgstr "பின் வலது"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "குறைந்த அலைவரிசை எம்மிட்டர்"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1150,191 +1177,191 @@ msgstr "XOpenகாட்சி() தோல்வியுற்றது"
 msgid "Failed to parse cookie data"
 msgstr "குக்கீ தரவை மாற்றுவதில் தோல்வியுற்றது"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "'%s'கட்டமைக்கப்பட்ட கோப்பினை திறக்க முடியவில்லை: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "குக்கி ஏற்றப்படவில்லை. இணைப்பில்லாமல் முயற்சிக்கிறது."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "தெரியாத தொடரிச்சியிலிருந்து '%s'க்கு செய்திகள் பெறப்பட்டன"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "ஸ்டீரிமை இழக்க முடியவில்லை: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "பின்னணி ஸ்டீரிம் இழக்கப்படுகிறது."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "சேவையகத்திற்கு இணைப்பு இழக்கப்படுகிறது."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() தோல்வியுற்றது: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_write() தோல்வியுற்றது: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() தோல்வியுற்றது: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "ஸ்டிரீம் வெற்றிகரமாக உருவாக்கப்பட்டது."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() தோல்வியுற்றது: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Buffer metrics: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "குறிப்பிட்ட குறிப்பு '%s', சேனல் வரைபடத்தை '%s'ஐ பயன்படுத்துகிறது."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "%s சாதனத்துடன் இணைக்கப்பட்டது (%u, %ssuspended)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "ஸ்டிரீம் பிழை: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "ஸ்டீரிம் சாதனம் இடைநீக்கப்பட்டது.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "ஸ்டீரிம் சாதனம் தொடர்கிறது.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "ஸ்டீரிம் இயங்குகிறது.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "ஸ்டீரிம் அதிகளவு இயங்கியது.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "ஸ்டிரீம் %s துவக்கப்பட்டது"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "ஸ்டிரீம் %s சாதனத்திற்கு நகர்ந்தது (%u, %ssuspended).%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "இல்லை"
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "ஸ்டீரிம் ஃபப்பர் பண்புகளை மாற்றப்பட்டது.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "இணைப்பு துவக்கப்பட்டது.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() தோல்வியுற்றது: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() தோல்வியுற்றது: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() தோல்வியுற்றது: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "இணைப்பதில் தோல்வி: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "EOF கிடைக்கப் பெற்றது"
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "எழுதுவதில் () தோல்வியுற்றது: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "சிக்னல் கிடைத்தது, வெளியேறுகிறது."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "லடன்சியை பெற முடியவில்லை: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Time: %0.3f sec; Latency: %0.0f usec."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() தோல்வி: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1386,10 +1413,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [options]\n"
@@ -1448,7 +1479,7 @@ msgstr ""
 "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1459,168 +1490,171 @@ msgstr ""
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "தவறான கிளையன் பெயர் '%s'"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "தவறான ஸ்டீரீம் பெயர் '%s'."
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "தவறான சேனல் வரைபடம் '%s'"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "தவறான லேடன்சி குறிப்பீடு '%s'"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "தவறான செயல் நேர குறிப்பீடு '%s'"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "தவறான தன்மை '%s'."
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "தெரியாத கோப்பு வடிவம் %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "தவறான மாதிரி குறிப்பீடு"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "நிறைய விவாதங்கள்."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "மாதிரி தகவலை பெற முடியவில்லை.: %s"
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "ஒலி கோப்பினை திறக்க முடியவில்லை."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
-msgstr "எச்சரிக்கை: கோப்பிலிருந்து குறிப்பீட்டுடன் குறிக்கிட்ட மாதிரி குறிப்பீடு மேலெழுதப்படலாம்."
+msgstr ""
+"எச்சரிக்கை: கோப்பிலிருந்து குறிப்பீட்டுடன் குறிக்கிட்ட மாதிரி குறிப்பீடு மேலெழுதப்படலாம்."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "கோப்பிலிருந்து மாதிரி குறிப்பீட்டை  வரையறுக்க முடியவில்லை."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "எச்சரிக்கை: கோப்பிலிருந்து சேனல் வரைபடத்தை வரையறுக்க முடியவில்லை."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "சேனல் வரைபடம் மாதிரி குறிப்பீட்டுடன் பொருந்தவில்லை"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "எச்சரிக்கை: கோப்புக்கு சேனல் வரைபடத்தை எழுத முடியவில்லை."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr "ஒரு %s ஸ்டீரம் மாதிரி குறிப்பீட்டை '%s' மற்றும் சேனல் வரைபட்டம் '%s' உடன் திறக்கிறது."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr ""
+"ஒரு %s ஸ்டீரம் மாதிரி குறிப்பீட்டை '%s' மற்றும் சேனல் வரைபட்டம் '%s' உடன் திறக்கிறது."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "ஒலிப்பதிவு"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "பிண்ணனி"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() தோல்வி."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() தோல்வியுற்றது."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() தோல்வி."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() தோல்வி: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() தோல்வியுற்றது."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() தோல்வி."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "நீக்க முடியவில்லை: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "தொடர முடியவில்லை: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "எச்சரிக்கை: ஒலி சேவையம் உள்ளமைவாக இல்லை, இடைநிறுத்தப்படவில்லை.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "இணைப்பதில் தோல்வி: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "SIGINT பெறப்பட்டது, வெளியேறுகிறது.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "எச்சரிக்கை: சேய் செயல் சிக்னல் %uஆல் முடிக்கப்பட்டது\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1638,7 +1672,7 @@ msgstr ""
 "  -s, --சேவையகம்=SERVER                   பெயரிடப்பட்ட சேவையகம் இணைக்கப்பட வேண்டும்\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1649,50 +1683,62 @@ msgstr ""
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() தோல்வி.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() தோல்வி.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() தோல்வி.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "புள்ளிவிவரத்தை பெற முடியவில்லை: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "தற்போது பயனிலுள்ளது: %u தொகுதிகள் %s பைட்களை மொத்தமாக கொண்டுள்ளது.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
-msgstr "வாழ்க்கை முழுவதும் ஒதுக்கப்பட்டது: %u தொகுதிகள் %s பைட்களை மொத்தமாக கொண்டுள்ளது.\n"
+msgstr ""
+"வாழ்க்கை முழுவதும் ஒதுக்கப்பட்டது: %u தொகுதிகள் %s பைட்களை மொத்தமாக கொண்டுள்ளது.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "மாதிரி இடையக அளவு: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "சேவையகத்தின் தகவலை பெற முடியவில்லை: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1700,7 +1746,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "பயனர் பெயர்: %s\n"
 "புரவலன் பெயர்: %s\n"
@@ -1712,12 +1758,12 @@ msgstr ""
 "முன்னிருப்பு மூலங்கள்: %s\n"
 "கூக்கி: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "சுருக்கமான தகவலை பெறு முடியவில்லை: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1756,22 +1802,22 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tPorts:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tசெயல்பாட்டிலுள்ள விவரக்குறிப்புகள்: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "மூலத்தின் தகவலை பெற இயலவில்லை: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1810,20 +1856,20 @@ msgstr ""
 "\tபண்புகள்:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n/a"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "தொகுதி தகவலை பெற முடியவில்லை: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1840,12 +1886,12 @@ msgstr ""
 "\tபண்புகள்:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "கிளையன்ட் தகவலை பெற முடியவில்லை: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1860,12 +1906,12 @@ msgstr ""
 "\tபண்புகள்:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "அட்டை தகவலை பெற முடியவில்லை: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1882,22 +1928,22 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tவிவரக்குறிப்புகள்:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tசெயல்பாட்டிலுள்ள விவரக்குறிப்புகள்: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "சிங்க் தகவலை பெற முடியவில்லை: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1934,12 +1980,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "மூல வெளிப்பாடு தகவலை பெற முடியவில்லை: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1968,12 +2014,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "மாதிரி தகவலை பெற முடியவில்லை.: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -2004,26 +2050,80 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "தோல்வி: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "மாதிரியை மேம்படுத்த முடியவில்லை: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "முன்னாக கோப்பு முடித்தல்"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "தவறான புரவலன்"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT பெறப்பட்டது, வெளியேறுகிறது."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2046,6 +2146,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2085,7 +2186,7 @@ msgstr ""
 "  -n, --client-name=NAME                How to call this client on the "
 "server\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2096,103 +2197,106 @@ msgstr ""
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "ஏற்றுவதற்கு ஒரு மாதிரி கோப்பினை குறிப்பிடவும்"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "ஒலி கோப்பினை திறக்க முடியவில்லை."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "எச்சரிக்கை: கோப்பிலிருந்து மாதிரி குறிப்பீட்டை வரையறுக்க முடியவில்லை."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "இயக்கிவதற்கு நீங்கள் ஒரு மாதிரி பெயர் குறிப்பிட வேண்டும்"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "நீக்குவதற்கு நீங்கள் ஒரு மாதிரி பெயர் குறிப்பிட வேண்டும்"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "நீங்கள் ஒரு சிங்க் உள்ளீடு சுட்டி மற்றும் ஒரு சிங்கை குறிப்பிட வேண்டும்"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "நீங்கள் ஒரு மூல வெளிப்பாடு சுட்டி மற்றும் ஒரு மூலத்தை குறிப்பிட வேண்டும்"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "தொகுதி பெயர் மற்றும் விவாதங்களை நீங்கள் குறிப்பிட வேண்டும்."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "தொகுதி அட்டவணையை நீங்கள் குறிப்பிட வேண்டும்"
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
-msgstr "ஒரு சிங்கிற்கு மேல் நீங்கள் குறிப்பிடக் கூடாது. பூலியன் மதிப்பை நீங்கள் குறிப்பிட வேண்டும்."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
+msgstr ""
+"ஒரு சிங்கிற்கு மேல் நீங்கள் குறிப்பிடக் கூடாது. பூலியன் மதிப்பை நீங்கள் குறிப்பிட வேண்டும்."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr "ஒரு மூலத்திற்கு மேல் நீங்கள் குறிப்பிடக் கூடாது. பூலியன் மதிப்பை நீங்கள் குறிப்பிட வேண்டும்."
+msgstr ""
+"ஒரு மூலத்திற்கு மேல் நீங்கள் குறிப்பிடக் கூடாது. பூலியன் மதிப்பை நீங்கள் குறிப்பிட வேண்டும்."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "ஒரு அட்டை பெயர்/ முன்பக்கம் மற்றும் ஒரு விவரச்சீட்டு பெயர் நீங்கள் குறிப்பிட வேண்டும்"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "நீங்கள் ஒரு சிங்க் பெயர்/ முன்பக்கம் மற்றும் ஒரு துறைப் பெயரை குறிப்பிட வேண்டும்"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "ஒரு மூலப் பெயர்/ முன்பக்கம் மற்றும் ஒரு துறைப் பெயர் நீங்கள் குறிப்பிட வேண்டும்"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "நீங்கள் ஒரு சிங்க் பெயர்/ முன்பக்கம் மற்றும் ஒரு துறைப் பெயரை குறிப்பிட வேண்டும்"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "தவறான தொகுதி குறிப்பீடு"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "ஒரு மூலப் பெயர்/ முன்பக்கம் மற்றும் ஒரு துறைப் பெயர் நீங்கள் குறிப்பிட வேண்டும்"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "நீங்கள் ஒரு சிங்க் உள்ளீடு சுட்டி மற்றும் ஒரு சிங்கை குறிப்பிட வேண்டும்"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "தவறான சுருக்க உள்ளீடு அட்டவணை"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "நீங்கள் ஒரு சிங்க் பெயர்/ முன்பக்கம் மற்றும் ஒரு துறைப் பெயரை குறிப்பிட வேண்டும்"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "ஒரு மூலப் பெயர்/ முன்பக்கம் மற்றும் ஒரு துறைப் பெயர் நீங்கள் குறிப்பிட வேண்டும்"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "நீங்கள் ஒரு சிங்க் உள்ளீடு சுட்டி மற்றும் ஒரு சிங்கை குறிப்பிட வேண்டும்"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "தவறான சுருக்க உள்ளீடு அட்டவணை குறிப்பீடு"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "சரியான கட்டளை குறிப்பிடபடவில்லை"
 
@@ -2275,44 +2379,44 @@ msgstr "குக்கீ தரவை ஏற்ற முடியவில்
 msgid "Not yet implemented.\n"
 msgstr "இன்னும் செயல்படுத்தபடவில்லை.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr "PulseAudio டீமான் இயங்கவில்லை, அல்லது அமர்வு டீமானாக இயங்கவில்லை."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "PulseAudio daemonஐ நிறுத்த முடியவில்லை."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "டோமோன் பதிலளிக்க மறுக்கிறது."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "autospawn பூட்டை அணுக முடியவில்லை."
 
@@ -2351,38 +2455,42 @@ msgstr ""
 "() 0 அல்லது வேறொரு மதிப்பு < min_avail திரும்பியது."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "ஆஃப்"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "High Fidelity Playback (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "High Fidelity Capture (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Telephony Duplex (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio ஒலி சேவையகம்"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "வெளிப்பாடு சாதனங்கள்"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "உள்ளீடு சாதனங்கள்"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "@HOSTNAME@இல் ஆடியோ"
 
@@ -2446,133 +2554,159 @@ msgstr "ஆம்பிளிஃபையர்"
 msgid "No Amplifier"
 msgstr "ஆம்ப்ளிஃபையர் இல்லை"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "பூஸ்ட்"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "பூஸ்ட் இல்லை"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "அனலாக் ஹெட்ஃபோன்கள்"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "அனலாக் உள்ளிடு"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "அனலாக் மைக்ரோஃபோன்"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "அனலாக் லைன்இன்"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "அனலாக் ரேடியோ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "அனலாக் வீடியோ"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "அனலாக் வெளிப்பாடு"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "அனலாக் ஹெட்ஃபோன்கள்"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "அனலாக் வெளிப்பாடு (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "அனலாக் மோனோ வெளிப்பாடு"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "அனலாக் ஸ்டிரியோ"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "அனலாக் மோனோ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "அனலாக் ஸ்டிரியோ"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "Analog Surround 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "Analog Surround 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "Analog Surround 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Analog Surround 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Analog Surround 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Analog Surround 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Analog Surround 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "Analog Surround 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "Analog Surround 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "Analog Surround 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Analog Surround 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Digital Stereo (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Digital Surround 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Digital Surround 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Digital Surround 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Digital Stereo (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "Analog Mono Duplex"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "Analog Stereo Duplex"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Digital Stereo Duplex (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "குறைந்த அலைவரிசை எம்மிட்டர்"
diff --git a/po/te.po b/po/te.po
index ca99a27..a861dda 100644
--- a/po/te.po
+++ b/po/te.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx.te\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-11-12 04:07+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-11-12 13:10+0530\n"
 "Last-Translator: Krishna Babu K <kkrothap at redhat.com>\n"
 "Language-Team: Telugu <en at li.org>\n"
@@ -15,7 +15,8 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11.4\n"
-"Plural-Forms: nplurals=2; plural=(n!=1);\n\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+"\n"
 "\n"
 "\n"
 "\n"
@@ -24,12 +25,12 @@ msgstr ""
 "\n"
 "\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -41,7 +42,7 @@ msgstr ""
 "సాదారణంగా యిది ALSA డ్రైవర్ '%s' నందలి బగ్ కావచ్చును. దయచేసి దీనిని ALSA అభివృద్ది కారులకు "
 "నివేదించుము."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -53,7 +54,7 @@ msgstr ""
 "సాదారణంగా యిది ALSA డ్రైవర్ '%s' నందు బగ్ కావచ్చును . దయచేసి దీనిని ALSA అభివృద్దికారులక "
 "నివేదించుము."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -97,11 +98,11 @@ msgstr "NULL సింక్ క్లాక్‌చేయబడింది"
 msgid "Null Output"
 msgstr "Null అవుట్పుట్"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "అంతర్గత ఆడియో"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "మోడెమ్"
 
@@ -117,246 +118,267 @@ msgstr "కొత్త dl లోడర్ కేటాయించుటలో
 msgid "Failed to add bind-now-loader."
 msgstr "bind-now-loader జతచేయుటకు విఫలమైంది."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "సంకేతము %s పొందినది."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "నిష్క్రమించుచున్నది."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "వినియోగదారి '%s'ను కనుగొనుటకు విఫలమైంది."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "సమూహం '%s' కనుగొనుటకు విఫలమైంది."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "వినియోగదారి '%s' (UID %lu) మరియు సమూహము '%s' (GID %lu) కనబడినవి."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "వినియోగదారి '%s' మరియు సమూహము '%s' యొక్క GID సరితూగలేదు."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "వినియోగదారి '%s' యొక్క నివాస డైరెక్టరీ '%s' కాదు, వదిలివేయుచున్నది."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "'%s' సృష్టించుటకు విఫలమైంది: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "సమూహ జాబితా మార్చుటకు విఫలమైంది: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "GID మార్చుటకు విఫలమైంది: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "UID మార్చటకు విఫలమైంది: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "root అనుమతులు విజయవంతంగా తిసివేయబడినాయి."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "ఈ ప్లాట్‌ఫాం నందు సిస్టమ్ తరహా రీతి మద్దతీయబడదు."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) విఫలమైంది: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "ఆదేశ వరుసను పార్శ్ చేయుటకు విఫలమైంది."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "డెమోన్ నడుచుట లేదు"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "డెమోన్ PID %u వలె నడుచుచున్నది"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "డెమోన్ చంపుటకు విఫలమైంది: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
 msgstr "ఈ ప్రోగ్రామ్ root లా నడుపవలసింది కాదు (--system తెలిపితే తప్ప)"
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Root అనుమతులు అవసరము."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "--start సిస్టమ్ సంభవాల ద్వారా మద్దతీయబడదు."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "సిస్టమ్ మోడ్ నందు నడుపుతోంది, అయితే --disallow-exit అమర్చలేదు!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr "సిస్టమ్ రీతినందు నడుచుచున్నది, అయితే --disallow-module-loading అమర్చలేదు!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "సిస్టమ్ రీతినందు నడుపుచున్నది, బలవంతంగా SHM రీతిని అచేతనము చేస్తోంది!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr "సిస్టమ్ రీతినందు నడుచుచున్నది, బలవంతంగా నిష్క్రమణ వృధా సమయాన్ని అచేతనము చేయుచున్నది!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "stdio పొందుటకు విఫలమైంది."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "పైర్ విఫలమైంది: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() విఫలమైంది: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() విఫలమైంది: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "డెమోన్ ప్రారంభం విఫలమైంది."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "డెమోన్ ప్రారంభము సఫలమైంది."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() విఫలమైంది: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "ఇది PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "నిర్వర్తన హోస్టు: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "నిర్వర్తన CFLAGS: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "హోస్టును నడుపుచున్నది: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u CPUలను కనుగొన్నది."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "పేజీ పరిమాణము %lu బైట్లు"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Valgrind మద్దతుతో నిర్వర్తించబడింది: అవును"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Valgrind మద్దతుతో నిర్వర్తించబడింది: లేదు"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "valgrind రీతినందు నడుపుచున్నది: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "హోస్టును నడుపుచున్నది: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "ఆప్టిమైజ్డు బుల్డు: అవును"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "ఆప్టిమైజ్డు బుల్డు: కాదు"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "NDEBUG నిర్వచించబడింది, అన్ని స్థిరరాశులు అచేతనమైనవి."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "FASTPATH నిర్వచించబడింది, ఫాస్ట్ పాత్ స్థిరరాశులు మాత్రమే అచేతనమైనవి."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "అన్ని స్థిరరాశులు చేతనమైనవి."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "మిషన్ ID పొందుటకు విఫలమైంది"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "మిషన్ ID %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "సెషన్ ID %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "రన్‌టైమ్ డైరెక్టరీను వుపయోగించుచున్నది %s."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "స్థితి డైరెక్టరీను వుపయోగించుచున్నది %s."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "మాడ్యూళ్ళ డైరెక్టరీ %s వుపయోగిస్తోంది."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "సిస్టమ్ రీతినందు వుపయోగించుచున్నది: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -370,41 +392,41 @@ msgstr ""
 "సిస్టమ్ రీతి అనునది సరైనటువంటిది యెందుకు కాదో వివరణ కొరకు దయచేసి యిక్కడ చదవండి http://"
 "pulseaudio.org/wiki/WhatIsWrongWithSystemMode"
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() విఫలమైంది."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "తాజా అధిక-తీవ్రత కాలసూచికలు అందుబాటులో వున్నాయి! బాన్ ఎపటైట్!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
 msgstr "మిత్రమా, నీ కెర్నల్ చెడిపోయింది! అధిక-తీవ్రత కాలసూచకిలను చేతనము చేయమని సూచించడమైనది!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() విఫలమైంది."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "డెమోన్ సిద్దముచేయుటకు విఫలమైంది."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "ఏవిధమైన మాడ్యూళ్ళు లోడవకుండా డెమోన్ ప్రారంభము, పనిచేయుటకు తిరస్కరించబడింది."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "డెమోన్ ప్రారంభము పూర్తైనది."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "డెమోన్ మూసివేత సిద్దముచేయబడింది."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "డెమోన్ అంతముచేయబడింది."
 
@@ -661,72 +683,77 @@ msgstr "తీసివేత హెచ్చరిక: %s\n"
 msgid "Path: %s\n"
 msgstr "పాత్: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] చెల్లని లాగ్ లక్ష్యము '%s'."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] చెల్లని లాగ్ స్థాయి '%s'."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] చెల్లని పునఃవుదాహరణ పద్దతి '%s'."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] చెల్లని rlimit '%s'."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit అనునది ఈ ప్లాట్‌ఫాం నందు మద్దతివ్వబడదు."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] చెల్లని మాదిరి ఫార్మాట్ '%s'."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] చెల్లని మాదిరి రేటు '%s'."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] చెల్లని మాదిరి చానళ్ళు '%s'."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] చెల్లని ఛానల్ మాప్ '%s'."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] చెల్లని ముక్కలు సంఖ్య '%s'."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] చెల్లని ముక్క పరిమాణము '%s'."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] చెల్లని సాదా స్థాయి '%s'."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] చెల్లని మాదిరి రేటు '%s'."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "ఆకృతీకరణ దస్త్రమును తెరుచుటకు విఫలమైంది: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -734,7 +761,7 @@ msgstr ""
 "తెలుపబడిన అప్రమేయ ప్రాసారమార్గం మాప్ తెలుపబడిన అప్రమేయ ప్రసారమార్గముల కన్నా విభిన్న ప్రసారమార్గముల "
 "సంఖ్యను కలిగివుంది."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### ఆకృతీకరణ దస్త్రమునుండి చదువుము: %s ###\n"
@@ -780,8 +807,8 @@ msgid "Rear Right"
 msgstr "వెనుక కుడివైపు"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "తక్కువ తరచుదనం వెలువరించునది"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1126,191 +1153,191 @@ msgstr "XOpenDisplay() విఫలమైంది"
 msgid "Failed to parse cookie data"
 msgstr "కుకీ డాటా పార్శ్ చేయుటకు విఫలమైంది"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "ఆకృతీకరణ దస్త్రము '%s' తెరువుటకు విఫలమైంది: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "ఏ కుకీ లోడవలేదు. లేకుండా అనుసంధానమగుటకు ప్రయత్నిస్తోంది."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "తెలియని పొడిగింపు కొరకు సందేశము స్వీకరించింది '%s'"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "స్ట్రీమ్‌ను డ్రైయిన్ చేయుటకు విఫలమైంది: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "ప్లేబ్యాక్ స్ట్రీమ్ డ్రెయిన్ అయినది."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "సేవికకు అనుసంధానమును ఎండగట్టుచున్నది."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() విఫలమైంది: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() విఫలమైంది: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() విఫలమైంది: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "స్ట్రీమ్ సమర్ధవంతంగా సృష్టించబడింది."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() విఫలమైంది: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "బఫర్ ప్రమాణాలు: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "బఫర్ ప్రమాణాలు: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "సాదారణ విశదీకరణ(స్పెక్) '%s' వుపయోగిస్తోంది, ప్రసారమార్గం మాప్ '%s'."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "పరికరము %s (%u, %ssuspended) కు అనుసంధానించబడింది."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "స్ట్రీమ్ దోషము: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "స్ట్రీమ్ పరికరము అర్దాంతరముగా నిలిపివేయబడింది.%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "స్ట్రీమ్ పరికరము తిరిగికొనసాగించబడింది.%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "స్ట్రీమ్ తక్కువగానడుచుచున్నది.%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "స్ట్రీమ్ మించినడుచుచున్నది.%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "స్ట్రీమ్ ప్రారంభమైంది.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "స్ట్రీమ్ పరికరము %s (%u, %ssuspended) కు కదుపబడింది.%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "కాదు "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "స్ట్రీమ్ బఫర్ యాట్రిబ్యూట్లు మార్చబడినవి.%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "అనుసంధానము ఏర్పడినది.%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() విఫలమైంది: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() విఫలమైంది: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() విఫలమైంది: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "అనుసంధానము వైఫల్యము: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "EOF పొందింది."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() విఫలమైంది: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "సంకేతము పొందినది, నిష్క్రమించుచున్నది."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "లేటెన్సీని పొందుటలో విఫలమైంది: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "సమయం: %0.3f సెకను; లెటెన్సీ: %0.0f usec."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() విఫలమైంది: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1362,10 +1389,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [options]\n"
@@ -1424,7 +1455,7 @@ msgstr ""
 "      --file-format=FFORMAT             Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1435,168 +1466,169 @@ msgstr ""
 "libpulse తో నిర్వర్తించబడింది %s\n"
 "libpulse లింకైనది %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "చెల్లని కక్షిదారి నామము '%s'"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "చెల్లని స్ట్రీమ్ నామము '%s'"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "చెల్లని ప్రసారమార్గ మాప్ '%s'"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "చెల్లని లేటెన్సీ విశదీకరణము '%s'"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "చెల్లని కార్యక్రమము సమయ విశదీకరణ '%s'"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "చెల్లని లక్షణము '%s'"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "తెలియని ఫైలు ఫార్మాట్ %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "చెల్లనటువంటి మాదిరి విశదీకరణ"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "చాలా యెక్కువ ఆర్గుమెంట్లు."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "దస్త్రము కొరకు మాదిరి సమాచారము జనియింపచేయుటలో విఫలమైంది."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "ఆడియో ఫైలును తెరువుటకు విఫలమైంది."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
 msgstr "హెచ్చరిక: తెలుపబడిన మాదిరి విశదీకరణ దస్త్రమునుండి వచ్చు విశదీకరణతో తిరిగివ్రాయబడుతుంది."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "దస్త్రమునుండి మాదిరి విశదీకరణను నిర్ధారించుటలో విఫలమైంది."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "హెచ్చరిక: దస్త్రమునుండి ప్రసారమార్గ మాప్ నిర్ధారించుటలో విఫలమైంది."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "ప్రసారమార్గ మాప్ మాదిరి విశదీకరణితో సరిపోలుటలేదు"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "హెచ్చరిక: ప్రసారమార్గ మాప్‌ను దస్త్రముకు వ్రాయుటలో విఫలమైంది."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "%s స్ట్రీమ్‌ను మాదిరి విశదీకరణ '%s' మరియు ప్రసారమార్గ మాప్ '%s'తో తెరుచుచున్నది."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "రికార్డింగు"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "ప్లేబాక్"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() విఫలమైంది."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() విఫలమైంది."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() విఫలమైంది."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() విఫలమైంది: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() విఫలమైంది."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() విఫలమైంది."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "అర్ధాంతరనిలుపుదల వైఫల్యం: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "తిరిగికొనసాగింపు వైఫల్యము: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "హెచ్చరిక: శబ్ధపు సేవిక స్థానికం కాదు, అర్ధాంతరనిలుపుదల కావడంలేదు.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "అనుసంధానము వైఫల్యము: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "SIGINT పొందింది, నిష్క్రమించుచున్నది.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "హెచ్చరిక: చైల్డు కార్యక్రమము సంకేతము %u ద్వారా అంతముచేయబడింది\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1615,7 +1647,7 @@ msgstr ""
 "to\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1626,50 +1658,61 @@ msgstr ""
 "libpulse తో నిర్వర్తించబడింది %s\n"
 "libpulse తో నిర్వర్తించబడింది %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() విఫలమైంది.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() విఫలమైంది.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() విఫలమైంది.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "గణాంకాలను పొందుటకు విఫలమైంది: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "ప్రస్తుతం వుపయోగంలోవుంది: %u బ్లాక్‌లు %s బైట్లను మొత్తంగా కలిగి వున్నాయి.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "మొత్తం లైఫ్‌టైములో కేటాయించబడింది: %u బ్లాకులు %s బైట్లను మొత్తంగా కలిగివున్నాయి.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "మాదిరి క్యాచి పరిమాణము: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "సేవిక సమాచారమును పొందుటకు విఫలమైంది: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1677,7 +1720,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "వినియోగదారి నామము: %s\n"
 "హోస్టు నామము: %s\n"
@@ -1689,12 +1732,12 @@ msgstr ""
 "అప్రమేయ మూలము: %s\n"
 "కుకీ: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "సింక్ సమాచారమును పొందుటకు విఫలమైంది: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1733,22 +1776,22 @@ msgstr ""
 "\tలక్షణాలు:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tపోర్టులు:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tక్రియాశీల పోర్టు: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "మూలము సమాచారము పొందుటకు విఫలమైంది: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1787,20 +1830,20 @@ msgstr ""
 "\tలక్షణాలు:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "వర్తించదు"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "మాడ్యూల్ సమాచారము పొందుటకు విఫలమైంది: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1817,12 +1860,12 @@ msgstr ""
 "\tలక్షణాలు:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "కక్షిదారి సమాచారము పొందుటలో విఫలమైంది: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1837,12 +1880,12 @@ msgstr ""
 "\tలక్షణాలు:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "కార్డు సమాచారము పొందుటకు విఫలమైంది: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1859,22 +1902,22 @@ msgstr ""
 "\tలక్షణాలు:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tప్రోఫైల్సు:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tక్రియాశీల ప్రొఫైల్: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "సింక్ ఇన్పుట్ సమాచారము పొందుటకు విఫలమైంది: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1911,12 +1954,12 @@ msgstr ""
 "\tలక్షణాలు:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "మూలపు అవుట్పుట్ సమాచారము పొందుటకు విఫలమైంది: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1945,12 +1988,12 @@ msgstr ""
 "\tలక్షణాలు:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "మాదిరి సమాచారము పొందుటకు విఫలమైంది: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1981,26 +2024,80 @@ msgstr ""
 "\tలక్షణాలు:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "వైఫైల్యము: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "మాదిరి అప్‌లోడు చేయుటకు విఫలమైంది: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "దస్త్రము యొక్క అపరిపక్వ ముగింపు"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "చెల్లని సేవిక"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "SIGINT పొందింది, నిష్క్రమించుచున్నది."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2023,6 +2120,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2062,7 +2160,7 @@ msgstr ""
 "  -n, --client-name=NAME                How to call this client on the "
 "server\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2073,103 +2171,106 @@ msgstr ""
 "libpulse తో నిర్వర్తించబడింది%s\n"
 "libpulse తో లింకుచేయబడింది %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "లోడువ్వుటకు దయచేసి మాదిరి దస్త్రమును తెలుపుము"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "శబ్దపు దస్త్రమును తెరువుటకు విఫలమైంది."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "హెచ్చరిక: దస్త్రమునుండి మాదిరి విశదీకరణను నిర్ణయించుటకు విఫలమైంది."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "ప్లే చేయుటకు మీరు మాదిరి నామమును తెలుపవలసి వుంది"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "తొలగించుటకు మీరు మాదిరి నామమును తెలుపవలసి వుంది"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "మీరు సింక్ ఇన్పుట్ విషయసూచిక మరియు సింక్ తెలుపవలసి వుంది"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "మీరు మూలము అవుట్పుట్ విషయసూచిక మరియు మూలము తెలుపవలసి వుంది"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "మీరు మాడ్యూల్ నామము మరియు ఆర్గుమెంట్లు తెలుపవలసి వుంది."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "మీరు మాడ్యూల్ విషయసూచిక తెలుపవలసి వుంది"
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
-msgstr "మీరు వొక సింకు కన్నా యెక్కువ తెలుపవలసి వుండకపోవచ్చు. మీరు బూలియన్ విలువను తెలుపవలసి వుంది."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
+msgstr ""
+"మీరు వొక సింకు కన్నా యెక్కువ తెలుపవలసి వుండకపోవచ్చు. మీరు బూలియన్ విలువను తెలుపవలసి వుంది."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr "మీరు వొక మూలము కన్నా యెక్కువ తెలుపవలసి వుండకపోవచ్చు. మీరు బూలియన్ విలువను తెలుపవలసి వుంది."
+msgstr ""
+"మీరు వొక మూలము కన్నా యెక్కువ తెలుపవలసి వుండకపోవచ్చు. మీరు బూలియన్ విలువను తెలుపవలసి వుంది."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "మీరు కార్డ్ నామము/విషయసూచిక మరియు ప్రొఫైల్ నామము తెలుపవలసి వుంది"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "మీరు సింక్‌ నామము/విషయసూచిక మరియు ప్రొఫైల్ నామము తెలుపవలసి వుంది"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "మీరు మూలము నామము/విషయసూచిక మరియు ప్రొఫైల్ నామము తెలుపవలసి వుంది"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "మీరు సింక్ నామము/విషయసూచిక మరియు ప్రొఫైల్ నామము తెలుపవలసి వుంది"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "చెల్లనటువంటి వాల్యూమ్ విశదీకరణ"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "మీరు మూలము నామము/విషయసూచిక మరియు ప్రొఫైల్ నామము తెలుపవలసి వుంది"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "మీరు సింక్ ఇన్పుట్ విషయసూచిక మరియు వాల్యూమ్ తెలుపవలసి వుంది"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "చెల్లని సింకు యిన్పుట్ విషయసూచిక"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "మీరు సింక్‌ నామము/విషయసూచిక మరియు మ్యూట్ బూలియన్ తెలుపవలసి వుంది"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "మీరు మూలపు నామము/విషయసూచిక మరియు మ్యూట్ బూలియన్ తెలుపవలసివుంది"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "మీరు సింక్ ఇన్పుట్ విషయసూచిక మరియు మ్యూట్ బూలియన్ తెలుపవలసివుంది"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "చెల్లనటువంటి సింకు యిన్పుట్ విషయసూచిక విశదీకరణ"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "ఎటువంటి విలువైన ఆదేశము తెలుపబడలేదు."
 
@@ -2252,44 +2353,44 @@ msgstr "కుకీ డాటా లోడు చేయుటకు విఫ
 msgid "Not yet implemented.\n"
 msgstr "ఇంకా యింప్లిమెంట్ చేయలేదు\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr "PulseAudio డెమోన్ నడుచుటలేదు, లేదా సెషన్ డెమోన్ వలె నడుచుటలేదు."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "PulseAudio డెమోన్ నాశనం చేయుటలో విఫలమైంది."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "డెమోన్ స్పందించుటలేదు."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "ఆటోస్పాన్ తాళంను యాక్సిస్ చేయలేదు."
 
@@ -2326,38 +2427,42 @@ msgstr ""
 "యిస్తుంది లేదా వేరొక విలువ < min_avail యిస్తుంది."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "ఆఫ్"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "హై ఫెడిలిటి ప్లేబ్యాక్ (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "హై ఫెడిలిటి కాప్చర్ (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "టెలిఫోనీ డూప్లెక్స్ (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "పల్స్ ఆడియో సౌండ్ సేవిక"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "అవుట్పుట్ పరికరములు"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "ఇన్పుట్ పరికరములు"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "@HOSTNAME@ పై ఆడియో"
 
@@ -2421,133 +2526,159 @@ msgstr "ఎంప్లిఫైర్"
 msgid "No Amplifier"
 msgstr "ఎంప్లిఫైర్ లేదు"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "బూస్ట్"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "బూస్ట్ లేదు"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "ఎనలాగ్ హెడ్‌ఫోన్స్"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "ఎనలాగ్ యిన్పుట్"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "ఎనలాగ్ మైక్రోఫోన్"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "ఎనలాగ్ లైన్-యిన్"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "ఎనలాగ్ రేడియో"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "ఎనలాగ్ వీడియో"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "ఎనలాగ్ అవుట్పుట్"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "ఎనలాగ్ హెడ్‌ఫోన్స్"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "ఎనలాగ్ అవుట్పుట్ (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "ఎనలాగ్ మోనో అవుట్పుట్"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "ఎనలాగ్ స్టీరియో"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "ఎనలాగ్ మోనో"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "ఎనలాగ్ స్టీరియో"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "ఎనలాగ్ సరౌండ్ 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "ఎనలాగ్ సరౌండ్ 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "ఎనలాగ్ సరౌండ్ 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "ఎనలాగ్ సరౌండ్ 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "ఎనలాగ్ సరౌండ్ 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "ఎనలాగ్ సరౌండ్ 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "ఎనలాగ్ సరౌండ్ 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "ఎనలాగ్ సరౌండ్ 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "ఎనలాగ్ సరౌండ్ 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "ఎనలాగ్ సరౌండ్ 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "ఎనలాగ్ సరౌండ్ 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "డిజిటల్ స్టీరియో (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "డిజిటల్ సరౌండ్ 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "డిజిటల్ సరౌండ్ 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "డిజిటల్ సరౌండ్ 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "డిజిటల్ స్టీరియో (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "ఎనలాగ్ మోనో డుప్లెక్స్"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "ఎనలాగ్ స్టీరియో డుప్లెక్స్"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "డిజిటల్ స్టీరియో డుప్లెక్స్ (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "తక్కువ తరచుదనం వెలువరించునది"
diff --git a/po/uk.po b/po/uk.po
index aacdf94..528a6e5 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-10-03 10:02+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-10-03 19:28+0300\n"
 "Last-Translator: Yuri Chornoivan <yurchor at ukr.net>\n"
 "Language-Team: Ukrainian <translation at linux.org.ua>\n"
@@ -14,15 +14,15 @@ msgstr ""
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Lokalize 0.3\n"
-"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 "
-"&& (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -35,7 +35,7 @@ msgstr ""
 "Ймовірно, ви натрапили на ваду у драйвері ALSA «%s». Будь ласка, повідомте "
 "про цю ваду розробникам ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -48,7 +48,7 @@ msgstr ""
 "Ймовірно, ви натрапили на ваду у драйвері ALSA «%s». Будь ласка, повідомте "
 "про цю ваду розробникам ALSA."
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -97,11 +97,11 @@ msgstr "NULL-приймач з годинником"
 msgid "Null Output"
 msgstr "Нуль-відтворення"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "Вбудоване аудіо"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "Модем"
 
@@ -120,92 +120,98 @@ msgstr ""
 msgid "Failed to add bind-now-loader."
 msgstr "Не вдалося додати bind-now-loader."
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "Отримано сигнал %s."
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "Завершення роботи."
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "Не вдалося знайти користувача «%s»."
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "Не вдалося знайти групу «%s»."
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "Знайдено користувача «%s» (UID %lu) і групу «%s» (GID %lu)."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "GID користувача «%s» і групи «%s» не збігаються."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "Домашнім каталогом користувача «%s» не є «%s», дані проігноровано."
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Не вдалося створити «%s»: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "Не вдалося змінити список груп: %s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "Не вдалося змінити GID: %s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "Не вдалося змінити UID: %s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "Програма успішно позбулася прав доступу користувача root."
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "Загальносистемний режим не підтримується на цій платформі."
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "Спроба виконати setrlimit(%s, (%u, %u)) була невдалою: %s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "Не вдалося обробити рядок команди."
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "Фонову службу не запущено"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Фонову службу запущено як PID %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Не вдалося завершити роботу фонової служби: %s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -213,160 +219,176 @@ msgstr ""
 "Цю програму не призначено для запуску від імені користувача root (якщо не "
 "вказано параметра --system)."
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "Потрібні права доступу користувача root."
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr ""
 "Параметр --start не підтримується для загальносистемних екземплярів програми."
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
-msgstr "Запуск у загальносистемному режимі, але не встановлено --disallow-exit!"
+msgstr ""
+"Запуск у загальносистемному режимі, але не встановлено --disallow-exit!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 "Запуск у загальносистемному режимі, але не встановлено --disallow-module-"
 "loading!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "Запуск у загальносистемному режимі, примусове вимикання режиму SHM!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 "Запуск у загальносистемному режимі, примусове вимикання режиму параметрів "
 "часу виходу за відсутності активності!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "Не вдалося отримати stdio."
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "Спроба створення каналу завершилася невдало: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "Спроба виконання fork() завершилася невдало: %s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "Спроба виконання read() завершилася невдало: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "Спроба запуску фонової служби завершилася невдало."
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "Фонову службу успішно запущено."
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "Спроба виконання read() завершилася невдало: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Це PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Вузол збирання: %s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "CFLAGS збирання: %s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "Запущено на вузлі: %s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "Знайдено %u процесорів."
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "Розмір сторінки дорівнює %lu байтам"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "Зібрано з підтримкою Valgrind: так"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "Зібрано з підтримкою Valgrind: ні"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Запуск у режимі valgrind: %s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "Запущено на вузлі: %s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "Зібрано з оптимізацією: так"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "Зібрано з оптимізацією: ні"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "Визначено NDEBUG, всі додавання вимкнено."
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "Визначено FASTPATH, вимкнено лише додавання швидких шляхів."
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "Увімкнено всі додавання."
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "Спроба отримати ідентифікатор системи завершилася невдало"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "Ідентифікатор системи %s."
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "Ідентифікатор сеансу — %s."
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Каталог запуску: %s."
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "Каталог стану: %s."
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "Каталог модулів: %s."
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Запуску у загальносистемному режимі: %s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -383,15 +405,15 @@ msgstr ""
 "WhatIsWrongWithSystemMode, щоб дізнатися про те, чому не варто "
 "використовувати системний режим."
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "Спроба виконання pa_pid_file_create() зазнала невдачі."
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Доступні свіжі високоточні таймери! Смачного!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -399,29 +421,29 @@ msgstr ""
 "Чувак, твоє ядро — лайно! Круті пацани рекомендують Linux з увімкненими "
 "високоточними таймерами!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "Спроба виконання pa_core_new() зазнала невдачі."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "Не вдалося ініціалізувати фонову службу."
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr ""
 "Запуск фонової служби без жодного завантаженого модуля, служба не буде "
 "працездатною."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "Запуск фонової служби завершено."
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "Ініційовано завершення роботи фонової служби."
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "Виконання фонової служби перервано."
 
@@ -695,72 +717,77 @@ msgstr "ПОПЕРЕДЖЕННЯ ПРО ЗАСТАРІЛІСТЬ: %s\n"
 msgid "Path: %s\n"
 msgstr "Шлях: %s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Некоректний журнал «%s»."
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Некоректний рівень журналювання «%s»."
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Некоректний метод зміни частотних характеристик «%s»."
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] Некоректне значення rlimit «%s»."
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit не підтримується на цій платформі."
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Некоректний формат фрагмента «%s»."
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Некоректна частота вибірки «%s»."
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Некоректні канали фрагмента «%s»."
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] Некоректна карта каналів «%s»'."
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Некоректна кількість фрагментів «%s»."
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Некоректний розмір фрагмента «%s»."
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Некоректний рівень nice «%s»."
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Некоректна частота вибірки «%s»."
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Не вдалося відкрити файл налаштувань: %s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
@@ -768,7 +795,7 @@ msgstr ""
 "У вказаній типовій карті каналів визначається інша кількість каналів, ніж "
 "типова кількість каналів."
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Прочитано з файла налаштувань: %s ###\n"
@@ -814,8 +841,8 @@ msgid "Rear Right"
 msgstr "Задній правий"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "Джерело низьких частот"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1160,191 +1187,193 @@ msgstr "Спроба виконання XOpenDisplay() завершилася н
 msgid "Failed to parse cookie data"
 msgstr "Не вдалося обробити дані куки"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Не вдалося відкрити файл налаштування «%s»: %s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
-msgstr "Куків не завантажено. Буде виконано спробу з’єднання за їх відсутності."
+msgstr ""
+"Куків не завантажено. Буде виконано спробу з’єднання за їх відсутності."
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "Отримано повідомлення про невідомий додаток «%s»"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "Не вдалося створити тунель для потоку: %s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "Потік відтворення тунельовано."
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "Тунельне з’єднання з сервером."
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "Спроба виконання pa_stream_write() завершилася невдало: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "Спроба виконання pa_stream_write() завершилася невдало: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "Спроба виконання pa_stream_peek() завершилася невдало: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "Потік було успішно створено."
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "Спроба виконання pa_stream_get_buffer_attr() завершилася невдало: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Метрика буфера: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Метрика буфера: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "Використання частотної специфікації «%s», карта каналів «%s»."
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "З’єднано з пристроєм %s (%u, %s призупинено)."
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "Помилка потоку: %s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "Призупинено пристрій потоку. %s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "Відновлено пристрій потоку. %s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "Недовантаження потоку. %s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "Перевантаження потоку. %s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "Потік запущено. %s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "Потік пересунуто на пристрій %s (%u, %s призупинено). %s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "не "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "Недовантаження потоку. %s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "Встановлено з’єднання. %s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "Спроба виконання pa_stream_new() зазнала невдачі: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "Спроба виконання pa_stream_connect_playback() зазнала невдачі: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "Спроба виконання pa_stream_connect_record() зазнала невдачі: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "Спроба встановлення з’єднання зазнала невдачі: %s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "Отримано EOF."
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "Спроба виконання write() завершилася невдало: %s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "Отримано сигнал, завершення роботи."
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "Не вдалося отримати латентність: %s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "Час: %0.3f сек.; Латентність: %0.0f мкс."
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
-msgstr "Спроба виконання pa_stream_update_timing_info() завершилася невдало: %s"
+msgstr ""
+"Спроба виконання pa_stream_update_timing_info() завершилася невдало: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1396,10 +1425,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [параметри]\n"
@@ -1457,7 +1490,7 @@ msgstr ""
 "      --list-file-formats               Показати список можливих форматів "
 "файлів.\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1468,68 +1501,68 @@ msgstr ""
 "Зібрано з libpulse %s\n"
 "З’єднано з libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "Некоректна назва клієнта «%s»"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "Некоректна назва потоку «%s»"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "Некоректна карта каналів «%s»"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "Некоректна специфікація латентності «%s»"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "Некоректна часова специфікація «%s»"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "Некоректна властивість «%s»"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "Невідомий формат файлів %s."
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "Некоректна частотна специфікація"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "Забагато аргументів."
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "Не вдалося створити частотну специфікацію для файла."
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "Не вдалося відкрити звуковий файл."
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
@@ -1537,102 +1570,105 @@ msgstr ""
 "Попередження: вказану частотну специфікацію буде перезаписано специфікацією "
 "з файла."
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "Не вдалося отримати дані щодо частотної специфікації з файла."
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "Попередження: не вдалося отримати дані щодо карти каналів з файла."
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "Карта каналів не відповідає частотній специфікації"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "Попередження: не вдалося записати карту каналів до файла."
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr "Відкриття потоку %s з частотною специфікацією «%s» і картою каналів «%s»."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgstr ""
+"Відкриття потоку %s з частотною специфікацією «%s» і картою каналів «%s»."
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "запис"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "відтворення"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "Спроба виконання pa_mainloop_new() завершилася невдало."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "Спроба виконання io_new() завершилася невдало."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "Спроба виконання pa_context_new() завершилася невдало."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "Спроба виконання pa_context_connect() завершилася невдало: %s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "Спроба виконання pa_context_new() завершилася невдало."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "Спроба виконання pa_mainloop_run() завершилася невдало."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "Невдала спроба призупинки: %s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "Невдала спроба відновлення: %s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr ""
 "ПОПЕРЕДЖЕННЯ: звуковий сервер не є локальним, його не можна призупинити.\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Спроба встановлення з’єднання зазнала невдачі: %s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "Отримано сигнал SIGINT, завершення роботи.\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
-msgstr "ПОПЕРЕДЖЕННЯ: виконання дочірнього процесу було перервано з сигналом %u\n"
+msgstr ""
+"ПОПЕРЕДЖЕННЯ: виконання дочірнього процесу було перервано з сигналом %u\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1651,7 +1687,7 @@ msgstr ""
 "з’єднатися\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1662,50 +1698,62 @@ msgstr ""
 "Зібрано з libpulse %s\n"
 "З’єднано з libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "Спроба виконання pa_mainloop_new() завершилася невдало.\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "Спроба виконання pa_context_new() завершилася невдало.\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "Спроба виконання pa_mainloop_run() завершилася невдало.\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "Не вдалося отримати статистичні дані: %s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "Зараз використано: %u блоків, що містять загалом %s байтів.\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
-msgstr "Виділено протягом виконання загалом: %u блоків, що містять %s байтів.\n"
+msgstr ""
+"Виділено протягом виконання загалом: %u блоків, що містять %s байтів.\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "Розмір кешу фрагментів: %s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "Не вдалося отримати дані щодо сервера: %s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1713,7 +1761,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "Користувач: %s\n"
 "Назва вузла: %s\n"
@@ -1725,12 +1773,12 @@ msgstr ""
 "Типове джерело: %s\n"
 "Кука: %08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "Не вдалося отримати дані щодо приймача: %s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1769,22 +1817,22 @@ msgstr ""
 "\tВластивості:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tПорти:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tАктивний порт: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "Не вдалося отримати дані щодо джерела: %s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1823,20 +1871,20 @@ msgstr ""
 "\tВластивості:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "н/д"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "Не вдалося отримати дані щодо модуля: %s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1853,12 +1901,12 @@ msgstr ""
 "\tВластивості:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "Не вдалося отримати дані щодо клієнта: %s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1873,12 +1921,12 @@ msgstr ""
 "\tВластивості:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "Не вдалося отримати дані щодо карти: %s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1895,22 +1943,22 @@ msgstr ""
 "\tВластивості:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tПрофілі:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tАктивний профіль: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "Не вдалося отримати відомостей щодо приймача: %s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1947,12 +1995,12 @@ msgstr ""
 "\tВластивості:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "Не вдалося отримати дані щодо відтворення джерела: %s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1981,12 +2029,12 @@ msgstr ""
 "\tВластивості:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "Не вдалося отримати дані щодо фрагмента: %s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -2017,26 +2065,80 @@ msgstr ""
 "\tВластивості:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "Помилка: %s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "Не вдалося вивантажити зразок: %s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "Передчасне завершення файла"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "Некоректний сервер"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "Отримано сигнал SIGINT, завершення роботи."
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -2059,6 +2161,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2097,7 +2200,7 @@ msgstr ""
 "з’єднатися\n"
 "  -n, --client-name=НАЗВА               Спосіб виклику клієнта на сервері\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2108,51 +2211,51 @@ msgstr ""
 "Зібрано з libpulse %s\n"
 "З’єднано з libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "Будь ласка, вкажіть зразковий файл для завантаження"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "Не вдалося відкрити звуковий файл."
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr ""
 "Попередження: не вдалося отримати дані щодо частотної специфікації з файла."
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "Вам слід вказати назву зразкового файла, який слід відтворити"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "Вам слід вказати назву зразкового файла, який слід вилучити"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "Вам слід вказати індекс приймача даних і приймач"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "Вам слід вказати індекс джерела відтворення і джерело"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "Вам слід вказати назву модуля і аргументи."
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "Вам слід вказати індекс модуля"
 
-#: ../src/utils/pactl.c:1090
+#: ../src/utils/pactl.c:1183
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 "Не можна вказувати більше одного приймача. Вам слід вказати булівське "
 "значення."
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
@@ -2160,57 +2263,60 @@ msgstr ""
 "Не можна вказувати більше одного джерела. Вам слід вказати булівське "
 "значення."
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "Вам слід вказати назву/індекс карти і назву профілю"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "Вам слід вказати назву/індекс приймача і назву порту"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "Вам слід вказати назву/індекс джерела і назву порту"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "Вам слід вказати назву/індекс приймача і гучність"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "Некоректна специфікація гучності"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "Вам слід вказати назву/індекс джерела і гучність"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "Вам слід вказати індекс приймача даних і гучність"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "Некоректний індекс вхідних даних приймача"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
-msgstr "Вам слід вказати назву/індекс приймача і булеве значення вимикання звуку"
+msgstr ""
+"Вам слід вказати назву/індекс приймача і булеве значення вимикання звуку"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
-msgstr "Вам слід вказати назву/індекс джерела і булеве значення вимикання звуку"
+msgstr ""
+"Вам слід вказати назву/індекс джерела і булеве значення вимикання звуку"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
-msgstr "Вам слід вказати індекс приймача даних і булеве значення вимикання звуку"
+msgstr ""
+"Вам слід вказати індекс приймача даних і булеве значення вимикання звуку"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "Некоректна специфікація індексу приймача даних"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "Не вказано коректної команди."
 
@@ -2295,46 +2401,47 @@ msgstr "Не вдалося завантажити дані куки\n"
 msgid "Not yet implemented.\n"
 msgstr "Ще не реалізовано.\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
 "Фонову службу PulseAudio не запущено, або цю службу не запущено як фонову "
 "службу сеансу."
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
-msgstr "Спроба завершення роботи фонової служби PulseAudio завершилася невдало."
+msgstr ""
+"Спроба завершення роботи фонової служби PulseAudio завершилася невдало."
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "Фонова служба не відповідає."
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "Не вдалося зняти блокування автоматичного розгалуження."
 
@@ -2373,38 +2480,42 @@ msgstr ""
 "snd_pcm_avail() повернув 0 або інше значення < min_avail."
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "Вимкнено"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "Високоточне відтворення (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "Високоточне захоплення (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "Телефонний дуплекс (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "Звуковий сервер PulseAudio"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "Пристрої відтворення"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "Пристрої отримання"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "Звук на @НАЗВАВУЗЛА@"
 
@@ -2468,131 +2579,159 @@ msgstr "Підсилювач"
 msgid "No Amplifier"
 msgstr "Без підсилювача"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "Підсилення"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "Без пісилення"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "Аналогові навушники"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "Аналогових вхід"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "Аналоговий мікрофон"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "Аналоговий лінійний вхід"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "Аналогове радіо"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "Аналогове відео"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "Аналогове відтворення"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "Аналогові навушники"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "Аналоговий вихід (сабвуфер)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "Аналоговий моно-вихід"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981, c-format
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "Аналогове стерео"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
+#, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404, c-format
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
+#, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "Аналогове моно"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "Аналогове стерео"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "Аналоговий об'ємний 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "Аналоговий об'ємний 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "Аналоговий об'ємний 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "Аналоговий об'ємний 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "Аналоговий об'ємний 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "Аналоговий об'ємний 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "Аналоговий об'ємний 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "Аналоговий об'ємний 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "Аналоговий об'ємний 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "Аналоговий об'ємний 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "Аналоговий об'ємний 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "Цифрове стерео (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "Цифровий об’ємний 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Цифровий об’ємний 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Цифровий об’ємний 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "Цифровий стерео (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "Аналогове двобічне моно"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "Аналогове двобічне стерео"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Цифрове двобічне стерео (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "Джерело низьких частот"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index bf3610f..337f2b5 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-12-07 20:11+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2009-12-09 12:54+1000\n"
 "Last-Translator: Leah Liu <lliu at redhat.com>\n"
 "Language-Team: Simplified Chinese <zh at li.org>\n"
@@ -20,12 +20,12 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.11.4\n"
 
-#: ../src/modules/alsa/alsa-util.c:858 ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
 "snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -36,7 +36,7 @@ msgstr ""
 "snd_pcm_avail() 返回的值非常大:%lu 字节(%lu ms)。\n"
 "很可能是 ALSA 驱动程序 '%s' 中的 bug。请向 ALSA 开发者举报这个问题。"
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
 "snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
@@ -47,7 +47,7 @@ msgstr ""
 "snd_pcm_delay() 返回的值非常大:%li 字节(%s%lu ms)。\n"
 "很可能是 ALSA 驱动程序 '%s' 中的 bug。请向 ALSA 开发者举报这个问题。"
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
 "snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -92,11 +92,11 @@ msgstr "定时的空漏"
 msgid "Null Output"
 msgstr "空输出"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "内部音频"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "调制解调器"
 
@@ -112,246 +112,267 @@ msgstr "分配新的 dl 加载器失败。"
 msgid "Failed to add bind-now-loader."
 msgstr "添加 bind-now-loader 失败。"
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "获得信号%s"
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "退出"
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "找不到用户 `%s' "
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "找不到用户组 `%s'"
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "发现用户'%s' (UID %lu)和组'%s' (GID %lu)."
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "用户'%s'与组'%s'的GID不匹配."
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "用户'%s'的主文件夹不是'%s',忽略。"
 
-#: ../src/daemon/main.c:208 ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "创建'%s'失败: %s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "更改组列表失败:%s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "更改GID失败:%s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "更改UID失败:%s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "成功放弃root权限。"
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "此平台不支持system-wide模式。"
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) 失败:%s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "分析命令行失败。"
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "后台程序没有运行"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "后台程序正在运行,PID %u"
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "杀死后台程序失败:%s"
 
-#: ../src/daemon/main.c:571
+#: ../src/daemon/main.c:662
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
 msgstr "不应以root身份运行本程序(除非指定 --system)。"
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "需要 root 权限。"
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr "系统实例不支持 --start。"
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "正在以系统模式运行,但是 --disallow-exit 未设定!"
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr "正在以系统模式运行,但是 --disallow-module-loading 未设定!"
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "正在以系统模式运行,强制禁用SHM模式!"
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr "正在以系统模式运行,强制禁用退出空闲时间!"
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "获取stdio失败。"
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "管道失败:%s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork()失败:%s"
 
-#: ../src/daemon/main.c:646 ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read()失败:%s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "后台程序启动失败。"
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "后台程序启动成功。"
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read()失败:%s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "这是 PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr "编译主机:%s"
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "编译CFLAGS:%s"
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "正在主机上运行:%s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "找到 %u CPU。"
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "页面大小为%lu字节"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "编译启用Valgrind支持:是"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "编译启用Valgrind支持:否"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "正在以valgrind模式运行:%s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "正在主机上运行:%s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "优化生成:是"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "优化生成:否"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr "拒绝 NDEBUG,禁用所有 assert"
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr "拒绝 FASTPATH,只禁用快速路径 assert。"
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr "启用所有 assert。"
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "获取machine ID失败"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "machine ID是%s。"
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "会话 ID %s。"
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "正在使用运行时文件夹%s。"
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr "正在使用状态文件夹%s。"
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "正在使用模块目录 %s。"
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "正在以系统模式运行:%s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
 "OK, so you are running PA in system mode. Please note that you most likely "
 "shouldn't be doing that.\n"
@@ -362,43 +383,44 @@ msgid ""
 msgstr ""
 "确定,那么您正在系统模式中运行 PA。请注意:您很可能不应该这样做。\n"
 "如果您无论如何都这样做了,那么出现意外情况就是您的问题。\n"
-"在文章 http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode 中解释了为什么系统模式通常不是个好主意。"
+"在文章 http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode 中解释了为什么系"
+"统模式通常不是个好主意。"
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create()失败。"
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "新鲜的高分辨率计时器开锅了!吃个饱!"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:922
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
 msgstr "老兄,您的内核真臭!现在流行的是启用了高分辩率计分器的Linux!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new()失败。"
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "后台程序初始化失败。"
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "后台程序启动未加载任何模块,拒绝工作。"
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "后台程序启动完成。"
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "开始关闭后台程序。"
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "后台程序已终止。"
 
@@ -639,78 +661,83 @@ msgstr "反对警告:%s\n"
 msgid "Path: %s\n"
 msgstr "路径:%s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] 无效的日志目标'%s'。"
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] 无效的日志级别'%s'。"
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] 无效的重采样方法'%s'。"
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] 无效的rlimit '%s'。"
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] 此平台不支持rlimit。"
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] 无效的样品格式'%s'。"
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] 无效的样品率'%s'。"
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] 无效的样品通道'%s'。"
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr "[%s:%u] 无效频道地图 '%s'。"
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] 无效的分段数'%s'。"
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] 无效的分段大小'%s'。"
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] 无效的nice level '%s'。"
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] 无效的样品率'%s'。"
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "打开配置文件失败:%s"
 
-#: ../src/daemon/daemon-conf.c:562
+#: ../src/daemon/daemon-conf.c:602
 msgid ""
 "The specified default channel map has a different number of channels than "
 "the specified default number of channels."
 msgstr "指定的默认频道地图的频道数与指定的默认频道数不同。"
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### 从配置文件读取:%s ###\n"
@@ -756,8 +783,8 @@ msgid "Rear Right"
 msgstr "右后"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "低频脉冲"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -1102,191 +1129,191 @@ msgstr "XOpenDisplay()失败"
 msgid "Failed to parse cookie data"
 msgstr "cookie数据分析失败"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "打开配置文件'%s'失败:%s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "没有加载cookie。尝试不加载cookie进行连接。"
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork():%s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid():%s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "收到未知扩展'%s'的信息"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "排出流失败:%s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "回放流枯竭。"
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "到服务器的 Draining 连接。"
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() failed: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() failed: %s"
 
-#: ../src/utils/pacat.c:237 ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() failed: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "流创建成功。"
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() failed: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr "Buffer metrics: maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "正在使用样品规格 '%s',通道映射 '%s'。"
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "已连接至设备 %s (%u,%s 挂起)。"
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "流错误:%s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "流设备挂起。%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "流设备恢复。%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "流欠载运行。%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "流超限运行。%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "流已启动。%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "流移至设备 %s (%u,%s 挂起)。%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "not "
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "更改流缓冲属性。%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "连接已建立。%s "
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() failed: %s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() failed: %s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() failed: %s"
 
-#: ../src/utils/pacat.c:470 ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "连接失败:%s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "获得 EOF。"
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "写入()失败:%s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "收到信号,正在退出。"
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "获取传输延迟失败:%s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "时间:%0.3f 秒;延迟:%0.0f 微秒。"
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() failed: %s"
 
-#: ../src/utils/pacat.c:609
-#, c-format
+#: ../src/utils/pacat.c:630
+#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -1338,10 +1365,14 @@ msgid ""
 "bytes.\n"
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 "%s [options]\n"
@@ -1363,21 +1394,22 @@ msgstr ""
 "      --rate=SAMPLERATE                 采样频率(单位 Hz,默认为44100)\n"
 "      --format=SAMPLEFORMAT             采样类型,s16le、s16be、u8、"
 "float32le 之一\n"
-"                                        float32be、ulaw、alaw、s32le、s32be 中"
-"取(默认为 s16ne)\n"
+"                                        float32be、ulaw、alaw、s32le、s32be "
+"中取(默认为 s16ne)\n"
 "      --channels=CHANNELS               通道数,1为单声道,2为立体声(默认为"
 "2)\n"
 "      --channel-map=CHANNELMAP          取代默认值的通道映射表\n"
 "      --fix-format                      从流连接的漏中提取采样格式。\n"
 "      --fix-rate                        从流连接的漏中提取采样率。\n"
-"      --fix-channels                    从流连接的漏中提取通道数和通道映"
-"射表。\n"
-"      --no-remix                        不要对通道进行 upmix 或者 downmix 操作。\n"
+"      --fix-channels                    从流连接的漏中提取通道数和通道映射"
+"表。\n"
+"      --no-remix                        不要对通道进行 upmix 或者 downmix 操"
+"作。\n"
 "      --no-remap                        根据下标而非名称来映射通道。\n"
 "      --latency=BYTES                   请求指定字节数的延迟。\n"
 "      --process-time=BYTES              每次请求指定字节数的处理时间。\n"
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1388,168 +1420,169 @@ msgstr ""
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
 
-#: ../src/utils/pacat.c:764 ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "无效客户端名称 '%s'"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "无效流名称 '%s'"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "无效通道映射 '%s'"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "无效延迟说明 %s'"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "无效处理时间说明 '%s'"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "无效性能 '%s'"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "未知文件格式 %s。"
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "无效采样说明"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "参数过多。"
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "为文件获取采样说明失败。"
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "打开声音文件失败。"
 
-#: ../src/utils/pacat.c:959
+#: ../src/utils/pacat.c:1000
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
 msgstr "警告:指定的采样说明将覆盖文件中的说明。"
 
-#: ../src/utils/pacat.c:962 ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "从文件中确定采样说明失败。"
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "警告:从文件中确定通道映射失败。"
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "通道映射与采样说明不匹配"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "警告:在文件中写入通道映射失败。"
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "使用采样说明 '%s' 和通道映射 '%s' 打开 %s 流。"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "正在录制"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "回放"
 
-#: ../src/utils/pacat.c:1035 ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() failed."
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() failed."
 
-#: ../src/utils/pacat.c:1061 ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() failed."
 
-#: ../src/utils/pacat.c:1069 ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect()失败:%s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() failed."
 
-#: ../src/utils/pacat.c:1082 ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() failed."
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork():%s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp():%s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "挂起失败:%s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "恢复失败:%s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "警告:非本地声音服务器,不会挂起。\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "连接失败:%s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "收到SIGINT,正在退出。\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "警告:子进程被信号%u终止\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
@@ -1567,7 +1600,7 @@ msgstr ""
 "  -s, --server=SERVER                   要连接的服务器名\n"
 "\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1578,50 +1611,61 @@ msgstr ""
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new()失败。\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new()失败。\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run()失败。\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "获取统计数据失败:%s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "当前使用:%u块,总共%s字节。\n"
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "整个生命周期所得分配:%u块,总共%s字节。\n"
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "采样缓存大小:%s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "获取服务器信息失败:%s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
 #, c-format
 msgid ""
-"User name: %s\n"
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
+#, fuzzy, c-format
+msgid ""
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1629,7 +1673,7 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 "用户名:%s\n"
 "主机名:%s\n"
@@ -1641,12 +1685,12 @@ msgstr ""
 "默认源: %s\n"
 "Cookie:%08x\n"
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "获取音频出口信息失败:%s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1685,22 +1729,22 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:268 ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr "\tPorts:\n"
 
-#: ../src/utils/pactl.c:274 ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr "\tActive Port: %s\n"
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "获取音频入口信息失败:%s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1739,20 +1783,20 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:345 ../src/utils/pactl.c:401 ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473 ../src/utils/pactl.c:532 ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543 ../src/utils/pactl.c:587 ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594 ../src/utils/pactl.c:637 ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n/a"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "获取模块信息失败:%s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1769,12 +1813,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "获取客户端信息失败:%s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1789,12 +1833,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "获取声卡信息失败:%s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1811,22 +1855,22 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\tProfiles:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\tActive Profile: %s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "获取音频出口输入信息失败:%s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1863,12 +1907,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "获取音频入口输出信息失败:%s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1897,12 +1941,12 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "获取采样信息失败:%s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1933,26 +1977,80 @@ msgstr ""
 "\tProperties:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:653 ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "失败:%s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "上传采样失败:%s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "文件过早结束"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "无效服务器"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "收到 SIGINT,正在退出。"
 
-#: ../src/utils/pactl.c:869
-#, c-format
+#: ../src/utils/pactl.c:961
+#, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -1975,6 +2073,7 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -2014,7 +2113,7 @@ msgstr ""
 "  -n, --client-name=NAME                How to call this client on the "
 "server\n"
 
-#: ../src/utils/pactl.c:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2025,103 +2124,104 @@ msgstr ""
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "请指定要加载的采样文件"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "打开声音文件失败。"
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "警告:从文件中确定采样说明失败。"
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr "您必须指定要播放的采样名"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr "您必须指定要删除的采样名"
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr "您必须指定漏输入索引和漏"
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr "您必须指定源输出索引和源"
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr "必须指定模块名和参数。"
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr "必须指定模块索引"
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
 msgstr "不可指定多个漏。必须指定一个布尔值。"
 
-#: ../src/utils/pactl.c:1103
+#: ../src/utils/pactl.c:1196
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
 msgstr "不可指定多个源。必须指定一个布尔值。"
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr "您必须指定声卡名称/索引和侧写名称"
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr "您必须指定漏名称/索引和端口名称"
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr "您必须指定源名称/索引和端口名称"
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr "您必须指定漏名称/索引和卷"
 
-#: ../src/utils/pactl.c:1154 ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193 ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226 ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr "无效采样说明"
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr "您必须指定源名称/索引和卷"
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr "您必须指定漏输入索引和卷"
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr "无效露输入索引"
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr "您必须指定漏名称/索引和静音布尔值"
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr "您必须指定源名称/索引和静音布尔值"
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr "您必须指定露输入索引和静音布尔值"
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr "无效漏输入索引说明"
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "未指定有效的命令。"
 
@@ -2203,44 +2303,44 @@ msgstr "加载cookie数据失败\n"
 msgid "Not yet implemented.\n"
 msgstr "尚未实现。\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr "没有 PulseAudio 守护进程在运行,或者没有作为会话守护进程运行。"
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr "socket(PF_UNIX, SOCK_STREAM, 0):%s"
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect():%s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "杀死PulseAudio后台程序失败。"
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "后台程序未响应。"
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171 ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read():%s"
 
-#: ../src/utils/pacmd.c:207 ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write():%s"
 
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr "不能访问autospawn锁。"
 
@@ -2277,38 +2377,42 @@ msgstr ""
 "用值的数值。"
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "关闭"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "高保真回放(A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "高保真采集(A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "双工电话(HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio 声音服务器"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "输出设备"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "输入设备"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "@HOSTNAME@ 中的音频"
 
@@ -2372,133 +2476,159 @@ msgstr "均衡器"
 msgid "No Amplifier"
 msgstr "无均衡器"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "加速器"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "无加速器"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "模拟耳机"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "模拟输入"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "模拟麦克风"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "模拟 Line-In"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "模拟无线电"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "模拟视频"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "模拟输出 "
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "模拟耳机"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "模拟输出(LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "模拟单声道输出"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "模拟立体声"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984 ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "模拟单声道"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "模拟立体声"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "模拟环绕 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "模拟环绕 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "模拟环绕 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "模拟环绕 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "模拟环绕 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "模拟环绕 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "模拟环绕 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "模拟环绕 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "模拟环绕 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "模拟环绕 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "模拟环绕 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "数字立体声(IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "数字环绕 4.0(IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "数字环绕 4.0(IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "数字环绕 5.1(IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "数字立体声(HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "模拟单声道双工"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "模拟立体声双工"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "数字立体声双工(IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "低频脉冲"
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 18b94c4..50b049b 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PulseAudio Volume Control\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-02-05 08:05+0000\n"
+"POT-Creation-Date: 2010-02-21 21:15+0100\n"
 "PO-Revision-Date: 2010-02-20 12:55+0800\n"
 "Last-Translator: Cheng-Chia Tseng <pswo10680 at gmail.com>\n"
 "Language-Team: zh_TW\n"
@@ -17,31 +17,36 @@ msgstr ""
 "X-Poedit-Language: Chinese\n"
 "X-Poedit-Country: TAIWAN\n"
 
-#: ../src/modules/alsa/alsa-util.c:858
-#: ../src/pulsecore/sink.c:2629
+#: ../src/modules/alsa/alsa-util.c:861 ../src/pulsecore/sink.c:2631
 #, c-format
 msgid "%s %s"
 msgstr "%s %s"
 
-#: ../src/modules/alsa/alsa-util.c:1106
+#: ../src/modules/alsa/alsa-util.c:1109
 #, c-format
 msgid ""
-"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
+"ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-util.c:1147
+#: ../src/modules/alsa/alsa-util.c:1150
 #, c-format
 msgid ""
-"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s%"
+"lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-util.c:1194
+#: ../src/modules/alsa/alsa-util.c:1197
 #, c-format
 msgid ""
-"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers."
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
 msgstr ""
 
 #: ../src/modules/module-always-sink.c:39
@@ -57,7 +62,12 @@ msgid "Virtual LADSPA sink"
 msgstr ""
 
 #: ../src/modules/module-ladspa-sink.c:53
-msgid "sink_name=<name for the sink> sink_properties=<properties for the sink> master=<name of sink to filter> format=<sample format> rate=<sample rate> channels=<number of channels> channel_map=<channel map> plugin=<ladspa plugin name> label=<ladspa plugin label> control=<comma seperated list of input control values>"
+msgid ""
+"sink_name=<name for the sink> sink_properties=<properties for the sink> "
+"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
+"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
+"plugin name> label=<ladspa plugin label> control=<comma seperated list of "
+"input control values>"
 msgstr ""
 
 #: ../src/modules/module-null-sink.c:55
@@ -68,11 +78,11 @@ msgstr "Clocked Null sink"
 msgid "Null Output"
 msgstr "Null Output"
 
-#: ../src/pulsecore/sink.c:2613
+#: ../src/pulsecore/sink.c:2615
 msgid "Internal Audio"
 msgstr "內部音效"
 
-#: ../src/pulsecore/sink.c:2618
+#: ../src/pulsecore/sink.c:2620
 msgid "Modem"
 msgstr "數據機"
 
@@ -88,285 +98,311 @@ msgstr "未能分配新的 dl loader。"
 msgid "Failed to add bind-now-loader."
 msgstr "未能加入 bind-now-loader。"
 
-#: ../src/daemon/main.c:141
+#: ../src/daemon/main.c:146
 #, c-format
 msgid "Got signal %s."
 msgstr "取得信號 %s。"
 
-#: ../src/daemon/main.c:168
+#: ../src/daemon/main.c:173
 msgid "Exiting."
 msgstr "正在退出。"
 
-#: ../src/daemon/main.c:186
+#: ../src/daemon/main.c:191
 #, c-format
 msgid "Failed to find user '%s'."
 msgstr "找不到使用者「%s」。"
 
-#: ../src/daemon/main.c:191
+#: ../src/daemon/main.c:196
 #, c-format
 msgid "Failed to find group '%s'."
 msgstr "找不到群組「%s」。"
 
-#: ../src/daemon/main.c:195
+#: ../src/daemon/main.c:200
 #, c-format
 msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
 msgstr "找到使用者「%s」(UID %lu) 與群組「%s」(GID %lu)。"
 
-#: ../src/daemon/main.c:200
+#: ../src/daemon/main.c:205
 #, c-format
 msgid "GID of user '%s' and of group '%s' don't match."
 msgstr "使用者「%s」的 GID 與群組「%s」的 GID 不相符。"
 
-#: ../src/daemon/main.c:205
+#: ../src/daemon/main.c:210
 #, c-format
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "使用者「%s」的家目錄不是「%s」,忽略中。"
 
-#: ../src/daemon/main.c:208
-#: ../src/daemon/main.c:213
+#: ../src/daemon/main.c:213 ../src/daemon/main.c:218
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "未能建立「%s」:%s"
 
-#: ../src/daemon/main.c:220
+#: ../src/daemon/main.c:225
 #, c-format
 msgid "Failed to change group list: %s"
 msgstr "未能變更群組清單:%s"
 
-#: ../src/daemon/main.c:236
+#: ../src/daemon/main.c:241
 #, c-format
 msgid "Failed to change GID: %s"
 msgstr "未能變更 GIC:%s"
 
-#: ../src/daemon/main.c:252
+#: ../src/daemon/main.c:257
 #, c-format
 msgid "Failed to change UID: %s"
 msgstr "未能變更 UID:%s"
 
-#: ../src/daemon/main.c:271
+#: ../src/daemon/main.c:276
 msgid "Successfully dropped root privileges."
 msgstr "成功地放下 root 特權。"
 
-#: ../src/daemon/main.c:279
+#: ../src/daemon/main.c:284
 msgid "System wide mode unsupported on this platform."
 msgstr "本平台不支援 system wide 模式。"
 
-#: ../src/daemon/main.c:297
+#: ../src/daemon/main.c:302
 #, c-format
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) 失敗:%s"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:502
 msgid "Failed to parse command line."
 msgstr "未能解析命令列。"
 
-#: ../src/daemon/main.c:541
+#: ../src/daemon/main.c:535
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr ""
+
+#: ../src/daemon/main.c:617
 msgid "Daemon not running"
 msgstr "幕後程式沒有在執行中"
 
-#: ../src/daemon/main.c:543
+#: ../src/daemon/main.c:619
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "幕後程式正在執行中,PID 為 %u "
 
-#: ../src/daemon/main.c:553
+#: ../src/daemon/main.c:634
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "未能結束幕後程式:%s"
 
-#: ../src/daemon/main.c:571
-msgid "This program is not intended to be run as root (unless --system is specified)."
+#: ../src/daemon/main.c:662
+msgid ""
+"This program is not intended to be run as root (unless --system is "
+"specified)."
 msgstr "本程式不預期以 root 身份執行(除非有指定 --system)。"
 
-#: ../src/daemon/main.c:573
+#: ../src/daemon/main.c:665
 msgid "Root privileges required."
 msgstr "需要 root 特權。"
 
-#: ../src/daemon/main.c:578
+#: ../src/daemon/main.c:671
 msgid "--start not supported for system instances."
 msgstr ""
 
-#: ../src/daemon/main.c:583
+#: ../src/daemon/main.c:676
+#, c-format
+msgid "User-configured server at %s, not autospawning."
+msgstr ""
+
+#: ../src/daemon/main.c:683
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr ""
 
-#: ../src/daemon/main.c:586
+#: ../src/daemon/main.c:686
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 
-#: ../src/daemon/main.c:589
+#: ../src/daemon/main.c:689
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr ""
 
-#: ../src/daemon/main.c:594
+#: ../src/daemon/main.c:694
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 
-#: ../src/daemon/main.c:621
+#: ../src/daemon/main.c:720
 msgid "Failed to acquire stdio."
 msgstr "未能獲取 stdio。"
 
-#: ../src/daemon/main.c:627
-#, c-format
-msgid "pipe failed: %s"
+#: ../src/daemon/main.c:726
+#, fuzzy, c-format
+msgid "pipe() failed: %s"
 msgstr "pipe 失敗: %s"
 
-#: ../src/daemon/main.c:632
+#: ../src/daemon/main.c:731 ../src/daemon/main.c:790
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() 失敗: %s"
 
-#: ../src/daemon/main.c:646
-#: ../src/utils/pacat.c:508
+#: ../src/daemon/main.c:745 ../src/utils/pacat.c:529
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() 失敗: %s"
 
-#: ../src/daemon/main.c:652
+#: ../src/daemon/main.c:751
 msgid "Daemon startup failed."
 msgstr "幕後程式啟動失敗。"
 
-#: ../src/daemon/main.c:654
+#: ../src/daemon/main.c:753
 msgid "Daemon startup successful."
 msgstr "幕後程式啟動成功。"
 
-#: ../src/daemon/main.c:731
+#: ../src/daemon/main.c:778
+#, fuzzy, c-format
+msgid "setsid() failed: %s"
+msgstr "read() 失敗: %s"
+
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "這是 PulseAudio %s"
 
-#: ../src/daemon/main.c:732
+#: ../src/daemon/main.c:831
 #, c-format
 msgid "Compilation host: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:733
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:736
+#: ../src/daemon/main.c:835
 #, c-format
 msgid "Running on host: %s"
 msgstr "正在執行於此主機上:%s"
 
-#: ../src/daemon/main.c:739
+#: ../src/daemon/main.c:838
 #, c-format
 msgid "Found %u CPUs."
 msgstr "找到 %u 個 CPU。"
 
-#: ../src/daemon/main.c:741
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "分頁大小為 %lu bytes"
 
-#: ../src/daemon/main.c:744
+#: ../src/daemon/main.c:843
 msgid "Compiled with Valgrind support: yes"
 msgstr "以 Valgrind 支援進行編譯:是"
 
-#: ../src/daemon/main.c:746
+#: ../src/daemon/main.c:845
 msgid "Compiled with Valgrind support: no"
 msgstr "以 Valgrind 支援進行編譯:否"
 
-#: ../src/daemon/main.c:749
+#: ../src/daemon/main.c:848
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "正在以 valgrind 模式執行中:%s"
 
-#: ../src/daemon/main.c:752
+#: ../src/daemon/main.c:850
+#, fuzzy, c-format
+msgid "Running in VM: %s"
+msgstr "正在執行於此主機上:%s"
+
+#: ../src/daemon/main.c:853
 msgid "Optimized build: yes"
 msgstr "最佳化的建構版本:是"
 
-#: ../src/daemon/main.c:754
+#: ../src/daemon/main.c:855
 msgid "Optimized build: no"
 msgstr "最佳化的建構版本:否"
 
-#: ../src/daemon/main.c:758
+#: ../src/daemon/main.c:859
 msgid "NDEBUG defined, all asserts disabled."
 msgstr ""
 
-#: ../src/daemon/main.c:760
+#: ../src/daemon/main.c:861
 msgid "FASTPATH defined, only fast path asserts disabled."
 msgstr ""
 
-#: ../src/daemon/main.c:762
+#: ../src/daemon/main.c:863
 msgid "All asserts enabled."
 msgstr ""
 
-#: ../src/daemon/main.c:766
+#: ../src/daemon/main.c:867
 msgid "Failed to get machine ID"
 msgstr "未能取得機器 ID"
 
-#: ../src/daemon/main.c:769
+#: ../src/daemon/main.c:870
 #, c-format
 msgid "Machine ID is %s."
 msgstr "機器 ID 為 %s。"
 
-#: ../src/daemon/main.c:773
+#: ../src/daemon/main.c:874
 #, c-format
 msgid "Session ID is %s."
 msgstr "工作階段 ID 為 %s。"
 
-#: ../src/daemon/main.c:779
+#: ../src/daemon/main.c:880
 #, c-format
 msgid "Using runtime directory %s."
 msgstr ""
 
-#: ../src/daemon/main.c:784
+#: ../src/daemon/main.c:885
 #, c-format
 msgid "Using state directory %s."
 msgstr ""
 
-#: ../src/daemon/main.c:787
+#: ../src/daemon/main.c:888
 #, c-format
 msgid "Using modules directory %s."
 msgstr "使用模組目錄 %s。"
 
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:890
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "以系統模式執行中:%s"
 
-#: ../src/daemon/main.c:792
+#: ../src/daemon/main.c:893
 msgid ""
-"OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
-"If you do it nonetheless then it's your own fault if things don't work as expected.\n"
-"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."
+"OK, so you are running PA in system mode. Please note that you most likely "
+"shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as "
+"expected.\n"
+"Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
+"explanation why system mode is usually a bad idea."
 msgstr ""
 
-#: ../src/daemon/main.c:809
+#: ../src/daemon/main.c:910
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() 失敗。"
 
-#: ../src/daemon/main.c:819
+#: ../src/daemon/main.c:920
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "有新鮮的高解析度計時器可用!期望您有個好食慾!"
 
-#: ../src/daemon/main.c:821
-msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
+#: ../src/daemon/main.c:922
+msgid ""
+"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
+"resolution timers enabled!"
 msgstr "先生,您的核心糟透了!今日主廚推薦是啟用高解析度計時器的 Linux!"
 
-#: ../src/daemon/main.c:844
+#: ../src/daemon/main.c:945
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() 失敗。"
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:1008
 msgid "Failed to initialize daemon."
 msgstr "未能初始化幕後程式。"
 
-#: ../src/daemon/main.c:909
+#: ../src/daemon/main.c:1013
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "幕後程式啟動而沒有任何載入的模組,拒絕運作。"
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:1051
 msgid "Daemon startup complete."
 msgstr "幕後程式啟動完成。"
 
-#: ../src/daemon/main.c:932
+#: ../src/daemon/main.c:1057
 msgid "Daemon shutdown initiated."
 msgstr "幕後程式已開始關閉。"
 
-#: ../src/daemon/main.c:954
+#: ../src/daemon/main.c:1083
 msgid "Daemon terminated."
 msgstr "幕後程式已終止。"
 
@@ -381,37 +417,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"
@@ -422,10 +469,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"
@@ -440,7 +489,9 @@ msgid "--fail expects boolean argument"
 msgstr ""
 
 #: ../src/daemon/cmdline.c:264
-msgid "--log-level expects log level argument (either numeric in range 0..4 or one of 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 ""
 
 #: ../src/daemon/cmdline.c:276
@@ -537,76 +588,83 @@ msgstr "反對警告:%s\n"
 msgid "Path: %s\n"
 msgstr "路徑:%s\n"
 
-#: ../src/daemon/daemon-conf.c:232
+#: ../src/daemon/daemon-conf.c:251
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:248
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:264
+#: ../src/daemon/daemon-conf.c:283
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] 無效的重新取樣方法「%s」。"
 
-#: ../src/daemon/daemon-conf.c:287
+#: ../src/daemon/daemon-conf.c:306
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:294
+#: ../src/daemon/daemon-conf.c:313
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:329
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:328
+#: ../src/daemon/daemon-conf.c:347
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:352
+#: ../src/daemon/daemon-conf.c:371
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:370
+#: ../src/daemon/daemon-conf.c:389
 #, c-format
 msgid "[%s:%u] Invalid channel map '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:388
+#: ../src/daemon/daemon-conf.c:407
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:406
+#: ../src/daemon/daemon-conf.c:425
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:424
+#: ../src/daemon/daemon-conf.c:443
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr ""
 
-#: ../src/daemon/daemon-conf.c:546
+#: ../src/daemon/daemon-conf.c:479
+#, fuzzy, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] 無效的重新取樣方法「%s」。"
+
+#: ../src/daemon/daemon-conf.c:586
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "未能開啟配置檔:%s"
 
-#: ../src/daemon/daemon-conf.c:562
-msgid "The specified default channel map has a different number of channels than the specified default number of channels."
+#: ../src/daemon/daemon-conf.c:602
+msgid ""
+"The specified default channel map has a different number of channels than "
+"the specified default number of channels."
 msgstr "指定的預設聲道對應表的聲道數與指定的預設聲道數不同。"
 
-#: ../src/daemon/daemon-conf.c:638
+#: ../src/daemon/daemon-conf.c:688
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### 從此配置檔讀取:%s ###\n"
@@ -623,8 +681,7 @@ msgstr "PulseAudio 音效系統"
 msgid "Start the PulseAudio Sound System"
 msgstr "啟動 PulseAudio 音效系統"
 
-#: ../src/pulse/channelmap.c:105
-#: ../src/pulse/channelmap.c:757
+#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757
 msgid "Mono"
 msgstr "單聲道"
 
@@ -653,8 +710,8 @@ msgid "Rear Right"
 msgstr "右後方"
 
 #: ../src/pulse/channelmap.c:115
-msgid "Low Frequency Emmiter"
-msgstr "低頻率揚聲器"
+msgid "Subwoofer"
+msgstr ""
 
 #: ../src/pulse/channelmap.c:117
 msgid "Front Left-of-center"
@@ -828,12 +885,9 @@ msgstr "頂端左後方"
 msgid "Top Rear Right"
 msgstr "頂端右後方"
 
-#: ../src/pulse/channelmap.c:484
-#: ../src/pulse/sample.c:170
-#: ../src/pulse/volume.c:295
-#: ../src/pulse/volume.c:321
-#: ../src/pulse/volume.c:341
-#: ../src/pulse/volume.c:371
+#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:170
+#: ../src/pulse/volume.c:295 ../src/pulse/volume.c:321
+#: ../src/pulse/volume.c:341 ../src/pulse/volume.c:371
 msgid "(invalid)"
 msgstr "(無效)"
 
@@ -994,8 +1048,7 @@ msgstr "%0.1f KiB"
 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() 失敗"
 
@@ -1003,192 +1056,190 @@ msgstr "XOpenDisplay() 失敗"
 msgid "Failed to parse cookie data"
 msgstr "未能解析 cookie 資料"
 
-#: ../src/pulse/client-conf.c:111
+#: ../src/pulse/client-conf.c:118
 #, c-format
 msgid "Failed to open configuration file '%s': %s"
 msgstr "未能開啟配置檔「%s」:%s"
 
-#: ../src/pulse/context.c:550
+#: ../src/pulse/context.c:539
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "沒有載入 cookie。試圖連接而不用 cookie。"
 
-#: ../src/pulse/context.c:693
+#: ../src/pulse/context.c:682
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:748
+#: ../src/pulse/context.c:737
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1438
+#: ../src/pulse/context.c:1434
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "已接收到未知擴展功能的訊息「%s」"
 
-#: ../src/utils/pacat.c:108
+#: ../src/utils/pacat.c:110
 #, c-format
 msgid "Failed to drain stream: %s"
 msgstr "未能排出串流:%s"
 
-#: ../src/utils/pacat.c:113
+#: ../src/utils/pacat.c:115
 msgid "Playback stream drained."
 msgstr "播放控制串流已排出。"
 
-#: ../src/utils/pacat.c:123
+#: ../src/utils/pacat.c:125
 msgid "Draining connection to server."
 msgstr "正在排出連線到伺服器。"
 
-#: ../src/utils/pacat.c:136
+#: ../src/utils/pacat.c:138
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:159
+#: ../src/utils/pacat.c:161
 #, c-format
 msgid "pa_stream_write() failed: %s"
 msgstr "pa_stream_write() failed: %s"
 
-#: ../src/utils/pacat.c:197
+#: ../src/utils/pacat.c:202
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
 msgstr "pa_stream_begin_write() 失敗: %s"
 
-#: ../src/utils/pacat.c:237
-#: ../src/utils/pacat.c:267
+#: ../src/utils/pacat.c:252 ../src/utils/pacat.c:282
 #, c-format
 msgid "pa_stream_peek() failed: %s"
 msgstr "pa_stream_peek() 失敗: %s"
 
-#: ../src/utils/pacat.c:307
+#: ../src/utils/pacat.c:322
 msgid "Stream successfully created."
 msgstr "已成功建立串流。"
 
-#: ../src/utils/pacat.c:310
+#: ../src/utils/pacat.c:325
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
 msgstr "pa_stream_get_buffer_attr() 失敗: %s"
 
-#: ../src/utils/pacat.c:314
+#: ../src/utils/pacat.c:329
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 msgstr ""
 
-#: ../src/utils/pacat.c:317
+#: ../src/utils/pacat.c:332
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
 msgstr ""
 
-#: ../src/utils/pacat.c:321
+#: ../src/utils/pacat.c:336
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
 msgstr "使用取樣規格「%s」,聲道對應表「%s」"
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 #, c-format
 msgid "Connected to device %s (%u, %ssuspended)."
 msgstr "正在連接到裝置 %s (%u, %ssuspended)。"
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Stream error: %s"
 msgstr "串流錯誤:%s"
 
-#: ../src/utils/pacat.c:345
+#: ../src/utils/pacat.c:360
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "串流裝置已暫停。%s"
 
-#: ../src/utils/pacat.c:347
+#: ../src/utils/pacat.c:362
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "串流裝置已恢復:%s"
 
-#: ../src/utils/pacat.c:355
+#: ../src/utils/pacat.c:370
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "串流欠載運行。%s"
 
-#: ../src/utils/pacat.c:362
+#: ../src/utils/pacat.c:377
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "串流超載運行。%s"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:384
 #, c-format
 msgid "Stream started.%s"
 msgstr "串流已開始。%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "串流移至裝置 %s (%u, %ssuspended)。%s"
 
-#: ../src/utils/pacat.c:376
+#: ../src/utils/pacat.c:391
 msgid "not "
 msgstr "不是"
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "串流緩衝特徵已變更。%s"
 
-#: ../src/utils/pacat.c:415
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "Connection established.%s"
 msgstr "連線已建立。%s"
 
-#: ../src/utils/pacat.c:418
+#: ../src/utils/pacat.c:433
 #, c-format
 msgid "pa_stream_new() failed: %s"
 msgstr "pa_stream_new() 失敗:%s"
 
-#: ../src/utils/pacat.c:450
+#: ../src/utils/pacat.c:471
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
 msgstr "pa_stream_connect_playback() 失敗:%s"
 
-#: ../src/utils/pacat.c:456
+#: ../src/utils/pacat.c:477
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
 msgstr "pa_stream_connect_record() 失敗:%s"
 
-#: ../src/utils/pacat.c:470
-#: ../src/utils/pactl.c:857
+#: ../src/utils/pacat.c:491 ../src/utils/pactl.c:949
 #, c-format
 msgid "Connection failure: %s"
 msgstr "連線失敗:%s"
 
-#: ../src/utils/pacat.c:503
+#: ../src/utils/pacat.c:524
 msgid "Got EOF."
 msgstr "取得檔案結尾 (EOF)。"
 
-#: ../src/utils/pacat.c:540
+#: ../src/utils/pacat.c:561
 #, c-format
 msgid "write() failed: %s"
 msgstr "write() 失敗:%s"
 
-#: ../src/utils/pacat.c:561
+#: ../src/utils/pacat.c:582
 msgid "Got signal, exiting."
 msgstr "取得訊號,正在退出。"
 
-#: ../src/utils/pacat.c:575
+#: ../src/utils/pacat.c:596
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "未能取得傳輸延遲:%s"
 
-#: ../src/utils/pacat.c:580
+#: ../src/utils/pacat.c:601
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "時間:%0.3f 秒;延遲:%0.0f 微秒。"
 
-#: ../src/utils/pacat.c:599
+#: ../src/utils/pacat.c:620
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
 msgstr "pa_stream_update_timing_info() 失敗:%s"
 
-#: ../src/utils/pacat.c:609
+#: ../src/utils/pacat.c:630
 #, c-format
 msgid ""
 "%s [options]\n"
@@ -1201,35 +1252,58 @@ 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, s24le, s24be,\n"
-"                                        s24-32le, s24-32be (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, "
+"s24le, s24be,\n"
+"                                        s24-32le, s24-32be (defaults to "
+"s16ne)\n"
+"      --channels=CHANNELS               The number of channels, 1 for mono, "
+"2 for stereo\n"
 "                                        (defaults to 2)\n"
-"      --channel-map=CHANNELMAP          Channel map to use instead of the default\n"
-"      --fix-format                      Take the sample format from the sink 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"
-"      --property=PROPERTY=VALUE         Set the specified property to the specified value.\n"
+"      --no-remap                        Map channels by index instead of "
+"name.\n"
+"      --latency=BYTES                   Request the specified latency in "
+"bytes.\n"
+"      --process-time=BYTES              Request the specified process time "
+"per request in bytes.\n"
+"      --latency-msec=MSEC               Request the specified latency in "
+"msec.\n"
+"      --process-time-msec=MSEC          Request the specified process time "
+"per request in msec.\n"
+"      --property=PROPERTY=VALUE         Set the specified property to the "
+"specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --file-format=FFORMAT             Record/play formatted PCM data.\n"
+"      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:731
+#: ../src/utils/pacat.c:758
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1237,183 +1311,181 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:764
-#: ../src/utils/pactl.c:953
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1046
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "無效的客戶端名稱「%s」"
 
-#: ../src/utils/pacat.c:779
+#: ../src/utils/pacat.c:806
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "無效的串流名稱「%s」"
 
-#: ../src/utils/pacat.c:816
+#: ../src/utils/pacat.c:843
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "無效的聲道對應表「%s」"
 
-#: ../src/utils/pacat.c:845
+#: ../src/utils/pacat.c:872 ../src/utils/pacat.c:886
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "無效的延遲規格「%s」"
 
-#: ../src/utils/pacat.c:852
+#: ../src/utils/pacat.c:879 ../src/utils/pacat.c:893
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "無效的程序時間規格「%s」"
 
-#: ../src/utils/pacat.c:864
+#: ../src/utils/pacat.c:905
 #, c-format
 msgid "Invalid property '%s'"
 msgstr "無效的屬性「%s」"
 
-#: ../src/utils/pacat.c:881
+#: ../src/utils/pacat.c:922
 #, c-format
 msgid "Unknown file format %s."
 msgstr "未知檔案格式 %s。"
 
-#: ../src/utils/pacat.c:900
+#: ../src/utils/pacat.c:941
 msgid "Invalid sample specification"
 msgstr "無效的取樣規格"
 
-#: ../src/utils/pacat.c:910
+#: ../src/utils/pacat.c:951
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:915
+#: ../src/utils/pacat.c:956
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:922
+#: ../src/utils/pacat.c:963
 msgid "Too many arguments."
 msgstr "太多參數。"
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:974
 msgid "Failed to generate sample specification for file."
 msgstr "未能替檔案產生取樣規格。"
 
-#: ../src/utils/pacat.c:953
+#: ../src/utils/pacat.c:994
 msgid "Failed to open audio file."
 msgstr "未能開啟音效檔。"
 
-#: ../src/utils/pacat.c:959
-msgid "Warning: specified sample specification will be overwritten with specification from file."
+#: ../src/utils/pacat.c:1000
+msgid ""
+"Warning: specified sample specification will be overwritten with "
+"specification from file."
 msgstr "警告:指定的取樣規格將會覆寫從檔案得到的規格。"
 
-#: ../src/utils/pacat.c:962
-#: ../src/utils/pactl.c:997
+#: ../src/utils/pacat.c:1003 ../src/utils/pactl.c:1090
 msgid "Failed to determine sample specification from file."
 msgstr "未能從檔案得知取樣規格。"
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:1012
 msgid "Warning: Failed to determine channel map from file."
 msgstr "警告:未能從檔案取得聲道對應表。"
 
-#: ../src/utils/pacat.c:982
+#: ../src/utils/pacat.c:1023
 msgid "Channel map doesn't match sample specification"
 msgstr "聲道對應表與取樣規格不符"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1034
 msgid "Warning: failed to write channel map to file."
 msgstr "警告:未能將聲道對應表寫入檔案。"
 
-#: ../src/utils/pacat.c:1008
+#: ../src/utils/pacat.c:1049
 #, c-format
-msgid "Opening a %s stream with sample specification '%s' and channel map '%s'."
+msgid ""
+"Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "正在開啟一道 %s 串流,取樣規格為「%s」,聲道對應表為「%s」。"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "recording"
 msgstr "錄製"
 
-#: ../src/utils/pacat.c:1009
+#: ../src/utils/pacat.c:1050
 msgid "playback"
 msgstr "播放控制"
 
-#: ../src/utils/pacat.c:1035
-#: ../src/utils/pactl.c:1267
+#: ../src/utils/pacat.c:1076 ../src/utils/pactl.c:1364
 msgid "pa_mainloop_new() failed."
 msgstr "pa_mainloop_new() 失敗。"
 
-#: ../src/utils/pacat.c:1054
+#: ../src/utils/pacat.c:1095
 msgid "io_new() failed."
 msgstr "io_new() 失敗。"
 
-#: ../src/utils/pacat.c:1061
-#: ../src/utils/pactl.c:1279
+#: ../src/utils/pacat.c:1102 ../src/utils/pactl.c:1376
 msgid "pa_context_new() failed."
 msgstr "pa_context_new() 失敗。"
 
-#: ../src/utils/pacat.c:1069
-#: ../src/utils/pactl.c:1285
+#: ../src/utils/pacat.c:1110 ../src/utils/pactl.c:1382
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() 失敗:%s"
 
-#: ../src/utils/pacat.c:1075
+#: ../src/utils/pacat.c:1116
 msgid "pa_context_rttime_new() failed."
 msgstr "pa_context_rttime_new() 失敗。"
 
-#: ../src/utils/pacat.c:1082
-#: ../src/utils/pactl.c:1290
+#: ../src/utils/pacat.c:1123 ../src/utils/pactl.c:1387
 msgid "pa_mainloop_run() failed."
 msgstr "pa_mainloop_run() 失敗。"
 
-#: ../src/utils/pasuspender.c:81
+#: ../src/utils/pasuspender.c:79
 #, c-format
 msgid "fork(): %s\n"
 msgstr "fork(): %s\n"
 
-#: ../src/utils/pasuspender.c:92
+#: ../src/utils/pasuspender.c:90
 #, c-format
 msgid "execvp(): %s\n"
 msgstr "execvp(): %s\n"
 
-#: ../src/utils/pasuspender.c:109
+#: ../src/utils/pasuspender.c:107
 #, c-format
 msgid "Failure to suspend: %s\n"
 msgstr "未能暫停:%s\n"
 
-#: ../src/utils/pasuspender.c:124
+#: ../src/utils/pasuspender.c:122
 #, c-format
 msgid "Failure to resume: %s\n"
 msgstr "未能恢復:%s\n"
 
-#: ../src/utils/pasuspender.c:147
+#: ../src/utils/pasuspender.c:145
 #, c-format
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "警告:音效伺服器並非本機,不會暫停。\n"
 
-#: ../src/utils/pasuspender.c:159
+#: ../src/utils/pasuspender.c:157
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "連線失敗:%s\n"
 
-#: ../src/utils/pasuspender.c:176
+#: ../src/utils/pasuspender.c:174
 #, c-format
 msgid "Got SIGINT, exiting.\n"
 msgstr "取得 SIGINT,正在退出。\n"
 
-#: ../src/utils/pasuspender.c:194
+#: ../src/utils/pasuspender.c:192
 #, c-format
 msgid "WARNING: Child process terminated by signal %u\n"
 msgstr "警告:子程序已被訊號 %u 所終止\n"
 
-#: ../src/utils/pasuspender.c:212
+#: ../src/utils/pasuspender.c:210
 #, c-format
 msgid ""
 "%s [options] ... \n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
-"  -s, --server=SERVER                   The name of the server to connect to\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
 "\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pasuspender.c:246
 #, c-format
 msgid ""
 "pasuspender %s\n"
@@ -1421,50 +1493,61 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pasuspender.c:275
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() 失敗。\n"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pasuspender.c:288
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() 失敗。\n"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pasuspender.c:296
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() 失敗。\n"
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:134
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "未能取得統計:%s"
 
-#: ../src/utils/pactl.c:141
+#: ../src/utils/pactl.c:140
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:144
+#: ../src/utils/pactl.c:143
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:147
+#: ../src/utils/pactl.c:146
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "取樣快取大小:%s\n"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:155
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "未能取得伺服器資訊:%s"
 
-#: ../src/utils/pactl.c:164
+#: ../src/utils/pactl.c:160
+#, c-format
+msgid ""
+"Server String: %s\n"
+"Library Protocol Version: %u\n"
+"Server Protocol Version: %u\n"
+"Is Local: %s\n"
+"Client Index: %u\n"
+"Tile Size: %zu\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:176
 #, c-format
 msgid ""
-"User name: %s\n"
+"User Name: %s\n"
 "Host Name: %s\n"
 "Server Name: %s\n"
 "Server Version: %s\n"
@@ -1472,15 +1555,15 @@ msgid ""
 "Default Channel Map: %s\n"
 "Default Sink: %s\n"
 "Default Source: %s\n"
-"Cookie: %08x\n"
+"Cookie: %04x:%04x\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:205
+#: ../src/utils/pactl.c:218
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "未能取得 sink 資訊:%s"
 
-#: ../src/utils/pactl.c:221
+#: ../src/utils/pactl.c:234
 #, c-format
 msgid ""
 "Sink #%u\n"
@@ -1502,24 +1585,22 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:268
-#: ../src/utils/pactl.c:360
+#: ../src/utils/pactl.c:281 ../src/utils/pactl.c:373
 #, c-format
 msgid "\tPorts:\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:274
-#: ../src/utils/pactl.c:366
+#: ../src/utils/pactl.c:287 ../src/utils/pactl.c:379
 #, c-format
 msgid "\tActive Port: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:297
+#: ../src/utils/pactl.c:310
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "未能取得來源資訊:%s"
 
-#: ../src/utils/pactl.c:313
+#: ../src/utils/pactl.c:326
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1541,28 +1622,20 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:345
-#: ../src/utils/pactl.c:401
-#: ../src/utils/pactl.c:436
-#: ../src/utils/pactl.c:473
-#: ../src/utils/pactl.c:532
-#: ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:543
-#: ../src/utils/pactl.c:587
-#: ../src/utils/pactl.c:588
-#: ../src/utils/pactl.c:594
-#: ../src/utils/pactl.c:637
-#: ../src/utils/pactl.c:638
-#: ../src/utils/pactl.c:645
+#: ../src/utils/pactl.c:358 ../src/utils/pactl.c:414 ../src/utils/pactl.c:449
+#: ../src/utils/pactl.c:486 ../src/utils/pactl.c:545 ../src/utils/pactl.c:546
+#: ../src/utils/pactl.c:556 ../src/utils/pactl.c:600 ../src/utils/pactl.c:601
+#: ../src/utils/pactl.c:607 ../src/utils/pactl.c:650 ../src/utils/pactl.c:651
+#: ../src/utils/pactl.c:658
 msgid "n/a"
 msgstr "n/a"
 
-#: ../src/utils/pactl.c:375
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "未能取得模組資訊:%s"
 
-#: ../src/utils/pactl.c:393
+#: ../src/utils/pactl.c:406
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1573,12 +1646,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:412
+#: ../src/utils/pactl.c:425
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "未能取得客戶端資訊:%s"
 
-#: ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:443
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1588,12 +1661,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:447
+#: ../src/utils/pactl.c:460
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "未能取得音效卡資訊:%s"
 
-#: ../src/utils/pactl.c:465
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1604,22 +1677,22 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:492
 #, c-format
 msgid "\tProfiles:\n"
 msgstr "\t個人設定檔:\n"
 
-#: ../src/utils/pactl.c:485
+#: ../src/utils/pactl.c:498
 #, c-format
 msgid "\tActive Profile: %s\n"
 msgstr "\t啟用的個人設定檔:%s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:509
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "未能取得 sink 輸入資訊:%s"
 
-#: ../src/utils/pactl.c:515
+#: ../src/utils/pactl.c:528
 #, c-format
 msgid ""
 "Sink Input #%u\n"
@@ -1640,12 +1713,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:554
+#: ../src/utils/pactl.c:567
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "未能取得來源輸出資訊:%s"
 
-#: ../src/utils/pactl.c:574
+#: ../src/utils/pactl.c:587
 #, c-format
 msgid ""
 "Source Output #%u\n"
@@ -1662,12 +1735,12 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:605
+#: ../src/utils/pactl.c:618
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "未能取得取樣資訊:%s"
 
-#: ../src/utils/pactl.c:623
+#: ../src/utils/pactl.c:636
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -1685,26 +1758,79 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:653
-#: ../src/utils/pactl.c:663
+#: ../src/utils/pactl.c:666 ../src/utils/pactl.c:676
 #, c-format
 msgid "Failure: %s"
 msgstr "失敗:%s"
 
-#: ../src/utils/pactl.c:687
+#: ../src/utils/pactl.c:700
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "未能上傳樣本:%s"
 
-#: ../src/utils/pactl.c:704
+#: ../src/utils/pactl.c:717
 msgid "Premature end of file"
 msgstr "未完成的檔案結尾"
 
-#: ../src/utils/pactl.c:863
+#: ../src/utils/pactl.c:737
+msgid "new"
+msgstr ""
+
+#: ../src/utils/pactl.c:740
+msgid "change"
+msgstr ""
+
+#: ../src/utils/pactl.c:743
+msgid "remove"
+msgstr ""
+
+#: ../src/utils/pactl.c:746 ../src/utils/pactl.c:781
+msgid "unknown"
+msgstr ""
+
+#: ../src/utils/pactl.c:754
+msgid "sink"
+msgstr ""
+
+#: ../src/utils/pactl.c:757
+msgid "source"
+msgstr ""
+
+#: ../src/utils/pactl.c:760
+msgid "sink-input"
+msgstr ""
+
+#: ../src/utils/pactl.c:763
+msgid "source-output"
+msgstr ""
+
+#: ../src/utils/pactl.c:766
+msgid "module"
+msgstr ""
+
+#: ../src/utils/pactl.c:769
+msgid "client"
+msgstr ""
+
+#: ../src/utils/pactl.c:772
+msgid "sample-cache"
+msgstr ""
+
+#: ../src/utils/pactl.c:775 ../src/utils/pactl.c:778
+#, fuzzy
+msgid "server"
+msgstr "無效的伺服器"
+
+#: ../src/utils/pactl.c:787
+#, c-format
+msgid "Event '%s' on %s #%u\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:955
 msgid "Got SIGINT, exiting."
 msgstr "取得 SIGINT,正在退出。"
 
-#: ../src/utils/pactl.c:869
+#: ../src/utils/pactl.c:961
 #, c-format
 msgid ""
 "%s [options] stat\n"
@@ -1728,15 +1854,18 @@ msgid ""
 "%s [options] set-sink-mute SINK 1|0\n"
 "%s [options] set-source-mute SOURCE 1|0\n"
 "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+"%s [options] subscribe\n"
 "\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:933
+#: ../src/utils/pactl.c:1026
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1744,104 +1873,104 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:979
+#: ../src/utils/pactl.c:1072
 msgid "Please specify a sample file to load"
 msgstr "請旨定要載入的取樣檔"
 
-#: ../src/utils/pactl.c:992
+#: ../src/utils/pactl.c:1085
 msgid "Failed to open sound file."
 msgstr "未能開啟音效檔。"
 
-#: ../src/utils/pactl.c:1004
+#: ../src/utils/pactl.c:1097
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "警告:未能從檔案得知取樣規格。"
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1107
 msgid "You have to specify a sample name to play"
 msgstr ""
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1119
 msgid "You have to specify a sample name to remove"
 msgstr ""
 
-#: ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1128
 msgid "You have to specify a sink input index and a sink"
 msgstr ""
 
-#: ../src/utils/pactl.c:1045
+#: ../src/utils/pactl.c:1138
 msgid "You have to specify a source output index and a source"
 msgstr ""
 
-#: ../src/utils/pactl.c:1060
+#: ../src/utils/pactl.c:1153
 msgid "You have to specify a module name and arguments."
 msgstr ""
 
-#: ../src/utils/pactl.c:1080
+#: ../src/utils/pactl.c:1173
 msgid "You have to specify a module index"
 msgstr ""
 
-#: ../src/utils/pactl.c:1090
-msgid "You may not specify more than one sink. You have to specify a boolean value."
+#: ../src/utils/pactl.c:1183
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean value."
 msgstr ""
 
-#: ../src/utils/pactl.c:1103
-msgid "You may not specify more than one source. You have to specify a boolean value."
+#: ../src/utils/pactl.c:1196
+msgid ""
+"You may not specify more than one source. You have to specify a boolean "
+"value."
 msgstr ""
 
-#: ../src/utils/pactl.c:1115
+#: ../src/utils/pactl.c:1208
 msgid "You have to specify a card name/index and a profile name"
 msgstr ""
 
-#: ../src/utils/pactl.c:1126
+#: ../src/utils/pactl.c:1219
 msgid "You have to specify a sink name/index and a port name"
 msgstr ""
 
-#: ../src/utils/pactl.c:1137
+#: ../src/utils/pactl.c:1230
 msgid "You have to specify a source name/index and a port name"
 msgstr ""
 
-#: ../src/utils/pactl.c:1149
+#: ../src/utils/pactl.c:1242
 msgid "You have to specify a sink name/index and a volume"
 msgstr ""
 
-#: ../src/utils/pactl.c:1154
-#: ../src/utils/pactl.c:1171
-#: ../src/utils/pactl.c:1193
-#: ../src/utils/pactl.c:1209
-#: ../src/utils/pactl.c:1226
-#: ../src/utils/pactl.c:1248
+#: ../src/utils/pactl.c:1247 ../src/utils/pactl.c:1264
+#: ../src/utils/pactl.c:1286 ../src/utils/pactl.c:1302
+#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1341
 msgid "Invalid volume specification"
 msgstr ""
 
-#: ../src/utils/pactl.c:1166
+#: ../src/utils/pactl.c:1259
 msgid "You have to specify a source name/index and a volume"
 msgstr ""
 
-#: ../src/utils/pactl.c:1183
+#: ../src/utils/pactl.c:1276
 msgid "You have to specify a sink input index and a volume"
 msgstr ""
 
-#: ../src/utils/pactl.c:1188
+#: ../src/utils/pactl.c:1281
 msgid "Invalid sink input index"
 msgstr ""
 
-#: ../src/utils/pactl.c:1204
+#: ../src/utils/pactl.c:1297
 msgid "You have to specify a sink name/index and a mute boolean"
 msgstr ""
 
-#: ../src/utils/pactl.c:1221
+#: ../src/utils/pactl.c:1314
 msgid "You have to specify a source name/index and a mute boolean"
 msgstr ""
 
-#: ../src/utils/pactl.c:1238
+#: ../src/utils/pactl.c:1331
 msgid "You have to specify a sink input index and a mute boolean"
 msgstr ""
 
-#: ../src/utils/pactl.c:1243
+#: ../src/utils/pactl.c:1336
 msgid "Invalid sink input index specification"
 msgstr ""
 
-#: ../src/utils/pactl.c:1262
+#: ../src/utils/pactl.c:1359
 msgid "No valid command specified."
 msgstr "沒有指定有效的命令。"
 
@@ -1852,7 +1981,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 ""
 
@@ -1916,101 +2046,106 @@ msgstr "未能載入 cookie 資料\n"
 msgid "Not yet implemented.\n"
 msgstr "尚未實作。\n"
 
-#: ../src/utils/pacmd.c:69
+#: ../src/utils/pacmd.c:65
 msgid "No PulseAudio daemon running, or not running as session daemon."
 msgstr ""
 
-#: ../src/utils/pacmd.c:74
+#: ../src/utils/pacmd.c:70
 #, c-format
 msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
 msgstr ""
 
-#: ../src/utils/pacmd.c:91
+#: ../src/utils/pacmd.c:87
 #, c-format
 msgid "connect(): %s"
 msgstr "connect(): %s"
 
-#: ../src/utils/pacmd.c:99
+#: ../src/utils/pacmd.c:95
 msgid "Failed to kill PulseAudio daemon."
 msgstr "未能結束 PulseAudio 幕後程式。"
 
-#: ../src/utils/pacmd.c:107
+#: ../src/utils/pacmd.c:103
 msgid "Daemon not responding."
 msgstr "幕後程式沒有回應。"
 
-#: ../src/utils/pacmd.c:161
+#: ../src/utils/pacmd.c:178
 #, c-format
 msgid "poll(): %s"
 msgstr "poll(): %s"
 
-#: ../src/utils/pacmd.c:171
-#: ../src/utils/pacmd.c:188
+#: ../src/utils/pacmd.c:189 ../src/utils/pacmd.c:209
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:207
-#: ../src/utils/pacmd.c:223
+#: ../src/utils/pacmd.c:231 ../src/utils/pacmd.c:249
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
 
-#: ../src/pulsecore/lock-autospawn.c:136
-#: ../src/pulsecore/lock-autospawn.c:219
+#: ../src/pulsecore/lock-autospawn.c:134 ../src/pulsecore/lock-autospawn.c:217
 msgid "Cannot access autospawn lock."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-sink.c:530
-#: ../src/modules/alsa/alsa-sink.c:689
+#: ../src/modules/alsa/alsa-sink.c:530 ../src/modules/alsa/alsa-sink.c:689
 #, c-format
 msgid ""
-"ALSA woke us up to write new data to the device, but there was actually nothing to write!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
-"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
+"ALSA woke us up to write new data to the device, but there was actually "
+"nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
 msgstr ""
 
-#: ../src/modules/alsa/alsa-source.c:506
-#: ../src/modules/alsa/alsa-source.c:656
+#: ../src/modules/alsa/alsa-source.c:506 ../src/modules/alsa/alsa-source.c:656
 #, c-format
 msgid ""
-"ALSA woke us up to read new data from the device, but there was actually nothing to read!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue to the ALSA developers.\n"
-"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() returned 0 or another value < min_avail."
+"ALSA woke us up to read new data from the device, but there was actually "
+"nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
 msgstr ""
 
 #: ../src/modules/alsa/module-alsa-card.c:152
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2228
-#: ../src/modules/alsa/alsa-mixer.c:2931
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2262
+#: ../src/modules/alsa/alsa-mixer.c:2936
 msgid "Off"
 msgstr "關閉"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2184
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2204
 msgid "High Fidelity Playback (A2DP)"
 msgstr "高傳真播放裝置 (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2198
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2218
 msgid "High Fidelity Capture (A2DP)"
 msgstr "高傳真擷取裝置 (A2DP)"
 
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2213
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2233
 msgid "Telephony Duplex (HSP/HFP)"
 msgstr "電話雙工 (HSP/HFP)"
 
+#: ../src/modules/bluetooth/module-bluetooth-device.c:2247
+msgid "Handsfree Gateway"
+msgstr ""
+
 #: ../src/modules/reserve-wrap.c:151
 msgid "PulseAudio Sound Server"
 msgstr "PulseAudio 音效伺服器"
 
-#: ../src/modules/module-rygel-media-server.c:569
-#: ../src/modules/module-rygel-media-server.c:583
+#: ../src/modules/module-rygel-media-server.c:592
+#: ../src/modules/module-rygel-media-server.c:606
 msgid "Output Devices"
 msgstr "輸出裝置"
 
-#: ../src/modules/module-rygel-media-server.c:570
-#: ../src/modules/module-rygel-media-server.c:584
+#: ../src/modules/module-rygel-media-server.c:593
+#: ../src/modules/module-rygel-media-server.c:607
 msgid "Input Devices"
 msgstr "輸入裝置"
 
-#: ../src/modules/module-rygel-media-server.c:774
+#: ../src/modules/module-rygel-media-server.c:797
 msgid "Audio on @HOSTNAME@"
 msgstr "音效位於 @HOSTNAME@"
 
@@ -2074,134 +2209,159 @@ msgstr "揚聲器"
 msgid "No Amplifier"
 msgstr "無揚聲器"
 
-#: ../src/modules/alsa/alsa-mixer.c:1773
+#: ../src/modules/alsa/alsa-mixer.c:1716
+#, fuzzy
+msgid "Bass Boost"
+msgstr "加速器"
+
+#: ../src/modules/alsa/alsa-mixer.c:1717
+#, fuzzy
+msgid "No Bass Boost"
+msgstr "無加速器"
+
+#: ../src/modules/alsa/alsa-mixer.c:1718
+msgid "Speaker"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-mixer.c:1719
+#, fuzzy
+msgid "Headphones"
+msgstr "類比頭戴式麥克風"
+
+#: ../src/modules/alsa/alsa-mixer.c:1777
 msgid "Analog Input"
 msgstr "類比輸入"
 
-#: ../src/modules/alsa/alsa-mixer.c:1774
+#: ../src/modules/alsa/alsa-mixer.c:1778
 msgid "Analog Microphone"
 msgstr "類比麥克風"
 
-#: ../src/modules/alsa/alsa-mixer.c:1775
+#: ../src/modules/alsa/alsa-mixer.c:1779
 msgid "Analog Line-In"
 msgstr "類比線路輸入"
 
-#: ../src/modules/alsa/alsa-mixer.c:1776
+#: ../src/modules/alsa/alsa-mixer.c:1780
 msgid "Analog Radio"
 msgstr "類比無線電"
 
-#: ../src/modules/alsa/alsa-mixer.c:1777
+#: ../src/modules/alsa/alsa-mixer.c:1781
 msgid "Analog Video"
 msgstr "類比視訊"
 
-#: ../src/modules/alsa/alsa-mixer.c:1778
+#: ../src/modules/alsa/alsa-mixer.c:1782
 msgid "Analog Output"
 msgstr "類比輸出"
 
-#: ../src/modules/alsa/alsa-mixer.c:1779
+#: ../src/modules/alsa/alsa-mixer.c:1783
 msgid "Analog Headphones"
 msgstr "類比頭戴式麥克風"
 
-#: ../src/modules/alsa/alsa-mixer.c:1780
+#: ../src/modules/alsa/alsa-mixer.c:1784
 msgid "Analog Output (LFE)"
 msgstr "類比輸出 (LFE)"
 
-#: ../src/modules/alsa/alsa-mixer.c:1781
+#: ../src/modules/alsa/alsa-mixer.c:1785
 msgid "Analog Mono Output"
 msgstr "類比單聲道輸出"
 
-#: ../src/modules/alsa/alsa-mixer.c:1981
+#: ../src/modules/alsa/alsa-mixer.c:1786
+#, fuzzy
+msgid "Analog Speakers"
+msgstr "類比立體聲"
+
+#: ../src/modules/alsa/alsa-mixer.c:1986
 #, c-format
 msgid "%s+%s"
 msgstr "%s+%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:1984
-#: ../src/modules/alsa/alsa-mixer.c:3404
+#: ../src/modules/alsa/alsa-mixer.c:1989 ../src/modules/alsa/alsa-mixer.c:3409
 #, c-format
 msgid "%s / %s"
 msgstr "%s / %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2790
+#: ../src/modules/alsa/alsa-mixer.c:2795
 msgid "Analog Mono"
 msgstr "類比單聲道"
 
-#: ../src/modules/alsa/alsa-mixer.c:2791
+#: ../src/modules/alsa/alsa-mixer.c:2796
 msgid "Analog Stereo"
 msgstr "類比立體聲"
 
-#: ../src/modules/alsa/alsa-mixer.c:2792
+#: ../src/modules/alsa/alsa-mixer.c:2797
 msgid "Analog Surround 2.1"
 msgstr "類比環繞聲 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2793
+#: ../src/modules/alsa/alsa-mixer.c:2798
 msgid "Analog Surround 3.0"
 msgstr "類比環繞聲 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2794
+#: ../src/modules/alsa/alsa-mixer.c:2799
 msgid "Analog Surround 3.1"
 msgstr "類比環繞聲 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2795
+#: ../src/modules/alsa/alsa-mixer.c:2800
 msgid "Analog Surround 4.0"
 msgstr "類比環繞聲 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2796
+#: ../src/modules/alsa/alsa-mixer.c:2801
 msgid "Analog Surround 4.1"
 msgstr "類比環繞聲 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2797
+#: ../src/modules/alsa/alsa-mixer.c:2802
 msgid "Analog Surround 5.0"
 msgstr "類比環繞聲 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2798
+#: ../src/modules/alsa/alsa-mixer.c:2803
 msgid "Analog Surround 5.1"
 msgstr "類比環繞聲 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2799
+#: ../src/modules/alsa/alsa-mixer.c:2804
 msgid "Analog Surround 6.0"
 msgstr "類比環繞聲 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2800
+#: ../src/modules/alsa/alsa-mixer.c:2805
 msgid "Analog Surround 6.1"
 msgstr "類比環繞聲 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2801
+#: ../src/modules/alsa/alsa-mixer.c:2806
 msgid "Analog Surround 7.0"
 msgstr "類比環繞聲 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:2802
+#: ../src/modules/alsa/alsa-mixer.c:2807
 msgid "Analog Surround 7.1"
 msgstr "類比環繞聲 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:2803
+#: ../src/modules/alsa/alsa-mixer.c:2808
 msgid "Digital Stereo (IEC958)"
 msgstr "數位立體聲 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2804
+#: ../src/modules/alsa/alsa-mixer.c:2809
 msgid "Digital Surround 4.0 (IEC958)"
 msgstr "數位環繞聲 4.0 (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2805
+#: ../src/modules/alsa/alsa-mixer.c:2810
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "數位環繞聲 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2806
+#: ../src/modules/alsa/alsa-mixer.c:2811
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "數位環繞聲 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2807
+#: ../src/modules/alsa/alsa-mixer.c:2812
 msgid "Digital Stereo (HDMI)"
 msgstr "數位立體聲 (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2928
+#: ../src/modules/alsa/alsa-mixer.c:2933
 msgid "Analog Mono Duplex"
 msgstr "類比單聲道雙工"
 
-#: ../src/modules/alsa/alsa-mixer.c:2929
+#: ../src/modules/alsa/alsa-mixer.c:2934
 msgid "Analog Stereo Duplex"
 msgstr "類比立體聲雙工"
 
-#: ../src/modules/alsa/alsa-mixer.c:2930
+#: ../src/modules/alsa/alsa-mixer.c:2935
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "數位立體聲雙工 (IEC958)"
 
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "低頻率揚聲器"

-- 
hooks/post-receive
PulseAudio Sound Server



More information about the pulseaudio-commits mailing list