



PulseAudio 10.0 release notes

Changes at a glance

Automatically switch Bluetooth profile when using VoIP applications

New module for prioritizing passthrough streams (module-allow-passthrough)

Fixed hotplugging support for USB surround sound cards

Separate volumes for Bluetooth A2DP and HSP profiles

memfd-based shared memory mechanism enabled by default

Removed module-xenpv-sink

Dropped dependency to json-c

When using systemd to start PulseAudio, pulseaudio.socket is always started first

Compatibility with OpenSSL 1.1.0

Clarified qpaeq license

Notes for end users

Automatically switch Bluetooth profile when using VoIP applications

Bluetooth headsets typically support both the A2DP profile, which is suitable for music, and the HSP profile, which is suitable for telephony use cases. module-bluetooth-policy will now automatically switch the profile of a Bluetooth headset from A2DP to HSP/HFP when an application creates a recording stream with property media.role=phone (telephony applications should set that property for their streams). When the stream goes away, the profile gets restored back to A2DP. This way the user doesn't have to manually switch the profiles when starting and stopping a call. This behaviour can be disabled by giving argument auto_switch=false to module-bluetooth-policy.

New module for prioritizing passthrough streams (module-allow-passthrough)

Passthrough streams are streams whose content must go completely unaltered from the application to the sound card, and they are mainly used for playing back compressed audio through an S/PDIF connection. When a passthrough stream is playing to a device, no other streams can play at the same time to the same device, and if there's already something playing when a passthrough stream is created, the passthrough stream creation will normally fail. Now we have a new module, called module-allow-passthrough, which will give higher priority to passthrough streams, so that if there are other streams playing when a passthrough stream is created, those other streams will be moved out of the way to a dummy device.

Fixed hotplugging support for USB surround sound cards

A long-standing bug that prevented PulseAudio from using any hotplugged USB surround sound cards has been fixed.

Separate volumes for Bluetooth A2DP and HSP profiles

The Bluetooth sink and source names are now different depending on whether the active profile is A2DP or HSP. This allows PulseAudio to store different volumes for A2DP and HSP. Due to different mechanisms for implementing volume control between the profiles, trying to use the same volume value in PulseAudio doesn't actually result in the same perceived volume, so it's better not to try to use the same volume.

As an unfortunate transition effect, volumes saved earlier with an older PulseAudio version won't have effect in the new PulseAudio version, so all Bluetooth devices will have their volume reset to the default value when running the new PulseAudio version for the first time.

This only affects BlueZ 5 users. The same change was done already earlier for PulseAudio's BlueZ 4 code.

memfd-based shared memory mechanism enabled by default

The memfd-based shared memory mechanism that was implemented in 9.0 is now enabled by default. This shouldn't cause any user-visible changes in behaviour, except if you're using the Firejail sandboxing software, which doesn't work with PulseAudio's old shared memory mechanism.

If desired, the feature can still be disabled by setting "enable-memfd = no" either in daemon.conf (for disabling it at the server side) or in client.conf (for disabling it at the client side).

Removed module-xenpv-sink

module-xenpv-sink was removed, because it's probably not used by anyone. If you use it, please let us know.

Notes for packagers

Dropped dependency to json-c

libpulse previously used json-c internally, which forced applications to link to json-c too. That caused crashing in some GLib applications, because json-c and json-glib both use the same name for some functions. To solve this, we implemented the necessary JSON functionality directly in libpulse, so we don't depend on json-c any more.

When using systemd to start PulseAudio, pulseaudio.socket is always started first

The pulseaudio.service unit now depends on pulseaudio.socket, meaning that before systemd starts PulseAudio, it will always first set up the socket. This is done to avoid confusing behaviour in certain corner cases (see the comments in pulseaudio.service for a more detailed explanation).

Compatibility with OpenSSL 1.1.0

OpenSSL, which is used by module-raop-sink, broke backwards compatibility in the 1.1.0 release. PulseAudio now supports both 1.1.0 and older versions.

Clarified qpaeq license

