PulseAudio 7.0 Release Notes

Changes at a Glance

  • LFE channel synthesis with low-pass filtering
  • New libsoxr based resamplers
  • Socket activation support for TCP
  • The "srbchannel" IPC mechanism enabled by default
  • More flexible jack detection support when using UCM
  • Exiting due to SIGTERM isn't considered a failure

Notes for Application Developers

(nothing important happened)

Notes for Packagers

There's a new optional dependency on libsoxr. The minimum supported version is 0.1.1. libsoxr is used for the soxr-mq, soxr-hq and soxr-vhq resamplers.

Changes in More Detail

LFE channel synthesis with low-pass filtering

When the speaker system has a subwoofer, it's often desirable to synthesize the LFE channel audio when the original audio content doesn't have a separate LFE channel. Previously PulseAudio supported doing that by simply feeding the average of all input channels to the LFE channel, but it's often better to filter out any high frequencies going to the subwoofer. That's now supported, and enabled by default.

The default value of "enable-lfe-remixing" in daemon.conf has changed from "false" to "true", and there's a new daemon.conf option for configuring the crossover frequency: "lfe-crossover-freq". The crossover filtering can be disabled by setting "lfe-crossover-freq" to zero, and if "enable-lfe-remixing" is "true", then the old LFE synthesis algorithm is used.

New libsoxr based resamplers

There are three new libsoxr based resamplers available: soxr-mq, soxr-hq and soxr-vhq. Quality-wise all should be perfect (no audible distortions), but the hq and vhq variants can be used if "even more perfect" quality is desired. The libsoxr developers recommend the hq variant for bit depths up to 16 bits, and the vhq variant for higher bit depths (the internal processing happens with higher precision in the vhq variant). The statement that even the mq variant is "perfect" is based on Alexander E. Patrakov's measurements using a psychoacoustic model for determining whether any produced distortions are actually audible (they're not). The model is described in this paper: http://www.mp3-tech.org/programmer/docs/6_Heusdens.pdf

The mq and hq variants have better performance than speex-float-1 (the current default resampler). We would make soxr-mq the default resampler, if it wasn't for one significant drawback: the resamplers usually introduce up to around 20 ms of extra latency, and in some rare cases even more.

More discussion about the merits and shortcomings of the new resamplers can be found in this mailing list thread: http://thread.gmane.org/gmane.comp.audio.pulseaudio.general/22158

Here are some benchmarking results: http://lastique.github.io/src_test/

Socket activation support for TCP

The previous release introduced support for systemd socket activation for unix sockets. Now the support has been extended to cover TCP sockets as well. This allows PulseAudio to be started on-demand on headless servers, for example.

The "srbchannel" IPC mechanism enabled by default

The "srbchannel" IPC mechanism, which improves efficiency particularly on low latency streams, was introduced in the previous release, but it was too buggy to be enabled by default at that time. Bugs have been fixed since, and now the feature is enabled by default.

More flexible jack detection support when using UCM

Systems that use ALSA's UCM (use case manager) for describing the hardware can now configure the jack kcontrol for a device using the "JackControl" value. Previously, jack detection with UCM relied on implicit heuristics for the jack kcontrol name, which didn't always work well enough. Also, the "JackHWMute" value for UCM devices is now supported, so PulseAudio understands when plugging in a jack for one device makes another device unavailable.

Exiting due to SIGTERM isn't considered a failure

When PulseAudio receives SIGTERM, the process now exits with return value 0. Previously the return value was 1, signaling a failure, which didn't make much sense. If you have e.g. scripts or systemd service definitions that are interested in the process return value, they may need some modification.

Better support for Creative SoundBlaster Omni Surround 5.1

The Creative SoundBlaster Omni Surround 5.1 USB sound card sets up its microphone ALSA device in a way that PulseAudio doesn't support with the default configuration. The card now has its own configuration file in PulseAudio to make the microphone work.

git shortlog

Ahmed S. Darwish (1):
      pulse: Document client libraries logging behavior

Alexander E. Patrakov (4):
      Make pa_socket_server_new static
      module-loopback: don't use 0 for custom source output message id
      echo-cancel: fix the obviously-wrong "buffer+=buffer" logic
      loopback: Fix the obviously-wrong "buffer+=buffer" logic

Andrey Semashev (4):
      Added libsoxr resampler backend.
      Enabled libsoxr resampler backend.
      Added libsoxr detection and optional build of soxr resampler backend.
      Added documentation for soxr resampling methods.

Andrey Zholos (1):
      detect: Fix OSS device detection with long names

