Changes of Revision 47

pipewire-aptx.changes Changed
x
 
1
@@ -1,4 +1,9 @@
2
 -------------------------------------------------------------------
3
+Thu Nov  7 09:26:42 UTC 2024 - Bjørn Lie <zaitor@opensuse.org>
4
+
5
+- Update to version 1.2.6
6
+
7
+-------------------------------------------------------------------
8
 Fri Oct  4 09:01:15 UTC 2024 - Bjørn Lie <zaitor@opensuse.org>
9
 
10
 - Update to version 1.2.5
11
pipewire-aptx.spec Changed
10
 
1
@@ -8,7 +8,7 @@
2
 %define minimum_version 1.2.0
3
 
4
 Name:           pipewire-aptx
5
-Version:        1.2.5
6
+Version:        1.2.6
7
 Release:        0
8
 Summary:        PipeWire Bluetooth aptX codec plugin
9
 License:        MIT
10
_service Changed
10
 
1
@@ -2,6 +2,6 @@
2
   <service name="download_url">
3
     <param name="host">gitlab.freedesktop.org</param>
4
     <param name="protocol">https</param>
5
-    <param name="path">/pipewire/pipewire/-/archive/1.2.5/pipewire-1.2.5.tar.bz2</param>
6
+    <param name="path">/pipewire/pipewire/-/archive/1.2.6/pipewire-1.2.6.tar.bz2</param>
7
   </service>
8
 </services>
9
\ No newline at end of file
10
_service:download_url:pipewire-1.2.5.tar.bz2/doc/dox/config/pipewire-devices.7.md Deleted
520
 
