https://wiki.archlinux.org/api.php?action=feedcontributions&user=11backslashes&feedformat=atomArchWiki - User contributions [en]2024-03-28T10:43:24ZUser contributionsMediaWiki 1.41.0https://wiki.archlinux.org/index.php?title=PipeWire&diff=715352PipeWire2022-02-03T23:00:37Z<p>11backslashes: Grammar. Corrected "carters for some basic desktop use cases" to "caters to some basic desktop use cases".</p>
<hr />
<div>[[Category:Multimedia]]<br />
[[fi:PipeWire]]<br />
[[ja:PipeWire]]<br />
[[pt:PipeWire]]<br />
[[ru:PipeWire]]<br />
{{Related articles start}}<br />
{{Related|PipeWire/Examples}}<br />
{{Related|WirePlumber}}<br />
{{Related articles end}}<br />
<br />
[https://pipewire.org PipeWire] is a new low-level multimedia framework. It aims to offer capture and playback for both audio and video with minimal latency and support for [[PulseAudio]], [[JACK]], [[ALSA]] and [[GStreamer]]-based applications.<br />
<br />
The daemon based on the framework can be configured to be both an audio server (with PulseAudio and JACK features) and a video capture server.<br />
<br />
PipeWire also supports containers like [[Flatpak]] and does not rely on the {{ic|audio}} and {{ic|video}} [[user group]]s. Instead, it uses a [[Polkit]]-like security model, asking Flatpak or Wayland for permission to record screen or audio.<br />
<br />
== Installation ==<br />
<br />
[[Install]] the {{Pkg|pipewire}} package from the official repositories. There is also {{Pkg|lib32-pipewire}} for [[multilib]] support.<br />
<br />
Pipewire uses [[systemd/User]] for management of the server and automatic socket activation.<br />
<br />
Optionally, install {{Pkg|pipewire-docs}} to review the documentation.<br />
<br />
Pipewire can work as drop-in replacement for others audio servers. See [[#Audio]] for details.<br />
<br />
{{Expansion|Describe what {{Pkg|gst-plugin-pipewire}} does exactly.}}<br />
<br />
=== Session manager ===<br />
<br />
Like [[JACK]], PipeWire implements no connection logic internally. The burden of watching for new streams and connect them to the appropriate output device or application is left to an external component known as a session manager.<br />
<br />
There are currently two session managers available:<br />
<br />
* {{App|PipeWire Media Session|A very simple session manager that caters to some basic desktop use cases. It was mostly implemented for testing and as an example for building new session managers.|https://gitlab.freedesktop.org/pipewire/media-session|{{Pkg|pipewire-media-session}}}}<br />
* {{App|[[WirePlumber]]|A more powerful manager and the current recommendation. It is based on a modular design, with Lua plugins that implement the actual management functionality.|https://pipewire.pages.freedesktop.org/wireplumber/|{{Pkg|wireplumber}}}}<br />
<br />
When installing PipeWire you will be asked to opt between one of them. You can switch between them later by installing the appropriate package, which will conflict with and replace the other option.<br />
<br />
=== GUI ===<br />
<br />
* {{App|Helvum|GTK-based patchbay for pipewire, inspired by the JACK tool catia.|https://gitlab.freedesktop.org/ryuukyu/helvum|{{Pkg|helvum}}}}<br />
<br />
== Configuration ==<br />
<br />
The PipeWire package provides an initial set of configuration files in {{ic|/usr/share/pipewire}}. You should not edit these files directly, as package updates will overwrite your changes. To configure PipeWire, you can copy files from {{ic|/usr/share/pipewire}} to the alternate system-wide location {{ic|/etc/pipewire}}, or to the user location {{ic|~/.config/pipewire}}. [https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PipeWire#configuration-file-pipewireconf]<br />
<br />
=== Profiles ===<br />
<br />
Pipewire brings a custom "Pro Audio" profile in addition to the PulseAudio profiles, selectable through pavucontrol. The effect of which is described here: https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/FAQ#what-is-the-pro-audio-profile<br />
<br />
== Usage ==<br />
<br />
=== Audio ===<br />
<br />
{{Expansion|What happens when none of the following is configured/installed and an application sends audio directly to pipewire? The {{Pkg|pipewire}} package contains many audio-related files, e.g. {{ic|/etc/alsa/conf.d/50-pipewire.conf}}.}}<br />
<br />
PipeWire can be used as an audio server, similar to PulseAudio and JACK. It aims to replace both PulseAudio and JACK, by providing a PulseAudio-compatible server implementation and ABI-compatible libraries for JACK clients. See the blog post [https://blogs.gnome.org/uraeus/2020/09/04/pipewire-late-summer-update-2020/ PipeWire Late Summer Update 2020] for more information.<br />
<br />
==== ALSA clients ====<br />
<br />
Install {{Pkg|pipewire-alsa}} (and remove {{Pkg|pulseaudio-alsa}} if it was installed) to route all application using the ALSA API through PipeWire.<br />
<br />
==== PulseAudio clients ====<br />
<br />
Install {{Pkg|pipewire-pulse}}. It will replace {{Pkg|pulseaudio}} and {{Pkg|pulseaudio-bluetooth}}. Reboot, re-login or execute {{ic|systemctl start --user pipewire-pulse.service}} to see the effect. <br />
<br />
Normally, no further action is needed, as the user service {{ic|pipewire-pulse.socket}} should be enabled automatically by the package. To check if the replacement is working, run the following command and see the output:<br />
<br />
{{hc|1=$ pactl info|2=<br />
...<br />
Server Name: PulseAudio (on PipeWire 0.3.32)<br />
...<br />
}}<br />
<br />
==== JACK clients ====<br />
<br />
Install {{Pkg|pipewire-jack}} for [[JACK]] support. There is also {{Pkg|lib32-pipewire-jack}} for [[multilib]] support.<br />
<br />
{{man|1|pw-jack}} may be used to start JACK clients, but it is technically not required, as it only serves as a wrapper around the {{ic|PIPEWIRE_REMOTE}}, {{ic|PIPEWIRE_DEBUG}} and {{ic|PIPEWIRE_LATENCY}} environment variables.<br />
<br />
It is possible to request a custom buffer size by setting a quotient of buffersize/samplerate (which equals the block latency in seconds):<br />
<br />
PIPEWIRE_LATENCY="128/48000" ''application''<br />
<br />
==== Bluetooth devices ====<br />
<br />
PipeWire handles Bluetooth audio devices if the {{Pkg|pipewire-pulse}} package is installed. The package includes the {{ic|/etc/pipewire/media-session.d/with-pulseaudio}} file, whose existence prompts the media session daemon to enable the {{ic|bluez5}} module.<br />
<br />
===== Automatic profile selection =====<br />
<br />
{{Pkg|pipewire-media-session}} can automatically switch between HSP/HFP and A2DP profiles whenever an input stream is needed. To enable it set the {{ic|bluez5.autoswitch-profile}} property to {{ic|true}}:<br />
<br />
{{hc|/etc/pipewire/media-session.d/bluez-monitor.conf (or ~/.config/pipewire/media-session.d/bluez-monitor.conf|output=<br />
...<br />
rules = [<br />
{<br />
...<br />
actions = {<br />
update-props = {<br />
...<br />
bluez5.autoswitch-profile = true<br />
...<br />
}}<br />
<br />
These feature is still [https://gitlab.freedesktop.org/pipewire/wireplumber/-/issues/90 under implementation] on [[WirePlumber]].<br />
<br />
==== PipeWire native patch sets ====<br />
<br />
We have Helvum for graphical visualization and creation of connections, but the rest is not in yet. The following are bash scripts which save wiresets, load wiresets, and dewire all connections. For saving and loading, use a command-line parameter for the filename.<br />
<br />
{{hc|pw-savewires|<nowiki><br />
#!/bin/bash<br />
<br />
if [[ "$#" -ne 1 ]]; then<br />
echo<br />
echo 'usage: pw-savewires filename'<br />
echo<br />
exit 0<br />
fi<br />
<br />
rm $1 &> /dev/null<br />
while IFS= read -r line; do<br />
link_on=`echo $line | cut -f 4 -d '"'`<br />
link_op=`echo $line | cut -f 6 -d '"'`<br />
link_in=`echo $line | cut -f 8 -d '"'`<br />
link_ip=`echo $line | cut -f 10 -d '"'`<br />
echo "Saving: " "'"$link_on:$link_op"','"$link_in:$link_ip"'"<br />
echo "'"$link_on:$link_op"','"$link_in:$link_ip"'" >> $1<br />
done < <(pw-cli dump short link)<br />
</nowiki>}}<br />
<br />
{{hc|pw-loadwires|<nowiki><br />
#!/bin/python<br />
<br />
import sys<br />
import csv<br />
import os<br />
<br />
if len(sys.argv) < 2:<br />
print('\n usage: pw-loadwires filename\n')<br />
quit()<br />
<br />
with open(sys.argv[1], newline='') as csvfile:<br />
pwwreader = csv.reader(csvfile, delimiter=',', quotechar='"')<br />
for row in pwwreader:<br />
print('Loading: ' + row[0] + ' --> ' + row[1])<br />
process = os.popen('pw-link ' + row[0] + ' ' + row[1])<br />
</nowiki>}}<br />
<br />
{{hc|pw-dewire|<nowiki><br />
#!/bin/bash<br />
while read -r line; do<br />
echo 'Dewiring: ' $line '...'<br />
pw-link -d $line<br />
done < <(pw-cli dump short link {{!}} grep -Eo '^[0-9]+')<br />
</nowiki>}}<br />
<br />
==== Sharing audio devices with computers on the network ====<br />
<br />
While PipeWire itself is not network transparent, its pulse implementation supports [https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PulseAudio#network-support network streaming]. An easy way to share audio between computers on the network is to use the [[Avahi]] daemon for discovery. <br />
Make sure that the {{ic|avahi-daemon.service}} is running on all computers that will be sharing audio.<br />
<br />
To share the local audio devices load the appropriate modules on the host:<br />
<br />
pactl load-module module-native-protocol-tcp listen=''192.168.1.10'' # Use the local IP address<br />
pactl load-module module-zeroconf-publish<br />
<br />
Then load the discovery module on the clients:<br />
<br />
pactl load-module module-zeroconf-discover<br />
<br />
==== Run PipeWire on top of native JACK ====<br />
<br />
PipeWire can also run as a JACK client on top of the native JACK daemon if desired. See [https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/JACK JACK and PipeWire] for more information.<br />
<br />
=== WebRTC screen sharing ===<br />
<br />
Most applications used to rely on X11 for capturing the desktop (or individual applications), for example when using WebRTC in web browsers (e.g. on Google Hangouts). On Wayland, the sharing mechanism is handled differently for security reasons. PipeWire enables sharing content under Wayland with fine-grained access controls.<br />
<br />
This requires {{Pkg|xdg-desktop-portal}} and one of its backends [https://jgrulich.cz/2018/07/04/how-to-enable-and-use-screen-sharing-on-wayland to be installed]. The available backends are:<br />
<br />
* {{Pkg|xdg-desktop-portal-gnome}} for GNOME.<br />
* {{Pkg|xdg-desktop-portal-kde}} for KDE.<br />
* {{Pkg|xdg-desktop-portal-wlr}} for wlroots-based Wayland compositors (e.g. [[Sway]], [https://github.com/djpohly/dwl dwl])<br />
<br />
{{Note|1={{Pkg|xdg-desktop-portal}} 1.10.0 fixed a mismatch between specification and implementation of its D-Bus interface. [https://github.com/flatpak/xdg-desktop-portal/pull/609] Hence, some clients may not work with xdg-desktop-portal 1.10.0 or newer. Current progress for [https://github.com/obsproject/obs-studio/pull/5294 OBS Studio], [https://bugs.chromium.org/p/chromium/issues/detail?id=1250940 Chromium] and [https://bugzilla.mozilla.org/show_bug.cgi?id=1731495 Firefox].}}<br />
<br />
Firefox (84+) supports this method by default, while on Chromium (73+) one needs to enable [https://bugs.chromium.org/p/chromium/issues/detail?id=682122 WebRTC PipeWire support] by setting the corresponding (experimental) flag at the URL {{ic|chrome://flags/#enable-webrtc-pipewire-capturer}}.<br />
<br />
{{Pkg|obs-studio}} (27+) supports this method by using the new PipeWire capture source.<br />
<br />
{{Accuracy|Since [https://github.com/flatpak/xdg-desktop-portal-gtk/pull/225 this pull request] was merged, the following note about specific app/window sharing may be not correct anymore for {{Pkg|xdg-desktop-portal-gtk}}. Also see the ticket tracking the discussion at [https://github.com/flatpak/xdg-desktop-portal-gtk/issues/204].}}<br />
<br />
Note that the only supported feature is sharing the entire desktop and not a specific app/window [https://github.com/emersion/xdg-desktop-portal-wlr/wiki/FAQ#will-this-let-me-share-individual-windows][https://github.com/KDE/xdg-desktop-portal-kde/blob/master/TODO].<br />
<br />
==== xdg-desktop-portal-wlr ====<br />
<br />
For {{ic|xdg-desktop-portal-wlr}} to work, the {{ic|1=XDG_CURRENT_DESKTOP}} and {{ic|1=WAYLAND_DISPLAY}} environment variables have to be set in the [[Systemd/User#Environment_variables|systemd user session]]. {{ic|1=XDG_CURRENT_DESKTOP}} has to be set to the name of your compositor, e.g. {{ic|1=XDG_CURRENT_DESKTOP=sway}}. {{ic|1=WAYLAND_DISPLAY}} is set automatically by the compositor. The recommended way to bring these environment variables over to the systemd user session is to run {{ic|1=systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP}} after launching the compositor, e.g. with the compositors configuration file. See [https://github.com/emersion/xdg-desktop-portal-wlr#running] and [https://github.com/emersion/xdg-desktop-portal-wlr/wiki] for more details.<br />
<br />
{{Tip|To share an individual monitor with {{ic|xdg-desktop-portal-wlr}} if you have more than one, you can use configuration file options, see {{man|5|xdg-desktop-portal-wlr|SCREENCAST OPTIONS}}:<br />
{{hc|~/.config/xdg-desktop-portal-wlr/config|2=<br />
chooser_type = none<br />
output_name = ''Monitor''<br />
}}<br />
In [[Sway]], you can get the ''Monitor'' value using the {{ic|swaymsg -t get_outputs}} command.}}<br />
<br />
=== Video ===<br />
<br />
{{Expansion|{{Pkg|pipewire-v4l2}}}}<br />
<br />
Although the software is not yet production-ready, it is safe to play around with. Most applications that rely on [[GStreamer]] to handle e.g. video streams should work out-of-the-box using the PipeWire GStreamer plugin, see [[GStreamer#PipeWire]]. Applications like e.g. {{Pkg|cheese}} are therefore already able to share video input using it.<br />
<br />
== Audio post-processing ==<br />
<br />
=== EasyEffects ===<br />
<br />
EasyEffects (former PulseEffects) is a GTK utility which provides a large array of audio effects and filters to individual application output streams and microphone input streams. Notable effects include an input/output equalizer, output loudness equalization and bass enhancement, input de-esser and noise reduction plug-in. See [https://github.com/wwmm/easyeffects the GitHub page] for a full list of effects.<br />
<br />
In order to use EasyEffects, install {{Pkg|easyeffects}}. See [https://github.com/wwmm/easyeffects/wiki/Community-presets Community Presets] for a collection of preset configurations. See [https://github.com/jaakkopasanen/AutoEq AutoEq] for collection of AI generated EQ presets for headphones.<br />
<br />
{{Note|For PulseEffects legacy version, see [[PulseAudio#PulseEffects]].}}<br />
<br />
=== NoiseTorch ===<br />
<br />
NoiseTorch is an alternative way for noise suppression. {{AUR|noisetorch}}. There also exists a binary version, {{AUR|noisetorch-bin}}, as well as a {{AUR|noisetorch-git}}.<br />
<br />
After starting it the module can be loaded for the selected microphone. It is possible to adjust the voice activation threshold, which should be set to the highest level, not filtering out any actual voice.<br />
<br />
=== Noise suppression for voice ===<br />
<br />
Install {{AUR|noise-suppression-for-voice}} and see https://github.com/werman/noise-suppression-for-voice#pipewire. Then, set the noise cancelled source as default in your audio settings. You might need to restart your application prior being able to use it.<br />
<br />
=== JamesDSP ===<br />
<br />
[https://github.com/Audio4Linux/JDSP4Linux#readme JamesDSP for Linux] (available as {{AUR|jamesdsp}}) provides open-source sound effects for PipeWire and PulseAudio. It uses its own effects engine and without depending on LADSPA, Calf, etc. JamesDSP was initially published as an audio effects processor for Android devices.<br />
<br />
=== LADSPA, LV2 and VST plugins ===<br />
<br />
If you want to choose between the full list of available LADSPA, LV2 and VST plugins, you can apply them using a custom Pulseaudio null sink and Carla Jack host. Install {{Pkg|pipewire-pulse}}, {{Pkg|pipewire-jack}} and {{Pkg|carla}}. At the begin, create a new Pulseaudio null sink named {{ic|default_null_sink}}.<br />
<br />
pactl load-module module-null-sink object.linger=1 media.class=Audio/Sink sink_name=default_null_sink channel_map=FL,FR<br />
<br />
Start Carla through Pipewire, {{ic|pw-jack carla-rack}}. In ''Rack'' tab add whichever plugin you want. Make sure they are ''stereo'' type. You can change their order, the one on top of the list will be the first to receive the audio stream, just like in EasyEffects. Afterwards move to ''Patchbay'' tab and connect the {{ic|default_null_sink}} L/R monitors to Carla inputs, then Carla outputs to the playbacks of your desired device (speakers, earphones, HDMI, etc). Save the configuration to a local folder, i.e. {{ic|~/Documents/carla_sink_effects.carxp}}.<br />
<br />
You can test the effects while a multimedia application is reproducing audio, i.e. watching a video on a website through Firefox. There are two methods to do it. The first one, inside Carla ''Patchbay'' tab, disconnecting all Firefox connections and linking its L/R outputs to {{ic|default_null_sink}} playbacks. The second through {{Pkg|pavucontrol}}, locating Firefox audio stream and redirecting it to {{ic|default_null_sink}} (this should remember the connection to automatically redirect the application to the same sink on the next instance).<br />
<br />
To apply these settings at startup, create two systemd user service units:<br />
<br />
{{hc|~/.config/systemd/user/jack-carla-rack.service|output=<br />
[Unit]<br />
Description=Load Carla Rack JACK host<br />
<br />
[Service]<br />
PassEnvironment="PIPEWIRE_LINK_PASSIVE=true"<br />
Type=exec<br />
ExecStart=/usr/bin/pw-jack carla-rack -n<br />
<br />
[Install]<br />
WantedBy=default.target<br />
}}<br />
{{hc|~/.config/systemd/user/pulseaudio-null-sink@.service|output=<br />
[Unit]<br />
Description=Load %i Pulseaudio null sink<br />
Before=jack-carla-rack.service<br />
After=pipewire-pulse.service<br />
<br />
[Service]<br />
Type=oneshot<br />
ExecStart=/usr/bin/pactl load-module module-null-sink object.linger=1 media.class=Audio/Sink sink_name=%i channel_map=FL,FR<br />
ExecStop=/usr/bin/pactl unload-module module-null-sink<br />
RemainAfterExit=yes<br />
<br />
[Install]<br />
WantedBy=default.target<br />
}}<br />
<br />
Then override ''jack-carla-rack'' service specifying the full path of your Carla configuration at ''Environment'' directive:<br />
<br />
{{hc|~/.config/systemd/user/jack-carla-rack.service.d/override.conf|output=<br />
Environment="CARLA_CONFIG_FILE=/home/username/Documents/carla_sink_effects.carxp"<br />
ExecStart=<br />
ExecStart=/usr/bin/pw-jack carla-rack -n $CARLA_CONFIG_FILE<br />
}}<br />
<br />
At last, enable these two services specifying {{ic|default_null_sink}} as argument for ''pulseaudio-null-sink'' service:<br />
<br />
systemctl --user enable pulseaudio-null-sink@default_null_sink.service<br />
systemctl --user enable jack-carla-rack.service<br />
<br />
Note that if you set the {{ic|default_null_sink}} as the default device in system settings, all applications will be redirected to it and the volume keys will change its level, not the one on the speakers. If you want to control volume speakers, leave them as the default in system settings and redirect your desired application to {{ic|default_null_sink}} inside pavucontrol (Pipewire compatibility layer will remember the connection on the next instance of the same application).<br />
<br />
== Troubleshooting ==<br />
<br />
=== Audio ===<br />
<br />
==== Microphone is not detected by PipeWire ====<br />
<br />
PipeWire's {{ic|alsa-monitor}} module uses {{Pkg|alsa-card-profiles}} to detect devices by default. If this is not working for you, try to turn off {{ic|api.alsa.use-acp}}, or optionally turn on {{ic|api.alsa.use-ucm}}. <br />
<br />
If using {{Pkg|pipewire-media-session}}:<br />
{{hc|/etc/pipewire/media-session.d/alsa-monitor.conf (or ~/.config/pipewire/media-session.d/alsa-monitor.conf)|output=<br />
...<br />
rules = [<br />
{<br />
...<br />
actions = {<br />
update-props = {<br />
...<br />
api.alsa.use-acp = false<br />
...<br />
}}<br />
<br />
Otherwise, if using {{Pkg|wireplumber}}:<br />
{{hc|/etc/wireplumber/main.lua.d/50-alsa-config.lua (or ~/.config/wireplumber/main.lua.d/50-alsa-config.lua)|output=<br />
...<br />
alsa_monitor.rules = {<br />
{<br />
...<br />
apply_properties = {<br />
-- Use ALSA-Card-Profile devices. They use UCM or the profile<br />
-- configuration to configure the device and mixer settings.<br />
-- ["api.alsa.use-acp"] = true,<br />
<br />
-- Use UCM instead of profile when available. Can be<br />
-- disabled to skip trying to use the UCM profile.<br />
["api.alsa.use-ucm"] = true,<br />
...<br />
}}<br />
<br />
Then, restart pipewire and check available devices:<br />
<br />
{{hc| 1=<br />
$ pw-record --list-targets<br />
|2=<br />
Available targets ("*" denotes default): 62<br />
58: description="Built-in Audio" prio=1872<br />
60: description="Built-in Audio" prio=2000<br />
* 62: description="Built-in Audio (Loopback PCM)" prio=1984<br />
}}<br />
<br />
==== Sound does not automatically switch to Bluetooth headphones ====<br />
<br />
{{Accuracy|The linked upstream issue is specific to the xfce pulseaudio panel plugin.}}<br />
<br />
Run {{ic|pactl load-module module-switch-on-connect}} and configure your desktop environment to automatically run that command on login. See [https://gitlab.freedesktop.org/pipewire/wireplumber/-/issues/89 wireplumber issue #89] for more details.<br />
<br />
==== No sound after connecting to Bluetooth device ====<br />
<br />
As of 2020-12-07, if there is no sound after connecting a Bluetooth device, you might need to switch the default sink and/or move a sink input to the correct sink. Use {{ic|pactl list sinks}} to list the available sinks and {{ic|pactl set-default-sink}} to switch the default sink to the Bluetooth device. This can be automated via [[udev]] using a script similar to [https://gist.github.com/tinywrkb/04e7fd644afa9b92d33a3a99ab07ee9e this one].<br />
<br />
See this [https://www.reddit.com/r/archlinux/comments/jydd02/pipewirepulse_03164_in_testing_now_replaces/gd3m7fu/?context=3 Reddit thread] for a discussion of the issue. According to author of the script, the headset profile (HSP) might still have problems.<br />
<br />
==== Low volume ====<br />
<br />
After replacing PulseAudio with Pipewire, sound may work fine, but after a reboot, the volume becomes intolerably low.<br />
<br />
Open {{ic|alsamixer}}, use {{ic|F6}} to select the proper soundcard, and make sure the ALSA volumes are at 100%. {{ic|alsactl}} should maintain this setting after reboot.<br />
<br />
==== Increasing RLIMIT_MEMLOCK ====<br />
<br />
Dec 13 11:11:11 HOST pipewire-pulse[99999]: Failed to mlock memory 0x7f4f659d8000 32832: This is not a problem but for best performance, consider increasing RLIMIT_MEMLOCK<br />
<br />
Install {{Pkg|realtime-privileges}} and add your own user to the {{ic|realtime}} group.<br />
<br />
Alternatively, increasing memlock from 64kB to 128kB seems enough to fix this. If you are running {{ic|pipewire-pulse}} under [[systemd/User]], add:<br />
<br />
username soft memlock 64<br />
username hard memlock 128<br />
<br />
to {{ic|/etc/security/limits.d/username.conf}}<br />
<br />
==== Changing the sample rate ====<br />
<br />
By default PipeWire sets a global sample rate of 48kHz. If you need to change it (e.g. you own a DAC supporting a higher value), you can set a new default:<br />
<br />
{{hc|/etc/pipewire/pipewire.conf (or ~/.config/pipewire/pipewire.conf)|output=<br />
...<br />
context.properties = {<br />
...<br />
default.clock.rate = ''sample_rate''<br />
...<br />
}}<br />
<br />
PipeWire can also change output sample rates supported by your DAC. To configure, uncomment and set the line {{ic|1=default.clock.allowed-rates = [ 48000 ]}}, for example, {{ic|[ 44100 48000 88200 96000 ]}}. The sample rate follows the sample rate of the audio stream being played when the card is idle.<br />
<br />
To check out which output sample rate and sample format are the data sent to DAC (probably you need to change digits):<br />
cat /proc/asound/card0/pcm0p/sub0/hw_params<br />
To check out which input sample rate is used, change {{ic|pcm0p}} to {{ic|pcm0c}} ({{ic|c}} is short for "capture", {{ic|p}} is for "playback").<br />
<br />
==== Sound quality (resampling quality) ====<br />
<br />
If you used PulseAudio with {{ic|1=resample-method = speex-float-10}} or {{ic|soxr-vhq}}, then you might consider uncommenting and changing {{ic|1=resample.quality = 4}} to {{ic|10}} or the maximum {{ic|15}} in {{ic|stream.properties}} block in both {{ic|/etc/pipewire/client.conf}} and {{ic|/etc/pipewire/pipewire-pulse.conf}} (copy them from {{ic|/usr/share/pipewire/}} if they do not exist). Do not forget to restart PipeWire (without sudo): {{ic|systemctl --user restart pipewire.service pipewire-pulse.socket}} (never forget {{ic|pipewire-pulse.socket}} if you want your config changes to be applied).<br />
<br />
There is a very little quality difference between {{ic|10}} and {{ic|15}}, but the CPU load difference is 2-3x. And the latency difference between {{ic|4}}, {{ic|10}}, {{ic|15}} is yet to be investigated by anybody. {{ic|1= resample.quality = 15}} on 44100→48000 Hz on Ryzen 2600 causes {{ic|pipewire}} or {{ic|pipewire-pulse}} processes to cause 4.0% one CPU core load.<br />
<br />
You can compare resamplers here: https://src.infinitewave.ca/ (do not pay attention to anything above 18 KHz and over 120 dB). speex is listed as "Xiph.org Speex".<br />
<br />
PipeWire uses its own resampling algorithm called Spa. Like with SoX's {{ic|sox}}, Speex's {{ic|speexenc}}, PipeWire includes its standalone version: {{ic|spa-resample}}. Usage:<br />
spa-resample -q 15 -f s24 -r 48000 input16bit44100orAnythingElse.wav output24bit48000hz.wav<br />
<br />
It is probably somehow possible to use other resamplers by creating your own sink. Or just use a plugin in your music player (e.g., Qmmp has SoX plugin).<br />
<br />
==== External sound card not activated after reconnect ====<br />
<br />
Check {{ic|~/.config/pipewire-media-session/default-profile}} if there is any entry with default profile "off" and remove it. If that does not help, remove all files from {{ic|~/.config/pipewire-media-session/}} and restart PipeWire using {{ic|systemctl --user restart pipewire.service}}.<br />
<br />
==== No Sound or pactl info shows Failure: Connection refused ====<br />
<br />
It means applications are unable to connect to the PipeWire-Pulse service, confirm that {{ic|/etc/pipewire/pipewire-pulse.conf}} exists and is not empty and restart PipeWire-Pulse using {{ic|systemctl --user restart pipewire-pulse.service}}.<br />
<br />
If that does not fix it, run {{ic|strace -f -o /tmp/pipe.txt pactl info}} and pastebin {{ic|/tmp/pipe.txt}} while seeking help on IRC ([ircs://irc.oftc.net/pipewire #pipewire] on OFTC) or the mailing-lists.<br />
<br />
==== Low audio quality on Bluetooth ====<br />
<br />
In case Bluetooth playback stutters, check the [[unit status]] of the {{ic|pipewire.service}} user unit for errors similar as below:<br />
<br />
Feb 17 18:23:01 HOST pipewire[249297]: (bluez_input.18:54:CF:04:00:56.a2dp-sink-60) client too slow! rate:512/48000 pos:370688 status:triggered<br />
<br />
If they appear, check the currently selected codec using {{ic|pactl list sinks}} and try changing it by setting {{ic|bluez5.codecs}} to one of {{ic|sbc aac ldac aptx aptx_hd}}. You can also try mSBC support (fixes mic on Sony 1000XM3, i.e. Headphones WH-1000XM3 and Earbuds WF-1000XM3), and the SBC-XQ codec.<br />
<br />
With {{pkg|pipewire-media-session}}:<br />
<br />
{{hc|/etc/pipewire/media-session.d/bluez-monitor.conf (or ~/.config/pipewire/media-session.d/bluez-monitor.conf)|output=<br />
...<br />
properties = {<br />
...<br />
bluez5.enable-msbc = true<br />
bluez5.enable-sbc-xq = true<br />
bluez5.codecs = [sbc sbc_xq]<br />
...<br />
}}<br />
<br />
With {{pkg|wireplumber}}:<br />
<br />
{{hc|/etc/wireplumber/bluetooth.lua.d/51-bluez-config.lua (or ~/.config/wireplumber/bluetooth.lua.d/51-bluez-config.lua)|output=<br />
bluez_monitor.properties = {<br />
["bluez5.enable-sbc-xq"] = true,<br />
["bluez5.enable-msbc"] = true,<br />
["bluez5.codecs"] = "[sbc sbc_xq]",<br />
}<br />
}}<br />
<br />
Restart PipeWire by [[restart]]ing the {{ic|pipewire.service}} user unit for the changes to take effect.<br />
<br />
==== No devices detected after PipeWire update and reboot (git / >=0.3.23) ====<br />
<br />
As of commit [https://gitlab.freedesktop.org/pipewire/pipewire/-/commit/012a68f8ef33705f1a40ec8ac294b8cce7f6aa88 012a68f8], a new [[user unit]] has been added which is disabled by default, meaning there is no ''pipewire-media-session'' running on user login. Run this program on login by [[enabling]] the {{ic|pipewire-media-session.service}} user unit.<br />
<br />
If the user or the package manager have not sorted out the configuration file changes after update, then another instance of ''pipewire-media-session'' might be running in {{ic|pipewire.service}}. Verify whether this is the case by checking the [[unit status]] of the {{ic|pipewire.service}} user unit. If it shows ''pipewire'' and ''pipewire-media-session'' running, update your system and/or user configuration:<br />
<br />
{{hc|/etc/pipewire/pipewire.conf (or ~/.config/pipewire/pipewire.conf)|output=<br />
...<br />
context.exec = {<br />
...<br />
# Line below should be commented out<br />
#"/usr/bin/pipewire-media-session" = { args = "" }<br />
...<br />
}}<br />
<br />
==== Noticeable audio delay when starting playback ====<br />
<br />
This is caused by node suspension when inactive. It can be disabled by editing {{ic|/etc/pipewire/media-session.d/*-monitor.conf}} depending on where the delay occurs and changing property {{ic|session.suspend-timeout-seconds}} to 0 to disable or to experiment with other values and see what works. Alternatively you can comment out the line {{ic|suspend-node}} in {{ic|/etc/pipewire/media-session.d/media-session.conf}}. Restart both the {{ic|pipewire}} and {{ic|pipewire-pulse}} systemd services to apply these changes, or alternatively reboot.<br />
<br />
If you are using {{ic|wireplumber}} instead of {{ic|pipewire-media-session}}, then you can copy the example config file located at {{ic|/usr/share/wireplumber/main.lua.d/50-alsa-config.lua}} to {{ic|/etc/wireplumber/main.lua.d/50-alsa-config.lua}} and add the line {{ic|1=["session.suspend-timeout-seconds"] = 0}} to section {{ic|apply_properties}} at the end of the file.<br />
<br />
==== Audio cutting out when multiple streams start playing ====<br />
<br />
This problem can typically be diagnosed by running {{ic|journalctl --user -b -u pipewire-pulse}} and finding lines similar to:<br />
<br />
pipewire-pulse[21740]: pulse-server 0x56009b9d5de0: [Nightly] UNDERFLOW channel:0 offset:370676 underrun:940<br />
<br />
According to the [https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Troubleshooting#underrununderflow-and-broken-pipe-errors official PipeWire troubleshooting guide], to solve this problem edit {{ic|/etc/pipewire/media-session.d/alsa-monitor.conf}}, uncomment the line saying {{ic|1=api.alsa.headroom = 0}} and change its value to {{ic|1024}}.<br />
<br />
If you are using {{ic|wireplumber}} instead of {{ic|pipewire-media-session}}, then you can copy the example config file located at {{ic|/usr/share/wireplumber/main.lua.d/50-alsa-config.lua}} to {{ic|/etc/wireplumber/main.lua.d/50-alsa-config.lua}} and at the end of the file, under section {{ic|apply_properties}}, change {{ic|1=--["api.alsa.headroom"] = 0}} to {{ic|1=["api.alsa.headroom"] = 1024}}<br />
<br />
==== Audio is distorted ====<br />
<br />
* For microphones, try navigating to the card that is having issues after running {{ic|alsamixer}} and use the arrow keys to reduce any "Mic Boost" or "Internal Mic Boost" options.<br />
* Follow [[#Changing the sample rate]], reducing the sample rate to to {{ic|44100}} (44.1 kHz).<br />
<br />
==== Audio problems after standby ====<br />
<br />
If the sound is missing or otherwise garbled after waking the machine up from sleep, it might help to reinitialize ALSA:<br />
<br />
# alsactl init<br />
<br />
==== High latency with USB DACs (e.g. Schiit DACs) ====<br />
<br />
Changing sample rates or formats might help reduce latency with some DACs such as Schiit Hel 2.[https://www.reddit.com/r/osugame/comments/msifdd/usb_dacamp_and_audio_lag/]<br />
Using matching rules in ''pipewire-media-session'' we can set properties for devices.[https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-pipewire-media-session#matching-rules]<br />
<br />
Copy the default configuration of {{ic|alsa-monitor.conf}} for ''pipewire-media-session'' into either {{ic|/etc/pipewire/media-session.d}} or {{ic|~/.config/pipewire/media-session.d}}.<br />
Then append a new rule-block similar to the following one:<br />
<br />
{{hc|/etc/pipewire/media-session.d/alsa-monitor.conf (or ~/.config/pipewire/media-session.d/alsa-monitor.conf)|output=<br />
...<br />
rules = {<br />
...<br />
{<br />
matches = [<br />
{<br />
node.name = "alsa_output.<name of node>"<br />
}<br />
]<br />
actions = {<br />
update-props = {<br />
audio.format = "S24_3LE"<br />
audio.rate = 96000<br />
# Following value should be doubled until audio doesn't cut out or other issues stop occurring<br />
api.alsa.period-size = 128<br />
...<br />
}}<br />
<br />
{{ic|alsa_output.<name of node>}} node can be obtained using {{ic|pw-top}}.<br />
<br />
Your DAC might support a different format or sample rate. You can check what your DAC supports by querying [[ALSA]]:<br />
<br />
First get the card number of your DAC:<br />
<br />
{{hc|$ aplay -l|<br />
...<br />
card 3: S2 [Schiit Hel 2], device 0: USB Audio [USB Audio]<br />
Subdevices: 0/1<br />
Subdevice #0: subdevice #0<br />
...<br />
}}<br />
<br />
So in this example it would be card 3.<br />
Get all supported sample rates and formats:<br />
<br />
{{hc|$ cat /proc/asound/cardX/streamX|<br />
...<br />
Playback:<br />
...<br />
Interface 1<br />
Altset 1<br />
Format: S16_LE<br />
Channels: 2<br />
Endpoint: 0x05 (5 OUT) (ASYNC)<br />
Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000<br />
Data packet interval: 125 us<br />
Bits: 16<br />
...<br />
Interface 1<br />
Altset 2<br />
Format: S24_3LE<br />
Channels: 2<br />
Endpoint: 0x05 (5 OUT) (ASYNC)<br />
Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000<br />
Data packet interval: 125 us<br />
Bits: 24<br />
...<br />
Interface 1<br />
Altset 3<br />
Format: S32_LE<br />
Channels: 2<br />
Endpoint: 0x05 (5 OUT) (ASYNC)<br />
Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000<br />
Data packet interval: 125 us<br />
Bits: 32<br />
...<br />
...<br />
}}<br />
<br />
In this case {{ic|S16_LE, S24_3LE, S32_LE}} are the supported formats and {{ic|44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000}} are the supported sample rates across all formats.<br />
<br />
==== Realtime audio does not work ====<br />
<br />
If {{ic|RTKit error: org.freedesktop.DBus.Error.AccessDenied}} shows up in the output of {{ic|systemctl --user status pipewire.service}}, then the priority of the pipewire daemon was not changed to realtime. See [https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/1069] for this issue.<br />
<br />
=== Video ===<br />
<br />
==== OBS (etc.) display nothing, even if they ask for a window/screen ====<br />
<br />
If you are sure that you have {{Pkg|xdg-desktop-portal}} installed as well as either {{Pkg|xdg-desktop-portal-gtk}} or {{Pkg|xdg-desktop-portal-kde}}, check the running state of the daemons.<br />
<br />
In OBS, if everything is working, you should see this in {{ic|stdout}}:<br />
<br />
...<br />
info: [pipewire] desktop selected, setting up screencast<br />
info: [pipewire] created stream 0x5632d7456850<br />
info: [pipewire] playing stream…<br />
<br />
For multi-monitor setups the {{Pkg|slurp}} package will allow to capture of all the screens.<br />
<br />
== See also ==<br />
<br />
* [https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/home Wiki] — PipeWire Wiki on Freedesktop GitLab<br />
* [https://blogs.gnome.org/uraeus/2018/01/26/an-update-on-pipewire-the-multimedia-revolution-an-update/ Pipewire Update Blog Post] — Blog post from January 2018 outlining the state of PipeWire at the time<br />
* [https://blogs.gnome.org/uraeus/2020/09/04/pipewire-late-summer-update-2020/ PipeWire Late Summer Update 2020] — Blog post from September 2020</div>11backslasheshttps://wiki.archlinux.org/index.php?title=Radicale&diff=601131Radicale2020-03-11T14:36:40Z<p>11backslashes: Changed the example to run the WSGI script as the radicale user. The radicale package overwrites the ownership of /var/lib/radicale each time it updates, and I believe it is better to run each service as its own user regardless.</p>
<hr />
<div>[[Category:WebDAV]]<br />
[[ja:Radicale]]<br />
{{Related articles start}}<br />
{{Related|DAViCal}}<br />
{{Related|Kcaldav}}<br />
{{Related|AgenDAV}}<br />
{{Related articles end}}<br />
<br />
[http://radicale.org/ Radicale] is a server designed to support the CalDav and CardDav protocols. It requires at least Python 3.3.<br />
<br />
== Installation ==<br />
<br />
{{warning|Radicale got a major release change. You need to export old version 1.x calendars *before* you install version 2.x. Please, [http://radicale.org/1to2/ read].}}<br />
<br />
[[Install]] the {{Pkg|radicale}} package.<br />
<br />
== Configuration ==<br />
<br />
The main configuration file is located at {{ic|/etc/radicale/config}}.<br />
<br />
Many of the configuration options can be changed on the command-line:<br />
<br />
$ radicale --help<br />
<br />
=== Integration ===<br />
<br />
Radicale can be integrated with HTTP webservers like [[Apache]] which support the WSGI interface. Install the {{Pkg|mod_wsgi}} Apache module.<br />
<br />
This causes several options for the configuration of Radicale to be ignored, including: hosts, daemon, pid, ssl, certificate, key, protocol and ciphers keys in the [server] section of the config.<br />
Install the radicale module in the python path and write the .wsgi file (to document root).<br />
<br />
from radicale import application<br />
<br />
The next step is to set up a virtual host for radicale.<br />
An example:<br />
<br />
{{bc|1=<br />
<VirtualHost *:80><br />
ServerName cal.yourdomain.org<br />
<br />
WSGIDaemonProcess radicale user=radicale group=radicale threads=1<br />
WSGIScriptAlias / /srv/http/radicale.wsgi<br />
<br />
<Directory /var/www><br />
WSGIProcessGroup radicale<br />
WSGIApplicationGroup %{GLOBAL}<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
</VirtualHost><br />
}}<br />
<br />
== Client support ==<br />
<br />
Since it uses the CalDav and CardDav protocols, it should support most clients. Currently, the officially supported list is this:<br />
<br />
* [[Thunderbird#Extensions|Thunderbird Lightning extension]]<br />
* [[GNOME/Evolution]]<br />
* KOrganizer {{Pkg|korganizer}}<br />
* InfCloud {{Aur|infcloud}}, CalDavZAP {{Aur|caldavzap}}{{Broken package link|package not found}}, CardDavMATE {{Aur|carddavmate}}{{Broken package link|package not found}}<br />
* syncEvolution {{Aur|syncevolution}}<br />
* aCal, ContactSync, CalendarSync, CalDAV-Sync CardDAV-Sync and DAVx⁵ for Google Android<br />
* Apple iOS<br />
* Mac OSX Calendar/Contacts<br />
<br />
== See also ==<br />
<br />
* [http://radicale.org/ Project Website radicale.org]</div>11backslasheshttps://wiki.archlinux.org/index.php?title=Radicale&diff=596889Radicale2020-02-06T01:48:48Z<p>11backslashes: Updated wsgi instructions to match the current state of the Arch package.</p>
<hr />
<div>[[Category:WebDAV]]<br />
[[ja:Radicale]]<br />
{{Related articles start}}<br />
{{Related|DAViCal}}<br />
{{Related|Kcaldav}}<br />
{{Related|AgenDAV}}<br />
{{Related articles end}}<br />
<br />
[http://radicale.org/ Radicale] is a server designed to support the CalDav and CardDav protocols. It requires at least Python 3.3.<br />
<br />
== Installation ==<br />
<br />
{{warning|Radicale got a major release change. You need to export old version 1.x calendars *before* you install version 2.x. Please, [http://radicale.org/1to2/ read].}}<br />
<br />
[[Install]] the {{Pkg|radicale}} package.<br />
<br />
== Configuration ==<br />
<br />
The main configuration file is located at {{ic|/etc/radicale/config}}.<br />
<br />
Many of the configuration options can be changed on the command-line:<br />
<br />
$ radicale --help<br />
<br />
=== Integration ===<br />
<br />
Radicale can be integrated with HTTP webservers like [[Apache]] which support the WSGI interface. Install the Apache module.<br />
{{bc|1=<br />
# pacman -S mod_wsgi}}<br />
<br />
This causes several options for the configuration of Radicale to be ignored, including: hosts, daemon, pid, ssl, certificate, key, protocol and ciphers keys in the [server] section of the config.<br />
Install the radicale module in the python path and write the .wsgi file (to document root).<br />
<br />
{{bc|1=<br />
from radicale import application}}<br />
<br />
The next step is to set up a virtual host for radicale.<br />
An example:<br />
<br />
{{bc|1=<br />
<VirtualHost *:80><br />
ServerName cal.yourdomain.org<br />
<br />
WSGIDaemonProcess radicale user=http group=http threads=1<br />
WSGIScriptAlias / /srv/http/radicale.wsgi<br />
<br />
<Directory /var/www><br />
WSGIProcessGroup radicale<br />
WSGIApplicationGroup %{GLOBAL}<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
</VirtualHost>}}<br />
<br />
If you installed the Radicale package via pacman, you must also change the ownership of this directory:<br />
{{bc|1=<br />
# chown http:http /var/lib/radicale}}<br />
Otherwise, the wsgi script will fail on its first run.<br />
<br />
== Client support ==<br />
Since it uses the CalDav and CardDav protocols, it should support most clients. Currently, the officially supported list is this:<br />
* [[Thunderbird#Extensions|Thunderbird Lightning extension]]<br />
* [[GNOME/Evolution]]<br />
* KOrganizer {{Pkg|korganizer}}<br />
* InfCloud {{Aur|infcloud}}, CalDavZAP {{Aur|caldavzap}}{{Broken package link|package not found}}, CardDavMATE {{Aur|carddavmate}}{{Broken package link|package not found}}<br />
* syncEvolution {{Aur|syncevolution}}<br />
* aCal, ContactSync, CalendarSync, CalDAV-Sync CardDAV-Sync and DAVx⁵ for Google Android<br />
* Apple iOS<br />
* Mac OSX Calendar/Contacts<br />
<br />
== See also ==<br />
* [http://radicale.org/ Project Website radicale.org]</div>11backslasheshttps://wiki.archlinux.org/index.php?title=Radicale&diff=596535Radicale2020-02-01T06:09:05Z<p>11backslashes: Corrected typo of wgsi to wsgi. It's Web Server Gateway Interface, not Web Gateway Server Interface.</p>
<hr />
<div>[[Category:WebDAV]]<br />
[[ja:Radicale]]<br />
{{Related articles start}}<br />
{{Related|DAViCal}}<br />
{{Related|Kcaldav}}<br />
{{Related|AgenDAV}}<br />
{{Related articles end}}<br />
<br />
[http://radicale.org/ Radicale] is a server designed to support the CalDav and CardDav protocols. It requires at least Python 3.3.<br />
<br />
== Installation ==<br />
<br />
{{warning|Radicale got a major release change. You need to export old version 1.x calendars *before* you install version 2.x. Please, [http://radicale.org/1to2/ read].}}<br />
<br />
[[Install]] the {{Pkg|radicale}} package.<br />
<br />
== Configuration ==<br />
<br />
The main configuration file is located at {{ic|/etc/radicale/config}}.<br />
<br />
Many of the configuration options can be changed on the command-line:<br />
<br />
$ radicale --help<br />
<br />
=== Integration ===<br />
<br />
Radicale can be integrated with HTTP webservers like [[Apache]] which support the mod_wsgi interface.<br />
This causes several options for the configuration of Radicale to be ignored, including: hosts, daemon, pid, ssl, certificate, key, protocol and ciphers keys in the [server] section of the config.<br />
Install the radicale module in the python path and write the .wsgi file (to document root).<br />
<br />
{{bc|1=<br />
# import radicale<br />
# radicale.log.start()<br />
# application = radicale.Application()}}<br />
<br />
The next step is to set up a virtual host for radicale.<br />
An example:<br />
<br />
{{bc|1=<br />
<VirtualHost *:80><br />
ServerName cal.yourdomain.org<br />
<br />
WSGIDaemonProcess radicale user=http group=http threads=1<br />
WSGIScriptAlias / /srv/http/radicale.wsgi<br />
<br />
<Directory /var/www><br />
WSGIProcessGroup radicale<br />
WSGIApplicationGroup %{GLOBAL}<br />
AllowOverride None<br />
Order allow,deny<br />
allow from all<br />
</Directory><br />
</VirtualHost>}}<br />
<br />
== Client support ==<br />
Since it uses the CalDav and CardDav protocols, it should support most clients. Currently, the officially supported list is this:<br />
* [[Thunderbird#Extensions|Thunderbird Lightning extension]]<br />
* [[GNOME/Evolution]]<br />
* KOrganizer {{Pkg|korganizer}}<br />
* InfCloud {{Aur|infcloud}}, CalDavZAP {{Aur|caldavzap}}{{Broken package link|package not found}}, CardDavMATE {{Aur|carddavmate}}{{Broken package link|package not found}}<br />
* syncEvolution {{Aur|syncevolution}}<br />
* aCal, ContactSync, CalendarSync, CalDAV-Sync CardDAV-Sync and DAVx⁵ for Google Android<br />
* Apple iOS<br />
* Mac OSX Calendar/Contacts<br />
<br />
== See also ==<br />
* [http://radicale.org/ Project Website radicale.org]</div>11backslashes