Arun Raghavan (17):
      sink-input: Clarify the meaning of rewrite and flush a bit in rewinds
      udev: Deal with unavailable bus property
      protocol-native: Fix source latency calculation in ADJUST_LATENCY mode
      rescue-streams: Document a cryptic looking condition
      rescue-streams: Fix a couple of typos
      stream: Support extended API with PULSE_LATENCY_MSEC if possible
      sink,source: Add a helper function to check whether this is a filter
      always-sink: Ignore filter sinks
      echo-cancel: Handle underlying sink going away better when autoloaded
      equalizer: Handle underlying sink going away better when autoloaded
      build-sys: Fix distcheck for systemd user unit dir
      build-sys: Make echo-cancel use speex cflags/libs conditionally
      build-sys: Fix up setting the bash completion dir
      alsa-mixer: Drop redundant conditional frees
      alsa: Clarify potentially confusing device port data field
      lfe-filter: Deal with empty input chunks
      Update NEWS for 7.0 release

Cédric Valmary (1):
      i18n: add Occitan translation

David Henningsson (29):
      alsa-util: Make two of the warnings "debug" instead of "error"
      pstream: Don't split (non-SHM) memblocks
      protocol-native: Re-enable srbchannel
      pstream: Remove unnecessary if condition
      thread-mq: Make pa_thread_mq_done more robust
      lfe-filter: Import code from the Chrome OS audio server
      lfe-filter: Enable LFE filter in the resampler
      lfe-filter: Cleanup and refactor
      memblock: Change pa_memblock_new_malloced to an inline function
      lfe-filter: Add rewind support
      resampler: Make some basic functions for rewinding
      resampler: Allow disabling the LFE filter by setting crossover to 0
      resampler: Rename "lfe_filter_required" to "lfe_remixed"
      module: Add hook dynarray
      module-*-restore: use pa_module_hook_connect
      module-suspend-on-idle: use pa_module_hook_connect
      module-alsa-card: use pa_module_hook_connect
      module-filter-*: use pa_module_hook_connect
      module-switch-*: use pa_module_hook_connect
      alsa-mixer: Use separate profiles for Multichannel Input/Output
      alsa-mixer: Add paths/ports for multichannel profile
      core-util, pactl: Make one localised and one non-localised version of pa_yes_no
      alsa-mixer: Make line out path unavailable when "Front Headphone" is plugged in
      lfe-filter-test: Use S16NE format
      echo-cancel: Add config.h in adrian-aec.c
      stream: Check sample spec validity before abiding PULSE_LATENCY_MSEC
      module: Warn about modules loaded after unload
      alsa-mixer: Add "Front Line Out" and "Rear Line Out"
      module: Always remove freed module from modules_pending_unload

David Herrmann (1):
      core-util: Fix set_nice() to use private bus connections

Deepak Srivastava (3):
      padsp: Avoid possible deadlock. Unlocked i->mainloop before returning from default case.
      patcl: Error msg from pactl not quite accurate for 'mute' commands
      Removed exclamation marks from user-visible messages.

Dušan Kazik (2):
      i18n: update Slovak translation
      i18n: Update Slovak translation

Felipe Sateler (5):
      Add a .travis.yml for Travis CI
      man: fix reference to --daemonize option
      Fix return code check of pa_append_to_home_dir
      util: pa_get_fqdn: always free addrinfo
      sink, source: Do not dereference freed memory when freeing the next events

Hui Wang (5):
      lfe-filter: change the crossover frequency as a parameter
      tests: adding lfe-filter-test
      daemon-conf: enable the lfe remixing by default
      tests: Remove a redundant mempool_new from resampler-test
      tests: add tolerant variation for comparing the rewind result

Jaska Uimonen (1):
      socket-server: add tcp support for systemd socket activation

Juho Hämäläinen (17):
      dbus: Use hooks for card profile events
      dbus: Use hooks for client proplist changes
      dbus: Use hooks for sink and source events
      dbus: Use hooks for sink-input and source-output events
      dbus: Use state changed hook for sink-input and source-output rate changes
      core: Add hooks for default sink and source changes
      namereg: Fire hooks for default sink and source changes
      dbus: Use hooks for put and unlink
      dbus: Use hooks for default sink and source changes
      core: Add core hooks for module changes
      module: Fire hooks for new, proplist changed and removed
      core, core-scache: Fire hooks for new, changed and removed events
      dbus: Use hooks for sample cache new and removed events
      dbus: Use hook for sample cache proplist changes
      dbus: Use hooks for module new and removed events
      dbus: Use hooks for module proplist changes
      Revert "Warn on loading module-dbus-protocol"

Manish Sogi (2):
      xen: Resource leak in local function alloc_gref() - alloc_fd and dev_fd
      pacmd: Placeholders describing command line options should not have spaces

Michael Cree (1):
      tests: Fix test-suite failure on Alpha

Milo Casagrande (1):
      Update Italian translation.

Muhammet Kara (1):
      i18n: Updated Turkish translation