1
@@ -1,518 +0,0 @@
2
-\page page_man_pipewire-devices_7 pipewire-devices
3
-
4
-PipeWire device and node property reference.
5
-
6
-\tableofcontents
7
-
8
-# DESCRIPTION
9
-
10
-Audio sinks and sources, cameras, Bluetooth endpoints, and other
11
-objects have properties that can be set in configuration files or at
12
-runtime.
13
-
14
-Some of the properties are "common object properties" (e.g. such as
15
-`node.description`) and can be set on all types of devices and
16
-nodes. Other properties control settings of a specific type of a
17
-device (ALSA, Bluetooth, ...).
18
-
19
-All the properties are usually configured in the session manager configuration.
20
-For how to configure them, see the session manager documentation.
21
-
22
-In minimal PipeWire setups without a session manager, they can be configured via
23
-\ref pipewire_conf__context_objects "context.objects in pipewire.conf(5)".
24
-
25
-# RUNTIME SETTINGS  @IDX@ device-param
26
-
27
-The settings of most ALSA and virtual device parameters can be
28
-configured also at runtime.
29
-
30
-The settings are available in device `Props` in the `params`
31
-field. They can be seen e.g. using `pw-dump <id>` for an ALSA device:
32
-
33
-```json
34
-{
35
-...
36
-      "Props": 
37
-        {
38
-          ...
39
-          "params": 
40
-              "audio.channels",
41
-              2,
42
-              "audio.rate",
43
-              0,
44
-              "audio.format",
45
-              "UNKNOWN",
46
-              "audio.position",
47
-              " FL, FR ",
48
-              "audio.allowed-rates",
49
-              "  ",
50
-              "api.alsa.period-size",
51
-              0,
52
-              "api.alsa.period-num",
53
-              0,
54
-              "api.alsa.headroom",
55
-              0,
56
-              "api.alsa.start-delay",
57
-              0,
58
-              "api.alsa.disable-mmap",
59
-              false,
60
-              "api.alsa.disable-batch",
61
-              false,
62
-              "api.alsa.use-chmap",
63
-              false,
64
-              "api.alsa.multi-rate",
65
-              true,
66
-              "latency.internal.rate",
67
-              0,
68
-              "latency.internal.ns",
69
-              0,
70
-              "clock.name",
71
-              "api.alsa.c-1"
72
-            
73
-          }
74
-...
75
-```
76
-
77
-One or more `params` can be changed using \ref page_man_pw-cli_1 "pw-cli(1)":
78
-```
79
-pw-cli s <id> Props '{ params =  "api.alsa.headroom" 1024  }'
80
-```
81
-These settings are not saved and need to be reapplied for each session manager restart.
82
-
83
-# COMMON NODE PROPERTIES  @IDX@ device-param
84
-
85
-The properties listed in \ref client_conf__stream_properties "Stream properties"
86
-apply also to sink or source nodes corresponding to real or virtual devices.
87
-
88
-In addition:
89
-
90
-@PAR@ device-param  priority.driver    # integer
91
-\parblock
92
-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.
93
-
94
-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.
95
-\endparblock
96
-
97
-@PAR@ device-param  priority.session    # integer
98
-The priority for selecting this device as the default device.
99
-
100
-@PAR@ device-param  clock.name    # string
101
-\parblock
102
-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.
103
-
104
-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.
105
-
106
-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.
107
-\endparblock
108
-
109
-@PAR@ device-param  node.param.PARAM = JSON    # JSON
110
-\parblock
111
-Set value of a node \ref spa_param_type "Param" to a JSON value when the device is loaded.
112
-This works similarly as \ref page_man_pw-cli_1 "pw-cli(1)" `set-param` command.
113
-The `PARAM` should be replaced with the name of the Param to set,
114
-ie. for example `node.param.Props = { ... }` to set `Props`.
115
-\endparblock
116
-
117
-@PAR@ device-param  device.id
118
-ID of the device the node belongs to.
119
-
120
-# COMMON DEVICE PROPERTIES  @IDX@ device-param
121
-
122
-These are common properties for devices.
123
-
124
-@PAR@ device-param  device.name    # string
125
-A (unique) name for the device. It can be used by command-line and other tools to identify the device.
126
-
127
-@PAR@ device-param  device.param.PARAM = JSON    # JSON
128
-\parblock
129
-Set value of a device \ref spa_param_type "Param" to a JSON value when the device is loaded.
130
-This works similarly as \ref page_man_pw-cli_1 "pw-cli(1)" `set-param` command.
131
-The `PARAM` should be replaced with the name of the Param to set,
132
-ie. for example `device.Param.Props = { ... }` to set `Props`.
133
-\endparblock
134
-
135
-Other `device.*` properties: UNDOCUMENTED
136
-
137
-# AUDIO CONVERTER PROPERTIES  @IDX@ device-param
138
-
139
-Most audio nodes (ALSA, Bluetooth, ...) have common properties for the audio
140
-converter. See \ref client_conf__stream_properties "pipewire-client.conf(5) stream.properties"
141
-for explanations.
142
-
143
-## Node properties
144
-
145
-@PAR@ device-param  clock.quantum-limit
146
-\ref pipewire_conf__default_clock_quantum-limit "See pipewire.conf(5)"
147
-
148
-@PAR@ device-param  channelmix.disable
149
-\ref client_conf__channelmix_disable "See pipewire-client.conf(5)"
150
-
151
-@PAR@ device-param  channelmix.min-volume
152
-\ref client_conf__channelmix_min-volume "See pipewire-client.conf(5)"
153
-
154
-@PAR@ device-param  channelmix.max-volume
155
-\ref client_conf__channelmix_max-volume "See pipewire-client.conf(5)"
156
-
157
-@PAR@ device-param  channelmix.normalize
158
-\ref client_conf__channelmix_normalize "See pipewire-client.conf(5)"
159
-
160
-@PAR@ device-param  channelmix.mix-lfe
161
-\ref client_conf__channelmix_mix-lfe "See pipewire-client.conf(5)"
162
-
163
-@PAR@ device-param  channelmix.upmix
164
-\ref client_conf__channelmix_upmix "See pipewire-client.conf(5)"
165
-
166
-@PAR@ device-param  channelmix.lfe-cutoff
167
-\ref client_conf__channelmix_lfe-cutoff "See pipewire-client.conf(5)"
168
-
169
-@PAR@ device-param  channelmix.fc-cutoff
170
-\ref client_conf__channelmix_fc-cutoff "See pipewire-client.conf(5)"
171
-
172
-@PAR@ device-param  channelmix.rear-delay
173
-\ref client_conf__channelmix_rear-delay "See pipewire-client.conf(5)"
174
-
175
-@PAR@ device-param  channelmix.stereo-widen
176
-\ref client_conf__channelmix_stereo-widen "See pipewire-client.conf(5)"
177
-
178
-@PAR@ device-param  channelmix.hilbert-taps
179
-\ref client_conf__channelmix_hilbert-taps "See pipewire-client.conf(5)"
180
-
181
-@PAR@ device-param  channelmix.upmix-method
182
-\ref client_conf__channelmix_upmix-method "See pipewire-client.conf(5)"
183
-
184
-@PAR@ device-param  channelmix.lock-volumes
185
-\ref client_conf__channelmix_lock-volumes "See pipewire-client.conf(5)"
186
-
187
-@PAR@ device-param  resample.quality
188
-\ref client_conf__resample_quality "See pipewire-client.conf(5)"
189
-
190
-@PAR@ device-param  resample.disable
191
-\ref client_conf__resample_disable "See pipewire-client.conf(5)"
192
-
193
-@PAR@ device-param  resample.peaks = false # boolean
194
-Instead of actually resampling, produce peak amplitude values as output.
195
-This is used for volume monitoring, where it is set as a property
196
-of the "recording" stream.
197
-
198
-@PAR@ device-param  resample.prefill = false # boolean
199
-Prefill resampler buffers with silence. This affects the initial
200
-samples produced by the resampler.
201
-
202
-@PAR@ device-param  monitor.channel-volumes
203
-\ref client_conf__monitor_channel-volumes "See pipewire-client.conf(5)"
204
-
205
-@PAR@ device-param  dither.noise
206
-\ref client_conf__dither_noise "See pipewire-client.conf(5)"
207
-
208
-@PAR@ device-param  dither.method
209
-\ref client_conf__dither_method "See pipewire-client.conf(5)"
210
-
211
-@PAR@ device-param  debug.wav-path
212
-\ref client_conf__debug_wav-path "See pipewire-client.conf(5)"
213
-
214
-@PAR@ device-param  adapter.auto-port-config = null # JSON
215
-\parblock
216
-If specified, configure the ports of the node when it is created, instead of
217
-leaving that to the session manager to do. This is useful (only) for minimal
218
-configurations without a session manager.
219
-
220
-Value is SPA JSON of the form:
221
-```json
222
-{
223
-    mode = "none",          # "none", "passthrough", "convert", "dsp"
224
-    monitor = false,        # boolean
225
-    control = false,        # boolean
226
-    position = "preserve"   # "unknown", "aux", "preserve"
227
-}
228
-```
229
-See \ref spa_param_port_config for the meaning.
230
-\endparblock
231
-
232
-# ALSA PROPERTIES  @IDX@ device-param
233
-
234
-## Monitor properties
235
-
236
-@PAR@ device-param  alsa.use-acp    # boolean
237
-Use \ref device-param__alsa_card_profiles "ALSA Card Profiles" (ACP) for device configuration.
238
-
239
-@PAR@ device-param  alsa.udev.expose-busy    # boolean
240
-Expose the ALSA card even if it is busy/in use. Default false. This can be useful when some
241
-of the PCMs are in use by other applications but the other free PCMs should still be exposed.
242
-
243
-## Device properties
244
-
245
-@PAR@ device-param  api.alsa.path    # string
246
-ALSA device path as can be used in snd_pcm_open() and snd_ctl_open().
247
-
248
-@PAR@ device-param  api.acp.auto-port    # boolean
249
-Select reasonable port on device startup. Available for ACP devices.
250
-
251
-@PAR@ device-param  api.acp.auto-profile    # boolean
252
-Select reasonable profile on device startup. Available for ACP devices.
253
-
254
-## Node properties
255
-
256
-@PAR@ device-param  audio.channels    # integer
257
-The number of audio channels to open the device with. Defaults depends on the profile of the device.
258
-
259
-@PAR@ device-param  audio.rate    # integer
260
-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.
261
-
262
-@PAR@ device-param  audio.format    # string
263
-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.
264
-
265
-@PAR@ device-param  audio.position    # JSON array of strings
266
-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 ".
267
-
268
-@PAR@ device-param  audio.allowed-rates    # JSON array of integers
269
-\parblock
270
-The allowed audio rates to open the device with. Default is " ", which means the device can be opened in any supported rate.
271
-
272
-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.
273
-\endparblock
274
-
275
-@PAR@ device-param  api.alsa.period-size    # integer
276
-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.
277
-
278
-@PAR@ device-param  api.alsa.period-num    # integer
279
-The amount of periods to use in the device. By default this is 0, which means to use as many as possible.
280
-
281
-@PAR@ device-param  api.alsa.headroom    # integer
282
-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.
283
-
284
-@PAR@ device-param  api.alsa.start-delay    # integer
285
-Some devices require a startup period. The default is 0. Higher values can be set to send silence samples to the device first.
286
-
287
-@PAR@ device-param  api.alsa.disable-mmap    # boolean
288
-Disable mmap operation of the device and use the ALSA read/write API instead. Default is false, mmap is preferred.
289
-
290
-@PAR@ device-param  api.alsa.disable-batch    # boolean
291
-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.
292
-
293
-@PAR@ device-param  api.alsa.use-chmap    # boolean
294
-Use the driver provided channel map. Default is true when using UCM, false otherwise because many driver don't report this correctly.
295
-
296
-@PAR@ device-param  api.alsa.multi-rate    # boolean
297
-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.
298
-
299
-@PAR@ device-param  api.alsa.htimestamp = false    # boolean
300
-Use ALSA htimestamps in scheduling, instead of the system clock.
301
-Some ALSA drivers produce bad timestamps, so this is not enabled by default
302
-and will be disabled at runtime if it looks like the ALSA timestamps are bad.
303
-
304
-@PAR@ device-param  api.alsa.htimestamp.max-errors    # integer
305
-Specify the number of consecutive errors before htimestamp is disabled.
306
-Setting this to 0 makes htimestamp never get disabled.
307
-
308
-@PAR@ device-param  api.alsa.disable-tsched = false    # boolean
309
-Disable timer-based scheduling, and use IRQ for scheduling instead.
310
-The "Pro Audio" profile will usually enable this setting, if it is expected it works on the hardware.
311
-
312
-@PAR@ device-param  api.alsa.auto-link = false    # boolean
313
-Link follower PCM devices to the driver PCM device when using IRQ-based scheduling.
314
-The "Pro Audio" profile will usually enable this setting, if it is expected it works on the hardware.
315
-
316
-@PAR@ device-param  latency.internal.rate    # integer
317
-Static set the device systemic latency, in samples at playback rate.
318
-
319
-@PAR@ device-param  latency.internal.ns    # integer
320
-Static set the device systemic latency, in nanoseconds.
321
-
322
-@PAR@ device-param  api.alsa.path    # string
323
-UNDOCUMENTED
324
-
325
-@PAR@ device-param  api.alsa.open.ucm    # boolean
326
-Open device using UCM.
327
-
328
-@PAR@ device-param  api.alsa.bind-ctls    # boolean
329
-UNDOCUMENTED
330
-
331
-@PAR@ device-param  iec958.codecs    # JSON array of string
332
-Enable only specific IEC958 codecs. This can be used to disable some codecs the hardware supports.
333
-Available values: PCM, AC3, DTS, MPEG, MPEG2-AAC, EAC3, TRUEHD, DTSHD
334
-
335
-# BLUETOOTH PROPERTIES  @IDX@ device-param
336
-
337
-## Monitor properties
338
-
339
-The following are settings for the Bluetooth device monitor, not device or
340
-node properties:
341
-
342
-@PAR@ device-param  bluez5.roles   # JSON array of string
343
-\parblock
344
-Enabled roles (default:  a2dp_sink a2dp_source bap_sink bap_source hfp_hf hfp_ag )
345
-
346
-Currently some headsets (Sony WH-1000XM3) are not working with
347
-both hsp_ag and hfp_ag enabled, so by default we enable only HFP.
348
-
349
-Supported roles:
350
-- hsp_hs (HSP Headset),
351
-- hsp_ag (HSP Audio Gateway),
352
-- hfp_hf (HFP Hands-Free),
353
-- hfp_ag (HFP Audio Gateway)
354
-- a2dp_sink (A2DP Audio Sink)
355
-- a2dp_source (A2DP Audio Source)
356
-- bap_sink (LE Audio Basic Audio Profile Sink)
357
-- bap_source (LE Audio Basic Audio Profile Source)
358
-\endparblock
359
-
360
-@PAR@ device-param  bluez5.codecs   # JSON array of string
361
-Enabled A2DP codecs (default: all).
362
-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
363
-
364
-@PAR@ device-param  bluez5.default.rate   # integer
365
-Default audio rate.
366
-
367
-@PAR@ device-param  bluez5.default.channels   # integer
368
-Default audio channels.
369
-
370
-@PAR@ device-param  bluez5.hfphsp-backend   # integer
371
-HFP/HSP backend (default: native). Available values: any, none, hsphfpd, ofono, native
372
-
373
-@PAR@ device-param  bluez5.hfphsp-backend-native-modem   # string
374
-
375
-@PAR@ device-param  bluez5.dummy-avrcp player   # boolean
376
-Register dummy AVRCP player. Some devices have wrongly functioning
377
-volume or playback controls if this is not enabled. Default: false
378
-
379
-@PAR@ device-param  bluez5.enable-sbc-xq   # boolean
380
-Override device quirk list and enable SBC-XQ for devices for which it is disabled.
381
-
382
-@PAR@ device-param  bluez5.enable-msbc   # boolean
383
-Override device quirk list and enable MSBC for devices for which it is disabled.
384
-
385
-@PAR@ device-param  bluez5.enable-hw-volume   # boolean
386
-Override device quirk list and enable hardware volume fo devices for which it is disabled.
387
-
388
-@PAR@ device-param  bluez5.hw-offload-sco   # boolean
389
-\parblock
390
-HFP/HSP hardware offload SCO support (default: false).
391
-
392
-This feature requires a custom configuration that routes SCO audio to ALSA nodes,
393
-in a platform-specific way. See `tests/examples/bt-pinephone.lua` in WirePlumber for an example.
394
-Do not enable this setting if you don't know what all this means, as it won't work.
395
-\endparblock
396
-
397
-@PAR@ device-param  bluez5.a2dp.opus.pro.channels = 3   # integer
398
-PipeWire Opus Pro audio profile channel count.
399
-
400
-@PAR@ device-param  bluez5.a2dp.opus.pro.coupled-streams = 1   # integer
401
-PipeWire Opus Pro audio profile coupled stream count.
402
-
403
-@PAR@ device-param  bluez5.a2dp.opus.pro.locations = "FL,FR,LFE"   # string
404
-PipeWire Opus Pro audio profile audio channel locations.
405
-
406
-@PAR@ device-param  bluez5.a2dp.opus.pro.max-bitrate = 600000   # integer
407
-PipeWire Opus Pro audio profile max bitrate.
408
-
409
-@PAR@ device-param  bluez5.a2dp.opus.pro.frame-dms = 50   # integer
410
-PipeWire Opus Pro audio profile frame duration (1/10 ms).
411
-
412
-@PAR@ device-param  bluez5.a2dp.opus.pro.bidi.channels = 1   # integer
413
-PipeWire Opus Pro audio profile duplex channels.
414
-
415
-@PAR@ device-param  bluez5.a2dp.opus.pro.bidi.coupled-streams = 0   # integer
416
-PipeWire Opus Pro audio profile duplex coupled stream count.
417
-
418
-@PAR@ device-param  bluez5.a2dp.opus.pro.bidi.locations = "FC"   # string
419
-PipeWire Opus Pro audio profile duplex coupled channel locations.
420
-
421
-@PAR@ device-param  bluez5.a2dp.opus.pro.bidi.max-bitrate = 160000   # integer
422
-PipeWire Opus Pro audio profile duplex max bitrate.
423
-
424
-@PAR@ device-param  bluez5.a2dp.opus.pro.bidi.frame-dms = 400   # integer
425
-PipeWire Opus Pro audio profile duplex frame duration (1/10 ms).
426
-
427
-@PAR@ device-param  bluez5.bcast_source.config   # JSON
428
-\parblock
429
-Example:
430
-```
431
-bluez5.bcast_source.config = 
432
-  {
433
-    "broadcast_code": "Børne House",
434
-    "encryption: false,
435
-    "bis": 
436
-      { # BIS configuration
437
-        "qos_preset": "16_2_1", # QOS preset name from table Table 6.4 from BAP_v1.0.1.
438
-        "audio_channel_allocation": 1, # audio channel allocation configuration for the BIS
439
-        "metadata":  # metadata configurations for the BIS
440
-           { "type": 1, "value":  1, 1  }
441
-        
442
-      }
443
-    
444
-  }
445
-
446
-```
447
-\endparblock
448
-
449
-## Device properties
450
-
451
-@PAR@ device-param  bluez5.auto-connect   # boolean
452
-Auto-connect devices on start up. Disabled by default if
453
-the property is not specified.
454
-
455
-@PAR@ device-param  bluez5.hw-volume =  PROFILE1 PROFILE2...    # JSON array of string
456
-Profiles for which to enable hardware volume control (default:  hfp_ag hsp_ag a2dp_source ).
457
-
458
-@PAR@ device-param  bluez5.profile   # string
459
-Initial device profile. This usually has no effect as the session manager
460
-overrides it.
461
-
462
-@PAR@ device-param  bluez5.a2dp.ldac.quality   # string
463
-LDAC encoding quality
464
-Available values:
465
-- auto (Adaptive Bitrate, default)
466
-- hq   (High Quality, 990/909kbps)
467
-- sq   (Standard Quality, 660/606kbps)
468
-- mq   (Mobile use Quality, 330/303kbps)
469
-
470
-@PAR@ device-param  bluez5.a2dp.aac.bitratemode   # integer
471
-AAC variable bitrate mode.
472
-Available values: 0 (cbr, default), 1-5 (quality level)
473
-
474
-@PAR@ device-param  bluez5.a2dp.opus.pro.application = "audio"   # string
475
-PipeWire Opus Pro Audio encoding mode: audio, voip, lowdelay
476
-
477
-@PAR@ device-param  bluez5.a2dp.opus.pro.bidi.application = "audio"   # string
478
-PipeWire Opus Pro Audio duplex encoding mode: audio, voip, lowdelay
479
-
480
-@PAR@ device-param  bluez5.bap.cig = auto   # integer, or 'auto'
481
-Set CIG ID for BAP unicast streams of the device.
482
-Default: "auto" (automatic).
483
-
484
-## Node properties
485
-
486
-@PAR@ device-param  bluez5.media-source-role   # string
487
-\parblock
488
-Media source role for Bluetooth clients connecting to
489
-this instance. Available values:
490
-  - playback: playing stream to speakers
491
-  - input: appear as source node.
492
-\endparblock
493
-
494
-# ALSA CARD PROFILES  @IDX@ device-param
495
-
496
-The sound card profiles ("Analog stereo", "Analog stereo duplex", ...) except "Pro Audio" come from two sources:
497
-
498
-- UCM: ALSA Use Case Manager: the profile configuration system from ALSA. See https://github.com/alsa-project/alsa-ucm-conf/
499
-- ACP ("Alsa Card Profiles"): Pulseaudio's profile system ported to PipeWire. See https://www.freedesktop.org/wiki/Software/PulseAudio/Backends/ALSA/Profiles/
500
-
501
-See the above links on how to configure these systems.
502
-
503
-For ACP, PipeWire looks for the profile configuration files under
504
-
505
-- ~/.config/alsa-card-profile
506
-- /etc/alsa-card-profile
507
-- /usr/share/alsa-card-profile/mixer`. 
508
-
509
-The `path` and `profile-set` files are in subdirectories `paths` and `profile-sets` of these directories.
510
-It is possible to override individual files locally by putting a modified copy into the ACP directories under `~/.config` or `/etc`.
511
-
512
-# AUTHORS
513
-
514
-The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
515
-PipeWire is available from <$(PACKAGE_URL)>
516
-
517
-# SEE ALSO
518
-
519
-\ref page_man_pipewire_conf_5 "pipewire.conf(5)"
520
_service:download_url:pipewire-1.2.5.tar.bz2/NEWS -> _service:download_url:pipewire-1.2.6.tar.bz2/NEWS Changed
60
 
1
@@ -1,3 +1,48 @@
2
+# PipeWire 1.2.6 (2024-10-23)
3
+
4
+This is a bugfix release that is API and ABI compatible with the previous
5
+1.2.x and 1.0.x releases.
6
+
7
+## Highlights
8
+  - The filter-chain param changes were not aggregated correctly, causing some
9
+    param changes to be ignored. (#4331)
10
+  - Clear the JACK io ports correctly when stopping to avoid crashes. (#4337)
11
+  - Some more small fixes and improvements.
12
+
13
+
14
+## PipeWire
15
+  - Stream states are now updated based on the underlying node state.
16
+  - Exported nodes now have their state change done synchronously so that the
17
+    server can immediately start the driver and avoid some initial xruns.
18
+  - Improve stream flush handling and improve the docs.
19
+  - Don't send mix_info to destroyed ports to avoid some errors in the
20
+    JACK clients.
21
+
22
+## Modules
23
+  - The filter-chain param changes were not aggregated correctly, causing some
24
+    param changes to be ignored. (#4331)
25
+  - The filter-chain now correctly optimizes unlinked nodes in all cases.
26
+
27
+## SPA
28
+  - ALSA PCM node properties are now no longer overwritten with card properties.
29
+    (#4135)
30
+  - Increase the adapter retry count to avoid xruns in some cases. (#4334)
31
+  - Fix potential crash in cleanup of ALSA nodes.
32
+
33
+## Bluetooth
34
+  - Fix a crash with broadcast sinks.
35
+  - Improve compatibility with Phonak hearing aids.
36
+  - Don't exit when DBus goes down.
37
+
38
+## JACK
39
+  - Clear the io ports correctly when stopping to avoid crashes. (#4337)
40
+
41
+## Docs
42
+  - Backport docs from master.
43
+
44
+Older versions:
45
+
46
+
47
 # PipeWire 1.2.5 (2024-09-27)
48
 
49
 This is an important bugfix release that is API and ABI compatible with the
50
@@ -44,9 +89,6 @@
51
   - Some small doc updates. (#4272)
52
 
53
 
54
-Older versions:
55
-
56
-
57
 # PipeWire 1.2.4 (2024-09-19)
58
 
59
 This is a bugfix release that is API and ABI compatible with the
60
_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
67
 
1
@@ -26,14 +26,12 @@
2
 - \ref page_man_pipewire_conf_5 "PipeWire daemon configuration reference"
3
 - \ref page_man_pipewire-pulse_conf_5 "PipeWire Pulseaudio daemon configuration reference"
4
 - WirePlumber daemon configuration(https://pipewire.pages.freedesktop.org/wireplumber/)
5
-- Wiki page on PipeWire daemon configuration(https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PipeWire)
6
-- Wiki page on PipeWire PulseAudio daemon configuration(https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PulseAudio)
7
 
8
 Configuration of devices:
9
 
10
 - WirePlumber configuration(https://pipewire.pages.freedesktop.org/wireplumber/daemon/configuration.html)
11
-- \ref page_man_pipewire-devices_7 "Device and node property reference"
12
-- Wiki page on device runtime settings(https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-Devices)
13
+- \ref page_man_pipewire-props_7 "Object property reference"
14
+- \subpage page_config_xref "Configuration Index"
15
 
16
 Configuration for client applications, either connecting via the
17
 native PipeWire interface, or the emulated ALSA, JACK, or PulseAudio
18
@@ -42,10 +40,6 @@
19
 - \ref page_man_pipewire-client_conf_5 "PipeWire native and ALSA client configuration reference"
20
 - \ref page_man_pipewire-jack_conf_5 "PipeWire JACK client configuration reference"
21
 - \ref page_man_pipewire-pulse_conf_5 "PipeWire Pulseaudio client configuration reference"
22
-- Wiki page on native clients(https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-client)
23
-- Wiki page on ALSA clients(https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-ALSA)
24
-- Wiki page on JACK clients(https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-JACK)
25
-- Wiki page on PulseAudio clients(https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PulseAudio)
26
 
27
 # Manual Pages
28
 
29
@@ -54,36 +48,6 @@
30
 - \subpage page_man_pipewire-pulse_conf_5
31
 - \subpage page_man_pipewire-jack_conf_5
32
 - \subpage page_man_pipewire-filter-chain_conf_5
33
-- \subpage page_man_pipewire-devices_7
34
+- \subpage page_man_pipewire-props_7
35
 - \subpage page_man_pipewire-pulse-modules_7
36
 - \subpage page_man_libpipewire-modules_7
37
-
38
-# Configuration Index
39
-
40
-\ref page_man_pipewire_conf_5 "pipewire.conf"
41
-
42
-@SECREF@ pipewire.conf
43
-
44
-\ref page_man_pipewire-pulse_conf_5 "pipewire-pulse.conf"
45
-
46
-@SECREF@ pipewire-pulse.conf
47
-
48
-\ref page_man_pipewire-client_conf_5 "client.conf, client-rt.conf"
49
-
50
-@SECREF@ client.conf
51
-
52
-\ref page_man_pipewire-jack_conf_5 "jack.conf"
53
-
54
-@SECREF@ jack.conf
55
-
56
-**Runtime settings**
57
-
58
-@SECREF@ pipewire-settings
59
-
60
-**Environment variables**
61
-
62
-@SECREF@ pipewire-env client-env jack-env pulse-env
63
-
64
-**Device properties**
65
-
66
-@SECREF@ device-param
67
_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
494
 
1
@@ -66,7 +66,9 @@
2
 # STREAM PROPERTIES  @IDX@ client.conf
3
 
4
 The client configuration files contain a stream.properties section that configures the options for client streams:
5
-```
6
+```css
7
+# ~/.config/pipewire/client.conf.d/custom.conf
8
+
9
 stream.properties = {
10
     #node.latency = 1024/48000
11
     #node.autoconnect = true
12
@@ -101,429 +103,10 @@
13
 * How the internal processing will be done.
14
 * Properties to configure the media format.
15
 
16
-## Identifying Properties  @IDX@ client.conf
17
-
18
-These contain properties to identify the node or to display the node in a GUI application.
19
-
20
-@PAR@ client.conf  node.name
21
-A (unique) name for the node. This is usually set on sink and sources to identify them
22
-as targets for linking by the session manager.
23
-
24
-@PAR@ client.conf  node.description
25
-A human readable description of the node or stream.
26
-
27
-@PAR@ client.conf  media.name
28
-A user readable media name, usually the artist and title.
29
-These are usually shown in user facing applications
30
-to inform the user about the current playing media.
31
-
32
-@PAR@ client.conf  media.title
33
-A user readable stream title.
34
-
35
-@PAR@ client.conf  media.artist
36
-A user readable stream artist
37
-
38
-@PAR@ client.conf  media.copyright
39
-User readable stream copyright information
40
-
41
-@PAR@ client.conf  media.software
42
-User readable stream generator software information
43
-
44
-@PAR@ client.conf  media.language
45
-Stream language in POSIX format. Ex: `en_GB`
46
-
47
-@PAR@ client.conf  media.filename
48
-File name for the stream
49
-
50
-@PAR@ client.conf  media.icon
51
-Icon for the media, a base64 blob with PNG image data
52
-
53
-@PAR@ client.conf  media.icon-name
54
-An XDG icon name for the media. Ex: `audio-x-mp3`
55
-
56
-@PAR@ client.conf  media.comment
57
-Extra stream comment
58
-
59
-@PAR@ client.conf  media.date
60
-Date of the media
61
-
62
-@PAR@ client.conf  media.format
63
-User readable stream format information
64
-
65
-@PAR@ client.conf  object.linger = false
66
-If the object should outlive its creator.
67
-
68
-## Classifying Properties  @IDX@ client.conf
69
-
70
-The classifying properties of a node are use for routing the signal to its destination and
71
-for configuring the settings.
72
-
73
-@PAR@ client.conf  media.type
74
-The media type contains a broad category of the media that is being processed by the node.
75
-Possible values include "Audio", "Video", "Midi"
76
-
77
-@PAR@ client.conf  media.category
78
-\parblock
79
-What kind of processing is done with the media. Possible values include:
80
-
81
-* Playback: media playback.
82
-* Capture: media capture.
83
-* Duplex: media capture and playback or media processing in general.
84
-* Monitor: a media monitor application. Does not actively change media data but monitors
85
-           activity.
86
-* Manager: Will manage the media graph.
87
-\endparblock
88
-
89
-@PAR@ client.conf  media.role
90
-\parblock
91
-The Use case of the media. Possible values include:
92
-
93
-* Movie: Movie playback with audio and video.
94
-* Music: Music listening.
95
-* Camera: Recording video from a camera.
96
-* Screen: Recording or sharing the desktop screen.
97
-* Communication: VOIP or other video chat application.
98
-* Game: Game.
99
-* Notification: System notification sounds.
100
-* DSP: Audio or Video filters and effect processing.
101
-* Production: Professional audio processing and production.
102
-* Accessibility: Audio and Visual aid for accessibility.
103
-* Test: Test program.
104
-\endparblock
105
-
106
-@PAR@ client.conf  media.class
107
-\parblock
108
-The media class is to classify the stream function. Possible values include:
109
-
110
-* Video/Source: a producer of video, like a webcam.
111
-* Video/Sink: a consumer of video, like a display window.
112
-* Audio/Source: a source of audio samples like a microphone.
113
-* Audio/Sink: a sink for audio samples, like an audio card.
114
-* Audio/Duplex: a node that is both a sink and a source.
115
-* Stream/Output/Audio: a playback stream.
116
-* Stream/Input/Audio: a capture stream.
117
-
118
-The session manager assigns special meaning to the nodes based on the media.class. Sink or Source
119
-classes are used as targets for Stream classes, etc..
120
-\endparblock
121
-
122
-## Scheduling Properties  @IDX@ client.conf
123
-
124
-@PAR@ client.conf  node.latency = 1024/48000
125
-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.
126
-
127
-@PAR@ client.conf  node.lock-quantum = false
128
-\parblock
129
-When this node is active, the quantum of the graph is locked and not allowed to change automatically.
130
-It can still be changed forcibly with metadata or when a node forces a quantum.
131
-
132
-JACK clients use this property to avoid unexpected quantum changes.
133
-\endparblock
134
-
135
-@PAR@ client.conf  node.force-quantum = INTEGER
136
-\parblock
137
-While the node is active, force a quantum in the graph. The last node to be activated with this property wins.
138
-
139
-A value of 0 unforces the quantum.
140
-\endparblock
141
-
142
-@PAR@ client.conf  node.rate = RATE
143
-Suggest a rate (samplerate) for the graph. The suggested rate will only be applied when doing so would not cause
144
-interruptions (devices are idle) and when the rate is in the list of allowed rates in the server.
145
-
146
-@PAR@ client.conf  node.lock-rate = false
147
-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.
148
-
149
-@PAR@ client.conf  node.force-rate = RATE
150
-\parblock
151
-When the node is active, force a specific sample rate on the graph. The last node to activate with this property wins.
152
-
153
-A RATE of 0 means to force the rate in `node.rate` denominator.
154
-\endparblock
155
-
156
-@PAR@ client.conf  node.always-process = false
157
-\parblock
158
-When the node is active, it will always be joined with a driver node, even when nothing is linked to the node.
159
-Setting this property to true also implies node.want-driver = true.
160
-
161
-This is the default for JACK nodes, that always need their process callback called.
162
-\endparblock
163
-
164
-@PAR@ client.conf  node.want-driver = true
165
-The node wants to be linked to a driver so that it can start processing. This is the default for streams
166
-and filters since 0.3.51. Nodes that are not linked to anything will still be set to the idle state,
167
-unless node.always-process is set to true.
168
-
169
-@PAR@ client.conf  node.pause-on-idle = false
170
-@PAR@ client.conf  node.suspend-on-idle = false
171
-\parblock
172
-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.
173
-
174
-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.
175
-\endparblock
176
-
177
-@PAR@ client.conf  node.loop.name = null
178
-@PAR@ client.conf  node.loop.class = data.rt
179
-\parblock
180
-Add the node to a specific loop name or loop class. By default the node is added to the
181
-data.rt loop class. You can make more specific data loops and then assign the nodes to those.
182
-
183
-Other well known names are main-loop.0 and the main node.loop.class which runs the node data processing
184
-in the main loop.
185
-\endparblock
186
-
187
-## Session Manager Properties  @IDX@ client.conf
188
-
189
-@PAR@ client.conf  node.autoconnect = true
190
-Instructs the session manager to automatically connect this node to some other node, usually
191
-a sink or source.
192
-
193
-@PAR@ client.conf  node.exclusive = false
194
-If this node wants to be linked exclusively to the sink/source.
195
-
196
-@PAR@ client.conf  node.target = <node.name|object.id>
197
-Where this node should be linked to. This can be a node.name or an object.id of a node. This property is 
198
-deprecated, the target.object property should be used instead, which uses the more unique object.serial as
199
-a possible target.
200
-
201
-@PAR@ client.conf  target.object = <node.name|object.serial>
202
-Where the node should link to, this can be a node.name or an object.serial.
203
-
204
-@PAR@ client.conf  node.dont-reconnect = false
205
-\parblock
206
-When the node has a target configured and the target is destroyed, destroy the node as well.
207
-This property also inhibits that the node is moved to another sink/source.
208
-
209
-Note that if a stream should appear/disappear in sync with the target, a session manager (WirePlumber) script
210
-should be written instead.
211
-\endparblock
212
-
213
-@PAR@ client.conf  node.passive = false
214
-\parblock
215
-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).
216
-
217
-This is used for filter nodes that sit in front of sinks/sources and need to suspend together with the sink/source.
218
-\endparblock
219
-
220
-@PAR@ client.conf  node.link-group = ID
221
-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.
222
-
223
-@PAR@ client.conf  stream.dont-remix = false
224
-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.
225
-
226
-## Audio Adapter Parameters  @IDX@ client.conf
227
-
228
-An audio stream (and also audio device nodes) contain an audio adapter that can perform,
229
-sample format, sample rate and channel mixing operations.
230
-
231
-### Merger Parameters
232
-
233
-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. 
234
-
235
-The merger will also provide the monitor ports of the input channels and can
236
-apply a software volume on the monitor signal.
237
-
238
-@PAR@ client.conf  monitor.channel-volumes = false
239
-The volume of the input channels is applied to the volume of the monitor ports. Normally
240
-the monitor ports expose the raw unmodified signal on the input ports.
241
-
242
-### Resampler Parameters
243
-
244
-Source, sinks, capture and playback streams contain a high quality adaptive resampler.
245
-It uses sinc(https://ccrma.stanford.edu/~jos/resample/resample.pdf) based resampling
246
-with linear interpolation of filter banks to perform arbitrary
247
-resample factors. The resampler is activated in the following cases:
248
-
249
-* The hardware of a device node does not support the graph samplerate. Resampling will occur
250
-  from the graph samplerate to the hardware samplerate.
251
-* The hardware clock of a device does not run at the same speed as the graph clock and adaptive
252
-  resampling is required to match the clocks.
253
-* A stream does not have the same samplerate as the graph and needs to be resampled.
254
-* An application wants to activate adaptive resampling in a stream to make it match some other
255
-  clock.
256
-
257
-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.
258
-
259
-Below is an explanation of the options that can be tuned in the sample converter.
260
-
261
-@PAR@ client.conf  resample.quality = 4
262
-\parblock
263
-The quality of the resampler. from 0 to 14, the default is 4.
264
-
265
-Increasing the quality will result in better cutoff and less aliasing at the expense of
266
-(much) more CPU consumption. The default quality of 4 has been selected as a good compromise
267
-between quality and performance with no artifacts that are well below the audible range.
268
-
269
-See Infinite Wave(https://src.infinitewave.ca/) for a comparison of the performance.
270
-\endparblock
271
-
272
-@PAR@ client.conf  resample.disable = false
273
-Disable the resampler entirely. The node will only be able to negotiate with the graph
274
-when the samplerates are compatible.
275
-
276
-### Channel Mixer Parameters
277
-
278
-Source, sinks, capture and playback streams can apply channel mixing on the incoming signal.
279
-
280
-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.
281
-
282
-Playback and capture streams are usually configured to the channel layout of the sink/source
283
-they connect to and will thus perform channel mixing.
284
-
285
-The channel mixer also implements a software volume. This volume adjustment is performed on the original
286
-channel layout. ex: A stereo playback stream that is up-mixed to 5.1 has 2 a left an right volume control.
287
-
288
-@PAR@ client.conf  channelmix.disable = false
289
-Disables the channel mixer completely. The stream will only be able to link to compatible
290
-sources/sinks with the exact same channel layout.
291
-
292
-@PAR@ client.conf  channelmix.min-volume = 0.0
293
-@PAR@ client.conf  channelmix.max-volume = 10.0
294
-Gives the min and max volume values allowed. Any volume that is set will be clamped to these
295
-values.
296
-
297
-@PAR@ client.conf  channelmix.normalize = false
298
-\parblock
299
-Makes sure that during such mixing & resampling original 0 dB level is preserved, so nothing sounds wildly quieter/louder.
300
-
301
-While this options prevents clipping, it can in some cases produce too low volume. Increase the
302
-volume in that case or disable normalization.
303
-\endparblock
304
-
305
-@PAR@ client.conf  channelmix.lock-volumes = false
306
-Completely disable volume or mute changes. Defaults to false.
307
-
308
-@PAR@ client.conf  channelmix.mix-lfe = true
309
-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.
310
-
311
-@PAR@ client.conf  channelmix.upmix = true
312
-\parblock
313
-Enables up-mixing of the front center (FC) when the target has a FC channel.
314
-The sum of the stereo channels is used and an optional lowpass filter can be used
315
-(see `channelmix.fc-cutoff`).
316
-
317
-Also enabled up-mixing of LFE when `channelmix.lfe-cutoff` is set to something else than 0 and
318
-the target has an LFE channel. The LFE channel is produced by adding the stereo channels.
319
-
320
-If `channelmix.upmix` is true, the up-mixing of the rear channels is also enabled and controlled
321
-with the `channelmix-upmix-method` property.
322
-\endparblock
323
-
324
-@PAR@ client.conf  channelmix.upmix-method = psd
325
-\parblock
326
-3 methods are provided to produce the rear channels in a surround sound:
327
-
328
-1. none. No rear channels are produced.
329
-
330
-2. simple. Front channels are copied to the rear. This is fast but can produce phasing effects.
331
-
332
-3. psd. The rear channels as produced from the front left and right ambient sound (the
333
-difference between the channels). A delay and optional phase shift are added to the rear signal
334
-to make the sound bigger. 
335
-\endparblock
336
-
337
-@PAR@ client.conf  channelmix.lfe-cutoff = 150
338
-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.
339
-
340
-@PAR@ client.conf  channelmix.fc-cutoff = 12000
341
-\parblock
342
-Apply a lowpass filter to the front center frequency. The value is expressed in Hz.
343
-
344
-Since the front center contains the dialogs, a typical cutoff frequency is 12000 Hz.
345
-
346
-This option is only active when the up-mix is enabled.
347
-\endparblock
348
-
349
-@PAR@ client.conf  channelmix.rear-delay = 12.0
350
-\parblock
351
-Apply a delay in milliseconds when up-mixing the rear channels. This improves
352
-specialization of the sound. A typical delay of 12 milliseconds is the default.
353
-
354
-This is only active when the `psd` up-mix method is used.
355
-\endparblock
356
-
357
-@PAR@ client.conf  channelmix.stereo-widen = 0.0
358
-\parblock
359
-Subtracts some of the front center signal from the stereo channels. This moves the dialogs
360
-more to the center speaker and leaves the ambient sound in the stereo channels.
361
-
362
-This is only active when up-mix is enabled and a Front Center channel is mixed.
363
-\endparblock
364
-
365
-@PAR@ client.conf  channelmix.hilbert-taps = 0
366
-\parblock
367
-This option will apply a 90 degree phase shift to the rear channels to improve specialization.
368
-Taps needs to be between 15 and 255 with more accurate results (and more CPU consumption)
369
-for higher values.
370
-
371
-This is only active when the `psd` up-mix method is used.
372
-\endparblock
373
-
374
-@PAR@ client.conf  dither.noise = 0
375
-\parblock
376
-This option will add N bits of random data to the signal. When no dither.method is
377
-specified, the random data will flip between -(1<<(N-1)), 0 every 1024 samples. With
378
-a dither.method, the dither noise is amplified with 1<<(N-1) bits.
379
-
380
-This can be used to keep some amplifiers alive during silent periods. One or two bits of noise is
381
-usually enough, otherwise the noise will become audible. This is usually used together with
382
-`session.suspend-timeout-seconds` to disable suspend in the session manager.
383
-
384
-Note that PipeWire uses floating point operations with 24 bits precission for all of the audio
385
-processing. Conversion to 24 bits integer sample formats is lossless and conversion to 32 bits
386
-integer sample formats are simply padded with 0 bits at the end. This means that the dither noise
387
-is always only in the 24 most significant bits.
388
-\endparblock
389
-
390
-@PAR@ client.conf  dither.method = none
391
-\parblock
392
-Optional dithering(https://en.wikipedia.org/wiki/Dither) can be done on the quantized
393
-output signal.
394
-
395
-There are 6 modes available:
396
-
397
-1. none           No dithering is done.
398
-2. rectangular    Dithering with a rectangular noise distribution. This adds random
399
-                  bits in the -0.5, 0.5 range to the signal with even distribution.
400
-3. triangular     Dithering with a triangular noise distribution. This add random
401
-                  bits in the -1.0, 1.0 range to the signal with triangular distribution
402
-                  around 0.0.
403
-4. triangular-hf  Dithering with a sloped triangular noise distribution.
404
-5. wannamaker3    Additional noise shaping is performed on the sloped triangular
405
-                  dithering to move the noise to the more inaudible range. This is using
406
-                  the "F-Weighted" noise filter described by Wannamaker.
407
-6. shaped5        Additional noise shaping is performed on the triangular dithering
408
-                  to move the noise to the more inaudible range. This is using the
409
-                  Lipshitz filter.
410
-
411
-Dithering is only useful for conversion to a format with less than 24 bits and will be
412
-disabled otherwise.
413
-\endparblock
414
-
415
-## Debug Parameters
416
-
417
-@PAR@ client.conf  debug.wav-path = ""
418
-Make the stream to also write the raw samples to a WAV file for debugging purposes.
419
-
420
-## Format Properties
421
-
422
-Streams and also most device nodes can be configured in a certain format with properties.
423
-
424
-@PAR@ client.conf  audio.rate = RATE
425
-Forces a samplerate on the node.
426
-
427
-@PAR@ client.conf  audio.channels = INTEGER
428
-The number of audio channels to use. Must be a value between 1 and 64.
429
-
430
-@PAR@ client.conf  audio.format = FORMAT
431
-\parblock
432
-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.
433
-
434
-Valid formats include: S16, S32, F32, F64, S16LE, S16BE, ...
435
-\endparblock
436
-
437
-@PAR@ client.conf  audio.allowed-rates
438
-An array of allowed samplerates for the node. ex. " 44100 48000 "
439
+A list of object properties that can be applied to streams can be found in
440
+\ref props__common_node_properties "pipewire-props(7) Common Node Properties"
441
+and
442
+\ref props__audio_converter_properties "pipewire-props(7) Audio Adapter Properties"
443
 
444
 # STREAM RULES  @IDX@ client.conf
445
 
446
@@ -537,7 +120,9 @@
447
 Add a `stream.rules` or `filter.rules` section in the config file like
448
 this:
449
 
450
-```
451
+```css
452
+# ~/.config/pipewire/client.conf.d/custom.conf
453
+
454
 stream.rules = 
455
     {
456
         matches = 
457
@@ -557,11 +142,14 @@
458
 
459
 Will set the node.name of Firefox to "My Name".
460
 
461
-# ALSA PROPERTIES  @IDX@ client.conf
462
+# ALSA CLIENT PROPERTIES  @IDX@ client.conf
463
 
464
-An `alsa.properties` section can be added to configure ALSA specific client config.
465
+An `alsa.properties` section can be added to configure client applications
466
+that connect via the PipeWire ALSA plugin.
467
 
468
 ```css
