We truncated the diff of some files because they were too big.
If you want to see the full diff for every file, click here.
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
201
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
_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
201
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
_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
201
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
_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