Most of PulseAudio is licensed under LGPL, but the "qpaeq" equalizer GUI is licensed under AGPL. That hasn't previously been mentioned anywhere else than in the qpaeq source code itself. Therefore, distributions that tag their packages with license information have likely used incorrect information. The license of qpaeq hasn't changed, but the use of AGPL is now correctly noted in the top-level LICENSE file.

git shortlog

Ahmed S. Darwish (7): pstream: Add rationale for pa_cmsg_ancil_data_close_fds() protocol-native: DRY: Remove pdispatch callbacks declarations iochannel: Strictly specify PF_UNIX ancillary data boundaries protocol-native: Don't signal memfd support for 9.0 clients pacat: Synchronize STDIN and "write stream ready" events stream: Frame-align divided audio segments pacat: Write to stream only in frame-sized chunks Aidan Gauland (1): qpaeq: Don't set font-size on widgets Alexander E. Patrakov (1): alsa: reread configuration when opening new devices Anton Lundin (1): raop: Correct spelling of KTH Arun Raghavan (21): client, protocol-native: Use macros for protocol version/flag access allow-passthrough: Use pa_module_hook_connect() i18n: Add module-allow-passthrough to POTFILES.in pulse: Add a JSON-parsing library format: Drop dependency on json-c json: Correctly handle bad strings with missing closing quotes json: Add overflow checks for integer and float parsing json: Handle error cases while parsing numbers json: Error out for objects and arrays that are nested too deep json: Add a positive test for nested objects json: Add some more negative test cases json: Drop refcounting of json objects device-port: Add mechanism to free implementation data alsa: Use pa_device_port->impl_free() for freeing port data modargs: Add a mechanism to append modargs daemon: Tone down system mode snarkiness memblockq-test: Rename test to something more relevant sink-input,source-output: Fix a leak during property change logging source-output: Fix copy-pasto shm: Wrap memfd-specific code in relevant ifdef stream-interaction: Fix a memory leak Balázs Úr (1): i18n: update Hungarian translation Chris Billington (2): source: Fixed bug: pa_source_set_port() did not update the latency_offset. sink, source, device-port: renames to distinguish latency offsets Cédric Valmary (1): i18n: update Occitan translation Deepak Srivastava (1): xen: Fixed possible memory leak. Dušan Kazik Kazik (1): i18n: Update Polish translation Felipe Sateler (1): launch: make pulseaudio.service properly order and require the socket Fran Dieguez (1): i18n: add Galician translation Georg Chini (8): loopback: Save time stamps during latency snapshots loopback: Improve latency estimation in snapshots loopback: Improve latency estimation loopback: Change memblockq length loopback: Move timer restart and snapshots to timer callback loopback: Restart timer after 1/3 second loopback: Adjust rate based on latency difference loopback: Stop tracking max_request and min_memblockq_length Guillaume Desmottes (1): allow-passthrough: Add module to allow passthrough streams always go through Jan Alexander Steffens (heftig) (1): launch: Remove the already implicit After=pulseaudio.socket John Paul Adrian Glaubitz (2): pulsecore: Fix incorrect architecture mapping on sparc64. core-util: Use _SC_NPROCESSORS_ONLN instead of _SC_NPROCESSORS_CONF Juha Kuikka (1): bluetooth: fix race condition in BlueZ5 device disconnection Juho Hämäläinen (1): pulsecore: Don't allow unreferencing linked object. KimJeongYeon (1): ladspa-sink: avoid to configure invalid format Marcin Lewandowski (1): core-util: log error if we hit file descriptors limit Mario Blättermann (1): i18n: update German translation Moo (1): i18n: add Lithuanian translation Nils Schneider (1): pipe-sink: align buffer Pali Rohár (3): bluetooth: Add support for automatic switch between hsp and a2dp profiles bluetooth: bluez5: Add profile name to sinks and sources bluetooth: Add support for automatic switch between hsp and a2dp profiles also for bluez5 Peter Meerwald (2): tests: Include signal.h in core-util-test.c build: Check version of check library, require >= 0.9.10 Peter Meerwald-Stadler (16): sink-input,source-output: Fix logging, don't overwrite old_value when value == 0 alsa: Check pa_modargs_get_value_boolean() retval for use_ucm tests: Assert fillrate > 0 in alsa-time-test stream: Check pa_tagstruct_get_format_info() retval in pa_create_stream_callback() modules: Check pa_threaded_mainloop_start() return value tests: Check pa_rtpoll_run() return value modules: Use pa_assert_se() to check return value of dbus_message_iter_close_container() Remove newline at end of log messages bluetooth: Don't free modargs twice bluetooth: Fix dead code bluetooth: Reorganize code to avoid Coverity NULL dereference warning bluetooth: Fix negative array index write padsp: Fix flush and improve error handling core: Replace PA_PAGE_SIZE with pa_page_size() tests: Assert granularity range in stripnul.c sample: Assert validity of sample_spec Philip Withnall (1): zeroconf-discover: fix a memory leak Pierre Ossman (3): memblockq: move minreq handling in to memblockq tests: add test to verify correct minreq behaviour memblockq: remove internal "missing" state variable Piotr Drąg (2): i18n: fix errors and warnings in Belarusian and Korean translations i18n: update Polish translation Rikard Söderström (1): daemon-conf: changed 'not' to 'note' Romain Naour (1): build-sys: C++11 is only required for WebRTC support Sylvain Baubeau (1): zeroconf: use local icon for shared devices Tanu Kaskinen (41): pstream: fix revoke callback setting webrtc: improve comment about mic geometry alsa, bluetooth: fail if user-requested profile doesn't exist card: don't allow the CARD_NEW hook to fail card: move profile selection after pa_card_new() card: remove pa_card_new_data.active_profile alsa: set availability for (some) unavailable profiles launch: explain why .service depends on .socket bluetooth: wait for all profiles to connect before creating card card-restore: don't switch profiles when availability changes bluetooth: remove a redundant assignment bluetooth: update device's valid flag after parsing properties bluetooth: unify BlueZ 4 and BlueZ 5 UUID handling bluetooth: unify BlueZ 4 and BlueZ 5 profile constant names bluetooth: refactor BlueZ 4 transport state setting bluetooth: don't create the HSP/HFP profile twice zeroconf-publish: fix uninitialized variable zeroconf-publish: unref D-Bus connection daemon-conf: enable memfd by default raop: add compatibility with openssl 1.1.0 remove module-xenpv-sink module: postpone lt_dlclose() until a safe time rtp: don't use memblocks for non-audio data don't assume that pa_asyncq_new() always succeeds bluetooth-policy: do A2DP profile restoring a bit later suspend-on-idle: use earlier (safer) hooks for stream unlink notifications sink-input, source-output: set sink/source to NULL before the "unlink post" hook sink, source: unify stream "attached" flag checking sink, source: add missing stream "attached" flag handling sink, source: remove some assumptions about stream "attached" state refactor stream attaching/detaching build-sys: add LICENSE.WEBKIT to EXTRA_DIST Revert "memblockq: remove internal "missing" state variable" LICENSE: add a clarification LICENSE: add a note about qpaeq being licensed under AGPL memblockq: remove pa_memblockq_missing() memblockq-test: fix incorrect assumption of pa_memblockq_pop_missing() behaviour build-sys: bump sonames zeroconf-publish: fix unitialized DBusError update NEWS build-sys: add the AGPL license file to tarballs Ulrich Eckhardt (10): core-util-test: Add boilerplate core-util-test: Add tests core-util: Improve pa_replace() behaviour modargs: Document behaviour on missing arguments memblockq-test: Utility function to alloc chunks memblockq-test: Utility function to validate queue invariants memblockq-test: Some refactoring memblockq-test: Add a test that checks initial properties memblockq-test: Add test changing the parameters of a queue memblockq-test: Add a test for missing data behaviour Viktar Vaŭčkievič (1): i18n: add Belarusian translation