469
+# ~/.config/pipewire/client-rt.conf.d/custom.conf
470
+
471
 alsa.properties = {
472
     #alsa.deny = false
473
     #alsa.format = 0
474
@@ -596,14 +184,17 @@
475
 This controls the volume curve used on the ALSA mixer. Possible values are `cubic` and
476
 `linear`. The default is to use `cubic`.
477
 
478
-# ALSA RULES  @IDX@ client.conf
479
+# ALSA CLIENT RULES  @IDX@ client.conf
480
 
481
 It is possible to set ALSA client specific properties by using
482
 \ref pipewire_conf__match_rules "Match rules, see pipewire(1)". You can
483
 set any of the above ALSA properties or any of the `stream.properties`.
484
 
485
 ### Example
486
-```
487
+
488
+```css
489
+# ~/.config/pipewire/client-rt.conf.d/custom.conf
490
+
491
 alsa.rules = 
492
     {   matches =  { application.process.binary = "resolve" } 
493
         actions = {
494
_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
24
 
1
@@ -41,8 +41,9 @@
2
 # JACK PROPERTIES  @IDX@ jack.conf
3
 
4
 The configuration file can contain an extra JACK specific section called `jack.properties` like this:
5
-```
6
-...
7
+```css
8
+# ~/.config/pipewire/jack.conf.d/custom.conf
9
+
10
 jack.properties = {
11
     #rt.prio             = 88
12
     #node.latency        = 1024/48000
13
@@ -204,7 +205,9 @@
14
 
15
 Add a `jack.rules` section in the config file like this:
16
 
17
-```
18
+```css
19
+# ~/.config/pipewire/jack.conf.d/custom.conf
20
+
21
 jack.rules = 
22
     {
23
         matches = 
24
_service:download_url:pipewire-1.2.6.tar.bz2/doc/dox/config/pipewire-props.7.md Added
1157
 
1
@@ -0,0 +1,1155 @@
2
+\page page_man_pipewire-props_7 pipewire-props
3
+
4
+PipeWire object property reference.
5
+
6
+\tableofcontents
7
+
8
+# DESCRIPTION
9
+
10
+PipeWire describes and configures audio and video elements with
11
+objects of the following main types:
12
+
13
+\par Node
14
+Audio or video sink/source endpoint
15
+
16
+\par Device
17
+Sound cards, bluetooth devices, cameras, etc. May have multiple nodes.
18
+
19
+\par Monitor
20
+Finding devices and handling hotplugging
21
+
22
+\par Port
23
+Audio/video endpoint in a node
24
+
25
+\par Link
26
+Connection between ports, that transporting audio/video between them.
27
+
28
+\par Client
29
+Application connected to PipeWire.
30
+
31
+All objects have *properties* ("props"), most of which can be set in
32
+configuration files or at runtime when the object is created.
33
+
34
+Some of the properties are "common properties" (for example
35
+`node.description`) and can be set on all objects of the given
36
+type. Other properties control settings of a specific kinds of device
37
+or node (ALSA, Bluetooth, ...), and have meaning only for those
38
+objects.
39
+
40
+Usually, all the properties are configured in the session manager
41
+configuration.  For how to configure them, see the session manager
42
+documentation. In minimal PipeWire setups without a session manager,
43
+they can be configured via
44
+\ref pipewire_conf__context_objects "context.objects in pipewire.conf(5)".
45
+
46
+\see WirePlumber configuration(https://pipewire.pages.freedesktop.org/wireplumber/daemon/configuration.html)
47
+
48
+# COMMON DEVICE PROPERTIES  @IDX@ props
49
+
50
+These are common properties for devices.
51
+
52
+@PAR@ device-prop  device.name    # string
53
+A (unique) name for the device. It can be used by command-line and other tools to identify the device.
54
+
55
+@PAR@ device-prop  device.param.PARAM = { ... }   # JSON
56
+\parblock
57
+Set value of a device \ref spa_param_type "Param" to a JSON value when the device is loaded.
58
+This works similarly as \ref page_man_pw-cli_1 "pw-cli(1)" `set-param` command.
59
+The `PARAM` should be replaced with the name of the Param to set,
60
+ie. for example `device.Param.Props = { ... }` to set `Props`.
61
+\endparblock
62
+
63
+@PAR@ device-prop  device.plugged # integer
64
+\parblock
65
+\copydoc PW_KEY_DEVICE_PLUGGED
66
+\endparblock
67
+
68
+@PAR@ device-prop  device.nick # string
69
+\parblock
70
+\copydoc PW_KEY_DEVICE_NICK
71
+\endparblock
72
+
73
+@PAR@ device-prop  device.description # string
74
+\parblock
75
+\copydoc PW_KEY_DEVICE_DESCRIPTION
76
+\endparblock
77
+
78
+@PAR@ device-prop  device.serial # string
79
+\parblock
80
+\copydoc PW_KEY_DEVICE_SERIAL
81
+\endparblock
82
+
83
+@PAR@ device-prop  device.vendor.id # integer
84
+\parblock
85
+\copydoc PW_KEY_DEVICE_VENDOR_ID
86
+\endparblock
87
+
88
+@PAR@ device-prop  device.vendor.name # string
89
+\parblock
90
+\copydoc PW_KEY_DEVICE_VENDOR_NAME
91
+\endparblock
92
+
93
+@PAR@ device-prop  device.product.id # integer
94
+\parblock
95
+\copydoc PW_KEY_DEVICE_PRODUCT_NAME
96
+\endparblock
97
+
98
+@PAR@ device-prop  device.product.name # string
99
+\parblock
100
+\copydoc PW_KEY_DEVICE_PRODUCT_ID
101
+\endparblock
102
+
103
+@PAR@ device-prop  device.class # string
104
+\parblock
105
+\copydoc PW_KEY_DEVICE_CLASS
106
+\endparblock
107
+
108
+@PAR@ device-prop  device.form-factor # string
109
+\parblock
110
+\copydoc PW_KEY_DEVICE_FORM_FACTOR
111
+\endparblock
112
+
113
+@PAR@ device-prop  device.icon # string
114
+\parblock
115
+\copydoc PW_KEY_DEVICE_ICON
116
+\endparblock
117
+
118
+@PAR@ device-prop  device.icon-name # string
119
+\parblock
120
+\copydoc PW_KEY_DEVICE_ICON_NAME
121
+\endparblock
122
+
123
+@PAR@ device-prop  device.intended-roles # string
124
+\parblock
125
+\copydoc PW_KEY_DEVICE_INTENDED_ROLES
126
+\endparblock
127
+
128
+@PAR@ device-prop  device.disabled = false  # boolean
129
+Disable the creation of this device in session manager.
130
+
131
+
132
+There are other common `device.*` properties for technical purposes
133
+and not usually user-configurable.
134
+
135
+\see pw_keys in the API documentation for a full list.
136
+
137
+# COMMON NODE PROPERTIES @IDX@ props
138
+
139
+The properties here apply to general audio or video input/output
140
+streams, and other nodes such as sinks or sources corresponding to
141
+real or virtual devices.
142
+
143
+## Identifying Properties  @IDX@ props
144
+
145
+These contain properties to identify the node or to display the node in a GUI application.
146
+
147
+@PAR@ node-prop  node.name
148
+A (unique) name for the node. This is usually set on sink and sources to identify them
149
+as targets for linking by the session manager.
150
+
151
+@PAR@ node-prop  node.description
152
+A human readable description of the node or stream.
153
+
154
+@PAR@ node-prop  media.name
155
+A user readable media name, usually the artist and title.
156
+These are usually shown in user facing applications
157
+to inform the user about the current playing media.
158
+
159
+@PAR@ node-prop  media.title
160
+A user readable stream title.
161
+
162
+@PAR@ node-prop  media.artist
163
+A user readable stream artist
164
+
165
+@PAR@ node-prop  media.copyright
166
+User readable stream copyright information
167
+
168
+@PAR@ node-prop  media.software
169
+User readable stream generator software information
170
+
171
+@PAR@ node-prop  media.language
172
+Stream language in POSIX format. Ex: `en_GB`
173
+
174
+@PAR@ node-prop  media.filename
175
+File name for the stream
176
+
177
+@PAR@ node-prop  media.icon
178
+Icon for the media, a base64 blob with PNG image data
179
+
180
+@PAR@ node-prop  media.icon-name
181
+An XDG icon name for the media. Ex: `audio-x-mp3`
182
+
183
+@PAR@ node-prop  media.comment
184
+Extra stream comment
185
+
186
+@PAR@ node-prop  media.date
187
+Date of the media
188
+
189
+@PAR@ node-prop  media.format
190
+User readable stream format information
191
+
192
+@PAR@ node-prop  object.linger = false
193
+If the object should outlive its creator.
194
+
195
+@PAR@ node-prop  device.id
196
+ID of the device the node belongs to.
197
+
198
+## Classifying Properties  @IDX@ props
199
+
200
+The classifying properties of a node are use for routing the signal to its destination and
201
+for configuring the settings.
202
+
203
+@PAR@ node-prop  media.type
204
+The media type contains a broad category of the media that is being processed by the node.
205
+Possible values include "Audio", "Video", "Midi"
206
+
207
+@PAR@ node-prop  media.category
208
+\parblock
209
+What kind of processing is done with the media. Possible values include:
210
+
211
+* Playback: media playback.
212
+* Capture: media capture.
213
+* Duplex: media capture and playback or media processing in general.
214
+* Monitor: a media monitor application. Does not actively change media data but monitors
215
+           activity.
216
+* Manager: Will manage the media graph.
217
+\endparblock
218
+
219
+@PAR@ node-prop  media.role
220
+\parblock
221
+The Use case of the media. Possible values include:
222
+
223
+* Movie: Movie playback with audio and video.
224
+* Music: Music listening.
225
+* Camera: Recording video from a camera.
226
+* Screen: Recording or sharing the desktop screen.
227
+* Communication: VOIP or other video chat application.
228
+* Game: Game.
229
+* Notification: System notification sounds.
230
+* DSP: Audio or Video filters and effect processing.
231
+* Production: Professional audio processing and production.
232
+* Accessibility: Audio and Visual aid for accessibility.
233
+* Test: Test program.
234
+\endparblock
235
+
236
+@PAR@ node-prop  media.class
237
+\parblock
238
+The media class is to classify the stream function. Possible values include:
239
+
240
+* Video/Source: a producer of video, like a webcam.
241
+* Video/Sink: a consumer of video, like a display window.
242
+* Audio/Source: a source of audio samples like a microphone.
243
+* Audio/Sink: a sink for audio samples, like an audio card.
244
+* Audio/Duplex: a node that is both a sink and a source.
245
+* Stream/Output/Audio: a playback stream.
246
+* Stream/Input/Audio: a capture stream.
247
+
248
+The session manager assigns special meaning to the nodes based on the media.class. Sink or Source
249
+classes are used as targets for Stream classes, etc..
250
+\endparblock
251
+
252
+## Scheduling Properties  @IDX@ props
253
+
254
+@PAR@ node-prop  node.latency = 1024/48000
255
+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.
256
+
257
+@PAR@ node-prop  node.lock-quantum = false
258
+\parblock
259
+When this node is active, the quantum of the graph is locked and not allowed to change automatically.
260
+It can still be changed forcibly with metadata or when a node forces a quantum.
261
+
262
+JACK clients use this property to avoid unexpected quantum changes.
263
+\endparblock
264
+
265
+@PAR@ node-prop  node.force-quantum = INTEGER
266
+\parblock
267
+While the node is active, force a quantum in the graph. The last node to be activated with this property wins.
268
+
269
+A value of 0 unforces the quantum.
270
+\endparblock
271
+
272
+@PAR@ node-prop  node.rate = RATE
273
+Suggest a rate (samplerate) for the graph. The suggested rate will only be applied when doing so would not cause
274
+interruptions (devices are idle) and when the rate is in the list of allowed rates in the server.
275
+
276
+@PAR@ node-prop  node.lock-rate = false
277
+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.
278
+
279
+@PAR@ node-prop  node.force-rate = RATE
280
+\parblock
281
+When the node is active, force a specific sample rate on the graph. The last node to activate with this property wins.
282
+
283
+A RATE of 0 means to force the rate in `node.rate` denominator.
284
+\endparblock
285
+
286
+@PAR@ node-prop  node.always-process = false
287
+\parblock
288
+When the node is active, it will always be joined with a driver node, even when nothing is linked to the node.
289
+Setting this property to true also implies node.want-driver = true.
290
+
291
+This is the default for JACK nodes, that always need their process callback called.
292
+\endparblock
293
+
294
+@PAR@ node-prop  node.want-driver = true
295
+The node wants to be linked to a driver so that it can start processing. This is the default for streams
296
+and filters since 0.3.51. Nodes that are not linked to anything will still be set to the idle state,
297
+unless node.always-process is set to true.
298
+
299
+@PAR@ node-prop  node.pause-on-idle = false
300
+@PAR@ node-prop  node.suspend-on-idle = false
301
+\parblock
302
+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.
303
+
304
+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.
305
+\endparblock
306
+
307
+@PAR@ node-prop  node.loop.name = null
308
+@PAR@ node-prop  node.loop.class = data.rt
309
+\parblock
310
+Add the node to a specific loop name or loop class. By default the node is added to the
311
+data.rt loop class. You can make more specific data loops and then assign the nodes to those.
312
+
313
+Other well known names are main-loop.0 and the main node.loop.class which runs the node data processing
314
+in the main loop.
315
+\endparblock
316
+
317
+@PAR@ node-prop  priority.driver    # integer
318
+\parblock
319
+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.
320
+
321
+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.
322
+\endparblock
323
+
324
+@PAR@ node-prop  clock.name    # string
325
+\parblock
326
+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.
327
+
328
+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.
329
+
330
+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.
331
+\endparblock
332
+
333
+## Session Manager Properties  @IDX@ props
334
+
335
+@PAR@ node-prop  node.autoconnect = true
336
+Instructs the session manager to automatically connect this node to some other node, usually
337
+a sink or source.
338
+
339
+@PAR@ node-prop  node.exclusive = false
340
+If this node wants to be linked exclusively to the sink/source.
341
+
342
+@PAR@ node-prop  node.target = <node.name|object.id>
343
+Where this node should be linked to. This can be a node.name or an object.id of a node. This property is
344
+deprecated, the target.object property should be used instead, which uses the more unique object.serial as
345
+a possible target.
346
+
347
+@PAR@ node-prop  target.object = <node.name|object.serial>
348
+Where the node should link to, this can be a node.name or an object.serial.
349
+
350
+@PAR@ node-prop  node.dont-reconnect = false
351
+\parblock
352
+When the node has a target configured and the target is destroyed, destroy the node as well.
353
+This property also inhibits that the node is moved to another sink/source.
354
+
355
+Note that if a stream should appear/disappear in sync with the target, a session manager (WirePlumber) script
356
+should be written instead.
357
+\endparblock
358
+
359
+@PAR@ node-prop  node.passive = false
360
+\parblock
361
+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).
362
+
363
+This is used for filter nodes that sit in front of sinks/sources and need to suspend together with the sink/source.
364
+\endparblock
365
+
366
+@PAR@ node-prop  node.link-group = ID
367
+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.
368
+
369
+@PAR@ node-prop  stream.dont-remix = false
370
+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.
371
+
372
+@PAR@ node-prop  priority.session    # integer
373
+The priority for selecting this node as the default source or sink.
374
+
375
+## Format Properties
376
+
377
+Streams and also most device nodes can be configured in a certain format with properties.
378
+
379
+@PAR@ node-prop  audio.rate = RATE
380
+Forces a samplerate on the node.
381
+
382
+@PAR@ node-prop  audio.channels = INTEGER
383
+The number of audio channels to use. Must be a value between 1 and 64.
384
+
385
+@PAR@ node-prop  audio.format = FORMAT
386
+\parblock
387
+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.
388
+
389
+Valid formats include: S16, S32, F32, F64, S16LE, S16BE, ...
390
+\endparblock
391
+
392
+@PAR@ node-prop  audio.allowed-rates
393
+An array of allowed samplerates for the node. ex. " 44100 48000 "
394
+
395
+## Other Properties
396
+
397
+@PAR@ node-prop  node.param.PARAM = { ... }   # JSON
398
+\parblock
399
+Set value of a node \ref spa_param_type "Param" to a JSON value when the device is loaded.
400
+This works similarly as \ref page_man_pw-cli_1 "pw-cli(1)" `set-param` command.
401
+The `PARAM` should be replaced with the name of the Param to set,
402
+ie. for example `node.param.Props = { ... }` to set `Props`.
403
+\endparblock
404
+
405
+@PAR@ node-prop  node.disabled = false  # boolean
406
+Disable the creation of this node in session manager.
407
+
408
+
409
+# AUDIO ADAPTER PROPERTIES  @IDX@ props
410
+
411
+Most audio nodes (ALSA, Bluetooth, audio streams from applications,
412
+...) have common properties for the audio adapter. The adapter
413
+performs sample format, sample rate and channel mixing operations.
414
+
415
+All properties listed below are node properties.
416
+
417
+## Merger Parameters
418
+
419
+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.
420
+
421
+The merger will also provide the monitor ports of the input channels and can
422
+apply a software volume on the monitor signal.
423
+
424
+@PAR@ node-prop  monitor.channel-volumes = false
425
+The volume of the input channels is applied to the volume of the monitor ports. Normally
426
+the monitor ports expose the raw unmodified signal on the input ports.
427
+
428
+## Resampler Parameters
429
+
430
+Source, sinks, capture and playback streams contain a high quality adaptive resampler.
431
+It uses sinc(https://ccrma.stanford.edu/~jos/resample/resample.pdf) based resampling
432
+with linear interpolation of filter banks to perform arbitrary
433
+resample factors. The resampler is activated in the following cases:
434
+
435
+* The hardware of a device node does not support the graph samplerate. Resampling will occur
436
+  from the graph samplerate to the hardware samplerate.
437
+* The hardware clock of a device does not run at the same speed as the graph clock and adaptive
438
+  resampling is required to match the clocks.
439
+* A stream does not have the same samplerate as the graph and needs to be resampled.
440
+* An application wants to activate adaptive resampling in a stream to make it match some other
441
+  clock.
442
+
443
+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.
444
+
445
+Below is an explanation of the options that can be tuned in the sample converter.
446
+
447
+@PAR@ node-prop  resample.quality = 4
448
+\parblock
449
+The quality of the resampler. from 0 to 14, the default is 4.
450
+
451
+Increasing the quality will result in better cutoff and less aliasing at the expense of
452
+(much) more CPU consumption. The default quality of 4 has been selected as a good compromise
453
+between quality and performance with no artifacts that are well below the audible range.
454
+
455
+See Infinite Wave(https://src.infinitewave.ca/) for a comparison of the performance.
456
+\endparblock
457
+
458
+@PAR@ node-prop  resample.disable = false
459
+Disable the resampler entirely. The node will only be able to negotiate with the graph
460
+when the samplerates are compatible.
461
+
462
+## Channel Mixer Parameters
463
+
464
+Source, sinks, capture and playback streams can apply channel mixing on the incoming signal.
465
+
466
+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.
467
+
468
+Playback and capture streams are usually configured to the channel layout of the sink/source
469
+they connect to and will thus perform channel mixing.
470
+
471
+The channel mixer also implements a software volume. This volume adjustment is performed on the original
472
+channel layout. ex: A stereo playback stream that is up-mixed to 5.1 has 2 a left an right volume control.
473
+
474
+@PAR@ node-prop  channelmix.disable = false
475
+Disables the channel mixer completely. The stream will only be able to link to compatible
476
+sources/sinks with the exact same channel layout.
477
+
478
+@PAR@ node-prop  channelmix.min-volume = 0.0
479
+@PAR@ node-prop  channelmix.max-volume = 10.0
480
+Gives the min and max volume values allowed. Any volume that is set will be clamped to these
481
+values.
482
+
483
+@PAR@ node-prop  channelmix.normalize = false
484
+\parblock
485
+Makes sure that during such mixing & resampling original 0 dB level is preserved, so nothing sounds wildly quieter/louder.
486
+
487
+While this options prevents clipping, it can in some cases produce too low volume. Increase the
488
+volume in that case or disable normalization.
489
+\endparblock
490
+
491
+@PAR@ node-prop  channelmix.lock-volumes = false
492
+Completely disable volume or mute changes. Defaults to false.
493
+
494
+@PAR@ node-prop  channelmix.mix-lfe = true
495
+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.
496
+
497
+@PAR@ node-prop  channelmix.upmix = true
498
+\parblock
499
+Enables up-mixing of the front center (FC) when the target has a FC channel.
500
+The sum of the stereo channels is used and an optional lowpass filter can be used
501
+(see `channelmix.fc-cutoff`).
502
+
503
+Also enabled up-mixing of LFE when `channelmix.lfe-cutoff` is set to something else than 0 and
504
+the target has an LFE channel. The LFE channel is produced by adding the stereo channels.
505
+
506
+If `channelmix.upmix` is true, the up-mixing of the rear channels is also enabled and controlled
507
+with the `channelmix-upmix-method` property.
508
+\endparblock
509
+
510
+@PAR@ node-prop  channelmix.upmix-method = psd
511
+\parblock
512
+3 methods are provided to produce the rear channels in a surround sound:
513
+
514
+1. none. No rear channels are produced.
515
+
516
+2. simple. Front channels are copied to the rear. This is fast but can produce phasing effects.
517
+
518
+3. psd. The rear channels as produced from the front left and right ambient sound (the
519
+difference between the channels). A delay and optional phase shift are added to the rear signal
520
+to make the sound bigger.
521
+\endparblock
522
+
523
+@PAR@ node-prop  channelmix.lfe-cutoff = 150
524
+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.
525
+
526
+@PAR@ node-prop  channelmix.fc-cutoff = 12000
527
+\parblock
528
+Apply a lowpass filter to the front center frequency. The value is expressed in Hz.
529
+
530
+Since the front center contains the dialogs, a typical cutoff frequency is 12000 Hz.
531
+
532
+This option is only active when the up-mix is enabled.
533
+\endparblock
534
+
535
+@PAR@ node-prop  channelmix.rear-delay = 12.0
536
+\parblock
537
+Apply a delay in milliseconds when up-mixing the rear channels. This improves
538
+specialization of the sound. A typical delay of 12 milliseconds is the default.
539
+
540
+This is only active when the `psd` up-mix method is used.
541
+\endparblock
542
+
543
+@PAR@ node-prop  channelmix.stereo-widen = 0.0
544
+\parblock
545
+Subtracts some of the front center signal from the stereo channels. This moves the dialogs
546
+more to the center speaker and leaves the ambient sound in the stereo channels.
547
+
548
+This is only active when up-mix is enabled and a Front Center channel is mixed.
549
+\endparblock
550
+
551
+@PAR@ node-prop  channelmix.hilbert-taps = 0
552
+\parblock
553
+This option will apply a 90 degree phase shift to the rear channels to improve specialization.
554
+Taps needs to be between 15 and 255 with more accurate results (and more CPU consumption)
555
+for higher values.
556
+
557
+This is only active when the `psd` up-mix method is used.
558
+\endparblock
559
+
560
+@PAR@ node-prop  dither.noise = 0
561
+\parblock
562
+This option will add N bits of random data to the signal. When no dither.method is
563
+specified, the random data will flip between -(1<<(N-1)), 0 every 1024 samples. With
564
+a dither.method, the dither noise is amplified with 1<<(N-1) bits.
565
+
566
+This can be used to keep some amplifiers alive during silent periods. One or two bits of noise is
567
+usually enough, otherwise the noise will become audible. This is usually used together with
568
+`session.suspend-timeout-seconds` to disable suspend in the session manager.
569
+
570
+Note that PipeWire uses floating point operations with 24 bits precission for all of the audio
571
+processing. Conversion to 24 bits integer sample formats is lossless and conversion to 32 bits
572
+integer sample formats are simply padded with 0 bits at the end. This means that the dither noise
573
+is always only in the 24 most significant bits.
574
+\endparblock
575
+
576
+@PAR@ node-prop  dither.method = none
577
+\parblock
578
+Optional dithering(https://en.wikipedia.org/wiki/Dither) can be done on the quantized
579
+output signal.
580
+
581
+There are 6 modes available:
582
+
583
+1. none           No dithering is done.
584
+2. rectangular    Dithering with a rectangular noise distribution. This adds random
585
+                  bits in the -0.5, 0.5 range to the signal with even distribution.
586
+3. triangular     Dithering with a triangular noise distribution. This add random
587
+                  bits in the -1.0, 1.0 range to the signal with triangular distribution
588
+                  around 0.0.
589
+4. triangular-hf  Dithering with a sloped triangular noise distribution.
590
+5. wannamaker3    Additional noise shaping is performed on the sloped triangular
591
+                  dithering to move the noise to the more inaudible range. This is using
592
+                  the "F-Weighted" noise filter described by Wannamaker.
593
+6. shaped5        Additional noise shaping is performed on the triangular dithering
594
+                  to move the noise to the more inaudible range. This is using the
595
+                  Lipshitz filter.
596
+
597
+Dithering is only useful for conversion to a format with less than 24 bits and will be
598
+disabled otherwise.
599
+\endparblock
600
+
601
+## Debug Parameters
602
+
603
+@PAR@ node-prop  debug.wav-path = ""
604
+Make the stream to also write the raw samples to a WAV file for debugging purposes.
605
+
606
+## Other Parameters
607
+
608
+These control low-level technical features:
609
+
610
+@PAR@ node-prop  clock.quantum-limit
611
+\ref pipewire_conf__default_clock_quantum-limit "See pipewire.conf(5)"
612
+
613
+@PAR@ node-prop  resample.peaks = false # boolean
614
+Instead of actually resampling, produce peak amplitude values as output.
615
+This is used for volume monitoring, where it is set as a property
616
+of the "recording" stream.
617
+
618
+@PAR@ node-prop  resample.prefill = false # boolean
619
+Prefill resampler buffers with silence. This affects the initial
620
+samples produced by the resampler.
621
+
622
+@PAR@ node-prop  adapter.auto-port-config = null # JSON
623
+\parblock
624
+If specified, configure the ports of the node when it is created, instead of
625
+leaving that to the session manager to do. This is useful (only) for minimal
626
+configurations without a session manager.
627
+
628
+Value is SPA JSON of the form:
629
+```json
630
+{
631
+    mode = "none",          # "none", "passthrough", "convert", "dsp"
632
+    monitor = false,        # boolean
633
+    control = false,        # boolean
634
+    position = "preserve"   # "unknown", "aux", "preserve"
635
+}
636
+```
637
+See \ref spa_param_port_config for the meaning.
638
+\endparblock
639
+
640
+# ALSA PROPERTIES  @IDX@ props
641
+
642
+## Monitor properties
643
+
644
+@PAR@ monitor-prop  alsa.use-acp    # boolean
645
+Use \ref monitor-prop__alsa_card_profiles "ALSA Card Profiles" (ACP) for device configuration.
646
+
647
+@PAR@ monitor-prop  alsa.udev.expose-busy    # boolean
648
+Expose the ALSA card even if it is busy/in use. Default false. This can be useful when some
649
+of the PCMs are in use by other applications but the other free PCMs should still be exposed.
650
+
651
+## Device properties
652
+
653
+@PAR@ device-prop  api.alsa.path    # string
654
+ALSA device path as can be used in snd_pcm_open() and snd_ctl_open().
655
+
656
+@PAR@ device-prop api.alsa.use-ucm = true  # boolean
657
+\parblock
658
+When ACP is enabled and a UCM configuration is available for a device, by
659
+default it is used instead of the ACP profiles. This option allows you to
660
+disable this and use the ACP profiles instead.
661
+
662
+This option does nothing if `api.alsa.use-acp` is set to `false`.
663
+\endparblock
664
+
665
+@PAR@ device-prop  api.alsa.soft-mixer = false  # boolean
666
+Setting this option to `true` will disable the hardware mixer for volume
667
+control and mute. All volume handling will then use software volume and mute,
668
+leaving the hardware mixer untouched. The hardware mixer will still be used
669
+to mute unused audio paths in the device.
670
+
671
+@PAR@ device-prop  api.alsa.ignore-dB = false  # boolean
672
+Setting this option to `true` will ignore the decibel setting configured by
673
+the driver. Use this when the driver reports wrong settings.
674
+
675
+@PAR@ device-prop  device.profile-set  # string
676
+This option can be used to select a custom ACP profile-set name for the
677
+device. This can be configured in UDev rules, but it can also be specified
678
+here. The default is to use "default.conf" unless there is a matching udev rule.
679
+
680
+@PAR@ device-prop  device.profile  # string
681
+The initial active profile name. The default is to start from the "Off"
682
+profile and then let session manager select the best profile based on its
683
+policy.
684
+
685
+@PAR@ device-prop  api.acp.auto-profile = true  # boolean
686
+Automatically select the best profile for the device. The session manager
687
+usually disables this, as it handles this task instead. This can be
688
+enabled in custom configurations without the session manager handling this.
689
+
690
+@PAR@ device-prop  api.acp.auto-port = true  # boolean
691
+Automatically select the highest priority port that is available ("port" is a
692
+PulseAudio/ACP term, the equivalent of a "Route" in PipeWire). The session manager
693
+usually disables this, as it handles this task instead. This can be
694
+enabled in custom configurations without the session manager handling this.
695
+
696
+@PAR@ device-prop  api.acp.probe-rate   # integer
697
+Sets the samplerate used for probing the ALSA devices and collecting the
698
+profiles and ports.
699
+
700
+@PAR@ device-prop  api.acp.pro-channels  # integer
701
+Sets the number of channels to use when probing the "Pro Audio" profile.
702
+Normally, the maximum amount of channels will be used but with this setting
703
+this can be reduced, which can make it possible to use other samplerates on
704
+some devices.
705
+
706
+## Node properties
707
+
708
+@PAR@ node-prop  audio.channels    # integer
709
+The number of audio channels to open the device with. Defaults depends on the profile of the device.
710
+
711
+@PAR@ node-prop  audio.rate    # integer
712
+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.
713
+
714
+@PAR@ node-prop  audio.format    # string
715
+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.
716
+
717
+@PAR@ node-prop  audio.position    # JSON array of strings
718
+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 ".
719
+
720
+@PAR@ node-prop  audio.allowed-rates    # JSON array of integers
721
+\parblock
722
+The allowed audio rates to open the device with. Default is " ", which means the device can be opened in any supported rate.
723
+
724
+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.
725
+\endparblock
726
+
727
+@PAR@ node-prop  api.alsa.period-size    # integer
728
+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.
729
+
730
+@PAR@ node-prop  api.alsa.period-num    # integer
731
+The amount of periods to use in the device. By default this is 0, which means to use as many as possible.
732
+
733
+@PAR@ node-prop  api.alsa.headroom    # integer
734
+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.
735
+
736
+@PAR@ node-prop  api.alsa.start-delay = 0  # integer
737
+Some devices need some time before they can report accurate hardware pointer
738
+positions. In those cases, an extra start delay can be added to compensate
739
+for this startup delay. This sets the startup delay in samples.
740
+
741
+@PAR@ node-prop  api.alsa.disable-mmap = false    # boolean
742
+Disable mmap operation of the device and use the ALSA read/write API instead. Default is false, mmap is preferred.
743
+
744
+@PAR@ node-prop  api.alsa.disable-batch    # boolean
745
+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.
746
+
747
+@PAR@ node-prop  api.alsa.use-chmap    # boolean
748
+Use the driver provided channel map. Default is true when using UCM, false otherwise because many driver don't report this correctly.
749
+
750
+@PAR@ node-prop  api.alsa.multi-rate    # boolean
751
+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.
752
+
753
+@PAR@ node-prop  api.alsa.htimestamp = false    # boolean
754
+Use ALSA htimestamps in scheduling, instead of the system clock.
755
+Some ALSA drivers produce bad timestamps, so this is not enabled by default
756
+and will be disabled at runtime if it looks like the ALSA timestamps are bad.
757
+
758
+@PAR@ node-prop  api.alsa.htimestamp.max-errors    # integer
759
+Specify the number of consecutive errors before htimestamp is disabled.
760
+Setting this to 0 makes htimestamp never get disabled.
761
+
762
+@PAR@ node-prop  api.alsa.disable-tsched = false    # boolean
763
+Disable timer-based scheduling, and use IRQ for scheduling instead.
764
+The "Pro Audio" profile will usually enable this setting, if it is expected it works on the hardware.
765
+
766
+@PAR@ node-prop  api.alsa.auto-link = false    # boolean
767
+Link follower PCM devices to the driver PCM device when using IRQ-based scheduling.
768
+The "Pro Audio" profile will usually enable this setting, if it is expected it works on the hardware.
769
+
770
+@PAR@ node-prop  latency.internal.rate    # integer
771
+Static set the device systemic latency, in samples at playback rate.
772
+
773
+@PAR@ node-prop  latency.internal.ns    # integer
774
+Static set the device systemic latency, in nanoseconds.
775
+
776
+@PAR@ node-prop  api.alsa.path    # string
777
+UNDOCUMENTED
778
+
779
+@PAR@ node-prop  api.alsa.open.ucm    # boolean
780
+Open device using UCM.
781
+
782
+@PAR@ node-prop  api.alsa.bind-ctls    # boolean
783
+UNDOCUMENTED
784
+
785
+@PAR@ node-prop  iec958.codecs    # JSON array of string
786
+Enable only specific IEC958 codecs. This can be used to disable some codecs the hardware supports.
787
+Available values: PCM, AC3, DTS, MPEG, MPEG2-AAC, EAC3, TRUEHD, DTSHD
788
+
789
+# BLUETOOTH PROPERTIES  @IDX@ props
790
+
791
+## Monitor properties
792
+
793
+The following are settings for the Bluetooth device monitor, not device or
794
+node properties:
795
+
796
+@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
797
+\parblock
798
+Enabled roles.
799
+
800
+Currently some headsets (Sony WH-1000XM3) are not working with
801
+both hsp_ag and hfp_ag enabled, so by default we enable only HFP.
802
+
803
+Supported roles:
804
+- `hsp_hs` (HSP Headset),
805
+- `hsp_ag` (HSP Audio Gateway),
806
+- `hfp_hf` (HFP Hands-Free),
807
+- `hfp_ag` (HFP Audio Gateway)
808
+- `a2dp_sink` (A2DP Audio Sink)
809
+- `a2dp_source` (A2DP Audio Source)
810
+- `bap_sink` (LE Audio Basic Audio Profile Sink)
811
+- `bap_source` (LE Audio Basic Audio Profile Source)
812
+- `bap_bcast_sink` (LE Audio Basic Audio Profile Broadcast Sink)
813
+- `bap_bcast_source` (LE Audio Basic Audio Profile Broadcast Source)
814
+\endparblock
815
+
816
+@PAR@ monitor-prop  bluez5.codecs   # JSON array of string
817
+Enabled A2DP codecs (default: all).  Possible values: `sbc`, `sbc_xq`,
818
+`aac`, `aac_eld`, `aptx`, `aptx_hd`, `aptx_ll`, `aptx_ll_duplex`,
819
+`faststream`, `faststream_duplex`, `lc3plus_h3`, `ldac`, `opus_05`,
820
+`opus_05_51`, `opus_05_71`, `opus_05_duplex`, `opus_05_pro`, `opus_g`,
821
+`lc3`.
822
+
823
+@PAR@ monitor-prop  bluez5.default.rate   # integer
824
+Default audio rate.
825
+
826
+@PAR@ monitor-prop  bluez5.default.channels   # integer
827
+Default audio channels.
828
+
829
+@PAR@ monitor-prop  bluez5.hfphsp-backend   # integer
830
+HFP/HSP backend (default: native). Available values: any, none, hsphfpd, ofono, native
831
+
832
+@PAR@ monitor-prop  bluez5.hfphsp-backend-native-modem   # string
833
+
834
+@PAR@ monitor-prop  bluez5.dummy-avrcp player   # boolean
835
+Register dummy AVRCP player. Some devices have wrongly functioning
836
+volume or playback controls if this is not enabled. Default: false
837
+
838
+@PAR@ monitor-prop  bluez5.enable-sbc-xq   # boolean
839
+Override device quirk list and enable SBC-XQ for devices for which it is disabled.
840
+
841
+@PAR@ monitor-prop  bluez5.enable-msbc   # boolean
842
+Override device quirk list and enable MSBC for devices for which it is disabled.
843
+
844
+@PAR@ monitor-prop  bluez5.enable-hw-volume   # boolean
845
+Override device quirk list and enable hardware volume fo devices for which it is disabled.
846
+
847
+@PAR@ monitor-prop  bluez5.hw-offload-sco   # boolean
848
+\parblock
849
+HFP/HSP hardware offload SCO support (default: false).
850
+
851
+This feature requires a custom configuration that routes SCO audio to ALSA nodes,
852
+in a platform-specific way. See `tests/examples/bt-pinephone.lua` in WirePlumber for an example.
853
+Do not enable this setting if you don't know what all this means, as it won't work.
854
+\endparblock
855
+
856
+@PAR@ monitor-prop  bluez5.a2dp.opus.pro.channels = 3   # integer
857
+PipeWire Opus Pro audio profile channel count.
858
+
859
+@PAR@ monitor-prop  bluez5.a2dp.opus.pro.coupled-streams = 1   # integer
860
+PipeWire Opus Pro audio profile coupled stream count.
861
+
862
+@PAR@ monitor-prop  bluez5.a2dp.opus.pro.locations = "FL,FR,LFE"   # string
863
+PipeWire Opus Pro audio profile audio channel locations.
864
+
865
+@PAR@ monitor-prop  bluez5.a2dp.opus.pro.max-bitrate = 600000   # integer
866
+PipeWire Opus Pro audio profile max bitrate.
867
+
868
+@PAR@ monitor-prop  bluez5.a2dp.opus.pro.frame-dms = 50   # integer
869
+PipeWire Opus Pro audio profile frame duration (1/10 ms).
870
+
871
+@PAR@ monitor-prop  bluez5.a2dp.opus.pro.bidi.channels = 1   # integer
872
+PipeWire Opus Pro audio profile duplex channels.
873
+
874
+@PAR@ monitor-prop  bluez5.a2dp.opus.pro.bidi.coupled-streams = 0   # integer
875
+PipeWire Opus Pro audio profile duplex coupled stream count.
876
+
877
+@PAR@ monitor-prop  bluez5.a2dp.opus.pro.bidi.locations = "FC"   # string
878
+PipeWire Opus Pro audio profile duplex coupled channel locations.
879
+
880
+@PAR@ monitor-prop  bluez5.a2dp.opus.pro.bidi.max-bitrate = 160000   # integer
881
+PipeWire Opus Pro audio profile duplex max bitrate.
882
+
883
+@PAR@ monitor-prop  bluez5.a2dp.opus.pro.bidi.frame-dms = 400   # integer
884
+PipeWire Opus Pro audio profile duplex frame duration (1/10 ms).
885
+
886
+@PAR@ monitor-prop  bluez5.bcast_source.config =   # JSON
887
+\parblock
888
+Example:
889
+```
890
+bluez5.bcast_source.config = 
891
+  {
892
+    "broadcast_code": "Børne House",
893
+    "encryption: false,
894
+    "bis": 
895
+      { # BIS configuration
896
+        "qos_preset": "16_2_1", # QOS preset name from table Table 6.4 from BAP_v1.0.1.
897
+        "audio_channel_allocation": 1, # audio channel allocation configuration for the BIS
898
+        "metadata":  # metadata configurations for the BIS
899
+           { "type": 1, "value":  1, 1  }
900
+        
901
+      }
902
+    
903
+  }
904
+
905
+```
906
+\endparblock
907
+
908
+## Device properties
909
+
910
+@PAR@ device-prop  bluez5.auto-connect   # boolean
911
+Auto-connect devices on start up. Disabled by default if
912
+the property is not specified.
913
+
914
+@PAR@ device-prop  bluez5.hw-volume =  hfp_ag hsp_ag a2dp_source   # JSON array of string
915
+Profiles for which to enable hardware volume control.
916
+
917
+@PAR@ device-prop  bluez5.profile   # string
918
+Initial device profile. This usually has no effect as the session manager
919
+overrides it.
920
+
921
+@PAR@ device-prop  bluez5.a2dp.ldac.quality = "auto"   # string
922
+LDAC encoding quality
923
+Available values:
924
+- auto (Adaptive Bitrate, default)
925
+- hq   (High Quality, 990/909kbps)
926
+- sq   (Standard Quality, 660/606kbps)
927
+- mq   (Mobile use Quality, 330/303kbps)
928
+
929
+@PAR@ device-prop  bluez5.a2dp.aac.bitratemode = 0   # integer
930
+AAC variable bitrate mode.
931
+Available values: 0 (cbr, default), 1-5 (quality level)
932
+
933
+@PAR@ device-prop  bluez5.a2dp.opus.pro.application = "audio"   # string
934
+PipeWire Opus Pro Audio encoding mode: audio, voip, lowdelay
935
+
936
+@PAR@ device-prop  bluez5.a2dp.opus.pro.bidi.application = "audio"   # string
937
+PipeWire Opus Pro Audio duplex encoding mode: audio, voip, lowdelay
938
+
939
+@PAR@ device-prop  bluez5.bap.cig = "auto"   # integer, or 'auto'
940
+Set CIG ID for BAP unicast streams of the device.
941
+
942
+## Node properties
943
+
944
+@PAR@ node-prop  bluez5.media-source-role   # string
945
+\parblock
946
+Media source role for Bluetooth clients connecting to
947
+this instance. Available values:
948
+  - playback: playing stream to speakers
949
+  - input: appear as source node.
950
+\endparblock
951
+
952
+# PORT PROPERTIES  @IDX@ props
953
+
954
+Port properties are usually not directly configurable via PipeWire
955
+configuration files, as they are determined by applications creating
956
+them. Below are some port properties may interesting for users:
957
+
958
+@PAR@ port-prop  port.name # string
959
+\parblock
960
+\copydoc PW_KEY_PORT_NAME
961
+\endparblock
962
+
963
+@PAR@ port-prop  port.alias # string
964
+\parblock
965
+\copydoc PW_KEY_PORT_ALIAS
966
+\endparblock
967
+
968
+\see pw_keys in the API documentation for a full list.
969
+
970
+# LINK PROPERTIES  @IDX@ props
971
+
972
+Link properties are usually not directly configurable via PipeWire
973
+configuration files, as they are determined by applications creating
974
+them.
975
+
976
+\see pw_keys in the API documentation for a full list.
977
+
978
+# CLIENT PROPERTIES  @IDX@ props
979
+
980
+Client properties are usually not directly configurable via PipeWire
981
+configuration files, as they are determined by the application
982
+connecting to PipeWire. Clients are however affected by the settings
983
+in \ref page_man_pipewire_conf_5 "pipewire.conf(5)" and session
984
+manager settings.
985
+
986
+\note Only the properties `pipewire.*` are safe to use for security
987
+purposes such as identifying applications and their capabilities, as
988
+clients can set and change other properties freely.
989
+
990
+Below are some client properties may interesting for users.
991
+
992
+@PAR@ client-prop  application.name  # string
993
+\parblock
994
+\copydoc PW_KEY_APP_NAME
995
+\endparblock
996
+
997
+@PAR@ client-prop  application.process.id  # integer
998
+\parblock
999
+\copydoc PW_KEY_APP_PROCESS_ID
1000
+\endparblock
1001
+
1002
+@PAR@ client-prop  pipewire.sec.pid  # integer
1003
+\parblock
1004
+Client pid, set by protocol.
1005
+
1006
+Note that for PulseAudio applications, this is the PID of the
1007
+`pipewire-pulse` process.
1008
+\endparblock
1009
+
1010
+\see pw_keys in the API documentation for a full list.
1011
+
1012
+# RUNTIME SETTINGS  @IDX@ props
1013
+
1014
+Objects such as devices and nodes also have *parameters* that can be
1015
+modified after the object has been created. For example, the active
1016
+device profile, channel volumes, and so on.
1017
+
1018
+For some objects, the *parameters* also allow changing some of
1019
+the *properties*. The settings of most ALSA and virtual device parameters
1020
+can be configured also at runtime.
1021
+
1022
+These settings are available in device *parameter* called `Props` in its
1023
+`params` field. They can be seen e.g. using `pw-dump <id>` for an ALSA device:
1024
+
1025
+```json
1026
+{
1027
+...
1028
+      "Props": 
1029
+        {
1030
+          ...
1031
+          "params": 
1032
+              "audio.channels",
1033
+              2,
1034
+              "audio.rate",
1035
+              0,
1036
+              "audio.format",
1037
+              "UNKNOWN",
1038
+              "audio.position",
1039
+              " FL, FR ",
1040
+              "audio.allowed-rates",
1041
+              "  ",
1042
+              "api.alsa.period-size",
1043
+              0,
1044
+              "api.alsa.period-num",
1045
+              0,
1046
+              "api.alsa.headroom",
1047
+              0,
1048
+              "api.alsa.start-delay",
1049
+              0,
1050
+              "api.alsa.disable-mmap",
1051
+              false,
1052
+              "api.alsa.disable-batch",
1053
+              false,
1054
+              "api.alsa.use-chmap",
1055
+              false,
1056
+              "api.alsa.multi-rate",
1057
+              true,
1058
+              "latency.internal.rate",
1059
+              0,
1060
+              "latency.internal.ns",
1061
+              0,
1062
+              "clock.name",
1063
+              "api.alsa.c-1"
1064
+            
1065
+          }
1066
+...
1067
+```
1068
+
1069
+They generally have the same names and meaning as the corresponding properties.
1070
+
1071
+One or more `params` can be changed using \ref page_man_pw-cli_1 "pw-cli(1)":
1072
+```
1073
+pw-cli s <id> Props '{ params =  "api.alsa.headroom" 1024  }'
1074
+```
1075
+These settings are not saved and need to be reapplied for each session manager restart.
1076
+
1077
+# ALSA CARD PROFILES  @IDX@ props
1078
+
1079
+The sound card profiles ("Analog stereo", "Analog stereo duplex", ...) except "Pro Audio" come from two sources:
1080
+
1081
+- UCM: ALSA Use Case Manager: the profile configuration system from ALSA. See https://github.com/alsa-project/alsa-ucm-conf/
1082
+- ACP ("Alsa Card Profiles"): Pulseaudio's profile system ported to PipeWire. See https://www.freedesktop.org/wiki/Software/PulseAudio/Backends/ALSA/Profiles/
1083
+
1084
+See the above links on how to configure these systems.
1085
+
1086
+For ACP, PipeWire looks for the profile configuration files under
1087
+
1088
+- ~/.config/alsa-card-profile
1089
+- /etc/alsa-card-profile
1090
+- /usr/share/alsa-card-profile/mixer`.
1091
+
1092
+The `path` and `profile-set` files are in subdirectories `paths` and `profile-sets` of these directories.
1093
+It is possible to override individual files locally by putting a modified copy into the ACP directories under `~/.config` or `/etc`.
1094
+
1095
+# OTHER OBJECT TYPES  @IDX@ props
1096
+
1097
+Technically, PipeWire objects is what are manipulated by applications
1098
+using the PipeWire API.
1099
+
1100
+The list of object types that are usually "exported" (i.e. appear in
1101
+\ref page_man_pw-dump_1 "pw-dump(1)" output) is larger than considered
1102
+above:
1103
+
1104
+- Node
1105
+- Device
1106
+- Port
1107
+- Link
1108
+- Client
1109
+- Metadata
1110
+- Module
1111
+- Profiler
1112
+- SecurityContext
1113
+
1114
+Monitors do not appear in this list; they are not usually exported,
1115
+and technically also Device objects. They are considered above as a
1116
+separate object type because they have configurable properties.
1117
+
1118
+Metadata objects are what is manipulated with
1119
+\ref page_man_pw-metadata_1 "pw-metadata(1)"
1120
+
1121
+Modules can be loaded in configuration files, or by PipeWire
1122
+applications.
1123
+
1124
+The Profiler and SecurityContext objects only provide corresponding
1125
+PipeWire APIs.
1126
+
1127
+# INDEX {#pipewire-props__index}
1128
+
1129
+## Monitor properties
1130
+
1131
+@SECREF@ monitor-prop
1132
+
1133
+## Device properties
1134
+
1135
+@SECREF@ device-prop
1136
+
1137
+## Node properties
1138
+
1139
+@SECREF@ node-prop
1140
+
1141
+## Port properties
1142
+
1143
+@SECREF@ port-prop
1144
+
1145
+## Client properties
1146
+
1147
+@SECREF@ client-prop
1148
+
1149
+# AUTHORS
1150
+
1151
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
1152
+PipeWire is available from <$(PACKAGE_URL)>
1153
+
1154
+# SEE ALSO
1155
+
1156
+\ref page_man_pipewire_conf_5 "pipewire.conf(5)"
1157
_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
29
 
1
@@ -74,6 +74,8 @@
2
 ## Example
3
 
4
 ```css
5
+# ~/.config/pipewire/pipewire-pulse.conf.d/custom.conf
6
+
7
 stream.properties = {
8
     #node.latency = 1024/48000
9
     #node.autoconnect = true
10
@@ -124,6 +126,8 @@
11
 ## Example
12
 
13
 ```css
14
+# ~/.config/pipewire/pipewire-pulse.conf.d/custom.conf
15
+
16
 pulse.rules = 
17
     {
18
         # skype does not want to use devices that don't have an S16 sample format.
19
@@ -154,7 +158,8 @@
20
 `pipewire-pulse.conf`.
21
 
22
 ```css
23
-...
24
+# ~/.config/pipewire/pipewire-pulse.conf.d/custom.conf
25
+
26
 pulse.cmd = 
27
     { cmd = "load-module" args = "module-always-sink" flags =   }
28
     { cmd = "load-module" args = "module-switch-on-connect" }
29
_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
194
 
1
@@ -53,7 +53,9 @@
2
 A configuration file `~/.config/pipewire/pipewire.conf.d/custom.conf`
3
 to change the value of the `default.clock.min-quantum` setting in `pipewire.conf`:
4
 
5
-```css
6
+```
7
+# ~/.config/pipewire/pipewire.conf.d/custom.conf
8
+
9
 context.properties = {
10
     default.clock.min-quantum = 128
11
 }
12
@@ -172,7 +174,9 @@
13
 @PAR@ pipewire.conf  context.data-loops =  ... 
14
 This controls the data loops that will be created for the context. Is is an array of
15
 data loop specifications, one entry for each data loop to start:
16
-```json
17
+```
18
+# ~/.config/pipewire/pipewire.conf.d/custom.conf
19
+
20
 context.data-loops = 
21
     {
22
          #library.name.system = support/libspa-support
23
@@ -310,7 +314,9 @@
24
 
25
 ## Example
26
 
27
-```json
28
+```
29
+# ~/.config/pipewire/pipewire.conf.d/custom.conf
30
+
31
 context.spa-libs = {
32
     audio.convert.* = audioconvert/libspa-audioconvert
33
     avb.*           = avb/libspa-avb
34
@@ -330,7 +336,9 @@
35
 PipeWire modules to be loaded. See
36
 \ref page_man_libpipewire-modules_7 "libpipewire-modules(7)".
37
 
38
-```json
39
+```
40
+# ~/.config/pipewire/pipewire.conf.d/custom.conf
41
+
42
 context.modules = 
43
     #{ name = MODULENAME
44
     #    ( args  = { KEY = VALUE ... } )
45
@@ -361,7 +369,9 @@
46
 The `context.objects` section allows you to make some objects from factories (usually created
47
 by loading modules in `context.modules`).
48
 
49
-```json
50
+```
51
+# ~/.config/pipewire/pipewire.conf.d/custom.conf
52
+
53
 context.objects = 
54
     #{ factory = <factory-name>
55
     #    ( args  = { <key> = <value> ... } )
56
@@ -391,7 +401,9 @@
57
 This fragment creates a new dummy driver node, but only if
58
 `core.daemon` property is true:
59
 
60
-```json
61
+```
62
+# ~/.config/pipewire/pipewire.conf.d/custom.conf
63
+
64
 context.objects = 
65
     { factory = spa-node-factory
66
       args = {
67
@@ -410,7 +422,9 @@
68
 The `context.exec` section can be used to start arbitrary commands as
69
 part of the initialization of the PipeWire program.
70
 
71
-```json
72
+```
73
+# ~/.config/pipewire/pipewire.conf.d/custom.conf
74
+
75
 context.exec = 
76
     #{   path = <program-name>
77
     #    ( args = "<arguments>" |  <arg1> <arg2> ...  )
78
@@ -434,7 +448,9 @@
79
 
80
 The following fragment executes a pactl command with the given arguments:
81
 
82
-```json
83
+```
84
+# ~/.config/pipewire/pipewire.conf.d/custom.conf
85
+
86
 context.exec = 
87
     { path = "pactl" args = "load-module module-always-sink" }
88
 
89
@@ -447,7 +463,7 @@
90
 stream) is created/updated that matches certain properties.
91
 
92
 The general rules object follows the following pattern:
93
-```json
94
+```css
95
 <rules> = 
96
     {
97
         matches = 
98
@@ -494,7 +510,7 @@
99
 In the matches array, it is also possible to use regular expressions to match property values.
100
 For example, to match all nodes with a name that starts with my_, you can use the following condition:
101
 
102
-```
103
+```css
104
 matches = 
105
   {
106
     node.name = "~my_.*"
107
@@ -508,7 +524,7 @@
108
 In addition to regular expressions, you may also use the ! character to negate a condition. For
109
 example, to match all nodes with a name that does not start with my_, you can use the following condition:
110
 
111
-```
112
+```css
113
 matches = 
114
   {
115
     node.name = "!~my_.*"
116
@@ -519,7 +535,7 @@
117
 The ! character can be used with or without a regular expression. For example, to match all
118
 nodes with a name that is not equal to my_node, you can use the following condition:
119
 
120
-```
121
+```css
122
 matches = 
123
   {
124
     node.name = "!my_node"
125
@@ -530,7 +546,7 @@
126
 The null value has a special meaning; it checks if the property is not available
127
 (or unset). To check if a property is not set:
128
 
129
-```
130
+```css
131
 matches = 
132
   {
133
     node.name = null
134
@@ -540,7 +556,7 @@
135
 
136
 To check the existence of a property, one can use the !null condition, for example:
137
 
138
-```
139
+```css
140
 matches = 
141
   {
142
     node.name = "!null"
143
@@ -553,7 +569,7 @@
144
 To handle the "null" string, one needs to escape the string. For example, to check
145
 if a property has the string value "null", use:
146
 
147
-```
148
+```css
149
 matches = 
150
   {
151
     node.name = "null"
152
@@ -562,7 +578,7 @@
153
 ```
154
 To handle anything but the "null" string, use:
155
 
156
-```
157
+```css
158
 matches = 
159
   {
160
     node.name = "!\"null\""
161
@@ -583,7 +599,9 @@
162
 The `cpu.vm.name` is automatically set when running in a VM with the name of
163
 the VM. A match rule can be written to set custom properties like this:
164
 
165
-```
166
+```css
167
+# ~/.config/pipewire/pipewire.conf.d/custom.conf
168
+
169
 context.properties.rules = 
170
     {   matches =  { cpu.vm.name = !null } 
171
         actions = {
172
@@ -607,7 +625,9 @@
173
 
174
 Add a `node.rules` section in the config file like this:
175
 
176
-```
177
+```css
178
+# ~/.config/pipewire/pipewire.conf.d/custom.conf
179
+
180
 node.rules = 
181
     {
182
         matches = 
183
@@ -638,7 +658,9 @@
184
 
185
 Add a `device.rules` section in the config file like this:
186
 
187
-```
188
+```css
189
+# ~/.config/pipewire/pipewire.conf.d/custom.conf
190
+
191
 device.rules = 
192
     {
193
         matches = 
194
_service:download_url:pipewire-1.2.6.tar.bz2/doc/dox/config/xref.md Added
53
 
1
@@ -0,0 +1,51 @@
2
+\page page_config_xref Index
3
+
4
+\ref page_man_pipewire_conf_5 "pipewire.conf"
5
+
6
+@SECREF@ pipewire.conf
7
+
8
+\ref page_man_pipewire-pulse_conf_5 "pipewire-pulse.conf"
9
+
10
+@SECREF@ pipewire-pulse.conf
11
+
12
+\ref page_man_pipewire-client_conf_5 "client.conf, client-rt.conf"
13
+
14
+@SECREF@ client.conf
15
+
16
+\ref page_man_pipewire-jack_conf_5 "jack.conf"
17
+
18
+@SECREF@ jack.conf
19
+
20
+**Runtime settings**
21
+
22
+@SECREF@ pipewire-settings
23
+
24
+**Environment variables**
25
+
26
+@SECREF@ pipewire-env client-env jack-env pulse-env
27
+
28
+**Object properties**
29
+
30
+@SECREF@ props
31
+
32
+**Monitor properties**
33
+
34
+@SECREF@ monitor-prop
35
+
36
+**Device properties**
37
+
38
+@SECREF@ device-prop
39
+
40
+**Node properties**
41
+
42
+@SECREF@ node-prop
43
+
44
+**Port properties**
45
+
46
+@SECREF@ port-prop
47
+
48
+**Client properties**
49
+
50
+@SECREF@ client-prop
51
+
52
+\see pw_keys in API documentation.
53
_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
149
 
1
@@ -89,6 +89,8 @@
2
   \ref SPA_CHOICE_Enum. In this case announce the \ref SPA_PARAM_Buffers accordingly
3
   to the selected format and modifier. It is important to query the plane count
4
   of the used format modifier pair and set `SPA_PARAM_BUFFERS_blocks` accordingly.
5
+  You might also want to add the option of adding explicit sync support to the
6
+  buffers, as explained below.
7
 
8
 Note: When test allocating a buffer, collect all possible modifiers, while omitting
9
 `DRM_FORMAT_MOD_INVALID` from the \ref SPA_FORMAT_VIDEO_modifier property and
10
@@ -110,7 +112,9 @@
11
 \ref SPA_DATA_MemPtr use the fallback SHM import mechanism.
12
 If it's \ref SPA_DATA_DmaBuf
13
 get the DMA-BUF FDs (the plane count is encoded in the `n_datas` variable of the
14
-`spa_buffer` struct) and import them with the graphics API.
15
+`spa_buffer` struct) and import them with the graphics API. Note: that the n_datas
16
+might also contain extra fds for things like sync_timelime metadata, you need
17
+to take this into account when persing the planes.
18
 
19
 Note: Some graphics APIs have separated functions for the modifier-less case
20
 (`DRM_FORMAT_MOD_INVALID`) or are omitting the modifier, since it might be used
21
@@ -175,4 +179,127 @@
22
 Note: For now v4l2 uses planar buffers without modifiers. This is the reason for
23
 this special case.
24
 
25
+# Explicit sync
26
+
27
+In addition to DMABUF, a set of synchronization primitives (a SyncObjTimeline) and
28
+associated metadata can be negotiated on the buffers.
29
+
30
+The explicit sync step is performed *after* the Format has been negotiated.
31
+
32
+## Query support for explicit sync in the driver.
33
+
34
+You might first want to check that the drm render you are using is capable of explicit
35
+sync by checking support for DRM_CAP_SYNCOBJ and DRM_CAP_SYNCOBJ_TIMELINE before
36
+attempting to negotiate explicit sync.
37
+
38
+## Provide space in the buffer for explicit sync
39
+
40
+Explicit sync requires two extra fds in the buffers and an extra
41
+\ref SPA_META_SyncTimeline metadata structure.
42
+
43
+The metadata structure will only be allocated when both sides support explicit
44
+sync. We can use this to make a fallback \ref SPA_PARAM_Buffers so that we can
45
+support both explicit sync and a fallback to implicit sync.
46
+
47
+So, first announce support for \ref SPA_META_SyncTimeline by adding the
48
+\ref SPA_TYPE_OBJECT_ParamMeta object to the stream:
49
+
50
+```
51
+  paramsn_params++ = spa_pod_builder_add_object(&b,
52
+           SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
53
+           SPA_PARAM_META_type, SPA_POD_Id(SPA_META_SyncTimeline),
54
+           SPA_PARAM_META_size, SPA_POD_Int(sizeof(struct spa_meta_sync_timeline)));
55
+```
56
+
57
+Next make a \ref SPA_PARAM_Buffers that depends on the negotiation of the SyncTimelime metadata:
58
+
59
+```
60
+    spa_pod_builder_push_object(&b, &f, SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers);
61
+    spa_pod_builder_add(&b,
62
+           SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int(8, 2, MAX_BUFFERS),
63
+           SPA_PARAM_BUFFERS_blocks,  SPA_POD_Int(3),
64
+           SPA_PARAM_BUFFERS_size,    SPA_POD_Int(size),
65
+           SPA_PARAM_BUFFERS_stride,  SPA_POD_Int(data->stride),
66
+           SPA_PARAM_BUFFERS_dataType, SPA_POD_CHOICE_FLAGS_Int((1<<SPA_DATA_DmaBuf)),
67
+           0);
68
+    spa_pod_builder_prop(&b, SPA_PARAM_BUFFERS_metaType, SPA_POD_PROP_FLAG_MANDATORY);
69
+    spa_pod_builder_int(&b, 1<<SPA_META_SyncTimeline);
70
+    paramsn_params++ = spa_pod_builder_pop(&b, &f);
71
+```
72
+
73
+Note the mandatory \ref SPA_PARAM_BUFFERS_metaType with the \ref SPA_META_SyncTimeline
74
+bit set. This forces this buffer layout to be used when SyncTimeline metadata was
75
+negotiated. Also note the \ref SPA_PARAM_BUFFERS_blocks that is now set to the number
76
+of DMABUF planes + 2. In this case we have 1 plane/fd for the DMABUF and 2 fds for the
77
+SyncObjTimelines.
78
+
79
+You can also add a fallback \ref SPA_PARAM_Buffers when the \ref SPA_META_SyncTimeline
80
+was not negotiated:
81
+
82
+```
83
+    paramsn_params++ = spa_pod_builder_add_object(&b,
84
+       SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
85
+       SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int(8, 2, MAX_BUFFERS),
86
+       SPA_PARAM_BUFFERS_blocks,  SPA_POD_Int(1),
87
+       SPA_PARAM_BUFFERS_size,    SPA_POD_Int(size),
88
+       SPA_PARAM_BUFFERS_stride,  SPA_POD_Int(data->stride),
89
+       SPA_PARAM_BUFFERS_dataType, SPA_POD_CHOICE_FLAGS_Int((1<<SPA_DATA_DmaBuf)));
90
+```
91
+
92
+This one has just 1 data block with the DMABUF fd and plane info.
93
+
94
+## Check if SPA_META_SyncTimeline was negotiated
95
+
96
+After sending the \ref SPA_PARAM_Buffers, the buffer will be allocated by the PipeWire
97
+server.
98
+
99
+In the pw-stream::add_buffer event, check if the \ref SPA_META_SyncTimeline is available
100
+on the buffer:
101
+
102
+```
103
+    struct spa_meta_sync_timeline *stl;
104
+    stl = spa_buffer_find_meta_data(buf, SPA_META_SyncTimeline, sizeof(*stl));
105
+```
106
+
107
+When the metadata is available, the SyncObj fds are in the last 2 data planes
108
+of the buffer, the acquire and release syncobj respectively. You can keep a ref to the
109
+\ref struct spa_meta_sync_timeline because we will need this later when processing
110
+the buffers.
111
+
112
+If the producer is allocating buffers, when the stream has the \ref PW_STREAM_FLAG_ALLOC_BUFFERS
113
+flag, it should allocate the DMABUF and syncobj now and place them in the buffer data.
114
+First the plane fds and then the 2 syncobj fds.
115
+
116
+The consumer can directly use the fds. The SyncObj fds can be converted to a handle,
117
+for example, to make things easier later:
118
+
119
+```
120
+  uint32_t acquire_handle, release_handle;
121
+  drmSyncobjFDToHandle(drm_fd, buf->datasbuf->n_datas - 2.fd, &acquire_handle);
122
+  drmSyncobjFDToHandle(drm_fd, buf->datasbuf->n_datas - 1.fd, &release_handle);
123
+```
124
+
125
+## Use the SPA_META_SyncTimeline when processing buffers
126
+
127
+The \ref struct spa_meta_sync_timeline contains 2 fields: the acquire_point and
128
+release_point.
129
+
130
+Producers will start a render operation on the DMABUF of the buffer and place
131
+the acquire_point in the \ref struct spa_meta_sync_timeline. When the rendering is
132
+complete, the producer should signal the acquire_point on the acquire SyncObjTimeline.
133
+
134
+Producers will also add a release_point on the release SyncObjTimeline. They are
135
+only allowed to reuse the buffer when the release_point has been signaled.
136
+
137
+Consumers use the acquire_point to wait for rendering to complete before processing
138
+the buffer. This can be offloaded to the hardware when submitting the rendering
139
+operation or it can be done explicitly with drmSyncobjTimelineWait() on the acquire
140
+SyncObjTimeline handle and the acquire_point of the metadata.
141
+
142
+Consumers should then also signal the release_point on the release SyncObjTimeline when
143
+they complete processing the buffer. This can be done in the hardware as part of
144
+the render pipeline or explicitly with drmSyncobjTimelineSignal() on the release
145
+handle and the release_point of the metadata.
146
+
147
+
148
 */
149
_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
 
1
@@ -10,6 +10,8 @@
2
 in `~/.config/pipewire/pipewire-pulse.conf.d/` containing the module
3
 name and its arguments
4
 ```
5
+# ~/.config/pipewire/pipewire-pulse.conf.d/custom.conf
6
+
7
 pulse.cmd = 
8
     { cmd = "load-module" args = "module-null-sink sink_name=foo" flags =   }
9
 
10
_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
18
 
1
@@ -54,6 +54,7 @@
2
   'dox/pulse-modules.dox',
3
   'dox/programs/index.md',
4
   'dox/config/index.md',
5
+  'dox/config/xref.md',
6
   'dox/internals/index.dox',
7
   'dox/internals/design.dox',
8
   'dox/internals/access.dox',
9
@@ -88,7 +89,7 @@
10
   'dox/config/pipewire.conf.5.md',
11
   'dox/config/pipewire-client.conf.5.md',
12
   'dox/config/pipewire-jack.conf.5.md',
13
-  'dox/config/pipewire-devices.7.md',
14
+  'dox/config/pipewire-props.7.md',
15
   'dox/config/pipewire-filter-chain.conf.5.md',
16
   'dox/config/pipewire-pulse-modules.7.md',
17
   'dox/config/libpipewire-modules.7.md',
18
_service:download_url:pipewire-1.2.5.tar.bz2/meson.build -> _service:download_url:pipewire-1.2.6.tar.bz2/meson.build Changed
8
 
1
@@ -1,5 +1,5 @@
2
 project('pipewire', 'c' ,
3
-  version : '1.2.5',
4
+  version : '1.2.6',
5
   license :  'MIT', 'LGPL-2.1-or-later', 'GPL-2.0-only' ,
6
   meson_version : '>= 0.61.1',
7
   default_options :  'warning_level=3',
8
_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
66
 
1
@@ -600,7 +600,9 @@
2
            port->global_mix->io1 = &port->io1;
3
        }
4
    } else {
5
-       if (--port->n_mix == 0 && port->global_mix != NULL) {
6
+       info->mix->io0 = NULL;
7
+       info->mix->io1 = NULL;
8
+       if (port->n_mix > 0 && --port->n_mix == 0 && port->global_mix != NULL) {
9
            port->global_mix->io0 = NULL;
10
            port->global_mix->io1 = NULL;
11
        }
12
@@ -2130,7 +2132,7 @@
13
            const struct spa_pod *param)
14
 {
15
    struct client *c = (struct client *) data;
16
-   pw_proxy_error((struct pw_proxy*)c->node, -ENOTSUP, "not supported");
17
+   pw_proxy_error((struct pw_proxy*)c->node, -ENOTSUP, "set_param: not supported");
18
    return -ENOTSUP;
19
 }
20
 
21
@@ -2951,7 +2953,7 @@
22
 
23
       done:
24
    if (res < 0)
25
-       pw_proxy_error((struct pw_proxy*)c->node, res, spa_strerror(res));
26
+       pw_proxy_errorf((struct pw_proxy*)c->node, res, "port_use_buffers: %s", spa_strerror(res));
27
    return res;
28
 }
29
 
30
@@ -3016,7 +3018,7 @@
31
    pw_memmap_free(old);
32
 exit:
33
    if (res < 0)
34
-       pw_proxy_error((struct pw_proxy*)c->node, res, spa_strerror(res));
35
+       pw_proxy_errorf((struct pw_proxy*)c->node, res, "port_set_io: %s", spa_strerror(res));
36
    return res;
37
 }
38
 
39
@@ -3149,7 +3151,7 @@
40
 
41
       exit:
42
    if (res < 0)
43
-       pw_proxy_error((struct pw_proxy*)c->node, res, spa_strerror(res));
44
+       pw_proxy_errorf((struct pw_proxy*)c->node, res, "set_activation: %s", spa_strerror(res));
45
    return res;
46
 }
47
 
48
@@ -3190,7 +3192,7 @@
49
    }
50
 exit:
51
    if (res < 0)
52
-       pw_proxy_error((struct pw_proxy*)c->node, res, spa_strerror(res));
53
+       pw_proxy_errorf((struct pw_proxy*)c->node, res, "set_mix_info: %s", spa_strerror(res));
54
    return res;
55
 }
56
 
57
@@ -5649,7 +5651,7 @@
58
        ptr = p->get_buffer(p, frames);
59
    }
60
 done:
61
-   pw_log_warn("%p: port:%p buffer:%p frames:%d", c, p, ptr, frames);
62
+   pw_log_trace_fp("%p: port:%p buffer:%p frames:%d", c, p, ptr, frames);
63
    return ptr;
64
 }
65
 
66
_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
12
 
1
@@ -167,6 +167,10 @@
2
  *
3
  * Metadata to describe the time on the timeline when the buffer
4
  * can be acquired and when it can be reused.
5
+ *
6
+ * This metadata will usually also require negotiation of 2 extra
7
+ * buffer datas of type SPA_DATA_SyncObj with 2 fds for the acquire
8
+ * and release timelines respectively.
9
  */
10
 struct spa_meta_sync_timeline {
11
    uint32_t flags;
12
_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
10
 
1
@@ -30,7 +30,7 @@
2
                    (ev)->body.body.id : SPA_ID_INVALID)
3
 
4
 #define SPA_EVENT_INIT_FULL(t,size,type,id,...) ((t)           \
5
-   { { (size), SPA_TYPE_OBJECT },                  \
6
+   { { (size), SPA_TYPE_Object },                  \
7
      { { (type), (id) }, ##__VA_ARGS__ } })            \
8
 
9
 #define SPA_EVENT_INIT(type,id)                        \
10
_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
26
 
1
@@ -956,7 +956,7 @@
2
 {
3
    pa_card *impl = snd_mixer_elem_get_callback_private(melem);
4
    snd_hctl_elem_t **_elem = snd_mixer_elem_get_private(melem), *elem;
5
-   int device;
6
+   int device, i;
7
    const char *old_monitor_name;
8
    pa_device_port *p;
9
    pa_hdmi_eld eld;
10
@@ -978,6 +978,15 @@
11
    if (pa_alsa_get_hdmi_eld(elem, &eld) < 0)
12
        memset(&eld, 0, sizeof(eld));
13
 
14
+   // Strip trailing whitespace from monitor_name (primarily an NVidia driver bug for now)
15
+   for (i = strlen(eld.monitor_name) - 1; i >= 0; i--) {
16
+       if (eld.monitor_namei == '\n' || eld.monitor_namei == '\r' || eld.monitor_namei == '\t' ||
17
+               eld.monitor_namei == ' ')
18
+           eld.monitor_namei = 0;
19
+       else
20
+           break;
21
+   }
22
+
23
    old_monitor_name = pa_proplist_gets(p->proplist, PA_PROP_DEVICE_PRODUCT_NAME);
24
    if (eld.monitor_name0 == '\0') {
25
        changed |= old_monitor_name != NULL;
26
_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
21
 
1
@@ -1020,6 +1020,9 @@
2
     pa_assert(p);
3
     pa_assert(pcm_info);
4
 
5
+    if ((card = snd_pcm_info_get_card(pcm_info)) >= 0)
6
+        pa_alsa_init_proplist_card(c, p, card);
7
+
8
     pa_proplist_sets(p, PA_PROP_DEVICE_API, "alsa");
9
 
10
     if ((class = snd_pcm_info_get_class(pcm_info)) <= SND_PCM_CLASS_LAST) {
11
@@ -1048,9 +1051,6 @@
12
 
13
     pa_proplist_setf(p, "alsa.device", "%u", snd_pcm_info_get_device(pcm_info));
14
 
15
-    if ((card = snd_pcm_info_get_card(pcm_info)) >= 0)
16
-        pa_alsa_init_proplist_card(c, p, card);
17
-
18
     sync_id = snd_pcm_info_get_sync(pcm_info);
19
     pa_proplist_setf(p, "alsa.sync.id", "%08x:%08x:%08x:%08x",
20
            sync_id.id320, sync_id.id321, sync_id.id322, sync_id.id323);
21
_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
30
 
1
@@ -967,10 +967,28 @@
2
 int spa_alsa_clear(struct state *state)
3
 {
4
    int err;
5
+   struct state *follower;
6
 
7
    spa_list_remove(&state->link);
8
    release_card(state->card);
9
 
10
+   if (state->driver != NULL) {
11
+       spa_list_remove(&state->driver_link);
12
+       state->driver = NULL;
13
+   }
14
+   if (state->rt.driver != NULL) {
15
+       spa_list_remove(&state->rt.driver_link);
16
+       state->rt.driver = NULL;
17
+   }
18
+   spa_list_consume(follower, &state->followers, driver_link) {
19
+       spa_list_remove(&follower->driver_link);
20
+       follower->driver = NULL;
21
+   }
22
+   spa_list_consume(follower, &state->rt.followers, rt.driver_link) {
23
+       spa_list_remove(&follower->rt.driver_link);
24
+       follower->rt.driver = NULL;
25
+   }
26
+
27
    state->card = NULL;
28
    state->card_index = SPA_ID_INVALID;
29
 
30
_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
27
 
1
@@ -33,6 +33,7 @@
2
 #define DEFAULT_ALIGN  16
3
 
4
 #define MAX_PORTS  (SPA_AUDIO_MAX_CHANNELS+1)
5
+#define MAX_RETRY  64
6
 
7
 /** \cond */
8
 
9
@@ -1393,7 +1394,7 @@
10
        this->driver = true;
11
 
12
        if (this->direction == SPA_DIRECTION_OUTPUT) {
13
-           int retry = 8;
14
+           int retry = MAX_RETRY;
15
            while (retry--) {
16
                status = spa_node_process_fast(this->convert);
17
                if (status & SPA_STATUS_HAVE_DATA)
18
@@ -1621,7 +1622,7 @@
19
 static int impl_node_process(void *object)
20
 {
21
    struct impl *this = object;
22
-   int status = 0, fstatus, retry = 8;
23
+   int status = 0, fstatus, retry = MAX_RETRY;
24
 
25
    if (!this->ready) {
26
        if (!this->warned)
27
_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
9
 
1
@@ -51,6 +51,7 @@
2
     { name = "WorkTunes Connect", no-features =  hw-volume  },  # 3M WorkTunes Connect
3
 
4
     { address = "~^44:5e:cd:", no-features =  faststream, a2dp-duplex },  # #pipewire-1756
5
+    { address = "~^2c:53:d7:", no-features =  sbc-xq  },  # Phonak hearing aids #pipewire-3939
6
 
7
     { address = "~^94:16:25:", no-features =  hw-volume },  # AirPods 2
8
     { address = "~^9c:64:8b:", no-features =  hw-volume },  # AirPods 2
9
_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
10
 
1
@@ -5504,7 +5504,7 @@
2
            spa_autofree char *local_endpoint = NULL;
3
            /* get local endpoint */
4
 
5
-           for (i = 0; monitor->media_codecs; i++) {
6
+           for (i = 0; monitor->media_codecsi; i++) {
7
                if (!monitor->media_codecsi->bap)
8
                    continue;
9
                if (!is_media_codec_enabled(monitor, monitor->media_codecsi))
10
_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
10
 
1
@@ -808,6 +808,8 @@
2
        goto fail;
3
    }
4
 
5
+   g_dbus_connection_set_exit_on_close(this->conn, FALSE);
6
+
7
    this->manager = g_dbus_object_manager_server_new(MIDI_OBJECT_PATH);
8
    if (!this->manager){
9
        spa_log_error(this->log, "Creating GDBus object manager failed");
10
_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
10
 
1
@@ -1979,6 +1979,8 @@
2
        goto fail;
3
    }
4
 
5
+   g_dbus_connection_set_exit_on_close(this->conn, FALSE);
6
+
7
    this->node.iface = SPA_INTERFACE_INIT(
8
        SPA_TYPE_INTERFACE_Node,
9
                SPA_VERSION_NODE,
10
_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
27
 
1
@@ -34,6 +34,7 @@
2
 #define DEFAULT_ALIGN  16
3
 
4
 #define MAX_PORTS  (1+1)
5
+#define MAX_RETRY  64
6
 
7
 /** \cond */
8
 
9
@@ -1366,7 +1367,7 @@
10
        this->driver = true;
11
 
12
        if (this->direction == SPA_DIRECTION_OUTPUT) {
13
-           int retry = 8;
14
+           int retry = MAX_RETRY;
15
            while (retry--) {
16
                status = spa_node_process(this->convert);
17
                if (status & SPA_STATUS_HAVE_DATA)
18
@@ -1596,7 +1597,7 @@
19
 static int impl_node_process(void *object)
20
 {
21
    struct impl *this = object;
22
-   int status = 0, fstatus, retry = 8;
23
+   int status = 0, fstatus, retry = MAX_RETRY;
24
 
25
    if (!this->ready) {
26
        if (!this->warned)
27
_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
10
 
1
@@ -1505,7 +1505,7 @@
2
    if (!pw_map_has_item(&impl->io_map, mix->id))
3
        return -EINVAL;
4
 
5
-   if (impl->resource && impl->resource->version >= 4)
6
+   if (impl->resource && impl->resource->version >= 4 && !port->destroyed)
7
        pw_client_node_resource_port_set_mix_info(impl->resource,
8
                     mix->port.direction, mix->p->port_id,
9
                     mix->port.port_id, SPA_ID_INVALID, NULL);
10
_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
28
 
1
@@ -82,6 +82,8 @@
2
  * ## Example configuration
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-combine-stream-1.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-combine-stream
9
  *     args = {
10
@@ -122,6 +124,8 @@
11
  * from 3 separate stereo sinks.
12
  *
13
  *\code{.unparsed}
14
+ * # ~/.config/pipewire/pipewire.conf.d/my-combine-stream-2.conf
15
+ *
16
  * context.modules = 
17
  * {   name = libpipewire-module-combine-stream
18
  *     args = {
19
@@ -170,6 +174,8 @@
20
  * from 2 separate stereo sources.
21
  *
22
  *\code{.unparsed}
23
+ * # ~/.config/pipewire/pipewire.conf.d/my-combine-stream-3.conf
24
+ *
25
  * context.modules = 
26
  * {   name = libpipewire-module-combine-stream
27
  *     args = {
28
_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
10
 
1
@@ -117,6 +117,8 @@
2
  *
3
  * ## Example configuration
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-echo-cancel.conf
6
+ *
7
  * context.modules = 
8
  *  {   name = libpipewire-module-echo-cancel
9
  *      args = {
10
_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
10
 
1
@@ -65,6 +65,8 @@
2
  * ## Example configuration of a virtual source
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-example-filter.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-example-filter
9
  *     args = {
10
_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
10
 
1
@@ -63,6 +63,8 @@
2
  * ## Example configuration
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-example-sink.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-example-sink
9
  *     args = {
10
_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
10
 
1
@@ -63,6 +63,8 @@
2
  * ## Example configuration
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-example-source.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-example-source
9
  *     args = {
10
_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
10
 
1
@@ -75,6 +75,8 @@
2
  * ## Example configuration of a duplex sink/source
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-ffado-driver.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-ffado-driver
9
  *     args = {
10
_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
65
 
1
@@ -477,7 +477,12 @@
2
  * This example uses the rnnoise LADSPA plugin to create a new
3
  * virtual source.
4
  *
5
+ * Run with `pipewire -c filter-chain.conf`. The configuration can also
6
+ * be put under `pipewire.conf.d/` to run it inside the PipeWire server.
7
+ *
8
  *\code{.unparsed}
9
+ * # ~/.config/pipewire/filter-chain.conf.d/my-filter-chain-1.conf
10
+ *
11
  * context.modules = 
12
  * {   name = libpipewire-module-filter-chain
13
  *     args = {
14
@@ -515,6 +520,8 @@
15
  * to a stereo Dolby Surround signal.
16
  *
17
  *\code{.unparsed}
18
+ * # ~/.config/pipewire/filter-chain.conf.d/my-filter-chain-2.conf
19
+ *
20
  * context.modules = 
21
  * {   name = libpipewire-module-filter-chain
22
  *     args = {
23
@@ -1087,13 +1094,15 @@
24
    struct node *node = port->node;
25
    struct descriptor *desc = node->desc;
26
    float old;
27
+   bool changed;
28
 
29
    old = port->control_dataid;
30
    port->control_dataid = value ? *value : desc->default_controlport->idx;
31
    pw_log_info("control %d %d ('%s') from %f to %f", port->idx, id,
32
            desc->desc->portsport->p.name, old, port->control_dataid);
33
-   node->control_changed = old != port->control_dataid;
34
-   return node->control_changed ? 1 : 0;
35
+   changed = old != port->control_dataid;
36
+   node->control_changed |= changed;
37
+   return changed ? 1 : 0;
38
 }
39
 
40
 static int set_control_value(struct node *node, const char *name, float *value)
41
@@ -2332,7 +2341,7 @@
42
    const struct fc_descriptor *d;
43
    uint32_t i, j, max_samples = impl->quantum_limit;
44
    int res;
45
-   float *sd = impl->silence_data, *dd = impl->discard_data;
46
+   float *sd, *dd;
47
 
48
    if (graph->instantiated)
49
        return 0;
50
@@ -2345,8 +2354,13 @@
51
 
52
        desc = node->desc;
53
        d = desc->desc;
54
-       if (d->flags & FC_DESCRIPTOR_SUPPORTS_NULL_DATA)
55
+       if (d->flags & FC_DESCRIPTOR_SUPPORTS_NULL_DATA) {
56
            sd = dd = NULL;
57
+       }
58
+       else {
59
+           sd = impl->silence_data;
60
+           dd = impl->discard_data;
61
+       }
62
 
63
        for (i = 0; i < node->n_hndl; i++) {
64
            pw_log_info("instantiate %s %d rate:%lu", d->name, i, impl->rate);
65
_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
29
 
1
@@ -216,6 +216,8 @@
2
    for (uint8_t i = 0; i < 3; i++)
3
        coordsi = impl->port3 + i0;
4
 
5
+   pw_log_info("making spatializer with %f %f %f", coords0, coords2, coords2);
6
+
7
    mysofa_s2c(coords);
8
    mysofa_getfilter_float(
9
        impl->sofa,
10
@@ -229,9 +231,8 @@
11
    );
12
 
13
    // TODO: make use of delay
14
-   if ((left_delay != 0.0f || right_delay != 0.0f) && (!isnan(left_delay) || !isnan(right_delay))) {
15
+   if ((left_delay != 0.0f || right_delay != 0.0f) && (!isnan(left_delay) || !isnan(right_delay)))
16
        pw_log_warn("delay dropped l: %f, r: %f", left_delay, right_delay);
17
-   }
18
 
19
    if (impl->l_conv2)
20
        convolver_free(impl->l_conv2);
21
@@ -331,7 +332,6 @@
22
 
23
 static void spatializer_control_changed(void * Instance)
24
 {
25
-   pw_log_info("control changed");
26
    spatializer_reload(Instance);
27
 }
28
 
29
_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
10
 
1
@@ -74,6 +74,8 @@
2
  * ## Example configuration of a duplex sink/source
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-jack-tunnel.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-jack-tunnel
9
  *     args = {
10
_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
10
 
1
@@ -42,6 +42,8 @@
2
  *
3
  * ## Example configuration
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-jack-dbus-detect.conf
6
+ *
7
  * context.modules = 
8
  *  {   name = libpipewire-module-jackdbus-detect
9
  *      args {
10
_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
28
 
1
@@ -82,6 +82,8 @@
2
  * This Virtual sink routes stereo input to the rear channels of a 7.1 sink.
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-loopback-1.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-loopback
9
  *     args = {
10
@@ -111,6 +113,8 @@
11
  * This is useful for splitting up multi-channel inputs from USB audio interfaces that are not yet fully supported by alsa.
12
  *
13
  *\code{.unparsed}
14
+ * # ~/.config/pipewire/pipewire.conf.d/my-loopback-2.conf
15
+ *
16
  * context.modules = 
17
  * {   name = libpipewire-module-loopback
18
  *     args = {
19
@@ -137,6 +141,8 @@
20
  * using the PSD algorithm on the playback stream.
21
  *
22
  *\code{.unparsed}
23
+ * # ~/.config/pipewire/pipewire.conf.d/my-loopback-3.conf
24
+ *
25
  * context.modules = 
26
  * {   name = libpipewire-module-loopback
27
  *     args = {
28
_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
10
 
1
@@ -85,6 +85,8 @@
2
  * ## Example configuration of a duplex sink/source
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-netjack2-driver.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-netjack2-driver
9
  *     args = {
10
_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
10
 
1
@@ -88,6 +88,8 @@
2
  * ## Example configuration of a duplex sink/source
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-netjack2-manager.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-netjack2-manager
9
  *     args = {
10
_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
10
 
1
@@ -69,6 +69,8 @@
2
  *
3
  * ## Example configuration
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-parametric-equalizer.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-parametric-equalizer
9
  *     args = {
10
_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
10
 
1
@@ -93,6 +93,8 @@
2
  * ## Example configuration of a pipe playback stream
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-pipe-tunnel.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-pipe-tunnel
9
  *     args = {
10
_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
28
 
1
@@ -48,6 +48,8 @@
2
  * A config section with server properties can be given.
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire-pulse.conf.d/custom.conf
6
+ *
7
  * pulse.properties = {
8
  *     # the addresses this server listens on
9
  *     server.address = 
10
@@ -297,6 +299,8 @@
11
  * section with a `quirks` and an `update-props` action.
12
  *
13
  *\code{.unparsed}
14
+ * # ~/.config/pipewire/pipewire-pulse.conf.d/custom.conf
15
+ *
16
  * pulse.rules = 
17
  *     {
18
  *         # skype does not want to use devices that don't have an S16 sample format.
19
@@ -343,6 +347,8 @@
20
  * ## Example configuration
21
  *
22
  *\code{.unparsed}
23
+ * # ~/.config/pipewire/pipewire-pulse.conf.d/custom.conf
24
+ *
25
  * context.modules = 
26
  * {   name = libpipewire-module-protocol-pulse
27
  *     args = { }
28
_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
10
 
1
@@ -83,6 +83,8 @@
2
  * ## Example configuration
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-protocol-simple.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-protocol-simple
9
  *     args = {
10
_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
10
 
1
@@ -83,6 +83,8 @@
2
  * ## Example configuration of a virtual sink
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-pulse-tunnel.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-pulse-tunnel
9
  *     args = {
10
_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
10
 
1
@@ -55,6 +55,8 @@
2
  * ## Example configuration
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-raop-discover.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-raop-discover
9
  *     args = {
10
_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
10
 
1
@@ -94,6 +94,8 @@
2
  * ## Example configuration
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-raop-sink.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-raop-sink
9
  *     args = {
10
_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
10
 
1
@@ -56,6 +56,8 @@
2
  *
3
  * ## Example configuration
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-roc-sink.conf
6
+ *
7
  * context.modules = 
8
  *  {   name = libpipewire-module-roc-sink
9
  *      args = {
10
_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
10
 
1
@@ -59,6 +59,8 @@
2
  *
3
  * ## Example configuration
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-roc-source.conf
6
+ *
7
  * context.modules = 
8
  *  {   name = libpipewire-module-roc-source
9
  *      args = {
10
_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
10
 
1
@@ -71,6 +71,8 @@
2
  *
3
  * ## Example configuration
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-rtp-sap.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-rtp-sap
9
  *     args = {
10
_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
10
 
1
@@ -93,6 +93,8 @@
2
  *
3
  * ## Example configuration
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-rtp-session.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-rtp-session
9
  *     args = {
10
_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
10
 
1
@@ -85,6 +85,8 @@
2
  *
3
  * ## Example configuration
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-rtp-sink.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-rtp-sink
9
  *     args = {
10
_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
10
 
1
@@ -77,6 +77,8 @@
2
  *
3
  * ## Example configuration
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-rtp-source.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-rtp-source
9
  *     args = {
10
_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
10
 
1
@@ -68,6 +68,8 @@
2
  * ## Example configuration
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-snapcast-discover.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-snapcast-discover
9
  *     args = {
10
_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
10
 
1
@@ -73,6 +73,8 @@
2
  *
3
  * ## Example configuration
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-vban-recv.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-vban-recv
9
  *     args = {
10
_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
10
 
1
@@ -78,6 +78,8 @@
2
  *
3
  * ## Example configuration
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-vban-send.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-vban-send
9
  *     args = {
10
_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
10
 
1
@@ -48,6 +48,8 @@
2
  * ## Example configuration
3
  *
4
  *\code{.unparsed}
5
+ * # ~/.config/pipewire/pipewire.conf.d/my-zeroconf-discover.conf
6
+ *
7
  * context.modules = 
8
  * {   name = libpipewire-module-zeroconf-discover
9
  *     args = { }
10
_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
22
 
1
@@ -498,14 +498,18 @@
2
 {
3
    struct filter *impl = object;
4
    struct pw_filter *filter = &impl->this;
5
+   uint32_t id = SPA_NODE_COMMAND_ID(command);
6
 
7
-   switch (SPA_NODE_COMMAND_ID(command)) {
8
+   pw_log_debug("%p: command %s", impl,
9
+           spa_debug_type_find_name(spa_type_node_command_id, id));
10
+
11
+   switch (id) {
12
    case SPA_NODE_COMMAND_Suspend:
13
    case SPA_NODE_COMMAND_Flush:
14
    case SPA_NODE_COMMAND_Pause:
15
        pw_loop_invoke(impl->main_loop,
16
            NULL, 0, NULL, 0, false, impl);
17
-       if (filter->state == PW_FILTER_STATE_STREAMING) {
18
+       if (filter->state == PW_FILTER_STATE_STREAMING && id != SPA_NODE_COMMAND_Flush) {
19
            pw_log_debug("%p: pause", filter);
20
            filter_set_state(filter, PW_FILTER_STATE_PAUSED, 0, NULL);
21
        }
22
_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
13
 
1
@@ -237,7 +237,10 @@
2
 int pw_filter_set_active(struct pw_filter *filter, bool active);
3
 
4
 /** Flush a filter. When \a drain is true, the drained callback will
5
- * be called when all data is played or recorded */
6
+ * be called when all data is played or recorded. The filter can be resumed
7
+ * after the drain by setting it active again with
8
+ * \ref pw_filter_set_active(). A flush without a drain is mostly useful afer
9
+ * a state change to PAUSED, to flush any remaining data from the queues. */
10
 int pw_filter_flush(struct pw_filter *filter, bool drain);
11
 
12
 /** Check if the filter is driving. The filter needs to have the
13
_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
22
 
1
@@ -2780,9 +2780,17 @@
2
         * will wait until all previous items in the work queue are
3
         * completed */
4
        impl->pending_state = state;
5
-       impl->pending_id = pw_work_queue_add(impl->work,
6
-               node, res == EBUSY ? -EBUSY : res,
7
-               on_state_complete, SPA_INT_TO_PTR(state));
8
+       if (node->exported) {
9
+           /* exported nodes must complete immediately. This is important
10
+            * because the server sends ping to check completion. The server
11
+            * will only send Start to driver nodes when all clients are
12
+            * ready for processing. */
13
+           on_state_complete(node, SPA_INT_TO_PTR(state), -EBUSY, 0);
14
+       } else {
15
+           impl->pending_id = pw_work_queue_add(impl->work,
16
+                   node, res == EBUSY ? -EBUSY : res,
17
+                   on_state_complete, SPA_INT_TO_PTR(state));
18
+       }
19
    }
20
    return res;
21
 }
22
_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
33
 
1
@@ -187,7 +187,9 @@
2
 #define PW_KEY_NODE_SUSPEND_ON_IDLE    "node.suspend-on-idle"  /**< suspend the node when idle */
3
 #define PW_KEY_NODE_CACHE_PARAMS   "node.cache-params" /**< cache the node params */
4
 #define PW_KEY_NODE_TRANSPORT_SYNC "node.transport.sync"   /**< the node handles transport sync */
5
-#define PW_KEY_NODE_DRIVER     "node.driver"       /**< node can drive the graph */
6
+#define PW_KEY_NODE_DRIVER     "node.driver"       /**< node can drive the graph. When the node is
7
+                                 *  selected as the driver, it needs to start
8
+                                 *  the graph periodically. */
9
 #define PW_KEY_NODE_DRIVER_ID      "node.driver-id"    /**< the node id of the node assigned as driver
10
                                  *   for this node */
11
 #define PW_KEY_NODE_ASYNC      "node.async"        /**< the node wants async scheduling */
12
@@ -207,12 +209,14 @@
13
 #define PW_KEY_NODE_TRIGGER        "node.trigger"      /**< the node is not scheduled automatically
14
                                  *   based on the dependencies in the graph
15
                                  *   but it will be triggered explicitly. */
16
-#define PW_KEY_NODE_CHANNELNAMES       "node.channel-names"        /**< names of node's
17
-                                   *   channels (unrelated to positions) */
18
-#define PW_KEY_NODE_DEVICE_PORT_NAME_PREFIX            "node.device-port-name-prefix"      /** override
19
-                                   *       port name prefix for device ports, like capture and playback
20
-                                   *       or disable the prefix completely if an empty string is provided */
21
-
22
+#define PW_KEY_NODE_CHANNELNAMES   "node.channel-names"    /**< names of node's
23
+                               *   channels (unrelated to positions) */
24
+#define PW_KEY_NODE_DEVICE_PORT_NAME_PREFIX    \
25
+                   "node.device-port-name-prefix"  /**< override port name prefix for
26
+                                     *  device ports, like capture and
27
+                                     *  playback or disable the prefix
28
+                                     *  completely if an empty string
29
+                                     *  is provided */
30
 /** Port keys */
31
 #define PW_KEY_PORT_ID         "port.id"       /**< port id */
32
 #define PW_KEY_PORT_NAME       "port.name"     /**< port name */
33
_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
77
 
1
@@ -648,7 +648,7 @@
2
    struct pw_stream *stream = &impl->this;
3
    uint32_t id = SPA_NODE_COMMAND_ID(command);
4
 
5
-   pw_log_info("%p: command %s", impl,
6
+   pw_log_debug("%p: command %s", impl,
7
            spa_debug_type_find_name(spa_type_node_command_id, id));
8
 
9
    switch (id) {
10
@@ -657,8 +657,7 @@
11
    case SPA_NODE_COMMAND_Pause:
12
        pw_loop_invoke(impl->main_loop,
13
            NULL, 0, NULL, 0, false, impl);
14
-       if (stream->state == PW_STREAM_STATE_STREAMING) {
15
-
16
+       if (stream->state == PW_STREAM_STATE_STREAMING && id != SPA_NODE_COMMAND_Flush) {
17
            pw_log_debug("%p: pause", stream);
18
            stream_set_state(stream, PW_STREAM_STATE_PAUSED, 0, NULL);
19
        }
20
@@ -666,13 +665,11 @@
21
    case SPA_NODE_COMMAND_Start:
22
        if (stream->state == PW_STREAM_STATE_PAUSED) {
23
            pw_log_debug("%p: start direction:%d", stream, impl->direction);
24
-
25
            if (impl->direction == SPA_DIRECTION_INPUT) {
26
                if (impl->io != NULL)
27
                    impl->io->status = SPA_STATUS_NEED_DATA;
28
            }
29
            copy_position(impl, impl->queued.incount);
30
-           stream_set_state(stream, PW_STREAM_STATE_STREAMING, 0, NULL);
31
        }
32
        break;
33
    default:
34
@@ -1377,10 +1374,29 @@
35
    }
36
 }
37
 
38
+static void node_state_changed(void *data, enum pw_node_state old,
39
+       enum pw_node_state state, const char *error)
40
+{
41
+   struct pw_stream *stream = data;
42
+
43
+   switch (state) {
44
+   case PW_NODE_STATE_RUNNING:
45
+       if (stream->state == PW_STREAM_STATE_PAUSED)
46
+           stream_set_state(stream, PW_STREAM_STATE_STREAMING, 0, NULL);
47
+       break;
48
+   case PW_NODE_STATE_ERROR:
49
+       stream_set_state(stream, PW_STREAM_STATE_ERROR, -EIO, error);
50
+       break;
51
+   default:
52
+       break;
53
+   }
54
+}
55
+
56
 static const struct pw_impl_node_events node_events = {
57
    PW_VERSION_IMPL_NODE_EVENTS,
58
    .destroy = node_event_destroy,
59
    .info_changed = node_event_info,
60
+   .state_changed = node_state_changed,
61
 };
62
 
63
 static void on_core_error(void *data, uint32_t id, int seq, int res, const char *message)
64
@@ -2298,8 +2314,11 @@
65
 
66
    pw_impl_node_set_active(stream->node, active);
67
 
68
-   if (!active || impl->drained)
69
+   if (!active || impl->drained) {
70
+       if (impl->drained && impl->io != NULL)
71
+           impl->io->status = SPA_STATUS_NEED_DATA;
72
        impl->drained = impl->draining = false;
73
+   }
74
    return 0;
75
 }
76
 
77
_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
14
 
1
@@ -556,7 +556,11 @@
2
 int pw_stream_set_active(struct pw_stream *stream, bool active);
3
 
4
 /** Flush a stream. When \a drain is true, the drained callback will
5
- * be called when all data is played or recorded */
6
+ * be called when all data is played or recorded. The stream can be resumed
7
+ * after the drain by setting it active again with
8
+ * \ref pw_stream_set_active(). A flush without a drain is mostly useful afer
9
+ * a state change to PAUSED, to flush any remaining data from the queues and
10
+ * the converters. */
11
 int pw_stream_flush(struct pw_stream *stream, bool drain);
12
 
13
 /** Check if the stream is driving. The stream needs to have the
14