Nazar Mokrynskyi (1):
      alsa-mixer: Add support for Creative SoundBlaster Omni Surround 5.1 USB sound card

Paul Menzel (1):
      lfe-filter: Use length modifier `z` for type `size_t`

Peter Meerwald (29):
      context: pa_context_connect() with PA_CONTEXT_NOFAIL should return 0 when waiting for PA on D-Dus
      man: Describe optional prefix {string} in server address
      man: Drop separate paplay man page, move info to pacat man page
      man: Install man page symlinks to pacat for paplay, parec, parecord, pamon
      pacat: State purpose of program depending how it was invoked
      alsa-util: No logging when sound card only supports non-interleaved sample format
      alsa: Fix spelling of officially
      tagstruct: Distinguish pa_tagstruct_new() use cases
      tagstruct: Replace dynamic flag with type
      tagstruct: Get rid of pa_tagstruct_free_data()
      tagstruct: Add type _APPENDED
      tagstruct: Use flist to potentially save calls to malloc()/free()
      packet: Hide internals of pa_packet, introduce pa_packet_data()
      packet: Make pa_packet_new() create fixed-size packets
      packet: Introduce pa_packet_new_data() to copy data into a newly created packet
      packet: Use flist to save calls to malloc()/free()
      pacat: Fix comment wording
      man: Fix typos in pulse-cli-syntax.5
      man: Document .ifexists CLI meta command
      daemon: Exit with code 0 on SIGINT and SIGTERM
      pulse: Document pa_mainloop_quit()'s retval parameter
      core: Don't export pa_rtpoll_quit(), only used internally
      biquad: Make use of M_SQRT2 constant
      biquad: Fix warning, gamma shadows global declaration
      padsp: Fix wrong condition discovered by -Wlogical-not-parentheses warning
      core: Work around -Wlogical-not-parentheses warnings
      daemon: No need to check optarg, -p requires argument
      core: Add missing return on protocol error
      modules: Fix entry leak in module-card-restore

Pierre Ossman (1):
      core: make sure we use the correct win32 socket errno:s

Piotr Drąg (1):
      i18n: Update Polish translation

René J. V. Bertin (1):
      coreaudio: Change error type to OSStatus

Sagar Nageshmurthy (1):
      Fix: Prevent calling pa_rtpoll_free() for a NULL rtpoll

Shawn Walker (1):
      modules: Fix struct namespace collision on Solaris

Sukesh Adiga (1):
      cpu-arm: Fix memory leak in pa_cpu_get_arm_flags()

Takashi Sakamoto (1):
      udev: use ID_MODEL/ID_VENDOR to give friendly name for FireWire devices

Tanu Kaskinen (33):
      socket-server: pa_socket_server_new() can't fail, so don't check its return value
      dynarray: Add pa_dynarray_last()
      dynarray: Add pa_dynarray_remove_by_index()
      dynarray: Add pa_dynarray_remove_by_data()
      dynarray: Add PA_DYNARRAY_FOREACH
      tagstruct: Refactor writing/reading basic types
      alsa: Don't access pa_sink/source_new_data after done() has been called
      core-util: Make number parsing stricter
      ucm: Add support for "JackControl"
      .gitignore: Add lfe-filter-test
      sink, source: Fix a volume change leak
      pactl: Fix relative volume parsing
      core-util: Filter out not-a-numbers in pa_atod()
      core-util: Make pa_parse_volume() more strict
      oss: Use the correct fd when interacting with the mixer
      build-sys: add winerrno.h to libpulsecommon_SOURCES
      combine-sink: Fix unsafe message handling
      alsa-mixer: Add descriptions for analog-stereo-input and analog-stereo-output mappings
      build-sys: make error message visible
      alsa: Add pa_alsa_jack_new() and pa_alsa_jack_free()
      ucm: Don't create separate input and output jacks
      alsa: Add associations between jacks, UCM devices and UCM ports
      alsa: Move UCM port availability updating to the mixer code
      ucm: Create only one jack object per kcontrol
      ucm: Add support for "JackHWMute"
      build-sys: bump sonames
      update NEWS for 7.0
      alsa-mixer: sb-omni-surround-5.1.conf: rename analog-stereo to analog-stereo-output
      alsa-mixer: sb-omni-surround-5.1.conf: remove analog-surround-40 mapping
      build-sys: check strtod_l instead of strtof_l
      core-util: include xlocale.h when using strtod_l()
      build-sys: bump sonames
      build-sys: add sb-omni-surround-5.1.conf to Makefile.am

Ville Skyttä (1):
      build-sys: Install bash completion to where bash-completion.pc says

Wim Taymans (1):
      Add korean translation

Yuri Chornoivan (1):
      i18n: Update Ukrainian translation

Zavadovsky Yan (1):
      build-sys: fix order of libraries installation