Changes of Revision 47
pipewire-aptx.changes
Changed
x
1
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
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
<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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
153
```
154
To handle anything but the "null" string, use:
155
156
-```
157
+```css
158
matches =
159
{
160
node.name = "!\"null\""
161
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
2
#define DEFAULT_ALIGN 16
3
4
#define MAX_PORTS (1+1)
5
+#define MAX_RETRY 64
6
7
/** \cond */
8
9
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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