
Home • About • Community • Download • Documentation • Planet |
PulseAudio 4.0 Release Notes
Changes at a glance
- Better handling of low latency requests
- Optimisations while mixing (generic, ARM NEON)
- Default resampler is now speex-float-1 (lower CPU usage)
- Major Bluetooth refactoring for better reliability and easier maintenance
- Fixes for graceful hand-off to/from JACK
- New module to apply ducking based on stream roles
- Echo canceller infrastructure fixes
- Bash and zsh completion for command line tools
- Solaris and OS X fixes
- Lots of other enhancements, bug fixes, and documenation and i18n updates
Notes for Application Developers
So far card profiles have been static, that is, the set of profiles on a card has never changed after the creation of the card object. While that has never been promised in the API documentation, it may be that some applications have the assumption that the profiles are static. Due to the nature of the Bluetooth protocol, it has turned out to be necessary to be able to add profiles to a card after it has been created. So, make sure your application doesn't crash or otherwise behave badly if new profiles suddenly appear on a card. It's best to prepare for profiles disappearing too.
It is now possible to track operation state via a callback using the newly added pa_operation_set_state_callback().
Notes for Packagers
D-Bus dependency version has been bumped to 1.4.12, alsa-lib to 1.0.24 and GTK+ to 3.0. libsystemd-daemon is no longer a dependency for systemd support.
pa_format_info_free2 symbol has been dropped from libpulse. The pa_format_info_free2 symbol was never part of the public API, but was still exported in libpulse in previous versions of PulseAudio. It is now completely dropped. Since it was never exposed in any header files, no programs are expected to break due to this change.
Changes in More Detail
Utility changes:
Shell completion is now available for most of the utility programs. Bash and zsh are supported.
pactl now supports toggling mute. To be clear, setting the mute to on or off was already supported before, this change adds the possibility to give "toggle" as a parameter to the set-*-mute commands.
New pactl commands: set-default-sink and set-default-source.
Module changes:
New module: module-role-ducking. The module lowers the volume of less important streams when a more important stream appears, and raises the volume back up once the important stream has finished (this is called "ducking"). The decision whether a stream has high or low priority is made based on the stream role (the media.role property). By default, "music" and "video" streams are ducked, and "phone" streams trigger the ducking. This module is not loaded in the default configuration.
New module: module-remap-source. The module creates a virtual source on top of another source, with a different channel map. This allows swapping left and right channels, for example.
module-udev-detect: New module argument: use_ucm. PulseAudio uses ALSA UCM configuration by default if it's available. This module argument can be used to disable UCM.
module-udev-detect: New module argument: tsched_buffer_size. Buffer size in bytes when timer based scheduling is enabled.
module-rtp-send: The "destination" argument was renamed to "destination_ip".
module-rtp-send: New module argument: source_ip. On a multi-homed system, it may be desirable to use RTP only on a specific interface. The interface can be selected by specifying the source IP address.
Hardware support changes:
Both outputs of Native Instruments Traktor Audio 2 can now be used simultaneously without any manual configuration.
Mixer improvements for some laptops with TRRS headset jacks.
Capture support fixed for Logitech B530 USB headset and Focusrite Scarlett 2i2.
libpulse changes:
New function: pa_operation_set_state_callback(). It allows an application to get a callback from pa_operation when it's cancelled (perhaps due to disconnection).
PA_ENCODING_MPEG2_AAC_IEC61937 added to the pa_encoding_t enumeration. This means that it's now possible to play MPEG-2 AAC streams in the passthrough mode to devices that support it.
HDMI / DisplayPort monitor name is now available to clients. If supported by HDMI / DisplayPort hardware and drivers, the name of the connected monitor, receiver etc. will now show up as a port property (with key PA_PROP_DEVICE_PRODUCT_NAME). Note that the name might become available slightly after the port becomes available (this is due to hardware/driver limitations). A card change event will be sent out when this information changes.
Performance improvements:
Faster C code for mixing 16-bit streams with 1 or 2 channels.
ARM NEON implementation for mixing 16-bit streams with 2 channels.
Faster software volume for 16-bit streams on 64-bit platforms.
Faster format conversion between 16-bit and 32-bit (integer) audio.
The default resampler was changed from speex-float-3 to speex-float-1, so the resampling is now much lighter on CPU by default than before, with the tradeoff that the audio quality is worse (usually not noticeably so, though).
Bug fix highlights:
Quicker drains: in previous versions of PulseAudio, it could sometimes take up to a few seconds after a stream finished playing until pa_stream_drain() actually returned. This has now been fixed, which also means that programs such as paplay will end quicker after having finished playback.
Issues with device handover to JACK were fixed. JACK should be now able to reliably acquire the sound card while PulseAudio is running.
When converting between different channel maps, the remixing can't result in clipping any more. Streams that earlier could potentially get clipped are now a bit quieter.
In certain low-latency scenarios PulseAudio used a bad algorithm to decide when to ask clients to send more data (the data request was sent so late that it was impossible to get the data to the sound card reliably in time). The algorithm has been improved, resulting in fewer drop-outs in those scenarios.
Next Steps
There's already been a large amount of work happening in the 'next' branch (which will be merged into master shortly). The highlight of these changes is support for BlueZ 5. There has been discussion already for a while about making big routing related improvements, and code should start materializing during the next cycle. We also have 2 projects happening under the Google Summer of Code and hope to see related changes in the next release, along with the usual slew of fixes and improvements.
git shortlog
Akihiro Tsukada (2):
add support for MPEG-2 AAC pass-through
Bump the native protocol version
Albert Zeyer (1):
semaphore-osx: posix implementation based on named semaphores
Arun Raghavan (18):
tests: Minor alsa-time-test improvments
core: Fix up some debug logging
stream: Make it easier to enable debug output
alsa: Minor debug log addition
protocol-native: Fix some debug output
resample: Switch to speex-float-1 by default
pulsecore: Don't conditionally inline pa_run_from_build_tree()
alsa: Fix mixer path when running from build tree
build-sys: Bump sonames
equalizer: Fix compiler warning due use of 'signal'
rygel: Set DLNA profile on our MediaItems
daemon: Fix dlsearchpath while running from build tree
pulsecore: Make run-from-build not readlink() on every call
build-sys: json-c changed everything :(
sink-input,source-output: Deal with FIX* flags and extended API
build-sys: Bump soname
Add a NEWS file
build-sys: Bump soname
Christoph Gysin (1):
doc: Generate API documentation for ext-device-manager and ext-device-restore.
David Henningsson (39):
alsa-mixer: Fix the analog-output-speaker-always path
pactl: Document @DEFAULT_SINK@, @DEFAULT_SOURCE@ and @DEFAULT_MONITOR@
alsa-sink/source: Better thread names
alsa-ucm: Fallback to stereo duplex
module: Unload modules in reverse order
alsa-util: Add a function to read ELD info
alsa-mixer: Add possibility to configure ELD device
alsa-card: Make ELD monitor name a port property
default.pa: Load module-jackdbus-detect with channels=2 by default
bluetooth: Never allow microphone output ports
core, alsa: Better drain reporting
tests: Move ipacl-tests to TESTS_norun
sink-input: Make sure the process_underrun callback is cleared
alsa-mixer: Add path for Headset Microphone
alsa-mixer: Support more phantom jacks
tests: Add tests for alsa-mixer paths
protocol-native: Ensure tlength is not set higher than maxlength
protocol-native: Lower default minreq in low-latency scenarios
client API: Document buffer_attr.maxlength
alsa-mixer: It's valid to have zero elements in a path
alsa-mixer: Add "Headset Playback|Capture" element
pstream: Rename "do_something" function
socket-server: Make the new channel low-delay, not the listening one
pstream: Optimise write of smaller packages
alsa-mixer: Add more jack detection for Headset mic path
alsa-mixer: Change profile-sets directory to PA_SRCDIR
alsa: Initialize ports before sinks/sources
module-switch-on-port-available: Handle hotplugged cards
default.pa: Load switch-on-port-available before udev-detect
alsa: Fix ELD access warning on shutdown
alsa-mixer: Allow input fallback port for devices with no gain control
alsa-mixer: Switch to Headphone when Headphone mic jack is plugged in
po: Fix error in hungarian translation
alsa: Fix crash when profile_set == NULL
alsa-mixer: Add "Line Out Jack" to analog-output.conf
sink-input/source-output: Don't set save_volume if volume is not writable
core-util: Add pa_safe_streq
module-device-manager: Fix description restore
rtp: Reset timestamp with correct size if not found
Flavio Ceolin (3):
sink-input: New volume_factor system
modargs: Adding pa_modargs_get_value_volume()
role-ducking: Apply a ducking effect based on streams roles
Jarkko Suontausta (1):
core: Assert on memchunk divisibility by sample spec in pa_memblockq_push().
Javier Jardón (1):
build-sys: Use AM_CPPFLAGS instead of AM_CFLAGS for preprocessor arguments
João Paulo Rechi Vita (1):
alsa-source: Fix log message
Jyri Sarha (1):
combine: Stop rate adjustments if sink is supended
Luiz Augusto von Dentz (1):
bluetooth: Add support for transport created by external profile
Maarten Lankhorst (1):
alsa: skip eld initialization if hctl_handle is NULL
Marc-Antoine Perennou (1):
port to gtk+-3.0
Martin Pitt (1):
console-kit, systemd-login: Check for logind, not for systemd
Matěj Laitl (1):
qpaeq: Try to load equalizer module before failing, better error messages
Mikel Astiz (66):
dbus: Support dynamically created card profiles
dbus: Add signal org.PulseAudio.Core1.Card.NewProfile
bluetooth: Handle UUIDs announced later
bluetooth: Fix condition to load module
bluetooth: Make pa_bluetooth_transport_parse_property() private
bluetooth: Remove unused pa_bluetooth_discovery_get_transport()
bluetooth: Add device pointer to transport
bluetooth: Use round() to convert PA<->BT volumes
bluetooth: Add transport hashmap to discovery
bluetooth: Use transport array instead of hashmap for devices
bluetooth: Remove pa_bluetooth_device_get_transport()
bluetooth: Avoid PA_BLUETOOTH_DEVICE_HOOK_REMOVED
bluetooth: Extend discovery to support multiple hooks
bluetooth: Move device hooks into pa_bluetooth_hook_t
bluetooth: Use array to store profile states
bluetooth: Refactor parse_audio_property() to support more properties
bluetooth: Add state to transport objects
bluetooth: Add transport hooks into pa_bluetooth_hook_t
bluetooth: Avoid PA_BLUETOOTH_TRANSPORT_HOOK_REMOVED
bluetooth: Avoid PA_BLUETOOTH_TRANSPORT_HOOK_NREC_CHANGED
bluetooth: Remove deprecated transport hooks
bluetooth: Connect all hooks during module load/unload
bluetooth: Abstract microphone gain in transport
bluetooth: Abstract speaker gain in transport
bluetooth: Use bluetooth-util for mic/speaker gain control
bluetooth: Move profile_to_string() to bluetooth-util
bluetooth: Refactor parsing of profile state changes
bluetooth: Use transport state to update port availability
bluetooth: Abstract transport access types inside bluetooth-util
bluetooth: Trivially remove bt_transport_is_acquired()
bluetooth: Refactor dependency to org.bluez.Audio
bluetooth: Use transport state instead of profile states
bluetooth: Remove D-Bus dependency in module-bluetooth-device
bluetooth: Call setup_stream() manually
bluetooth: Replace acquire param 'start' with 'optional'
bluetooth: Fix incorrect error messages
bluetooth: Fix minor style issues
bluetooth: Check message signature for SetConfiguration
bluetooth: Use stdbool for pa_bool_t
bluetooth: Do not check profile states is device_audio_is_ready()
bluetooth: Remove device_is_audio_ready()
bluetooth: Simplify redundant error check
bluetooth: Fix potential assertion failure if MTU changes
bluetooth: Fix sending D-Bus reply before internal callback
bluetooth: Fix potential assertion failure due to unaligned packet size
bluetooth: Propagate to property parsers if it is initial value
bluetooth: Detect changes in constant properties
reserve: Move get_name_owner() to the public rd_device API
reserve: Fix leaking NameLost signals after release+acquire
bluetooth: Fix incorrect index check with PA_ELEMENTSOF
bluetooth: Fix premature acquire attempts
core: Internally deprecate pa_port_available_t to use pa_available_t
card: Add card profile availability
cli: Show card profile availability status
bluetooth: Expose card profile availability
bluetooth: Use profile availability to auto-switch profiles
bluetooth: Merge all ports into "bluetooth-input" and "bluetooth-output"
bluetooth: Fix possible adapter duplicates
bluetooth: Fix assertion failure if BlueZ crashes during GetProperties
card: Set initial profile availability state
bluetooth: Use enum to represent form factors
bluetooth: Add specific form factor for phones
bluetooth: Use form factor to set port name and description
Revert "card: Support adding ports dynamically"
bluetooth: Create ports before card profiles
bluetooth: Fix missing port->profile association
Paul Meng (1):
pulse: Add pa_operation_set_state_callback() API
Peter Meerwald (45):
tests: Fix allowed sample formats in resampler-test usage text
echo-cancel: Fix error cleanup of pa_speex_ec_init()
tests: Fix conversion typo in cpu-test
tests: Fix potential out-of-bound access violation in svolume cpu-test
remap_sse: More specific logging: SSE -> SSE2
tests: Test both, SSE and SSE2, sconv in cpu-test
tests: Add remap test code to cpu-test
sconv: Check for SSE flag before initializing code
tests: Fix sconv sample correctness in cpu-test
resampler: Drop redundant assignment in convert_from_work_format()
resampler: Improve s16<-->s32 conversion, use s16 work format if input or output is s16
sconv: Change/fix conversion to/from float32
build-sys: ALSA use-case manager requires ALSA library >= 1.0.24
build-sys: Properly check for HAVE_DBUS in module-ladspa-sink
echo-cancel: Add function pa_echo_canceller_blocksize_power2()
echo-cancel: Output echo canceller name if invalid
echo-cancel: Fix memory leak / deinitialization of Adrian AEC
echo-cancel: Fix zeroing of w in AEC_leaky()
echo-cancel: Use proper float constants in adrian-aec
resampler: Resample first followed by remapping if have more out channels than in channels
tests: Volume-test seems to be long-running, set timeout
core: Move pa_mix() into new file mix.c
sample-util: Remove duplicate stdio.h #include
mix: Use table for calc_stream_columes()
mix: Split pa_mix() code using function table
mix: Export function to get/set mixing implementation for a sample format
mix: Combine loops over streams in pa_mix()
core: Refactor code to multiply s16 by volume
tests: Add mult-s16 test
mix: Add special cases for mixing streams in s16ne format
mix: Change end pointer to length parameter in mixing function
mix: Add optimized mix code path for ARM NEON
tests: Add NEON mix test cases to cpu-test
tests: add test/performance comparison for mixing special-case code
remap: fix check when to apply specialized code path
doc: Fix suggested dl-search-path in README
doc: Mostly fixing up i.e. versus i.e.\ in doxygen documentation
doc: Some more nitpicking in pulse/def.h doxygen documentation
doc: Document PULSE_COOKIE in pulseaudio.1
doc: Explain PULSE_SERVER string in pulseaudio.1
pstream: Fix case in log message
doc: Mention just one CLI language in default.pa.5
doc: Fix description how boolean values can be specified
doc: Reword description of meta commands in pulse-cli-syntax.5
echo-cancel: Fix send/recv_counter in calc_diff()
Peter Nelson (1):
jackdbus-detect: Add channel count override.
Piotr Drąg (3):
i18n: Update Polish translation
i18n: Update Polish translation
i18n: Update Polish translation
Robin H. Johnson (3):
rtp: Cleanup variable naming.
rtp: rename modarg destination to destination_ip
rtp: Introduce source IP configuration
Stefan Huber (19):
echo-cancel: Fix apply_diff_time() to use correct sample spec
echo-cancel: Fix null implementation to setup one channel
echo-cancel: Fix echo-cancel-test's argument number checking
echo-cancel: Fix missing setup of sink_ss in echo-cancel-test.
echo-cancel: Fix calc_diff for asymmetric sample specs
echo-cancel: Enable different blocksizes for sink and source
echo-cancel: Extend null implementation to arbitary sample specs
resampler: Replace pa_bool_t by bool
resampler: Refactor calc_map_table()
resampler: Generate normalized rows in calc_map_table()
echo-cancel-test: Enable debug log level
echo-cancel-test: Pass aec_args with module args
echo-cancel-test: When fopen() fails tell which file failed
echo-cancel: Do not bypass EC implementation when play stream is empty
echo-cancel: Enable different sample specs for rec and out stream
modules: add module-remap-source
virtual-source: remove redundant checks and callbacks
modules: remove obsolete comment on PA_SOURCE_OUTPUT_DONT_INHIBIT_AUTO_SUSPEND
modules: Remove obsolete may_move_to callbacks
Tanu Kaskinen (86):
mainloop: Remove redundant wakeup_pipe validity checks.
mainloop: Check pa_write() return value.
esound: Suspend/resume also sources on STANDBY/RESUME commands.
Log the reason for every suspend/resume.
card-restore: Log the restored profile name.
bluetooth: Check if BlueZ tries to set the configuration twice for the same transport.
bluetooth: Remove prefixing from static functions.
core-util: Improve get_path() documentation
man: Document the possiblity of unloading modules by name in pulse-cli-syntax.
bluetooth: Improve transport state change log message.
bluetooth: Make pa_bt_audio_state_from_string() private.
bluetooth: Don't free read_smoother in pa__done().
pasuspender: Check pa_context_connect() return value.
Fix pa_parse_boolean() return value checking.
smoother-test: Fix array overflow.
mainloop-signal: Explicitly ignore pa_write() return value.
oss: Check pa_read() return value.
cpulimit: Explicitly ignore pa_read() return value.
device-restore: Fix empty argument list declaration.
memblockq: Use pa_xnew0() to avoid manual zeroing.
modargs: Don't fail needlessly in pa_modargs_get_sample_spec_and_channel_map().
man: Update log-target documentation.
bluetooth: Don't access a transport after it's freed.
build: Don't enable BlueZ if libbluetooth is not found.
bluetooth: Remove pa_bluetooth_discovery_sync().
shm: Support Solaris shm file paths.
solaris: Fix get_playback_buffered_bytes() return value.
solaris: When suspending, flush the device instead of draining it.
pulse: Fix endianness definition on Sparc.
bluetooth: Convert booleans to stdbool.
pulse: Initialize pa_operation objects to all-zero.
Call change_cb() only when there's an actual change.
Initialize monitor's busy status to false if we own the device.
jack: Don't fail module-jackdbus-detect loading if the channels argument is not given.
device-port: Return early from pa_device_port_set_latency_offset() if the offset doesn't change.
card: Remove some unnecessary checks.
build-sys: Bump D-Bus dependency version to 1.4.12.
build-sys: Fix an outdated D-Bus version in an error message.
ladspa: Fix a couple of minor memory leaks.
.gitignore: Add pulse-daemon.log.
build-sys: Install the bash completion script.
build-sys: Use dist_vapi_DATA instead of listing the files in EXTRA_DIST.
bluetooth: Fail if BlueZ tries to give duplicate device addresses.
tests: Fix function argument wrapping style in cpu-test.c.
simple: Handle holes in recording streams.
padsp: Handle holes in recording streams.
pacat: Handle holes in recording streams.
dbus: Fix connection cleanup when killing clients
dbus: Fix cleanup when removing signal listeners
udev: Add use_ucm module argument
build-sys: Add check-daemon target to the top-level Makefile.am.
tests: Indicate failure in test-daemon.sh by returning 1 if any test fails.
daemon: Don't rely on prctl(PR_SET_KEEPCAPS, 0) for dropping caps.
echo-cancel: Fix tap weights array alignment
echo-cancel: Fix uninitialized variable dotp_xf_xf of AEC struct
gconf: Add userdata pointer to struct module_info
gconf: Remove needless userdata function arguments
hashmap: Use pa_free_cb_t instead of pa_free2_cb_t
device-port: Remove pa_device_port_hashmap_free()
idxset: Use pa_free_cb_t instead of pa_free2_cb_t
hashmap: Add pa_hashmap_remove_all()
idxset: Add pa_idxset_remove_all()
bluetooth: Fix thread teardown code ordering
format: Add #defines for enum values
module: Don't use lt_dlerror(), it's useless
ltdl-bind-now: Log an error in case of failures
man: Remove reference to the .verbose CLI command
udev: Add tsched_buffer_size module argument
ladspa: Use volume sharing.
pulse: Document the operation state behavior on context disconnection.
alsa: Add configuration for NI Traktor Audio 2
pacat: Fix mode detection for parecord
loopback: Fix segfault in may_move_to() callbacks
filter-apply: Fix segfault with moving streams
loopback: Flush asyncmsgq from the right context
conf-parser: Remove redundant feof() call
Revert "conf-parser: Remove redundant feof() call"
.gitignore: Add alsa-mixer-path-test
sink: Fix flag name typo
mix: Mix the right number of streams
shm: Don't force the shm files to be read-only
sink, source: Propagate flag changes to filters
sink, source: Really set the fixed latency in set_fixed_latency_within_thread(), always.
sink, source: Send notifications when flags change
alsa-mixer: Don't use the mono path in the analog-stereo mapping.
map-file: Remove pa_format_info_free2
Vadim Troshchinskiy (1):
osx: Fix latency querying
Wang Xingchao (1):
sndfile-util: reduce useless loop
Yuri Chornoivan (2):
Update Ukrainian translation.
Fix various typos in messages and comments
poljar (Damir Jelić) (14):
device-port: Add a card pointer to the ports.
device-port: Access the cards directly.
device-port: Cleanup of the sink/source subscription events.
device-port: Fire a hook when the latency offset changes.
card-restore: Only use hooks for the events.
pactl: Add the ability to toggle mute state.
build: Add zsh completion
build: Add bash completion
bash-completion: Don't complete devices in the list commands
pactl: Add a command for setting the default sink/source.
zsh-completion: Add support for remote servers.
zsh-completion: Add support for the new pactl commands.
zsh-completion: Fix pacat completion.
systemd-login: Remove unused variable session.
Ștefan Săftescu (1):
virtual-sink: Removed the option to specify sample format.
