Projects
Essentials
pipewire-aptx
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 47
View file
pipewire-aptx.changes
Changed
@@ -1,4 +1,9 @@ ------------------------------------------------------------------- +Thu Nov 7 09:26:42 UTC 2024 - Bjørn Lie <zaitor@opensuse.org> + +- Update to version 1.2.6 + +------------------------------------------------------------------- Fri Oct 4 09:01:15 UTC 2024 - Bjørn Lie <zaitor@opensuse.org> - Update to version 1.2.5
View file
pipewire-aptx.spec
Changed
@@ -8,7 +8,7 @@ %define minimum_version 1.2.0 Name: pipewire-aptx -Version: 1.2.5 +Version: 1.2.6 Release: 0 Summary: PipeWire Bluetooth aptX codec plugin License: MIT
View file
_service
Changed
@@ -2,6 +2,6 @@ <service name="download_url"> <param name="host">gitlab.freedesktop.org</param> <param name="protocol">https</param> - <param name="path">/pipewire/pipewire/-/archive/1.2.5/pipewire-1.2.5.tar.bz2</param> + <param name="path">/pipewire/pipewire/-/archive/1.2.6/pipewire-1.2.6.tar.bz2</param> </service> </services> \ No newline at end of file
View file
_service:download_url:pipewire-1.2.5.tar.bz2/doc/dox/config/pipewire-devices.7.md
Deleted
@@ -1,518 +0,0 @@ -\page page_man_pipewire-devices_7 pipewire-devices - -PipeWire device and node property reference. - -\tableofcontents - -# DESCRIPTION - -Audio sinks and sources, cameras, Bluetooth endpoints, and other -objects have properties that can be set in configuration files or at -runtime. - -Some of the properties are "common object properties" (e.g. such as -`node.description`) and can be set on all types of devices and -nodes. Other properties control settings of a specific type of a -device (ALSA, Bluetooth, ...). - -All the properties are usually configured in the session manager configuration. -For how to configure them, see the session manager documentation. - -In minimal PipeWire setups without a session manager, they can be configured via -\ref pipewire_conf__context_objects "context.objects in pipewire.conf(5)". - -# RUNTIME SETTINGS @IDX@ device-param - -The settings of most ALSA and virtual device parameters can be -configured also at runtime. - -The settings are available in device `Props` in the `params` -field. They can be seen e.g. using `pw-dump <id>` for an ALSA device: - -```json -{ -... - "Props": - { - ... - "params": - "audio.channels", - 2, - "audio.rate", - 0, - "audio.format", - "UNKNOWN", - "audio.position", - " FL, FR ", - "audio.allowed-rates", - " ", - "api.alsa.period-size", - 0, - "api.alsa.period-num", - 0, - "api.alsa.headroom", - 0, - "api.alsa.start-delay", - 0, - "api.alsa.disable-mmap", - false, - "api.alsa.disable-batch", - false, - "api.alsa.use-chmap", - false, - "api.alsa.multi-rate", - true, - "latency.internal.rate", - 0, - "latency.internal.ns", - 0, - "clock.name", - "api.alsa.c-1" - - } -... -``` - -One or more `params` can be changed using \ref page_man_pw-cli_1 "pw-cli(1)": -``` -pw-cli s <id> Props '{ params = "api.alsa.headroom" 1024 }' -``` -These settings are not saved and need to be reapplied for each session manager restart. - -# COMMON NODE PROPERTIES @IDX@ device-param - -The properties listed in \ref client_conf__stream_properties "Stream properties" -apply also to sink or source nodes corresponding to real or virtual devices. - -In addition: - -@PAR@ device-param priority.driver # integer -\parblock -The priority of choosing this device as the driver in the graph. The driver is selected from all linked devices by selecting the device with the highest priority. - -Normally, the session manager assigns higher priority to sources so that they become the driver in the graph. The reason for this is that adaptive resampling should be done on the sinks rather than the source to avoid signal distortion when capturing audio. -\endparblock - -@PAR@ device-param priority.session # integer -The priority for selecting this device as the default device. - -@PAR@ device-param clock.name # string -\parblock -The name of the clock. This name is auto generated from the card index and stream direction. Devices with the same clock name will not use a resampler to align the clocks. This can be used to link devices together with a shared word clock. - -In Pro Audio mode, nodes from the same device are assumed to have the same clock and no resampling will happen when linked together. So, linking a capture port to a playback port will not use any adaptive resampling in Pro Audio mode. - -In Non Pro Audio profile, no such assumption is made and adaptive resampling is done in all cases by default. This can also be disabled by setting the same clock.name on the nodes. -\endparblock - -@PAR@ device-param node.param.PARAM = JSON # JSON -\parblock -Set value of a node \ref spa_param_type "Param" to a JSON value when the device is loaded. -This works similarly as \ref page_man_pw-cli_1 "pw-cli(1)" `set-param` command. -The `PARAM` should be replaced with the name of the Param to set, -ie. for example `node.param.Props = { ... }` to set `Props`. -\endparblock - -@PAR@ device-param device.id -ID of the device the node belongs to. - -# COMMON DEVICE PROPERTIES @IDX@ device-param - -These are common properties for devices. - -@PAR@ device-param device.name # string -A (unique) name for the device. It can be used by command-line and other tools to identify the device. - -@PAR@ device-param device.param.PARAM = JSON # JSON -\parblock -Set value of a device \ref spa_param_type "Param" to a JSON value when the device is loaded. -This works similarly as \ref page_man_pw-cli_1 "pw-cli(1)" `set-param` command. -The `PARAM` should be replaced with the name of the Param to set, -ie. for example `device.Param.Props = { ... }` to set `Props`. -\endparblock - -Other `device.*` properties: UNDOCUMENTED - -# AUDIO CONVERTER PROPERTIES @IDX@ device-param - -Most audio nodes (ALSA, Bluetooth, ...) have common properties for the audio -converter. See \ref client_conf__stream_properties "pipewire-client.conf(5) stream.properties" -for explanations. - -## Node properties - -@PAR@ device-param clock.quantum-limit -\ref pipewire_conf__default_clock_quantum-limit "See pipewire.conf(5)" - -@PAR@ device-param channelmix.disable -\ref client_conf__channelmix_disable "See pipewire-client.conf(5)" - -@PAR@ device-param channelmix.min-volume -\ref client_conf__channelmix_min-volume "See pipewire-client.conf(5)" - -@PAR@ device-param channelmix.max-volume -\ref client_conf__channelmix_max-volume "See pipewire-client.conf(5)" - -@PAR@ device-param channelmix.normalize -\ref client_conf__channelmix_normalize "See pipewire-client.conf(5)" - -@PAR@ device-param channelmix.mix-lfe -\ref client_conf__channelmix_mix-lfe "See pipewire-client.conf(5)" - -@PAR@ device-param channelmix.upmix -\ref client_conf__channelmix_upmix "See pipewire-client.conf(5)" - -@PAR@ device-param channelmix.lfe-cutoff -\ref client_conf__channelmix_lfe-cutoff "See pipewire-client.conf(5)" - -@PAR@ device-param channelmix.fc-cutoff -\ref client_conf__channelmix_fc-cutoff "See pipewire-client.conf(5)" - -@PAR@ device-param channelmix.rear-delay -\ref client_conf__channelmix_rear-delay "See pipewire-client.conf(5)" - -@PAR@ device-param channelmix.stereo-widen -\ref client_conf__channelmix_stereo-widen "See pipewire-client.conf(5)" - -@PAR@ device-param channelmix.hilbert-taps -\ref client_conf__channelmix_hilbert-taps "See pipewire-client.conf(5)" - -@PAR@ device-param channelmix.upmix-method -\ref client_conf__channelmix_upmix-method "See pipewire-client.conf(5)" - -@PAR@ device-param channelmix.lock-volumes -\ref client_conf__channelmix_lock-volumes "See pipewire-client.conf(5)" - -@PAR@ device-param resample.quality -\ref client_conf__resample_quality "See pipewire-client.conf(5)" - -@PAR@ device-param resample.disable -\ref client_conf__resample_disable "See pipewire-client.conf(5)" - -@PAR@ device-param resample.peaks = false # boolean -Instead of actually resampling, produce peak amplitude values as output. -This is used for volume monitoring, where it is set as a property -of the "recording" stream. - -@PAR@ device-param resample.prefill = false # boolean -Prefill resampler buffers with silence. This affects the initial -samples produced by the resampler. - -@PAR@ device-param monitor.channel-volumes -\ref client_conf__monitor_channel-volumes "See pipewire-client.conf(5)" - -@PAR@ device-param dither.noise -\ref client_conf__dither_noise "See pipewire-client.conf(5)" - -@PAR@ device-param dither.method -\ref client_conf__dither_method "See pipewire-client.conf(5)" - -@PAR@ device-param debug.wav-path -\ref client_conf__debug_wav-path "See pipewire-client.conf(5)" - -@PAR@ device-param adapter.auto-port-config = null # JSON -\parblock -If specified, configure the ports of the node when it is created, instead of -leaving that to the session manager to do. This is useful (only) for minimal -configurations without a session manager. - -Value is SPA JSON of the form: -```json -{ - mode = "none", # "none", "passthrough", "convert", "dsp" - monitor = false, # boolean - control = false, # boolean - position = "preserve" # "unknown", "aux", "preserve" -} -``` -See \ref spa_param_port_config for the meaning. -\endparblock - -# ALSA PROPERTIES @IDX@ device-param - -## Monitor properties - -@PAR@ device-param alsa.use-acp # boolean -Use \ref device-param__alsa_card_profiles "ALSA Card Profiles" (ACP) for device configuration. - -@PAR@ device-param alsa.udev.expose-busy # boolean -Expose the ALSA card even if it is busy/in use. Default false. This can be useful when some -of the PCMs are in use by other applications but the other free PCMs should still be exposed. - -## Device properties - -@PAR@ device-param api.alsa.path # string -ALSA device path as can be used in snd_pcm_open() and snd_ctl_open(). - -@PAR@ device-param api.acp.auto-port # boolean -Select reasonable port on device startup. Available for ACP devices. - -@PAR@ device-param api.acp.auto-profile # boolean -Select reasonable profile on device startup. Available for ACP devices. - -## Node properties - -@PAR@ device-param audio.channels # integer -The number of audio channels to open the device with. Defaults depends on the profile of the device. - -@PAR@ device-param audio.rate # integer -The audio rate to open the device with. Default is 0, which means to open the device with a rate as close to the graph rate as possible. - -@PAR@ device-param audio.format # string -The audio format to open the device in. By default this is "UNKNOWN", which will open the device in the best possible bits (32/24/16/8..). You can force a format like S16_LE or S32_LE. - -@PAR@ device-param audio.position # JSON array of strings -The audio position of the channels in the device. This is auto detected based on the profile. You can configure an array of channel positions, like " FL, FR ". - -@PAR@ device-param audio.allowed-rates # JSON array of integers -\parblock -The allowed audio rates to open the device with. Default is " ", which means the device can be opened in any supported rate. - -Only rates from the array will be used to open the device. When the graph is running with a rate not listed in the allowed-rates, the resampler will be used to resample to the nearest allowed rate. -\endparblock - -@PAR@ device-param api.alsa.period-size # integer -The period size to open the device in. By default this is 0, which will open the device in the default period size to minimize latency. - -@PAR@ device-param api.alsa.period-num # integer -The amount of periods to use in the device. By default this is 0, which means to use as many as possible. - -@PAR@ device-param api.alsa.headroom # integer -The amount of extra space to keep in the ringbuffer. The default is 0. Higher values can be configured when the device read and write pointers are not accurately reported. - -@PAR@ device-param api.alsa.start-delay # integer -Some devices require a startup period. The default is 0. Higher values can be set to send silence samples to the device first. - -@PAR@ device-param api.alsa.disable-mmap # boolean -Disable mmap operation of the device and use the ALSA read/write API instead. Default is false, mmap is preferred. - -@PAR@ device-param api.alsa.disable-batch # boolean -Ignore the ALSA batch flag. If the batch flag is set, ALSA will need an extra period to update the read/write pointers. Ignore this flag from ALSA can reduce the latency. Default is false. - -@PAR@ device-param api.alsa.use-chmap # boolean -Use the driver provided channel map. Default is true when using UCM, false otherwise because many driver don't report this correctly. - -@PAR@ device-param api.alsa.multi-rate # boolean -Allow devices from the same card to be opened in multiple sample rates. Default is true. Some older drivers did not properly advertise the capabilities of the device and only really supported opening the device in one rate. - -@PAR@ device-param api.alsa.htimestamp = false # boolean -Use ALSA htimestamps in scheduling, instead of the system clock. -Some ALSA drivers produce bad timestamps, so this is not enabled by default -and will be disabled at runtime if it looks like the ALSA timestamps are bad. - -@PAR@ device-param api.alsa.htimestamp.max-errors # integer -Specify the number of consecutive errors before htimestamp is disabled. -Setting this to 0 makes htimestamp never get disabled. - -@PAR@ device-param api.alsa.disable-tsched = false # boolean -Disable timer-based scheduling, and use IRQ for scheduling instead. -The "Pro Audio" profile will usually enable this setting, if it is expected it works on the hardware. - -@PAR@ device-param api.alsa.auto-link = false # boolean -Link follower PCM devices to the driver PCM device when using IRQ-based scheduling. -The "Pro Audio" profile will usually enable this setting, if it is expected it works on the hardware. - -@PAR@ device-param latency.internal.rate # integer -Static set the device systemic latency, in samples at playback rate. - -@PAR@ device-param latency.internal.ns # integer -Static set the device systemic latency, in nanoseconds. - -@PAR@ device-param api.alsa.path # string -UNDOCUMENTED - -@PAR@ device-param api.alsa.open.ucm # boolean -Open device using UCM. - -@PAR@ device-param api.alsa.bind-ctls # boolean -UNDOCUMENTED - -@PAR@ device-param iec958.codecs # JSON array of string -Enable only specific IEC958 codecs. This can be used to disable some codecs the hardware supports. -Available values: PCM, AC3, DTS, MPEG, MPEG2-AAC, EAC3, TRUEHD, DTSHD - -# BLUETOOTH PROPERTIES @IDX@ device-param - -## Monitor properties - -The following are settings for the Bluetooth device monitor, not device or -node properties: - -@PAR@ device-param bluez5.roles # JSON array of string -\parblock -Enabled roles (default: a2dp_sink a2dp_source bap_sink bap_source hfp_hf hfp_ag ) - -Currently some headsets (Sony WH-1000XM3) are not working with -both hsp_ag and hfp_ag enabled, so by default we enable only HFP. - -Supported roles: -- hsp_hs (HSP Headset), -- hsp_ag (HSP Audio Gateway), -- hfp_hf (HFP Hands-Free), -- hfp_ag (HFP Audio Gateway) -- a2dp_sink (A2DP Audio Sink) -- a2dp_source (A2DP Audio Source) -- bap_sink (LE Audio Basic Audio Profile Sink) -- bap_source (LE Audio Basic Audio Profile Source) -\endparblock - -@PAR@ device-param bluez5.codecs # JSON array of string -Enabled A2DP codecs (default: all). -Possible values: sbc sbc_xq aac aac_eld aptx aptx_hd aptx_ll aptx_ll_duplex faststream faststream_duplex lc3plus_h3 ldac opus_05 opus_05_51 opus_05_71 opus_05_duplex opus_05_pro opus_g lc3 - -@PAR@ device-param bluez5.default.rate # integer -Default audio rate. - -@PAR@ device-param bluez5.default.channels # integer -Default audio channels. - -@PAR@ device-param bluez5.hfphsp-backend # integer -HFP/HSP backend (default: native). Available values: any, none, hsphfpd, ofono, native - -@PAR@ device-param bluez5.hfphsp-backend-native-modem # string - -@PAR@ device-param bluez5.dummy-avrcp player # boolean -Register dummy AVRCP player. Some devices have wrongly functioning -volume or playback controls if this is not enabled. Default: false - -@PAR@ device-param bluez5.enable-sbc-xq # boolean -Override device quirk list and enable SBC-XQ for devices for which it is disabled. - -@PAR@ device-param bluez5.enable-msbc # boolean -Override device quirk list and enable MSBC for devices for which it is disabled. - -@PAR@ device-param bluez5.enable-hw-volume # boolean -Override device quirk list and enable hardware volume fo devices for which it is disabled. - -@PAR@ device-param bluez5.hw-offload-sco # boolean -\parblock -HFP/HSP hardware offload SCO support (default: false). - -This feature requires a custom configuration that routes SCO audio to ALSA nodes, -in a platform-specific way. See `tests/examples/bt-pinephone.lua` in WirePlumber for an example. -Do not enable this setting if you don't know what all this means, as it won't work. -\endparblock - -@PAR@ device-param bluez5.a2dp.opus.pro.channels = 3 # integer -PipeWire Opus Pro audio profile channel count. - -@PAR@ device-param bluez5.a2dp.opus.pro.coupled-streams = 1 # integer -PipeWire Opus Pro audio profile coupled stream count. - -@PAR@ device-param bluez5.a2dp.opus.pro.locations = "FL,FR,LFE" # string -PipeWire Opus Pro audio profile audio channel locations. - -@PAR@ device-param bluez5.a2dp.opus.pro.max-bitrate = 600000 # integer -PipeWire Opus Pro audio profile max bitrate. - -@PAR@ device-param bluez5.a2dp.opus.pro.frame-dms = 50 # integer -PipeWire Opus Pro audio profile frame duration (1/10 ms). - -@PAR@ device-param bluez5.a2dp.opus.pro.bidi.channels = 1 # integer -PipeWire Opus Pro audio profile duplex channels. - -@PAR@ device-param bluez5.a2dp.opus.pro.bidi.coupled-streams = 0 # integer -PipeWire Opus Pro audio profile duplex coupled stream count. - -@PAR@ device-param bluez5.a2dp.opus.pro.bidi.locations = "FC" # string -PipeWire Opus Pro audio profile duplex coupled channel locations. - -@PAR@ device-param bluez5.a2dp.opus.pro.bidi.max-bitrate = 160000 # integer -PipeWire Opus Pro audio profile duplex max bitrate. - -@PAR@ device-param bluez5.a2dp.opus.pro.bidi.frame-dms = 400 # integer -PipeWire Opus Pro audio profile duplex frame duration (1/10 ms). - -@PAR@ device-param bluez5.bcast_source.config # JSON -\parblock -Example: -``` -bluez5.bcast_source.config = - { - "broadcast_code": "Børne House", - "encryption: false, - "bis": - { # BIS configuration - "qos_preset": "16_2_1", # QOS preset name from table Table 6.4 from BAP_v1.0.1. - "audio_channel_allocation": 1, # audio channel allocation configuration for the BIS - "metadata": # metadata configurations for the BIS - { "type": 1, "value": 1, 1 } - - } - - } - -``` -\endparblock - -## Device properties - -@PAR@ device-param bluez5.auto-connect # boolean -Auto-connect devices on start up. Disabled by default if -the property is not specified. - -@PAR@ device-param bluez5.hw-volume = PROFILE1 PROFILE2... # JSON array of string -Profiles for which to enable hardware volume control (default: hfp_ag hsp_ag a2dp_source ). - -@PAR@ device-param bluez5.profile # string -Initial device profile. This usually has no effect as the session manager -overrides it. - -@PAR@ device-param bluez5.a2dp.ldac.quality # string -LDAC encoding quality -Available values: -- auto (Adaptive Bitrate, default) -- hq (High Quality, 990/909kbps) -- sq (Standard Quality, 660/606kbps) -- mq (Mobile use Quality, 330/303kbps) - -@PAR@ device-param bluez5.a2dp.aac.bitratemode # integer -AAC variable bitrate mode. -Available values: 0 (cbr, default), 1-5 (quality level) - -@PAR@ device-param bluez5.a2dp.opus.pro.application = "audio" # string -PipeWire Opus Pro Audio encoding mode: audio, voip, lowdelay - -@PAR@ device-param bluez5.a2dp.opus.pro.bidi.application = "audio" # string -PipeWire Opus Pro Audio duplex encoding mode: audio, voip, lowdelay - -@PAR@ device-param bluez5.bap.cig = auto # integer, or 'auto' -Set CIG ID for BAP unicast streams of the device. -Default: "auto" (automatic). - -## Node properties - -@PAR@ device-param bluez5.media-source-role # string -\parblock -Media source role for Bluetooth clients connecting to -this instance. Available values: - - playback: playing stream to speakers - - input: appear as source node. -\endparblock - -# ALSA CARD PROFILES @IDX@ device-param - -The sound card profiles ("Analog stereo", "Analog stereo duplex", ...) except "Pro Audio" come from two sources: - -- UCM: ALSA Use Case Manager: the profile configuration system from ALSA. See https://github.com/alsa-project/alsa-ucm-conf/ -- ACP ("Alsa Card Profiles"): Pulseaudio's profile system ported to PipeWire. See https://www.freedesktop.org/wiki/Software/PulseAudio/Backends/ALSA/Profiles/ - -See the above links on how to configure these systems. - -For ACP, PipeWire looks for the profile configuration files under - -- ~/.config/alsa-card-profile -- /etc/alsa-card-profile -- /usr/share/alsa-card-profile/mixer`. - -The `path` and `profile-set` files are in subdirectories `paths` and `profile-sets` of these directories. -It is possible to override individual files locally by putting a modified copy into the ACP directories under `~/.config` or `/etc`. - -# AUTHORS - -The PipeWire Developers <$(PACKAGE_BUGREPORT)>; -PipeWire is available from <$(PACKAGE_URL)> - -# SEE ALSO - -\ref page_man_pipewire_conf_5 "pipewire.conf(5)"
View file
_service:download_url:pipewire-1.2.5.tar.bz2/NEWS -> _service:download_url:pipewire-1.2.6.tar.bz2/NEWS
Changed
@@ -1,3 +1,48 @@ +# PipeWire 1.2.6 (2024-10-23) + +This is a bugfix release that is API and ABI compatible with the previous +1.2.x and 1.0.x releases. + +## Highlights + - The filter-chain param changes were not aggregated correctly, causing some + param changes to be ignored. (#4331) + - Clear the JACK io ports correctly when stopping to avoid crashes. (#4337) + - Some more small fixes and improvements. + + +## PipeWire + - Stream states are now updated based on the underlying node state. + - Exported nodes now have their state change done synchronously so that the + server can immediately start the driver and avoid some initial xruns. + - Improve stream flush handling and improve the docs. + - Don't send mix_info to destroyed ports to avoid some errors in the + JACK clients. + +## Modules + - The filter-chain param changes were not aggregated correctly, causing some + param changes to be ignored. (#4331) + - The filter-chain now correctly optimizes unlinked nodes in all cases. + +## SPA + - ALSA PCM node properties are now no longer overwritten with card properties. + (#4135) + - Increase the adapter retry count to avoid xruns in some cases. (#4334) + - Fix potential crash in cleanup of ALSA nodes. + +## Bluetooth + - Fix a crash with broadcast sinks. + - Improve compatibility with Phonak hearing aids. + - Don't exit when DBus goes down. + +## JACK + - Clear the io ports correctly when stopping to avoid crashes. (#4337) + +## Docs + - Backport docs from master. + +Older versions: + + # PipeWire 1.2.5 (2024-09-27) This is an important bugfix release that is API and ABI compatible with the @@ -44,9 +89,6 @@ - Some small doc updates. (#4272) -Older versions: - - # PipeWire 1.2.4 (2024-09-19) This is a bugfix release that is API and ABI compatible with the
View file
_service:download_url:pipewire-1.2.5.tar.bz2/doc/dox/config/index.md -> _service:download_url:pipewire-1.2.6.tar.bz2/doc/dox/config/index.md
Changed
@@ -26,14 +26,12 @@ - \ref page_man_pipewire_conf_5 "PipeWire daemon configuration reference" - \ref page_man_pipewire-pulse_conf_5 "PipeWire Pulseaudio daemon configuration reference" - WirePlumber daemon configuration(https://pipewire.pages.freedesktop.org/wireplumber/) -- Wiki page on PipeWire daemon configuration(https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PipeWire) -- Wiki page on PipeWire PulseAudio daemon configuration(https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PulseAudio) Configuration of devices: - WirePlumber configuration(https://pipewire.pages.freedesktop.org/wireplumber/daemon/configuration.html) -- \ref page_man_pipewire-devices_7 "Device and node property reference" -- Wiki page on device runtime settings(https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-Devices) +- \ref page_man_pipewire-props_7 "Object property reference" +- \subpage page_config_xref "Configuration Index" Configuration for client applications, either connecting via the native PipeWire interface, or the emulated ALSA, JACK, or PulseAudio @@ -42,10 +40,6 @@ - \ref page_man_pipewire-client_conf_5 "PipeWire native and ALSA client configuration reference" - \ref page_man_pipewire-jack_conf_5 "PipeWire JACK client configuration reference" - \ref page_man_pipewire-pulse_conf_5 "PipeWire Pulseaudio client configuration reference" -- Wiki page on native clients(https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-client) -- Wiki page on ALSA clients(https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-ALSA) -- Wiki page on JACK clients(https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-JACK) -- Wiki page on PulseAudio clients(https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PulseAudio) # Manual Pages @@ -54,36 +48,6 @@ - \subpage page_man_pipewire-pulse_conf_5 - \subpage page_man_pipewire-jack_conf_5 - \subpage page_man_pipewire-filter-chain_conf_5 -- \subpage page_man_pipewire-devices_7 +- \subpage page_man_pipewire-props_7 - \subpage page_man_pipewire-pulse-modules_7 - \subpage page_man_libpipewire-modules_7 - -# Configuration Index - -\ref page_man_pipewire_conf_5 "pipewire.conf" - -@SECREF@ pipewire.conf - -\ref page_man_pipewire-pulse_conf_5 "pipewire-pulse.conf" - -@SECREF@ pipewire-pulse.conf - -\ref page_man_pipewire-client_conf_5 "client.conf, client-rt.conf" - -@SECREF@ client.conf - -\ref page_man_pipewire-jack_conf_5 "jack.conf" - -@SECREF@ jack.conf - -**Runtime settings** - -@SECREF@ pipewire-settings - -**Environment variables** - -@SECREF@ pipewire-env client-env jack-env pulse-env - -**Device properties** - -@SECREF@ device-param
View file
_service:download_url:pipewire-1.2.5.tar.bz2/doc/dox/config/pipewire-client.conf.5.md -> _service:download_url:pipewire-1.2.6.tar.bz2/doc/dox/config/pipewire-client.conf.5.md
Changed
@@ -66,7 +66,9 @@ # STREAM PROPERTIES @IDX@ client.conf The client configuration files contain a stream.properties section that configures the options for client streams: -``` +```css +# ~/.config/pipewire/client.conf.d/custom.conf + stream.properties = { #node.latency = 1024/48000 #node.autoconnect = true @@ -101,429 +103,10 @@ * How the internal processing will be done. * Properties to configure the media format. -## Identifying Properties @IDX@ client.conf - -These contain properties to identify the node or to display the node in a GUI application. - -@PAR@ client.conf node.name -A (unique) name for the node. This is usually set on sink and sources to identify them -as targets for linking by the session manager. - -@PAR@ client.conf node.description -A human readable description of the node or stream. - -@PAR@ client.conf media.name -A user readable media name, usually the artist and title. -These are usually shown in user facing applications -to inform the user about the current playing media. - -@PAR@ client.conf media.title -A user readable stream title. - -@PAR@ client.conf media.artist -A user readable stream artist - -@PAR@ client.conf media.copyright -User readable stream copyright information - -@PAR@ client.conf media.software -User readable stream generator software information - -@PAR@ client.conf media.language -Stream language in POSIX format. Ex: `en_GB` - -@PAR@ client.conf media.filename -File name for the stream - -@PAR@ client.conf media.icon -Icon for the media, a base64 blob with PNG image data - -@PAR@ client.conf media.icon-name -An XDG icon name for the media. Ex: `audio-x-mp3` - -@PAR@ client.conf media.comment -Extra stream comment - -@PAR@ client.conf media.date -Date of the media - -@PAR@ client.conf media.format -User readable stream format information - -@PAR@ client.conf object.linger = false -If the object should outlive its creator. - -## Classifying Properties @IDX@ client.conf - -The classifying properties of a node are use for routing the signal to its destination and -for configuring the settings. - -@PAR@ client.conf media.type -The media type contains a broad category of the media that is being processed by the node. -Possible values include "Audio", "Video", "Midi" - -@PAR@ client.conf media.category -\parblock -What kind of processing is done with the media. Possible values include: - -* Playback: media playback. -* Capture: media capture. -* Duplex: media capture and playback or media processing in general. -* Monitor: a media monitor application. Does not actively change media data but monitors - activity. -* Manager: Will manage the media graph. -\endparblock - -@PAR@ client.conf media.role -\parblock -The Use case of the media. Possible values include: - -* Movie: Movie playback with audio and video. -* Music: Music listening. -* Camera: Recording video from a camera. -* Screen: Recording or sharing the desktop screen. -* Communication: VOIP or other video chat application. -* Game: Game. -* Notification: System notification sounds. -* DSP: Audio or Video filters and effect processing. -* Production: Professional audio processing and production. -* Accessibility: Audio and Visual aid for accessibility. -* Test: Test program. -\endparblock - -@PAR@ client.conf media.class -\parblock -The media class is to classify the stream function. Possible values include: - -* Video/Source: a producer of video, like a webcam. -* Video/Sink: a consumer of video, like a display window. -* Audio/Source: a source of audio samples like a microphone. -* Audio/Sink: a sink for audio samples, like an audio card. -* Audio/Duplex: a node that is both a sink and a source. -* Stream/Output/Audio: a playback stream. -* Stream/Input/Audio: a capture stream. - -The session manager assigns special meaning to the nodes based on the media.class. Sink or Source -classes are used as targets for Stream classes, etc.. -\endparblock - -## Scheduling Properties @IDX@ client.conf - -@PAR@ client.conf node.latency = 1024/48000 -Sets a suggested latency on the node as a fraction. This is just a suggestion, the graph will try to configure this latency or less for the graph. It is however possible that the graph is forced to a higher latency. - -@PAR@ client.conf node.lock-quantum = false -\parblock -When this node is active, the quantum of the graph is locked and not allowed to change automatically. -It can still be changed forcibly with metadata or when a node forces a quantum. - -JACK clients use this property to avoid unexpected quantum changes. -\endparblock - -@PAR@ client.conf node.force-quantum = INTEGER -\parblock -While the node is active, force a quantum in the graph. The last node to be activated with this property wins. - -A value of 0 unforces the quantum. -\endparblock - -@PAR@ client.conf node.rate = RATE -Suggest a rate (samplerate) for the graph. The suggested rate will only be applied when doing so would not cause -interruptions (devices are idle) and when the rate is in the list of allowed rates in the server. - -@PAR@ client.conf node.lock-rate = false -When the node is active, the rate of the graph will not change automatically. It is still possible to force a rate change with metadata or with a node property. - -@PAR@ client.conf node.force-rate = RATE -\parblock -When the node is active, force a specific sample rate on the graph. The last node to activate with this property wins. - -A RATE of 0 means to force the rate in `node.rate` denominator. -\endparblock - -@PAR@ client.conf node.always-process = false -\parblock -When the node is active, it will always be joined with a driver node, even when nothing is linked to the node. -Setting this property to true also implies node.want-driver = true. - -This is the default for JACK nodes, that always need their process callback called. -\endparblock - -@PAR@ client.conf node.want-driver = true -The node wants to be linked to a driver so that it can start processing. This is the default for streams -and filters since 0.3.51. Nodes that are not linked to anything will still be set to the idle state, -unless node.always-process is set to true. - -@PAR@ client.conf node.pause-on-idle = false -@PAR@ client.conf node.suspend-on-idle = false -\parblock -When the node is not linked anymore, it becomes idle. Normally idle nodes keep processing and are suspended by the session manager after some timeout. It is possible to immediately pause a node when idle with this property. - -When the session manager does not suspend nodes (or when there is no session manager), the node.suspend-on-idle property can be used instead. -\endparblock - -@PAR@ client.conf node.loop.name = null -@PAR@ client.conf node.loop.class = data.rt -\parblock -Add the node to a specific loop name or loop class. By default the node is added to the -data.rt loop class. You can make more specific data loops and then assign the nodes to those. - -Other well known names are main-loop.0 and the main node.loop.class which runs the node data processing -in the main loop. -\endparblock - -## Session Manager Properties @IDX@ client.conf - -@PAR@ client.conf node.autoconnect = true -Instructs the session manager to automatically connect this node to some other node, usually -a sink or source. - -@PAR@ client.conf node.exclusive = false -If this node wants to be linked exclusively to the sink/source. - -@PAR@ client.conf node.target = <node.name|object.id> -Where this node should be linked to. This can be a node.name or an object.id of a node. This property is -deprecated, the target.object property should be used instead, which uses the more unique object.serial as -a possible target. - -@PAR@ client.conf target.object = <node.name|object.serial> -Where the node should link to, this can be a node.name or an object.serial. - -@PAR@ client.conf node.dont-reconnect = false -\parblock -When the node has a target configured and the target is destroyed, destroy the node as well. -This property also inhibits that the node is moved to another sink/source. - -Note that if a stream should appear/disappear in sync with the target, a session manager (WirePlumber) script -should be written instead. -\endparblock - -@PAR@ client.conf node.passive = false -\parblock -This is a passive node and so it should not keep sinks/sources busy. This property makes the session manager create passive links to the sink/sources. If the node is not otherwise linked (via a non-passive link), the node and the sink it is linked to are idle (and eventually suspended). - -This is used for filter nodes that sit in front of sinks/sources and need to suspend together with the sink/source. -\endparblock - -@PAR@ client.conf node.link-group = ID -Add the node to a certain link group. Nodes from the same link group are not automatically linked to each other by the session manager. And example is a coupled stream where you don't want the output to link to the input streams, making a useless loop. - -@PAR@ client.conf stream.dont-remix = false -Instruct the session manager to not remix the channels of a stream. Normally the stream channel configuration is changed to match the sink/source it is connected to. With this property set to true, the stream will keep its original channel layout and the session manager will link matching channels with the sink. - -## Audio Adapter Parameters @IDX@ client.conf - -An audio stream (and also audio device nodes) contain an audio adapter that can perform, -sample format, sample rate and channel mixing operations. - -### Merger Parameters - -The merger is used as the input for a sink device node or a capture stream. It takes the various channels and merges them into a single stream for further processing. - -The merger will also provide the monitor ports of the input channels and can -apply a software volume on the monitor signal. - -@PAR@ client.conf monitor.channel-volumes = false -The volume of the input channels is applied to the volume of the monitor ports. Normally -the monitor ports expose the raw unmodified signal on the input ports. - -### Resampler Parameters - -Source, sinks, capture and playback streams contain a high quality adaptive resampler. -It uses sinc(https://ccrma.stanford.edu/~jos/resample/resample.pdf) based resampling -with linear interpolation of filter banks to perform arbitrary -resample factors. The resampler is activated in the following cases: - -* The hardware of a device node does not support the graph samplerate. Resampling will occur - from the graph samplerate to the hardware samplerate. -* The hardware clock of a device does not run at the same speed as the graph clock and adaptive - resampling is required to match the clocks. -* A stream does not have the same samplerate as the graph and needs to be resampled. -* An application wants to activate adaptive resampling in a stream to make it match some other - clock. - -PipeWire performs most of the sample conversions and resampling in the client (Or in the case of the PulseAudio server, in the pipewire-pulse server that creates the streams). This ensures all the conversions are offloaded to the clients and the server can deal with one single format for performance reasons. - -Below is an explanation of the options that can be tuned in the sample converter. - -@PAR@ client.conf resample.quality = 4 -\parblock -The quality of the resampler. from 0 to 14, the default is 4. - -Increasing the quality will result in better cutoff and less aliasing at the expense of -(much) more CPU consumption. The default quality of 4 has been selected as a good compromise -between quality and performance with no artifacts that are well below the audible range. - -See Infinite Wave(https://src.infinitewave.ca/) for a comparison of the performance. -\endparblock - -@PAR@ client.conf resample.disable = false -Disable the resampler entirely. The node will only be able to negotiate with the graph -when the samplerates are compatible. - -### Channel Mixer Parameters - -Source, sinks, capture and playback streams can apply channel mixing on the incoming signal. - -Normally the channel mixer is not used for devices, the device channels are usually exposed as they are. This policy is usually enforced by the session manager, so we refer to its documentation there. - -Playback and capture streams are usually configured to the channel layout of the sink/source -they connect to and will thus perform channel mixing. - -The channel mixer also implements a software volume. This volume adjustment is performed on the original -channel layout. ex: A stereo playback stream that is up-mixed to 5.1 has 2 a left an right volume control. - -@PAR@ client.conf channelmix.disable = false -Disables the channel mixer completely. The stream will only be able to link to compatible -sources/sinks with the exact same channel layout. - -@PAR@ client.conf channelmix.min-volume = 0.0 -@PAR@ client.conf channelmix.max-volume = 10.0 -Gives the min and max volume values allowed. Any volume that is set will be clamped to these -values. - -@PAR@ client.conf channelmix.normalize = false -\parblock -Makes sure that during such mixing & resampling original 0 dB level is preserved, so nothing sounds wildly quieter/louder. - -While this options prevents clipping, it can in some cases produce too low volume. Increase the -volume in that case or disable normalization. -\endparblock - -@PAR@ client.conf channelmix.lock-volumes = false -Completely disable volume or mute changes. Defaults to false. - -@PAR@ client.conf channelmix.mix-lfe = true -Mixes the low frequency effect channel into the front center or stereo pair. This might enhance the dynamic range of the signal if there is no subwoofer and the speakers can reproduce the low frequency signal. - -@PAR@ client.conf channelmix.upmix = true -\parblock -Enables up-mixing of the front center (FC) when the target has a FC channel. -The sum of the stereo channels is used and an optional lowpass filter can be used -(see `channelmix.fc-cutoff`). - -Also enabled up-mixing of LFE when `channelmix.lfe-cutoff` is set to something else than 0 and -the target has an LFE channel. The LFE channel is produced by adding the stereo channels. - -If `channelmix.upmix` is true, the up-mixing of the rear channels is also enabled and controlled -with the `channelmix-upmix-method` property. -\endparblock - -@PAR@ client.conf channelmix.upmix-method = psd -\parblock -3 methods are provided to produce the rear channels in a surround sound: - -1. none. No rear channels are produced. - -2. simple. Front channels are copied to the rear. This is fast but can produce phasing effects. - -3. psd. The rear channels as produced from the front left and right ambient sound (the -difference between the channels). A delay and optional phase shift are added to the rear signal -to make the sound bigger. -\endparblock - -@PAR@ client.conf channelmix.lfe-cutoff = 150 -Apply a lowpass filter to the low frequency effects. The value is expressed in Hz. Typical subwoofers have a cutoff at around 150 and 200. The default value of 0 disables the feature. - -@PAR@ client.conf channelmix.fc-cutoff = 12000 -\parblock -Apply a lowpass filter to the front center frequency. The value is expressed in Hz. - -Since the front center contains the dialogs, a typical cutoff frequency is 12000 Hz. - -This option is only active when the up-mix is enabled. -\endparblock - -@PAR@ client.conf channelmix.rear-delay = 12.0 -\parblock -Apply a delay in milliseconds when up-mixing the rear channels. This improves -specialization of the sound. A typical delay of 12 milliseconds is the default. - -This is only active when the `psd` up-mix method is used. -\endparblock - -@PAR@ client.conf channelmix.stereo-widen = 0.0 -\parblock -Subtracts some of the front center signal from the stereo channels. This moves the dialogs -more to the center speaker and leaves the ambient sound in the stereo channels. - -This is only active when up-mix is enabled and a Front Center channel is mixed. -\endparblock - -@PAR@ client.conf channelmix.hilbert-taps = 0 -\parblock -This option will apply a 90 degree phase shift to the rear channels to improve specialization. -Taps needs to be between 15 and 255 with more accurate results (and more CPU consumption) -for higher values. - -This is only active when the `psd` up-mix method is used. -\endparblock - -@PAR@ client.conf dither.noise = 0 -\parblock -This option will add N bits of random data to the signal. When no dither.method is -specified, the random data will flip between -(1<<(N-1)), 0 every 1024 samples. With -a dither.method, the dither noise is amplified with 1<<(N-1) bits. - -This can be used to keep some amplifiers alive during silent periods. One or two bits of noise is -usually enough, otherwise the noise will become audible. This is usually used together with -`session.suspend-timeout-seconds` to disable suspend in the session manager. - -Note that PipeWire uses floating point operations with 24 bits precission for all of the audio -processing. Conversion to 24 bits integer sample formats is lossless and conversion to 32 bits -integer sample formats are simply padded with 0 bits at the end. This means that the dither noise -is always only in the 24 most significant bits. -\endparblock - -@PAR@ client.conf dither.method = none -\parblock -Optional dithering(https://en.wikipedia.org/wiki/Dither) can be done on the quantized -output signal. - -There are 6 modes available: - -1. none No dithering is done. -2. rectangular Dithering with a rectangular noise distribution. This adds random - bits in the -0.5, 0.5 range to the signal with even distribution. -3. triangular Dithering with a triangular noise distribution. This add random - bits in the -1.0, 1.0 range to the signal with triangular distribution - around 0.0. -4. triangular-hf Dithering with a sloped triangular noise distribution. -5. wannamaker3 Additional noise shaping is performed on the sloped triangular - dithering to move the noise to the more inaudible range. This is using - the "F-Weighted" noise filter described by Wannamaker. -6. shaped5 Additional noise shaping is performed on the triangular dithering - to move the noise to the more inaudible range. This is using the - Lipshitz filter. - -Dithering is only useful for conversion to a format with less than 24 bits and will be -disabled otherwise. -\endparblock - -## Debug Parameters - -@PAR@ client.conf debug.wav-path = "" -Make the stream to also write the raw samples to a WAV file for debugging purposes. - -## Format Properties - -Streams and also most device nodes can be configured in a certain format with properties. - -@PAR@ client.conf audio.rate = RATE -Forces a samplerate on the node. - -@PAR@ client.conf audio.channels = INTEGER -The number of audio channels to use. Must be a value between 1 and 64. - -@PAR@ client.conf audio.format = FORMAT -\parblock -Forces an audio format on the node. This is the format used internally in the node because the graph processing format is always float 32. - -Valid formats include: S16, S32, F32, F64, S16LE, S16BE, ... -\endparblock - -@PAR@ client.conf audio.allowed-rates -An array of allowed samplerates for the node. ex. " 44100 48000 " +A list of object properties that can be applied to streams can be found in +\ref props__common_node_properties "pipewire-props(7) Common Node Properties" +and +\ref props__audio_converter_properties "pipewire-props(7) Audio Adapter Properties" # STREAM RULES @IDX@ client.conf @@ -537,7 +120,9 @@ Add a `stream.rules` or `filter.rules` section in the config file like this: -``` +```css +# ~/.config/pipewire/client.conf.d/custom.conf + stream.rules = { matches = @@ -557,11 +142,14 @@ Will set the node.name of Firefox to "My Name". -# ALSA PROPERTIES @IDX@ client.conf +# ALSA CLIENT PROPERTIES @IDX@ client.conf -An `alsa.properties` section can be added to configure ALSA specific client config. +An `alsa.properties` section can be added to configure client applications +that connect via the PipeWire ALSA plugin. ```css +# ~/.config/pipewire/client-rt.conf.d/custom.conf + alsa.properties = { #alsa.deny = false #alsa.format = 0 @@ -596,14 +184,17 @@ This controls the volume curve used on the ALSA mixer. Possible values are `cubic` and `linear`. The default is to use `cubic`. -# ALSA RULES @IDX@ client.conf +# ALSA CLIENT RULES @IDX@ client.conf It is possible to set ALSA client specific properties by using \ref pipewire_conf__match_rules "Match rules, see pipewire(1)". You can set any of the above ALSA properties or any of the `stream.properties`. ### Example -``` + +```css +# ~/.config/pipewire/client-rt.conf.d/custom.conf + alsa.rules = { matches = { application.process.binary = "resolve" } actions = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/doc/dox/config/pipewire-jack.conf.5.md -> _service:download_url:pipewire-1.2.6.tar.bz2/doc/dox/config/pipewire-jack.conf.5.md
Changed
@@ -41,8 +41,9 @@ # JACK PROPERTIES @IDX@ jack.conf The configuration file can contain an extra JACK specific section called `jack.properties` like this: -``` -... +```css +# ~/.config/pipewire/jack.conf.d/custom.conf + jack.properties = { #rt.prio = 88 #node.latency = 1024/48000 @@ -204,7 +205,9 @@ Add a `jack.rules` section in the config file like this: -``` +```css +# ~/.config/pipewire/jack.conf.d/custom.conf + jack.rules = { matches =
View file
_service:download_url:pipewire-1.2.6.tar.bz2/doc/dox/config/pipewire-props.7.md
Added
@@ -0,0 +1,1155 @@ +\page page_man_pipewire-props_7 pipewire-props + +PipeWire object property reference. + +\tableofcontents + +# DESCRIPTION + +PipeWire describes and configures audio and video elements with +objects of the following main types: + +\par Node +Audio or video sink/source endpoint + +\par Device +Sound cards, bluetooth devices, cameras, etc. May have multiple nodes. + +\par Monitor +Finding devices and handling hotplugging + +\par Port +Audio/video endpoint in a node + +\par Link +Connection between ports, that transporting audio/video between them. + +\par Client +Application connected to PipeWire. + +All objects have *properties* ("props"), most of which can be set in +configuration files or at runtime when the object is created. + +Some of the properties are "common properties" (for example +`node.description`) and can be set on all objects of the given +type. Other properties control settings of a specific kinds of device +or node (ALSA, Bluetooth, ...), and have meaning only for those +objects. + +Usually, all the properties are configured in the session manager +configuration. For how to configure them, see the session manager +documentation. In minimal PipeWire setups without a session manager, +they can be configured via +\ref pipewire_conf__context_objects "context.objects in pipewire.conf(5)". + +\see WirePlumber configuration(https://pipewire.pages.freedesktop.org/wireplumber/daemon/configuration.html) + +# COMMON DEVICE PROPERTIES @IDX@ props + +These are common properties for devices. + +@PAR@ device-prop device.name # string +A (unique) name for the device. It can be used by command-line and other tools to identify the device. + +@PAR@ device-prop device.param.PARAM = { ... } # JSON +\parblock +Set value of a device \ref spa_param_type "Param" to a JSON value when the device is loaded. +This works similarly as \ref page_man_pw-cli_1 "pw-cli(1)" `set-param` command. +The `PARAM` should be replaced with the name of the Param to set, +ie. for example `device.Param.Props = { ... }` to set `Props`. +\endparblock + +@PAR@ device-prop device.plugged # integer +\parblock +\copydoc PW_KEY_DEVICE_PLUGGED +\endparblock + +@PAR@ device-prop device.nick # string +\parblock +\copydoc PW_KEY_DEVICE_NICK +\endparblock + +@PAR@ device-prop device.description # string +\parblock +\copydoc PW_KEY_DEVICE_DESCRIPTION +\endparblock + +@PAR@ device-prop device.serial # string +\parblock +\copydoc PW_KEY_DEVICE_SERIAL +\endparblock + +@PAR@ device-prop device.vendor.id # integer +\parblock +\copydoc PW_KEY_DEVICE_VENDOR_ID +\endparblock + +@PAR@ device-prop device.vendor.name # string +\parblock +\copydoc PW_KEY_DEVICE_VENDOR_NAME +\endparblock + +@PAR@ device-prop device.product.id # integer +\parblock +\copydoc PW_KEY_DEVICE_PRODUCT_NAME +\endparblock + +@PAR@ device-prop device.product.name # string +\parblock +\copydoc PW_KEY_DEVICE_PRODUCT_ID +\endparblock + +@PAR@ device-prop device.class # string +\parblock +\copydoc PW_KEY_DEVICE_CLASS +\endparblock + +@PAR@ device-prop device.form-factor # string +\parblock +\copydoc PW_KEY_DEVICE_FORM_FACTOR +\endparblock + +@PAR@ device-prop device.icon # string +\parblock +\copydoc PW_KEY_DEVICE_ICON +\endparblock + +@PAR@ device-prop device.icon-name # string +\parblock +\copydoc PW_KEY_DEVICE_ICON_NAME +\endparblock + +@PAR@ device-prop device.intended-roles # string +\parblock +\copydoc PW_KEY_DEVICE_INTENDED_ROLES +\endparblock + +@PAR@ device-prop device.disabled = false # boolean +Disable the creation of this device in session manager. + + +There are other common `device.*` properties for technical purposes +and not usually user-configurable. + +\see pw_keys in the API documentation for a full list. + +# COMMON NODE PROPERTIES @IDX@ props + +The properties here apply to general audio or video input/output +streams, and other nodes such as sinks or sources corresponding to +real or virtual devices. + +## Identifying Properties @IDX@ props + +These contain properties to identify the node or to display the node in a GUI application. + +@PAR@ node-prop node.name +A (unique) name for the node. This is usually set on sink and sources to identify them +as targets for linking by the session manager. + +@PAR@ node-prop node.description +A human readable description of the node or stream. + +@PAR@ node-prop media.name +A user readable media name, usually the artist and title. +These are usually shown in user facing applications +to inform the user about the current playing media. + +@PAR@ node-prop media.title +A user readable stream title. + +@PAR@ node-prop media.artist +A user readable stream artist + +@PAR@ node-prop media.copyright +User readable stream copyright information + +@PAR@ node-prop media.software +User readable stream generator software information + +@PAR@ node-prop media.language +Stream language in POSIX format. Ex: `en_GB` + +@PAR@ node-prop media.filename +File name for the stream + +@PAR@ node-prop media.icon +Icon for the media, a base64 blob with PNG image data + +@PAR@ node-prop media.icon-name +An XDG icon name for the media. Ex: `audio-x-mp3` + +@PAR@ node-prop media.comment +Extra stream comment + +@PAR@ node-prop media.date +Date of the media + +@PAR@ node-prop media.format +User readable stream format information + +@PAR@ node-prop object.linger = false +If the object should outlive its creator. + +@PAR@ node-prop device.id +ID of the device the node belongs to. + +## Classifying Properties @IDX@ props + +The classifying properties of a node are use for routing the signal to its destination and +for configuring the settings. + +@PAR@ node-prop media.type +The media type contains a broad category of the media that is being processed by the node. +Possible values include "Audio", "Video", "Midi" + +@PAR@ node-prop media.category +\parblock +What kind of processing is done with the media. Possible values include: + +* Playback: media playback. +* Capture: media capture. +* Duplex: media capture and playback or media processing in general. +* Monitor: a media monitor application. Does not actively change media data but monitors + activity. +* Manager: Will manage the media graph. +\endparblock + +@PAR@ node-prop media.role +\parblock +The Use case of the media. Possible values include: + +* Movie: Movie playback with audio and video. +* Music: Music listening. +* Camera: Recording video from a camera. +* Screen: Recording or sharing the desktop screen. +* Communication: VOIP or other video chat application. +* Game: Game. +* Notification: System notification sounds. +* DSP: Audio or Video filters and effect processing. +* Production: Professional audio processing and production. +* Accessibility: Audio and Visual aid for accessibility. +* Test: Test program. +\endparblock + +@PAR@ node-prop media.class +\parblock +The media class is to classify the stream function. Possible values include: + +* Video/Source: a producer of video, like a webcam. +* Video/Sink: a consumer of video, like a display window. +* Audio/Source: a source of audio samples like a microphone. +* Audio/Sink: a sink for audio samples, like an audio card. +* Audio/Duplex: a node that is both a sink and a source. +* Stream/Output/Audio: a playback stream. +* Stream/Input/Audio: a capture stream. + +The session manager assigns special meaning to the nodes based on the media.class. Sink or Source +classes are used as targets for Stream classes, etc.. +\endparblock + +## Scheduling Properties @IDX@ props + +@PAR@ node-prop node.latency = 1024/48000 +Sets a suggested latency on the node as a fraction. This is just a suggestion, the graph will try to configure this latency or less for the graph. It is however possible that the graph is forced to a higher latency. + +@PAR@ node-prop node.lock-quantum = false +\parblock +When this node is active, the quantum of the graph is locked and not allowed to change automatically. +It can still be changed forcibly with metadata or when a node forces a quantum. + +JACK clients use this property to avoid unexpected quantum changes. +\endparblock + +@PAR@ node-prop node.force-quantum = INTEGER +\parblock +While the node is active, force a quantum in the graph. The last node to be activated with this property wins. + +A value of 0 unforces the quantum. +\endparblock + +@PAR@ node-prop node.rate = RATE +Suggest a rate (samplerate) for the graph. The suggested rate will only be applied when doing so would not cause +interruptions (devices are idle) and when the rate is in the list of allowed rates in the server. + +@PAR@ node-prop node.lock-rate = false +When the node is active, the rate of the graph will not change automatically. It is still possible to force a rate change with metadata or with a node property. + +@PAR@ node-prop node.force-rate = RATE +\parblock +When the node is active, force a specific sample rate on the graph. The last node to activate with this property wins. + +A RATE of 0 means to force the rate in `node.rate` denominator. +\endparblock + +@PAR@ node-prop node.always-process = false +\parblock +When the node is active, it will always be joined with a driver node, even when nothing is linked to the node. +Setting this property to true also implies node.want-driver = true. + +This is the default for JACK nodes, that always need their process callback called. +\endparblock + +@PAR@ node-prop node.want-driver = true +The node wants to be linked to a driver so that it can start processing. This is the default for streams +and filters since 0.3.51. Nodes that are not linked to anything will still be set to the idle state, +unless node.always-process is set to true. + +@PAR@ node-prop node.pause-on-idle = false +@PAR@ node-prop node.suspend-on-idle = false +\parblock +When the node is not linked anymore, it becomes idle. Normally idle nodes keep processing and are suspended by the session manager after some timeout. It is possible to immediately pause a node when idle with this property. + +When the session manager does not suspend nodes (or when there is no session manager), the node.suspend-on-idle property can be used instead. +\endparblock + +@PAR@ node-prop node.loop.name = null +@PAR@ node-prop node.loop.class = data.rt +\parblock +Add the node to a specific loop name or loop class. By default the node is added to the +data.rt loop class. You can make more specific data loops and then assign the nodes to those. + +Other well known names are main-loop.0 and the main node.loop.class which runs the node data processing +in the main loop. +\endparblock + +@PAR@ node-prop priority.driver # integer +\parblock +The priority of choosing this device as the driver in the graph. The driver is selected from all linked devices by selecting the device with the highest priority. + +Normally, the session manager assigns higher priority to sources so that they become the driver in the graph. The reason for this is that adaptive resampling should be done on the sinks rather than the source to avoid signal distortion when capturing audio. +\endparblock + +@PAR@ node-prop clock.name # string +\parblock +The name of the clock. This name is auto generated from the card index and stream direction. Devices with the same clock name will not use a resampler to align the clocks. This can be used to link devices together with a shared word clock. + +In Pro Audio mode, nodes from the same device are assumed to have the same clock and no resampling will happen when linked together. So, linking a capture port to a playback port will not use any adaptive resampling in Pro Audio mode. + +In Non Pro Audio profile, no such assumption is made and adaptive resampling is done in all cases by default. This can also be disabled by setting the same clock.name on the nodes. +\endparblock + +## Session Manager Properties @IDX@ props + +@PAR@ node-prop node.autoconnect = true +Instructs the session manager to automatically connect this node to some other node, usually +a sink or source. + +@PAR@ node-prop node.exclusive = false +If this node wants to be linked exclusively to the sink/source. + +@PAR@ node-prop node.target = <node.name|object.id> +Where this node should be linked to. This can be a node.name or an object.id of a node. This property is +deprecated, the target.object property should be used instead, which uses the more unique object.serial as +a possible target. + +@PAR@ node-prop target.object = <node.name|object.serial> +Where the node should link to, this can be a node.name or an object.serial. + +@PAR@ node-prop node.dont-reconnect = false +\parblock +When the node has a target configured and the target is destroyed, destroy the node as well. +This property also inhibits that the node is moved to another sink/source. + +Note that if a stream should appear/disappear in sync with the target, a session manager (WirePlumber) script +should be written instead. +\endparblock + +@PAR@ node-prop node.passive = false +\parblock +This is a passive node and so it should not keep sinks/sources busy. This property makes the session manager create passive links to the sink/sources. If the node is not otherwise linked (via a non-passive link), the node and the sink it is linked to are idle (and eventually suspended). + +This is used for filter nodes that sit in front of sinks/sources and need to suspend together with the sink/source. +\endparblock + +@PAR@ node-prop node.link-group = ID +Add the node to a certain link group. Nodes from the same link group are not automatically linked to each other by the session manager. And example is a coupled stream where you don't want the output to link to the input streams, making a useless loop. + +@PAR@ node-prop stream.dont-remix = false +Instruct the session manager to not remix the channels of a stream. Normally the stream channel configuration is changed to match the sink/source it is connected to. With this property set to true, the stream will keep its original channel layout and the session manager will link matching channels with the sink. + +@PAR@ node-prop priority.session # integer +The priority for selecting this node as the default source or sink. + +## Format Properties + +Streams and also most device nodes can be configured in a certain format with properties. + +@PAR@ node-prop audio.rate = RATE +Forces a samplerate on the node. + +@PAR@ node-prop audio.channels = INTEGER +The number of audio channels to use. Must be a value between 1 and 64. + +@PAR@ node-prop audio.format = FORMAT +\parblock +Forces an audio format on the node. This is the format used internally in the node because the graph processing format is always float 32. + +Valid formats include: S16, S32, F32, F64, S16LE, S16BE, ... +\endparblock + +@PAR@ node-prop audio.allowed-rates +An array of allowed samplerates for the node. ex. " 44100 48000 " + +## Other Properties + +@PAR@ node-prop node.param.PARAM = { ... } # JSON +\parblock +Set value of a node \ref spa_param_type "Param" to a JSON value when the device is loaded. +This works similarly as \ref page_man_pw-cli_1 "pw-cli(1)" `set-param` command. +The `PARAM` should be replaced with the name of the Param to set, +ie. for example `node.param.Props = { ... }` to set `Props`. +\endparblock + +@PAR@ node-prop node.disabled = false # boolean +Disable the creation of this node in session manager. + + +# AUDIO ADAPTER PROPERTIES @IDX@ props + +Most audio nodes (ALSA, Bluetooth, audio streams from applications, +...) have common properties for the audio adapter. The adapter +performs sample format, sample rate and channel mixing operations. + +All properties listed below are node properties. + +## Merger Parameters + +The merger is used as the input for a sink device node or a capture stream. It takes the various channels and merges them into a single stream for further processing. + +The merger will also provide the monitor ports of the input channels and can +apply a software volume on the monitor signal. + +@PAR@ node-prop monitor.channel-volumes = false +The volume of the input channels is applied to the volume of the monitor ports. Normally +the monitor ports expose the raw unmodified signal on the input ports. + +## Resampler Parameters + +Source, sinks, capture and playback streams contain a high quality adaptive resampler. +It uses sinc(https://ccrma.stanford.edu/~jos/resample/resample.pdf) based resampling +with linear interpolation of filter banks to perform arbitrary +resample factors. The resampler is activated in the following cases: + +* The hardware of a device node does not support the graph samplerate. Resampling will occur + from the graph samplerate to the hardware samplerate. +* The hardware clock of a device does not run at the same speed as the graph clock and adaptive + resampling is required to match the clocks. +* A stream does not have the same samplerate as the graph and needs to be resampled. +* An application wants to activate adaptive resampling in a stream to make it match some other + clock. + +PipeWire performs most of the sample conversions and resampling in the client (Or in the case of the PulseAudio server, in the pipewire-pulse server that creates the streams). This ensures all the conversions are offloaded to the clients and the server can deal with one single format for performance reasons. + +Below is an explanation of the options that can be tuned in the sample converter. + +@PAR@ node-prop resample.quality = 4 +\parblock +The quality of the resampler. from 0 to 14, the default is 4. + +Increasing the quality will result in better cutoff and less aliasing at the expense of +(much) more CPU consumption. The default quality of 4 has been selected as a good compromise +between quality and performance with no artifacts that are well below the audible range. + +See Infinite Wave(https://src.infinitewave.ca/) for a comparison of the performance. +\endparblock + +@PAR@ node-prop resample.disable = false +Disable the resampler entirely. The node will only be able to negotiate with the graph +when the samplerates are compatible. + +## Channel Mixer Parameters + +Source, sinks, capture and playback streams can apply channel mixing on the incoming signal. + +Normally the channel mixer is not used for devices, the device channels are usually exposed as they are. This policy is usually enforced by the session manager, so we refer to its documentation there. + +Playback and capture streams are usually configured to the channel layout of the sink/source +they connect to and will thus perform channel mixing. + +The channel mixer also implements a software volume. This volume adjustment is performed on the original +channel layout. ex: A stereo playback stream that is up-mixed to 5.1 has 2 a left an right volume control. + +@PAR@ node-prop channelmix.disable = false +Disables the channel mixer completely. The stream will only be able to link to compatible +sources/sinks with the exact same channel layout. + +@PAR@ node-prop channelmix.min-volume = 0.0 +@PAR@ node-prop channelmix.max-volume = 10.0 +Gives the min and max volume values allowed. Any volume that is set will be clamped to these +values. + +@PAR@ node-prop channelmix.normalize = false +\parblock +Makes sure that during such mixing & resampling original 0 dB level is preserved, so nothing sounds wildly quieter/louder. + +While this options prevents clipping, it can in some cases produce too low volume. Increase the +volume in that case or disable normalization. +\endparblock + +@PAR@ node-prop channelmix.lock-volumes = false +Completely disable volume or mute changes. Defaults to false. + +@PAR@ node-prop channelmix.mix-lfe = true +Mixes the low frequency effect channel into the front center or stereo pair. This might enhance the dynamic range of the signal if there is no subwoofer and the speakers can reproduce the low frequency signal. + +@PAR@ node-prop channelmix.upmix = true +\parblock +Enables up-mixing of the front center (FC) when the target has a FC channel. +The sum of the stereo channels is used and an optional lowpass filter can be used +(see `channelmix.fc-cutoff`). + +Also enabled up-mixing of LFE when `channelmix.lfe-cutoff` is set to something else than 0 and +the target has an LFE channel. The LFE channel is produced by adding the stereo channels. + +If `channelmix.upmix` is true, the up-mixing of the rear channels is also enabled and controlled +with the `channelmix-upmix-method` property. +\endparblock + +@PAR@ node-prop channelmix.upmix-method = psd +\parblock +3 methods are provided to produce the rear channels in a surround sound: + +1. none. No rear channels are produced. + +2. simple. Front channels are copied to the rear. This is fast but can produce phasing effects. + +3. psd. The rear channels as produced from the front left and right ambient sound (the +difference between the channels). A delay and optional phase shift are added to the rear signal +to make the sound bigger. +\endparblock + +@PAR@ node-prop channelmix.lfe-cutoff = 150 +Apply a lowpass filter to the low frequency effects. The value is expressed in Hz. Typical subwoofers have a cutoff at around 150 and 200. The default value of 0 disables the feature. + +@PAR@ node-prop channelmix.fc-cutoff = 12000 +\parblock +Apply a lowpass filter to the front center frequency. The value is expressed in Hz. + +Since the front center contains the dialogs, a typical cutoff frequency is 12000 Hz. + +This option is only active when the up-mix is enabled. +\endparblock + +@PAR@ node-prop channelmix.rear-delay = 12.0 +\parblock +Apply a delay in milliseconds when up-mixing the rear channels. This improves +specialization of the sound. A typical delay of 12 milliseconds is the default. + +This is only active when the `psd` up-mix method is used. +\endparblock + +@PAR@ node-prop channelmix.stereo-widen = 0.0 +\parblock +Subtracts some of the front center signal from the stereo channels. This moves the dialogs +more to the center speaker and leaves the ambient sound in the stereo channels. + +This is only active when up-mix is enabled and a Front Center channel is mixed. +\endparblock + +@PAR@ node-prop channelmix.hilbert-taps = 0 +\parblock +This option will apply a 90 degree phase shift to the rear channels to improve specialization. +Taps needs to be between 15 and 255 with more accurate results (and more CPU consumption) +for higher values. + +This is only active when the `psd` up-mix method is used. +\endparblock + +@PAR@ node-prop dither.noise = 0 +\parblock +This option will add N bits of random data to the signal. When no dither.method is +specified, the random data will flip between -(1<<(N-1)), 0 every 1024 samples. With +a dither.method, the dither noise is amplified with 1<<(N-1) bits. + +This can be used to keep some amplifiers alive during silent periods. One or two bits of noise is +usually enough, otherwise the noise will become audible. This is usually used together with +`session.suspend-timeout-seconds` to disable suspend in the session manager. + +Note that PipeWire uses floating point operations with 24 bits precission for all of the audio +processing. Conversion to 24 bits integer sample formats is lossless and conversion to 32 bits +integer sample formats are simply padded with 0 bits at the end. This means that the dither noise +is always only in the 24 most significant bits. +\endparblock + +@PAR@ node-prop dither.method = none +\parblock +Optional dithering(https://en.wikipedia.org/wiki/Dither) can be done on the quantized +output signal. + +There are 6 modes available: + +1. none No dithering is done. +2. rectangular Dithering with a rectangular noise distribution. This adds random + bits in the -0.5, 0.5 range to the signal with even distribution. +3. triangular Dithering with a triangular noise distribution. This add random + bits in the -1.0, 1.0 range to the signal with triangular distribution + around 0.0. +4. triangular-hf Dithering with a sloped triangular noise distribution. +5. wannamaker3 Additional noise shaping is performed on the sloped triangular + dithering to move the noise to the more inaudible range. This is using + the "F-Weighted" noise filter described by Wannamaker. +6. shaped5 Additional noise shaping is performed on the triangular dithering + to move the noise to the more inaudible range. This is using the + Lipshitz filter. + +Dithering is only useful for conversion to a format with less than 24 bits and will be +disabled otherwise. +\endparblock + +## Debug Parameters + +@PAR@ node-prop debug.wav-path = "" +Make the stream to also write the raw samples to a WAV file for debugging purposes. + +## Other Parameters + +These control low-level technical features: + +@PAR@ node-prop clock.quantum-limit +\ref pipewire_conf__default_clock_quantum-limit "See pipewire.conf(5)" + +@PAR@ node-prop resample.peaks = false # boolean +Instead of actually resampling, produce peak amplitude values as output. +This is used for volume monitoring, where it is set as a property +of the "recording" stream. + +@PAR@ node-prop resample.prefill = false # boolean +Prefill resampler buffers with silence. This affects the initial +samples produced by the resampler. + +@PAR@ node-prop adapter.auto-port-config = null # JSON +\parblock +If specified, configure the ports of the node when it is created, instead of +leaving that to the session manager to do. This is useful (only) for minimal +configurations without a session manager. + +Value is SPA JSON of the form: +```json +{ + mode = "none", # "none", "passthrough", "convert", "dsp" + monitor = false, # boolean + control = false, # boolean + position = "preserve" # "unknown", "aux", "preserve" +} +``` +See \ref spa_param_port_config for the meaning. +\endparblock + +# ALSA PROPERTIES @IDX@ props + +## Monitor properties + +@PAR@ monitor-prop alsa.use-acp # boolean +Use \ref monitor-prop__alsa_card_profiles "ALSA Card Profiles" (ACP) for device configuration. + +@PAR@ monitor-prop alsa.udev.expose-busy # boolean +Expose the ALSA card even if it is busy/in use. Default false. This can be useful when some +of the PCMs are in use by other applications but the other free PCMs should still be exposed. + +## Device properties + +@PAR@ device-prop api.alsa.path # string +ALSA device path as can be used in snd_pcm_open() and snd_ctl_open(). + +@PAR@ device-prop api.alsa.use-ucm = true # boolean +\parblock +When ACP is enabled and a UCM configuration is available for a device, by +default it is used instead of the ACP profiles. This option allows you to +disable this and use the ACP profiles instead. + +This option does nothing if `api.alsa.use-acp` is set to `false`. +\endparblock + +@PAR@ device-prop api.alsa.soft-mixer = false # boolean +Setting this option to `true` will disable the hardware mixer for volume +control and mute. All volume handling will then use software volume and mute, +leaving the hardware mixer untouched. The hardware mixer will still be used +to mute unused audio paths in the device. + +@PAR@ device-prop api.alsa.ignore-dB = false # boolean +Setting this option to `true` will ignore the decibel setting configured by +the driver. Use this when the driver reports wrong settings. + +@PAR@ device-prop device.profile-set # string +This option can be used to select a custom ACP profile-set name for the +device. This can be configured in UDev rules, but it can also be specified +here. The default is to use "default.conf" unless there is a matching udev rule. + +@PAR@ device-prop device.profile # string +The initial active profile name. The default is to start from the "Off" +profile and then let session manager select the best profile based on its +policy. + +@PAR@ device-prop api.acp.auto-profile = true # boolean +Automatically select the best profile for the device. The session manager +usually disables this, as it handles this task instead. This can be +enabled in custom configurations without the session manager handling this. + +@PAR@ device-prop api.acp.auto-port = true # boolean +Automatically select the highest priority port that is available ("port" is a +PulseAudio/ACP term, the equivalent of a "Route" in PipeWire). The session manager +usually disables this, as it handles this task instead. This can be +enabled in custom configurations without the session manager handling this. + +@PAR@ device-prop api.acp.probe-rate # integer +Sets the samplerate used for probing the ALSA devices and collecting the +profiles and ports. + +@PAR@ device-prop api.acp.pro-channels # integer +Sets the number of channels to use when probing the "Pro Audio" profile. +Normally, the maximum amount of channels will be used but with this setting +this can be reduced, which can make it possible to use other samplerates on +some devices. + +## Node properties + +@PAR@ node-prop audio.channels # integer +The number of audio channels to open the device with. Defaults depends on the profile of the device. + +@PAR@ node-prop audio.rate # integer +The audio rate to open the device with. Default is 0, which means to open the device with a rate as close to the graph rate as possible. + +@PAR@ node-prop audio.format # string +The audio format to open the device in. By default this is "UNKNOWN", which will open the device in the best possible bits (32/24/16/8..). You can force a format like S16_LE or S32_LE. + +@PAR@ node-prop audio.position # JSON array of strings +The audio position of the channels in the device. This is auto detected based on the profile. You can configure an array of channel positions, like " FL, FR ". + +@PAR@ node-prop audio.allowed-rates # JSON array of integers +\parblock +The allowed audio rates to open the device with. Default is " ", which means the device can be opened in any supported rate. + +Only rates from the array will be used to open the device. When the graph is running with a rate not listed in the allowed-rates, the resampler will be used to resample to the nearest allowed rate. +\endparblock + +@PAR@ node-prop api.alsa.period-size # integer +The period size to open the device in. By default this is 0, which will open the device in the default period size to minimize latency. + +@PAR@ node-prop api.alsa.period-num # integer +The amount of periods to use in the device. By default this is 0, which means to use as many as possible. + +@PAR@ node-prop api.alsa.headroom # integer +The amount of extra space to keep in the ringbuffer. The default is 0. Higher values can be configured when the device read and write pointers are not accurately reported. + +@PAR@ node-prop api.alsa.start-delay = 0 # integer +Some devices need some time before they can report accurate hardware pointer +positions. In those cases, an extra start delay can be added to compensate +for this startup delay. This sets the startup delay in samples. + +@PAR@ node-prop api.alsa.disable-mmap = false # boolean +Disable mmap operation of the device and use the ALSA read/write API instead. Default is false, mmap is preferred. + +@PAR@ node-prop api.alsa.disable-batch # boolean +Ignore the ALSA batch flag. If the batch flag is set, ALSA will need an extra period to update the read/write pointers. Ignore this flag from ALSA can reduce the latency. Default is false. + +@PAR@ node-prop api.alsa.use-chmap # boolean +Use the driver provided channel map. Default is true when using UCM, false otherwise because many driver don't report this correctly. + +@PAR@ node-prop api.alsa.multi-rate # boolean +Allow devices from the same card to be opened in multiple sample rates. Default is true. Some older drivers did not properly advertise the capabilities of the device and only really supported opening the device in one rate. + +@PAR@ node-prop api.alsa.htimestamp = false # boolean +Use ALSA htimestamps in scheduling, instead of the system clock. +Some ALSA drivers produce bad timestamps, so this is not enabled by default +and will be disabled at runtime if it looks like the ALSA timestamps are bad. + +@PAR@ node-prop api.alsa.htimestamp.max-errors # integer +Specify the number of consecutive errors before htimestamp is disabled. +Setting this to 0 makes htimestamp never get disabled. + +@PAR@ node-prop api.alsa.disable-tsched = false # boolean +Disable timer-based scheduling, and use IRQ for scheduling instead. +The "Pro Audio" profile will usually enable this setting, if it is expected it works on the hardware. + +@PAR@ node-prop api.alsa.auto-link = false # boolean +Link follower PCM devices to the driver PCM device when using IRQ-based scheduling. +The "Pro Audio" profile will usually enable this setting, if it is expected it works on the hardware. + +@PAR@ node-prop latency.internal.rate # integer +Static set the device systemic latency, in samples at playback rate. + +@PAR@ node-prop latency.internal.ns # integer +Static set the device systemic latency, in nanoseconds. + +@PAR@ node-prop api.alsa.path # string +UNDOCUMENTED + +@PAR@ node-prop api.alsa.open.ucm # boolean +Open device using UCM. + +@PAR@ node-prop api.alsa.bind-ctls # boolean +UNDOCUMENTED + +@PAR@ node-prop iec958.codecs # JSON array of string +Enable only specific IEC958 codecs. This can be used to disable some codecs the hardware supports. +Available values: PCM, AC3, DTS, MPEG, MPEG2-AAC, EAC3, TRUEHD, DTSHD + +# BLUETOOTH PROPERTIES @IDX@ props + +## Monitor properties + +The following are settings for the Bluetooth device monitor, not device or +node properties: + +@PAR@ monitor-prop bluez5.roles = a2dp_sink a2dp_source bap_sink bap_source bap_bcast_sink bap_bcast_source hfp_hf hfp_ag # JSON array of string +\parblock +Enabled roles. + +Currently some headsets (Sony WH-1000XM3) are not working with +both hsp_ag and hfp_ag enabled, so by default we enable only HFP. + +Supported roles: +- `hsp_hs` (HSP Headset), +- `hsp_ag` (HSP Audio Gateway), +- `hfp_hf` (HFP Hands-Free), +- `hfp_ag` (HFP Audio Gateway) +- `a2dp_sink` (A2DP Audio Sink) +- `a2dp_source` (A2DP Audio Source) +- `bap_sink` (LE Audio Basic Audio Profile Sink) +- `bap_source` (LE Audio Basic Audio Profile Source) +- `bap_bcast_sink` (LE Audio Basic Audio Profile Broadcast Sink) +- `bap_bcast_source` (LE Audio Basic Audio Profile Broadcast Source) +\endparblock + +@PAR@ monitor-prop bluez5.codecs # JSON array of string +Enabled A2DP codecs (default: all). Possible values: `sbc`, `sbc_xq`, +`aac`, `aac_eld`, `aptx`, `aptx_hd`, `aptx_ll`, `aptx_ll_duplex`, +`faststream`, `faststream_duplex`, `lc3plus_h3`, `ldac`, `opus_05`, +`opus_05_51`, `opus_05_71`, `opus_05_duplex`, `opus_05_pro`, `opus_g`, +`lc3`. + +@PAR@ monitor-prop bluez5.default.rate # integer +Default audio rate. + +@PAR@ monitor-prop bluez5.default.channels # integer +Default audio channels. + +@PAR@ monitor-prop bluez5.hfphsp-backend # integer +HFP/HSP backend (default: native). Available values: any, none, hsphfpd, ofono, native + +@PAR@ monitor-prop bluez5.hfphsp-backend-native-modem # string + +@PAR@ monitor-prop bluez5.dummy-avrcp player # boolean +Register dummy AVRCP player. Some devices have wrongly functioning +volume or playback controls if this is not enabled. Default: false + +@PAR@ monitor-prop bluez5.enable-sbc-xq # boolean +Override device quirk list and enable SBC-XQ for devices for which it is disabled. + +@PAR@ monitor-prop bluez5.enable-msbc # boolean +Override device quirk list and enable MSBC for devices for which it is disabled. + +@PAR@ monitor-prop bluez5.enable-hw-volume # boolean +Override device quirk list and enable hardware volume fo devices for which it is disabled. + +@PAR@ monitor-prop bluez5.hw-offload-sco # boolean +\parblock +HFP/HSP hardware offload SCO support (default: false). + +This feature requires a custom configuration that routes SCO audio to ALSA nodes, +in a platform-specific way. See `tests/examples/bt-pinephone.lua` in WirePlumber for an example. +Do not enable this setting if you don't know what all this means, as it won't work. +\endparblock + +@PAR@ monitor-prop bluez5.a2dp.opus.pro.channels = 3 # integer +PipeWire Opus Pro audio profile channel count. + +@PAR@ monitor-prop bluez5.a2dp.opus.pro.coupled-streams = 1 # integer +PipeWire Opus Pro audio profile coupled stream count. + +@PAR@ monitor-prop bluez5.a2dp.opus.pro.locations = "FL,FR,LFE" # string +PipeWire Opus Pro audio profile audio channel locations. + +@PAR@ monitor-prop bluez5.a2dp.opus.pro.max-bitrate = 600000 # integer +PipeWire Opus Pro audio profile max bitrate. + +@PAR@ monitor-prop bluez5.a2dp.opus.pro.frame-dms = 50 # integer +PipeWire Opus Pro audio profile frame duration (1/10 ms). + +@PAR@ monitor-prop bluez5.a2dp.opus.pro.bidi.channels = 1 # integer +PipeWire Opus Pro audio profile duplex channels. + +@PAR@ monitor-prop bluez5.a2dp.opus.pro.bidi.coupled-streams = 0 # integer +PipeWire Opus Pro audio profile duplex coupled stream count. + +@PAR@ monitor-prop bluez5.a2dp.opus.pro.bidi.locations = "FC" # string +PipeWire Opus Pro audio profile duplex coupled channel locations. + +@PAR@ monitor-prop bluez5.a2dp.opus.pro.bidi.max-bitrate = 160000 # integer +PipeWire Opus Pro audio profile duplex max bitrate. + +@PAR@ monitor-prop bluez5.a2dp.opus.pro.bidi.frame-dms = 400 # integer +PipeWire Opus Pro audio profile duplex frame duration (1/10 ms). + +@PAR@ monitor-prop bluez5.bcast_source.config = # JSON +\parblock +Example: +``` +bluez5.bcast_source.config = + { + "broadcast_code": "Børne House", + "encryption: false, + "bis": + { # BIS configuration + "qos_preset": "16_2_1", # QOS preset name from table Table 6.4 from BAP_v1.0.1. + "audio_channel_allocation": 1, # audio channel allocation configuration for the BIS + "metadata": # metadata configurations for the BIS + { "type": 1, "value": 1, 1 } + + } + + } + +``` +\endparblock + +## Device properties + +@PAR@ device-prop bluez5.auto-connect # boolean +Auto-connect devices on start up. Disabled by default if +the property is not specified. + +@PAR@ device-prop bluez5.hw-volume = hfp_ag hsp_ag a2dp_source # JSON array of string +Profiles for which to enable hardware volume control. + +@PAR@ device-prop bluez5.profile # string +Initial device profile. This usually has no effect as the session manager +overrides it. + +@PAR@ device-prop bluez5.a2dp.ldac.quality = "auto" # string +LDAC encoding quality +Available values: +- auto (Adaptive Bitrate, default) +- hq (High Quality, 990/909kbps) +- sq (Standard Quality, 660/606kbps) +- mq (Mobile use Quality, 330/303kbps) + +@PAR@ device-prop bluez5.a2dp.aac.bitratemode = 0 # integer +AAC variable bitrate mode. +Available values: 0 (cbr, default), 1-5 (quality level) + +@PAR@ device-prop bluez5.a2dp.opus.pro.application = "audio" # string +PipeWire Opus Pro Audio encoding mode: audio, voip, lowdelay + +@PAR@ device-prop bluez5.a2dp.opus.pro.bidi.application = "audio" # string +PipeWire Opus Pro Audio duplex encoding mode: audio, voip, lowdelay + +@PAR@ device-prop bluez5.bap.cig = "auto" # integer, or 'auto' +Set CIG ID for BAP unicast streams of the device. + +## Node properties + +@PAR@ node-prop bluez5.media-source-role # string +\parblock +Media source role for Bluetooth clients connecting to +this instance. Available values: + - playback: playing stream to speakers + - input: appear as source node. +\endparblock + +# PORT PROPERTIES @IDX@ props + +Port properties are usually not directly configurable via PipeWire +configuration files, as they are determined by applications creating +them. Below are some port properties may interesting for users: + +@PAR@ port-prop port.name # string +\parblock +\copydoc PW_KEY_PORT_NAME +\endparblock + +@PAR@ port-prop port.alias # string +\parblock +\copydoc PW_KEY_PORT_ALIAS +\endparblock + +\see pw_keys in the API documentation for a full list. + +# LINK PROPERTIES @IDX@ props + +Link properties are usually not directly configurable via PipeWire +configuration files, as they are determined by applications creating +them. + +\see pw_keys in the API documentation for a full list. + +# CLIENT PROPERTIES @IDX@ props + +Client properties are usually not directly configurable via PipeWire +configuration files, as they are determined by the application +connecting to PipeWire. Clients are however affected by the settings +in \ref page_man_pipewire_conf_5 "pipewire.conf(5)" and session +manager settings. + +\note Only the properties `pipewire.*` are safe to use for security +purposes such as identifying applications and their capabilities, as +clients can set and change other properties freely. + +Below are some client properties may interesting for users. + +@PAR@ client-prop application.name # string +\parblock +\copydoc PW_KEY_APP_NAME +\endparblock + +@PAR@ client-prop application.process.id # integer +\parblock +\copydoc PW_KEY_APP_PROCESS_ID +\endparblock + +@PAR@ client-prop pipewire.sec.pid # integer +\parblock +Client pid, set by protocol. + +Note that for PulseAudio applications, this is the PID of the +`pipewire-pulse` process. +\endparblock + +\see pw_keys in the API documentation for a full list. + +# RUNTIME SETTINGS @IDX@ props + +Objects such as devices and nodes also have *parameters* that can be +modified after the object has been created. For example, the active +device profile, channel volumes, and so on. + +For some objects, the *parameters* also allow changing some of +the *properties*. The settings of most ALSA and virtual device parameters +can be configured also at runtime. + +These settings are available in device *parameter* called `Props` in its +`params` field. They can be seen e.g. using `pw-dump <id>` for an ALSA device: + +```json +{ +... + "Props": + { + ... + "params": + "audio.channels", + 2, + "audio.rate", + 0, + "audio.format", + "UNKNOWN", + "audio.position", + " FL, FR ", + "audio.allowed-rates", + " ", + "api.alsa.period-size", + 0, + "api.alsa.period-num", + 0, + "api.alsa.headroom", + 0, + "api.alsa.start-delay", + 0, + "api.alsa.disable-mmap", + false, + "api.alsa.disable-batch", + false, + "api.alsa.use-chmap", + false, + "api.alsa.multi-rate", + true, + "latency.internal.rate", + 0, + "latency.internal.ns", + 0, + "clock.name", + "api.alsa.c-1" + + } +... +``` + +They generally have the same names and meaning as the corresponding properties. + +One or more `params` can be changed using \ref page_man_pw-cli_1 "pw-cli(1)": +``` +pw-cli s <id> Props '{ params = "api.alsa.headroom" 1024 }' +``` +These settings are not saved and need to be reapplied for each session manager restart. + +# ALSA CARD PROFILES @IDX@ props + +The sound card profiles ("Analog stereo", "Analog stereo duplex", ...) except "Pro Audio" come from two sources: + +- UCM: ALSA Use Case Manager: the profile configuration system from ALSA. See https://github.com/alsa-project/alsa-ucm-conf/ +- ACP ("Alsa Card Profiles"): Pulseaudio's profile system ported to PipeWire. See https://www.freedesktop.org/wiki/Software/PulseAudio/Backends/ALSA/Profiles/ + +See the above links on how to configure these systems. + +For ACP, PipeWire looks for the profile configuration files under + +- ~/.config/alsa-card-profile +- /etc/alsa-card-profile +- /usr/share/alsa-card-profile/mixer`. + +The `path` and `profile-set` files are in subdirectories `paths` and `profile-sets` of these directories. +It is possible to override individual files locally by putting a modified copy into the ACP directories under `~/.config` or `/etc`. + +# OTHER OBJECT TYPES @IDX@ props + +Technically, PipeWire objects is what are manipulated by applications +using the PipeWire API. + +The list of object types that are usually "exported" (i.e. appear in +\ref page_man_pw-dump_1 "pw-dump(1)" output) is larger than considered +above: + +- Node +- Device +- Port +- Link +- Client +- Metadata +- Module +- Profiler +- SecurityContext + +Monitors do not appear in this list; they are not usually exported, +and technically also Device objects. They are considered above as a +separate object type because they have configurable properties. + +Metadata objects are what is manipulated with +\ref page_man_pw-metadata_1 "pw-metadata(1)" + +Modules can be loaded in configuration files, or by PipeWire +applications. + +The Profiler and SecurityContext objects only provide corresponding +PipeWire APIs. + +# INDEX {#pipewire-props__index} + +## Monitor properties + +@SECREF@ monitor-prop + +## Device properties + +@SECREF@ device-prop + +## Node properties + +@SECREF@ node-prop + +## Port properties + +@SECREF@ port-prop + +## Client properties + +@SECREF@ client-prop + +# AUTHORS + +The PipeWire Developers <$(PACKAGE_BUGREPORT)>; +PipeWire is available from <$(PACKAGE_URL)> + +# SEE ALSO + +\ref page_man_pipewire_conf_5 "pipewire.conf(5)"
View file
_service:download_url:pipewire-1.2.5.tar.bz2/doc/dox/config/pipewire-pulse.conf.5.md -> _service:download_url:pipewire-1.2.6.tar.bz2/doc/dox/config/pipewire-pulse.conf.5.md
Changed
@@ -74,6 +74,8 @@ ## Example ```css +# ~/.config/pipewire/pipewire-pulse.conf.d/custom.conf + stream.properties = { #node.latency = 1024/48000 #node.autoconnect = true @@ -124,6 +126,8 @@ ## Example ```css +# ~/.config/pipewire/pipewire-pulse.conf.d/custom.conf + pulse.rules = { # skype does not want to use devices that don't have an S16 sample format. @@ -154,7 +158,8 @@ `pipewire-pulse.conf`. ```css -... +# ~/.config/pipewire/pipewire-pulse.conf.d/custom.conf + pulse.cmd = { cmd = "load-module" args = "module-always-sink" flags = } { cmd = "load-module" args = "module-switch-on-connect" }
View file
_service:download_url:pipewire-1.2.5.tar.bz2/doc/dox/config/pipewire.conf.5.md -> _service:download_url:pipewire-1.2.6.tar.bz2/doc/dox/config/pipewire.conf.5.md
Changed
@@ -53,7 +53,9 @@ A configuration file `~/.config/pipewire/pipewire.conf.d/custom.conf` to change the value of the `default.clock.min-quantum` setting in `pipewire.conf`: -```css +``` +# ~/.config/pipewire/pipewire.conf.d/custom.conf + context.properties = { default.clock.min-quantum = 128 } @@ -172,7 +174,9 @@ @PAR@ pipewire.conf context.data-loops = ... This controls the data loops that will be created for the context. Is is an array of data loop specifications, one entry for each data loop to start: -```json +``` +# ~/.config/pipewire/pipewire.conf.d/custom.conf + context.data-loops = { #library.name.system = support/libspa-support @@ -310,7 +314,9 @@ ## Example -```json +``` +# ~/.config/pipewire/pipewire.conf.d/custom.conf + context.spa-libs = { audio.convert.* = audioconvert/libspa-audioconvert avb.* = avb/libspa-avb @@ -330,7 +336,9 @@ PipeWire modules to be loaded. See \ref page_man_libpipewire-modules_7 "libpipewire-modules(7)". -```json +``` +# ~/.config/pipewire/pipewire.conf.d/custom.conf + context.modules = #{ name = MODULENAME # ( args = { KEY = VALUE ... } ) @@ -361,7 +369,9 @@ The `context.objects` section allows you to make some objects from factories (usually created by loading modules in `context.modules`). -```json +``` +# ~/.config/pipewire/pipewire.conf.d/custom.conf + context.objects = #{ factory = <factory-name> # ( args = { <key> = <value> ... } ) @@ -391,7 +401,9 @@ This fragment creates a new dummy driver node, but only if `core.daemon` property is true: -```json +``` +# ~/.config/pipewire/pipewire.conf.d/custom.conf + context.objects = { factory = spa-node-factory args = { @@ -410,7 +422,9 @@ The `context.exec` section can be used to start arbitrary commands as part of the initialization of the PipeWire program. -```json +``` +# ~/.config/pipewire/pipewire.conf.d/custom.conf + context.exec = #{ path = <program-name> # ( args = "<arguments>" | <arg1> <arg2> ... ) @@ -434,7 +448,9 @@ The following fragment executes a pactl command with the given arguments: -```json +``` +# ~/.config/pipewire/pipewire.conf.d/custom.conf + context.exec = { path = "pactl" args = "load-module module-always-sink" } @@ -447,7 +463,7 @@ stream) is created/updated that matches certain properties. The general rules object follows the following pattern: -```json +```css <rules> = { matches = @@ -494,7 +510,7 @@ In the matches array, it is also possible to use regular expressions to match property values. For example, to match all nodes with a name that starts with my_, you can use the following condition: -``` +```css matches = { node.name = "~my_.*" @@ -508,7 +524,7 @@ In addition to regular expressions, you may also use the ! character to negate a condition. For example, to match all nodes with a name that does not start with my_, you can use the following condition: -``` +```css matches = { node.name = "!~my_.*" @@ -519,7 +535,7 @@ The ! character can be used with or without a regular expression. For example, to match all nodes with a name that is not equal to my_node, you can use the following condition: -``` +```css matches = { node.name = "!my_node" @@ -530,7 +546,7 @@ The null value has a special meaning; it checks if the property is not available (or unset). To check if a property is not set: -``` +```css matches = { node.name = null @@ -540,7 +556,7 @@ To check the existence of a property, one can use the !null condition, for example: -``` +```css matches = { node.name = "!null" @@ -553,7 +569,7 @@ To handle the "null" string, one needs to escape the string. For example, to check if a property has the string value "null", use: -``` +```css matches = { node.name = "null" @@ -562,7 +578,7 @@ ``` To handle anything but the "null" string, use: -``` +```css matches = { node.name = "!\"null\"" @@ -583,7 +599,9 @@ The `cpu.vm.name` is automatically set when running in a VM with the name of the VM. A match rule can be written to set custom properties like this: -``` +```css +# ~/.config/pipewire/pipewire.conf.d/custom.conf + context.properties.rules = { matches = { cpu.vm.name = !null } actions = { @@ -607,7 +625,9 @@ Add a `node.rules` section in the config file like this: -``` +```css +# ~/.config/pipewire/pipewire.conf.d/custom.conf + node.rules = { matches = @@ -638,7 +658,9 @@ Add a `device.rules` section in the config file like this: -``` +```css +# ~/.config/pipewire/pipewire.conf.d/custom.conf + device.rules = { matches =
View file
_service:download_url:pipewire-1.2.6.tar.bz2/doc/dox/config/xref.md
Added
@@ -0,0 +1,51 @@ +\page page_config_xref Index + +\ref page_man_pipewire_conf_5 "pipewire.conf" + +@SECREF@ pipewire.conf + +\ref page_man_pipewire-pulse_conf_5 "pipewire-pulse.conf" + +@SECREF@ pipewire-pulse.conf + +\ref page_man_pipewire-client_conf_5 "client.conf, client-rt.conf" + +@SECREF@ client.conf + +\ref page_man_pipewire-jack_conf_5 "jack.conf" + +@SECREF@ jack.conf + +**Runtime settings** + +@SECREF@ pipewire-settings + +**Environment variables** + +@SECREF@ pipewire-env client-env jack-env pulse-env + +**Object properties** + +@SECREF@ props + +**Monitor properties** + +@SECREF@ monitor-prop + +**Device properties** + +@SECREF@ device-prop + +**Node properties** + +@SECREF@ node-prop + +**Port properties** + +@SECREF@ port-prop + +**Client properties** + +@SECREF@ client-prop + +\see pw_keys in API documentation.
View file
_service:download_url:pipewire-1.2.5.tar.bz2/doc/dox/internals/dma-buf.dox -> _service:download_url:pipewire-1.2.6.tar.bz2/doc/dox/internals/dma-buf.dox
Changed
@@ -89,6 +89,8 @@ \ref SPA_CHOICE_Enum. In this case announce the \ref SPA_PARAM_Buffers accordingly to the selected format and modifier. It is important to query the plane count of the used format modifier pair and set `SPA_PARAM_BUFFERS_blocks` accordingly. + You might also want to add the option of adding explicit sync support to the + buffers, as explained below. Note: When test allocating a buffer, collect all possible modifiers, while omitting `DRM_FORMAT_MOD_INVALID` from the \ref SPA_FORMAT_VIDEO_modifier property and @@ -110,7 +112,9 @@ \ref SPA_DATA_MemPtr use the fallback SHM import mechanism. If it's \ref SPA_DATA_DmaBuf get the DMA-BUF FDs (the plane count is encoded in the `n_datas` variable of the -`spa_buffer` struct) and import them with the graphics API. +`spa_buffer` struct) and import them with the graphics API. Note: that the n_datas +might also contain extra fds for things like sync_timelime metadata, you need +to take this into account when persing the planes. Note: Some graphics APIs have separated functions for the modifier-less case (`DRM_FORMAT_MOD_INVALID`) or are omitting the modifier, since it might be used @@ -175,4 +179,127 @@ Note: For now v4l2 uses planar buffers without modifiers. This is the reason for this special case. +# Explicit sync + +In addition to DMABUF, a set of synchronization primitives (a SyncObjTimeline) and +associated metadata can be negotiated on the buffers. + +The explicit sync step is performed *after* the Format has been negotiated. + +## Query support for explicit sync in the driver. + +You might first want to check that the drm render you are using is capable of explicit +sync by checking support for DRM_CAP_SYNCOBJ and DRM_CAP_SYNCOBJ_TIMELINE before +attempting to negotiate explicit sync. + +## Provide space in the buffer for explicit sync + +Explicit sync requires two extra fds in the buffers and an extra +\ref SPA_META_SyncTimeline metadata structure. + +The metadata structure will only be allocated when both sides support explicit +sync. We can use this to make a fallback \ref SPA_PARAM_Buffers so that we can +support both explicit sync and a fallback to implicit sync. + +So, first announce support for \ref SPA_META_SyncTimeline by adding the +\ref SPA_TYPE_OBJECT_ParamMeta object to the stream: + +``` + paramsn_params++ = spa_pod_builder_add_object(&b, + SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta, + SPA_PARAM_META_type, SPA_POD_Id(SPA_META_SyncTimeline), + SPA_PARAM_META_size, SPA_POD_Int(sizeof(struct spa_meta_sync_timeline))); +``` + +Next make a \ref SPA_PARAM_Buffers that depends on the negotiation of the SyncTimelime metadata: + +``` + spa_pod_builder_push_object(&b, &f, SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers); + spa_pod_builder_add(&b, + SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int(8, 2, MAX_BUFFERS), + SPA_PARAM_BUFFERS_blocks, SPA_POD_Int(3), + SPA_PARAM_BUFFERS_size, SPA_POD_Int(size), + SPA_PARAM_BUFFERS_stride, SPA_POD_Int(data->stride), + SPA_PARAM_BUFFERS_dataType, SPA_POD_CHOICE_FLAGS_Int((1<<SPA_DATA_DmaBuf)), + 0); + spa_pod_builder_prop(&b, SPA_PARAM_BUFFERS_metaType, SPA_POD_PROP_FLAG_MANDATORY); + spa_pod_builder_int(&b, 1<<SPA_META_SyncTimeline); + paramsn_params++ = spa_pod_builder_pop(&b, &f); +``` + +Note the mandatory \ref SPA_PARAM_BUFFERS_metaType with the \ref SPA_META_SyncTimeline +bit set. This forces this buffer layout to be used when SyncTimeline metadata was +negotiated. Also note the \ref SPA_PARAM_BUFFERS_blocks that is now set to the number +of DMABUF planes + 2. In this case we have 1 plane/fd for the DMABUF and 2 fds for the +SyncObjTimelines. + +You can also add a fallback \ref SPA_PARAM_Buffers when the \ref SPA_META_SyncTimeline +was not negotiated: + +``` + paramsn_params++ = spa_pod_builder_add_object(&b, + SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers, + SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int(8, 2, MAX_BUFFERS), + SPA_PARAM_BUFFERS_blocks, SPA_POD_Int(1), + SPA_PARAM_BUFFERS_size, SPA_POD_Int(size), + SPA_PARAM_BUFFERS_stride, SPA_POD_Int(data->stride), + SPA_PARAM_BUFFERS_dataType, SPA_POD_CHOICE_FLAGS_Int((1<<SPA_DATA_DmaBuf))); +``` + +This one has just 1 data block with the DMABUF fd and plane info. + +## Check if SPA_META_SyncTimeline was negotiated + +After sending the \ref SPA_PARAM_Buffers, the buffer will be allocated by the PipeWire +server. + +In the pw-stream::add_buffer event, check if the \ref SPA_META_SyncTimeline is available +on the buffer: + +``` + struct spa_meta_sync_timeline *stl; + stl = spa_buffer_find_meta_data(buf, SPA_META_SyncTimeline, sizeof(*stl)); +``` + +When the metadata is available, the SyncObj fds are in the last 2 data planes +of the buffer, the acquire and release syncobj respectively. You can keep a ref to the +\ref struct spa_meta_sync_timeline because we will need this later when processing +the buffers. + +If the producer is allocating buffers, when the stream has the \ref PW_STREAM_FLAG_ALLOC_BUFFERS +flag, it should allocate the DMABUF and syncobj now and place them in the buffer data. +First the plane fds and then the 2 syncobj fds. + +The consumer can directly use the fds. The SyncObj fds can be converted to a handle, +for example, to make things easier later: + +``` + uint32_t acquire_handle, release_handle; + drmSyncobjFDToHandle(drm_fd, buf->datasbuf->n_datas - 2.fd, &acquire_handle); + drmSyncobjFDToHandle(drm_fd, buf->datasbuf->n_datas - 1.fd, &release_handle); +``` + +## Use the SPA_META_SyncTimeline when processing buffers + +The \ref struct spa_meta_sync_timeline contains 2 fields: the acquire_point and +release_point. + +Producers will start a render operation on the DMABUF of the buffer and place +the acquire_point in the \ref struct spa_meta_sync_timeline. When the rendering is +complete, the producer should signal the acquire_point on the acquire SyncObjTimeline. + +Producers will also add a release_point on the release SyncObjTimeline. They are +only allowed to reuse the buffer when the release_point has been signaled. + +Consumers use the acquire_point to wait for rendering to complete before processing +the buffer. This can be offloaded to the hardware when submitting the rendering +operation or it can be done explicitly with drmSyncobjTimelineWait() on the acquire +SyncObjTimeline handle and the acquire_point of the metadata. + +Consumers should then also signal the release_point on the release SyncObjTimeline when +they complete processing the buffer. This can be done in the hardware as part of +the render pipeline or explicitly with drmSyncobjTimelineSignal() on the release +handle and the release_point of the metadata. + + */
View file
_service:download_url:pipewire-1.2.5.tar.bz2/doc/dox/pulse-modules.inc -> _service:download_url:pipewire-1.2.6.tar.bz2/doc/dox/pulse-modules.inc
Changed
@@ -10,6 +10,8 @@ in `~/.config/pipewire/pipewire-pulse.conf.d/` containing the module name and its arguments ``` +# ~/.config/pipewire/pipewire-pulse.conf.d/custom.conf + pulse.cmd = { cmd = "load-module" args = "module-null-sink sink_name=foo" flags = }
View file
_service:download_url:pipewire-1.2.5.tar.bz2/doc/meson.build -> _service:download_url:pipewire-1.2.6.tar.bz2/doc/meson.build
Changed
@@ -54,6 +54,7 @@ 'dox/pulse-modules.dox', 'dox/programs/index.md', 'dox/config/index.md', + 'dox/config/xref.md', 'dox/internals/index.dox', 'dox/internals/design.dox', 'dox/internals/access.dox', @@ -88,7 +89,7 @@ 'dox/config/pipewire.conf.5.md', 'dox/config/pipewire-client.conf.5.md', 'dox/config/pipewire-jack.conf.5.md', - 'dox/config/pipewire-devices.7.md', + 'dox/config/pipewire-props.7.md', 'dox/config/pipewire-filter-chain.conf.5.md', 'dox/config/pipewire-pulse-modules.7.md', 'dox/config/libpipewire-modules.7.md',
View file
_service:download_url:pipewire-1.2.5.tar.bz2/meson.build -> _service:download_url:pipewire-1.2.6.tar.bz2/meson.build
Changed
@@ -1,5 +1,5 @@ project('pipewire', 'c' , - version : '1.2.5', + version : '1.2.6', license : 'MIT', 'LGPL-2.1-or-later', 'GPL-2.0-only' , meson_version : '>= 0.61.1', default_options : 'warning_level=3',
View file
_service:download_url:pipewire-1.2.5.tar.bz2/pipewire-jack/src/pipewire-jack.c -> _service:download_url:pipewire-1.2.6.tar.bz2/pipewire-jack/src/pipewire-jack.c
Changed
@@ -600,7 +600,9 @@ port->global_mix->io1 = &port->io1; } } else { - if (--port->n_mix == 0 && port->global_mix != NULL) { + info->mix->io0 = NULL; + info->mix->io1 = NULL; + if (port->n_mix > 0 && --port->n_mix == 0 && port->global_mix != NULL) { port->global_mix->io0 = NULL; port->global_mix->io1 = NULL; } @@ -2130,7 +2132,7 @@ const struct spa_pod *param) { struct client *c = (struct client *) data; - pw_proxy_error((struct pw_proxy*)c->node, -ENOTSUP, "not supported"); + pw_proxy_error((struct pw_proxy*)c->node, -ENOTSUP, "set_param: not supported"); return -ENOTSUP; } @@ -2951,7 +2953,7 @@ done: if (res < 0) - pw_proxy_error((struct pw_proxy*)c->node, res, spa_strerror(res)); + pw_proxy_errorf((struct pw_proxy*)c->node, res, "port_use_buffers: %s", spa_strerror(res)); return res; } @@ -3016,7 +3018,7 @@ pw_memmap_free(old); exit: if (res < 0) - pw_proxy_error((struct pw_proxy*)c->node, res, spa_strerror(res)); + pw_proxy_errorf((struct pw_proxy*)c->node, res, "port_set_io: %s", spa_strerror(res)); return res; } @@ -3149,7 +3151,7 @@ exit: if (res < 0) - pw_proxy_error((struct pw_proxy*)c->node, res, spa_strerror(res)); + pw_proxy_errorf((struct pw_proxy*)c->node, res, "set_activation: %s", spa_strerror(res)); return res; } @@ -3190,7 +3192,7 @@ } exit: if (res < 0) - pw_proxy_error((struct pw_proxy*)c->node, res, spa_strerror(res)); + pw_proxy_errorf((struct pw_proxy*)c->node, res, "set_mix_info: %s", spa_strerror(res)); return res; } @@ -5649,7 +5651,7 @@ ptr = p->get_buffer(p, frames); } done: - pw_log_warn("%p: port:%p buffer:%p frames:%d", c, p, ptr, frames); + pw_log_trace_fp("%p: port:%p buffer:%p frames:%d", c, p, ptr, frames); return ptr; }
View file
_service:download_url:pipewire-1.2.5.tar.bz2/spa/include/spa/buffer/meta.h -> _service:download_url:pipewire-1.2.6.tar.bz2/spa/include/spa/buffer/meta.h
Changed
@@ -167,6 +167,10 @@ * * Metadata to describe the time on the timeline when the buffer * can be acquired and when it can be reused. + * + * This metadata will usually also require negotiation of 2 extra + * buffer datas of type SPA_DATA_SyncObj with 2 fds for the acquire + * and release timelines respectively. */ struct spa_meta_sync_timeline { uint32_t flags;
View file
_service:download_url:pipewire-1.2.5.tar.bz2/spa/include/spa/pod/event.h -> _service:download_url:pipewire-1.2.6.tar.bz2/spa/include/spa/pod/event.h
Changed
@@ -30,7 +30,7 @@ (ev)->body.body.id : SPA_ID_INVALID) #define SPA_EVENT_INIT_FULL(t,size,type,id,...) ((t) \ - { { (size), SPA_TYPE_OBJECT }, \ + { { (size), SPA_TYPE_Object }, \ { { (type), (id) }, ##__VA_ARGS__ } }) \ #define SPA_EVENT_INIT(type,id) \
View file
_service:download_url:pipewire-1.2.5.tar.bz2/spa/plugins/alsa/acp/acp.c -> _service:download_url:pipewire-1.2.6.tar.bz2/spa/plugins/alsa/acp/acp.c
Changed
@@ -956,7 +956,7 @@ { pa_card *impl = snd_mixer_elem_get_callback_private(melem); snd_hctl_elem_t **_elem = snd_mixer_elem_get_private(melem), *elem; - int device; + int device, i; const char *old_monitor_name; pa_device_port *p; pa_hdmi_eld eld; @@ -978,6 +978,15 @@ if (pa_alsa_get_hdmi_eld(elem, &eld) < 0) memset(&eld, 0, sizeof(eld)); + // Strip trailing whitespace from monitor_name (primarily an NVidia driver bug for now) + for (i = strlen(eld.monitor_name) - 1; i >= 0; i--) { + if (eld.monitor_namei == '\n' || eld.monitor_namei == '\r' || eld.monitor_namei == '\t' || + eld.monitor_namei == ' ') + eld.monitor_namei = 0; + else + break; + } + old_monitor_name = pa_proplist_gets(p->proplist, PA_PROP_DEVICE_PRODUCT_NAME); if (eld.monitor_name0 == '\0') { changed |= old_monitor_name != NULL;
View file
_service:download_url:pipewire-1.2.5.tar.bz2/spa/plugins/alsa/acp/alsa-util.c -> _service:download_url:pipewire-1.2.6.tar.bz2/spa/plugins/alsa/acp/alsa-util.c
Changed
@@ -1020,6 +1020,9 @@ pa_assert(p); pa_assert(pcm_info); + if ((card = snd_pcm_info_get_card(pcm_info)) >= 0) + pa_alsa_init_proplist_card(c, p, card); + pa_proplist_sets(p, PA_PROP_DEVICE_API, "alsa"); if ((class = snd_pcm_info_get_class(pcm_info)) <= SND_PCM_CLASS_LAST) { @@ -1048,9 +1051,6 @@ pa_proplist_setf(p, "alsa.device", "%u", snd_pcm_info_get_device(pcm_info)); - if ((card = snd_pcm_info_get_card(pcm_info)) >= 0) - pa_alsa_init_proplist_card(c, p, card); - sync_id = snd_pcm_info_get_sync(pcm_info); pa_proplist_setf(p, "alsa.sync.id", "%08x:%08x:%08x:%08x", sync_id.id320, sync_id.id321, sync_id.id322, sync_id.id323);
View file
_service:download_url:pipewire-1.2.5.tar.bz2/spa/plugins/alsa/alsa-pcm.c -> _service:download_url:pipewire-1.2.6.tar.bz2/spa/plugins/alsa/alsa-pcm.c
Changed
@@ -967,10 +967,28 @@ int spa_alsa_clear(struct state *state) { int err; + struct state *follower; spa_list_remove(&state->link); release_card(state->card); + if (state->driver != NULL) { + spa_list_remove(&state->driver_link); + state->driver = NULL; + } + if (state->rt.driver != NULL) { + spa_list_remove(&state->rt.driver_link); + state->rt.driver = NULL; + } + spa_list_consume(follower, &state->followers, driver_link) { + spa_list_remove(&follower->driver_link); + follower->driver = NULL; + } + spa_list_consume(follower, &state->rt.followers, rt.driver_link) { + spa_list_remove(&follower->rt.driver_link); + follower->rt.driver = NULL; + } + state->card = NULL; state->card_index = SPA_ID_INVALID;
View file
_service:download_url:pipewire-1.2.5.tar.bz2/spa/plugins/audioconvert/audioadapter.c -> _service:download_url:pipewire-1.2.6.tar.bz2/spa/plugins/audioconvert/audioadapter.c
Changed
@@ -33,6 +33,7 @@ #define DEFAULT_ALIGN 16 #define MAX_PORTS (SPA_AUDIO_MAX_CHANNELS+1) +#define MAX_RETRY 64 /** \cond */ @@ -1393,7 +1394,7 @@ this->driver = true; if (this->direction == SPA_DIRECTION_OUTPUT) { - int retry = 8; + int retry = MAX_RETRY; while (retry--) { status = spa_node_process_fast(this->convert); if (status & SPA_STATUS_HAVE_DATA) @@ -1621,7 +1622,7 @@ static int impl_node_process(void *object) { struct impl *this = object; - int status = 0, fstatus, retry = 8; + int status = 0, fstatus, retry = MAX_RETRY; if (!this->ready) { if (!this->warned)
View file
_service:download_url:pipewire-1.2.5.tar.bz2/spa/plugins/bluez5/bluez-hardware.conf -> _service:download_url:pipewire-1.2.6.tar.bz2/spa/plugins/bluez5/bluez-hardware.conf
Changed
@@ -51,6 +51,7 @@ { name = "WorkTunes Connect", no-features = hw-volume }, # 3M WorkTunes Connect { address = "~^44:5e:cd:", no-features = faststream, a2dp-duplex }, # #pipewire-1756 + { address = "~^2c:53:d7:", no-features = sbc-xq }, # Phonak hearing aids #pipewire-3939 { address = "~^94:16:25:", no-features = hw-volume }, # AirPods 2 { address = "~^9c:64:8b:", no-features = hw-volume }, # AirPods 2
View file
_service:download_url:pipewire-1.2.5.tar.bz2/spa/plugins/bluez5/bluez5-dbus.c -> _service:download_url:pipewire-1.2.6.tar.bz2/spa/plugins/bluez5/bluez5-dbus.c
Changed
@@ -5504,7 +5504,7 @@ spa_autofree char *local_endpoint = NULL; /* get local endpoint */ - for (i = 0; monitor->media_codecs; i++) { + for (i = 0; monitor->media_codecsi; i++) { if (!monitor->media_codecsi->bap) continue; if (!is_media_codec_enabled(monitor, monitor->media_codecsi))
View file
_service:download_url:pipewire-1.2.5.tar.bz2/spa/plugins/bluez5/midi-enum.c -> _service:download_url:pipewire-1.2.6.tar.bz2/spa/plugins/bluez5/midi-enum.c
Changed
@@ -808,6 +808,8 @@ goto fail; } + g_dbus_connection_set_exit_on_close(this->conn, FALSE); + this->manager = g_dbus_object_manager_server_new(MIDI_OBJECT_PATH); if (!this->manager){ spa_log_error(this->log, "Creating GDBus object manager failed");
View file
_service:download_url:pipewire-1.2.5.tar.bz2/spa/plugins/bluez5/midi-node.c -> _service:download_url:pipewire-1.2.6.tar.bz2/spa/plugins/bluez5/midi-node.c
Changed
@@ -1979,6 +1979,8 @@ goto fail; } + g_dbus_connection_set_exit_on_close(this->conn, FALSE); + this->node.iface = SPA_INTERFACE_INIT( SPA_TYPE_INTERFACE_Node, SPA_VERSION_NODE,
View file
_service:download_url:pipewire-1.2.5.tar.bz2/spa/plugins/videoconvert/videoadapter.c -> _service:download_url:pipewire-1.2.6.tar.bz2/spa/plugins/videoconvert/videoadapter.c
Changed
@@ -34,6 +34,7 @@ #define DEFAULT_ALIGN 16 #define MAX_PORTS (1+1) +#define MAX_RETRY 64 /** \cond */ @@ -1366,7 +1367,7 @@ this->driver = true; if (this->direction == SPA_DIRECTION_OUTPUT) { - int retry = 8; + int retry = MAX_RETRY; while (retry--) { status = spa_node_process(this->convert); if (status & SPA_STATUS_HAVE_DATA) @@ -1596,7 +1597,7 @@ static int impl_node_process(void *object) { struct impl *this = object; - int status = 0, fstatus, retry = 8; + int status = 0, fstatus, retry = MAX_RETRY; if (!this->ready) { if (!this->warned)
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-client-node/client-node.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-client-node/client-node.c
Changed
@@ -1505,7 +1505,7 @@ if (!pw_map_has_item(&impl->io_map, mix->id)) return -EINVAL; - if (impl->resource && impl->resource->version >= 4) + if (impl->resource && impl->resource->version >= 4 && !port->destroyed) pw_client_node_resource_port_set_mix_info(impl->resource, mix->port.direction, mix->p->port_id, mix->port.port_id, SPA_ID_INVALID, NULL);
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-combine-stream.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-combine-stream.c
Changed
@@ -82,6 +82,8 @@ * ## Example configuration * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-combine-stream-1.conf + * * context.modules = * { name = libpipewire-module-combine-stream * args = { @@ -122,6 +124,8 @@ * from 3 separate stereo sinks. * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-combine-stream-2.conf + * * context.modules = * { name = libpipewire-module-combine-stream * args = { @@ -170,6 +174,8 @@ * from 2 separate stereo sources. * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-combine-stream-3.conf + * * context.modules = * { name = libpipewire-module-combine-stream * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-echo-cancel.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-echo-cancel.c
Changed
@@ -117,6 +117,8 @@ * * ## Example configuration *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-echo-cancel.conf + * * context.modules = * { name = libpipewire-module-echo-cancel * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-example-filter.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-example-filter.c
Changed
@@ -65,6 +65,8 @@ * ## Example configuration of a virtual source * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-example-filter.conf + * * context.modules = * { name = libpipewire-module-example-filter * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-example-sink.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-example-sink.c
Changed
@@ -63,6 +63,8 @@ * ## Example configuration * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-example-sink.conf + * * context.modules = * { name = libpipewire-module-example-sink * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-example-source.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-example-source.c
Changed
@@ -63,6 +63,8 @@ * ## Example configuration * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-example-source.conf + * * context.modules = * { name = libpipewire-module-example-source * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-ffado-driver.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-ffado-driver.c
Changed
@@ -75,6 +75,8 @@ * ## Example configuration of a duplex sink/source * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-ffado-driver.conf + * * context.modules = * { name = libpipewire-module-ffado-driver * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-filter-chain.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-filter-chain.c
Changed
@@ -477,7 +477,12 @@ * This example uses the rnnoise LADSPA plugin to create a new * virtual source. * + * Run with `pipewire -c filter-chain.conf`. The configuration can also + * be put under `pipewire.conf.d/` to run it inside the PipeWire server. + * *\code{.unparsed} + * # ~/.config/pipewire/filter-chain.conf.d/my-filter-chain-1.conf + * * context.modules = * { name = libpipewire-module-filter-chain * args = { @@ -515,6 +520,8 @@ * to a stereo Dolby Surround signal. * *\code{.unparsed} + * # ~/.config/pipewire/filter-chain.conf.d/my-filter-chain-2.conf + * * context.modules = * { name = libpipewire-module-filter-chain * args = { @@ -1087,13 +1094,15 @@ struct node *node = port->node; struct descriptor *desc = node->desc; float old; + bool changed; old = port->control_dataid; port->control_dataid = value ? *value : desc->default_controlport->idx; pw_log_info("control %d %d ('%s') from %f to %f", port->idx, id, desc->desc->portsport->p.name, old, port->control_dataid); - node->control_changed = old != port->control_dataid; - return node->control_changed ? 1 : 0; + changed = old != port->control_dataid; + node->control_changed |= changed; + return changed ? 1 : 0; } static int set_control_value(struct node *node, const char *name, float *value) @@ -2332,7 +2341,7 @@ const struct fc_descriptor *d; uint32_t i, j, max_samples = impl->quantum_limit; int res; - float *sd = impl->silence_data, *dd = impl->discard_data; + float *sd, *dd; if (graph->instantiated) return 0; @@ -2345,8 +2354,13 @@ desc = node->desc; d = desc->desc; - if (d->flags & FC_DESCRIPTOR_SUPPORTS_NULL_DATA) + if (d->flags & FC_DESCRIPTOR_SUPPORTS_NULL_DATA) { sd = dd = NULL; + } + else { + sd = impl->silence_data; + dd = impl->discard_data; + } for (i = 0; i < node->n_hndl; i++) { pw_log_info("instantiate %s %d rate:%lu", d->name, i, impl->rate);
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-filter-chain/sofa_plugin.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-filter-chain/sofa_plugin.c
Changed
@@ -216,6 +216,8 @@ for (uint8_t i = 0; i < 3; i++) coordsi = impl->port3 + i0; + pw_log_info("making spatializer with %f %f %f", coords0, coords2, coords2); + mysofa_s2c(coords); mysofa_getfilter_float( impl->sofa, @@ -229,9 +231,8 @@ ); // TODO: make use of delay - if ((left_delay != 0.0f || right_delay != 0.0f) && (!isnan(left_delay) || !isnan(right_delay))) { + if ((left_delay != 0.0f || right_delay != 0.0f) && (!isnan(left_delay) || !isnan(right_delay))) pw_log_warn("delay dropped l: %f, r: %f", left_delay, right_delay); - } if (impl->l_conv2) convolver_free(impl->l_conv2); @@ -331,7 +332,6 @@ static void spatializer_control_changed(void * Instance) { - pw_log_info("control changed"); spatializer_reload(Instance); }
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-jack-tunnel.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-jack-tunnel.c
Changed
@@ -74,6 +74,8 @@ * ## Example configuration of a duplex sink/source * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-jack-tunnel.conf + * * context.modules = * { name = libpipewire-module-jack-tunnel * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-jackdbus-detect.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-jackdbus-detect.c
Changed
@@ -42,6 +42,8 @@ * * ## Example configuration *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-jack-dbus-detect.conf + * * context.modules = * { name = libpipewire-module-jackdbus-detect * args {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-loopback.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-loopback.c
Changed
@@ -82,6 +82,8 @@ * This Virtual sink routes stereo input to the rear channels of a 7.1 sink. * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-loopback-1.conf + * * context.modules = * { name = libpipewire-module-loopback * args = { @@ -111,6 +113,8 @@ * This is useful for splitting up multi-channel inputs from USB audio interfaces that are not yet fully supported by alsa. * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-loopback-2.conf + * * context.modules = * { name = libpipewire-module-loopback * args = { @@ -137,6 +141,8 @@ * using the PSD algorithm on the playback stream. * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-loopback-3.conf + * * context.modules = * { name = libpipewire-module-loopback * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-netjack2-driver.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-netjack2-driver.c
Changed
@@ -85,6 +85,8 @@ * ## Example configuration of a duplex sink/source * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-netjack2-driver.conf + * * context.modules = * { name = libpipewire-module-netjack2-driver * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-netjack2-manager.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-netjack2-manager.c
Changed
@@ -88,6 +88,8 @@ * ## Example configuration of a duplex sink/source * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-netjack2-manager.conf + * * context.modules = * { name = libpipewire-module-netjack2-manager * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-parametric-equalizer.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-parametric-equalizer.c
Changed
@@ -69,6 +69,8 @@ * * ## Example configuration *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-parametric-equalizer.conf + * * context.modules = * { name = libpipewire-module-parametric-equalizer * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-pipe-tunnel.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-pipe-tunnel.c
Changed
@@ -93,6 +93,8 @@ * ## Example configuration of a pipe playback stream * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-pipe-tunnel.conf + * * context.modules = * { name = libpipewire-module-pipe-tunnel * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-protocol-pulse.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-protocol-pulse.c
Changed
@@ -48,6 +48,8 @@ * A config section with server properties can be given. * *\code{.unparsed} + * # ~/.config/pipewire/pipewire-pulse.conf.d/custom.conf + * * pulse.properties = { * # the addresses this server listens on * server.address = @@ -297,6 +299,8 @@ * section with a `quirks` and an `update-props` action. * *\code{.unparsed} + * # ~/.config/pipewire/pipewire-pulse.conf.d/custom.conf + * * pulse.rules = * { * # skype does not want to use devices that don't have an S16 sample format. @@ -343,6 +347,8 @@ * ## Example configuration * *\code{.unparsed} + * # ~/.config/pipewire/pipewire-pulse.conf.d/custom.conf + * * context.modules = * { name = libpipewire-module-protocol-pulse * args = { }
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-protocol-simple.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-protocol-simple.c
Changed
@@ -83,6 +83,8 @@ * ## Example configuration * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-protocol-simple.conf + * * context.modules = * { name = libpipewire-module-protocol-simple * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-pulse-tunnel.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-pulse-tunnel.c
Changed
@@ -83,6 +83,8 @@ * ## Example configuration of a virtual sink * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-pulse-tunnel.conf + * * context.modules = * { name = libpipewire-module-pulse-tunnel * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-raop-discover.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-raop-discover.c
Changed
@@ -55,6 +55,8 @@ * ## Example configuration * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-raop-discover.conf + * * context.modules = * { name = libpipewire-module-raop-discover * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-raop-sink.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-raop-sink.c
Changed
@@ -94,6 +94,8 @@ * ## Example configuration * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-raop-sink.conf + * * context.modules = * { name = libpipewire-module-raop-sink * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-roc-sink.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-roc-sink.c
Changed
@@ -56,6 +56,8 @@ * * ## Example configuration *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-roc-sink.conf + * * context.modules = * { name = libpipewire-module-roc-sink * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-roc-source.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-roc-source.c
Changed
@@ -59,6 +59,8 @@ * * ## Example configuration *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-roc-source.conf + * * context.modules = * { name = libpipewire-module-roc-source * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-rtp-sap.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-rtp-sap.c
Changed
@@ -71,6 +71,8 @@ * * ## Example configuration *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-rtp-sap.conf + * * context.modules = * { name = libpipewire-module-rtp-sap * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-rtp-session.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-rtp-session.c
Changed
@@ -93,6 +93,8 @@ * * ## Example configuration *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-rtp-session.conf + * * context.modules = * { name = libpipewire-module-rtp-session * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-rtp-sink.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-rtp-sink.c
Changed
@@ -85,6 +85,8 @@ * * ## Example configuration *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-rtp-sink.conf + * * context.modules = * { name = libpipewire-module-rtp-sink * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-rtp-source.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-rtp-source.c
Changed
@@ -77,6 +77,8 @@ * * ## Example configuration *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-rtp-source.conf + * * context.modules = * { name = libpipewire-module-rtp-source * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-snapcast-discover.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-snapcast-discover.c
Changed
@@ -68,6 +68,8 @@ * ## Example configuration * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-snapcast-discover.conf + * * context.modules = * { name = libpipewire-module-snapcast-discover * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-vban-recv.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-vban-recv.c
Changed
@@ -73,6 +73,8 @@ * * ## Example configuration *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-vban-recv.conf + * * context.modules = * { name = libpipewire-module-vban-recv * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-vban-send.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-vban-send.c
Changed
@@ -78,6 +78,8 @@ * * ## Example configuration *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-vban-send.conf + * * context.modules = * { name = libpipewire-module-vban-send * args = {
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/modules/module-zeroconf-discover.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/modules/module-zeroconf-discover.c
Changed
@@ -48,6 +48,8 @@ * ## Example configuration * *\code{.unparsed} + * # ~/.config/pipewire/pipewire.conf.d/my-zeroconf-discover.conf + * * context.modules = * { name = libpipewire-module-zeroconf-discover * args = { }
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/pipewire/filter.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/pipewire/filter.c
Changed
@@ -498,14 +498,18 @@ { struct filter *impl = object; struct pw_filter *filter = &impl->this; + uint32_t id = SPA_NODE_COMMAND_ID(command); - switch (SPA_NODE_COMMAND_ID(command)) { + pw_log_debug("%p: command %s", impl, + spa_debug_type_find_name(spa_type_node_command_id, id)); + + switch (id) { case SPA_NODE_COMMAND_Suspend: case SPA_NODE_COMMAND_Flush: case SPA_NODE_COMMAND_Pause: pw_loop_invoke(impl->main_loop, NULL, 0, NULL, 0, false, impl); - if (filter->state == PW_FILTER_STATE_STREAMING) { + if (filter->state == PW_FILTER_STATE_STREAMING && id != SPA_NODE_COMMAND_Flush) { pw_log_debug("%p: pause", filter); filter_set_state(filter, PW_FILTER_STATE_PAUSED, 0, NULL); }
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/pipewire/filter.h -> _service:download_url:pipewire-1.2.6.tar.bz2/src/pipewire/filter.h
Changed
@@ -237,7 +237,10 @@ int pw_filter_set_active(struct pw_filter *filter, bool active); /** Flush a filter. When \a drain is true, the drained callback will - * be called when all data is played or recorded */ + * be called when all data is played or recorded. The filter can be resumed + * after the drain by setting it active again with + * \ref pw_filter_set_active(). A flush without a drain is mostly useful afer + * a state change to PAUSED, to flush any remaining data from the queues. */ int pw_filter_flush(struct pw_filter *filter, bool drain); /** Check if the filter is driving. The filter needs to have the
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/pipewire/impl-node.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/pipewire/impl-node.c
Changed
@@ -2780,9 +2780,17 @@ * will wait until all previous items in the work queue are * completed */ impl->pending_state = state; - impl->pending_id = pw_work_queue_add(impl->work, - node, res == EBUSY ? -EBUSY : res, - on_state_complete, SPA_INT_TO_PTR(state)); + if (node->exported) { + /* exported nodes must complete immediately. This is important + * because the server sends ping to check completion. The server + * will only send Start to driver nodes when all clients are + * ready for processing. */ + on_state_complete(node, SPA_INT_TO_PTR(state), -EBUSY, 0); + } else { + impl->pending_id = pw_work_queue_add(impl->work, + node, res == EBUSY ? -EBUSY : res, + on_state_complete, SPA_INT_TO_PTR(state)); + } } return res; }
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/pipewire/keys.h -> _service:download_url:pipewire-1.2.6.tar.bz2/src/pipewire/keys.h
Changed
@@ -187,7 +187,9 @@ #define PW_KEY_NODE_SUSPEND_ON_IDLE "node.suspend-on-idle" /**< suspend the node when idle */ #define PW_KEY_NODE_CACHE_PARAMS "node.cache-params" /**< cache the node params */ #define PW_KEY_NODE_TRANSPORT_SYNC "node.transport.sync" /**< the node handles transport sync */ -#define PW_KEY_NODE_DRIVER "node.driver" /**< node can drive the graph */ +#define PW_KEY_NODE_DRIVER "node.driver" /**< node can drive the graph. When the node is + * selected as the driver, it needs to start + * the graph periodically. */ #define PW_KEY_NODE_DRIVER_ID "node.driver-id" /**< the node id of the node assigned as driver * for this node */ #define PW_KEY_NODE_ASYNC "node.async" /**< the node wants async scheduling */ @@ -207,12 +209,14 @@ #define PW_KEY_NODE_TRIGGER "node.trigger" /**< the node is not scheduled automatically * based on the dependencies in the graph * but it will be triggered explicitly. */ -#define PW_KEY_NODE_CHANNELNAMES "node.channel-names" /**< names of node's - * channels (unrelated to positions) */ -#define PW_KEY_NODE_DEVICE_PORT_NAME_PREFIX "node.device-port-name-prefix" /** override - * port name prefix for device ports, like capture and playback - * or disable the prefix completely if an empty string is provided */ - +#define PW_KEY_NODE_CHANNELNAMES "node.channel-names" /**< names of node's + * channels (unrelated to positions) */ +#define PW_KEY_NODE_DEVICE_PORT_NAME_PREFIX \ + "node.device-port-name-prefix" /**< override port name prefix for + * device ports, like capture and + * playback or disable the prefix + * completely if an empty string + * is provided */ /** Port keys */ #define PW_KEY_PORT_ID "port.id" /**< port id */ #define PW_KEY_PORT_NAME "port.name" /**< port name */
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/pipewire/stream.c -> _service:download_url:pipewire-1.2.6.tar.bz2/src/pipewire/stream.c
Changed
@@ -648,7 +648,7 @@ struct pw_stream *stream = &impl->this; uint32_t id = SPA_NODE_COMMAND_ID(command); - pw_log_info("%p: command %s", impl, + pw_log_debug("%p: command %s", impl, spa_debug_type_find_name(spa_type_node_command_id, id)); switch (id) { @@ -657,8 +657,7 @@ case SPA_NODE_COMMAND_Pause: pw_loop_invoke(impl->main_loop, NULL, 0, NULL, 0, false, impl); - if (stream->state == PW_STREAM_STATE_STREAMING) { - + if (stream->state == PW_STREAM_STATE_STREAMING && id != SPA_NODE_COMMAND_Flush) { pw_log_debug("%p: pause", stream); stream_set_state(stream, PW_STREAM_STATE_PAUSED, 0, NULL); } @@ -666,13 +665,11 @@ case SPA_NODE_COMMAND_Start: if (stream->state == PW_STREAM_STATE_PAUSED) { pw_log_debug("%p: start direction:%d", stream, impl->direction); - if (impl->direction == SPA_DIRECTION_INPUT) { if (impl->io != NULL) impl->io->status = SPA_STATUS_NEED_DATA; } copy_position(impl, impl->queued.incount); - stream_set_state(stream, PW_STREAM_STATE_STREAMING, 0, NULL); } break; default: @@ -1377,10 +1374,29 @@ } } +static void node_state_changed(void *data, enum pw_node_state old, + enum pw_node_state state, const char *error) +{ + struct pw_stream *stream = data; + + switch (state) { + case PW_NODE_STATE_RUNNING: + if (stream->state == PW_STREAM_STATE_PAUSED) + stream_set_state(stream, PW_STREAM_STATE_STREAMING, 0, NULL); + break; + case PW_NODE_STATE_ERROR: + stream_set_state(stream, PW_STREAM_STATE_ERROR, -EIO, error); + break; + default: + break; + } +} + static const struct pw_impl_node_events node_events = { PW_VERSION_IMPL_NODE_EVENTS, .destroy = node_event_destroy, .info_changed = node_event_info, + .state_changed = node_state_changed, }; static void on_core_error(void *data, uint32_t id, int seq, int res, const char *message) @@ -2298,8 +2314,11 @@ pw_impl_node_set_active(stream->node, active); - if (!active || impl->drained) + if (!active || impl->drained) { + if (impl->drained && impl->io != NULL) + impl->io->status = SPA_STATUS_NEED_DATA; impl->drained = impl->draining = false; + } return 0; }
View file
_service:download_url:pipewire-1.2.5.tar.bz2/src/pipewire/stream.h -> _service:download_url:pipewire-1.2.6.tar.bz2/src/pipewire/stream.h
Changed
@@ -556,7 +556,11 @@ int pw_stream_set_active(struct pw_stream *stream, bool active); /** Flush a stream. When \a drain is true, the drained callback will - * be called when all data is played or recorded */ + * be called when all data is played or recorded. The stream can be resumed + * after the drain by setting it active again with + * \ref pw_stream_set_active(). A flush without a drain is mostly useful afer + * a state change to PAUSED, to flush any remaining data from the queues and + * the converters. */ int pw_stream_flush(struct pw_stream *stream, bool drain); /** Check if the stream is driving. The stream needs to have the
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.