Changes of Revision 40

pipewire-aptx.changes Changed
x
 
1
@@ -1,4 +1,9 @@
2
 -------------------------------------------------------------------
3
+Mon Nov 27 08:46:54 UTC 2023 - Bjørn Lie <zaitor@opensuse.org>
4
+
5
+- Update to version 1.0.0
6
+
7
+-------------------------------------------------------------------
8
 Fri Nov 24 19:29:49 UTC 2023 - Bjørn Lie <zaitor@opensuse.org>
9
 
10
 - Update to version 0.3.85
11
pipewire-aptx.spec Changed
10
 
1
@@ -7,7 +7,7 @@
2
 %define soversion 0_2
3
 
4
 Name:           pipewire-aptx
5
-Version:        0.3.85
6
+Version:        1.0.0
7
 Release:        0
8
 Summary:        PipeWire Bluetooth aptX codec plugin
9
 License:        MIT
10
pipewire-0.3.85.tar.gz/doc/api-tree.dox Deleted
125
 
1
@@ -1,123 +0,0 @@
2
-/**
3
-
4
-\defgroup api_pw_core Core API
5
-\brief PipeWire Core API
6
-\{
7
-\addtogroup pw_pipewire
8
-\addtogroup pw_main_loop
9
-\addtogroup pw_context
10
-\addtogroup pw_client
11
-\addtogroup pw_core
12
-\addtogroup pw_device
13
-\addtogroup pw_factory
14
-\addtogroup pw_link
15
-\addtogroup pw_loop
16
-\addtogroup pw_module
17
-\addtogroup pw_node
18
-\addtogroup pw_permission
19
-\addtogroup pw_port
20
-\addtogroup pw_proxy
21
-\addtogroup pw_registry
22
-\addtogroup pw_type
23
-\addtogroup pw_keys
24
-\}
25
-
26
-\defgroup api_pw_impl Implementation API
27
-\brief PipeWire Object Implementation API
28
-\{
29
-\addtogroup pw_impl_client
30
-\addtogroup pw_impl_core
31
-\addtogroup pw_impl_device
32
-\addtogroup pw_impl_factory
33
-\addtogroup pw_impl_link
34
-\addtogroup pw_impl_metadata
35
-\addtogroup pw_impl_module
36
-\addtogroup pw_impl_node
37
-\addtogroup pw_impl_port
38
-\addtogroup pw_buffers
39
-\addtogroup pw_control
40
-\addtogroup pw_data_loop
41
-\addtogroup pw_global
42
-\addtogroup pw_protocol
43
-\addtogroup pw_resource
44
-\addtogroup pw_thread_loop
45
-\addtogroup pw_work_queue
46
-\}
47
-
48
-\defgroup api_pw_util Utilities
49
-\brief PipeWire Utilities
50
-\{
51
-\addtogroup pw_array
52
-\addtogroup pw_conf
53
-\addtogroup pw_gettext
54
-\addtogroup pw_log
55
-\addtogroup pw_map
56
-\addtogroup pw_memblock
57
-\addtogroup pw_properties
58
-\addtogroup pw_thread
59
-\addtogroup pw_utils
60
-\}
61
-
62
-\defgroup api_pw_ext Extensions
63
-\brief PipeWire Extensions
64
-\{
65
-\addtogroup pw_client_node
66
-\addtogroup pw_metadata
67
-\addtogroup pw_profiler
68
-\addtogroup pw_protocol_native
69
-\addtogroup pw_session_manager
70
-\}
71
-
72
-\defgroup api_spa SPA
73
-\brief Simple Plugin API
74
-\{
75
-\addtogroup spa_buffer
76
-\addtogroup spa_control
77
-\addtogroup spa_debug
78
-\addtogroup spa_device
79
-\addtogroup spa_graph
80
-\addtogroup spa_node
81
-\addtogroup spa_param
82
-\addtogroup spa_pod
83
-\defgroup spa_utils Utilities
84
-Utility data structures, macros, etc.
85
-\{
86
-\addtogroup spa_ansi
87
-\addtogroup spa_utils_defs
88
-\addtogroup spa_dict
89
-\addtogroup spa_list
90
-\addtogroup spa_hooks
91
-\addtogroup spa_interfaces
92
-\addtogroup spa_json
93
-\addtogroup spa_json_pod
94
-\addtogroup spa_keys
95
-\addtogroup spa_names
96
-\addtogroup spa_result
97
-\addtogroup spa_ringbuffer
98
-\addtogroup spa_string
99
-\addtogroup spa_types
100
-\}
101
-\defgroup spa_support Support
102
-Support interfaces provided by host
103
-\{
104
-\addtogroup spa_cpu
105
-\addtogroup spa_dbus
106
-\addtogroup spa_i18n
107
-\addtogroup spa_log
108
-\addtogroup spa_loop
109
-\addtogroup spa_handle
110
-\addtogroup spa_plugin_loader
111
-\addtogroup spa_system
112
-\addtogroup spa_thread
113
-\}
114
-\}
115
-
116
-\defgroup pw_stream Stream
117
-\{
118
-\}
119
-
120
-\defgroup pw_filter Filter
121
-\{
122
-\}
123
-
124
-*/
125
pipewire-0.3.85.tar.gz/doc/api.dox Deleted
91
 
1
@@ -1,89 +0,0 @@
2
-/** \page page_api PipeWire API
3
-
4
-The PipeWire API consists of several parts:
5
-
6
-- The \ref pw_stream for a convenient way to send and receive data streams from/to PipeWire.
7
-
8
-- The \ref pw_filter for a convenient way to implement processing filters.
9
-
10
-- The \ref api_pw_core to access a PipeWire instance. This API is used
11
-by all clients that need to communicate with the \ref page_daemon and provides
12
-the necessary structs to interface with the daemon.
13
-
14
-- The \ref api_pw_impl is primarily used by the \ref page_daemon itself but also by the
15
-\ref page_session_manager and modules/extensions that need to build objects in
16
-the graph.
17
-
18
-- The \ref api_pw_util containing various utility functions and structures.
19
-
20
-- The \ref api_pw_ext for interfacing with certain extension modules.
21
-
22
-The APIs work through proxy objects, so that calling a method on an object
23
-invokes that same method on the remote side. Marshalling and de-marshalling is
24
-handled transparently by the \ref page_module_protocol_native.
25
-The below graph illustrates this approach:
26
-
27
-\dot
28
-digraph API {
29
-  compound=true;
30
-  node shape="box";
31
-  rankdir="RL";
32
-
33
-  subgraph cluster_daemon {
34
-       rankdir="TB";
35
-       label="PipeWire daemon";
36
-       style="dashed";
37
-
38
-       impl_core label="Core Impl. Object";
39
-       impl_device label="Device Impl. Object";
40
-       impl_node label="Node Impl. Object";
41
-  }
42
-
43
-  subgraph cluster_client {
44
-       rankdir="TB";
45
-       label="PipeWire client";
46
-       style="dashed";
47
-
48
-       obj_core label="Core Object";
49
-       obj_device label="Device Object";
50
-       obj_node label="Node Object";
51
-  }
52
-
53
-  obj_core -> impl_core;
54
-  obj_device -> impl_device;
55
-  obj_node -> impl_node;
56
-
57
-}
58
-\enddot
59
-
60
-It is common for clients to use both the \ref api_pw_core and the \ref api_pw_impl
61
-and both APIs are provided by the same library.
62
-
63
-- \subpage page_client_impl
64
-- \subpage page_proxy
65
-- \subpage page_streams
66
-- \subpage page_thread_loop
67
-
68
-
69
-\addtogroup api_pw_core Core API
70
-
71
-The Core API to access a PipeWire instance. This API is used by all
72
-clients to communicate with the \ref page_daemon.
73
-
74
-If you are familiar with Wayland implementation, the Core API is
75
-roughly equivalent to libwayland-client.
76
-
77
-See: \ref page_api
78
-
79
-
80
-\addtogroup api_pw_impl Implementation API
81
-
82
-The implementation API provides the tools to build new objects and
83
-modules.
84
-
85
-If you are familiar with Wayland implementation, the Implementation API is
86
-roughly equivalent to libwayland-server.
87
-
88
-See: \ref page_api
89
-
90
-*/
91
pipewire-0.3.85.tar.gz/doc/index.dox Deleted
57
 
1
@@ -1,55 +0,0 @@
2
-/** \mainpage PipeWire
3
-
4
-PipeWire is low-level multimedia framework that provides:
5
-
6
-- Graph based processing.
7
-- Support for out-of-process processing graphs with minimal overhead.
8
-- Flexible and extensible media format negotiation and buffer allocation.
9
-- Hard real-time capable plugins.
10
-- Very low-latency for both audio and video processing.
11
-
12
-See \ref page_overview for an overview of PipeWire and \ref page_design
13
-for the design principles guiding PipeWire.
14
-
15
-# Components
16
-
17
-PipeWire ships with the following components:
18
-
19
-- A \ref page_daemon that implements the IPC and graph processing.
20
-- An example \ref page_session_manager that manages objects in the \ref page_daemon.
21
-- A set of \ref page_tools to introspect and use the \ref page_daemon.
22
-- A \ref page_library to develop PipeWire applications and plugins (\ref
23
-  page_tutorial "tutorial").
24
-- The \ref page_spa used by both the \ref page_daemon and in the \ref
25
-  page_library.
26
-
27
-# API Documentation
28
-
29
-See \ref page_api.
30
-
31
-# More Documentation
32
-
33
-See our Wiki(https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/home) for
34
-More information on how to configure and use PipeWire.
35
-
36
-# Resources
37
-
38
-- PipeWire and AGL(https://wiki.automotivelinux.org/_media/pipewire_agl_20181206.pdf)
39
-- LAC 2020 Paper(https://lac2020.sciencesconf.org/307881/document)
40
-- PipeWire Under The Hood(https://venam.nixers.net/blog/unix/2021/06/23/pipewire-under-the-hood.html)
41
-- PipeWire: The Linux audio/video bus (LWN)(https://lwn.net/Articles/847412)
42
-- PipeWire Wikipedia(https://en.wikipedia.org/wiki/PipeWire)
43
-- Bluetooth, PipeWire and Whatsapp calls(https://gjhenrique.com/pipewire.html)
44
-- Intoduction to PipeWire(https://bootlin.com/blog/an-introduction-to-pipewire/)
45
-- A custom PipeWire node(https://bootlin.com/blog/a-custom-pipewire-node/)
46
-
47
-
48
-\page page_overview
49
-\page page_pipewire
50
-\page page_tools
51
-\page page_pipewire_modules
52
-\page page_api
53
-\page page_spa
54
-\page page_tutorial
55
-
56
-*/
57
pipewire-0.3.85.tar.gz/doc/input-filter.sh Deleted
12
 
1
@@ -1,10 +0,0 @@
2
-#!/bin/bash
3
-#
4
-# Doxygen input filter that adds \privatesection to all files,
5
-# and removes macros.
6
-#
7
-# This is used for .c files, and causes Doxygen to not include
8
-# any symbols from them, unless they also appeared in a header file.
9
-#
10
-echo -n "/** \privatesection */ "
11
-sed -e 's/#define.*//' < "$1"
12
pipewire-0.3.85.tar.gz/doc/manpage.dox.in Deleted
9
 
1
@@ -1,7 +0,0 @@
2
-/** \page @pagename@ @title@
3
-
4
-\brief Manual page for @title@
5
-
6
-\verbinclude @filename@
7
-
8
-*/
9
pipewire-0.3.85.tar.gz/doc/pipewire-architecture.dox Deleted
pipewire-0.3.85.tar.gz/doc/pipewire-modules.dox Deleted
96
 
1
@@ -1,94 +0,0 @@
2
-/** \page page_pipewire_modules PipeWire Modules
3
-
4
-A PipeWire module is effectively a PipeWire client in an `.so` file that
5
-shares the \ref pw_context with the loading entity. Usually modules are
6
-loaded when they are listed in the configuration files. For example the
7
-default configuration file loads several modules:
8
-
9
-```
10
-context.modules = 
11
-    ...
12
-    # The native communication protocol.
13
-    {   name = libpipewire-module-protocol-native }
14
-
15
-    # The profile module. Allows application to access profiler
16
-    # and performance data. It provides an interface that is used
17
-    # by pw-top and pw-profiler.
18
-    {   name = libpipewire-module-profiler }
19
-
20
-    # Allows applications to create metadata objects. It creates
21
-    # a factory for Metadata objects.
22
-    {   name = libpipewire-module-metadata }
23
-
24
-    # Creates a factory for making devices that run in the
25
-    # context of the PipeWire server.
26
-    {   name = libpipewire-module-spa-device-factory }
27
-    ...
28
-
29
-```
30
-The matching libraries are:
31
-```
32
-$ ls -1 /usr/lib64/pipewire-0.3/libpipewire-module*
33
-...
34
-/usr/lib64/pipewire-0.3/libpipewire-module-metadata.so
35
-/usr/lib64/pipewire-0.3/libpipewire-module-profiler.so
36
-/usr/lib64/pipewire-0.3/libpipewire-module-protocol-native.so
37
-/usr/lib64/pipewire-0.3/libpipewire-module-spa-device-factory.so
38
-...
39
-```
40
-
41
-A module's entry point is the `pipewire__module_init` function, see \ref
42
-PIPEWIRE_SYMBOL_MODULE_INIT.
43
-
44
-\code
45
-int pipewire__module_init(struct pw_impl_module *module, const char *args).`
46
-\endcode
47
-
48
-See the \ref page_module_example_sink and \ref page_module_example_source
49
-modules for a general oveview of how modules look like.
50
-
51
-List of known modules:
52
-
53
-- \subpage page_module_access
54
-- \subpage page_module_adapter
55
-- \subpage page_module_avb
56
-- \subpage page_module_client_device
57
-- \subpage page_module_client_node
58
-- \subpage page_module_combine_stream
59
-- \subpage page_module_echo_cancel
60
-- \subpage page_module_example_filter
61
-- \subpage page_module_example_sink
62
-- \subpage page_module_example_source
63
-- \subpage page_module_fallback_sink
64
-- \subpage page_module_ffado_driver
65
-- \subpage page_module_filter_chain
66
-- \subpage page_module_jackdbus_detect
67
-- \subpage page_module_jack_tunnel
68
-- \subpage page_module_link_factory
69
-- \subpage page_module_loopback
70
-- \subpage page_module_metadata
71
-- \subpage page_module_netjack2_driver
72
-- \subpage page_module_netjack2_manager
73
-- \subpage page_module_pipe_tunnel
74
-- \subpage page_module_portal
75
-- \subpage page_module_profiler
76
-- \subpage page_module_protocol_native
77
-- \subpage page_module_protocol_pulse
78
-- \subpage page_module_protocol_simple
79
-- \subpage page_module_pulse_tunnel
80
-- \subpage page_module_raop_sink
81
-- \subpage page_module_raop_discover
82
-- \subpage page_module_roc_sink
83
-- \subpage page_module_roc_source
84
-- \subpage page_module_rtp_sap
85
-- \subpage page_module_rtp_sink
86
-- \subpage page_module_rtp_source
87
-- \subpage page_module_rtp_session
88
-- \subpage page_module_rt
89
-- \subpage page_module_session_manager
90
-- \subpage page_module_vban_recv
91
-- \subpage page_module_vban_send
92
-- \subpage page_module_x11_bell
93
-- \subpage page_module_zeroconf_discover
94
-
95
-*/
96
pipewire-0.3.85.tar.gz/doc/pipewire-portal.dox Deleted
201
 
1
@@ -1,215 +0,0 @@
2
-/** \page page_portal Portal Access Control
3
-
4
-This document explains how clients from the portal are handled.
5
-
6
-The portal is a DBus service that exposes interfaces to
7
-request access to the PipeWire daemon to perform a certain set of
8
-functions. The PipeWire daemon runs outside the sandbox, the portal is a way
9
-for clients inside the sandbox to connect to and use PipeWire.
10
-
11
-The PipeWire socket is not exposed in the sandbox. Instead, The portal
12
-connects to PipeWire on behalf of the client, informing PipeWire that this
13
-client is a portal-managed client. PipeWire can detect and enforce
14
-extra permission checks on the portal managed clients.
15
-
16
-Once such portal is the camera
17
-portal(https://flatpak.github.io/xdg-desktop-portal/portal-docs.html#gdbus-org.freedesktop.portal.Camera)
18
-that provides a PipeWire session to stream video from a camera.
19
-
20
-
21
-# Use Cases
22
-
23
-## New Portal Managed Clients Need Device Permissions Configured
24
-
25
-When a new client is detected, the available objects need to be
26
-scanned and permissions configured for each of them.
27
-
28
-Only the devices belonging to the media_roles given by the
29
-portal are considered.
30
-
31
-## New Devices Need To Be Made Visible To Portal Managed Clients
32
-
33
-Newly created objects are made visible to a client when the client
34
-is allowed to interact with it.
35
-
36
-Only the devices belonging to the media_roles given by the
37
-portal are considered.
38
-
39
-## Permissions For A Device Need To Be Revoked
40
-
41
-The session manager listens to changes in the permissions of devices
42
-and will remove the client permissions accordingly.
43
-
44
-Usually this is implemented by listening to the permission store
45
-DBus object. The desktop environment might provide a configuration panel
46
-where these permissions can be managed.
47
-
48
-
49
-# Design
50
-
51
-## The Portal
52
-
53
-A sandboxed client cannot connect to PipeWire directly. Instead, it connects
54
-to the sandbox side of the portal which then connects the PipeWire daemon to
55
-configure the session. The portal then hands the file descriptor of the
56
-PipeWire connection to the client and the client can use this file descriptor
57
-to interface with the PipeWire session directly.
58
-
59
-When the portal connects, it will set the following properties on the
60
-client object:
61
-
62
-- `"pipewire.access.portal.is_portal" = true` for the connection of the
63
-  portal itself (as opposed to a client managed by the portal).
64
-- `"pipewire.access.portal.app_id"` the application ID(https://docs.flatpak.org/en/latest/conventions.html#application-ids) of the client.
65
-- `"pipewire.access.portal.media_roles"` media roles of the client.
66
-  Currently only `"Camera"` is defined.
67
-
68
-Before returning the connection to a client, the portal configures
69
-minimal permissions on the client. No objects are initially visible. It is
70
-the task of the \ref page_session_manager to make the objects in the graph
71
-visible, depending on the client's `media_roles` (see also \ref
72
-PW_KEY_MEDIA_ROLE).
73
-
74
-## The PipeWire Portal Module
75
-
76
-The PipeWire daemon uses the \ref page_module_portal to find the PID of the
77
-processes that owns the DBus name `org.freedesktop.portal.Desktop`
78
-(see the XDG Desktop Portal(https://github.com/flatpak/xdg-desktop-portal)).
79
-
80
-Client connections from this PID are tagged as \ref PW_KEY_ACCESS
81
-`"portal"` (see \ref page_module_access). It will also set ALL permissions for
82
-this client so that it can resume.
83
-
84
-\dot
85
-digraph pw {
86
-  compound=true;
87
-  node shape="box";
88
-  rankdir="TB";
89
-
90
-  dbus label="org.freedesktop.portal.Desktop";
91
-
92
-  portal_access label="PipeWire (mod: Portal Access)";
93
-  portal label="xdg-desktop-portal";
94
-
95
-  dbus -> portal_access arrowhead="dot";
96
-  dbus -> portal arrowhead="dot";
97
-
98
-  portal_access -> portal label="pipewire.access = portal";
99
-
100
-  { rank="same"; portal_access; portal}
101
-}
102
-\enddot
103
-
104
-## The Client
105
-
106
-A client can ask the portal for a connection to the PipeWire daemon.
107
-
108
-\dot
109
-digraph pw {
110
-  compound=true;
111
-  node shape="box";
112
-  rankdir="LR";
113
-
114
-  pw label="PipeWire";
115
-  portal label="xdg-desktop-portal";
116
-  client label="client";
117
-
118
-  client -> portal;
119
-  portal -> pw label="portal.is_portal=true", arrowhead="none"
120
-
121
-  {rank="min"; pw};
122
-  {rank="max"; client};
123
-}
124
-\enddot
125
-
126
-The portal maintains an (unrestricted) connection to the PipeWire daemon with
127
-`"pipewire.access.portal.is_portal" = true` to identify the nodes the client
128
-needs access to. It then creates a new restricted connection for the client,
129
-tagged with additional information.
130
-
131
-\dot
132
-digraph pw {
133
-  compound=true;
134
-  node shape="box";
135
-  rankdir="LR";
136
-
137
-  pw label="PipeWire";
138
-  portal label="xdg-desktop-portal";
139
-  client label="client";
140
-
141
-  client -> portal arrowhead="none";
142
-  portal -> pw label="portal.is_portal=true", arrowhead="none"
143
-  portal -> pw label="portal.app_id = $appid"
144
-
145
-  {rank="min"; pw};
146
-  {rank="max"; client};
147
-}
148
-\enddot
149
-
150
-The file descriptor for this restricted connection is passed back to the
151
-client which can now make use of the resources it has been permitted to
152
-access.
153
-
154
-\dot
155
-digraph pw {
156
-  compound=true;
157
-  node shape="box";
158
-  rankdir="LR";
159
-
160
-  pw label="PipeWire";
161
-  portal label="xdg-desktop-portal";
162
-  client label="client";
163
-
164
-  portal -> pw label="portal.is_portal=true", arrowhead="none"
165
-
166
-  pw->client label="restricted connection";
167
-
168
-  {rank="min"; pw};
169
-  {rank="max"; client};
170
-}
171
-\enddot
172
-
173
-## The Session Manager
174
-
175
-The session manager listens for new clients to appear. It will use the
176
-\ref PW_KEY_ACCESS property to find portal connections. For client connections
177
-from the portal the session manager checks the requested `media_roles` and
178
-enables or disables access to the respective PipeWire objects.
179
-It might have to consult a database to decide what is allowed, for example the
180
-org.freedesktop.impl.portal.PermissionStore(https://flatpak.github.io/xdg-desktop-portal/portal-docs.html#gdbus-org.freedesktop.impl.portal.PermissionStore).
181
-
182
-\dot
183
-strict digraph pw {
184
-  compound=true;
185
-  node shape="box";
186
-  rankdir="LR";
187
-
188
-  portal label="xdg-desktop-portal";
189
-  client label="client";
190
-
191
-
192
-  subgraph {
193
-     rankdir="TB";
194
-     permissions label="PermissionStore";
195
-
196
-     sm->permissions;
197
-
198
-     sm label="Session Manager";
199
-     pw label="PipeWire";
200
-     sm -> pw headlabel="allow $media.roles";
201
pipewire-0.3.85.tar.gz/doc/pipewire-protocol.dox Deleted
201
 
1
@@ -1,1573 +0,0 @@
2
-/** \page page_native_protocol Native Protocol
3
-
4
-PipeWire has a pluggable client/server IPC protocol.
5
-
6
-The reference implementation uses unix sockets and is implemented in
7
-\ref page_module_protocol_native.
8
-
9
-We document the messages here.
10
-
11
-# Message header
12
-
13
-Each message on the unix socket contains a 16 bytes header and a
14
-variable length payload size:
15
-
16
-```
17
-    0                   1                   2                   3
18
-    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
19
-   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
20
-   |                     Id                                        |
21
-   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
22
-   |    opcode     |                   size                        |
23
-   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24
-   |                         seq                                   |
25
-   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
26
-   |                         n_fds                                 |
27
-   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
28
-   |                     payload POD                               |
29
-   .                                                               .
30
-   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
31
-   |                     optional footer POD                       |
32
-   .                                                               .
33
-   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
34
-```
35
-
36
-
37
-These are four uint32 words to be read in native endianness.
38
-
39
-- Id: the message id this is the destination resource/proxy id
40
-- opcode: the opcode on the resource/proxy interface
41
-- size: the size of the payload and optional footer of the message
42
-- seq: an increasing sequence number for each message
43
-- n_fds: number of file descriptors in this message.
44
-
45
-The sender should send along with each message the fds that belong to
46
-the message. If there are more than the maximum number of fds in the
47
-message than can fit in one message, the message is split into multiple
48
-parts.
49
-
50
-A receiver needs to first read the header to know the size of the
51
-complete message. After collecting the complete message, it can start
52
-processing it.
53
-
54
-The payload is a single POD see \ref page_spa_pod for details.
55
-
56
-After the payload, there is an optional footer POD object.
57
-
58
-# Making a connection
59
-
60
-First a connection is made to a unix domain socket. By default, the socket is
61
-named as "pipewire-0" and searched in the following directories:
62
-
63
- - getenv("PIPEWIRE_RUNTIME_DIR")
64
- - getenv("XDG_RUNTIME_DIR")
65
- - getenv("USERPROFILE")
66
-
67
-
68
-The client opens the socket and allocates a Core proxy with id 0 and a Client
69
-proxy with id 1. The proxy is nothing more than a way to identify the remote
70
-objects with an id. Usually they also contain the type and version of the
71
-remote object and some helpers (interfaces) to dispatch messages.
72
-
73
-The server will allocate a new Core resource with id 0. Resources are the
74
-counterpart of client proxies and also typically contain extra information
75
-and helpers (interfaces) to dispatch messages.
76
-
77
-The client sends the Core::Hello message on the socket to start the
78
-communication.
79
-
80
-The server binds the client resource with id 1 to the client. This means
81
-that the client object on the server will now have a resource with a
82
-client side proxy associated with it.
83
-
84
-When the client sends a message for a certain proxy, the server side
85
-resource with the same id for the client is found and the message is
86
-dispatched to the object associated with the resource.
87
-
88
-Similarly when a server sends a message on a resource, the client will
89
-find the proxy with the same id and dispatch the message to it's
90
-associated object.
91
-
92
-The client then sends client properties to the server.
93
-
94
-```
95
-   client                                    server
96
-     |---------------------------------------->|
97
-     |            open socket                  |
98
-     |                                         |
99
-     |---------------------------------------->|
100
-     |            Core::Hello(version)         |
101
-     |                                         |
102
-     |---------------------------------------->|
103
-     |       Client::UpdateProperties          |
104
-     .                                         .
105
-```
106
-
107
-This completes the setup of the client. The newly connected client will
108
-appear in the registry at this point.
109
-
110
-# Core proxy/resource
111
-
112
-The core is always the object with Id 0.
113
-
114
-## Core Methods (Id 0)
115
-
116
-### Core::Hello (Opcode 1)
117
-
118
-The first message sent by a client is the Hello message and contains the
119
-version number of the client.
120
-
121
-```
122
-   Struct(
123
-      Int: version
124
-   )
125
-```
126
-
127
-The version is 3.
128
-
129
-### Core::Sync (Opcode 2)
130
-
131
-The Sync message will result in a Done event from the server. When the Done
132
-event is received, the client can be sure that all operations before the Sync
133
-method have been completed.
134
-
135
-```
136
-   Struct(
137
-      Int: id
138
-      Int: seq
139
-   )
140
-```
141
-
142
-- id: the id will be returned in the Done event.
143
-- seq: is usually generated automatically and will be returned in the Done event.
144
-
145
-### Core::Pong (Opcode 3)
146
-
147
-Is sent from the client to the server when the server emits the Ping event.
148
-The id and seq should be copied from the Ping event.
149
-
150
-```
151
-   Struct(
152
-      Int: id
153
-      Int: seq
154
-   )
155
-```
156
-
157
-### Core::Error (Opcode 4)
158
-
159
-An error occured in an object on the client.
160
-
161
-```
162
-   Struct(
163
-      Int: id
164
-      Int: seq
165
-      Int: res
166
-      String: message
167
-   )
168
-```
169
-
170
-- id: The id of the proxy that is in error.
171
-- seq: a seq number from the failing request (if any)
172
-- res: a negative errno style error code
173
-- message: an error message
174
-
175
-### Core::GetRegistry (Opcode 5)
176
-
177
-A client requests to bind to the registry object and list the available objects
178
-on the server.
179
-
180
-Like with all bindings, first the client allocates a new proxy id and puts this
181
-as the new_id field. Methods and Events can then be sent and received on the 
182
-new_id (in the message Id field).
183
-
184
-```
185
-   Struct(
186
-      Int: version
187
-      Int: new_id
188
-   )
189
-```
190
-- version: the version of the registry interface used on the client
191
-- new_id: the id of the new proxy with the registry interface
192
-
193
-After this method, the server will start sending Registry::Global events
194
-to the proxy with new_id.
195
-
196
-```
197
-   client                                    server
198
-     |                                         |
199
-     | new proxy(new_id)                       |
200
-     |---------------------------------------->|  new resource(new_id)
201
pipewire-0.3.85.tar.gz/doc/pipewire-scheduling.dox Deleted
195
 
1
@@ -1,193 +0,0 @@
2
-/** \page page_scheduling Graph Scheduling
3
-
4
-This document tries to explain how the PipeWire graph is scheduled.
5
-
6
-Graph are constructed from linked nodes together with their ports. This
7
-results in a dependency graph between nodes. Special care is taken for
8
-loopback links so that the graph remains a directed graph.
9
-
10
-
11
-# Nodes
12
-
13
-Nodes are objects with 0 or more input and output ports.
14
-
15
-Each node also has:
16
-
17
-- an eventfd to signal the node that it can start processing
18
-- an activation record that lives in shared memory with memfd.
19
-
20
-```
21
-   eventfd
22
-  +-^---------+
23
-  |           |
24
- in          out
25
-  |           |
26
-  +-v---------+
27
-    activation {
28
-      status:OK,        // bitmask of NEED_DATA, HAVE_DATA or OK
29
-      pending:0,   // number of unsatisfied dependencies to be able to run
30
-      required:0        // number of dependencies with other nodes
31
-    }
32
-```
33
-
34
-The activation record has the following information:
35
-
36
- - processing state and pending dependencies. As long as there are pending dependencies
37
-   the node can not be processed. This is the only relevant information for actually
38
-   scheduling the graph and is shown in the above illustration.
39
- - Current status of the node and profiling info (TRIGGERED, AWAKE, FINISHED, timestamps
40
-   when the node changed state).
41
- - Timing information, mostly for drivers when the processing started, the time, duration
42
-   and rate (quantum) etc..
43
- - Information about repositions (seek) and timebase owners.
44
-
45
-
46
-# Links
47
-
48
-When two nodes are linked together, the output node becomes a dependency for the input
49
-node. This means the input node can only start processing when the output node is finished.
50
-
51
-This dependency is reflected in the required counter in the activation record. In below
52
-illustration, B's required field is incremented with 1. The pending field is set to the
53
-required field when the graph is started. Node A will keep a list of all targets (B) that it
54
-is a dependency of.
55
-
56
-This dependency update is only performed when the link is ready (negotiated) and the nodes
57
-are ready to schedule (runnable).
58
-
59
-
60
-```
61
-   eventfd                                eventfd
62
-  +-^---------+                          +-^---------+
63
-  |           |        link              |           |
64
- in     A    out ---------------------> in     B    out
65
-  |           |                          |           |
66
-  +-v---------+                          +-v---------+
67
-    activation {       target              activation {
68
-      status:OK,  -------------------->      status:OK,
69
-      pending:0,                             pending:1,
70
-      required:0                             required:1
71
-    }                                      }
72
-```
73
-
74
-Multiple links between A and B will only result in 1 target link between A and B.
75
-
76
-
77
-# Drivers
78
-
79
-The graph can only run if there is a driver node that is in some way linked to an
80
-active node.
81
-
82
-The driver is special because it will have to initiate the processing in the graph. It
83
-will use a timer or some sort of interrupt from hardware to start the cycle.
84
-
85
-Any node can also be a candidate for a driver (when the node.driver property is true).
86
-PipeWire will select the node with the highest priority.driver property as the driver.
87
-
88
-Nodes will be assigned to the driver node they will be scheduled with. Each node holds
89
-a reference to the driver and increments the required field of the driver.
90
-
91
-When a node is ready to be scheduled, the driver adds the node to its list of targets
92
-and increments the required field.
93
-
94
-
95
-```
96
-   eventfd                                eventfd
97
-  +-^---------+                          +-^---------+
98
-  |           |        link              |           |
99
- in     A    out ---------------------> in     B    out
100
-  |           |                          |           |
101
-  +-v---------+                          +-v---------+
102
-    activation {       target              activation {
103
-      status:OK,  -------------------->      status:OK,
104
-      pending:0,                             pending:0,
105
-      required:1                             required:2
106
-    }                                      }
107
-      |    ^                         ^
108
-      |    |                        /   /
109
-      |    |                       /   /
110
-      |    |                      /   /
111
-      |    |                     /   /
112
-      |    |                    /   /
113
-      v    |     /-------------/   /
114
-    activation {                  /
115
-      status:OK, V---------------/
116
-      pending:0,
117
-      required:2
118
-    }
119
-  +-^---------+
120
-  |           |
121
-  |   driver  |
122
-  |           |
123
-  +-v---------+
124
-   eventfd
125
-```
126
-
127
-As seen in the illustration above, the driver holds a link to each node it needs to
128
-schedule and each node holds a link to the driver. Some nodes hold a link to other
129
-nodes.
130
-
131
-It is possible that the driver is the same as a node in the graph (for example node A)
132
-but conceptually, the links above are still valid.
133
-
134
-The driver will then start processing the graph by emitting the ready signal. PipeWire
135
-will then:
136
-
137
- - Check the previous cycle. Did it complete? Mark xrun on unfinished nodes.
138
- - Perform reposition requests if any, timebase changes, etc..
139
- - The pending counter of each follower node is set to the required field.
140
- - It then loops over all targets of the driver and atomically decrements the required
141
-   field of the activation record. When the required field is 0, the eventfd is signaled
142
-   and the node can be scheduled.
143
-
144
-In our example above, Node A and B will have their pending state decremented. Node A
145
-will be 0 and will be triggered first (node B has 2 pending dependencies to start with and
146
-will not be triggered yet). The driver itself also has 2 dependencies left and will not
147
-be triggered (complete) yet.
148
-
149
-## Scheduling node A
150
-
151
-When the eventfd is signaled on a node, we say the node is triggered and it will be able
152
-to process data. It consumes the input on the input ports and produces more data on the
153
-output ports.
154
-
155
-After processing, node A goes through the list of targets and decrements each pending
156
-field (node A has a reference to B and the driver).
157
-
158
-In our above example, the driver is decremented (from 2 to 1) but is not yet triggered.
159
-node B is decremented (from 1 to 0) and is triggered by writing to the eventfd.
160
-
161
-## Scheduling node B
162
-
163
-Node B is scheduled and processes the input from node A. It then goes through the list of
164
-targets and decrements the pending fields.  It decrements the pending field of the
165
-driver (from 1 to 0) and triggers the driver.
166
-
167
-## Scheduling the driver
168
-
169
-The graph always completes after the driver is triggered and scheduled. All required
170
-fields from all the nodes in the target list of the driver are now 0.
171
-
172
-The driver calculates some stats about cpu time etc.
173
-
174
-# Remote nodes.
175
-
176
-For remote nodes, the eventfd and the activation is transfered from the server
177
-to the client.
178
-
179
-This means that writing to the remote client eventfd will wake the client directly
180
-without going to the server first.
181
-
182
-All remote clients also get the activation and eventfd of the peer and driver they
183
-are linked to and can directly trigger peers and drivers without going to the
184
-server first.
185
-
186
-## Remote driver nodes.
187
-
188
-Remote drivers start the graph cycle directly without going to the server first.
189
-
190
-After they complete (and only when the profiler is active), they will trigger an
191
-extra eventfd to signal the server that the graph completed. This is used by the
192
-server to generate the profiler info.
193
-
194
-*/
195
pipewire-0.3.85.tar.gz/doc/pipewire-tools.dox.in Deleted
9
 
1
@@ -1,7 +0,0 @@
2
-/** \page page_tools PipeWire Tools
3
-
4
-Manual pages:
5
-
6
-@man_subpages@
7
-
8
-*/
9
pipewire-0.3.85.tar.gz/doc/pipewire.dox Deleted
28
 
1
@@ -1,26 +0,0 @@
2
-/** \page page_pipewire PipeWire Design
3
-
4
-# Internals
5
-
6
-- \subpage page_design
7
-- \subpage page_audio
8
-- \subpage page_access
9
-- \subpage page_portal
10
-- \subpage page_midi
11
-- \subpage page_objects_design
12
-- \subpage page_library
13
-- \subpage page_dma_buf
14
-- \subpage page_scheduling
15
-- \subpage page_native_protocol
16
-
17
-
18
-# Components
19
-
20
-- \subpage page_daemon
21
-- \subpage page_session_manager
22
-
23
-# Backends
24
-
25
-- \subpage page_pulseaudio
26
-
27
-*/
28
pipewire-0.3.85.tar.gz/doc/tutorial.dox Deleted
23
 
1
@@ -1,21 +0,0 @@
2
-/** \page page_tutorial Tutorial
3
-
4
-Welcome to the PipeWire tutorial. The goal is to learn
5
-PipeWire API step-by-step with simple short examples.
6
-
7
-- \subpage page_tutorial1
8
-- \subpage page_tutorial2
9
-- \subpage page_tutorial3
10
-- \subpage page_tutorial4
11
-- \subpage page_tutorial5
12
-- \subpage page_tutorial6
13
-
14
-
15
-# More Example Programs
16
-
17
-- \ref audio-src.c "": \snippet{doc} audio-src.c title
18
-- \ref audio-dsp-filter.c "": \snippet{doc} audio-dsp-filter.c title
19
-- \ref video-play.c "": \snippet{doc} video-play.c title
20
-- \subpage page_examples
21
-
22
-*/
23
pipewire-0.3.85.tar.gz/man Deleted
2
 
1
-(directory)
2
pipewire-0.3.85.tar.gz/man/meson.build Deleted
47
 
1
@@ -1,45 +0,0 @@
2
-manpage_conf = configuration_data()
3
-manpage_conf.set('PACKAGE_NAME', meson.project_name())
4
-manpage_conf.set('PACKAGE_VERSION', meson.project_version())
5
-manpage_conf.set('PACKAGE_URL', 'https://pipewire.org')
6
-manpage_conf.set('PACKAGE_BUGREPORT', 'https://gitlab.freedesktop.org/pipewire/pipewire/issues')
7
-manpage_conf.set('PIPEWIRE_CONFIG_DIR', pipewire_configdir)
8
-manpage_conf.set('PIPEWIRE_CONFDATADIR', pipewire_confdatadir)
9
-
10
-manpages = 
11
-  'pipewire.1.rst.in',
12
-  'pipewire-pulse.1.rst.in',
13
-  'pipewire.conf.5.rst.in',
14
-  'pw-cat.1.rst.in',
15
-  'pw-cli.1.rst.in',
16
-  'pw-config.1.rst.in',
17
-  'pw-dot.1.rst.in',
18
-  'pw-link.1.rst.in',
19
-  'pw-metadata.1.rst.in',
20
-  'pw-mididump.1.rst.in',
21
-  'pw-mon.1.rst.in',
22
-  'pw-profiler.1.rst.in',
23
-  'pw-top.1.rst.in',
24
-
25
-
26
-if get_option('pipewire-jack').allowed()
27
-  manpages += 'pw-jack.1.rst.in'
28
-endif
29
-
30
-if not generate_manpages
31
-  subdir_done()
32
-endif
33
-
34
-foreach m : manpages
35
-  file = m.split('.rst.in').get(0)
36
-  rst = configure_file(input : m,
37
-                       output : file + '.rst',
38
-                       configuration : manpage_conf)
39
-  section = file.split('.').get(-1)
40
-  custom_target(file + '.target',
41
-                output : file,
42
-                input : rst,
43
-                command : rst2man, '@INPUT@', '@OUTPUT@',
44
-                install : true,
45
-                install_dir : get_option('mandir') / 'man' + section)
46
-endforeach
47
pipewire-0.3.85.tar.gz/man/pipewire-pulse.1.rst.in Deleted
50
 
1
@@ -1,48 +0,0 @@
2
-pipewire-pulse
3
-##############
4
-
5
------------------------------------
6
-The PipeWire PulseAudio replacement
7
------------------------------------
8
-
9
-:Manual section: 1
10
-:Manual group: General Commands Manual
11
-
12
-SYNOPSIS
13
-========
14
-
15
-| **pipewire-pulse** *options*
16
-
17
-DESCRIPTION
18
-===========
19
-
20
-**pipewire-pulse** starts a PulseAudio-compatible daemon that integrates with
21
-the PipeWire media server, by running a pipewire process through a systemd
22
-service. This daemon is a drop-in replacement for the PulseAudio daemon.
23
-
24
-OPTIONS
25
-=======
26
-
27
--h | --help
28
-  Show help.
29
-
30
--v | --verbose
31
-  Increase the verbosity by one level. This option may be specified multiple
32
-  times.
33
-
34
---version
35
-  Show version information.
36
-
37
--c | --config=FILE
38
-  Load the given config file (Default: pipewire-pulse.conf).
39
-
40
-AUTHORS
41
-=======
42
-
43
-The PipeWire Developers <@PACKAGE_BUGREPORT@>;
44
-PipeWire is available from @PACKAGE_URL@
45
-
46
-SEE ALSO
47
-========
48
-
49
-``pipewire(1)``
50
pipewire-0.3.85.tar.gz/man/pipewire.1.rst.in Deleted
56
 
1
@@ -1,54 +0,0 @@
2
-pipewire
3
-########
4
-
5
--------------------------
6
-The PipeWire media server
7
--------------------------
8
-
9
-:Manual section: 1
10
-:Manual group: General Commands Manual
11
-
12
-SYNOPSIS
13
-========
14
-
15
-| **pipewire** *options*
16
-
17
-DESCRIPTION
18
-===========
19
-
20
-PipeWire is a service that facilitates sharing of multimedia content
21
-between devices and applications.
22
-
23
-The **pipewire** daemon reads a config file that is further documented in
24
-``pipewire.conf(5)`` manual page.
25
-
26
-OPTIONS
27
-=======
28
-
29
--h | --help
30
-  Show help.
31
-
32
--v | --verbose
33
-  Increase the verbosity by one level. This option may be specified multiple
34
-  times.
35
-
36
---version
37
-  Show version information.
38
-
39
--c | --config=FILE
40
-  Load the given config file (Default: pipewire.conf).
41
-
42
-AUTHORS
43
-=======
44
-
45
-The PipeWire Developers <@PACKAGE_BUGREPORT@>;
46
-PipeWire is available from @PACKAGE_URL@
47
-
48
-SEE ALSO
49
-========
50
-
51
-``pw-top(1)``,
52
-``pw-dump(1)``,
53
-``pw-mon(1)``,
54
-``pw-cat(1)``,
55
-``pw-cli(1)``,
56
pipewire-0.3.85.tar.gz/man/pipewire.conf.5.rst.in Deleted
114
 
1
@@ -1,112 +0,0 @@
2
-pipewire.conf
3
-#############
4
-
5
---------------------------------------
6
-The PipeWire server configuration file
7
---------------------------------------
8
-
9
-:Manual section: 5
10
-:Manual group: File Formats Manual
11
-
12
-.. _synopsis:
13
-
14
-SYNOPSIS
15
-========
16
-
17
-*$XDG_CONFIG_HOME/pipewire/pipewire.conf*
18
-
19
-*@PIPEWIRE_CONFIG_DIR@/pipewire.conf*
20
-
21
-*@PIPEWIRE_CONFDATADIR@/pipewire.conf*
22
-
23
-*@PIPEWIRE_CONFDATADIR@/pipewire.conf.d/*
24
-
25
-*@PIPEWIRE_CONFIG_DIR@/pipewire.conf.d/*
26
-
27
-*$XDG_CONFIG_HOME/pipewire/pipewire.conf.d/*
28
-
29
-DESCRIPTION
30
-===========
31
-
32
-PipeWire is a service that facilitates sharing of multimedia content
33
-between devices and applications.
34
-
35
-On startup, the daemon reads a main configuration file to configure
36
-itself. It executes a series of commands listed in the config
37
-file.
38
-
39
-The config files are loaded in the order listed in the SYNOPSIS_.
40
-The environment variables ``PIPEWIRE_CONFIG_DIR``, ``PIPEWIRE_CONFIG_PREFIX``
41
-and ``PIPEWIRE_CONFIG_NAME`` can be used to specify an alternative config
42
-directory, subdirectory and file respectively.
43
-
44
-Next to the configuration file can be a directory with the same name as
45
-the file with a ``.d/`` suffix. All directories in the SYNOPSIS_ directory
46
-search paths are traversed in the listed order and the contents of the
47
-``*.conf`` files inside them are appended to the main configuration file
48
-as overrides. Object sections are merged and array sections are appended.
49
-
50
-
51
-CONFIGURATION FILE FORMAT
52
-=========================
53
-
54
-The configuration file format is grouped into sections. A section
55
-is either a dictionary, {}, or an array, . Dictionary and array
56
-entries are separated by whitespace and may be simple value
57
-assignment, an array or a dictionary. For example:
58
-
59
-name = value # simple assignment
60
-
61
-name = { key1 = value1 key2 = value2 } # a dictionary with two
62
-entries
63
-
64
-name =  value1 value2  # an array with two entries
65
-
66
-name =  { k = v1 } { k = v2 }  # an array of dictionaries
67
-
68
-
69
-The configuration files can be expressed in full JSON syntax but for ease
70
-of use, a relaxed format may be used where:
71
-
72
- * ``:`` to delimit keys and values can be substuted by ``=`` or a space.
73
- * ``"`` around keys and string can be omitted as long as no special characters are used in the strings.
74
- * ``,`` to separate objects can be replaced with a whitespace character.
75
- * ``#`` can be used to start a comment until the line end
76
-
77
-
78
-CONFIGURATION FILE SECTIONS
79
-===========================
80
-
81
-context.properties
82
-  Dictionary. These properties configure the PipeWire instance.
83
-
84
-context.spa-libs
85
-  Dictionary. Maps plugin features with globs to a spa library.
86
-
87
-context.modules
88
-  Array of dictionaries. Each entry in the array is a dictionary with the *name* of the module to load,
89
-  including optional *args* and *flags*. Most modules support being loaded
90
-  multiple times.
91
-
92
-context.objects
93
-  Array of dictionaries. Each entry in the array is a dictionary containing the *factory* to create an
94
-  object from and optional extra arguments specific to that factory.
95
-
96
-context.exec
97
-  Array of dictionaries. Each entry in the array is dictionary containing the *path* of a program to
98
-  execute on startup and optional *args*.
99
-
100
-  This array used to contain an entry to start the session manager but this mode
101
-  of operation has since been demoted to development aid. Avoid starting a
102
-  session manager in this way in production environment.
103
-
104
-AUTHORS
105
-=======
106
-
107
-The PipeWire Developers <@PACKAGE_BUGREPORT@>; PipeWire is available from @PACKAGE_URL@
108
-
109
-SEE ALSO
110
-========
111
-
112
-``pipewire(1)``,
113
-``pw-mon(1)``,
114
pipewire-0.3.85.tar.gz/man/pw-cat.1.rst.in Deleted
178
 
1
@@ -1,176 +0,0 @@
2
-pw-cat
3
-######
4
-
5
------------------------------------
6
-Play and record media with PipeWire
7
------------------------------------
8
-
9
-:Manual section: 1
10
-:Manual group: General Commands Manual
11
-
12
-SYNOPSIS
13
-========
14
-
15
-| **pw-cat** *options* *FILE* \| -
16
-| **pw-play** *options* *FILE* \| -
17
-| **pw-record** *options* *FILE* \| -
18
-| **pw-midiplay** *options* *FILE* \| -
19
-| **pw-midirecord** *options* *FILE* \| -
20
-| **pw-dsdplay** *options* *FILE* \| -
21
-
22
-DESCRIPTION
23
-===========
24
-
25
-**pw-cat** is a simple tool for playing back or
26
-capturing raw or encoded media files on a PipeWire
27
-server. It understands all audio file formats supported by
28
-``libsndfile`` for PCM capture and playback. When capturing PCM, the filename
29
-extension is used to guess the file format with the WAV file format as
30
-the default.
31
-
32
-It understands standard MIDI files for playback and recording. This tool
33
-will not render MIDI files, it will simply make the MIDI events available
34
-to the graph. You need a MIDI renderer such as qsynth, timidity or a hardware
35
-MIDI rendered to hear the MIDI.
36
-
37
-DSD playback is supported with the DSF file format. This tool will only work
38
-with native DSD capable hardware and will produce an error when no such
39
-hardware was found.
40
-
41
-When the *FILE* is - input and output will be raw data from STDIN and
42
-STDOUT respectively.
43
-
44
-OPTIONS
45
-=======
46
-
47
--h | --help
48
-  Show help.
49
-
50
---version
51
-  Show version information.
52
-
53
--v | --verbose
54
-  Verbose operation.
55
-
56
--R | --remote=NAME
57
-  The name the *remote* instance to connect to. If left unspecified,
58
-  a connection is made to the default PipeWire instance.
59
-
60
--p | --playback
61
-  Playback mode. Read data from the specified file, and play it back. If the tool
62
-  is called under the name **pw-play** or **pw-midiplay** this is the default.
63
-
64
--r | --record
65
-  Recording mode. Capture data and write it to the specified file. If the tool is
66
-  called under the name **pw-record** or **pw-midirecord** this is the default.
67
-
68
--m | --midi
69
-  MIDI mode. *FILE* is a MIDI file. If the tool is called under the name
70
-  **pw-midiplay** or **pw-midirecord** this is the default.
71
-  Note that this program will *not* render the MIDI events into audible samples,
72
-  it will simply provide the MIDI events in the graph. You need a separate
73
-  MIDI renderer such as qsynth, timidity or a hardware renderer to hear the MIDI.
74
-
75
--d | --dsd
76
-  DSD mode. *FILE* is a DSF file. If the tool is called under the name
77
-  **pw-dsdplay** this is the default.
78
-  Note that this program will *not* render the DSD audio. You need a DSD capable
79
-  device to play DSD content or this program will exit with an error.
80
-
81
---media-type=VALUE
82
-  Set the media type property (default Audio/Midi depending on mode).
83
-  The media type is used by the session manager to select a suitable target
84
-  to link to.
85
-
86
---media-category=VALUE
87
-  Set the media category property (default Playback/Capture depending on mode).
88
-  The media type is used by the session manager to select a suitable target
89
-  to link to.
90
-
91
---media-role=VALUE
92
-  Set the media role property (default Music).
93
-  The media type is used by the session manager to select a suitable target
94
-  to link to.
95
-
96
---target=VALUE
97
-  Set a node target (default auto). The value can be:
98
-
99
-  auto
100
-    Automatically select (Default)
101
-
102
-  0
103
-    Don't try to link this node
104
-
105
-  <id>
106
-    The object.serial or the node.name of a target node
107
-
108
---latency=VALUE*units*
109
-  Set the node latency (default 100ms)
110
-
111
-  The latency determines the minimum amount of time it takes
112
-  for a sample to travel from application to device (playback) and
113
-  from device to application (capture).
114
-
115
-  The latency determines the size of the buffers that the
116
-  application will be able to fill. Lower latency means smaller
117
-  buffers but higher overhead. Higher latency means larger buffers
118
-  and lower overhead.
119
-
120
-  Units can be **s** for seconds, **ms** for milliseconds,
121
-  **us** for microseconds, **ns** for nanoseconds.
122
-  If no units are given, the latency value is samples with the samplerate
123
-  of the file.
124
-
125
--P | --properties=VALUE
126
-  Set extra stream properties as a JSON object.
127
-
128
--q | --quality=VALUE
129
-  Resampler quality. When the samplerate of the source or
130
-  destination file does not match the samplerate of the server, the
131
-  data will be resampled. Higher quality uses more CPU. Values between 0 and 15 are
132
-  allowed, the default quality is 4.
133
-
134
---rate=VALUE
135
-  The sample rate, default 48000.
136
-
137
---channels=VALUE
138
-  The number of channels, default 2.
139
-
140
---channel-map=VALUE
141
-  The channelmap. Possible values include:
142
-  **mono**, **stereo**, **surround-21**,
143
-  **quad**, **surround-22**, **surround-40**,
144
-  **surround-31**, **surround-41**,
145
-  **surround-50**, **surround-51**,
146
-  **surround-51r**, **surround-70**,
147
-  **surround-71** or a comma separated list of channel names:
148
-  **FL**, **FR**, **FC**, **LFE**,
149
-  **SL**, **SR**, **FLC**, **FRC**,
150
-  **RC**, **RL**, **RR**, **TC**,
151
-  **TFL**, **TFC**, **TFR**, **TRL**,
152
-  **TRC**, **TRR**, **RLC**, **RRC**,
153
-  **FLW**, **FRW**, **LFE2**, **FLH**,
154
-  **FCH**, **FRH**, **TFLC**, **TFRC**,
155
-  **TSL**, **TSR**, **LLFR**, **RLFE**,
156
-  **BC**, **BLC**, **BRC**
157
-
158
---format=VALUE
159
-  The sample format to use. One of:
160
-  **u8**, **s8**, **s16** (default), **s24**, **s32**,
161
-  **f32**, **f64**.
162
-
163
---volume=VALUE
164
-  The stream volume, default 1.000.
165
-  Depending on the locale you have configured, "," or "." may be
166
-  used as a decimal separator. Check with **locale** command.
167
-
168
-AUTHORS
169
-=======
170
-
171
-The PipeWire Developers <@PACKAGE_BUGREPORT@>; PipeWire is available from @PACKAGE_URL@
172
-
173
-SEE ALSO
174
-========
175
-
176
-``PipeWire(1)``,
177
-``pw-mon(1)``,
178
pipewire-0.3.85.tar.gz/man/pw-cli.1.rst.in Deleted
197
 
1
@@ -1,195 +0,0 @@
2
-pw-cli
3
-######
4
-
5
------------------------------------
6
-The PipeWire Command Line Interface
7
------------------------------------
8
-
9
-:Manual section: 1
10
-:Manual group: General Commands Manual
11
-
12
-SYNOPSIS
13
-========
14
-
15
-| **pw-cli** *command*
16
-
17
-DESCRIPTION
18
-===========
19
-
20
-Interact with a PipeWire instance.
21
-
22
-When a command is given, **pw-cli**
23
-will execute the command and exit
24
-
25
-When no command is given, **pw-cli**
26
-starts an interactive session with the default PipeWire instance
27
-*pipewire-0*.
28
-
29
-Connections to other, remote instances can be made. The current instance
30
-name is displayed at the prompt.
31
-
32
-Note that **pw-cli** also creates a local PipeWire instance. Some commands
33
-operate on the current (remote) instance and some on the local instance, such
34
-as module loading.
35
-
36
-Use the 'help' command to list the available commands.
37
-
38
-GENERAL COMMANDS
39
-================
40
-
41
-help | h
42
-  Show a quick help on the commands available. It also lists the aliases
43
-  for many commands.
44
-
45
-quit | q
46
-  Exit from **pw-cli**
47
-
48
-MODULE MANAGEMENT
49
-=================
50
-
51
-| Modules are loaded and unloaded in the local instance, thus the pw-cli
52
-| binary itself and can add functionality or objects to the local
53
-| instance. It is not possible in PipeWire to load modules in another
54
-| instance.
55
-
56
-load-module *name* *arguments...*
57
-  Load a module specified by its name and arguments in the local instance.
58
-  For most modules it is OK to be loaded more than once.
59
-
60
-  This command returns a module variable that can be used
61
-  to unload the module.
62
-
63
-  The locally module is *not* visible in the remote instance. It is not
64
-  possible in PipeWire to load modules in a remote instance.
65
-
66
-unload-module *module-var*
67
-  Unload a module, specified either by its variable.
68
-
69
-OBJECT INTROSPECTION
70
-====================
71
-
72
-list-objects
73
-  List the objects of the current instance.
74
-
75
-  Objects are listed with their *id*, *type* and *version*.
76
-
77
-info *id* | *all*
78
-  Get information about a specific object or *all* objects.
79
-
80
-  Requesting info about an object will also notify you of changes.
81
-
82
-WORKING WITH REMOTES
83
-====================
84
-
85
-connect *remote-name*
86
-  Connect to a remote instance and make this the new current
87
-  instance.
88
-
89
-  If no remote name is specified, a connection is made to
90
-  the default remote instance, usually *pipewire-0*.
91
-
92
-  The special remote name called *internal* can be used to connect to
93
-  the local **pw-cli** PipeWire instance.
94
-
95
-  This command returns a remote var that can be used to disconnect or
96
-  switch remotes.
97
-
98
-disconnect *remote-var*
99
-  Disconnect from a *remote instance*.
100
-
101
-  If no remote name is specified, the current instance is disconnected.
102
-
103
-list-remotes
104
-  List all *remote instances*.
105
-
106
-switch-remote *remote-var*
107
-  Make the specified *remote* the current instance.
108
-
109
-  If no remote name is specified, the first instance is made current.
110
-
111
-NODE MANAGEMENT
112
-===============
113
-
114
-create-node *factory-name* *properties...*
115
-  Create a node from a factory in the current instance.
116
-
117
-  Properties are key=value pairs separated by whitespace.
118
-
119
-  This command returns a *node variable*.
120
-
121
-export-node *node-id* *remote-var*
122
-  Export a node from the local instance to the specified instance.
123
-  When no instance is specified, the node will be exported to the current
124
-  instance.
125
-
126
-DEVICE MANAGEMENT
127
-=================
128
-
129
-create-device *factory-name* *properties...*
130
-  Create a device from a factory in the current instance.
131
-
132
-  Properties are key=value pairs separated by whitespace.
133
-
134
-  This command returns a *device variable*.
135
-
136
-
137
-LINK MANAGEMENT
138
-===============
139
-
140
-create-link *node-id* *port-id* *node-id* *port-id* *properties...*
141
-  Create a link between 2 nodes and ports.
142
-
143
-  Port *ids* can be *-1* to automatically select an available port.
144
-
145
-  Properties are key=value pairs separated by whitespace.
146
-
147
-  This command returns a *link variable*.
148
-
149
-GLOBALS MANAGEMENT
150
-==================
151
-
152
-destroy *object-id*
153
-  Destroy a global object.
154
-
155
-
156
-PARAMETER MANAGEMENT
157
-====================
158
-
159
-enum-params *object-id* *param-id*
160
-  Enumerate params of an object.
161
-
162
-  *param-id* can also be given as the param short name.
163
-
164
-set-param *object-id* *param-id* *param-json*
165
-  Set param of an object.
166
-
167
-  *param-id* can also be given as the param short name.
168
-
169
-PERMISSION MANAGEMENT
170
-=====================
171
-
172
-permissions *client-id* *object-id* *permission*
173
-  Set permissions for a client.
174
-
175
-  *object-id* can be *-1* to set the default permissions.
176
-
177
-get-permissions *client-id*
178
-  Get permissions of a client.
179
-
180
-
181
-COMMAND MANAGEMENT
182
-==================
183
-
184
-send-command *object-id*
185
-  Send a command to an object.
186
-
187
-AUTHORS
188
-=======
189
-
190
-The PipeWire Developers <@PACKAGE_BUGREPORT@>; PipeWire is available from @PACKAGE_URL@
191
-
192
-SEE ALSO
193
-========
194
-
195
-``pipewire(1)``,
196
-``pw-mon(1)``,
197
pipewire-0.3.85.tar.gz/man/pw-config.1.rst.in Deleted
112
 
1
@@ -1,110 +0,0 @@
2
-pw-config
3
-#########
4
-
5
------------------------------
6
-Debug PipeWire Config parsing
7
------------------------------
8
-
9
-:Manual section: 1
10
-:Manual group: General Commands Manual
11
-
12
-SYNOPSIS
13
-========
14
-
15
-| **pw-config** *options* paths
16
-
17
-| **pw-config** *options* list *SECTION*
18
-
19
-| **pw-config** *options* merge *SECTION*
20
-
21
-DESCRIPTION
22
-===========
23
-
24
-List config paths and config sections and display the parsed
25
-output.
26
-
27
-This tool can be used to get an overview of the config file that will be
28
-parsed by the PipeWire server and clients.
29
-
30
-COMMON OPTIONS
31
-==============
32
-
33
--h | --help
34
-  Show help.
35
-
36
---version
37
-  Show version information.
38
-
39
--n | --name=NAME
40
-  Config Name (default 'pipewire.conf')
41
-
42
--p | --prefix=PREFIX
43
-  Config Prefix (default '')
44
-
45
--L | --no-newline
46
-  Omit newlines after values
47
-
48
--r | --recurse
49
-  Reformat config sections recursively
50
-
51
--N | --no-colors
52
-  Disable color output
53
-
54
--C | --color=WHEN
55
-  whether to enable color support. WHEN is `never`, `always`, or `auto`
56
-
57
-LISTING PATHS
58
-=============
59
-
60
-Specify the paths command. It will display all the config files that will
61
-be parsed and in what order.
62
-
63
-LISTING CONFIG SECTIONS
64
-=======================
65
-
66
-Specify the list command with an optional *SECTION* to list the configuration
67
-fragments used for *SECTION*. Without a *SECTION*, all sections will be
68
-listed.
69
-
70
-Use the -r options to reformat the sections.
71
-
72
-MERGING A CONFIG SECTION
73
-========================
74
-
75
-With the merge option and a *SECTION*, pw-config will merge all config files into
76
-a merged config section and dump the results. This will be the section used by
77
-the client or server.
78
-
79
-Use the -r options to reformat the sections.
80
-
81
-EXAMPLES
82
-========
83
-
84
-**pw-config**
85
-  List all config files that will be used
86
-
87
-**pw-config** -n pipewire-pulse.conf
88
-  List all config files that will be used by the PipeWire pulseaudio server.
89
-
90
-**pw-config** -n pipewire-pulse.conf list
91
-  List all config sections used by the PipeWire pulseaudio server
92
-
93
-**pw-config** -n jack.conf list context.properties
94
-  List the context.properties fragments used by the JACK clients
95
-
96
-**pw-config** -n jack.conf merge context.properties
97
-  List the merged context.properties used by the JACK clients
98
-
99
-**pw-config** -n pipewire.conf -r merge context.modules
100
-  List the merged context.modules used by the PipeWire server and reformat
101
-
102
-AUTHORS
103
-=======
104
-
105
-The PipeWire Developers <@PACKAGE_BUGREPORT@>; PipeWire is available from @PACKAGE_URL@
106
-
107
-SEE ALSO
108
-========
109
-
110
-``pipewire(1)``,
111
-``pw-dump(1)``,
112
pipewire-0.3.85.tar.gz/man/pw-dot.1.rst.in Deleted
67
 
1
@@ -1,65 +0,0 @@
2
-pw-dot
3
-######
4
-
5
----------------------------
6
-The PipeWire dot graph dump
7
----------------------------
8
-
9
-:Manual section: 1
10
-:Manual group: General Commands Manual
11
-
12
-SYNOPSIS
13
-========
14
-
15
-| **pw-dot** *options*
16
-
17
-DESCRIPTION
18
-===========
19
-
20
-Create a .dot file of the PipeWire graph.
21
-
22
-The .dot file can then be visualized with a tool like **dotty**
23
-or rendered to a PNG file with ``dot -Tpng pw.dot -o pw.png``.
24
-
25
-OPTIONS
26
-=======
27
-
28
--r | --remote=NAME
29
-  The name the remote instance to connect to. If left unspecified,
30
-  a connection is made to the default PipeWire instance.
31
-
32
--h | --help
33
-  Show help.
34
-
35
---version
36
-  Show version information.
37
-
38
--a | --all
39
-  Show all object types.
40
-
41
--s | --smart
42
-  Show linked objects only.
43
-
44
--d | --detail
45
-  Show all object properties.
46
-
47
--o FILE | --output=FILE
48
-  Output file name (Default pw.dot). Use - for stdout.
49
-
50
--L | --lr
51
-  Lay the graph from left to right, instead of dot's default top to bottom.
52
-
53
--9 | --90
54
-  Lay the graph using 90-degree angles in edges.
55
-
56
-AUTHORS
57
-=======
58
-
59
-The PipeWire Developers <@PACKAGE_BUGREPORT@>; PipeWire is available from @PACKAGE_URL@
60
-
61
-SEE ALSO
62
-========
63
-
64
-``pipewire(1)``,
65
-``pw-cli(1)``,
66
-``pw-mon(1)``,
67
pipewire-0.3.85.tar.gz/man/pw-jack.1.rst.in Deleted
67
 
1
@@ -1,65 +0,0 @@
2
-pw-jack
3
-#######
4
-
5
-----------------------------
6
-Use PipeWire instead of JACK
7
-----------------------------
8
-
9
-:Manual section: 1
10
-:Manual group: General Commands Manual
11
-
12
-SYNOPSIS
13
-========
14
-
15
-| **pw-jack** *options* *COMMAND* *FILE*
16
-
17
-DESCRIPTION
18
-===========
19
-
20
-**pw-jack** modifies the ``LD_LIBRARY_PATH`` environment
21
-variable so that applications will load PipeWire's reimplementation
22
-of the JACK client libraries instead of JACK's own
23
-libraries. This results in JACK clients being redirected to
24
-PipeWire.
25
-
26
-If PipeWire's reimplementation of the JACK client libraries
27
-has been installed as a system-wide replacement for JACK's
28
-own libraries, then the whole system already behaves in that way,
29
-in which case **pw-jack** has no practical effect.
30
-
31
-OPTIONS
32
-=======
33
-
34
--h
35
-  Show help.
36
-
37
--r NAME
38
-  The name of the remote instance to connect to. If left
39
-  unspecified, a connection is made to the default PipeWire
40
-  instance.
41
-
42
--v
43
-  Verbose operation.
44
-
45
-EXAMPLES
46
-========
47
-
48
-| **pw-jack** sndfile-jackplay /usr/share/sounds/freedesktop/stereo/bell.oga
49
-
50
-NOTES
51
-=====
52
-
53
-Using PipeWire for audio is currently considered to be
54
-experimental.
55
-
56
-AUTHORS
57
-=======
58
-
59
-The PipeWire Developers <@PACKAGE_BUGREPORT@>;
60
-PipeWire is available from @PACKAGE_URL@
61
-
62
-SEE ALSO
63
-========
64
-
65
-``pipewire(1)``,
66
-``jackd(1)``,
67
pipewire-0.3.85.tar.gz/man/pw-link.1.rst.in Deleted
141
 
1
@@ -1,139 +0,0 @@
2
-pw-link
3
-#######
4
-
5
--------------------------
6
-The PipeWire Link Command
7
--------------------------
8
-
9
-:Manual section: 1
10
-:Manual group: General Commands Manual
11
-
12
-SYNOPSIS
13
-========
14
-
15
-| **pw-link** *options* -o|-i|-l *out-pattern* *in-pattern*
16
-
17
-| **pw-link** *options* *output* *input*
18
-
19
-| **pw-link** *options* -d *output* *input*
20
-
21
-| **pw-link** *options* -d *link-id*
22
-
23
-DESCRIPTION
24
-===========
25
-
26
-List, create and destroy links between PipeWire ports.
27
-
28
-COMMON OPTIONS
29
-==============
30
-
31
--r | --remote=NAME
32
-  The name the *remote* instance to monitor. If left unspecified,
33
-  a connection is made to the default PipeWire instance.
34
-
35
--h | --help
36
-  Show help.
37
-
38
---version
39
-  Show version information.
40
-
41
-LISTING PORTS AND LINKS
42
-=======================
43
-
44
-Specify one of -o, -i or -l to list the matching optional input and
45
-output ports and their links.
46
-
47
--o | --output
48
-  List output ports
49
-
50
--i | --input
51
-  List output ports
52
-
53
--l | --links
54
-  List links
55
-
56
--m | --monitor
57
-  Monitor links and ports. **pw-link** will not exit but monitor and
58
-  print new and destroyed ports or links.
59
-
60
--I | --id
61
-  List IDs. Also list the unique link and port ids.
62
-
63
--v | --verbose
64
-  Verbose port properties. Also list the port-object-path and the port-alias.
65
-
66
-CONNECTING PORTS
67
-================
68
-
69
-Without any list option (-i, -o or -l), the given ports will be linked.
70
-Valid port specifications are:
71
-
72
-*port-id*
73
-  As obtained with the -I option when listing ports.
74
-
75
-*node-name:port-name*
76
-  As obtained when listing ports.
77
-
78
-*port-object-path*
79
-  As obtained from the first alternative name for the port when listing
80
-  them with the -v option.
81
-
82
-*port-alias*
83
-  As obtained from the second alternative name for the ports when listing
84
-  them with the -v option.
85
-
86
-Extra options when linking can be given:
87
-
88
--L | --linger
89
-  Linger. Will create a link that exists after **pw-link** is destroyed.
90
-  This is the default behaviour, unless the -m option is given.
91
-
92
--P | --passive
93
-  Passive link. A passive link will keep both nodes it links inactive
94
-  unless another non-passive link is activating the nodes. You can use this
95
-  to link a sink to a filter and have them both suspended when nothing else
96
-  is linked to either of them.
97
-
98
--p | --props=PROPS
99
-  Properties as JSON object. Give extra properties when creaing the link.
100
-
101
-DISCONNECTING PORTS
102
-===================
103
-
104
-When the -d option is given, an existing link between port is destroyed.
105
-
106
-To disconnect port, a single *link-id*, as obtained when listing links with
107
-the -I option, or two port specifications can be given. See the connecting
108
-ports section for valid port specifications.
109
-
110
--d | --disconnect
111
-  Disconnect ports
112
-
113
-EXAMPLES
114
-========
115
-
116
-**pw-link** -iol
117
-  List all port and their links.
118
-
119
-**pw-link** -lm
120
-  List all links and monitor changes until **pw-link** is stopped.
121
-
122
-**pw-link** paplay:output_FL alsa_output.pci-0000_00_1b.0.analog-stereo:playback_FL
123
-  Link the given output port to the input port.
124
-
125
-**pw-link** -lI
126
-  List links and their Id.
127
-
128
-**pw-link** -d 89
129
-  Destroy the link with id 89.
130
-
131
-AUTHORS
132
-=======
133
-
134
-The PipeWire Developers <@PACKAGE_BUGREPORT@>; PipeWire is available from @PACKAGE_URL@
135
-
136
-SEE ALSO
137
-========
138
-
139
-``pipewire(1)``,
140
-``pw-cli(1)``,
141
pipewire-0.3.85.tar.gz/man/pw-metadata.1.rst.in Deleted
84
 
1
@@ -1,82 +0,0 @@
2
-pw-metadata
3
-###########
4
-
5
----------------------
6
-The PipeWire metadata
7
----------------------
8
-
9
-:Manual section: 1
10
-:Manual group: General Commands Manual
11
-
12
-SYNOPSIS
13
-========
14
-
15
-| **pw-metadata** *options* *id* *key* *value* *type*    
16
-
17
-DESCRIPTION
18
-===========
19
-
20
-Monitor, set and delete metadata on PipeWire objects.
21
-
22
-Metadata are key/type/value triplets attached to objects identified
23
-by *id*. The metadata is shared between all applications
24
-binding to the same metadata object. When an object is destroyed, all its
25
-metadata is automatically removed.
26
-
27
-When no *value* is given, **pw-metadata** will query and
28
-log the metadata matching the optional arguments *id*
29
-and *key*. Without any arguments, all metadata is displayed.
30
-
31
-When *value* is given, **pw-metadata** will set the
32
-metadata for *id* and *key* to *value* and
33
-an optional *type*.
34
-
35
-OPTIONS
36
-=======
37
-
38
--r | --remote=NAME
39
-  The name the remote instance to use. If left unspecified,
40
-  a connection is made to the default PipeWire instance.
41
-
42
--h | --help
43
-  Show help.
44
-
45
---version
46
-  Show version information.
47
-
48
--l | --list
49
-  List available metadata objects
50
-
51
--m | --monitor
52
-  Keeps running and log the changes to the metadata.
53
-
54
--d | --delete
55
-  Delete all metadata for *id* or for the specified *key* of object *id*.
56
-  Without any option, all metadata is removed.
57
-
58
--n | --name
59
-  Metadata name (Default: "default").
60
-
61
-EXAMPLES
62
-========
63
-
64
-**pw-metadata**
65
-  Show metadata in default name.
66
-
67
-**pw-metadata** -n settings 0
68
-  Display settings.
69
-
70
-**pw-metadata** -n settings 0 clock.quantum 1024
71
-  Change clock.quantum to 1024.
72
-
73
-AUTHORS
74
-=======
75
-
76
-The PipeWire Developers <@PACKAGE_BUGREPORT@>; PipeWire is available from @PACKAGE_URL@
77
-
78
-SEE ALSO
79
-========
80
-
81
-``pipewire(1)``,
82
-``pw-mon(1)``,
83
-``pw-cli(1)``,
84
pipewire-0.3.85.tar.gz/man/pw-mididump.1.rst.in Deleted
51
 
1
@@ -1,49 +0,0 @@
2
-pw-mididump
3
-###########
4
-
5
-----------------------
6
-The PipeWire MIDI dump
7
-----------------------
8
-
9
-:Manual section: 1
10
-:Manual group: General Commands Manual
11
-
12
-SYNOPSIS
13
-========
14
-
15
-| **pw-mididump** *options* *FILE*
16
-
17
-DESCRIPTION
18
-===========
19
-
20
-Dump MIDI messages to stdout.
21
-
22
-When a MIDI file is given, the events inside the file are printed.
23
-
24
-When no file is given, **pw-mididump** creates a PipeWire
25
-MIDI input stream and will print all MIDI events received on the port to
26
-stdout.
27
-
28
-OPTIONS
29
-=======
30
-
31
--r | --remote=NAME
32
-  The name the remote instance to monitor. If left unspecified,
33
-  a connection is made to the default PipeWire instance.
34
-
35
--h | --help
36
-  Show help.
37
-
38
---version
39
-  Show version information.
40
-
41
-AUTHORS
42
-=======
43
-
44
-The PipeWire Developers <@PACKAGE_BUGREPORT@>; PipeWire is available from @PACKAGE_URL@
45
-
46
-SEE ALSO
47
-========
48
-
49
-``pipewire(1)``,
50
-``pw-cat(1)``,
51
pipewire-0.3.85.tar.gz/man/pw-mon.1.rst.in Deleted
48
 
1
@@ -1,46 +0,0 @@
2
-pw-mon
3
-######
4
-
5
---------------------
6
-The PipeWire monitor
7
---------------------
8
-
9
-:Manual section: 1
10
-:Manual group: General Commands Manual
11
-
12
-SYNOPSIS
13
-========
14
-
15
-| **pw-mon** *options*
16
-
17
-DESCRIPTION
18
-===========
19
-
20
-Monitor objects on the PipeWire instance.
21
-
22
-OPTIONS
23
-=======
24
-
25
--r | --remote=NAME
26
-  The name the *remote* instance to monitor. If left unspecified,
27
-  a connection is made to the default PipeWire instance.
28
-
29
--h | --help
30
-  Show help.
31
-
32
---version
33
-  Show version information.
34
-
35
--N | --color=WHEN
36
-  Whether to use color, one of 'never', 'always', or 'auto'. The
37
-  default is 'auto'. **-N** is equivalent to **--color=never**.
38
-
39
-AUTHORS
40
-=======
41
-
42
-The PipeWire Developers <@PACKAGE_BUGREPORT@>; PipeWire is available from @PACKAGE_URL@
43
-
44
-SEE ALSO
45
-========
46
-
47
-``pipewire(1)``,
48
pipewire-0.3.85.tar.gz/man/pw-profiler.1.rst.in Deleted
59
 
1
@@ -1,57 +0,0 @@
2
-pw-profiler
3
-###########
4
-
5
----------------------
6
-The PipeWire profiler
7
----------------------
8
-
9
-:Manual section: 1
10
-:Manual group: General Commands Manual
11
-
12
-SYNOPSIS
13
-========
14
-
15
-| **pw-profiler** *options*
16
-
17
-DESCRIPTION
18
-===========
19
-
20
-Start profiling a PipeWire instance.
21
-
22
-If the server has the profiler module loaded, this program will
23
-connect to it and log the profiler data. Profiler data contains
24
-times and durations when processing nodes and devices started and
25
-completed.
26
-
27
-When this program is stopped, a set of **gnuplot** files and a script to generate
28
-SVG files from the .plot files is generated, along with a .html file to
29
-visualize the profiling results in a browser.
30
-
31
-This function uses the same data used by *pw-top*.
32
-
33
-OPTIONS
34
-=======
35
-
36
--r | --remote=NAME
37
-  The name the remote instance to monitor. If left unspecified,
38
-  a connection is made to the default PipeWire instance.
39
-
40
--h | --help
41
-  Show help.
42
-
43
---version
44
-  Show version information.
45
-
46
--o | --output=FILE
47
-  Profiler output name (default "profiler.log").
48
-
49
-AUTHORS
50
-=======
51
-
52
-The PipeWire Developers <@PACKAGE_BUGREPORT@>; PipeWire is available from @PACKAGE_URL@
53
-
54
-SEE ALSO
55
-========
56
-
57
-``pipewire(1)``,
58
-``pw-top(1)``,
59
pipewire-0.3.85.tar.gz/man/pw-top.1.rst.in Deleted
186
 
1
@@ -1,184 +0,0 @@
2
-pw-top
3
-######
4
-
5
----------------------------
6
-The PipeWire process viewer
7
----------------------------
8
-
9
-:Manual section: 1
10
-:Manual group: General Commands Manual
11
-
12
-SYNOPSIS
13
-========
14
-
15
-| **pw-top** *options*
16
-
17
-DESCRIPTION
18
-===========
19
-
20
-The *pw-top* program provides a dynamic real-time view of the pipewire
21
-node and device statistics.
22
-
23
-A hierarchical view is shown of Driver nodes and follower nodes. The Driver
24
-nodes are actively using a timer to schedule dataflow in the followers. The
25
-followers of a driver node as shown below their driver with a + sign in
26
-a tree-like representation.
27
-
28
-The columns presented are as follows:
29
-
30
-S
31
-  Node status.
32
-    E = ERROR
33
-    C = CREATING
34
-    S = SUSPENDED
35
-    I = IDLE
36
-    R = RUNNING
37
-
38
-ID
39
-  The ID of the pipewire node/device, as found in *pw-dump* and *pw-cli*
40
-
41
-QUANT
42
-  The current quantum (for drivers) and the suggested quantum for follower
43
-  nodes.
44
-
45
-  The quantum by itself needs to be divided by the RATE column to calculate
46
-  the duration of a scheduling period in fractions of a second.
47
-
48
-  For a QUANT of 1024 and a RATE of 48000, the duration of one period in the
49
-  graph is 1024/48000 or 21.3 milliseconds.
50
-
51
-  Follower nodes can have a 0 QUANT field, which means that the node does not
52
-  have a suggestion for the quantum and thus uses what the driver selected.
53
-
54
-  The driver will use the lowest quantum of any of the followers. If none of
55
-  the followers select a quantum, the default quantum in the pipewire configuration
56
-  file will be used.
57
-
58
-  The QUANT on the drivers usually translates directly into the number of audio
59
-  samples processed per processing cycle of the graph.
60
-
61
-  See also https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/FAQ#pipewire-buffering-explained
62
-
63
-RATE
64
-  The current rate (for drivers) and the suggested rate for follower
65
-  nodes.
66
-
67
-  This is the rate at which the *graph* processes data and needs to be combined with
68
-  the QUANT value to derive the duration of a processing cycle in the graph.
69
-
70
-  Some nodes can have a 0 RATE, which means that they don't have any rate
71
-  suggestion for the graph. Nodes that suggest a rate can make the graph switch
72
-  rates if the graph is otherwise idle and the new rate is allowed as
73
-  a possible graph rate (see the pipewire configuration file).
74
-
75
-  The RATE on (audio) driver nodes usually also translates directly to the
76
-  samplerate used by the device. Although some devices might not be able to
77
-  operate at the given samplerate, in which case resampling will need to be
78
-  done. The negotiated samplerate with the device and stream can be found in
79
-  the FORMAT column.
80
-
81
-WAIT
82
-  The waiting time of a node is the elapsed time between when the node
83
-  is ready to start processing and when it actually started processing.
84
-
85
-  For Driver nodes, this is the time between when the node wakes up to
86
-  start processing the graph and when the driver (and thus also the graph)
87
-  completes a cycle. The WAIT time for driver is thus the elapsed time
88
-  processing the graph.
89
-
90
-  For follower nodes, it is the time spent between being woken up (when all
91
-  dependencies of the node are satisfied) and when processing starts. The
92
-  WAIT time for follower nodes is thus mostly caused by context switching.
93
-
94
-  A value of --- means that the node was not signaled.  A value of +++
95
-  means that the node was signaled but not awake.
96
-
97
-BUSY
98
-  The processing time is started when the node starts processing until it
99
-  completes and wakes up the next nodes in the graph.
100
-
101
-  A value of --- means that the node was not started.  A value of +++
102
-  means that the node was started but did not complete.
103
-
104
-W/Q
105
-  Ratio of WAIT / QUANT.
106
-
107
-  The W/Q time of the driver node is a good measure of the graph
108
-  load. The running averages of the driver W/Q ratios are used as the DSP
109
-  load in other (JACK) tools.
110
-
111
-  Values of --- and +++ are copied from the WAIT column.
112
-
113
-B/Q
114
-  Ratio of BUSY / QUANT
115
-
116
-  This is a good measure of the load of a particular driver or follower
117
-  node.
118
-
119
-  Values of --- and +++ are copied from the BUSY column.
120
-
121
-ERR
122
-  Total of Xruns and Errors
123
-
124
-  Xruns for drivers are when the graph did not complete a cycle. This can
125
-  be because a node in the graph also has an Xrun. It can also be caused when
126
-  scheduling delays cause a deadline to be missed, causing a hardware
127
-  Xrun.
128
-
129
-  Xruns for followers are incremented when the node started processing but
130
-  did not complete before the end of the graph cycle deadline.
131
-
132
-FORMAT
133
-  The format used by the driver node or the stream. This is the hardware format
134
-  negotiated with the device or stream.
135
-
136
-  If the stream of driver has a different rate than the graph, resampling will
137
-  be done.
138
-
139
-  For raw audio formats, the layout is <sampleformat> <channels> <samplerate>.
140
-
141
-  For IEC958 passthrough audio formats, the layout is IEC958 <codec> <samplerate>.
142
-
143
-  For DSD formats, the layout is <dsd-rate> <channels>.
144
-
145
-  For Video formats, the layout is <pixelformat> <width>x<height>.
146
-
147
-NAME
148
-  Name assigned to the device/node, as found in *pw-dump* node.name
149
-
150
-  Names are prefixed by *+* when they are linked to a driver (entry above with no +)
151
-
152
-
153
-OPTIONS
154
-=======
155
-
156
--h | --help
157
-  Show help.
158
-
159
--b | --batch-mode
160
-  Run in non-interactive batch mode, similar to top's batch mode.
161
-
162
--n | --iterations=NUMBER
163
-  Exit after NUMBER of batch iterations. Only used in batch mode.
164
-
165
--r | --remote=NAME
166
-  The name the *remote* instance to monitor. If left unspecified,
167
-  a connection is made to the default PipeWire instance.
168
-
169
--V | --version
170
-  Show version information.
171
-
172
-
173
-AUTHORS
174
-=======
175
-
176
-The PipeWire Developers <@PACKAGE_BUGREPORT@>; PipeWire is available from @PACKAGE_URL@
177
-
178
-SEE ALSO
179
-========
180
-
181
-``pipewire(1)``,
182
-``pw-dump(1)``,
183
-``pw-cli(1)``,
184
-``pw-profiler(1)``,
185
-
186
pipewire-0.3.85.tar.gz/.gitlab-ci.yml -> pipewire-1.0.0.tar.gz/.gitlab-ci.yml Changed
20
 
1
@@ -25,8 +25,8 @@
2
 .fedora:
3
   variables:
4
     # Update this tag when you want to trigger a rebuild
5
-    FDO_DISTRIBUTION_TAG: '2023-05-31.0'
6
-    FDO_DISTRIBUTION_VERSION: '37'
7
+    FDO_DISTRIBUTION_TAG: '2023-11-22.0'
8
+    FDO_DISTRIBUTION_VERSION: '39'
9
     FDO_DISTRIBUTION_PACKAGES: >-
10
       alsa-lib-devel
11
       avahi-devel
12
@@ -75,6 +75,7 @@
13
       pulseaudio-utils
14
       openal-soft
15
       readline-devel
16
+      pandoc
17
 # Uncommenting the following two lines and disabling the meson entry above
18
 # will re-enable use of Meson via pip but please consider using a newer distro
19
 # image first or making the build system compatible instead! This is because
20
pipewire-0.3.85.tar.gz/NEWS -> pipewire-1.0.0.tar.gz/NEWS Changed
96
 
1
@@ -1,3 +1,84 @@
2
+# PipeWire 1.0.0 (2023-11-26)
3
+
4
+The PipeWire project is immensely proud to announce the 1.0 release
5
+of PipeWire.
6
+
7
+It is API and ABI compatible with previous 0.3.x releases.
8
+
9
+ "PipeWire represents the next evolution of audio handling for Linux, taking
10
+ the best of both pro-audio (JACK) and desktop audio servers (PulseAudio) and
11
+ linking them into a single, seamless, powerful new system."
12
+    - Paul Davis, JACK and Ardour author
13
+
14
+ "What exciting times! PipeWire 1.0 is the culmination of 15 years of
15
+ Linux audio expertise, blending lessons from PulseAudio into a high-performance,
16
+ flexible, and user-friendly foundation for audio and multimedia on Linux.
17
+ I'm looking forward to the next decade of progress in the free software
18
+ consumer and professional audio space!."
19
+    - Arun Raghavan, PulseAudio developer/maintainer.
20
+
21
+ "I'm thrilled to witness the first stable release of PipeWire after five years
22
+ of collaboration with its remarkable community, pushing the boundaries of
23
+ multimedia integration in the Linux ecosystem one step further.”
24
+    - George Kiagiadakis, WirePlumber author
25
+
26
+ "From the beginning of the libcamera project, we have always seen
27
+ PipeWire as the solution to handle desktop and mobile integration and
28
+ give a seemless multimedia integration to users while providing security
29
+ features and resource sharing between applications."
30
+    - Kieran Bingham, libcamera author
31
+
32
+Happy Holidays!
33
+
34
+
35
+## Highlights
36
+  - Fix a memfd/dmabuf leak when uploading buffers while shutting down.
37
+  - Handle concurrent jack_port_get_buffer() calls because ardour seems to
38
+    be doing this.
39
+  - Improve time reporting (less jitter) in ALSA when using IRQ.
40
+  - Many doc improvements.
41
+
42
+## PipeWire
43
+  - Respect PIPEWIRE_DLCLOSE everywhere, remove pw_in_valgrind().
44
+  - Remove a warning when a client tries to change ignored properties.
45
+
46
+## Modules
47
+  - Fix a memfd/dmabuf leak when uploading buffers while shutting down.
48
+  - Fix a potential segfault when copying mix structures. (#3658)
49
+  - Avoid races in setrlimit in module-rt.
50
+  - Fix a memory leak in filter-chain.
51
+  - Set rtp.ptime on senders, not receivers.
52
+  - The ROC modules were ported to ROC 0.3
53
+
54
+## SPA
55
+  - Improve time reporting (less jitter) in ALSA when using IRQ. (#3657)
56
+  - Add latency param query in libcamera.
57
+  - Fix some compiler warnings.
58
+  - The EVL plugin was updated.
59
+
60
+## Bluetooth
61
+  - LC3 codec and compatibility improvements.
62
+
63
+## Pulse server
64
+  - Fix emission of events when a sink/source state changes. (#3660)
65
+
66
+## JACK
67
+  - Improve transport and time handling. Use unique ids to make consistent
68
+    snapshots of the current time and transport.
69
+  - Avoid enumerating port params that we are not going to use.
70
+  - Optimize buffer reuse.
71
+  - Handle concurrent jack_port_get_buffer() calls because ardour seems to
72
+    be doing this. (#3632)
73
+
74
+## Docs
75
+  - Many doc improvements.
76
+  - Add man pages for pw-dump, pw-loopback, modules, pipewire-pulse.
77
+  - Manpages are now made with Doxygen.
78
+  - Add docs for pulse-modules
79
+
80
+Older versions:
81
+
82
+
83
 # PipeWire 0.3.85 (2023-11-16)
84
 
85
 This is the fifth (and last) 1.0 release candidate that is API and ABI
86
@@ -53,9 +134,6 @@
87
 ## Docs
88
   - Many improvements to the layout and organization.
89
 
90
-Older versions:
91
-
92
-
93
 # PipeWire 0.3.84 (2023-11-02)
94
 
95
 This is the fourth 1.0 release candidate that is API and ABI compatible
96
pipewire-0.3.85.tar.gz/doc/Doxyfile.in -> pipewire-1.0.0.tar.gz/doc/Doxyfile.in Changed
11
 
1
@@ -26,6 +26,9 @@
2
                          "@top_srcdir@/doc"
3
 EXAMPLE_PATTERNS       = "*.c"
4
 
5
+GENERATE_MAN           = YES
6
+MAN_EXTENSION          = 3
7
+
8
 REFERENCED_BY_RELATION = NO
9
 REFERENCES_RELATION    = NO
10
 IGNORE_PREFIX          = pw_ \
11
pipewire-0.3.85.tar.gz/doc/custom.css -> pipewire-1.0.0.tar.gz/doc/custom.css Changed
9
 
1
@@ -34,3 +34,7 @@
2
     font-style: italic;
3
     font-size: medium;
4
 }
5
+
6
+.textblock dl.section dd {
7
+    margin-left: 2rem;
8
+}
9
pipewire-1.0.0.tar.gz/doc/dox Added
2
 
1
+(directory)
2
pipewire-1.0.0.tar.gz/doc/dox/api Added
2
 
1
+(directory)
2
pipewire-1.0.0.tar.gz/doc/dox/api/index.dox Added
92
 
1
@@ -0,0 +1,90 @@
2
+/** \page page_api PipeWire API
3
+
4
+The PipeWire API consists of several parts:
5
+
6
+- The \ref pw_stream for a convenient way to send and receive data streams from/to PipeWire.
7
+
8
+- The \ref pw_filter for a convenient way to implement processing filters.
9
+
10
+- The \ref api_pw_core to access a PipeWire instance. This API is used
11
+by all clients that need to communicate with the \ref page_daemon and provides
12
+the necessary structs to interface with the daemon.
13
+
14
+- The \ref api_pw_impl is primarily used by the \ref page_daemon itself but also by the
15
+\ref page_session_manager and modules/extensions that need to build objects in
16
+the graph.
17
+
18
+- The \ref api_pw_util containing various utility functions and structures.
19
+
20
+- The \ref api_pw_ext for interfacing with certain extension modules.
21
+
22
+The APIs work through proxy objects, so that calling a method on an object
23
+invokes that same method on the remote side. Marshalling and de-marshalling is
24
+handled transparently by the \ref page_module_protocol_native.
25
+The below graph illustrates this approach:
26
+
27
+\dot
28
+digraph API {
29
+  compound=true;
30
+  node shape="box";
31
+  rankdir="RL";
32
+
33
+  subgraph cluster_daemon {
34
+       rankdir="TB";
35
+       label="PipeWire daemon";
36
+       style="dashed";
37
+
38
+       impl_core label="Core Impl. Object";
39
+       impl_device label="Device Impl. Object";
40
+       impl_node label="Node Impl. Object";
41
+  }
42
+
43
+  subgraph cluster_client {
44
+       rankdir="TB";
45
+       label="PipeWire client";
46
+       style="dashed";
47
+
48
+       obj_core label="Core Object";
49
+       obj_device label="Device Object";
50
+       obj_node label="Node Object";
51
+  }
52
+
53
+  obj_core -> impl_core;
54
+  obj_device -> impl_device;
55
+  obj_node -> impl_node;
56
+
57
+}
58
+\enddot
59
+
60
+It is common for clients to use both the \ref api_pw_core and the \ref api_pw_impl
61
+and both APIs are provided by the same library.
62
+
63
+- \subpage page_spa
64
+- \subpage page_client_impl
65
+- \subpage page_proxy
66
+- \subpage page_streams
67
+- \subpage page_thread_loop
68
+
69
+
70
+\addtogroup api_pw_core Core API
71
+
72
+The Core API to access a PipeWire instance. This API is used by all
73
+clients to communicate with the \ref page_daemon.
74
+
75
+If you are familiar with Wayland implementation, the Core API is
76
+roughly equivalent to libwayland-client.
77
+
78
+See: \ref page_api
79
+
80
+
81
+\addtogroup api_pw_impl Implementation API
82
+
83
+The implementation API provides the tools to build new objects and
84
+modules.
85
+
86
+If you are familiar with Wayland implementation, the Implementation API is
87
+roughly equivalent to libwayland-server.
88
+
89
+See: \ref page_api
90
+
91
+*/
92
pipewire-1.0.0.tar.gz/doc/dox/api/spa-buffer.dox Changed
2
 
1
(renamed from doc/spa-buffer.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/api/spa-design.dox Changed
2
 
1
(renamed from doc/spa-design.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/api/spa-index.dox Changed
2
 
1
(renamed from doc/spa-index.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/api/spa-plugins.dox Changed
2
 
1
(renamed from doc/spa-plugins.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/api/spa-pod.dox Changed
2
 
1
(renamed from doc/spa-pod.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/index.dox Added
48
 
1
@@ -0,0 +1,46 @@
2
+/** \mainpage PipeWire
3
+
4
+PipeWire is low-level multimedia framework that provides:
5
+
6
+- Graph based processing.
7
+- Support for out-of-process processing graphs with minimal overhead.
8
+- Flexible and extensible media format negotiation and buffer allocation.
9
+- Hard real-time capable plugins.
10
+- Very low-latency for both audio and video processing.
11
+
12
+See \ref page_overview for an overview of PipeWire and \ref page_design
13
+for the design principles guiding PipeWire.
14
+
15
+# Components
16
+
17
+PipeWire ships with the following components:
18
+
19
+- A \ref page_daemon that implements the IPC and graph processing.
20
+- An example \ref page_session_manager that manages objects in the \ref page_daemon.
21
+- A set of \ref page_programs to introspect and use the \ref page_daemon.
22
+- A \ref page_library to develop PipeWire applications and plugins (\ref
23
+  page_tutorial "tutorial").
24
+- The \ref page_spa used by both the \ref page_daemon and in the \ref
25
+  page_library.
26
+
27
+# API Documentation
28
+
29
+See \ref page_api.
30
+
31
+# More Documentation
32
+
33
+See our Wiki(https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/home) for
34
+More information on how to configure and use PipeWire.
35
+
36
+# Resources
37
+
38
+- PipeWire and AGL(https://wiki.automotivelinux.org/_media/pipewire_agl_20181206.pdf)
39
+- LAC 2020 Paper(https://lac2020.sciencesconf.org/307881/document)
40
+- PipeWire Under The Hood(https://venam.nixers.net/blog/unix/2021/06/23/pipewire-under-the-hood.html)
41
+- PipeWire: The Linux audio/video bus (LWN)(https://lwn.net/Articles/847412)
42
+- PipeWire Wikipedia(https://en.wikipedia.org/wiki/PipeWire)
43
+- Bluetooth, PipeWire and Whatsapp calls(https://gjhenrique.com/pipewire.html)
44
+- Intoduction to PipeWire(https://bootlin.com/blog/an-introduction-to-pipewire/)
45
+- A custom PipeWire node(https://bootlin.com/blog/a-custom-pipewire-node/)
46
+
47
+*/
48
pipewire-1.0.0.tar.gz/doc/dox/internals Added
2
 
1
+(directory)
2
pipewire-1.0.0.tar.gz/doc/dox/internals/access.dox Changed
2
 
1
(renamed from doc/pipewire-access.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/internals/audio.dox Changed
2
 
1
(renamed from doc/pipewire-audio.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/internals/daemon.dox Changed
2
 
1
(renamed from doc/pipewire-daemon.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/internals/design.dox Changed
2
 
1
(renamed from doc/pipewire-design.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/internals/dma-buf.dox Changed
2
 
1
(renamed from doc/dma-buf.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/internals/index.dox Added
28
 
1
@@ -0,0 +1,26 @@
2
+/** \page page_internals Internals
3
+
4
+# Internals
5
+
6
+- \subpage page_design
7
+- \subpage page_audio
8
+- \subpage page_access
9
+- \subpage page_portal
10
+- \subpage page_midi
11
+- \subpage page_objects_design
12
+- \subpage page_library
13
+- \subpage page_dma_buf
14
+- \subpage page_scheduling
15
+- \subpage page_native_protocol
16
+
17
+
18
+# Components
19
+
20
+- \subpage page_daemon
21
+- \subpage page_session_manager
22
+
23
+# Backends
24
+
25
+- \subpage page_pulseaudio
26
+
27
+*/
28
pipewire-1.0.0.tar.gz/doc/dox/internals/library.dox Changed
2
 
1
(renamed from doc/pipewire-library.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/internals/midi.dox Changed
2
 
1
(renamed from doc/pipewire-midi.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/internals/objects.dox Changed
2
 
1
(renamed from doc/pipewire-objects-design.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/internals/portal.dox Added
201
 
1
@@ -0,0 +1,215 @@
2
+/** \page page_portal Portal Access Control
3
+
4
+This document explains how clients from the portal are handled.
5
+
6
+The portal is a DBus service that exposes interfaces to
7
+request access to the PipeWire daemon to perform a certain set of
8
+functions. The PipeWire daemon runs outside the sandbox, the portal is a way
9
+for clients inside the sandbox to connect to and use PipeWire.
10
+
11
+The PipeWire socket is not exposed in the sandbox. Instead, The portal
12
+connects to PipeWire on behalf of the client, informing PipeWire that this
13
+client is a portal-managed client. PipeWire can detect and enforce
14
+extra permission checks on the portal managed clients.
15
+
16
+Once such portal is the camera
17
+portal(https://flatpak.github.io/xdg-desktop-portal/docs/doc-org.freedesktop.portal.Camera.html)
18
+that provides a PipeWire session to stream video from a camera.
19
+
20
+
21
+# Use Cases
22
+
23
+## New Portal Managed Clients Need Device Permissions Configured
24
+
25
+When a new client is detected, the available objects need to be
26
+scanned and permissions configured for each of them.
27
+
28
+Only the devices belonging to the media_roles given by the
29
+portal are considered.
30
+
31
+## New Devices Need To Be Made Visible To Portal Managed Clients
32
+
33
+Newly created objects are made visible to a client when the client
34
+is allowed to interact with it.
35
+
36
+Only the devices belonging to the media_roles given by the
37
+portal are considered.
38
+
39
+## Permissions For A Device Need To Be Revoked
40
+
41
+The session manager listens to changes in the permissions of devices
42
+and will remove the client permissions accordingly.
43
+
44
+Usually this is implemented by listening to the permission store
45
+DBus object. The desktop environment might provide a configuration panel
46
+where these permissions can be managed.
47
+
48
+
49
+# Design
50
+
51
+## The Portal
52
+
53
+A sandboxed client cannot connect to PipeWire directly. Instead, it connects
54
+to the sandbox side of the portal which then connects the PipeWire daemon to
55
+configure the session. The portal then hands the file descriptor of the
56
+PipeWire connection to the client and the client can use this file descriptor
57
+to interface with the PipeWire session directly.
58
+
59
+When the portal connects, it will set the following properties on the
60
+client object:
61
+
62
+- `"pipewire.access.portal.is_portal" = true` for the connection of the
63
+  portal itself (as opposed to a client managed by the portal).
64
+- `"pipewire.access.portal.app_id"` the application ID(https://docs.flatpak.org/en/latest/conventions.html#application-ids) of the client.
65
+- `"pipewire.access.portal.media_roles"` media roles of the client.
66
+  Currently only `"Camera"` is defined.
67
+
68
+Before returning the connection to a client, the portal configures
69
+minimal permissions on the client. No objects are initially visible. It is
70
+the task of the \ref page_session_manager to make the objects in the graph
71
+visible, depending on the client's `media_roles` (see also \ref
72
+PW_KEY_MEDIA_ROLE).
73
+
74
+## The PipeWire Portal Module
75
+
76
+The PipeWire daemon uses the \ref page_module_portal to find the PID of the
77
+processes that owns the DBus name `org.freedesktop.portal.Desktop`
78
+(see the XDG Desktop Portal(https://github.com/flatpak/xdg-desktop-portal)).
79
+
80
+Client connections from this PID are tagged as \ref PW_KEY_ACCESS
81
+`"portal"` (see \ref page_module_access). It will also set ALL permissions for
82
+this client so that it can resume.
83
+
84
+\dot
85
+digraph pw {
86
+  compound=true;
87
+  node shape="box";
88
+  rankdir="TB";
89
+
90
+  dbus label="org.freedesktop.portal.Desktop";
91
+
92
+  portal_access label="PipeWire (mod: Portal Access)";
93
+  portal label="xdg-desktop-portal";
94
+
95
+  dbus -> portal_access arrowhead="dot";
96
+  dbus -> portal arrowhead="dot";
97
+
98
+  portal_access -> portal label="pipewire.access = portal";
99
+
100
+  { rank="same"; portal_access; portal}
101
+}
102
+\enddot
103
+
104
+## The Client
105
+
106
+A client can ask the portal for a connection to the PipeWire daemon.
107
+
108
+\dot
109
+digraph pw {
110
+  compound=true;
111
+  node shape="box";
112
+  rankdir="LR";
113
+
114
+  pw label="PipeWire";
115
+  portal label="xdg-desktop-portal";
116
+  client label="client";
117
+
118
+  client -> portal;
119
+  portal -> pw label="portal.is_portal=true", arrowhead="none"
120
+
121
+  {rank="min"; pw};
122
+  {rank="max"; client};
123
+}
124
+\enddot
125
+
126
+The portal maintains an (unrestricted) connection to the PipeWire daemon with
127
+`"pipewire.access.portal.is_portal" = true` to identify the nodes the client
128
+needs access to. It then creates a new restricted connection for the client,
129
+tagged with additional information.
130
+
131
+\dot
132
+digraph pw {
133
+  compound=true;
134
+  node shape="box";
135
+  rankdir="LR";
136
+
137
+  pw label="PipeWire";
138
+  portal label="xdg-desktop-portal";
139
+  client label="client";
140
+
141
+  client -> portal arrowhead="none";
142
+  portal -> pw label="portal.is_portal=true", arrowhead="none"
143
+  portal -> pw label="portal.app_id = $appid"
144
+
145
+  {rank="min"; pw};
146
+  {rank="max"; client};
147
+}
148
+\enddot
149
+
150
+The file descriptor for this restricted connection is passed back to the
151
+client which can now make use of the resources it has been permitted to
152
+access.
153
+
154
+\dot
155
+digraph pw {
156
+  compound=true;
157
+  node shape="box";
158
+  rankdir="LR";
159
+
160
+  pw label="PipeWire";
161
+  portal label="xdg-desktop-portal";
162
+  client label="client";
163
+
164
+  portal -> pw label="portal.is_portal=true", arrowhead="none"
165
+
166
+  pw->client label="restricted connection";
167
+
168
+  {rank="min"; pw};
169
+  {rank="max"; client};
170
+}
171
+\enddot
172
+
173
+## The Session Manager
174
+
175
+The session manager listens for new clients to appear. It will use the
176
+\ref PW_KEY_ACCESS property to find portal connections. For client connections
177
+from the portal the session manager checks the requested `media_roles` and
178
+enables or disables access to the respective PipeWire objects.
179
+It might have to consult a database to decide what is allowed, for example the
180
+org.freedesktop.impl.portal.PermissionStore(https://flatpak.github.io/xdg-desktop-portal/docs/doc-org.freedesktop.impl.portal.PermissionStore.html).
181
+
182
+\dot
183
+strict digraph pw {
184
+  compound=true;
185
+  node shape="box";
186
+  rankdir="LR";
187
+
188
+  portal label="xdg-desktop-portal";
189
+  client label="client";
190
+
191
+
192
+  subgraph {
193
+     rankdir="TB";
194
+     permissions label="PermissionStore";
195
+
196
+     sm->permissions;
197
+
198
+     sm label="Session Manager";
199
+     pw label="PipeWire";
200
+     sm -> pw headlabel="allow $media.roles";
201
pipewire-1.0.0.tar.gz/doc/dox/internals/protocol.dox Added
201
 
1
@@ -0,0 +1,1691 @@
2
+/** \page page_native_protocol Native Protocol
3
+
4
+PipeWire has a pluggable client/server IPC protocol.
5
+
6
+The reference implementation uses unix sockets and is implemented in
7
+\ref page_module_protocol_native.
8
+
9
+We document the messages here.
10
+
11
+\tableofcontents
12
+
13
+# Message header {#native-protocol-message-header}
14
+
15
+Each message on the unix socket contains a 16 bytes header and a
16
+variable length payload size:
17
+
18
+```
19
+    0                   1                   2                   3
20
+    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
21
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
22
+   |                     Id                                        |
23
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
24
+   |    opcode     |                   size                        |
25
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
26
+   |                         seq                                   |
27
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
28
+   |                         n_fds                                 |
29
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
30
+   |                     payload POD                               |
31
+   .                                                               .
32
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
33
+   |                     optional footer POD                       |
34
+   .                                                               .
35
+   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
36
+```
37
+
38
+
39
+These are four uint32 words to be read in native endianness.
40
+
41
+- Id: the message id this is the destination resource/proxy id
42
+- opcode: the opcode on the resource/proxy interface
43
+- size: the size of the payload and optional footer of the message
44
+- seq: an increasing sequence number for each message
45
+- n_fds: number of file descriptors in this message.
46
+
47
+The sender should send along with each message the fds that belong to
48
+the message. If there are more than the maximum number of fds in the
49
+message than can fit in one message, the message is split into multiple
50
+parts.
51
+
52
+A receiver needs to first read the header to know the size of the
53
+complete message. After collecting the complete message, it can start
54
+processing it.
55
+
56
+The payload is a single POD see \ref page_spa_pod for details.
57
+
58
+After the payload, there is an optional footer POD object.
59
+
60
+# Making a connection {#native-protocol-making-connection}
61
+
62
+First a connection is made to a unix domain socket. By default, the socket is
63
+named as "pipewire-0" and searched in the following directories:
64
+
65
+ - getenv("PIPEWIRE_RUNTIME_DIR")
66
+ - getenv("XDG_RUNTIME_DIR")
67
+ - getenv("USERPROFILE")
68
+
69
+
70
+The client opens the socket and allocates a Core proxy with id 0 and a Client
71
+proxy with id 1. The proxy is nothing more than a way to identify the remote
72
+objects with an id. Usually they also contain the type and version of the
73
+remote object and some helpers (interfaces) to dispatch messages.
74
+
75
+The server will allocate a new Core resource with id 0. Resources are the
76
+counterpart of client proxies and also typically contain extra information
77
+and helpers (interfaces) to dispatch messages.
78
+
79
+The client sends the Core::Hello message on the socket to start the
80
+communication.
81
+
82
+The server binds the client resource with id 1 to the client. This means
83
+that the client object on the server will now have a resource with a
84
+client side proxy associated with it.
85
+
86
+When the client sends a message for a certain proxy, the server side
87
+resource with the same id for the client is found and the message is
88
+dispatched to the object associated with the resource.
89
+
90
+Similarly when a server sends a message on a resource, the client will
91
+find the proxy with the same id and dispatch the message to it's
92
+associated object.
93
+
94
+The client then sends client properties to the server.
95
+
96
+```
97
+   client                                    server
98
+     |---------------------------------------->|
99
+     |            open socket                  |
100
+     |                                         |
101
+     |---------------------------------------->|
102
+     |            Core::Hello(version)         |
103
+     |                                         |
104
+     |---------------------------------------->|
105
+     |       Client::UpdateProperties          |
106
+     .                                         .
107
+```
108
+
109
+This completes the setup of the client. The newly connected client will
110
+appear in the registry at this point.
111
+
112
+# Core proxy/resource {#native-protocol-core}
113
+
114
+The core is always the object with Id 0.
115
+
116
+## Core Methods (Id 0)
117
+
118
+### Core::Hello (Opcode 1)
119
+
120
+The first message sent by a client is the Hello message and contains the
121
+version number of the client.
122
+
123
+```
124
+   Struct(
125
+      Int: version
126
+   )
127
+```
128
+
129
+The version is 3.
130
+
131
+### Core::Sync (Opcode 2)
132
+
133
+The Sync message will result in a Done event from the server. When the Done
134
+event is received, the client can be sure that all operations before the Sync
135
+method have been completed.
136
+
137
+```
138
+   Struct(
139
+      Int: id
140
+      Int: seq
141
+   )
142
+```
143
+
144
+- id: the id will be returned in the Done event.
145
+- seq: is usually generated automatically and will be returned in the Done event.
146
+
147
+### Core::Pong (Opcode 3)
148
+
149
+Is sent from the client to the server when the server emits the Ping event.
150
+The id and seq should be copied from the Ping event.
151
+
152
+```
153
+   Struct(
154
+      Int: id
155
+      Int: seq
156
+   )
157
+```
158
+
159
+### Core::Error (Opcode 4)
160
+
161
+An error occured in an object on the client.
162
+
163
+```
164
+   Struct(
165
+      Int: id
166
+      Int: seq
167
+      Int: res
168
+      String: message
169
+   )
170
+```
171
+
172
+- id: The id of the proxy that is in error.
173
+- seq: a seq number from the failing request (if any)
174
+- res: a negative errno style error code
175
+- message: an error message
176
+
177
+### Core::GetRegistry (Opcode 5)
178
+
179
+A client requests to bind to the registry object and list the available objects
180
+on the server.
181
+
182
+Like with all bindings, first the client allocates a new proxy id and puts this
183
+as the new_id field. Methods and Events can then be sent and received on the 
184
+new_id (in the message Id field).
185
+
186
+```
187
+   Struct(
188
+      Int: version
189
+      Int: new_id
190
+   )
191
+```
192
+- version: the version of the registry interface used on the client
193
+- new_id: the id of the new proxy with the registry interface
194
+
195
+After this method, the server will start sending Registry::Global events
196
+to the proxy with new_id.
197
+
198
+```
199
+   client                                    server
200
+     |                                         |
201
pipewire-1.0.0.tar.gz/doc/dox/internals/pulseaudio.dox Changed
2
 
1
(renamed from doc/pulseaudio.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/internals/scheduling.dox Added
201
 
1
@@ -0,0 +1,209 @@
2
+/** \page page_scheduling Graph Scheduling
3
+
4
+This document tries to explain how the PipeWire graph is scheduled.
5
+
6
+Graph are constructed from linked nodes together with their ports. This
7
+results in a dependency graph between nodes. Special care is taken for
8
+loopback links so that the graph remains a directed graph.
9
+
10
+# Processing threads
11
+
12
+The server (and clients) have two processing threads:
13
+
14
+- A main thread that will do all IPC with clients and server and configures the
15
+  nodes in the graph for processing.
16
+- A (or more) data processing thread that only does the data processing.
17
+
18
+
19
+The data processing threads are given realtime priority and are designed to
20
+run with as little overhead as possible. All of the node resources such as
21
+buffers, io areas and metadata will be set up in shared memory before the
22
+node is scheduled to run.
23
+
24
+This document describes the processing that happens in the data processing
25
+thread after the main-thread has configured it.
26
+
27
+# Nodes
28
+
29
+Nodes are objects with 0 or more input and output ports.
30
+
31
+Each node also has:
32
+
33
+- an eventfd to signal the node that it can start processing
34
+- an activation record that lives in shared memory with memfd.
35
+
36
+```
37
+   eventfd
38
+  +-^---------+
39
+  |           |
40
+ in          out
41
+  |           |
42
+  +-v---------+
43
+    activation {
44
+      status:OK,        // bitmask of NEED_DATA, HAVE_DATA or OK
45
+      pending:0,   // number of unsatisfied dependencies to be able to run
46
+      required:0        // number of dependencies with other nodes
47
+    }
48
+```
49
+
50
+The activation record has the following information:
51
+
52
+ - processing state and pending dependencies. As long as there are pending dependencies
53
+   the node can not be processed. This is the only relevant information for actually
54
+   scheduling the graph and is shown in the above illustration.
55
+ - Current status of the node and profiling info (TRIGGERED, AWAKE, FINISHED, timestamps
56
+   when the node changed state).
57
+ - Timing information, mostly for drivers when the processing started, the time, duration
58
+   and rate (quantum) etc..
59
+ - Information about repositions (seek) and timebase owners.
60
+
61
+
62
+# Links
63
+
64
+When two nodes are linked together, the output node becomes a dependency for the input
65
+node. This means the input node can only start processing when the output node is finished.
66
+
67
+This dependency is reflected in the required counter in the activation record. In below
68
+illustration, B's required field is incremented with 1. The pending field is set to the
69
+required field when the graph is started. Node A will keep a list of all targets (B) that it
70
+is a dependency of.
71
+
72
+This dependency update is only performed when the link is ready (negotiated) and the nodes
73
+are ready to schedule (runnable).
74
+
75
+
76
+```
77
+   eventfd                                eventfd
78
+  +-^---------+                          +-^---------+
79
+  |           |        link              |           |
80
+ in     A    out ---------------------> in     B    out
81
+  |           |                          |           |
82
+  +-v---------+                          +-v---------+
83
+    activation {       target              activation {
84
+      status:OK,  -------------------->      status:OK,
85
+      pending:0,                             pending:1,
86
+      required:0                             required:1
87
+    }                                      }
88
+```
89
+
90
+Multiple links between A and B will only result in 1 target link between A and B.
91
+
92
+
93
+# Drivers
94
+
95
+The graph can only run if there is a driver node that is in some way linked to an
96
+active node.
97
+
98
+The driver is special because it will have to initiate the processing in the graph. It
99
+will use a timer or some sort of interrupt from hardware to start the cycle.
100
+
101
+Any node can also be a candidate for a driver (when the node.driver property is true).
102
+PipeWire will select the node with the highest priority.driver property as the driver.
103
+
104
+Nodes will be assigned to the driver node they will be scheduled with. Each node holds
105
+a reference to the driver and increments the required field of the driver.
106
+
107
+When a node is ready to be scheduled, the driver adds the node to its list of targets
108
+and increments the required field.
109
+
110
+
111
+```
112
+   eventfd                                eventfd
113
+  +-^---------+                          +-^---------+
114
+  |           |        link              |           |
115
+ in     A    out ---------------------> in     B    out
116
+  |           |                          |           |
117
+  +-v---------+                          +-v---------+
118
+    activation {       target              activation {
119
+      status:OK,  -------------------->      status:OK,
120
+      pending:0,                             pending:0,
121
+      required:1                             required:2
122
+    }                                      }
123
+      |    ^                         ^
124
+      |    |                        /   /
125
+      |    |                       /   /
126
+      |    |                      /   /
127
+      |    |                     /   /
128
+      |    |                    /   /
129
+      v    |     /-------------/   /
130
+    activation {                  /
131
+      status:OK, V---------------/
132
+      pending:0,
133
+      required:2
134
+    }
135
+  +-^---------+
136
+  |           |
137
+  |   driver  |
138
+  |           |
139
+  +-v---------+
140
+   eventfd
141
+```
142
+
143
+As seen in the illustration above, the driver holds a link to each node it needs to
144
+schedule and each node holds a link to the driver. Some nodes hold a link to other
145
+nodes.
146
+
147
+It is possible that the driver is the same as a node in the graph (for example node A)
148
+but conceptually, the links above are still valid.
149
+
150
+The driver will then start processing the graph by emitting the ready signal. PipeWire
151
+will then:
152
+
153
+ - Check the previous cycle. Did it complete? Mark xrun on unfinished nodes.
154
+ - Perform reposition requests if any, timebase changes, etc..
155
+ - The pending counter of each follower node is set to the required field.
156
+ - It then loops over all targets of the driver and atomically decrements the required
157
+   field of the activation record. When the required field is 0, the eventfd is signaled
158
+   and the node can be scheduled.
159
+
160
+In our example above, Node A and B will have their pending state decremented. Node A
161
+will be 0 and will be triggered first (node B has 2 pending dependencies to start with and
162
+will not be triggered yet). The driver itself also has 2 dependencies left and will not
163
+be triggered (complete) yet.
164
+
165
+## Scheduling node A
166
+
167
+When the eventfd is signaled on a node, we say the node is triggered and it will be able
168
+to process data. It consumes the input on the input ports and produces more data on the
169
+output ports.
170
+
171
+After processing, node A goes through the list of targets and decrements each pending
172
+field (node A has a reference to B and the driver).
173
+
174
+In our above example, the driver is decremented (from 2 to 1) but is not yet triggered.
175
+node B is decremented (from 1 to 0) and is triggered by writing to the eventfd.
176
+
177
+## Scheduling node B
178
+
179
+Node B is scheduled and processes the input from node A. It then goes through the list of
180
+targets and decrements the pending fields.  It decrements the pending field of the
181
+driver (from 1 to 0) and triggers the driver.
182
+
183
+## Scheduling the driver
184
+
185
+The graph always completes after the driver is triggered and scheduled. All required
186
+fields from all the nodes in the target list of the driver are now 0.
187
+
188
+The driver calculates some stats about cpu time etc.
189
+
190
+# Remote nodes.
191
+
192
+For remote nodes, the eventfd and the activation is transfered from the server
193
+to the client.
194
+
195
+This means that writing to the remote client eventfd will wake the client directly
196
+without going to the server first.
197
+
198
+All remote clients also get the activation and eventfd of the peer and driver they
199
+are linked to and can directly trigger peers and drivers without going to the
200
+server first.
201
pipewire-1.0.0.tar.gz/doc/dox/internals/session-manager.dox Changed
2
 
1
(renamed from doc/pipewire-session-manager.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/modules.dox Added
96
 
1
@@ -0,0 +1,94 @@
2
+/** \page page_modules Modules
3
+
4
+A PipeWire module is effectively a PipeWire client in an `.so` file that
5
+shares the \ref pw_context with the loading entity. Usually modules are
6
+loaded when they are listed in the configuration files. For example the
7
+default configuration file loads several modules:
8
+
9
+```
10
+context.modules = 
11
+    ...
12
+    # The native communication protocol.
13
+    {   name = libpipewire-module-protocol-native }
14
+
15
+    # The profile module. Allows application to access profiler
16
+    # and performance data. It provides an interface that is used
17
+    # by pw-top and pw-profiler.
18
+    {   name = libpipewire-module-profiler }
19
+
20
+    # Allows applications to create metadata objects. It creates
21
+    # a factory for Metadata objects.
22
+    {   name = libpipewire-module-metadata }
23
+
24
+    # Creates a factory for making devices that run in the
25
+    # context of the PipeWire server.
26
+    {   name = libpipewire-module-spa-device-factory }
27
+    ...
28
+
29
+```
30
+The matching libraries are:
31
+```
32
+$ ls -1 /usr/lib64/pipewire-0.3/libpipewire-module*
33
+...
34
+/usr/lib64/pipewire-0.3/libpipewire-module-metadata.so
35
+/usr/lib64/pipewire-0.3/libpipewire-module-profiler.so
36
+/usr/lib64/pipewire-0.3/libpipewire-module-protocol-native.so
37
+/usr/lib64/pipewire-0.3/libpipewire-module-spa-device-factory.so
38
+...
39
+```
40
+
41
+A module's entry point is the `pipewire__module_init` function, see \ref
42
+PIPEWIRE_SYMBOL_MODULE_INIT.
43
+
44
+\code
45
+int pipewire__module_init(struct pw_impl_module *module, const char *args).`
46
+\endcode
47
+
48
+See the \ref page_module_example_sink and \ref page_module_example_source
49
+modules for a general oveview of how modules look like.
50
+
51
+List of known modules:
52
+
53
+- \subpage page_module_access
54
+- \subpage page_module_adapter
55
+- \subpage page_module_avb
56
+- \subpage page_module_client_device
57
+- \subpage page_module_client_node
58
+- \subpage page_module_combine_stream
59
+- \subpage page_module_echo_cancel
60
+- \subpage page_module_example_filter
61
+- \subpage page_module_example_sink
62
+- \subpage page_module_example_source
63
+- \subpage page_module_fallback_sink
64
+- \subpage page_module_ffado_driver
65
+- \subpage page_module_filter_chain
66
+- \subpage page_module_jackdbus_detect
67
+- \subpage page_module_jack_tunnel
68
+- \subpage page_module_link_factory
69
+- \subpage page_module_loopback
70
+- \subpage page_module_metadata
71
+- \subpage page_module_netjack2_driver
72
+- \subpage page_module_netjack2_manager
73
+- \subpage page_module_pipe_tunnel
74
+- \subpage page_module_portal
75
+- \subpage page_module_profiler
76
+- \subpage page_module_protocol_native
77
+- \subpage page_module_protocol_pulse
78
+- \subpage page_module_protocol_simple
79
+- \subpage page_module_pulse_tunnel
80
+- \subpage page_module_raop_sink
81
+- \subpage page_module_raop_discover
82
+- \subpage page_module_roc_sink
83
+- \subpage page_module_roc_source
84
+- \subpage page_module_rtp_sap
85
+- \subpage page_module_rtp_sink
86
+- \subpage page_module_rtp_source
87
+- \subpage page_module_rtp_session
88
+- \subpage page_module_rt
89
+- \subpage page_module_session_manager
90
+- \subpage page_module_vban_recv
91
+- \subpage page_module_vban_send
92
+- \subpage page_module_x11_bell
93
+- \subpage page_module_zeroconf_discover
94
+
95
+*/
96
pipewire-1.0.0.tar.gz/doc/dox/overview.dox Changed
2
 
1
(renamed from doc/overview.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/programs Added
2
 
1
+(directory)
2
pipewire-1.0.0.tar.gz/doc/dox/programs/index.md Added
25
 
1
@@ -0,0 +1,23 @@
2
+\page page_programs Programs
3
+
4
+Manual pages:
5
+
6
+- \subpage page_man_pipewire_1
7
+- \subpage page_man_pipewire_conf_5
8
+- \subpage page_man_pipewire-pulse_1
9
+- \subpage page_man_pipewire-pulse_conf_5
10
+- \subpage page_man_pipewire-pulse-modules_7
11
+- \subpage page_man_pw-cat_1
12
+- \subpage page_man_pw-cli_1
13
+- \subpage page_man_pw-config_1
14
+- \subpage page_man_pw-dot_1
15
+- \subpage page_man_pw-dump_1
16
+- \subpage page_man_pw-jack_1
17
+- \subpage page_man_pw-link_1
18
+- \subpage page_man_pw-loopback_1
19
+- \subpage page_man_pw-metadata_1
20
+- \subpage page_man_pw-mididump_1
21
+- \subpage page_man_pw-mon_1
22
+- \subpage page_man_pw-profiler_1
23
+- \subpage page_man_pw-top_1
24
+- \subpage page_man_libpipewire-modules_7
25
pipewire-1.0.0.tar.gz/doc/dox/programs/libpipewire-modules.7.md Added
46
 
1
@@ -0,0 +1,44 @@
2
+\page page_man_libpipewire-modules_7 libpipewire-modules
3
+
4
+PipeWire modules
5
+
6
+# DESCRIPTION
7
+
8
+A PipeWire module is effectively a PipeWire client running inside
9
+`pipewire(1)` which can host multiple modules. Usually modules are
10
+loaded when they are listed in the configuration files. For example the
11
+default configuration file loads several modules:
12
+
13
+    context.modules = 
14
+        ...
15
+        # The native communication protocol.
16
+        {   name = libpipewire-module-protocol-native }
17
+
18
+        # The profile module. Allows application to access profiler
19
+        # and performance data. It provides an interface that is used
20
+        # by pw-top and pw-profiler.
21
+        {   name = libpipewire-module-profiler }
22
+
23
+        # Allows applications to create metadata objects. It creates
24
+        # a factory for Metadata objects.
25
+        {   name = libpipewire-module-metadata }
26
+
27
+        # Creates a factory for making devices that run in the
28
+        # context of the PipeWire server.
29
+        {   name = libpipewire-module-spa-device-factory }
30
+        ...
31
+    
32
+
33
+# KNOWN MODULES
34
+
35
+$(LIBPIPEWIRE_MODULES)
36
+
37
+# AUTHORS
38
+
39
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
40
+PipeWire is available from <$(PACKAGE_URL)>
41
+
42
+# SEE ALSO
43
+
44
+\ref page_man_pipewire_1 "pipewire(1)",
45
+\ref page_man_pipewire_conf_5 "pipewire.conf(5)"
46
pipewire-1.0.0.tar.gz/doc/dox/programs/pipewire-pulse-modules.7.md Added
34
 
1
@@ -0,0 +1,32 @@
2
+\page page_man_pipewire-pulse-modules_7 pipewire-pulse-modules
3
+
4
+PipeWire Pulseaudio modules
5
+
6
+# DESCRIPTION
7
+
8
+PipeWire's Pulseaudio emulation implements several Pulseaudio modules.
9
+It only supports its own built-in modules, and cannot load external
10
+modules written for Pulseaudio.
11
+
12
+The built-in modules can be loaded using Pulseaudio client programs, for
13
+example `pactl load-module \<module-name\> \<module-options\>`.
14
+They can also added to `pipewire-pulse.conf`, typically by a
15
+drop-in file in `~/.config/pipewire/pipewire-pulse.conf.d/`
16
+containing the module name and its arguments
17
+
18
+    pulse.cmd = 
19
+       { cmd = "load-module" args = "module-null-sink sink_name=foo" flags =   }
20
+    
21
+
22
+# KNOWN MODULES
23
+
24
+$(PIPEWIRE_PULSE_MODULES)
25
+
26
+# AUTHORS
27
+
28
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
29
+PipeWire is available from <$(PACKAGE_URL)>
30
+
31
+# SEE ALSO
32
+
33
+\ref page_man_pipewire-pulse_1 "pipewire-pulse(1)"
34
pipewire-1.0.0.tar.gz/doc/dox/programs/pipewire-pulse.1.md Added
42
 
1
@@ -0,0 +1,40 @@
2
+\page page_man_pipewire-pulse_1 pipewire-pulse
3
+
4
+The PipeWire PulseAudio replacement
5
+
6
+# SYNOPSIS
7
+
8
+**pipewire-pulse** \*options*\
9
+
10
+# DESCRIPTION
11
+
12
+**pipewire-pulse** starts a PulseAudio-compatible daemon that integrates
13
+with the PipeWire media server, by running a pipewire process through a
14
+systemd service. This daemon is a drop-in replacement for the PulseAudio
15
+daemon.
16
+
17
+# OPTIONS
18
+
19
+\par -h | \--help
20
+Show help.
21
+
22
+\par -v | \--verbose
23
+Increase the verbosity by one level. This option may be specified
24
+multiple times.
25
+
26
+\par \--version
27
+Show version information.
28
+
29
+\par -c | \--config=FILE
30
+Load the given config file (Default: pipewire-pulse.conf).
31
+
32
+# AUTHORS
33
+
34
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
35
+PipeWire is available from <$(PACKAGE_URL)>
36
+
37
+# SEE ALSO
38
+
39
+\ref page_man_pipewire-pulse_conf_5 "pipewire-pulse.conf(5)",
40
+\ref page_man_pipewire_1 "pipewire(1)",
41
+\ref page_man_pipewire-pulse-modules_7 "pipewire-pulse-modules(7)"
42
pipewire-1.0.0.tar.gz/doc/dox/programs/pipewire-pulse.conf.5.md Added
58
 
1
@@ -0,0 +1,56 @@
2
+\page page_man_pipewire-pulse_conf_5 pipewire-pulse.conf
3
+
4
+The PipeWire Pulseaudio server configuration file
5
+
6
+# SYNOPSIS
7
+
8
+*$XDG_CONFIG_HOME/pipewire/pipewire-pulse.conf*
9
+
10
+*$(PIPEWIRE_CONFIG_DIR)/pipewire-pulse.conf*
11
+
12
+*$(PIPEWIRE_CONFDATADIR)/pipewire-pulse.conf*
13
+
14
+*$(PIPEWIRE_CONFDATADIR)/pipewire-pulse.conf.d/*
15
+
16
+*$(PIPEWIRE_CONFIG_DIR)/pipewire-pulse.conf.d/*
17
+
18
+*$XDG_CONFIG_HOME/pipewire/pipewire-pulse.conf.d/*
19
+
20
+# DESCRIPTION
21
+
22
+Configuration for PipeWire's PulseAudio-compatible daemon.
23
+
24
+The configuration file format is the same as for `pipewire.conf(5)`.
25
+There are additional sections for configuring `pipewire-pulse(1)`
26
+settings.
27
+
28
+# CONFIGURATION FILE SECTIONS
29
+
30
+\par pulse.properties
31
+Dictionary. These properties configure the PipeWire Pulseaudio server
32
+properties.
33
+
34
+\par pulse.cmd
35
+Array of dictionaries. A set of commands to be executed on startup.
36
+
37
+\par pulse.rules
38
+Array of dictionaries. A set of match rules and actions to apply to
39
+clients.
40
+
41
+See \ref page_module_protocol_pulse "libpipewire-module-protocol-pulse(7)"
42
+for the detailed description.
43
+
44
+In addition, the general PipeWire daemon configuration sections apply,
45
+see \ref page_man_pipewire_conf_5 "pipewire.conf(5)".
46
+
47
+# AUTHORS
48
+
49
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
50
+PipeWire is available from <$(PACKAGE_URL)>
51
+
52
+# SEE ALSO
53
+
54
+\ref page_module_protocol_pulse "libpipewire-module-protocol-pulse(7)",
55
+\ref page_man_pipewire_conf_5 "pipewire.conf(5)",
56
+\ref page_man_pipewire-pulse_1 "pipewire-pulse(1)",
57
+\ref page_man_pipewire-pulse-modules_7 "pipewire-pulse-modules(7)"
58
pipewire-1.0.0.tar.gz/doc/dox/programs/pipewire.1.md Added
46
 
1
@@ -0,0 +1,44 @@
2
+\page page_man_pipewire_1 pipewire
3
+
4
+The PipeWire media server
5
+
6
+# SYNOPSIS
7
+
8
+**pipewire** \*options*\
9
+
10
+# DESCRIPTION
11
+
12
+PipeWire is a service that facilitates sharing of multimedia content
13
+between devices and applications.
14
+
15
+The **pipewire** daemon reads a config file that is further documented
16
+in \ref page_man_pipewire_conf_5 "pipewire.conf(5)" manual page.
17
+
18
+# OPTIONS
19
+
20
+\par -h | \--help
21
+Show help.
22
+
23
+\par -v | \--verbose
24
+Increase the verbosity by one level. This option may be specified
25
+multiple times.
26
+
27
+\par \--version
28
+Show version information.
29
+
30
+\par -c | \--config=FILE
31
+Load the given config file (Default: pipewire.conf).
32
+
33
+# AUTHORS
34
+
35
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
36
+PipeWire is available from <$(PACKAGE_URL)>
37
+
38
+# SEE ALSO
39
+
40
+\ref page_man_pw-top_1 "pw-top(1)",
41
+\ref page_man_pw-dump_1 "pw-dump(1)",
42
+\ref page_man_pw-mon_1 "pw-mon(1)",
43
+\ref page_man_pw-cat_1 "pw-cat(1)",
44
+\ref page_man_pw-cli_1 "pw-cli(1)",
45
+\ref page_man_libpipewire-modules_7 "libpipewire-modules(7)"
46
pipewire-1.0.0.tar.gz/doc/dox/programs/pipewire.conf.5.md Added
104
 
1
@@ -0,0 +1,102 @@
2
+\page page_man_pipewire_conf_5 pipewire.conf
3
+
4
+The PipeWire server configuration file
5
+
6
+# SYNOPSIS
7
+
8
+*$XDG_CONFIG_HOME/pipewire/pipewire.conf*
9
+
10
+*$(PIPEWIRE_CONFIG_DIR)/pipewire.conf*
11
+
12
+*$(PIPEWIRE_CONFDATADIR)/pipewire.conf*
13
+
14
+*$(PIPEWIRE_CONFDATADIR)/pipewire.conf.d/*
15
+
16
+*$(PIPEWIRE_CONFIG_DIR)/pipewire.conf.d/*
17
+
18
+*$XDG_CONFIG_HOME/pipewire/pipewire.conf.d/*
19
+
20
+# DESCRIPTION
21
+
22
+PipeWire is a service that facilitates sharing of multimedia content
23
+between devices and applications.
24
+
25
+On startup, the daemon reads a main configuration file to configure
26
+itself. It executes a series of commands listed in the config file.
27
+
28
+The config files are loaded in the order listed in the
29
+SYNOPSIS(#synopsis). The environment variables `PIPEWIRE_CONFIG_DIR`,
30
+`PIPEWIRE_CONFIG_PREFIX` and `PIPEWIRE_CONFIG_NAME` can be used to
31
+specify an alternative config directory, subdirectory and file
32
+respectively.
33
+
34
+Next to the configuration file can be a directory with the same name as
35
+the file with a `.d/` suffix. All directories in the
36
+SYNOPSIS(#synopsis) directory search paths are traversed in the listed
37
+order and the contents of the `*.conf` files inside them are appended to
38
+the main configuration file as overrides. Object sections are merged and
39
+array sections are appended.
40
+
41
+# CONFIGURATION FILE FORMAT
42
+
43
+The configuration file format is grouped into sections. A section is
44
+either a dictionary, {}, or an array, \\. Dictionary and array entries
45
+are separated by whitespace and may be simple value assignment, an array
46
+or a dictionary. For example:
47
+```
48
+    name = value # simple assignment
49
+
50
+    name = { key1 = value1 key2 = value2 } # a dictionary with two entries
51
+
52
+    name =  value1 value2  # an array with two entries
53
+
54
+    name =  { k = v1 } { k = v2 }  # an array of dictionaries
55
+```
56
+
57
+The configuration files can be expressed in full JSON syntax but for
58
+ease of use, a relaxed format may be used where:
59
+
60
+- `:` to delimit keys and values can be substuted by `=` or a space.
61
+- <tt>\"</tt> around keys and string can be omitted as long as no special
62
+  characters are used in the strings.
63
+- `,` to separate objects can be replaced with a whitespace character.
64
+- `#` can be used to start a comment until the line end
65
+
66
+# CONFIGURATION FILE SECTIONS
67
+
68
+\par context.properties
69
+Dictionary. These properties configure the PipeWire instance.
70
+
71
+\par context.spa-libs
72
+Dictionary. Maps plugin features with globs to a spa library.
73
+
74
+\par context.modules
75
+Array of dictionaries. Each entry in the array is a dictionary with the
76
+*name* of the module to load, including optional *args* and *flags*.
77
+Most modules support being loaded multiple times.
78
+
79
+\par context.objects
80
+Array of dictionaries. Each entry in the array is a dictionary
81
+containing the *factory* to create an object from and optional extra
82
+arguments specific to that factory.
83
+
84
+\par context.exec
85
+\parblock
86
+Array of dictionaries. Each entry in the array is dictionary containing
87
+the *path* of a program to execute on startup and optional *args*.
88
+
89
+This array used to contain an entry to start the session manager but
90
+this mode of operation has since been demoted to development aid. Avoid
91
+starting a session manager in this way in production environment.
92
+\endparblock
93
+
94
+# AUTHORS
95
+
96
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
97
+PipeWire is available from <$(PACKAGE_URL)>
98
+
99
+# SEE ALSO
100
+
101
+\ref page_man_pipewire_1 "pipewire(1)",
102
+\ref page_man_pw-mon_1 "pw-mon(1)",
103
+\ref page_man_libpipewire-modules_7 "libpipewire-modules(7)"
104
pipewire-1.0.0.tar.gz/doc/dox/programs/pw-cat.1.md Added
165
 
1
@@ -0,0 +1,163 @@
2
+\page page_man_pw-cat_1 pw-cat
3
+
4
+Play and record media with PipeWire
5
+
6
+# SYNOPSIS
7
+
8
+**pw-cat** \*options*\ \*FILE* \| -\
9
+
10
+**pw-play** \*options*\ \*FILE* \| -\
11
+
12
+**pw-record** \*options*\ \*FILE* \| -\
13
+
14
+**pw-midiplay** \*options*\ \*FILE* \| -\
15
+
16
+**pw-midirecord** \*options*\ \*FILE* \| -\
17
+
18
+**pw-dsdplay** \*options*\ \*FILE* \| -\
19
+
20
+# DESCRIPTION
21
+
22
+**pw-cat** is a simple tool for playing back or capturing raw or encoded
23
+media files on a PipeWire server. It understands all audio file formats
24
+supported by `libsndfile` for PCM capture and playback. When capturing
25
+PCM, the filename extension is used to guess the file format with the
26
+WAV file format as the default.
27
+
28
+It understands standard MIDI files for playback and recording. This tool
29
+will not render MIDI files, it will simply make the MIDI events
30
+available to the graph. You need a MIDI renderer such as qsynth,
31
+timidity or a hardware MIDI rendered to hear the MIDI.
32
+
33
+DSD playback is supported with the DSF file format. This tool will only
34
+work with native DSD capable hardware and will produce an error when no
35
+such hardware was found.
36
+
37
+When the *FILE* is - input and output will be raw data from STDIN and
38
+STDOUT respectively.
39
+
40
+# OPTIONS
41
+
42
+\par -h | \--help
43
+Show help.
44
+
45
+\par \--version
46
+Show version information.
47
+
48
+\par -v | \--verbose
49
+Verbose operation.
50
+
51
+\par -R | \--remote=NAME
52
+The name the *remote* instance to connect to. If left unspecified, a
53
+connection is made to the default PipeWire instance.
54
+
55
+\par -p | \--playback
56
+Playback mode. Read data from the specified file, and play it back. If
57
+the tool is called under the name **pw-play** or **pw-midiplay** this is
58
+the default.
59
+
60
+\par -r | \--record
61
+Recording mode. Capture data and write it to the specified file. If the
62
+tool is called under the name **pw-record** or **pw-midirecord** this is
63
+the default.
64
+
65
+\par -m | \--midi
66
+MIDI mode. *FILE* is a MIDI file. If the tool is called under the name
67
+**pw-midiplay** or **pw-midirecord** this is the default. Note that this
68
+program will *not* render the MIDI events into audible samples, it will
69
+simply provide the MIDI events in the graph. You need a separate MIDI
70
+renderer such as qsynth, timidity or a hardware renderer to hear the
71
+MIDI.
72
+
73
+\par -d | \--dsd
74
+DSD mode. *FILE* is a DSF file. If the tool is called under the name
75
+**pw-dsdplay** this is the default. Note that this program will *not*
76
+render the DSD audio. You need a DSD capable device to play DSD content
77
+or this program will exit with an error.
78
+
79
+\par \--media-type=VALUE
80
+Set the media type property (default Audio/Midi depending on mode). The
81
+media type is used by the session manager to select a suitable target to
82
+link to.
83
+
84
+\par \--media-category=VALUE
85
+Set the media category property (default Playback/Capture depending on
86
+mode). The media type is used by the session manager to select a
87
+suitable target to link to.
88
+
89
+\par \--media-role=VALUE
90
+Set the media role property (default Music). The media type is used by
91
+the session manager to select a suitable target to link to.
92
+
93
+\par \--target=VALUE
94
+\parblock
95
+Set a node target (default auto). The value can be:
96
+
97
+- **auto**: Automatically select (Default)
98
+
99
+- **0**: Don't try to link this node
100
+
101
+- <b>\<id\></b>: The object.serial or the node.name of a target node
102
+\endparblock
103
+
104
+\par \--latency=VALUE\*units*\
105
+\parblock
106
+Set the node latency (default 100ms)
107
+
108
+The latency determines the minimum amount of time it takes for a sample
109
+to travel from application to device (playback) and from device to
110
+application (capture).
111
+
112
+The latency determines the size of the buffers that the application will
113
+be able to fill. Lower latency means smaller buffers but higher
114
+overhead. Higher latency means larger buffers and lower overhead.
115
+
116
+Units can be **s** for seconds, **ms** for milliseconds, **us** for
117
+microseconds, **ns** for nanoseconds. If no units are given, the latency
118
+value is samples with the samplerate of the file.
119
+\endparblock
120
+
121
+\par -P | \--properties=VALUE
122
+Set extra stream properties as a JSON object.
123
+
124
+\par -q | \--quality=VALUE
125
+Resampler quality. When the samplerate of the source or destination file
126
+does not match the samplerate of the server, the data will be resampled.
127
+Higher quality uses more CPU. Values between 0 and 15 are allowed, the
128
+default quality is 4.
129
+
130
+\par \--rate=VALUE
131
+The sample rate, default 48000.
132
+
133
+\par \--channels=VALUE
134
+The number of channels, default 2.
135
+
136
+\par \--channel-map=VALUE
137
+The channelmap. Possible values include: **mono**, **stereo**,
138
+**surround-21**, **quad**, **surround-22**, **surround-40**,
139
+**surround-31**, **surround-41**, **surround-50**, **surround-51**,
140
+**surround-51r**, **surround-70**, **surround-71** or a comma separated
141
+list of channel names: **FL**, **FR**, **FC**, **LFE**, **SL**, **SR**,
142
+**FLC**, **FRC**, **RC**, **RL**, **RR**, **TC**, **TFL**, **TFC**,
143
+**TFR**, **TRL**, **TRC**, **TRR**, **RLC**, **RRC**, **FLW**, **FRW**,
144
+**LFE2**, **FLH**, **FCH**, **FRH**, **TFLC**, **TFRC**, **TSL**,
145
+**TSR**, **LLFR**, **RLFE**, **BC**, **BLC**, **BRC**
146
+
147
+\par \--format=VALUE
148
+The sample format to use. One of: **u8**, **s8**, **s16** (default),
149
+**s24**, **s32**, **f32**, **f64**.
150
+
151
+\par \--volume=VALUE
152
+The stream volume, default 1.000. Depending on the locale you have
153
+configured, "," or "." may be used as a decimal separator. Check with
154
+**locale** command.
155
+
156
+# AUTHORS
157
+
158
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
159
+PipeWire is available from <$(PACKAGE_URL)>
160
+
161
+# SEE ALSO
162
+
163
+\ref page_man_pipewire_1 "pipewire(1)",
164
+\ref page_man_pw-mon_1 "pw-mon(1)",
165
pipewire-1.0.0.tar.gz/doc/dox/programs/pw-cli.1.md Added
191
 
1
@@ -0,0 +1,189 @@
2
+\page page_man_pw-cli_1 pw-cli
3
+
4
+The PipeWire Command Line Interface
5
+
6
+# SYNOPSIS
7
+
8
+**pw-cli** \*command*\
9
+
10
+# DESCRIPTION
11
+
12
+Interact with a PipeWire instance.
13
+
14
+When a command is given, **pw-cli** will execute the command and exit
15
+
16
+When no command is given, **pw-cli** starts an interactive session with
17
+the default PipeWire instance *pipewire-0*.
18
+
19
+Connections to other, remote instances can be made. The current instance
20
+name is displayed at the prompt.
21
+
22
+Note that **pw-cli** also creates a local PipeWire instance. Some
23
+commands operate on the current (remote) instance and some on the local
24
+instance, such as module loading.
25
+
26
+Use the 'help' command to list the available commands.
27
+
28
+# GENERAL COMMANDS
29
+
30
+\par help | h
31
+Show a quick help on the commands available. It also lists the aliases
32
+for many commands.
33
+
34
+\par quit | q
35
+Exit from **pw-cli**
36
+
37
+# MODULE MANAGEMENT
38
+
39
+Modules are loaded and unloaded in the local instance, thus the pw-cli
40
+binary itself and can add functionality or objects to the local
41
+instance. It is not possible in PipeWire to load modules in another
42
+instance.
43
+
44
+\par load-module *name* \*arguments...*\
45
+\parblock
46
+Load a module specified by its name and arguments in the local instance.
47
+For most modules it is OK to be loaded more than once.
48
+
49
+This command returns a module variable that can be used to unload the
50
+module.
51
+
52
+The locally module is *not* visible in the remote instance. It is not
53
+possible in PipeWire to load modules in a remote instance.
54
+\endparblock
55
+
56
+\par unload-module *module-var*
57
+Unload a module, specified either by its variable.
58
+
59
+# OBJECT INTROSPECTION
60
+
61
+\par list-objects
62
+List the objects of the current instance.
63
+
64
+Objects are listed with their *id*, *type* and *version*.
65
+
66
+\par info *id* | *all*
67
+Get information about a specific object or *all* objects.
68
+
69
+Requesting info about an object will also notify you of changes.
70
+
71
+# WORKING WITH REMOTES
72
+
73
+\par connect \*remote-name*\
74
+\parblock
75
+Connect to a remote instance and make this the new current instance.
76
+
77
+If no remote name is specified, a connection is made to the default
78
+remote instance, usually *pipewire-0*.
79
+
80
+The special remote name called *internal* can be used to connect to the
81
+local **pw-cli** PipeWire instance.
82
+
83
+This command returns a remote var that can be used to disconnect or
84
+switch remotes.
85
+\endparblock
86
+
87
+\par disconnect \*remote-var*\
88
+\parblock
89
+Disconnect from a *remote instance*.
90
+
91
+If no remote name is specified, the current instance is disconnected.
92
+\endparblock
93
+
94
+\par list-remotes
95
+List all *remote instances*.
96
+
97
+\par switch-remote \*remote-var*\
98
+\parblock
99
+Make the specified *remote* the current instance.
100
+
101
+If no remote name is specified, the first instance is made current.
102
+\endparblock
103
+
104
+# NODE MANAGEMENT
105
+
106
+\par create-node *factory-name* \*properties...*\
107
+\parblock
108
+Create a node from a factory in the current instance.
109
+
110
+Properties are key=value pairs separated by whitespace.
111
+
112
+This command returns a *node variable*.
113
+\endparblock
114
+
115
+\par export-node *node-id* \*remote-var*\
116
+Export a node from the local instance to the specified instance. When no
117
+instance is specified, the node will be exported to the current
118
+instance.
119
+
120
+# DEVICE MANAGEMENT
121
+
122
+\par create-device *factory-name* \*properties...*\
123
+\parblock
124
+Create a device from a factory in the current instance.
125
+
126
+Properties are key=value pairs separated by whitespace.
127
+
128
+This command returns a *device variable*.
129
+\endparblock
130
+
131
+# LINK MANAGEMENT
132
+
133
+\par create-link *node-id* *port-id* *node-id* *port-id* \*properties...*\
134
+\parblock
135
+Create a link between 2 nodes and ports.
136
+
137
+Port *ids* can be *-1* to automatically select an available port.
138
+
139
+Properties are key=value pairs separated by whitespace.
140
+
141
+This command returns a *link variable*.
142
+\endparblock
143
+
144
+# GLOBALS MANAGEMENT
145
+
146
+\par destroy *object-id*
147
+Destroy a global object.
148
+
149
+# PARAMETER MANAGEMENT
150
+
151
+\par enum-params *object-id* *param-id*
152
+\parblock
153
+Enumerate params of an object.
154
+
155
+*param-id* can also be given as the param short name.
156
+\endparblock
157
+
158
+\par set-param *object-id* *param-id* *param-json*
159
+\parblock
160
+Set param of an object.
161
+
162
+*param-id* can also be given as the param short name.
163
+\endparblock
164
+
165
+# PERMISSION MANAGEMENT
166
+
167
+\par permissions *client-id* *object-id* *permission*
168
+\parblock
169
+Set permissions for a client.
170
+
171
+*object-id* can be *-1* to set the default permissions.
172
+\endparblock
173
+
174
+\par get-permissions *client-id*
175
+Get permissions of a client.
176
+
177
+# COMMAND MANAGEMENT
178
+
179
+\par send-command *object-id*
180
+Send a command to an object.
181
+
182
+# AUTHORS
183
+
184
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
185
+PipeWire is available from <$(PACKAGE_URL)>
186
+
187
+# SEE ALSO
188
+
189
+\ref page_man_pipewire_1 "pipewire(1)",
190
+\ref page_man_pw-mon_1 "pw-mon(1)",
191
pipewire-1.0.0.tar.gz/doc/dox/programs/pw-config.1.md Added
99
 
1
@@ -0,0 +1,97 @@
2
+\page page_man_pw-config_1 pw-config
3
+
4
+Debug PipeWire Config parsing
5
+
6
+# SYNOPSIS
7
+
8
+**pw-config** \*options*\ paths
9
+
10
+**pw-config** \*options*\ list \*SECTION*\
11
+
12
+**pw-config** \*options*\ merge *SECTION*
13
+
14
+# DESCRIPTION
15
+
16
+List config paths and config sections and display the parsed output.
17
+
18
+This tool can be used to get an overview of the config file that will be
19
+parsed by the PipeWire server and clients.
20
+
21
+# COMMON OPTIONS
22
+
23
+\par -h | \--help
24
+Show help.
25
+
26
+\par \--version
27
+Show version information.
28
+
29
+\par -n | \--name=NAME
30
+Config Name (default 'pipewire.conf')
31
+
32
+\par -p | \--prefix=PREFIX
33
+Config Prefix (default '')
34
+
35
+\par -L | \--no-newline
36
+Omit newlines after values
37
+
38
+\par -r | \--recurse
39
+Reformat config sections recursively
40
+
41
+\par -N | \--no-colors
42
+Disable color output
43
+
44
+\par -C | \-color\=WHEN\
45
+whether to enable color support. WHEN is
46
+*never*, *always*, or *auto*
47
+
48
+# LISTING PATHS
49
+
50
+Specify the paths command. It will display all the config files that
51
+will be parsed and in what order.
52
+
53
+# LISTING CONFIG SECTIONS
54
+
55
+Specify the list command with an optional *SECTION* to list the
56
+configuration fragments used for *SECTION*. Without a *SECTION*, all
57
+sections will be listed.
58
+
59
+Use the -r options to reformat the sections.
60
+
61
+# MERGING A CONFIG SECTION
62
+
63
+With the merge option and a *SECTION*, pw-config will merge all config
64
+files into a merged config section and dump the results. This will be
65
+the section used by the client or server.
66
+
67
+Use the -r options to reformat the sections.
68
+
69
+# EXAMPLES
70
+
71
+\par pw-config
72
+List all config files that will be used
73
+
74
+\par pw-config -n pipewire-pulse.conf
75
+List all config files that will be used by the PipeWire pulseaudio
76
+server.
77
+
78
+\par pw-config -n pipewire-pulse.conf list
79
+List all config sections used by the PipeWire pulseaudio server
80
+
81
+\par pw-config -n jack.conf list context.properties
82
+List the context.properties fragments used by the JACK clients
83
+
84
+\par pw-config -n jack.conf merge context.properties
85
+List the merged context.properties used by the JACK clients
86
+
87
+\par pw-config -n pipewire.conf -r merge context.modules
88
+List the merged context.modules used by the PipeWire server and reformat
89
+
90
+# AUTHORS
91
+
92
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
93
+PipeWire is available from <$(PACKAGE_URL)>
94
+
95
+# SEE ALSO
96
+
97
+\ref page_man_pipewire_1 "pipewire(1)",
98
+\ref page_man_pw-dump_1 "pw-dump(1)",
99
pipewire-1.0.0.tar.gz/doc/dox/programs/pw-dot.1.md Added
58
 
1
@@ -0,0 +1,56 @@
2
+\page page_man_pw-dot_1 pw-dot
3
+
4
+The PipeWire dot graph dump
5
+
6
+# SYNOPSIS
7
+
8
+**pw-dot** \*options*\
9
+
10
+# DESCRIPTION
11
+
12
+Create a .dot file of the PipeWire graph.
13
+
14
+The .dot file can then be visualized with a tool like **dotty** or
15
+rendered to a PNG file with `dot -Tpng pw.dot -o pw.png`.
16
+
17
+# OPTIONS
18
+
19
+\par -r | \--remote=NAME
20
+The name the remote instance to connect to. If left unspecified, a
21
+connection is made to the default PipeWire instance.
22
+
23
+\par -h | \--help
24
+Show help.
25
+
26
+\par \--version
27
+Show version information.
28
+
29
+\par -a | \--all
30
+Show all object types.
31
+
32
+\par -s | \--smart
33
+Show linked objects only.
34
+
35
+\par -d | \--detail
36
+Show all object properties.
37
+
38
+\par -o FILE | \--output=FILE
39
+Output file name (Default pw.dot). Use - for stdout.
40
+
41
+\par -L | \--lr
42
+Lay the graph from left to right, instead of dot's default top to
43
+bottom.
44
+
45
+\par -9 | \--90
46
+Lay the graph using 90-degree angles in edges.
47
+
48
+# AUTHORS
49
+
50
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
51
+PipeWire is available from <$(PACKAGE_URL)>
52
+
53
+# SEE ALSO
54
+
55
+\ref page_man_pipewire_1 "pipewire(1)",
56
+\ref page_man_pw-cli_1 "pw-cli(1)",
57
+\ref page_man_pw-mon_1 "pw-mon(1)",
58
pipewire-1.0.0.tar.gz/doc/dox/programs/pw-dump.1.md Added
45
 
1
@@ -0,0 +1,43 @@
2
+\page page_man_pw-dump_1 pw-dump
3
+
4
+The PipeWire state dumper
5
+
6
+# SYNOPSIS
7
+
8
+**pw-dump** \*options*\
9
+
10
+# DESCRIPTION
11
+
12
+The *pw-dump* program produces a representation of the current PipeWire
13
+state as JSON, including the information on nodes, devices, modules,
14
+ports, and other objects.
15
+
16
+# OPTIONS
17
+
18
+\par -h | \--help
19
+Show help.
20
+
21
+\par -r | \--remote=NAME
22
+The name of the *remote* instance to dump. If left unspecified, a
23
+connection is made to the default PipeWire instance.
24
+
25
+\par -m | \--monitor
26
+Monitor PipeWire state changes, and output JSON arrays describing
27
+changes.
28
+
29
+\par -N | \--no-colors
30
+Disable color output.
31
+
32
+\par -C | \--color=WHEN
33
+Whether to enable color support. WHEN is `never`, `always`, or `auto`.
34
+
35
+# AUTHORS
36
+
37
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
38
+PipeWire is available from <$(PACKAGE_URL)>
39
+
40
+# SEE ALSO
41
+
42
+\ref page_man_pipewire_1 "pipewire(1)",
43
+\ref page_man_pw-cli_1 "pw-cli(1)",
44
+\ref page_man_pw-top_1 "pw-top(1)",
45
pipewire-1.0.0.tar.gz/doc/dox/programs/pw-jack.1.md Added
47
 
1
@@ -0,0 +1,45 @@
2
+\page page_man_pw-jack_1 pw-jack
3
+
4
+Use PipeWire instead of JACK
5
+
6
+# SYNOPSIS
7
+
8
+**pw-jack** \*options*\ *COMMAND* \*FILE*\
9
+
10
+# DESCRIPTION
11
+
12
+**pw-jack** modifies the `LD_LIBRARY_PATH` environment variable so that
13
+applications will load PipeWire's reimplementation of the JACK client
14
+libraries instead of JACK's own libraries. This results in JACK clients
15
+being redirected to PipeWire.
16
+
17
+If PipeWire's reimplementation of the JACK client libraries has been
18
+installed as a system-wide replacement for JACK's own libraries, then
19
+the whole system already behaves in that way, in which case **pw-jack**
20
+has no practical effect.
21
+
22
+# OPTIONS
23
+
24
+\par -h
25
+Show help.
26
+
27
+\par -r NAME
28
+The name of the remote instance to connect to. If left unspecified, a
29
+connection is made to the default PipeWire instance.
30
+
31
+\par -v
32
+Verbose operation.
33
+
34
+# EXAMPLES
35
+
36
+\par pw-jack sndfile-jackplay /usr/share/sounds/freedesktop/stereo/bell.oga
37
+
38
+# AUTHORS
39
+
40
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
41
+PipeWire is available from <$(PACKAGE_URL)>
42
+
43
+# SEE ALSO
44
+
45
+\ref page_man_pipewire_1 "pipewire(1)",
46
+**jackd(1)**,
47
pipewire-1.0.0.tar.gz/doc/dox/programs/pw-link.1.md Added
137
 
1
@@ -0,0 +1,135 @@
2
+\page page_man_pw-link_1 pw-link
3
+
4
+The PipeWire Link Command
5
+
6
+# SYNOPSIS
7
+
8
+**pw-link** \*options*\ -o-l \*out-pattern*\ \*in-pattern*\
9
+
10
+**pw-link** \*options*\ *output* *input*
11
+
12
+**pw-link** \*options*\ -d *output* *input*
13
+
14
+**pw-link** \*options*\ -d *link-id*
15
+
16
+# DESCRIPTION
17
+
18
+List, create and destroy links between PipeWire ports.
19
+
20
+# COMMON OPTIONS
21
+
22
+\par -r | \--remote=NAME
23
+The name the *remote* instance to monitor. If left unspecified, a
24
+connection is made to the default PipeWire instance.
25
+
26
+\par -h | \--help
27
+Show help.
28
+
29
+\par \--version
30
+Show version information.
31
+
32
+# LISTING PORTS AND LINKS
33
+
34
+Specify one of -o, -i or -l to list the matching optional input and
35
+output ports and their links.
36
+
37
+\par -o | \--output
38
+List output ports
39
+
40
+\par -i | \--input
41
+List output ports
42
+
43
+\par -l | \--links
44
+List links
45
+
46
+\par -m | \--monitor
47
+Monitor links and ports. **pw-link** will not exit but monitor and print
48
+new and destroyed ports or links.
49
+
50
+\par -I | \--id
51
+List IDs. Also list the unique link and port ids.
52
+
53
+\par -v | \--verbose
54
+Verbose port properties. Also list the port-object-path and the
55
+port-alias.
56
+
57
+# CONNECTING PORTS
58
+
59
+Without any list option (-i, -o or -l), the given ports will be linked.
60
+Valid port specifications are:
61
+
62
+*port-id*
63
+
64
+As obtained with the -I option when listing ports.
65
+
66
+*node-name:port-name*
67
+
68
+As obtained when listing ports.
69
+
70
+*port-object-path*
71
+
72
+As obtained from the first alternative name for the port when listing
73
+them with the -v option.
74
+
75
+*port-alias*
76
+
77
+As obtained from the second alternative name for the ports when listing
78
+them with the -v option.
79
+
80
+Extra options when linking can be given:
81
+
82
+\par -L | \--linger
83
+Linger. Will create a link that exists after **pw-link** is destroyed.
84
+This is the default behaviour, unless the -m option is given.
85
+
86
+\par -P | \--passive
87
+Passive link. A passive link will keep both nodes it links inactive
88
+unless another non-passive link is activating the nodes. You can use
89
+this to link a sink to a filter and have them both suspended when
90
+nothing else is linked to either of them.
91
+
92
+\par -p | \--props=PROPS
93
+Properties as JSON object. Give extra properties when creaing the link.
94
+
95
+# DISCONNECTING PORTS
96
+
97
+When the -d option is given, an existing link between port is destroyed.
98
+
99
+To disconnect port, a single *link-id*, as obtained when listing links
100
+with the -I option, or two port specifications can be given. See the
101
+connecting ports section for valid port specifications.
102
+
103
+\par -d | \--disconnect
104
+Disconnect ports
105
+
106
+# EXAMPLES
107
+
108
+**pw-link** -iol
109
+
110
+List all port and their links.
111
+
112
+**pw-link** -lm
113
+
114
+List all links and monitor changes until **pw-link** is stopped.
115
+
116
+**pw-link** paplay:output_FL alsa_output.pci-0000_00_1b.0.analog-stereo:playback_FL
117
+
118
+Link the given output port to the input port.
119
+
120
+**pw-link** -lI
121
+
122
+List links and their Id.
123
+
124
+**pw-link** -d 89
125
+
126
+Destroy the link with id 89.
127
+
128
+# AUTHORS
129
+
130
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
131
+PipeWire is available from <$(PACKAGE_URL)>
132
+
133
+# SEE ALSO
134
+
135
+\ref page_man_pipewire_1 "pipewire(1)",
136
+\ref page_man_pw-cli_1 "pw-cli(1)"
137
pipewire-1.0.0.tar.gz/doc/dox/programs/pw-loopback.1.md Added
69
 
1
@@ -0,0 +1,67 @@
2
+\page page_man_pw-loopback_1 pw-loopback
3
+
4
+PipeWire loopback client
5
+
6
+# SYNOPSIS
7
+
8
+**pw-loopback** \*options*\
9
+
10
+# DESCRIPTION
11
+
12
+The *pw-loopback* program is a PipeWire client that uses the PipeWire
13
+loopback module to create loopback nodes, with configuration given via
14
+the command-line options.
15
+
16
+# OPTIONS
17
+
18
+\par -h | \--help
19
+Show help.
20
+
21
+\par -r | \--remote=NAME
22
+The name of the *remote* instance to connect to. If left unspecified, a
23
+connection is made to the default PipeWire instance.
24
+
25
+\par -n | \--name=NAME
26
+Name of the loopback node
27
+
28
+\par -g | \--group=NAME
29
+Name of the loopback node group
30
+
31
+\par -c | \--channels=NUMBER
32
+Number of channels to provide
33
+
34
+\par -m | \--channel-map=MAP
35
+Channel map (default ` FL, FR `)
36
+
37
+\par -l | \--latency=LATENCY
38
+Desired latency in ms
39
+
40
+\par -d | \--delay=DELAY
41
+Added delay in seconds (floating point allowed)
42
+
43
+\par -C | \--capture=TARGET
44
+Target device to capture from
45
+
46
+\par -P | \--playback=TARGET
47
+Target device to play to
48
+
49
+\par \--capture-props=PROPS
50
+Wanted properties of capture node (in JSON)
51
+
52
+\par \--playback-props=PROPS
53
+Wanted properties of capture node (in JSON)
54
+
55
+# AUTHORS
56
+
57
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
58
+PipeWire is available from <$(PACKAGE_URL)>
59
+
60
+# SEE ALSO
61
+
62
+\ref page_man_pipewire_1 "pipewire(1)",
63
+\ref page_man_pw-cat_1 "pw-cat(1)",
64
+**pactl(1)**
65
+
66
+Other ways to create loopback nodes are adding the loopback module in
67
+the configuration of a PipeWire daemon, or loading the loopback module
68
+using Pulseaudio commands (`pactl load-module module-loopback ...`).
69
pipewire-1.0.0.tar.gz/doc/dox/programs/pw-metadata.1.md Added
75
 
1
@@ -0,0 +1,73 @@
2
+\page page_man_pw-metadata_1 pw-metadata
3
+
4
+The PipeWire metadata
5
+
6
+# SYNOPSIS
7
+
8
+**pw-metadata** \*options*\ \*id* \*key* \*value* \*type* \ \ \ \
9
+
10
+# DESCRIPTION
11
+
12
+Monitor, set and delete metadata on PipeWire objects.
13
+
14
+Metadata are key/type/value triplets attached to objects identified by
15
+*id*. The metadata is shared between all applications binding to the
16
+same metadata object. When an object is destroyed, all its metadata is
17
+automatically removed.
18
+
19
+When no *value* is given, **pw-metadata** will query and log the
20
+metadata matching the optional arguments *id* and *key*. Without any
21
+arguments, all metadata is displayed.
22
+
23
+When *value* is given, **pw-metadata** will set the metadata for *id*
24
+and *key* to *value* and an optional *type*.
25
+
26
+# OPTIONS
27
+
28
+\par -r | \--remote=NAME
29
+The name the remote instance to use. If left unspecified, a connection
30
+is made to the default PipeWire instance.
31
+
32
+\par -h | \--help
33
+Show help.
34
+
35
+\par \--version
36
+Show version information.
37
+
38
+\par -l | \--list
39
+List available metadata objects
40
+
41
+\par -m | \--monitor
42
+Keeps running and log the changes to the metadata.
43
+
44
+\par -d | \--delete
45
+Delete all metadata for *id* or for the specified *key* of object *id*.
46
+Without any option, all metadata is removed.
47
+
48
+\par -n | \--name
49
+Metadata name (Default: "default").
50
+
51
+# EXAMPLES
52
+
53
+**pw-metadata**
54
+
55
+Show metadata in default name.
56
+
57
+**pw-metadata** -n settings 0
58
+
59
+Display settings.
60
+
61
+**pw-metadata** -n settings 0 clock.quantum 1024
62
+
63
+Change clock.quantum to 1024.
64
+
65
+# AUTHORS
66
+
67
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
68
+PipeWire is available from <$(PACKAGE_URL)>
69
+
70
+# SEE ALSO
71
+
72
+\ref page_man_pipewire_1 "pipewire(1)",
73
+\ref page_man_pw-mon_1 "pw-mon(1)",
74
+\ref page_man_pw-cli_1 "pw-cli(1)",
75
pipewire-1.0.0.tar.gz/doc/dox/programs/pw-mididump.1.md Added
40
 
1
@@ -0,0 +1,38 @@
2
+\page page_man_pw-mididump_1 pw-mididump
3
+
4
+The PipeWire MIDI dump
5
+
6
+# SYNOPSIS
7
+
8
+**pw-mididump** \*options*\ \*FILE*\
9
+
10
+# DESCRIPTION
11
+
12
+Dump MIDI messages to stdout.
13
+
14
+When a MIDI file is given, the events inside the file are printed.
15
+
16
+When no file is given, **pw-mididump** creates a PipeWire MIDI input
17
+stream and will print all MIDI events received on the port to stdout.
18
+
19
+# OPTIONS
20
+
21
+\par -r | \--remote=NAME
22
+The name the remote instance to monitor. If left unspecified, a
23
+connection is made to the default PipeWire instance.
24
+
25
+\par -h | \--help
26
+Show help.
27
+
28
+\par \--version
29
+Show version information.
30
+
31
+# AUTHORS
32
+
33
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
34
+PipeWire is available from <$(PACKAGE_URL)>
35
+
36
+# SEE ALSO
37
+
38
+\ref page_man_pipewire_1 "pipewire(1)",
39
+\ref page_man_pw-cat_1 "pw-cat(1)"
40
pipewire-1.0.0.tar.gz/doc/dox/programs/pw-mon.1.md Added
38
 
1
@@ -0,0 +1,36 @@
2
+\page page_man_pw-mon_1 pw-mon
3
+
4
+The PipeWire monitor
5
+
6
+# SYNOPSIS
7
+
8
+**pw-mon** \*options*\
9
+
10
+# DESCRIPTION
11
+
12
+Monitor objects on the PipeWire instance.
13
+
14
+# OPTIONS
15
+
16
+\par -r | \--remote=NAME
17
+The name the *remote* instance to monitor. If left unspecified, a
18
+connection is made to the default PipeWire instance.
19
+
20
+\par -h | \--help
21
+Show help.
22
+
23
+\par \--version
24
+Show version information.
25
+
26
+\par -N | \--color=WHEN
27
+Whether to use color, one of 'never', 'always', or 'auto'. The default
28
+is 'auto'. **-N** is equivalent to **--color=never**.
29
+
30
+# AUTHORS
31
+
32
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
33
+PipeWire is available from <$(PACKAGE_URL)>
34
+
35
+# SEE ALSO
36
+
37
+\ref page_man_pipewire_1 "pipewire(1)"
38
pipewire-1.0.0.tar.gz/doc/dox/programs/pw-profiler.1.md Added
48
 
1
@@ -0,0 +1,46 @@
2
+\page page_man_pw-profiler_1 pw-profiler
3
+
4
+The PipeWire profiler
5
+
6
+# SYNOPSIS
7
+
8
+**pw-profiler** \*options*\
9
+
10
+# DESCRIPTION
11
+
12
+Start profiling a PipeWire instance.
13
+
14
+If the server has the profiler module loaded, this program will connect
15
+to it and log the profiler data. Profiler data contains times and
16
+durations when processing nodes and devices started and completed.
17
+
18
+When this program is stopped, a set of **gnuplot** files and a script to
19
+generate SVG files from the .plot files is generated, along with a .html
20
+file to visualize the profiling results in a browser.
21
+
22
+This function uses the same data used by *pw-top*.
23
+
24
+# OPTIONS
25
+
26
+\par -r | \--remote=NAME
27
+The name the remote instance to monitor. If left unspecified, a
28
+connection is made to the default PipeWire instance.
29
+
30
+\par -h | \--help
31
+Show help.
32
+
33
+\par \--version
34
+Show version information.
35
+
36
+\par -o | \--output=FILE
37
+Profiler output name (default "profiler.log").
38
+
39
+# AUTHORS
40
+
41
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
42
+PipeWire is available from <$(PACKAGE_URL)>
43
+
44
+# SEE ALSO
45
+
46
+\ref page_man_pipewire_1 "pipewire(1)",
47
+\ref page_man_pw-top_1 "pw-top(1)"
48
pipewire-1.0.0.tar.gz/doc/dox/programs/pw-top.1.md Added
201
 
1
@@ -0,0 +1,207 @@
2
+\page page_man_pw-top_1 pw-top
3
+
4
+The PipeWire process viewer
5
+
6
+# SYNOPSIS
7
+
8
+**pw-top** \*options*\
9
+
10
+# DESCRIPTION
11
+
12
+The *pw-top* program provides a dynamic real-time view of the pipewire
13
+node and device statistics.
14
+
15
+A hierarchical view is shown of Driver nodes and follower nodes. The
16
+Driver nodes are actively using a timer to schedule dataflow in the
17
+followers. The followers of a driver node as shown below their driver
18
+with a + sign in a tree-like representation.
19
+
20
+The columns presented are as follows:
21
+
22
+\par S
23
+\parblock
24
+Node status.
25
+
26
+- E = ERROR
27
+- C = CREATING
28
+- S = SUSPENDED
29
+- I = IDLE
30
+- R = RUNNING
31
+\endparblock
32
+
33
+\par ID
34
+The ID of the pipewire node/device, as found in *pw-dump* and
35
+*pw-cli*
36
+
37
+\par QUANT
38
+\parblock
39
+The current quantum (for drivers) and the suggested quantum for
40
+follower nodes.
41
+
42
+The quantum by itself needs to be divided by the RATE column to
43
+calculate the duration of a scheduling period in fractions of a
44
+second.
45
+
46
+For a QUANT of 1024 and a RATE of 48000, the duration of one period
47
+in the graph is 1024/48000 or 21.3 milliseconds.
48
+
49
+Follower nodes can have a 0 QUANT field, which means that the node
50
+does not have a suggestion for the quantum and thus uses what the
51
+driver selected.
52
+
53
+The driver will use the lowest quantum of any of the followers. If
54
+none of the followers select a quantum, the default quantum in the
55
+pipewire configuration file will be used.
56
+
57
+The QUANT on the drivers usually translates directly into the number
58
+of audio samples processed per processing cycle of the graph.
59
+
60
+See also
61
+<https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/FAQ#pipewire-buffering-explained>
62
+\endparblock
63
+
64
+\par RATE
65
+\parblock
66
+The current rate (for drivers) and the suggested rate for follower
67
+nodes.
68
+
69
+This is the rate at which the *graph* processes data and needs to be
70
+combined with the QUANT value to derive the duration of a processing
71
+cycle in the graph.
72
+
73
+Some nodes can have a 0 RATE, which means that they don\'t have any
74
+rate suggestion for the graph. Nodes that suggest a rate can make
75
+the graph switch rates if the graph is otherwise idle and the new
76
+rate is allowed as a possible graph rate (see the pipewire
77
+configuration file).
78
+
79
+The RATE on (audio) driver nodes usually also translates directly to
80
+the samplerate used by the device. Although some devices might not
81
+be able to operate at the given samplerate, in which case resampling
82
+will need to be done. The negotiated samplerate with the device and
83
+stream can be found in the FORMAT column.
84
+
85
+\endparblock
86
+
87
+\par WAIT
88
+\parblock
89
+The waiting time of a node is the elapsed time between when the node
90
+is ready to start processing and when it actually started
91
+processing.
92
+
93
+For Driver nodes, this is the time between when the node wakes up to
94
+start processing the graph and when the driver (and thus also the
95
+graph) completes a cycle. The WAIT time for driver is thus the
96
+elapsed time processing the graph.
97
+
98
+For follower nodes, it is the time spent between being woken up
99
+(when all dependencies of the node are satisfied) and when
100
+processing starts. The WAIT time for follower nodes is thus mostly
101
+caused by context switching.
102
+
103
+A value of \-\-- means that the node was not signaled. A value of
104
++++ means that the node was signaled but not awake.
105
+\endparblock
106
+
107
+\par BUSY
108
+\parblock
109
+The processing time is started when the node starts processing until
110
+it completes and wakes up the next nodes in the graph.
111
+
112
+A value of \-\-- means that the node was not started. A value of +++
113
+means that the node was started but did not complete.
114
+\endparblock
115
+
116
+\par W/Q
117
+\parblock
118
+Ratio of WAIT / QUANT.
119
+
120
+The W/Q time of the driver node is a good measure of the graph load.
121
+The running averages of the driver W/Q ratios are used as the DSP
122
+load in other (JACK) tools.
123
+
124
+Values of \-\-- and +++ are copied from the WAIT column.
125
+
126
+\endparblock
127
+
128
+\par B/Q
129
+\parblock
130
+Ratio of BUSY / QUANT
131
+
132
+This is a good measure of the load of a particular driver or
133
+follower node.
134
+
135
+Values of \-\-- and +++ are copied from the BUSY column.
136
+\endparblock
137
+
138
+\par ERR
139
+\parblock
140
+Total of Xruns and Errors
141
+
142
+Xruns for drivers are when the graph did not complete a cycle. This
143
+can be because a node in the graph also has an Xrun. It can also be
144
+caused when scheduling delays cause a deadline to be missed, causing
145
+a hardware Xrun.
146
+
147
+Xruns for followers are incremented when the node started processing
148
+but did not complete before the end of the graph cycle deadline.
149
+\endparblock
150
+
151
+\par FORMAT
152
+\parblock
153
+The format used by the driver node or the stream. This is the
154
+hardware format negotiated with the device or stream.
155
+
156
+If the stream of driver has a different rate than the graph,
157
+resampling will be done.
158
+
159
+For raw audio formats, the layout is \<sampleformat\> \<channels\>
160
+\<samplerate\>.
161
+
162
+For IEC958 passthrough audio formats, the layout is IEC958 \<codec\>
163
+\<samplerate\>.
164
+
165
+For DSD formats, the layout is \<dsd-rate\> \<channels\>.
166
+
167
+For Video formats, the layout is \<pixelformat\>
168
+\<width\>x\<height\>.
169
+\endparblock
170
+
171
+\par NAME
172
+\parblock
173
+Name assigned to the device/node, as found in *pw-dump* node.name
174
+
175
+Names are prefixed by *+* when they are linked to a driver (entry
176
+above with no +)
177
+\endparblock
178
+
179
+
180
+# OPTIONS
181
+
182
+\par -h | \--help
183
+Show help.
184
+
185
+\par -b | \--batch-mode
186
+Run in non-interactive batch mode, similar to top\'s batch mode.
187
+
188
+\par -n | \--iterations=NUMBER
189
+Exit after NUMBER of batch iterations. Only used in batch mode.
190
+
191
+\par -r | \--remote=NAME
192
+The name the *remote* instance to monitor. If left unspecified, a
193
+connection is made to the default PipeWire instance.
194
+
195
+\par -V | \--version
196
+Show version information.
197
+
198
+# AUTHORS
199
+
200
+The PipeWire Developers <$(PACKAGE_BUGREPORT)>;
201
pipewire-1.0.0.tar.gz/doc/dox/pulse-modules.dox Added
151
 
1
@@ -0,0 +1,149 @@
2
+/** \page page_pulse_modules Pulseaudio Modules
3
+
4
+PipeWire's Pulseaudio emulation implements several Pulseaudio modules.
5
+It only supports its own built-in modules, and cannot load external
6
+modules written for Pulseaudio.
7
+
8
+# Loading modules
9
+
10
+The built-in modules can be loaded using Pulseaudio client programs,
11
+for example `pactl load-module <module-name> <module-options>`. They
12
+can also added to `pipewire-pulse.conf`, typically by a drop-in file
13
+in `~/.config/pipewire/pipewire-pulse.conf.d/` containing the module
14
+name and its arguments
15
+```
16
+pulse.cmd = 
17
+    { cmd = "load-module" args = "module-null-sink sink_name=foo" flags =   }
18
+
19
+```
20
+
21
+To list all modules currently loaded, with their arguments:
22
+```
23
+pactl list modules
24
+```
25
+
26
+For a short list of loaded modules:
27
+```
28
+pactl list modules short
29
+```
30
+
31
+Modules may be unloaded using either the module-name or index number:
32
+
33
+```
34
+pactl load-module <module-name> <parameters>
35
+pactl unload-module <module-name|index#>
36
+```
37
+
38
+# Common module options
39
+
40
+Most modules that create streams/devices support the following properties:
41
+
42
+## sink_name, source_name
43
+
44
+Name for the sink (resp. source). Allowed characters in the name are a-z, A-Z, numbers, period (.) and underscore (_). The length must be 1-128 characters.
45
+
46
+## format
47
+
48
+The sample format. The supported audio formats are:
49
+
50
+### PCM
51
+ - u8: unsigned 8-bit integer
52
+ - aLaw: A-law encoded 8-bit integer
53
+ - uLaw: μ-law encoded 8-bit integer
54
+ - s16le: signed 16-bit little-endian integer
55
+ - s16be: signed 16-bit big-endian integer
56
+ - s16, s16ne: native-endian aliases for s16le or s16be
57
+ - s16re: reverse-endian alias for s16le or s16be
58
+ - float32le: 32-bit little-endian float
59
+ - float32be: 32-bit big-endian float
60
+ - float32, float32ne: native-endian aliases for float32le or float32be
61
+ - float32re: reverse-endian alias for float32le or float32be
62
+ - s32le: signed 32-bit little-endian integer
63
+ - s32be: signed 32-bit big-endian integer
64
+ - s32, s32ne: native-endian aliases for s32le or s32be
65
+ - s32re: reverse-endian alias for s32le or s32be
66
+ - s24le: signed 24-bit little-endian integer (note: ALSA calls this "S24_3LE")
67
+ - s24be: signed 24-bit big-endian integer (note: ALSA calls this "S24_3BE")
68
+ - s24, s24ne: native-endian aliases for s24le or s24be
69
+ - s24re: reverse-endian alias for s24le or s24be
70
+ - s24-32le: signed 24-bit little-endian integer, packed into a 32-bit integer so that the 8 most significant bits are ignored (note: ALSA calls this "S24_LE")
71
+ - s24-32be: signed 24-bit big-endian integer, packed into a 32-bit integer so that the 8 most significant bits are ignored (note: ALSA calls this "S24_BE")
72
+ - s24-32, s24-32ne: native-endian aliases for s24-32le or s24-32be
73
+ - s24-32re: reverse-endian alias for s24-32le or s24-32be
74
+
75
+### Compressed audio formats
76
+
77
+Below is a list of all supported compressed formats. The code at the beginning of each line is used whenever a textual identifier for a format is needed (for example in configuration files or on the command line). The formats whose identifier ends with -iec61937 have to be wrapped in IEC 61937 frames, which makes the compressed audio behave more like normal PCM audio.
78
+
79
+ - ac3-iec61937: Dolby Digital (DD / AC-3 / A/52)
80
+ - eac3-iec61937: Dolby Digital Plus (DD+ / E-AC-3)
81
+ - mpeg-iec61937: MPEG-1 or MPEG-2 Part 3 (not MPEG-2 AAC)
82
+ - dts-iec61937: DTS
83
+ - mpeg2-aac-iec61937: MPEG-2 AAC (supported since PulseAudio 4.0)
84
+ - truehd-iec61937: Dolby TrueHD (added in PulseAudio 13.0, but doesn't work yet in practice)
85
+ - dtshd-iec61937: DTS-HD Master Audio (added in PulseAudio 13.0, but doesn't work yet in practice)
86
+ - pcm: PCM (not a compressed format, but listed here, because pcm is one of the recognized encoding identifiers)
87
+ - any: (special identifier for indicating that any encoding can be used)
88
+
89
+
90
+## rate
91
+
92
+The sample rate.
93
+
94
+##channels
95
+
96
+Number of audio channels.
97
+
98
+## channel_map
99
+
100
+A channel map. A list of comma-separated channel names. The currently defined channel names are:
101
+`left`, `right`, `mono`, `center`, `front-left`, `front-right`, `front-center`,
102
+`rear-center`, `rear-left`, `rear-right`, `lfe`, `subwoofer`, `front-left-of-center`,
103
+`front-right-of-center`, `side-left`, `side-right`, `aux0`, `aux1` to `aux15`, `top-center`,
104
+`top-front-left`, `top-front-right`, `top-front-center`, `top-rear-left`, `top-rear-right`,
105
+`top-rear-center`
106
+
107
+## sink_properties, source_properties
108
+
109
+Set additional properties of the sink/source. For example, you can set the description directly
110
+when the module is loaded by setting this parameter.
111
+
112
+```
113
+load-module module-alsa-sink sink_name=headphones sink_properties=device.description=Headphones
114
+```
115
+
116
+# List of known built-in modules:
117
+
118
+- \subpage page_pulse_module_alsa_sink
119
+- \subpage page_pulse_module_alsa_source
120
+- \subpage page_pulse_module_always_sink
121
+- \subpage page_pulse_module_combine_sink
122
+- \subpage page_pulse_module_echo_cancel
123
+- \subpage page_pulse_module_gsettings
124
+- \subpage page_pulse_module_jackdbus_detect
125
+- \subpage page_pulse_module_ladspa_sink
126
+- \subpage page_pulse_module_ladspa_source
127
+- \subpage page_pulse_module_loopback
128
+- \subpage page_pulse_module_native_protocol_tcp
129
+- \subpage page_pulse_module_null_sink
130
+- \subpage page_pulse_module_pipe_sink
131
+- \subpage page_pulse_module_pipe_source
132
+- \subpage page_pulse_module_raop_discover
133
+- \subpage page_pulse_module_remap_sink
134
+- \subpage page_pulse_module_remap_source
135
+- \subpage page_pulse_module_roc_sink
136
+- \subpage page_pulse_module_roc_sink_input
137
+- \subpage page_pulse_module_roc_source
138
+- \subpage page_pulse_module_rtp_recv
139
+- \subpage page_pulse_module_rtp_send
140
+- \subpage page_pulse_module_simple_protocol_tcp
141
+- \subpage page_pulse_module_switch_on_connect
142
+- \subpage page_pulse_module_tunnel_sink
143
+- \subpage page_pulse_module_tunnel_source
144
+- \subpage page_pulse_module_virtual_sink
145
+- \subpage page_pulse_module_virtual_source
146
+- \subpage page_pulse_module_x11_bell
147
+- \subpage page_pulse_module_zeroconf_discover
148
+- \subpage page_pulse_module_zeroconf_publish
149
+
150
+*/
151
pipewire-1.0.0.tar.gz/doc/dox/tutorial Added
2
 
1
+(directory)
2
pipewire-1.0.0.tar.gz/doc/dox/tutorial/index.dox Added
23
 
1
@@ -0,0 +1,21 @@
2
+/** \page page_tutorial Tutorial
3
+
4
+Welcome to the PipeWire API tutorial. The goal is to learn
5
+PipeWire API step-by-step with simple short examples.
6
+
7
+- \subpage page_tutorial1
8
+- \subpage page_tutorial2
9
+- \subpage page_tutorial3
10
+- \subpage page_tutorial4
11
+- \subpage page_tutorial5
12
+- \subpage page_tutorial6
13
+
14
+
15
+# More Example Programs
16
+
17
+- \ref audio-src.c "": \snippet{doc} audio-src.c title
18
+- \ref audio-dsp-filter.c "": \snippet{doc} audio-dsp-filter.c title
19
+- \ref video-play.c "": \snippet{doc} video-play.c title
20
+- \subpage page_examples
21
+
22
+*/
23
pipewire-1.0.0.tar.gz/doc/dox/tutorial/tutorial1.dox Changed
2
 
1
(renamed from doc/tutorial1.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/tutorial/tutorial2.dox Changed
2
 
1
(renamed from doc/tutorial2.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/tutorial/tutorial3.dox Changed
2
 
1
(renamed from doc/tutorial3.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/tutorial/tutorial4.dox Changed
2
 
1
(renamed from doc/tutorial4.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/tutorial/tutorial5.dox Changed
2
 
1
(renamed from doc/tutorial5.dox)
2
pipewire-1.0.0.tar.gz/doc/dox/tutorial/tutorial6.dox Changed
2
 
1
(renamed from doc/tutorial6.dox)
2
pipewire-1.0.0.tar.gz/doc/examples Added
2
 
1
+(directory)
2
pipewire-1.0.0.tar.gz/doc/examples/tutorial1.c Changed
2
 
1
(renamed from doc/tutorial1.c)
2
pipewire-1.0.0.tar.gz/doc/examples/tutorial2.c Changed
2
 
1
(renamed from doc/tutorial2.c)
2
pipewire-1.0.0.tar.gz/doc/examples/tutorial3.c Changed
2
 
1
(renamed from doc/tutorial3.c)
2
pipewire-1.0.0.tar.gz/doc/examples/tutorial4.c Changed
2
 
1
(renamed from doc/tutorial4.c)
2
pipewire-1.0.0.tar.gz/doc/examples/tutorial5.c Changed
2
 
1
(renamed from doc/tutorial5.c)
2
pipewire-1.0.0.tar.gz/doc/examples/tutorial6.c Changed
2
 
1
(renamed from doc/tutorial6.c)
2
pipewire-1.0.0.tar.gz/doc/input-filter.py Added
55
 
1
@@ -0,0 +1,53 @@
2
+#!/usr/bin/env python3
3
+# -*- mode: python; coding: utf-8; eval: (blacken-mode); -*-
4
+r"""
5
+Doxygen input filter that:
6
+
7
+- adds \privatesection to all files
8
+- removes macros
9
+- parses pulse_module_options and substitutes it into @pulse_module_options@
10
+
11
+This is used for .c files, and causes Doxygen to not include
12
+any symbols from them, unless they also appeared in a header file.
13
+
14
+The Pulse module option parsing is used in documentation of Pulseaudio modules.
15
+"""
16
+import sys
17
+import re
18
+import os
19
+
20
+
21
+def main():
22
+    fn = sys.argv1
23
+    with open(fn, "r") as f:
24
+        text = f.read()
25
+
26
+    text = re.sub("#define.*", "", text)
27
+
28
+    if "@pulse_module_options@" in text:
29
+        m = re.search(
30
+            r"static const char* *const pulse_module_options\s+=\s+(.*?\")\s*;\s*$",
31
+            text,
32
+            re.M | re.S,
33
+        )
34
+        if m:
35
+            res = 
36
+            for line in m.group(1).splitlines():
37
+                m = re.match(r"\s*\"\s*(a-z0-9_+)\s*=\s*(.*)\"\s*$", line)
38
+                if m:
39
+                    name = m.group(1)
40
+                    value = m.group(2).strip().strip("<>")
41
+                    res.append(f"- `{name}`: {value}")
42
+
43
+            res = "\n * ".join(res)
44
+            text = text.replace("@pulse_module_options@", res)
45
+
46
+    if os.path.basename(fn).startswith("module-") and fn.endswith(".c"):
47
+        text = re.sub(r"^ \* ##", r" * #", text, flags=re.M)
48
+
49
+    print("/** \\privatesection */")
50
+    print(text)
51
+
52
+
53
+if __name__ == "__main__":
54
+    main()
55
pipewire-1.0.0.tar.gz/doc/man-fixup.py Added
99
 
1
@@ -0,0 +1,97 @@
2
+#!/usr/bin/python3
3
+# -*- mode: python; coding: utf-8; eval: (blacken-mode); -*-
4
+r"""
5
+Fetch right Doxygen man file, replace dummy parts, and fixup nroff
6
+"""
7
+import argparse
8
+import re
9
+import sys
10
+from subprocess import call
11
+from pathlib import Path
12
+
13
+
14
+def main():
15
+    p = argparse.ArgumentParser(description=__doc__.strip())
16
+    p.add_argument("htmldir", type=Path)
17
+    p.add_argument("page")
18
+    p.add_argument("name")
19
+    p.add_argument("section")
20
+    p.add_argument("version")
21
+    args = p.parse_args()
22
+
23
+    page, name, section, version = args.page, args.name, args.section, args.version
24
+
25
+    mandir = args.htmldir / ".." / "man" / "man3"
26
+    fn = mandir / f"{page}.3"
27
+
28
+    # Doxygen < 1.9.7 names .md file output differently...
29
+    if not fn.exists():
30
+        page2 = page.replace("page_man_", "md_doc_dox_programs_").replace("-", "_")
31
+        fn = mandir / f"{page2}.3"
32
+    else:
33
+        page2 = None
34
+
35
+    try:
36
+        with open(fn, "r") as f:
37
+            text = f.read()
38
+    except:
39
+        print(f"ERROR: man file {fn} missing!", file=sys.stderr)
40
+        call("ls", "-R", str(args.htmldir / ".." / "man"), stdout=sys.stderr)
41
+        raise
42
+
43
+    text = text.replace(page, name)
44
+    if page2 is not None:
45
+        text = text.replace(page2, name)
46
+
47
+    # Replace bad nroff header
48
+    text = re.sub(
49
+        r"^(\.TH^\n*)\n",
50
+        rf'.TH "{name}" {section} "{version}" "PipeWire" \\" -*- nroff -*-\n',
51
+        text,
52
+    )
53
+
54
+    # Fixup name field (can't be done in Doxygen, otherwise HTML looks bac)
55
+    text = re.sub(
56
+        rf"^\.SH NAME\s*\n{name} \\- {name}\s*\n\.PP\n *",
57
+        rf".SH NAME\n{name} \\- ",
58
+        text,
59
+        count=1,
60
+        flags=re.M,
61
+    )
62
+
63
+    # Add DESCRIPTION section if missing and NAME field has extra stuff
64
+    if not re.search(r"^\.SH DESCRIPTION\s*\n", text):
65
+        text = re.sub(
66
+            r"^(.SH NAME\s*\n^\..*\n)\.PP\s*\n(^\.\n +)",
67
+            r"\1.SH DESCRIPTION\n.PP\n\2",
68
+            text,
69
+            count=1,
70
+            flags=re.M,
71
+        )
72
+
73
+    # Upcase titles
74
+    def upcase(m):
75
+        return m.group(0).upper()
76
+
77
+    text = re.sub(r"^\.SH .*?$", upcase, text, flags=re.M)
78
+
79
+    # Replace PW_KEY_*, SPA_KEY_* by their values
80
+    def pw_key(m):
81
+        key = m.group(0)
82
+        key = key.replace("PW_KEY_", "").lower().replace("_", ".")
83
+        if key in ("protocol", "access", "client.access") or key.startswith("sec."):
84
+            return f"pipewire.{key}"
85
+        return key
86
+
87
+    def spa_key(m):
88
+        key = m.group(0)
89
+        return key.replace("SPA_KEY_", "").lower().replace("_", ".")
90
+
91
+    text = re.sub(r"PW_KEY_A-Z_+", pw_key, text, flags=re.S)
92
+    text = re.sub(r"SPA_KEY_A-Z_+", spa_key, text, flags=re.S)
93
+
94
+    print(text)
95
+
96
+
97
+if __name__ == "__main__":
98
+    main()
99
pipewire-0.3.85.tar.gz/doc/meson.build -> pipewire-1.0.0.tar.gz/doc/meson.build Changed
201
 
1
@@ -1,3 +1,5 @@
2
+fs = import('fs')
3
+
4
 doxyfile_conf = configuration_data()
5
 doxyfile_conf.set('PACKAGE_NAME', meson.project_name())
6
 doxyfile_conf.set('PACKAGE_VERSION', meson.project_version())
7
@@ -5,6 +7,14 @@
8
 doxyfile_conf.set('top_builddir', meson.project_build_root())
9
 doxyfile_conf.set('output_directory', meson.current_build_dir())
10
 
11
+doxygen_env = environment()
12
+doxygen_env.set('PACKAGE_NAME', meson.project_name())
13
+doxygen_env.set('PACKAGE_VERSION', meson.project_version())
14
+doxygen_env.set('PACKAGE_URL', 'https://pipewire.org')
15
+doxygen_env.set('PACKAGE_BUGREPORT', 'https://gitlab.freedesktop.org/pipewire/pipewire/issues')
16
+doxygen_env.set('PIPEWIRE_CONFIG_DIR', pipewire_configdir)
17
+doxygen_env.set('PIPEWIRE_CONFDATADIR', pipewire_confdatadir)
18
+
19
 dot_found = find_program('dot', required: false).found()
20
 summary({'dot (used with doxygen)': dot_found}, bool_yn: true, section: 'Optional programs')
21
 if dot_found
22
@@ -14,41 +24,74 @@
23
 endif
24
 
25
 # Note: order here is how doxygen will expose the pages in the sidebar
26
-# api-tree.dox should be first to determine ordering of Modules.
27
+# tree.dox should be first to determine the ordering.
28
 extra_docs = 
29
-  'api-tree.dox',
30
-  'index.dox',
31
-  'overview.dox',
32
-  'pipewire.dox',
33
-  'pipewire-design.dox',
34
-  'pipewire-access.dox',
35
-  'pipewire-midi.dox',
36
-  'pipewire-portal.dox',
37
-  'pipewire-daemon.dox',
38
-  'pipewire-library.dox',
39
-  'pipewire-modules.dox',
40
-  'pipewire-session-manager.dox',
41
-  'pipewire-objects-design.dox',
42
-  'pipewire-audio.dox',
43
-  'pipewire-scheduling.dox',
44
-  'pipewire-protocol.dox',
45
-  'tutorial.dox',
46
-  'tutorial1.dox',
47
-  'tutorial2.dox',
48
-  'tutorial3.dox',
49
-  'tutorial4.dox',
50
-  'tutorial5.dox',
51
-  'tutorial6.dox',
52
-  'api.dox',
53
-  'spa-index.dox',
54
-  'spa-plugins.dox',
55
-  'spa-design.dox',
56
-  'spa-pod.dox',
57
-  'spa-buffer.dox',
58
-  'pulseaudio.dox',
59
-  'dma-buf.dox',
60
+  'tree.dox',
61
+  'dox/index.dox',
62
+  'dox/overview.dox',
63
+  'dox/modules.dox',
64
+  'dox/pulse-modules.dox',
65
+  'dox/programs/index.md',
66
+  'dox/internals/index.dox',
67
+  'dox/internals/design.dox',
68
+  'dox/internals/access.dox',
69
+  'dox/internals/midi.dox',
70
+  'dox/internals/portal.dox',
71
+  'dox/internals/daemon.dox',
72
+  'dox/internals/library.dox',
73
+  'dox/internals/session-manager.dox',
74
+  'dox/internals/objects.dox',
75
+  'dox/internals/audio.dox',
76
+  'dox/internals/scheduling.dox',
77
+  'dox/internals/protocol.dox',
78
+  'dox/internals/pulseaudio.dox',
79
+  'dox/internals/dma-buf.dox',
80
+  'dox/tutorial/index.dox',
81
+  'dox/tutorial/tutorial1.dox',
82
+  'dox/tutorial/tutorial2.dox',
83
+  'dox/tutorial/tutorial3.dox',
84
+  'dox/tutorial/tutorial4.dox',
85
+  'dox/tutorial/tutorial5.dox',
86
+  'dox/tutorial/tutorial6.dox',
87
+  'dox/api/index.dox',
88
+  'dox/api/spa-index.dox',
89
+  'dox/api/spa-plugins.dox',
90
+  'dox/api/spa-design.dox',
91
+  'dox/api/spa-pod.dox',
92
+  'dox/api/spa-buffer.dox',
93
 
94
 
95
+manpage_docs = 
96
+  'dox/programs/libpipewire-modules.7.md',
97
+  'dox/programs/pipewire-pulse-modules.7.md',
98
+  'dox/programs/pipewire-pulse.1.md',
99
+  'dox/programs/pipewire-pulse.conf.5.md',
100
+  'dox/programs/pipewire.1.md',
101
+  'dox/programs/pipewire.conf.5.md',
102
+  'dox/programs/pw-cat.1.md',
103
+  'dox/programs/pw-cli.1.md',
104
+  'dox/programs/pw-config.1.md',
105
+  'dox/programs/pw-dot.1.md',
106
+  'dox/programs/pw-dump.1.md',
107
+  'dox/programs/pw-jack.1.md',
108
+  'dox/programs/pw-link.1.md',
109
+  'dox/programs/pw-loopback.1.md',
110
+  'dox/programs/pw-metadata.1.md',
111
+  'dox/programs/pw-mididump.1.md',
112
+  'dox/programs/pw-mon.1.md',
113
+  'dox/programs/pw-profiler.1.md',
114
+  'dox/programs/pw-top.1.md',
115
+
116
+
117
+manpages = 
118
+
119
+foreach m : manpage_docs
120
+  name = fs.stem(fs.name(m))
121
+  pagepart = name.replace('.', '_')
122
+  manpages += name, f'page_man_@pagepart@'
123
+  extra_docs += m
124
+endforeach
125
+
126
 inputs = 
127
 foreach extra : extra_docs
128
   inputs += meson.project_source_root() / 'doc' / extra
129
@@ -68,6 +111,9 @@
130
 foreach h : module_sources
131
   inputs += meson.project_source_root() / 'src' / 'modules' / h
132
 endforeach
133
+foreach h : pipewire_module_protocol_pulse_sources
134
+  inputs += meson.project_source_root() / 'src' / 'modules' / h
135
+endforeach
136
 input_dirs =  meson.project_source_root() / 'spa' / 'include' / 'spa' 
137
 
138
 path_prefixes = 
139
@@ -116,32 +162,30 @@
140
 
141
 input_dirs +=  'doc/examples.dox' 
142
 
143
-man_doxygen = 
144
-man_subpages = 
145
-foreach m : manpages
146
-  manconf = configuration_data()
147
-  pagename = 'page_man_' + m.split('.rst.in').get(0).replace('.', '_').replace('-', '_')
148
-  filename = m.split('.rst.in').get(0) + '.dox'
149
-  manconf.set('pagename', pagename)
150
-  manconf.set('title', m.split('.rst.in').get(0).replace('.1','').replace('.5',''))
151
-  manconf.set('filename', meson.project_source_root() / 'man' / m)
152
-  manfile = configure_file(input: 'manpage.dox.in',
153
-                           output: filename,
154
-                           configuration: manconf)
155
-  man_doxygen += manfile
156
-  man_subpages += '- \subpage ' + pagename
157
-  input_dirs +=  'doc/' + filename 
158
+module_manpage_list = 
159
+foreach m : module_sources
160
+   name = fs.stem(m)
161
+   pagepart = name.replace('-', '_')
162
+   module_manpage_list += f'\\ref page_@pagepart@ "libpipewire-@name@(7)"'
163
+   manpages += f'libpipewire-@name@.7', f'page_@pagepart@'
164
 endforeach
165
 
166
-pw_tools_dox_conf = configuration_data()
167
-pw_tools_dox_conf.set('man_subpages', '\n'.join(man_subpages))
168
-pw_tools_dox = configure_file(input: 'pipewire-tools.dox.in',
169
-                          output: 'pipewire-tools.dox',
170
-                          configuration: pw_tools_dox_conf)
171
-input_dirs +=  'doc/pipewire-tools.dox' 
172
+doxygen_env.set('LIBPIPEWIRE_MODULES', '<ul><li>' + '</li><li>'.join(module_manpage_list) + '</li></ul>')
173
+
174
+pulse_module_manpage_list = 
175
+foreach m : pipewire_module_protocol_pulse_sources
176
+  name = fs.stem(fs.name(m))
177
+  if m.contains('/modules/') and name.startswith('module-')
178
+    pagepart = name.replace('-', '_')
179
+    pulse_module_manpage_list += f'\\ref page_pulse_@pagepart@ "pipewire-pulse-@name@(7)"'
180
+    manpages += f'pipewire-pulse-@name@.7', f'page_pulse_@pagepart@'
181
+  endif
182
+endforeach
183
+
184
+doxygen_env.set('PIPEWIRE_PULSE_MODULES', '<ul><li>' + '</li><li>'.join(pulse_module_manpage_list) + '</li></ul>')
185
 
186
 doxygen_layout = meson.project_source_root() / 'doc' / 'DoxygenLayout.xml'
187
-doxygen_filter_c = meson.project_source_root() / 'doc' / 'input-filter.sh'
188
+doxygen_filter_c = meson.project_source_root() / 'doc' / 'input-filter.py'
189
 doxygen_filter_h = meson.project_source_root() / 'doc' / 'input-filter-h.sh'
190
 
191
 doxyfile_conf.set('inputs', ' '.join(inputs + input_dirs))
192
@@ -161,8 +205,33 @@
193
 endif
194
 
195
 html_target = custom_target('pipewire-docs',
196
-                            input:  doxyfile, doxygen_layout, examples_dox, pw_tools_dox, doxygen_filter_c, doxygen_filter_h  + inputs + cssfiles + man_doxygen,
197
+                            input:  doxyfile, doxygen_layout, examples_dox, doxygen_filter_c, doxygen_filter_h  + inputs + cssfiles,
198
                             output:  'html' ,
199
                             command:  doxygen, doxyfile ,
200
-                            install: true,
201
pipewire-1.0.0.tar.gz/doc/tree.dox Added
135
 
1
@@ -0,0 +1,133 @@
2
+/**
3
+
4
+This determines the ordering of items in Doxygen sidebar.
5
+
6
+\defgroup api_pw_core Core API
7
+\brief PipeWire Core API
8
+\{
9
+\addtogroup pw_pipewire
10
+\addtogroup pw_main_loop
11
+\addtogroup pw_context
12
+\addtogroup pw_client
13
+\addtogroup pw_core
14
+\addtogroup pw_device
15
+\addtogroup pw_factory
16
+\addtogroup pw_link
17
+\addtogroup pw_loop
18
+\addtogroup pw_module
19
+\addtogroup pw_node
20
+\addtogroup pw_permission
21
+\addtogroup pw_port
22
+\addtogroup pw_proxy
23
+\addtogroup pw_registry
24
+\addtogroup pw_type
25
+\addtogroup pw_keys
26
+\}
27
+
28
+\defgroup api_pw_impl Implementation API
29
+\brief PipeWire Object Implementation API
30
+\{
31
+\addtogroup pw_impl_client
32
+\addtogroup pw_impl_core
33
+\addtogroup pw_impl_device
34
+\addtogroup pw_impl_factory
35
+\addtogroup pw_impl_link
36
+\addtogroup pw_impl_metadata
37
+\addtogroup pw_impl_module
38
+\addtogroup pw_impl_node
39
+\addtogroup pw_impl_port
40
+\addtogroup pw_buffers
41
+\addtogroup pw_control
42
+\addtogroup pw_data_loop
43
+\addtogroup pw_global
44
+\addtogroup pw_protocol
45
+\addtogroup pw_resource
46
+\addtogroup pw_thread_loop
47
+\addtogroup pw_work_queue
48
+\}
49
+
50
+\defgroup api_pw_util Utilities
51
+\brief PipeWire Utilities
52
+\{
53
+\addtogroup pw_array
54
+\addtogroup pw_conf
55
+\addtogroup pw_gettext
56
+\addtogroup pw_log
57
+\addtogroup pw_map
58
+\addtogroup pw_memblock
59
+\addtogroup pw_properties
60
+\addtogroup pw_thread
61
+\addtogroup pw_utils
62
+\}
63
+
64
+\defgroup api_pw_ext Extensions
65
+\brief PipeWire Extensions
66
+\{
67
+\addtogroup pw_client_node
68
+\addtogroup pw_metadata
69
+\addtogroup pw_profiler
70
+\addtogroup pw_protocol_native
71
+\addtogroup pw_session_manager
72
+\}
73
+
74
+\defgroup api_spa SPA
75
+\brief Simple Plugin API
76
+\{
77
+\addtogroup spa_buffer
78
+\addtogroup spa_control
79
+\addtogroup spa_debug
80
+\addtogroup spa_device
81
+\addtogroup spa_graph
82
+\addtogroup spa_node
83
+\addtogroup spa_param
84
+\addtogroup spa_pod
85
+\defgroup spa_utils Utilities
86
+Utility data structures, macros, etc.
87
+\{
88
+\addtogroup spa_ansi
89
+\addtogroup spa_utils_defs
90
+\addtogroup spa_dict
91
+\addtogroup spa_list
92
+\addtogroup spa_hooks
93
+\addtogroup spa_interfaces
94
+\addtogroup spa_json
95
+\addtogroup spa_json_pod
96
+\addtogroup spa_keys
97
+\addtogroup spa_names
98
+\addtogroup spa_result
99
+\addtogroup spa_ringbuffer
100
+\addtogroup spa_string
101
+\addtogroup spa_types
102
+\}
103
+\defgroup spa_support Support
104
+Support interfaces provided by host
105
+\{
106
+\addtogroup spa_cpu
107
+\addtogroup spa_dbus
108
+\addtogroup spa_i18n
109
+\addtogroup spa_log
110
+\addtogroup spa_loop
111
+\addtogroup spa_handle
112
+\addtogroup spa_plugin_loader
113
+\addtogroup spa_system
114
+\addtogroup spa_thread
115
+\}
116
+\}
117
+
118
+\defgroup pw_stream Stream
119
+\{
120
+\}
121
+
122
+\defgroup pw_filter Filter
123
+\{
124
+\}
125
+
126
+\page page_overview
127
+\page page_programs
128
+\page page_modules
129
+\page page_pulse_modules
130
+\page page_internals
131
+\page page_api
132
+\page page_tutorial
133
+
134
+*/
135
pipewire-0.3.85.tar.gz/meson.build -> pipewire-1.0.0.tar.gz/meson.build Changed
43
 
1
@@ -1,5 +1,5 @@
2
 project('pipewire', 'c' ,
3
-  version : '0.3.85',
4
+  version : '1.0.0',
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
@@ -485,22 +485,21 @@
9
   subdir('pipewire-alsa/tests')
10
 endif
11
 
12
-generate_manpages = false
13
-if get_option('man').allowed()
14
-  rst2man = find_program('rst2man', required: false)
15
-  if not rst2man.found()
16
-    rst2man = find_program('rst2man.py', required: get_option('man'))
17
-  endif
18
-  if rst2man.found()
19
-    generate_manpages = true
20
-  endif
21
+generate_docs = get_option('man').enabled() or get_option('docs').enabled()
22
+if get_option('man').allowed() or get_option('docs').allowed()
23
+  doxygen = find_program('doxygen', required : generate_docs)
24
+  pymod = import('python')
25
+  python = pymod.find_installation('python3', required: generate_docs)
26
+  generate_docs = doxygen.found() and python.found()
27
 endif
28
 
29
-summary({'Manpage generation': generate_manpages}, bool_yn: true)
30
-subdir('man')
31
+install_docs = get_option('docs').require(generate_docs).allowed()
32
+install_man = get_option('man').require(generate_docs).allowed()
33
+
34
+summary({'Documentation ': install_docs}, bool_yn: true)
35
+summary({'Man pages ': install_man}, bool_yn: true)
36
 
37
-doxygen = find_program('doxygen', required : get_option('docs'))
38
-if doxygen.found()
39
+if generate_docs
40
   subdir('doc')
41
 endif
42
 
43
pipewire-0.3.85.tar.gz/meson_options.txt -> pipewire-1.0.0.tar.gz/meson_options.txt Changed
24
 
1
@@ -2,17 +2,17 @@
2
        type : 'string',
3
        description : 'Directory for installing documentation to (defaults to pipewire_datadir/doc/meson.project_name() )')
4
 option('docs',
5
-       description: 'Build documentation',
6
+       description: 'Documentation',
7
+       type: 'feature',
8
+       value: 'disabled')
9
+option('man',
10
+       description: 'Manual pages',
11
        type: 'feature',
12
        value: 'disabled')
13
 option('examples',
14
        description: 'Build examples',
15
        type: 'feature',
16
        value: 'enabled')
17
-option('man',
18
-       description: 'Build manpages',
19
-       type: 'feature',
20
-       value: 'auto')
21
 option('tests',
22
        description: 'Build tests',
23
        type: 'feature',
24
pipewire-0.3.85.tar.gz/pipewire-jack/src/pipewire-jack.c -> pipewire-1.0.0.tar.gz/pipewire-jack/src/pipewire-jack.c Changed
201
 
1
@@ -9,6 +9,7 @@
2
 #include <sys/mman.h>
3
 #include <regex.h>
4
 #include <math.h>
5
+#include <threads.h>
6
 
7
 #include <jack/jack.h>
8
 #include <jack/intclient.h>
9
@@ -111,7 +112,7 @@
10
 static bool mlock_warned = false;
11
 
12
 #define MIDI_SCRATCH_FRAMES    8192
13
-static float midi_scratchMIDI_SCRATCH_FRAMES;
14
+static thread_local float midi_scratchMIDI_SCRATCH_FRAMES;
15
 
16
 
17
 #define OBJECT_CHUNK       8
18
@@ -301,6 +302,15 @@
19
    char default_audio_source1024;
20
 };
21
 
22
+struct frame_times {
23
+   uint64_t frames;
24
+   uint64_t nsec;
25
+   uint64_t next_nsec;
26
+   uint32_t buffer_frames;
27
+   uint32_t sample_rate;
28
+   double rate_diff;
29
+};
30
+
31
 struct client {
32
    char nameJACK_CLIENT_NAME_SIZE+1;
33
 
34
@@ -445,6 +455,7 @@
35
 
36
    jack_position_t jack_position;
37
    jack_transport_state_t jack_state;
38
+   struct frame_times jack_times;
39
 };
40
 
41
 #define return_val_if_fail(expr, val)              \
42
@@ -847,21 +858,6 @@
43
    return NULL;
44
 }
45
 
46
-static struct buffer *dequeue_buffer(struct client *c, struct mix *mix)
47
-{
48
-   struct buffer *b;
49
-
50
-   if (SPA_UNLIKELY(spa_list_is_empty(&mix->queue)))
51
-       return NULL;
52
-
53
-   b = spa_list_first(&mix->queue, struct buffer, link);
54
-   spa_list_remove(&b->link);
55
-   SPA_FLAG_SET(b->flags, BUFFER_FLAG_OUT);
56
-   pw_log_trace_fp("%p: port %p: dequeue buffer %d", c, mix->port, b->id);
57
-
58
-   return b;
59
-}
60
-
61
 #if defined (__SSE__)
62
 #include <xmmintrin.h>
63
 static void mix_sse(float *dst, float *src, uint32_t n_src, bool aligned, uint32_t n_samples)
64
@@ -1317,7 +1313,7 @@
65
    }
66
 }
67
 
68
-static inline void reuse_buffer(struct client *c, struct mix *mix, uint32_t id)
69
+static inline void queue_buffer(struct client *c, struct mix *mix, uint32_t id)
70
 {
71
    struct buffer *b;
72
 
73
@@ -1330,6 +1326,21 @@
74
    }
75
 }
76
 
77
+static inline struct buffer *dequeue_buffer(struct client *c, struct mix *mix)
78
+{
79
+   struct buffer *b;
80
+
81
+   if (SPA_UNLIKELY(spa_list_is_empty(&mix->queue)))
82
+       return NULL;
83
+
84
+   b = spa_list_first(&mix->queue, struct buffer, link);
85
+   spa_list_remove(&b->link);
86
+   SPA_FLAG_SET(b->flags, BUFFER_FLAG_OUT);
87
+   pw_log_trace_fp("%p: port %p: dequeue buffer %d", c, mix->port, b->id);
88
+
89
+   return b;
90
+}
91
+
92
 
93
 static size_t convert_from_midi(void *midi, void *buffer, size_t size)
94
 {
95
@@ -1469,7 +1480,7 @@
96
            c, p->object->port.name, p->port_id, frames,
97
            mix->n_buffers, mix->io);
98
 
99
-   if (SPA_UNLIKELY((io = mix->io) == NULL))
100
+   if (SPA_UNLIKELY((io = mix->io) == NULL || mix->n_buffers == 0))
101
        return NULL;
102
 
103
    if (io->status == SPA_STATUS_HAVE_DATA &&
104
@@ -1477,21 +1488,26 @@
105
        b = &mix->buffersio->buffer_id;
106
        d = &b->datas0;
107
    } else {
108
-       if (io->buffer_id < mix->n_buffers) {
109
-           reuse_buffer(c, mix, io->buffer_id);
110
-           io->buffer_id = SPA_ID_INVALID;
111
-       }
112
-       if (SPA_UNLIKELY((b = dequeue_buffer(c, mix)) == NULL)) {
113
-           pw_log_warn("port %p: out of buffers", p);
114
-           return NULL;
115
+       if (mix->n_buffers == 1) {
116
+           b = &mix->buffers0;
117
+       } else {
118
+           if (io->buffer_id < mix->n_buffers)
119
+               queue_buffer(c, mix, io->buffer_id);
120
+           b = dequeue_buffer(c, mix);
121
+
122
+           if (SPA_UNLIKELY(b == NULL)) {
123
+               pw_log_warn("port %p: out of buffers %d", p, mix->n_buffers);
124
+               io->buffer_id = SPA_ID_INVALID;
125
+               return NULL;
126
+           }
127
        }
128
        d = &b->datas0;
129
        d->chunk->offset = 0;
130
        d->chunk->size = frames * sizeof(float);
131
        d->chunk->stride = stride;
132
 
133
-       io->status = SPA_STATUS_HAVE_DATA;
134
        io->buffer_id = b->id;
135
+       io->status = SPA_STATUS_HAVE_DATA;
136
    }
137
    ptr = d->data;
138
    if (buf)
139
@@ -1520,9 +1536,14 @@
140
    {
141
        struct buffer *b;
142
        ptr = get_buffer_output(p, c->max_frames, 1, &b);
143
-       if (SPA_LIKELY(ptr != NULL))
144
+       if (SPA_LIKELY(ptr != NULL)) {
145
+           /* first build the complete pod in scratch memory, then copy it
146
+            * to the target buffer. This makes it possible for multiple threads
147
+            * to do this concurrently */
148
            b->datas0.chunk->size = convert_from_midi(src,
149
-                   ptr, c->max_frames * sizeof(float));
150
+                   midi_scratch, MIDI_SCRATCH_FRAMES * sizeof(float));
151
+           memcpy(ptr, midi_scratch, b->datas0.chunk->size);
152
+       }
153
        break;
154
    }
155
    default:
156
@@ -1578,38 +1599,38 @@
157
 
158
 static inline void debug_position(struct client *c, jack_position_t *p)
159
 {
160
-   pw_log_trace("usecs:       %"PRIu64, p->usecs);
161
-   pw_log_trace("frame_rate:  %u", p->frame_rate);
162
-   pw_log_trace("frame:       %u", p->frame);
163
-   pw_log_trace("valid:       %08x", p->valid);
164
+   pw_log_trace_fp("usecs:       %"PRIu64, p->usecs);
165
+   pw_log_trace_fp("frame_rate:  %u", p->frame_rate);
166
+   pw_log_trace_fp("frame:       %u", p->frame);
167
+   pw_log_trace_fp("valid:       %08x", p->valid);
168
 
169
    if (p->valid & JackPositionBBT) {
170
-       pw_log_trace("BBT");
171
-       pw_log_trace(" bar:              %u", p->bar);
172
-       pw_log_trace(" beat:             %u", p->beat);
173
-       pw_log_trace(" tick:             %u", p->tick);
174
-       pw_log_trace(" bar_start_tick:   %f", p->bar_start_tick);
175
-       pw_log_trace(" beats_per_bar:    %f", p->beats_per_bar);
176
-       pw_log_trace(" beat_type:        %f", p->beat_type);
177
-       pw_log_trace(" ticks_per_beat:   %f", p->ticks_per_beat);
178
-       pw_log_trace(" beats_per_minute: %f", p->beats_per_minute);
179
+       pw_log_trace_fp("BBT");
180
+       pw_log_trace_fp(" bar:              %u", p->bar);
181
+       pw_log_trace_fp(" beat:             %u", p->beat);
182
+       pw_log_trace_fp(" tick:             %u", p->tick);
183
+       pw_log_trace_fp(" bar_start_tick:   %f", p->bar_start_tick);
184
+       pw_log_trace_fp(" beats_per_bar:    %f", p->beats_per_bar);
185
+       pw_log_trace_fp(" beat_type:        %f", p->beat_type);
186
+       pw_log_trace_fp(" ticks_per_beat:   %f", p->ticks_per_beat);
187
+       pw_log_trace_fp(" beats_per_minute: %f", p->beats_per_minute);
188
    }
189
    if (p->valid & JackPositionTimecode) {
190
-       pw_log_trace("Timecode:");
191
-       pw_log_trace(" frame_time:       %f", p->frame_time);
192
-       pw_log_trace(" next_time:        %f", p->next_time);
193
+       pw_log_trace_fp("Timecode:");
194
+       pw_log_trace_fp(" frame_time:       %f", p->frame_time);
195
+       pw_log_trace_fp(" next_time:        %f", p->next_time);
196
    }
197
    if (p->valid & JackBBTFrameOffset) {
198
-       pw_log_trace("BBTFrameOffset:");
199
-       pw_log_trace(" bbt_offset:       %u", p->bbt_offset);
200
+       pw_log_trace_fp("BBTFrameOffset:");
201
pipewire-0.3.85.tar.gz/spa/include/spa/buffer/alloc.h -> pipewire-1.0.0.tar.gz/spa/include/spa/buffer/alloc.h Changed
11
 
1
@@ -300,7 +300,8 @@
2
 {
3
 
4
    struct spa_buffer **buffers;
5
-   struct spa_buffer_alloc_info info = { flags | SPA_BUFFER_ALLOC_FLAG_INLINE_ALL, };
6
+   struct spa_buffer_alloc_info info = { flags | SPA_BUFFER_ALLOC_FLAG_INLINE_ALL,
7
+                                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
8
    void *skel;
9
 
10
    spa_buffer_alloc_fill_info(&info, n_metas, metas, n_datas, datas, data_aligns);
11
pipewire-0.3.85.tar.gz/spa/include/spa/graph/graph.h -> pipewire-1.0.0.tar.gz/spa/include/spa/graph/graph.h Changed
19
 
1
@@ -215,7 +215,7 @@
2
 }
3
 
4
 
5
-static inline int spa_graph_node_impl_sub_process(void *data, struct spa_graph_node *node)
6
+static inline int spa_graph_node_impl_sub_process(void *data SPA_UNUSED, struct spa_graph_node *node)
7
 {
8
    struct spa_graph *graph = node->subgraph;
9
    spa_debug("node %p: sub process %p", node, graph);
10
@@ -322,7 +322,7 @@
11
         return state->status;
12
 }
13
 
14
-static inline int spa_graph_node_impl_reuse_buffer(void *data, struct spa_graph_node *node,
15
+static inline int spa_graph_node_impl_reuse_buffer(void *data, struct spa_graph_node *node SPA_UNUSED,
16
        uint32_t port_id, uint32_t buffer_id)
17
 {
18
    struct spa_node *n = (struct spa_node *)data;
19
pipewire-0.3.85.tar.gz/spa/include/spa/monitor/utils.h -> pipewire-1.0.0.tar.gz/spa/include/spa/monitor/utils.h Changed
23
 
1
@@ -22,8 +22,8 @@
2
    struct spa_result_device_params data;
3
 };
4
 
5
-static inline void spa_result_func_device_params(void *data, int seq, int res,
6
-       uint32_t type, const void *result)
7
+static inline void spa_result_func_device_params(void *data, int seq SPA_UNUSED, int res SPA_UNUSED,
8
+       uint32_t type SPA_UNUSED, const void *result)
9
 {
10
    struct spa_result_device_params_data *d =
11
        (struct spa_result_device_params_data *)data;
12
@@ -42,8 +42,8 @@
13
            struct spa_pod **param,
14
            struct spa_pod_builder *builder)
15
 {
16
-   struct spa_result_device_params_data data = { builder, };
17
-   struct spa_hook listener = {{0}};
18
+   struct spa_result_device_params_data data = { builder, {0}};
19
+   struct spa_hook listener = {{0}, {0}, 0, 0};
20
    static const struct spa_device_events device_events = {
21
        .version = SPA_VERSION_DEVICE_EVENTS,
22
        .info = NULL,
23
pipewire-0.3.85.tar.gz/spa/include/spa/node/utils.h -> pipewire-1.0.0.tar.gz/spa/include/spa/node/utils.h Changed
32
 
1
@@ -24,7 +24,7 @@
2
 };
3
 
4
 static inline void spa_result_func_node_params(void *data,
5
-       int seq, int res, uint32_t type, const void *result)
6
+       int seq SPA_UNUSED, int res SPA_UNUSED, uint32_t type SPA_UNUSED, const void *result)
7
 {
8
    struct spa_result_node_params_data *d =
9
        (struct spa_result_node_params_data *) data;
10
@@ -43,8 +43,8 @@
11
            struct spa_pod **param,
12
            struct spa_pod_builder *builder)
13
 {
14
-   struct spa_result_node_params_data data = { builder, };
15
-   struct spa_hook listener = {{0}};
16
+   struct spa_result_node_params_data data = { builder, {0}};
17
+   struct spa_hook listener = {{0}, {0}, 0, 0};
18
    static const struct spa_node_events node_events = {
19
        .version = SPA_VERSION_NODE_EVENTS,
20
        .info = NULL,
21
@@ -77,8 +77,8 @@
22
            struct spa_pod **param,
23
            struct spa_pod_builder *builder)
24
 {
25
-   struct spa_result_node_params_data data = { builder, };
26
-   struct spa_hook listener = {{0}};
27
+   struct spa_result_node_params_data data = { builder, {0}};
28
+   struct spa_hook listener = {{0}, {0}, 0, 0};
29
    static const struct spa_node_events node_events = {
30
        .version = SPA_VERSION_NODE_EVENTS,
31
        .info = NULL,
32
pipewire-0.3.85.tar.gz/spa/include/spa/pod/filter.h -> pipewire-1.0.0.tar.gz/spa/include/spa/pod/filter.h Changed
19
 
1
@@ -78,7 +78,7 @@
2
 }
3
 
4
 static inline int spa_pod_filter_flags_value(struct spa_pod_builder *b,
5
-       uint32_t type, const void *r1, const void *r2, uint32_t size)
6
+       uint32_t type, const void *r1, const void *r2, uint32_t size SPA_UNUSED)
7
 {
8
    switch (type) {
9
    case SPA_TYPE_Int:
10
@@ -104,7 +104,7 @@
11
 }
12
 
13
 static inline int spa_pod_filter_is_step_of(uint32_t type, const void *r1,
14
-       const void *r2, uint32_t size)
15
+       const void *r2, uint32_t size SPA_UNUSED)
16
 {
17
    switch (type) {
18
    case SPA_TYPE_Int:
19
pipewire-0.3.85.tar.gz/spa/include/spa/support/log-impl.h -> pipewire-1.0.0.tar.gz/spa/include/spa/support/log-impl.h Changed
19
 
1
@@ -19,7 +19,7 @@
2
  * \{
3
  */
4
 
5
-static inline SPA_PRINTF_FUNC(7, 0) void spa_log_impl_logtv(void *object,
6
+static inline SPA_PRINTF_FUNC(7, 0) void spa_log_impl_logtv(void *object SPA_UNUSED,
7
                     enum spa_log_level level,
8
                     const struct spa_log_topic *topic,
9
                     const char *file,
10
@@ -88,7 +88,7 @@
11
    va_end(args);
12
 }
13
 
14
-static inline void spa_log_impl_topic_init(void *object, struct spa_log_topic *topic)
15
+static inline void spa_log_impl_topic_init(void *object SPA_UNUSED, struct spa_log_topic *topic SPA_UNUSED)
16
 {
17
    /* noop */
18
 }
19
pipewire-0.3.85.tar.gz/spa/include/spa/utils/json.h -> pipewire-1.0.0.tar.gz/spa/include/spa/utils/json.h Changed
26
 
1
@@ -38,13 +38,13 @@
2
    uint32_t depth;
3
 };
4
 
5
-#define SPA_JSON_INIT(data,size) ((struct spa_json) { (data), (data)+(size), })
6
+#define SPA_JSON_INIT(data,size) ((struct spa_json) { (data), (data)+(size), 0, 0, 0 })
7
 
8
 static inline void spa_json_init(struct spa_json * iter, const char *data, size_t size)
9
 {
10
    *iter =  SPA_JSON_INIT(data, size);
11
 }
12
-#define SPA_JSON_ENTER(iter) ((struct spa_json) { (iter)->cur, (iter)->end, (iter), })
13
+#define SPA_JSON_ENTER(iter) ((struct spa_json) { (iter)->cur, (iter)->end, (iter), 0, 0 })
14
 
15
 static inline void spa_json_enter(struct spa_json * iter, struct spa_json * sub)
16
 {
17
@@ -181,7 +181,7 @@
18
    return len > 0 && (*val == '{'  || *val == '');
19
 }
20
 
21
-static inline int spa_json_container_len(struct spa_json *iter, const char *value, int len)
22
+static inline int spa_json_container_len(struct spa_json *iter, const char *value, int len SPA_UNUSED)
23
 {
24
    const char *val;
25
    struct spa_json sub;
26
pipewire-0.3.85.tar.gz/spa/plugins/alsa/alsa-pcm-sink.c -> pipewire-1.0.0.tar.gz/spa/plugins/alsa/alsa-pcm-sink.c Changed
14
 
1
@@ -873,7 +873,12 @@
2
 
3
    this->data_system = spa_support_find(support, n_support, SPA_TYPE_INTERFACE_DataSystem);
4
    this->data_loop = spa_support_find(support, n_support, SPA_TYPE_INTERFACE_DataLoop);
5
+   this->main_loop = spa_support_find(support, n_support, SPA_TYPE_INTERFACE_Loop);
6
 
7
+   if (this->main_loop == NULL) {
8
+       spa_log_error(this->log, "a main loop is needed");
9
+       return -EINVAL;
10
+   }
11
    if (this->data_loop == NULL) {
12
        spa_log_error(this->log, "a data loop is needed");
13
        return -EINVAL;
14
pipewire-0.3.85.tar.gz/spa/plugins/alsa/alsa-pcm-source.c -> pipewire-1.0.0.tar.gz/spa/plugins/alsa/alsa-pcm-source.c Changed
14
 
1
@@ -829,7 +829,12 @@
2
 
3
    this->data_system = spa_support_find(support, n_support, SPA_TYPE_INTERFACE_DataSystem);
4
    this->data_loop = spa_support_find(support, n_support, SPA_TYPE_INTERFACE_DataLoop);
5
+   this->main_loop = spa_support_find(support, n_support, SPA_TYPE_INTERFACE_Loop);
6
 
7
+   if (this->main_loop == NULL) {
8
+       spa_log_error(this->log, "a main loop is needed");
9
+       return -EINVAL;
10
+   }
11
    if (this->data_loop == NULL) {
12
        spa_log_error(this->log, "%p: a data loop is needed", this);
13
        return -EINVAL;
14
pipewire-0.3.85.tar.gz/spa/plugins/alsa/alsa-pcm.c -> pipewire-1.0.0.tar.gz/spa/plugins/alsa/alsa-pcm.c Changed
87
 
1
@@ -706,7 +706,7 @@
2
        state->ctl_sourcesi.fd = pfdsi.fd;
3
        state->ctl_sourcesi.mask = SPA_IO_IN;
4
        state->ctl_sourcesi.rmask = 0;
5
-       spa_loop_add_source(state->data_loop, &state->ctl_sourcesi);
6
+       spa_loop_add_source(state->main_loop, &state->ctl_sourcesi);
7
    }
8
 
9
    for (unsigned int i = 0; i < state->num_bind_ctls; i++) {
10
@@ -839,7 +839,7 @@
11
 
12
    if (state->ctl) {
13
        for (int i = 0; i < state->ctl_n_fds; i++) {
14
-           spa_loop_remove_source(state->data_loop, &state->ctl_sourcesi);
15
+           spa_loop_remove_source(state->main_loop, &state->ctl_sourcesi);
16
        }
17
 
18
        snd_ctl_close(state->ctl);
19
@@ -2531,6 +2531,15 @@
20
    return 0;
21
 }
22
 
23
+
24
+static uint64_t get_time_ns(struct state *state)
25
+{
26
+   struct timespec now;
27
+   if (spa_system_clock_gettime(state->data_system, CLOCK_MONOTONIC, &now) < 0)
28
+       return 0;
29
+   return SPA_TIMESPEC_TO_NSEC(&now);
30
+}
31
+
32
 static int update_time(struct state *state, uint64_t current_time, snd_pcm_sframes_t delay,
33
        snd_pcm_sframes_t target, bool follower)
34
 {
35
@@ -2538,8 +2547,15 @@
36
    int32_t diff;
37
 
38
    if (state->disable_tsched && !follower) {
39
-       err = (int64_t)(current_time - state->next_time);
40
-       err = err / 1e9 * state->rate;
41
+       uint64_t now = get_time_ns(state);
42
+
43
+       if (SPA_UNLIKELY(state->dll.bw == 0.0)) {
44
+           current_time = now;
45
+           err = 0.0;
46
+       } else {
47
+           err = (int64_t)(now - current_time);
48
+           err = err / 1e9 * state->rate;
49
+       }
50
    } else {
51
        if (state->stream == SND_PCM_STREAM_PLAYBACK)
52
            err = delay - target;
53
@@ -3166,14 +3182,6 @@
54
    return 0;
55
 }
56
 
57
-static uint64_t get_time_ns(struct state *state)
58
-{
59
-   struct timespec now;
60
-   if (spa_system_clock_gettime(state->data_system, CLOCK_MONOTONIC, &now) < 0)
61
-       return 0;
62
-   return SPA_TIMESPEC_TO_NSEC(&now);
63
-}
64
-
65
 static void alsa_wakeup_event(struct spa_source *source)
66
 {
67
    struct state *state = source->data, *follower;
68
@@ -3185,8 +3193,6 @@
69
        int err;
70
        unsigned short revents;
71
 
72
-       current_time = get_time_ns(state);
73
-
74
        for (int i = 0; i < state->n_fds; i++) {
75
            state->pfdsi.revents = state->sourcei.rmask;
76
            /* Reset so that we only handle all our sources' events once */
77
@@ -3222,8 +3228,8 @@
78
                return;
79
            }
80
        }
81
-       current_time = state->next_time;
82
    }
83
+   current_time = state->next_time;
84
 
85
    /* first do all the sync */
86
    if (state->stream == SND_PCM_STREAM_CAPTURE)
87
pipewire-0.3.85.tar.gz/spa/plugins/alsa/alsa-pcm.h -> pipewire-1.0.0.tar.gz/spa/plugins/alsa/alsa-pcm.h Changed
9
 
1
@@ -105,6 +105,7 @@
2
    struct spa_log *log;
3
    struct spa_system *data_system;
4
    struct spa_loop *data_loop;
5
+   struct spa_loop *main_loop;
6
 
7
    FILE *log_file;
8
    struct spa_ratelimit rate_limit;
9
pipewire-0.3.85.tar.gz/spa/plugins/bluez5/bap-codec-lc3.c -> pipewire-1.0.0.tar.gz/spa/plugins/bluez5/bap-codec-lc3.c Changed
201
 
1
@@ -14,6 +14,7 @@
2
 #include <spa/param/audio/format.h>
3
 #include <spa/param/audio/format-utils.h>
4
 #include <spa/utils/string.h>
5
+#include <spa/debug/log.h>
6
 
7
 #include <lc3.h>
8
 
9
@@ -22,6 +23,11 @@
10
 
11
 #define MAX_PACS   64
12
 
13
+static struct spa_log *log;
14
+static struct spa_log_topic log_topic = SPA_LOG_TOPIC(0, "spa.bluez5.codecs.lc3");
15
+#undef SPA_LOG_TOPIC_DEFAULT
16
+#define SPA_LOG_TOPIC_DEFAULT &log_topic
17
+
18
 struct impl {
19
    lc3_encoder_t encLC3_MAX_CHANNELS;
20
    lc3_decoder_t decLC3_MAX_CHANNELS;
21
@@ -38,6 +44,7 @@
22
 struct pac_data {
23
    const uint8_t *data;
24
    size_t size;
25
+   int index;
26
    uint32_t locations;
27
 };
28
 
29
@@ -126,7 +133,31 @@
30
    return data - caps;
31
 }
32
 
33
-static int parse_bluez_pacs(const uint8_t *data, size_t data_size, struct pac_data pacsMAX_PACS)
34
+static void debugc_ltv(struct spa_debug_context *debug_ctx, int pac, struct ltv *ltv)
35
+{
36
+   switch (ltv->len) {
37
+   case 0:
38
+       spa_debugc(debug_ctx, "PAC %d: --", pac);
39
+       break;
40
+   case 2:
41
+       spa_debugc(debug_ctx, "PAC %d: 0x%02x %x", pac, ltv->type, ltv->value0);
42
+       break;
43
+   case 3:
44
+       spa_debugc(debug_ctx, "PAC %d: 0x%02x %x %x", pac, ltv->type, ltv->value0, ltv->value1);
45
+       break;
46
+   case 5:
47
+       spa_debugc(debug_ctx, "PAC %d: 0x%02x %x %x %x %x", pac, ltv->type,
48
+               ltv->value0, ltv->value1, ltv->value2, ltv->value3);
49
+       break;
50
+   default:
51
+       spa_debugc(debug_ctx, "PAC %d: 0x%02x", pac, ltv->type);
52
+       spa_debugc_mem(debug_ctx, 7, ltv->value, ltv->len - 1);
53
+       break;
54
+   }
55
+}
56
+
57
+static int parse_bluez_pacs(const uint8_t *data, size_t data_size, struct pac_data pacsMAX_PACS,
58
+       struct spa_debug_context *debug_ctx)
59
 {
60
    /*
61
     * BlueZ capabilites for the same codec may contain multiple
62
@@ -145,10 +176,11 @@
63
                break;
64
 
65
            ++pac;
66
-           pacspac = (struct pac_data){ data + 1, 0 };
67
+           pacspac = (struct pac_data){ data + 1, 0, pac };
68
        } else if (ltv->len >= data_size) {
69
            return -EINVAL;
70
        } else {
71
+           debugc_ltv(debug_ctx, pac, ltv);
72
            pacspac.size += ltv->len + 1;
73
        }
74
        data_size -= ltv->len + 1;
75
@@ -172,13 +204,13 @@
76
    return num;
77
 }
78
 
79
-static int select_channels(uint8_t channels, uint32_t locations, uint32_t *mapping)
80
+static int select_channels(uint8_t channels, uint32_t locations, uint32_t *mapping, unsigned int max_channels)
81
 {
82
-   unsigned int i, num;
83
+   unsigned int i, num = 0;
84
 
85
-   if (channels & LC3_CHAN_2)
86
+   if ((channels & LC3_CHAN_2) && max_channels >= 2)
87
        num = 2;
88
-   else if (channels & LC3_CHAN_1)
89
+   else if ((channels & LC3_CHAN_1) && max_channels >= 1)
90
        num = 1;
91
    else
92
        return -1;
93
@@ -202,12 +234,13 @@
94
    return 0;
95
 }
96
 
97
-static bool select_config(bap_lc3_t *conf, const struct pac_data *pac)
98
+static bool select_config(bap_lc3_t *conf, const struct pac_data *pac, struct spa_debug_context *debug_ctx)
99
 {
100
    const uint8_t *data = pac->data;
101
    size_t data_size = pac->size;
102
    uint16_t framelen_min = 0, framelen_max = 0;
103
    int max_frames = -1;
104
+   uint8_t channels = 0;
105
 
106
    if (!data_size)
107
        return false;
108
@@ -221,8 +254,10 @@
109
    while (data_size > 0) {
110
        struct ltv *ltv = (struct ltv *)data;
111
 
112
-       if (ltv->len < sizeof(struct ltv) || ltv->len >= data_size)
113
+       if (ltv->len < sizeof(struct ltv) || ltv->len >= data_size) {
114
+           spa_debugc(debug_ctx, "invalid LTV data");
115
            return false;
116
+       }
117
 
118
        switch (ltv->type) {
119
        case LC3_TYPE_FREQ:
120
@@ -237,8 +272,10 @@
121
                    conf->rate = LC3_CONFIG_FREQ_16KHZ;
122
                else if (rate & LC3_FREQ_8KHZ)
123
                    conf->rate = LC3_CONFIG_FREQ_8KHZ;
124
-               else
125
+               else {
126
+                   spa_debugc(debug_ctx, "unsupported rate: 0x%04x", rate);
127
                    return false;
128
+               }
129
            }
130
            break;
131
        case LC3_TYPE_DUR:
132
@@ -249,17 +286,16 @@
133
                    conf->frame_duration = LC3_CONFIG_DURATION_10;
134
                else if (duration & LC3_DUR_7_5)
135
                    conf->frame_duration = LC3_CONFIG_DURATION_7_5;
136
-               else
137
+               else {
138
+                   spa_debugc(debug_ctx, "unsupported duration: 0x%02x", duration);
139
                    return false;
140
+               }
141
            }
142
            break;
143
        case LC3_TYPE_CHAN:
144
            spa_return_val_if_fail(ltv->len == 2, false);
145
            {
146
-               uint8_t channels = ltv->value0;
147
-
148
-               if (select_channels(channels, pac->locations, &conf->channels) < 0)
149
-                   return false;
150
+               channels = ltv->value0;
151
            }
152
            break;
153
        case LC3_TYPE_FRAMELEN:
154
@@ -272,22 +308,35 @@
155
            max_frames = ltv->value0;
156
            break;
157
        default:
158
-           return false;
159
+           spa_debugc(debug_ctx, "unknown LTV type: 0x%02x", ltv->type);
160
+           break;
161
        }
162
        data_size -= ltv->len + 1;
163
        data += ltv->len + 1;
164
    }
165
 
166
+   if (select_channels(channels, pac->locations, &conf->channels, max_frames) < 0) {
167
+       spa_debugc(debug_ctx, "invalid channel configuration: 0x%02x %u",
168
+               channels, max_frames);
169
+       return false;
170
+   }
171
+
172
    /* Default: 1 per channel (BAP v1.0.1 Sec 4.3.1) */
173
    if (max_frames < 0)
174
        max_frames = get_num_channels(conf->channels);
175
-   if (max_frames < get_num_channels(conf->channels))
176
+   if (max_frames < get_num_channels(conf->channels)) {
177
+       spa_debugc(debug_ctx, "invalid max frames per SDU: %u", max_frames);
178
        return false;
179
+   }
180
 
181
-   if (framelen_min < LC3_MIN_FRAME_BYTES || framelen_max > LC3_MAX_FRAME_BYTES)
182
+   if (framelen_min < LC3_MIN_FRAME_BYTES || framelen_max > LC3_MAX_FRAME_BYTES) {
183
+       spa_debugc(debug_ctx, "invalid framelen: %u %u", framelen_min, framelen_max);
184
        return false;
185
-   if (conf->frame_duration == 0xFF || !conf->rate)
186
+   }
187
+   if (conf->frame_duration == 0xFF || !conf->rate) {
188
+       spa_debugc(debug_ctx, "no frame duration or rate");
189
        return false;
190
+   }
191
 
192
    /* BAP v1.0.1 Table 5.2; high-reliability */
193
    switch (conf->rate) {
194
@@ -316,7 +365,8 @@
195
            conf->framelen = 30;    /* 8_2_2 */
196
        break;
197
    default:
198
-           return false;
199
+       spa_debugc(debug_ctx, "invalid rate");
200
+       return false;
201
pipewire-0.3.85.tar.gz/spa/plugins/bluez5/bluez5-dbus.c -> pipewire-1.0.0.tar.gz/spa/plugins/bluez5/bluez5-dbus.c Changed
22
 
1
@@ -876,7 +876,7 @@
2
    bool sink;
3
    const char *err_msg = "Unknown error";
4
    struct spa_dict settings;
5
-   struct spa_dict_item setting_itemsSPA_N_ELEMENTS(monitor->global_setting_items) + 1;
6
+   struct spa_dict_item setting_itemsSPA_N_ELEMENTS(monitor->global_setting_items) + 2;
7
    int i;
8
 
9
    const char *endpoint_path = NULL;
10
@@ -933,8 +933,9 @@
11
 
12
    for (i = 0; i < (int)monitor->global_settings.n_items; ++i)
13
        setting_itemsi = monitor->global_settings.itemsi;
14
-   setting_itemsi = SPA_DICT_ITEM_INIT("bluez5.bap.locations", locations);
15
-   settings = SPA_DICT_INIT(setting_items, monitor->global_settings.n_items + 1);
16
+   setting_itemsi++ = SPA_DICT_ITEM_INIT("bluez5.bap.locations", locations);
17
+   setting_itemsi++ = SPA_DICT_ITEM_INIT("bluez5.bap.debug", "true");
18
+   settings = SPA_DICT_INIT(setting_items, i);
19
 
20
    conf_size = codec->select_config(codec, 0, caps, caps_size, &monitor->default_audio_info, &settings, config);
21
    if (conf_size < 0) {
22
pipewire-0.3.85.tar.gz/spa/plugins/libcamera/libcamera-source.cpp -> pipewire-1.0.0.tar.gz/spa/plugins/libcamera/libcamera-source.cpp Changed
62
 
1
@@ -26,6 +26,7 @@
2
 #include <spa/node/keys.h>
3
 #include <spa/param/video/format-utils.h>
4
 #include <spa/param/param.h>
5
+#include <spa/param/latency-utils.h>
6
 #include <spa/control/control.h>
7
 #include <spa/pod/filter.h>
8
 
9
@@ -96,7 +97,8 @@
10
 #define PORT_IO        3
11
 #define PORT_Format    4
12
 #define PORT_Buffers   5
13
-#define N_PORT_PARAMS  6
14
+#define PORT_Latency   6
15
+#define N_PORT_PARAMS  7
16
    struct spa_param_info paramsN_PORT_PARAMS;
17
 
18
    uint32_t fmt_index = 0;
19
@@ -114,6 +116,7 @@
20
        paramsPORT_IO = SPA_PARAM_INFO(SPA_PARAM_IO, SPA_PARAM_INFO_READ);
21
        paramsPORT_Format = SPA_PARAM_INFO(SPA_PARAM_Format, SPA_PARAM_INFO_WRITE);
22
        paramsPORT_Buffers = SPA_PARAM_INFO(SPA_PARAM_Buffers, 0);
23
+       paramsPORT_Latency = SPA_PARAM_INFO(SPA_PARAM_Latency, SPA_PARAM_INFO_READ);
24
 
25
        info.flags = SPA_PORT_FLAG_LIVE | SPA_PORT_FLAG_PHYSICAL | SPA_PORT_FLAG_TERMINAL;
26
        info.params = params;
27
@@ -152,6 +155,8 @@
28
    struct spa_io_position *position = nullptr;
29
    struct spa_io_clock *clock = nullptr;
30
 
31
+   struct spa_latency_info latency2;
32
+
33
    std::shared_ptr<CameraManager> manager;
34
    std::shared_ptr<Camera> camera;
35
 
36
@@ -601,6 +606,15 @@
37
            return 0;
38
        }
39
        break;
40
+   case SPA_PARAM_Latency:
41
+       switch (result.index) {
42
+       case 0: case 1:
43
+           param = spa_latency_build(&b, id, &impl->latencyresult.index);
44
+           break;
45
+       default:
46
+           return 0;
47
+       }
48
+       break;
49
    default:
50
        return -ENOENT;
51
    }
52
@@ -961,6 +975,9 @@
53
    info.flags = SPA_NODE_FLAG_RT;
54
    info.params = params;
55
    info.n_params = N_NODE_PARAMS;
56
+
57
+   latencySPA_DIRECTION_INPUT = SPA_LATENCY_INFO(SPA_DIRECTION_INPUT);
58
+   latencySPA_DIRECTION_OUTPUT = SPA_LATENCY_INFO(SPA_DIRECTION_OUTPUT);
59
 }
60
 
61
 static size_t
62
pipewire-0.3.85.tar.gz/spa/plugins/support/evl-system.c -> pipewire-1.0.0.tar.gz/spa/plugins/support/evl-system.c Changed
181
 
1
@@ -11,6 +11,7 @@
2
 #include <fcntl.h>
3
 #include <sys/eventfd.h>
4
 #include <sys/signalfd.h>
5
+#include <pthread.h>
6
 
7
 #include <evl/evl.h>
8
 #include <evl/timer.h>
9
@@ -32,6 +33,7 @@
10
    int fd;
11
    uint32_t events;
12
    void *data;
13
+   unsigned attached:1;
14
 };
15
 
16
 struct impl {
17
@@ -45,6 +47,7 @@
18
 
19
    uint32_t n_xbuf;
20
    int attached;
21
+   pthread_t thread;
22
    int pid;
23
 };
24
 
25
@@ -110,6 +113,21 @@
26
    return retval;
27
 }
28
 
29
+static inline struct poll_entry *find_free(struct impl *impl)
30
+{
31
+   uint32_t i;
32
+   for (i = 0; i < impl->n_entries; i++) {
33
+       struct poll_entry *e = &impl->entriesi;
34
+       if (e->fd == -1)
35
+           return e;
36
+   }
37
+   if (impl->n_entries == MAX_POLL) {
38
+       errno = ENOSPC;
39
+       return NULL;
40
+   }
41
+   return &impl->entriesimpl->n_entries++;
42
+}
43
+
44
 static inline struct poll_entry *find_entry(struct impl *impl, int pfd, int fd)
45
 {
46
    uint32_t i;
47
@@ -121,20 +139,36 @@
48
    return NULL;
49
 }
50
 
51
+static int attach_entry(struct impl *impl, struct poll_entry *e)
52
+{
53
+   if (!e->attached && e->fd != -1) {
54
+       int res;
55
+
56
+       res = evl_add_pollfd(e->pfd, e->fd, e->events, evl_nil);
57
+       if (res < 0)
58
+           return res;
59
+
60
+       e->attached = true;
61
+   }
62
+   return 0;
63
+}
64
+
65
 static int impl_pollfd_add(void *object, int pfd, int fd, uint32_t events, void *data)
66
 {
67
    struct impl *impl = object;
68
    struct poll_entry *e;
69
+   int res = 0;
70
 
71
-   if (impl->n_entries == MAX_POLL)
72
-       return -ENOSPC;
73
+   if ((e = find_free(impl)) == NULL)
74
+       return -errno;
75
 
76
-   e = &impl->entriesimpl->n_entries++;
77
    e->pfd = pfd;
78
    e->fd = fd;
79
    e->events = events;
80
    e->data = data;
81
-   return evl_add_pollfd(pfd, fd, e->events, evl_nil);
82
+   if (impl->attached != 0)
83
+       attach_entry(impl, e);
84
+   return res;
85
 }
86
 
87
 static int impl_pollfd_mod(void *object, int pfd, int fd, uint32_t events, void *data)
88
@@ -162,6 +196,7 @@
89
 
90
    e->pfd = -1;
91
    e->fd = -1;
92
+   e->attached = false;
93
    return evl_del_pollfd(pfd, fd);
94
 }
95
 
96
@@ -178,6 +213,12 @@
97
        if (res < 0)
98
            return res;
99
        impl->attached = res;
100
+       impl->thread = pthread_self();
101
+
102
+       for (i = 0; i < (int)impl->n_entries; i++) {
103
+           struct poll_entry *e = &impl->entriesi;
104
+           attach_entry(impl, e);
105
+       }
106
    }
107
 
108
    if (timeout == -1) {
109
@@ -259,12 +300,14 @@
110
 {
111
    struct impl *impl = object;
112
    int res, fl;
113
+   struct evl_flags flg;
114
 
115
-   fl = EVL_CLONE_PRIVATE;
116
+   fl = EVL_CLONE_PUBLIC;
117
    if (flags & SPA_FD_NONBLOCK)
118
        fl |= EVL_CLONE_NONBLOCK;
119
 
120
-   res = evl_create_xbuf(1024, 1024, fl, "xbuf-%d-%p-%d", impl->pid, impl, impl->n_xbuf);
121
+   res = evl_create_flags(&flg, EVL_CLOCK_MONOTONIC, 0, fl,
122
+           "flags-%d-%p-%d", impl->pid, impl, impl->n_xbuf);
123
    if (res < 0)
124
        return res;
125
 
126
@@ -275,14 +318,35 @@
127
 
128
 static int impl_eventfd_write(void *object, int fd, uint64_t count)
129
 {
130
-   if (write(fd, &count, sizeof(uint64_t)) != sizeof(uint64_t))
131
-       return -errno;
132
-   return 0;
133
+   int res;
134
+   int flags = count;
135
+   struct impl *impl = object;
136
+   pthread_t tid = pthread_self();
137
+
138
+   if (impl->thread != tid)
139
+       res = write(fd, &flags, sizeof(flags));
140
+   else
141
+       res = oob_write(fd, &flags, sizeof(flags));
142
+
143
+   if (res != sizeof(flags))
144
+       res = -errno;
145
+   return res;
146
 }
147
 
148
 static int impl_eventfd_read(void *object, int fd, uint64_t *count)
149
 {
150
-   if (oob_read(fd, count, sizeof(uint64_t)) != sizeof(uint64_t))
151
+   int res;
152
+   int flags;
153
+   struct impl *impl = object;
154
+   pthread_t tid = pthread_self();
155
+
156
+   if (impl->thread != tid)
157
+       res = read(fd, &flags, sizeof(flags));
158
+   else
159
+       res = oob_read(fd, &flags, sizeof(flags));
160
+
161
+   *count = flags;
162
+   if (res != sizeof(flags))
163
        return -errno;
164
    return 0;
165
 }
166
@@ -400,12 +464,12 @@
167
 
168
    impl->pid = getpid();
169
 
170
-   if ((res = evl_attach_self("evl-system-%d-%p", impl->pid, impl)) < 0) {
171
+   if ((res = evl_init()) < 0) {
172
        spa_log_error(impl->log, NAME " %p: init failed: %s", impl, spa_strerror(res));
173
        return res;
174
    }
175
 
176
-   spa_log_debug(impl->log, NAME " %p: initialized", impl);
177
+   spa_log_info(impl->log, NAME " %p: initialized", impl);
178
 
179
    return 0;
180
 }
181
pipewire-0.3.85.tar.gz/src/daemon/meson.build -> pipewire-1.0.0.tar.gz/src/daemon/meson.build Changed
20
 
1
@@ -2,10 +2,6 @@
2
   'pipewire.c',
3
 
4
 
5
-pipewire_c_args = 
6
-  '-DG_LOG_DOMAIN=g_log_domain_pipewire',
7
-
8
-
9
 conf_config = configuration_data()
10
 conf_config.set('VERSION', '"@0@"'.format(pipewire_version))
11
 conf_config.set('PIPEWIRE_CONFIG_DIR', pipewire_configdir)
12
@@ -106,7 +102,6 @@
13
 pipewire_exec = executable('pipewire',
14
   pipewire_daemon_sources,
15
   install: true,
16
-  c_args : pipewire_c_args,
17
   include_directories :  configinc ,
18
   dependencies :  spa_dep, pipewire_dep, ,
19
 )
20
pipewire-0.3.85.tar.gz/src/examples/audio-capture.c -> pipewire-1.0.0.tar.gz/src/examples/audio-capture.c Changed
9
 
1
@@ -143,6 +143,7 @@
2
     * the data.
3
     */
4
    props = pw_properties_new(PW_KEY_MEDIA_TYPE, "Audio",
5
+           PW_KEY_CONFIG_NAME, "client-rt.conf",
6
            PW_KEY_MEDIA_CATEGORY, "Capture",
7
            PW_KEY_MEDIA_ROLE, "Music",
8
            NULL);
9
pipewire-0.3.85.tar.gz/src/modules/meson.build -> pipewire-1.0.0.tar.gz/src/modules/meson.build Changed
10
 
1
@@ -624,7 +624,7 @@
2
 endif
3
 summary({'raop-sink (requires OpenSSL)': build_module_raop}, bool_yn: true, section: 'Optional Modules')
4
 
5
-roc_dep = dependency('roc', required: get_option('roc'))
6
+roc_dep = dependency('roc', version: '>= 0.3.0', required: get_option('roc'))
7
 summary({'ROC': roc_dep.found()}, bool_yn: true, section: 'Streaming between daemons')
8
 
9
 pipewire_module_rtp_source = shared_library('pipewire-module-rtp-source',
10
pipewire-0.3.85.tar.gz/src/modules/module-access.c -> pipewire-1.0.0.tar.gz/src/modules/module-access.c Changed
21
 
1
@@ -29,7 +29,7 @@
2
 
3
 #include "flatpak-utils.h"
4
 
5
-/** \page page_module_access PipeWire Module: Access
6
+/** \page page_module_access Access
7
  *
8
  *
9
  * The `access` module performs access checks on clients. The access check
10
@@ -63,6 +63,10 @@
11
  * `pipewire.access.portal.app_id` property is to the Flatpak application ID, if
12
  * found. In addition, `pipewire.sec.flatpak` is set to `true`.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-access`
17
+ *
18
  * ## Module Options
19
  *
20
  * Options specific to the behavior of this module
21
pipewire-0.3.85.tar.gz/src/modules/module-adapter.c -> pipewire-1.0.0.tar.gz/src/modules/module-adapter.c Changed
14
 
1
@@ -18,7 +18,11 @@
2
 #include "modules/spa/spa-node.h"
3
 #include "module-adapter/adapter.h"
4
 
5
-/** \page page_module_adapter PipeWire Module: Adapter
6
+/** \page page_module_adapter Adapter
7
+ *
8
+ * ## Module Name
9
+ *
10
+ * `libpipewire-module-adapter`
11
  */
12
 #define NAME "adapter"
13
 
14
pipewire-0.3.85.tar.gz/src/modules/module-avb.c -> pipewire-1.0.0.tar.gz/src/modules/module-avb.c Changed
14
 
1
@@ -21,7 +21,11 @@
2
 
3
 #include "module-avb/avb.h"
4
 
5
-/** \page page_module_avb PipeWire Module: AVB
6
+/** \page page_module_avb AVB
7
+ *
8
+ * ## Module Name
9
+ *
10
+ * `libpipewire-module-avb`
11
  */
12
 
13
 #define NAME "avb"
14
pipewire-0.3.85.tar.gz/src/modules/module-client-device.c -> pipewire-1.0.0.tar.gz/src/modules/module-client-device.c Changed
14
 
1
@@ -15,7 +15,11 @@
2
 
3
 #include "module-client-device/client-device.h"
4
 
5
-/** \page page_module_client_device PipeWire Module: Client Device
6
+/** \page page_module_client_device Client Device
7
+ *
8
+ * ## Module Name
9
+ *
10
+ * `libpipewire-module-client-device`
11
  */
12
 
13
 #define NAME "client-device"
14
pipewire-0.3.85.tar.gz/src/modules/module-client-node.c -> pipewire-1.0.0.tar.gz/src/modules/module-client-node.c Changed
14
 
1
@@ -16,7 +16,11 @@
2
 #include "module-client-node/v0/client-node.h"
3
 #include "module-client-node/client-node.h"
4
 
5
-/** \page page_module_client_node PipeWire Module: Client Node
6
+/** \page page_module_client_node Client Node
7
+ *
8
+ * ## Module Name
9
+ *
10
+ * `libpipewire-module-client-node`
11
  */
12
 
13
 #define NAME "client-node"
14
pipewire-0.3.85.tar.gz/src/modules/module-client-node/client-node.c -> pipewire-1.0.0.tar.gz/src/modules/module-client-node/client-node.c Changed
201
 
1
@@ -49,7 +49,6 @@
2
 };
3
 
4
 struct mix {
5
-   unsigned int valid:1;
6
    uint32_t mix_id;
7
    struct port *port;
8
    uint32_t peer_id;
9
@@ -79,7 +78,7 @@
10
    unsigned int removed:1;
11
    unsigned int destroyed:1;
12
 
13
-   struct pw_array mix;
14
+   struct pw_map mix;
15
 };
16
 
17
 struct impl {
18
@@ -191,42 +190,62 @@
19
 
20
 static struct mix *find_mix(struct port *p, uint32_t mix_id)
21
 {
22
-   struct mix *mix;
23
+   if (mix_id == SPA_ID_INVALID)
24
+       mix_id = 0;
25
+   else
26
+       mix_id++;
27
+
28
+   return pw_map_lookup(&p->mix, mix_id);
29
+}
30
+
31
+static struct mix *create_mix(struct port *p, uint32_t mix_id)
32
+{
33
+   struct mix *mix = NULL;
34
    size_t len;
35
+   int res;
36
 
37
    if (mix_id == SPA_ID_INVALID)
38
        mix_id = 0;
39
    else
40
        mix_id++;
41
 
42
-   len = pw_array_get_len(&p->mix, struct mix);
43
-   if (mix_id >= len) {
44
-       size_t need = sizeof(struct mix) * (mix_id + 1 - len);
45
-       void *ptr = pw_array_add(&p->mix, need);
46
-       if (ptr == NULL)
47
-           return NULL;
48
-       memset(ptr, 0, need);
49
+   if (pw_map_lookup(&p->mix, mix_id) != NULL) {
50
+       errno = EEXIST;
51
+       return NULL;
52
    }
53
-   mix = pw_array_get_unchecked(&p->mix, mix_id, struct mix);
54
-   return mix;
55
-}
56
 
57
-static void mix_init(struct mix *mix, struct port *p, uint32_t mix_id)
58
-{
59
-   mix->valid = true;
60
+   /* pad map size */
61
+   for (len = pw_map_get_size(&p->mix); len < mix_id; ++len)
62
+       if ((res = pw_map_insert_at(&p->mix, len, NULL)) < 0)
63
+           goto fail;
64
+
65
+   mix = calloc(1, sizeof(struct mix));
66
+   if (mix == NULL)
67
+       return NULL;
68
+   if ((res = pw_map_insert_at(&p->mix, mix_id, mix)) < 0)
69
+       goto fail;
70
+
71
    mix->mix_id = mix_id;
72
    mix->port = p;
73
    mix->n_buffers = 0;
74
+   return mix;
75
+
76
+fail:
77
+   free(mix);
78
+   errno = -res;
79
+   return NULL;
80
 }
81
 
82
-static struct mix *create_mix(struct impl *impl, struct port *p, uint32_t mix_id)
83
+static void free_mix(struct port *p, struct mix *mix)
84
 {
85
-   struct mix *mix;
86
+   if (mix == NULL)
87
+       return;
88
 
89
-   if ((mix = find_mix(p, mix_id)) == NULL || mix->valid)
90
-       return NULL;
91
-   mix_init(mix, p, mix_id);
92
-   return mix;
93
+   /* never realloc so it's safe to call from pw_map_foreach */
94
+   if (mix->mix_id < pw_map_get_size(&p->mix))
95
+       pw_map_insert_at(&p->mix, mix->mix_id, NULL);
96
+
97
+   free(mix);
98
 }
99
 
100
 static void clear_data(struct impl *impl, struct spa_data *d)
101
@@ -255,19 +274,21 @@
102
    }
103
 }
104
 
105
-static int clear_buffers(struct impl *impl, struct mix *mix)
106
+static void clear_buffer(struct impl *impl, struct spa_buffer *b)
107
 {
108
-   uint32_t i, j;
109
+   uint32_t i;
110
+   for (i = 0; i < b->n_datas; i++)
111
+       clear_data(impl, &b->datasi);
112
+}
113
 
114
+static int clear_buffers(struct impl *impl, struct mix *mix)
115
+{
116
+   uint32_t i;
117
    for (i = 0; i < mix->n_buffers; i++) {
118
        struct buffer *b = &mix->buffersi;
119
 
120
        spa_log_debug(impl->log, "%p: clear buffer %d", impl, i);
121
-
122
-       for (j = 0; j < b->buffer.n_datas; j++) {
123
-           struct spa_data *d = &b->datasj;
124
-           clear_data(impl, d);
125
-       }
126
+       clear_buffer(impl, &b->buffer);
127
        pw_memblock_unref(b->mem);
128
    }
129
    mix->n_buffers = 0;
130
@@ -278,11 +299,10 @@
131
 {
132
    struct port *port = mix->port;
133
 
134
-   if (!mix->valid)
135
-       return;
136
    do_port_use_buffers(impl, port->direction, port->id,
137
            mix->mix_id, 0, NULL, 0);
138
-   mix->valid = false;
139
+
140
+   free_mix(port, mix);
141
 }
142
 
143
 static int impl_node_enum_params(void *object, int seq,
144
@@ -496,21 +516,25 @@
145
    }
146
 }
147
 
148
+static int mix_clear_cb(void *item, void *data)
149
+{
150
+   if (item)
151
+       mix_clear(data, item);
152
+   return 0;
153
+}
154
+
155
 static void
156
 clear_port(struct impl *impl, struct port *port)
157
 {
158
-   struct mix *mix;
159
-
160
    spa_log_debug(impl->log, "%p: clear port %p", impl, port);
161
 
162
    do_update_port(impl, port,
163
               PW_CLIENT_NODE_PORT_UPDATE_PARAMS |
164
               PW_CLIENT_NODE_PORT_UPDATE_INFO, 0, NULL, NULL);
165
 
166
-   pw_array_for_each(mix, &port->mix)
167
-       mix_clear(impl, mix);
168
-   pw_array_clear(&port->mix);
169
-   pw_array_init(&port->mix, sizeof(struct mix) * 2);
170
+   pw_map_for_each(&port->mix, mix_clear_cb, impl);
171
+   pw_map_clear(&port->mix);
172
+   pw_map_init(&port->mix, 0, 2);
173
 
174
    pw_map_insert_at(&impl->portsport->direction, port->id, NULL);
175
 
176
@@ -604,6 +628,13 @@
177
    return found ? 0 : -ENOENT;
178
 }
179
 
180
+static int clear_buffers_cb(void *item, void *data)
181
+{
182
+   if (item)
183
+       clear_buffers(data, item);
184
+   return 0;
185
+}
186
+
187
 static int
188
 impl_node_port_set_param(void *object,
189
             enum spa_direction direction, uint32_t port_id,
190
@@ -612,7 +643,6 @@
191
 {
192
    struct impl *impl = object;
193
    struct port *port;
194
-   struct mix *mix;
195
 
196
    spa_return_val_if_fail(impl != NULL, -EINVAL);
197
 
198
@@ -624,10 +654,9 @@
199
            direction, port_id,
200
            spa_debug_type_find_name(spa_type_param, id), id);
201
pipewire-0.3.85.tar.gz/src/modules/module-combine-stream.c -> pipewire-1.0.0.tar.gz/src/modules/module-combine-stream.c Changed
21
 
1
@@ -29,7 +29,7 @@
2
 #include <pipewire/impl.h>
3
 #include <pipewire/i18n.h>
4
 
5
-/** \page page_module_combine_stream PipeWire Module: Combine Stream
6
+/** \page page_module_combine_stream Combine Stream
7
  *
8
  * The combine stream can make:
9
  *
10
@@ -40,6 +40,10 @@
11
  * rules. This makes it possible to combine static nodes or nodes based on certain
12
  * properties.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-combine-stream`
17
+ *
18
  * ## Module Options
19
  *
20
  * - `node.name`: a unique name for the stream
21
pipewire-0.3.85.tar.gz/src/modules/module-echo-cancel.c -> pipewire-1.0.0.tar.gz/src/modules/module-echo-cancel.c Changed
21
 
1
@@ -40,7 +40,7 @@
2
 
3
 #include <pipewire/extensions/profiler.h>
4
 
5
-/** \page page_module_echo_cancel PipeWire Module: Echo Cancel
6
+/** \page page_module_echo_cancel Echo Cancel
7
  *
8
  * The `echo-cancel` module performs echo cancellation. The module creates
9
  * virtual `echo-cancel-capture` source and `echo-cancel-playback` sink
10
@@ -80,6 +80,10 @@
11
  *   This data then goes into the application (the conference application) and
12
  *   does not contain the echo from the other participants anymore.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-echo-cancel`
17
+ *
18
  * ## Module Options
19
  *
20
  * Options specific to the behavior of this module
21
pipewire-0.3.85.tar.gz/src/modules/module-example-filter.c -> pipewire-1.0.0.tar.gz/src/modules/module-example-filter.c Changed
18
 
1
@@ -22,11 +22,15 @@
2
 #include <pipewire/impl.h>
3
 #include <pipewire/extensions/profiler.h>
4
 
5
-/** \page page_module_example_filter PipeWire Module: Example Filter
6
+/** \page page_module_example_filter Example Filter
7
  *
8
  * The example filter is a good starting point for writing a custom
9
  * filter. We refer to the source code for more information.
10
  *
11
+ * ## Module Name
12
+ *
13
+ * `libpipewire-module-example-filter`
14
+ *
15
  * ## Module Options
16
  *
17
  * - `node.description`: a human readable name for the filter streams
18
pipewire-0.3.85.tar.gz/src/modules/module-example-sink.c -> pipewire-1.0.0.tar.gz/src/modules/module-example-sink.c Changed
18
 
1
@@ -28,11 +28,15 @@
2
 #include <pipewire/impl.h>
3
 #include <pipewire/i18n.h>
4
 
5
-/** \page page_module_example_sink PipeWire Module: Example Sink
6
+/** \page page_module_example_sink Example Sink
7
  *
8
  * The example sink is a good starting point for writing a custom
9
  * sink. We refer to the source code for more information.
10
  *
11
+ * ## Module Name
12
+ *
13
+ * `libpipewire-module-example-sink`
14
+ *
15
  * ## Module Options
16
  *
17
  * - `node.name`: a unique name for the stream
18
pipewire-0.3.85.tar.gz/src/modules/module-example-source.c -> pipewire-1.0.0.tar.gz/src/modules/module-example-source.c Changed
18
 
1
@@ -28,11 +28,15 @@
2
 #include <pipewire/impl.h>
3
 #include <pipewire/i18n.h>
4
 
5
-/** \page page_module_example_source PipeWire Module: Example Source
6
+/** \page page_module_example_source Example Source
7
  *
8
  * The example source is a good starting point for writing a custom
9
  * source. We refer to the source code for more information.
10
  *
11
+ * ## Module Name
12
+ *
13
+ * `libpipewire-module-example-source`
14
+ *
15
  * ## Module Options
16
  *
17
  * - `node.name`: a unique name for the stream
18
pipewire-0.3.85.tar.gz/src/modules/module-fallback-sink.c -> pipewire-1.0.0.tar.gz/src/modules/module-fallback-sink.c Changed
22
 
1
@@ -19,10 +19,19 @@
2
 #include <pipewire/impl.h>
3
 #include <pipewire/i18n.h>
4
 
5
-/** \page page_module_fallback_sink PipeWire Module: Fallback Sink
6
+/** \page page_module_fallback_sink Fallback Sink
7
  *
8
  * Fallback sink, which appear dynamically when no other sinks are
9
  * present. This is only useful for Pulseaudio compatibility.
10
+ *
11
+ * ## Module Name
12
+ *
13
+ * `libpipewire-module-fallback-sink`
14
+ *
15
+ * ## Module Options
16
+ *
17
+ * - `sink.name`: sink name
18
+ * - `sink.description`: sink description
19
  */
20
 
21
 #define NAME "fallback-sink"
22
pipewire-0.3.85.tar.gz/src/modules/module-ffado-driver.c -> pipewire-1.0.0.tar.gz/src/modules/module-ffado-driver.c Changed
18
 
1
@@ -31,11 +31,15 @@
2
 
3
 #include <libffado/ffado.h>
4
 
5
-/** \page page_module_ffado_driver PipeWire Module: FFADO firewire audio driver
6
+/** \page page_module_ffado_driver FFADO firewire audio driver
7
  *
8
  * The ffado-driver module provides a source or sink using the libffado library for
9
  * reading and writing to firewire audio devices.
10
  *
11
+ * ## Module Name
12
+ *
13
+ * `libpipewire-module-ffado-driver`
14
+ *
15
  * ## Module Options
16
  *
17
  * - `driver.mode`: the driver mode, sink|source|duplex, default duplex
18
pipewire-0.3.85.tar.gz/src/modules/module-filter-chain.c -> pipewire-1.0.0.tar.gz/src/modules/module-filter-chain.c Changed
50
 
1
@@ -34,7 +34,7 @@
2
 #define PW_LOG_TOPIC_DEFAULT mod_topic
3
 
4
 /**
5
- * \page page_module_filter_chain PipeWire Module: Filter-Chain
6
+ * \page page_module_filter_chain Filter-Chain
7
  *
8
  * The filter-chain allows you to create an arbitrary processing graph
9
  * from LADSPA, LV2 and builtin filters. This filter can be made into a
10
@@ -48,6 +48,10 @@
11
  * manager can manage the configuration and connection with the sinks and
12
  * sources automatically.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-filter-chain`
17
+ *
18
  * ## Module Options
19
  *
20
  * - `node.description`: a human readable name for the filter chain
21
@@ -2854,6 +2858,9 @@
22
    graph_free(&impl->graph);
23
    spa_list_consume(pl, &impl->plugin_func_list, link)
24
        free_plugin_func(pl);
25
+
26
+   free(impl->silence_data);
27
+   free(impl->discard_data);
28
    free(impl);
29
 }
30
 
31
@@ -2974,8 +2981,18 @@
32
    impl->quantum_limit = pw_properties_get_uint32(
33
            pw_context_get_properties(impl->context),
34
            "default.clock.quantum-limit", 8192u);
35
+
36
    impl->silence_data = calloc(impl->quantum_limit, sizeof(float));
37
+   if (impl->silence_data == NULL) {
38
+       res = -errno;
39
+       goto error;
40
+   }
41
+
42
    impl->discard_data = calloc(impl->quantum_limit, sizeof(float));
43
+   if (impl->discard_data == NULL) {
44
+       res = -errno;
45
+       goto error;
46
+   }
47
 
48
    cpu_iface = spa_support_find(support, n_support, SPA_TYPE_INTERFACE_CPU);
49
    impl->dsp.cpu_flags = cpu_iface ? spa_cpu_get_flags(cpu_iface) : 0;
50
pipewire-0.3.85.tar.gz/src/modules/module-jack-tunnel.c -> pipewire-1.0.0.tar.gz/src/modules/module-jack-tunnel.c Changed
21
 
1
@@ -30,7 +30,7 @@
2
 
3
 #include "module-jack-tunnel/weakjack.h"
4
 
5
-/** \page page_module_jack_tunnel PipeWire Module: JACK Tunnel
6
+/** \page page_module_jack_tunnel JACK Tunnel
7
  *
8
  * The jack-tunnel module provides a source or sink that tunnels all audio to
9
  * a JACK server.
10
@@ -39,6 +39,10 @@
11
  * automatically load the tunnel with the right parameters based on dbus
12
  * information.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-jack-tunnel`
17
+ *
18
  * ## Module Options
19
  *
20
  * - `jack.library`: the libjack to load, by default libjack.so.0 is searched in
21
pipewire-0.3.85.tar.gz/src/modules/module-jackdbus-detect.c -> pipewire-1.0.0.tar.gz/src/modules/module-jackdbus-detect.c Changed
18
 
1
@@ -25,11 +25,15 @@
2
 #include "pipewire/module.h"
3
 #include "pipewire/utils.h"
4
 
5
-/** \page page_module_jackdbus_detect PipeWire Module: JACK DBus detect
6
+/** \page page_module_jackdbus_detect JACK DBus detect
7
  *
8
  * Automaticall creates a sink/source when a jackdbus server is started
9
  * and connect to JACK.
10
  *
11
+ * ## Module Name
12
+ *
13
+ * `libpipewire-module-jackdbus-detect`
14
+ *
15
  * ## Module Options
16
  *
17
  * There are no module-specific options, all arguments are passed to
18
pipewire-0.3.85.tar.gz/src/modules/module-link-factory.c -> pipewire-1.0.0.tar.gz/src/modules/module-link-factory.c Changed
14
 
1
@@ -14,7 +14,11 @@
2
 
3
 #include <pipewire/impl.h>
4
 
5
-/** \page page_module_link_factory PipeWire Module: Link Factory
6
+/** \page page_module_link_factory Link Factory
7
+ *
8
+ * ## Module Name
9
+ *
10
+ * `libpipewire-module-link-factory`
11
  */
12
 
13
 #define NAME "link-factory"
14
pipewire-0.3.85.tar.gz/src/modules/module-loopback.c -> pipewire-1.0.0.tar.gz/src/modules/module-loopback.c Changed
21
 
1
@@ -22,7 +22,7 @@
2
 #include <pipewire/impl.h>
3
 #include <pipewire/extensions/profiler.h>
4
 
5
-/** \page page_module_loopback PipeWire Module: Loopback
6
+/** \page page_module_loopback Loopback
7
  *
8
  * The loopback module passes the output of a capture stream unmodified to a playback stream.
9
  * It can be used to construct a link between a source and sink but also to
10
@@ -31,6 +31,10 @@
11
  * Because both ends of the loopback are built with streams, the session manager can
12
  * manage the configuration and connection with the sinks and sources.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-loopback`
17
+ *
18
  * ## Module Options
19
  *
20
  * - `node.description`: a human readable name for the loopback streams
21
pipewire-0.3.85.tar.gz/src/modules/module-metadata.c -> pipewire-1.0.0.tar.gz/src/modules/module-metadata.c Changed
14
 
1
@@ -15,7 +15,11 @@
2
 #include <pipewire/impl.h>
3
 #include <pipewire/extensions/metadata.h>
4
 
5
-/** \page page_module_metadata PipeWire Module: Metadata
6
+/** \page page_module_metadata Metadata
7
+ *
8
+ * ## Module Name
9
+ *
10
+ * `libpipewire-module-metadata`
11
  */
12
 
13
 #define NAME "metadata"
14
pipewire-0.3.85.tar.gz/src/modules/module-netjack2-driver.c -> pipewire-1.0.0.tar.gz/src/modules/module-netjack2-driver.c Changed
18
 
1
@@ -40,10 +40,14 @@
2
 #define IPTOS_DSCP(x) ((x) & IPTOS_DSCP_MASK)
3
 #endif
4
 
5
-/** \page page_module_netjack2_driver PipeWire Module: Netjack2 driver
6
+/** \page page_module_netjack2_driver Netjack2 driver
7
  *
8
  * The netjack2-driver module provides a source or sink that is following a
9
- * netjack2 driver.
10
+ * netjack2 manager.
11
+ *
12
+ * ## Module Name
13
+ *
14
+ * `libpipewire-module-netjack2-driver`
15
  *
16
  * ## Module Options
17
  *
18
pipewire-0.3.85.tar.gz/src/modules/module-netjack2-manager.c -> pipewire-1.0.0.tar.gz/src/modules/module-netjack2-manager.c Changed
18
 
1
@@ -42,11 +42,15 @@
2
 #define IPTOS_DSCP(x) ((x) & IPTOS_DSCP_MASK)
3
 #endif
4
 
5
-/** \page page_module_netjack2_manager PipeWire Module: Netjack2 manager
6
+/** \page page_module_netjack2_manager Netjack2 manager
7
  *
8
  * The netjack2 manager module listens for new netjack2 driver messages and will
9
  * start a communication channel with them.
10
  *
11
+ * ## Module Name
12
+ *
13
+ * `libpipewire-module-netjack2-manager`
14
+ *
15
  * ## Module Options
16
  *
17
  * - `local.ifname = <str>`: interface name to use
18
pipewire-0.3.85.tar.gz/src/modules/module-pipe-tunnel.c -> pipewire-1.0.0.tar.gz/src/modules/module-pipe-tunnel.c Changed
18
 
1
@@ -32,11 +32,15 @@
2
 #include <pipewire/impl.h>
3
 #include <pipewire/i18n.h>
4
 
5
-/** \page page_module_pipe_tunnel PipeWire Module: Unix Pipe Tunnel
6
+/** \page page_module_pipe_tunnel Unix Pipe Tunnel
7
  *
8
  * The pipe-tunnel module provides a source or sink that tunnels all audio to
9
  * or from a unix pipe respectively.
10
  *
11
+ * ## Module Name
12
+ *
13
+ * `libpipewire-module-pipe-tunnel`
14
+ *
15
  * ## Module Options
16
  *
17
  * - `tunnel.mode`: the desired tunnel to create. (Default `playback`)
18
pipewire-0.3.85.tar.gz/src/modules/module-portal.c -> pipewire-1.0.0.tar.gz/src/modules/module-portal.c Changed
21
 
1
@@ -25,7 +25,7 @@
2
 #include "pipewire/module.h"
3
 #include "pipewire/utils.h"
4
 
5
-/** \page page_module_portal PipeWire Module: Portal
6
+/** \page page_module_portal Portal
7
  *
8
  * The `portal` module performs access control management for clients started
9
  * inside an XDG portal.
10
@@ -42,6 +42,10 @@
11
  *
12
  * Clients connecting from other PIDs are ignored by this module.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-portal`
17
+ *
18
  * ## Module Options
19
  *
20
  * There are no module-specific options.
21
pipewire-0.3.85.tar.gz/src/modules/module-profiler.c -> pipewire-1.0.0.tar.gz/src/modules/module-profiler.c Changed
21
 
1
@@ -22,7 +22,7 @@
2
 #include <pipewire/impl.h>
3
 #include <pipewire/extensions/profiler.h>
4
 
5
-/** \page page_module_profiler PipeWire Module: Profiler
6
+/** \page page_module_profiler Profiler
7
  *
8
  * The profiler module provides a Profiler interface for applications that
9
  * can be used to receive profiling information.
10
@@ -30,6 +30,10 @@
11
  * Use tools like pw-top and pw-profiler to collect profiling information
12
  * about the pipewire graph.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-profiler`
17
+ *
18
  * ## Example configuration
19
  *
20
  * The module has no arguments and is usually added to the config file of
21
pipewire-0.3.85.tar.gz/src/modules/module-protocol-native.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-native.c Changed
21
 
1
@@ -63,7 +63,7 @@
2
 #include <spa/debug/pod.h>
3
 #include <spa/debug/types.h>
4
 
5
-/** \page page_module_protocol_native PipeWire Module: Protocol Native
6
+/** \page page_module_protocol_native Protocol Native
7
  *
8
  * The native protocol module implements the PipeWire communication between
9
  * a client and a server using unix local sockets.
10
@@ -71,6 +71,10 @@
11
  * Normally this module is loaded in both client and server config files
12
  * so that they cam communicate.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-protocol-native`
17
+ *
18
  * ## Module Options
19
  *
20
  * The module supports the following arguments:
21
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse.c Changed
30
 
1
@@ -18,7 +18,7 @@
2
 
3
 #include "module-protocol-pulse/pulse-server.h"
4
 
5
-/** \page page_module_protocol_pulse PipeWire Module: Protocol Pulse
6
+/** \page page_module_protocol_pulse Protocol Pulse
7
  *
8
  * This module implements a complete PulseAudio server on top of
9
  * PipeWire.  This is only the server implementation, client are expected
10
@@ -33,6 +33,10 @@
11
  * The pulse server implements a sample cache that is otherwise not
12
  * available in PipeWire.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-protocol-pulse`
17
+ *
18
  * ## Module Options
19
  *
20
  * The module arguments can be the contents of the pulse.properties but
21
@@ -86,7 +90,7 @@
22
  *\endcode
23
  *
24
  * The addresses the server listens on when starting. Uncomment the `tcp:4713` entry to also
25
- * make the server listen on a tcp socket. This is equivalent to loading `module-native-protocol-tcp`.
26
+ * make the server listen on a tcp socket. This is equivalent to loading `libpipewire-module-native-protocol-tcp`.
27
  *
28
  * There is also a slightly more verbose syntax with more options:
29
  *
30
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/collect.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/collect.c Changed
54
 
1
@@ -65,7 +65,7 @@
2
    return SPA_ID_INVALID;
3
 }
4
 
5
-bool collect_is_linked(struct pw_manager *m, uint32_t id, enum pw_direction direction)
6
+static bool collect_is_linked(struct pw_manager *m, uint32_t id, enum pw_direction direction)
7
 {
8
    struct pw_manager_object *o;
9
    uint32_t in_node, out_node;
10
@@ -291,7 +291,7 @@
11
 }
12
 
13
 static void update_device_info(struct pw_manager *manager, struct pw_manager_object *o,
14
-       enum pw_direction direction, bool monitor, struct defs *defs)
15
+       enum pw_direction direction, bool monitor, struct defs *defs, bool stream)
16
 {
17
    const char *str;
18
    const char *key = monitor ? "device.info.monitor" : "device.info";
19
@@ -313,6 +313,12 @@
20
    }
21
    collect_device_info(o, card, &di, monitor, defs);
22
 
23
+   di.state = node_state(info->state);
24
+   /* running sink/source that is not linked is reported as idle */
25
+   if (!stream && di.state == STATE_RUNNING &&
26
+       !collect_is_linked(manager, o->id, pw_direction_reverse(direction)))
27
+       di.state = STATE_IDLE;
28
+
29
    dev_info = pw_manager_object_get_data(o, key);
30
    if (dev_info) {
31
        if (memcmp(dev_info, &di, sizeof(di)) != 0) {
32
@@ -586,16 +592,16 @@
33
        struct defs *defs)
34
 {
35
    if (pw_manager_object_is_sink(o)) {
36
-       update_device_info(manager, o, PW_DIRECTION_OUTPUT, false, defs);
37
-       update_device_info(manager, o, PW_DIRECTION_OUTPUT, true, defs);
38
+       update_device_info(manager, o, PW_DIRECTION_OUTPUT, false, defs, false);
39
+       update_device_info(manager, o, PW_DIRECTION_OUTPUT, true, defs, false);
40
    }
41
    if (pw_manager_object_is_source(o)) {
42
-       update_device_info(manager, o, PW_DIRECTION_INPUT, false, defs);
43
+       update_device_info(manager, o, PW_DIRECTION_INPUT, false, defs, false);
44
    }
45
    if (pw_manager_object_is_source_output(o)) {
46
-       update_device_info(manager, o, PW_DIRECTION_INPUT, false, defs);
47
+       update_device_info(manager, o, PW_DIRECTION_INPUT, false, defs, true);
48
    }
49
    if (pw_manager_object_is_sink_input(o)) {
50
-       update_device_info(manager, o, PW_DIRECTION_OUTPUT, false, defs);
51
+       update_device_info(manager, o, PW_DIRECTION_OUTPUT, false, defs, true);
52
    }
53
 }
54
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/collect.h -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/collect.h Changed
24
 
1
@@ -42,6 +42,7 @@
2
 
3
 struct device_info {
4
    uint32_t direction;
5
+   int state;
6
 
7
    struct sample_spec ss;
8
    struct channel_map map;
9
@@ -59,6 +60,7 @@
10
 #define DEVICE_INFO_INIT(_dir) \
11
    (struct device_info) {              \
12
        .direction = _dir,          \
13
+       .state = STATE_INIT,            \
14
        .ss = SAMPLE_SPEC_INIT,         \
15
        .map = CHANNEL_MAP_INIT,        \
16
        .volume_info = VOLUME_INFO_INIT,    \
17
@@ -146,6 +148,5 @@
18
 struct pw_manager_object *find_peer_for_link(struct pw_manager *m,
19
        struct pw_manager_object *o, uint32_t id, enum pw_direction direction);
20
 struct pw_manager_object *find_linked(struct pw_manager *m, uint32_t id, enum pw_direction direction);
21
-bool collect_is_linked(struct pw_manager *m, uint32_t id, enum pw_direction direction);
22
 
23
 #endif
24
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-alsa-sink.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-alsa-sink.c Changed
78
 
1
@@ -7,6 +7,43 @@
2
 #include "../manager.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_alsa_sink ALSA Sink
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-alsa-sink`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ */
15
+
16
+static const char *const pulse_module_options =
17
+   "name=<name of the sink, to be prefixed> "
18
+   "sink_name=<name for the sink> "
19
+   "sink_properties=<properties for the sink> "
20
+   "namereg_fail=<when false attempt to synthesise new sink_name if it is already taken> "
21
+   "device=<ALSA device> "
22
+   "device_id=<ALSA card index> "
23
+   "format=<sample format> "
24
+   "rate=<sample rate> "
25
+   "alternate_rate=<alternate sample rate> "
26
+   "channels=<number of channels> "
27
+   "channel_map=<channel map> "
28
+   "fragments=<number of fragments> "
29
+   "fragment_size=<fragment size> "
30
+   "mmap=<enable memory mapping?> "
31
+   "tsched=<enable system timer based scheduling mode?> "
32
+   "tsched_buffer_size=<buffer size when using timer based scheduling> "
33
+   "tsched_buffer_watermark=<lower fill watermark> "
34
+   "ignore_dB=<ignore dB information from the device?> "
35
+   "control=<name of mixer control, or name and index separated by a comma> "
36
+   "rewind_safeguard=<number of bytes that cannot be rewound> " 
37
+   "deferred_volume=<Synchronize software and hardware volume changes to avoid momentary jumps?> "
38
+   "deferred_volume_safety_margin=<usec adjustment depending on volume direction> "
39
+   "deferred_volume_extra_delay=<usec adjustment to HW volume changes> "
40
+   "fixed_latency_range=<disable latency range changes on underrun?> ";
41
+
42
 #define NAME "alsa-sink"
43
 
44
 #define DEFAULT_DEVICE "default"
45
@@ -131,31 +168,7 @@
46
 static const struct spa_dict_item module_alsa_sink_info = {
47
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
48
    { PW_KEY_MODULE_DESCRIPTION, "An ALSA sink" },
49
-   { PW_KEY_MODULE_USAGE,
50
-       "name=<name of the sink, to be prefixed> "
51
-       "sink_name=<name for the sink> "
52
-       "sink_properties=<properties for the sink> "
53
-       "namereg_fail=<when false attempt to synthesise new sink_name if it is already taken> "
54
-       "device=<ALSA device> "
55
-       "device_id=<ALSA card index> "
56
-       "format=<sample format> "
57
-       "rate=<sample rate> "
58
-       "alternate_rate=<alternate sample rate> "
59
-       "channels=<number of channels> "
60
-       "channel_map=<channel map> "
61
-       "fragments=<number of fragments> "
62
-       "fragment_size=<fragment size> "
63
-       "mmap=<enable memory mapping?> "
64
-       "tsched=<enable system timer based scheduling mode?> "
65
-       "tsched_buffer_size=<buffer size when using timer based scheduling> "
66
-       "tsched_buffer_watermark=<lower fill watermark> "
67
-       "ignore_dB=<ignore dB information from the device?> "
68
-       "control=<name of mixer control, or name and index separated by a comma> "
69
-       "rewind_safeguard=<number of bytes that cannot be rewound> "
70
-       "deferred_volume=<Synchronize software and hardware volume changes to avoid momentary jumps?> "
71
-       "deferred_volume_safety_margin=<usec adjustment depending on volume direction> "
72
-       "deferred_volume_extra_delay=<usec adjustment to HW volume changes> "
73
-       "fixed_latency_range=<disable latency range changes on underrun?>" },
74
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
75
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
76
 };
77
 
78
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-alsa-source.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-alsa-source.c Changed
78
 
1
@@ -7,6 +7,43 @@
2
 #include "../manager.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_alsa_source ALSA Source
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-alsa-source`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ */
15
+
16
+static const char *const pulse_module_options =
17
+       "name=<name of the source, to be prefixed> "
18
+       "source_name=<name for the source> "
19
+       "source_properties=<properties for the source> "
20
+       "namereg_fail=<when false attempt to synthesise new source_name if it is already taken> "
21
+       "device=<ALSA device> "
22
+       "device_id=<ALSA card index> "
23
+       "format=<sample format> "
24
+       "rate=<sample rate> "
25
+       "alternate_rate=<alternate sample rate> "
26
+       "channels=<number of channels> "
27
+       "channel_map=<channel map> "
28
+       "fragments=<number of fragments> "
29
+       "fragment_size=<fragment size> "
30
+       "mmap=<enable memory mapping?> "
31
+       "tsched=<enable system timer based scheduling mode?> "
32
+       "tsched_buffer_size=<buffer size when using timer based scheduling> "
33
+       "tsched_buffer_watermark=<lower fill watermark> "
34
+       "ignore_dB=<ignore dB information from the device?> "
35
+       "control=<name of mixer control, or name and index separated by a comma> "
36
+       "rewind_safeguard=<number of bytes that cannot be rewound> "
37
+       "deferred_volume=<Synchronize software and hardware volume changes to avoid momentary jumps?> "
38
+       "deferred_volume_safety_margin=<usec adjustment depending on volume direction> "
39
+       "deferred_volume_extra_delay=<usec adjustment to HW volume changes> "
40
+       "fixed_latency_range=<disable latency range changes on underrun?>";
41
+
42
 #define NAME "alsa-source"
43
 
44
 #define DEFAULT_DEVICE "default"
45
@@ -131,31 +168,7 @@
46
 static const struct spa_dict_item module_alsa_source_info = {
47
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
48
    { PW_KEY_MODULE_DESCRIPTION, "An ALSA source" },
49
-   { PW_KEY_MODULE_USAGE,
50
-       "name=<name of the source, to be prefixed> "
51
-       "source_name=<name for the source> "
52
-       "source_properties=<properties for the source> "
53
-       "namereg_fail=<when false attempt to synthesise new source_name if it is already taken> "
54
-       "device=<ALSA device> "
55
-       "device_id=<ALSA card index> "
56
-       "format=<sample format> "
57
-       "rate=<sample rate> "
58
-       "alternate_rate=<alternate sample rate> "
59
-       "channels=<number of channels> "
60
-       "channel_map=<channel map> "
61
-       "fragments=<number of fragments> "
62
-       "fragment_size=<fragment size> "
63
-       "mmap=<enable memory mapping?> "
64
-       "tsched=<enable system timer based scheduling mode?> "
65
-       "tsched_buffer_size=<buffer size when using timer based scheduling> "
66
-       "tsched_buffer_watermark=<lower fill watermark> "
67
-       "ignore_dB=<ignore dB information from the device?> "
68
-       "control=<name of mixer control, or name and index separated by a comma> "
69
-       "rewind_safeguard=<number of bytes that cannot be rewound> "
70
-       "deferred_volume=<Synchronize software and hardware volume changes to avoid momentary jumps?> "
71
-       "deferred_volume_safety_margin=<usec adjustment depending on volume direction> "
72
-       "deferred_volume_extra_delay=<usec adjustment to HW volume changes> "
73
-       "fixed_latency_range=<disable latency range changes on underrun?>" },
74
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
75
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
76
 };
77
 
78
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-always-sink.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-always-sink.c Changed
30
 
1
@@ -6,6 +6,19 @@
2
 
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_always_sink Always Sink
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-always-sink`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ */
15
+
16
+static const char *const pulse_module_options = "sink_name=<name of sink>";
17
+
18
 #define NAME "always-sink"
19
 
20
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
21
@@ -77,7 +90,7 @@
22
 static const struct spa_dict_item module_always_sink_info = {
23
    { PW_KEY_MODULE_AUTHOR, "Pauli Virtanen <pav@iki.fi>" },
24
    { PW_KEY_MODULE_DESCRIPTION, "Always keeps at least one sink loaded even if it's a null one" },
25
-   { PW_KEY_MODULE_USAGE,  "sink_name=<name of sink>" },
26
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
27
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
28
 };
29
 
30
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-combine-sink.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-combine-sink.c Changed
62
 
1
@@ -12,6 +12,31 @@
2
 #include "../manager.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_combine_sink Combine Sink
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-combine-sink`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_combine_stream "libpipewire-module-combine-stream"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "sink_name=<name of the sink> "
22
+   "sink_properties=<properties for the sink> "
23
+   "sinks=<sinks to combine> "
24
+   "rate=<sample rate> "
25
+   "channels=<number of channels> "
26
+   "channel_map=<channel map> "
27
+   "remix=<remix channels> "
28
+   "latency_compensate=<bool> ";
29
+
30
 #define NAME "combine-sink"
31
 
32
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
33
@@ -24,15 +49,7 @@
34
 static const struct spa_dict_item module_combine_sink_info = {
35
    { PW_KEY_MODULE_AUTHOR, "Arun Raghavan <arun@asymptotic.io>" },
36
    { PW_KEY_MODULE_DESCRIPTION, "Combine multiple sinks into a single sink" },
37
-   { PW_KEY_MODULE_USAGE, "sink_name=<name of the sink> "
38
-               "sink_properties=<properties for the sink> "
39
-               /* not a great name, but for backwards compatibility... */
40
-               "slaves=<sinks to combine> "
41
-               "rate=<sample rate> "
42
-               "channels=<number of channels> "
43
-               "channel_map=<channel map> "
44
-               "remix=<remix channels> "
45
-               "latency_compensate=<bool> " },
46
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
47
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
48
 };
49
 
50
@@ -268,8 +285,10 @@
51
    if ((str = pw_properties_get(props, "sink_properties")) != NULL)
52
        module_args_add_props(combine_props, str);
53
 
54
-   if ((str = pw_properties_get(props, "slaves")) != NULL) {
55
+   if ((str = pw_properties_get(props, "sinks")) != NULL ||
56
+           (str = pw_properties_get(props, "slaves")) != NULL) {
57
        sink_names = pw_split_strv(str, ",", MAX_SINKS, &num_sinks);
58
+       pw_properties_set(props, "sinks", NULL);
59
        pw_properties_set(props, "slaves", NULL);
60
    }
61
    if ((str = pw_properties_get(props, "remix")) != NULL) {
62
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-echo-cancel.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-echo-cancel.c Changed
78
 
1
@@ -11,6 +11,45 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_echo_cancel Echo Cancel
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-echo-cancel`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_echo_cancel "libpipewire-module-echo-cancel"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "source_name=<name for the source> "
22
+   "source_properties=<properties for the source> "
23
+   "source_master=<name of source to filter> "
24
+   "sink_name=<name for the sink> "
25
+   "sink_properties=<properties for the sink> "
26
+   "sink_master=<name of sink to filter> "
27
+   "rate=<sample rate> "
28
+   "channels=<number of channels> "
29
+   "channel_map=<channel map> "
30
+   "aec_method=<implementation to use> "
31
+   "aec_args=<parameters for the AEC engine> ";
32
+#if 0
33
+   /* These are not implemented because they don't
34
+    * really make sense in the PipeWire context */
35
+   "format=<sample format> "
36
+   "adjust_time=<how often to readjust rates in s> "
37
+   "adjust_threshold=<how much drift to readjust after in ms> "
38
+   "autoloaded=<set if this module is being loaded automatically> "
39
+   "save_aec=<save AEC data in /tmp> "
40
+   "use_volume_sharing=<yes or no> "
41
+   "use_master_format=<yes or no> "
42
+#endif
43
+
44
 #define NAME "echo-cancel"
45
 
46
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
47
@@ -114,29 +153,7 @@
48
 static const struct spa_dict_item module_echo_cancel_info = {
49
    { PW_KEY_MODULE_AUTHOR, "Arun Raghavan <arun@asymptotic.io>" },
50
    { PW_KEY_MODULE_DESCRIPTION, "Acoustic echo canceller" },
51
-   { PW_KEY_MODULE_USAGE, "source_name=<name for the source> "
52
-               "source_properties=<properties for the source> "
53
-               "source_master=<name of source to filter> "
54
-               "sink_name=<name for the sink> "
55
-               "sink_properties=<properties for the sink> "
56
-               "sink_master=<name of sink to filter> "
57
-               "rate=<sample rate> "
58
-               "channels=<number of channels> "
59
-               "channel_map=<channel map> "
60
-               "aec_method=<implementation to use> "
61
-               "aec_args=<parameters for the AEC engine> "
62
-#if 0
63
-               /* These are not implemented because they don't
64
-                * really make sense in the PipeWire context */
65
-               "format=<sample format> "
66
-               "adjust_time=<how often to readjust rates in s> "
67
-               "adjust_threshold=<how much drift to readjust after in ms> "
68
-               "autoloaded=<set if this module is being loaded automatically> "
69
-               "save_aec=<save AEC data in /tmp> "
70
-               "use_volume_sharing=<yes or no> "
71
-               "use_master_format=<yes or no> "
72
-#endif
73
-   },
74
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
75
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
76
 };
77
 
78
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-gsettings.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-gsettings.c Changed
19
 
1
@@ -11,6 +11,17 @@
2
 
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_gsettings GSettings
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-gsettings`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * No options.
14
+ */
15
+
16
 #define NAME "gsettings"
17
 
18
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
19
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-jackdbus-detect.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-jackdbus-detect.c Changed
58
 
1
@@ -8,6 +8,35 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_jackdbus_detect JackDBus Detect
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-jackdbus-detect`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_jackdbus_detect "libpipewire-module-jackdbus-detect"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "channels=<number of channels> "
22
+   "sink_name=<name for the sink> "
23
+   "sink_properties=<properties for the sink> "
24
+   "sink_client_name=<jack client name> "
25
+   "sink_channels=<number of channels> "
26
+   "sink_channel_map=<channel map> "
27
+   "source_name=<name for the source> "
28
+   "source_properties=<properties for the source> "
29
+   "source_client_name=<jack client name> "
30
+   "source_channels=<number of channels> "
31
+   "source_channel_map=<channel map> "
32
+   "connect=<connect ports?>";
33
+
34
 #define NAME "jackdbus-detect"
35
 
36
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
37
@@ -93,19 +122,7 @@
38
 static const struct spa_dict_item module_jackdbus_detect_info = {
39
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.con>" },
40
    { PW_KEY_MODULE_DESCRIPTION, "Creates a JACK client when jackdbus is started" },
41
-   { PW_KEY_MODULE_USAGE,
42
-       "channels=<number of channels> "
43
-       "sink_name=<name for the sink> "
44
-       "sink_properties=<properties for the sink> "
45
-       "sink_client_name=<jack client name> "
46
-       "sink_channels=<number of channels> "
47
-       "sink_channel_map=<channel map> "
48
-       "source_name=<name for the source> "
49
-       "source_properties=<properties for the source> "
50
-       "source_client_name=<jack client name> "
51
-       "source_channels=<number of channels> "
52
-       "source_channel_map=<channel map> "
53
-       "connect=<connect ports?>" },
54
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
55
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
56
 };
57
 
58
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-ladspa-sink.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-ladspa-sink.c Changed
62
 
1
@@ -11,6 +11,37 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_ladspa_sink LADSPA Sink
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-ladspa-sink`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_filter_chain "libpipewire-module-filter-chain"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "sink_name=<name for the sink> "
22
+   "sink_properties=<properties for the sink> "
23
+   "sink_input_properties=<properties for the sink input> "
24
+   "master=<name of sink to filter> "
25
+   "sink_master=<name of sink to filter> "
26
+   "format=<sample format> "
27
+   "rate=<sample rate> "
28
+   "channels=<number of channels> "
29
+   "channel_map=<input channel map> "
30
+   "plugin=<ladspa plugin name> "
31
+   "label=<ladspa plugin label> "
32
+   "control=<comma separated list of input control values> "
33
+   "input_ladspaport_map=<comma separated list of input LADSPA port names> "
34
+   "output_ladspaport_map=<comma separated list of output LADSPA port names> ";
35
+
36
 #define NAME "ladspa-sink"
37
 
38
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
39
@@ -126,21 +157,7 @@
40
 static const struct spa_dict_item module_ladspa_sink_info = {
41
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
42
    { PW_KEY_MODULE_DESCRIPTION, "Virtual LADSPA sink" },
43
-   { PW_KEY_MODULE_USAGE,
44
-       "sink_name=<name for the sink> "
45
-       "sink_properties=<properties for the sink> "
46
-       "sink_input_properties=<properties for the sink input> "
47
-       "master=<name of sink to filter> "
48
-       "sink_master=<name of sink to filter> "
49
-       "format=<sample format> "
50
-       "rate=<sample rate> "
51
-       "channels=<number of channels> "
52
-       "channel_map=<input channel map> "
53
-       "plugin=<ladspa plugin name> "
54
-       "label=<ladspa plugin label> "
55
-       "control=<comma separated list of input control values> "
56
-       "input_ladspaport_map=<comma separated list of input LADSPA port names> "
57
-       "output_ladspaport_map=<comma separated list of output LADSPA port names> "},
58
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
59
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
60
 };
61
 
62
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-ladspa-source.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-ladspa-source.c Changed
62
 
1
@@ -11,6 +11,37 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_ladspa_source LADSPA Source
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-ladspa-source`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_filter_chain "libpipewire-module-filter-chain"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "source_name=<name for the source> "
22
+   "source_properties=<properties for the source> "
23
+   "source_output_properties=<properties for the source output> "
24
+   "master=<name of source to filter> "
25
+   "source_master=<name of source to filter> "
26
+   "format=<sample format> "
27
+   "rate=<sample rate> "
28
+   "channels=<number of channels> "
29
+   "channel_map=<input channel map> "
30
+   "plugin=<ladspa plugin name> "
31
+   "label=<ladspa plugin label> "
32
+   "control=<comma separated list of input control values> "
33
+   "input_ladspaport_map=<comma separated list of input LADSPA port names> "
34
+   "output_ladspaport_map=<comma separated list of output LADSPA port names> ";
35
+
36
 #define NAME "ladspa-source"
37
 
38
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
39
@@ -126,21 +157,7 @@
40
 static const struct spa_dict_item module_ladspa_source_info = {
41
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
42
    { PW_KEY_MODULE_DESCRIPTION, "Virtual LADSPA source" },
43
-   { PW_KEY_MODULE_USAGE,
44
-       "source_name=<name for the source> "
45
-       "source_properties=<properties for the source> "
46
-       "source_output_properties=<properties for the source output> "
47
-       "master=<name of source to filter> "
48
-       "source_master=<name of source to filter> "
49
-       "format=<sample format> "
50
-       "rate=<sample rate> "
51
-       "channels=<number of channels> "
52
-       "channel_map=<input channel map> "
53
-       "plugin=<ladspa plugin name> "
54
-       "label=<ladspa plugin label> "
55
-       "control=<comma separated list of input control values> "
56
-       "input_ladspaport_map=<comma separated list of input LADSPA port names> "
57
-       "output_ladspaport_map=<comma separated list of output LADSPA port names> "},
58
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
59
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
60
 };
61
 
62
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-loopback.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-loopback.c Changed
55
 
1
@@ -11,6 +11,34 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_loopback Loopback
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-loopback`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_loopback "libpipewire-module-loopback"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "source=<source to connect to> "
22
+   "sink=<sink to connect to> "
23
+   "latency_msec=<latency in ms> "
24
+   "rate=<sample rate> "
25
+   "channels=<number of channels> "
26
+   "channel_map=<channel map> "
27
+   "sink_input_properties=<proplist> "
28
+   "source_output_properties=<proplist> "
29
+   "source_dont_move=<boolean> "
30
+   "sink_dont_move=<boolean> "
31
+   "remix=<remix channels?> ";
32
+
33
 #define NAME "loopback"
34
 
35
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
36
@@ -99,17 +127,7 @@
37
 static const struct spa_dict_item module_loopback_info = {
38
    { PW_KEY_MODULE_AUTHOR, "Arun Raghavan <arun@asymptotic.io>" },
39
    { PW_KEY_MODULE_DESCRIPTION, "Loopback from source to sink" },
40
-   { PW_KEY_MODULE_USAGE, "source=<source to connect to> "
41
-               "sink=<sink to connect to> "
42
-               "latency_msec=<latency in ms> "
43
-               "rate=<sample rate> "
44
-               "channels=<number of channels> "
45
-               "channel_map=<channel map> "
46
-               "sink_input_properties=<proplist> "
47
-               "source_output_properties=<proplist> "
48
-               "source_dont_move=<boolean> "
49
-               "sink_dont_move=<boolean> "
50
-               "remix=<remix channels?> " },
51
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
52
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
53
 };
54
 
55
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-native-protocol-tcp.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-native-protocol-tcp.c Changed
35
 
1
@@ -8,6 +8,22 @@
2
 #include "../pulse-server.h"
3
 #include "../server.h"
4
 
5
+/** \page page_pulse_module_native_protocol_tcp Pulseaudio TCP Protocol
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-native-protocol-tcp`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ */
15
+
16
+static const char *const pulse_module_options =
17
+   "port=<TCP port number> "
18
+   "listen=<address to listen on> "
19
+   "auth-anonymous=<don't check for cookies?>";
20
+
21
 #define NAME "protocol-tcp"
22
 
23
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
24
@@ -53,9 +69,7 @@
25
 static const struct spa_dict_item module_native_protocol_tcp_info = {
26
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
27
    { PW_KEY_MODULE_DESCRIPTION, "Native protocol (TCP sockets)" },
28
-   { PW_KEY_MODULE_USAGE, "port=<TCP port number> "
29
-               "listen=<address to listen on> "
30
-               "auth-anonymous=<don't check for cookies?>"},
31
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
32
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
33
 };
34
 
35
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-null-sink.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-null-sink.c Changed
41
 
1
@@ -7,6 +7,25 @@
2
 #include "../manager.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_null_sink Null Sink
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-null-sink`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ */
15
+
16
+static const char *const pulse_module_options =
17
+   "sink_name=<name of sink> "
18
+   "sink_properties=<properties for the sink> "
19
+   "format=<sample format> "
20
+   "rate=<sample rate> "
21
+   "channels=<number of channels> "
22
+   "channel_map=<channel map>";
23
+
24
 #define NAME "null-sink"
25
 
26
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
27
@@ -129,12 +148,7 @@
28
 static const struct spa_dict_item module_null_sink_info = {
29
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
30
    { PW_KEY_MODULE_DESCRIPTION, "A NULL sink" },
31
-   { PW_KEY_MODULE_USAGE,  "sink_name=<name of sink> "
32
-               "sink_properties=<properties for the sink> "
33
-               "format=<sample format> "
34
-               "rate=<sample rate> "
35
-               "channels=<number of channels> "
36
-               "channel_map=<channel map>" },
37
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
38
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
39
 };
40
 
41
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-pipe-sink.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-pipe-sink.c Changed
49
 
1
@@ -14,6 +14,31 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_pipe_sink Pipe Sink
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-pipe-sink`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_pipe_tunnel "libpipewire-module-pipe-tunnel"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "file=<name of the FIFO special file to use> "
22
+   "sink_name=<name for the sink> "
23
+   "sink_properties=<sink properties> "
24
+   "format=<sample format> "
25
+   "rate=<sample rate> "
26
+   "channels=<number of channels> "
27
+   "channel_map=<channel map> "
28
+   "use_system_clock_for_timing=<yes or no> ";
29
+
30
 #define NAME "pipe-sink"
31
 
32
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
33
@@ -94,14 +119,7 @@
34
 static const struct spa_dict_item module_pipe_sink_info = {
35
    { PW_KEY_MODULE_AUTHOR, "Sanchayan Maity <sanchayan@asymptotic.io>" },
36
    { PW_KEY_MODULE_DESCRIPTION, "Pipe sink" },
37
-   { PW_KEY_MODULE_USAGE, "file=<name of the FIFO special file to use> "
38
-               "sink_name=<name for the sink> "
39
-               "sink_properties=<sink properties> "
40
-               "format=<sample format> "
41
-               "rate=<sample rate> "
42
-               "channels=<number of channels> "
43
-               "channel_map=<channel map> "
44
-               "use_system_clock_for_timing=<yes or no> " },
45
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
46
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
47
 };
48
 
49
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-pipe-source.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-pipe-source.c Changed
47
 
1
@@ -14,6 +14,30 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_pipe_source Pipe Source
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-pipe-source`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_pipe_tunnel "libpipewire-module-pipe-tunnel"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "file=<name of the FIFO special file to use> "
22
+   "source_name=<name for the source> "
23
+   "source_properties=<source properties> "
24
+   "format=<sample format> "
25
+   "rate=<sample rate> "
26
+   "channels=<number of channels> "
27
+   "channel_map=<channel map> ";
28
+
29
 #define NAME "pipe-source"
30
 
31
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
32
@@ -94,13 +118,7 @@
33
 static const struct spa_dict_item module_pipe_source_info = {
34
    { PW_KEY_MODULE_AUTHOR, "Sanchayan Maity <sanchayan@asymptotic.io>" },
35
    { PW_KEY_MODULE_DESCRIPTION, "Pipe source" },
36
-   { PW_KEY_MODULE_USAGE, "file=<name of the FIFO special file to use> "
37
-               "source_name=<name for the source> "
38
-               "source_properties=<source properties> "
39
-               "format=<sample format> "
40
-               "rate=<sample rate> "
41
-               "channels=<number of channels> "
42
-               "channel_map=<channel map> " },
43
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
44
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
45
 };
46
 
47
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-raop-discover.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-raop-discover.c Changed
23
 
1
@@ -8,6 +8,21 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_raop_discover RAOP Discover
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-raop-discover`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * No options.
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_raop_discover "libpipewire-module-raop-discover"
18
+ */
19
+
20
 #define NAME "raop-discover"
21
 
22
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
23
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-remap-sink.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-remap-sink.c Changed
53
 
1
@@ -10,6 +10,33 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_remap_sink Remap Sink
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-remap-sink`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_loopback "libpipewire-module-loopback"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "sink_name=<name for the sink> "
22
+   "sink_properties=<properties for the sink> "
23
+   "master=<name of sink to remap> "
24
+   "master_channel_map=<channel map> "
25
+   "format=<sample format> "
26
+   "rate=<sample rate> "
27
+   "channels=<number of channels> "
28
+   "channel_map=<channel map> "
29
+   "resample_method=<resampler> "
30
+   "remix=<remix channels?>";
31
+
32
 #define NAME "remap-sink"
33
 
34
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
35
@@ -96,16 +123,7 @@
36
 static const struct spa_dict_item module_remap_sink_info = {
37
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
38
    { PW_KEY_MODULE_DESCRIPTION, "Remap sink channels" },
39
-   { PW_KEY_MODULE_USAGE, "sink_name=<name for the sink> "
40
-           "sink_properties=<properties for the sink> "
41
-           "master=<name of sink to remap> "
42
-           "master_channel_map=<channel map> "
43
-           "format=<sample format> "
44
-           "rate=<sample rate> "
45
-           "channels=<number of channels> "
46
-           "channel_map=<channel map> "
47
-           "resample_method=<resampler> "
48
-           "remix=<remix channels?>" },
49
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
50
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
51
 };
52
 
53
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-remap-source.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-remap-source.c Changed
53
 
1
@@ -10,6 +10,33 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_remap_source Remap Source
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-remap-source`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_loopback "libpipewire-module-loopback"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "source_name=<name for the source> "
22
+   "source_properties=<properties for the source> "
23
+   "master=<name of source to filter> "
24
+   "master_channel_map=<channel map> "
25
+   "format=<sample format> "
26
+   "rate=<sample rate> "
27
+   "channels=<number of channels> "
28
+   "channel_map=<channel map> "
29
+   "resample_method=<resampler> "
30
+   "remix=<remix channels?>";
31
+
32
 #define NAME "remap-sink"
33
 
34
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
35
@@ -96,16 +123,7 @@
36
 static const struct spa_dict_item module_remap_source_info = {
37
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
38
    { PW_KEY_MODULE_DESCRIPTION, "Remap source channels" },
39
-   { PW_KEY_MODULE_USAGE, "source_name=<name for the source> "
40
-           "source_properties=<properties for the source> "
41
-           "master=<name of source to filter> "
42
-           "master_channel_map=<channel map> "
43
-           "format=<sample format> "
44
-           "rate=<sample rate> "
45
-           "channels=<number of channels> "
46
-           "channel_map=<channel map> "
47
-           "resample_method=<resampler> "
48
-           "remix=<remix channels?>" },
49
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
50
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
51
 };
52
 
53
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-roc-sink-input.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-roc-sink-input.c Changed
65
 
1
@@ -9,7 +9,34 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
-#define NAME "roc-source"
6
+/** \page page_pulse_module_roc_sink_input ROC Sink Input
7
+ *
8
+ * ## Module Name
9
+ *
10
+ * `module-roc-sink-input`
11
+ *
12
+ * ## Module Options
13
+ *
14
+ * @pulse_module_options@
15
+ *
16
+ * ## See Also
17
+ *
18
+ * \ref page_module_roc_source "libpipewire-module-roc-source"
19
+ */
20
+
21
+static const char *const pulse_module_options =
22
+   "sink=<name for the sink> "
23
+   "sink_input_properties=<properties for the sink_input> "
24
+   "resampler_profile=<empty>|high|medium|low "
25
+   "fec_code=<empty>|disable|rs8m|ldpc "
26
+   "sess_latency_msec=<target network latency in milliseconds> "
27
+   "local_ip=<local receiver ip> "
28
+   "local_source_port=<local receiver port for source packets> "
29
+   "local_repair_port=<local receiver port for repair packets> "
30
+   "local_control_port=<local receiver port for control packets> "
31
+   ;
32
+
33
+#define NAME "roc-sink-input"
34
 
35
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
36
 #define PW_LOG_TOPIC_DEFAULT mod_topic
37
@@ -92,14 +119,7 @@
38
 static const struct spa_dict_item module_roc_sink_input_info = {
39
    { PW_KEY_MODULE_AUTHOR, "Sanchayan Maity <sanchayan@asymptotic.io>" },
40
    { PW_KEY_MODULE_DESCRIPTION, "roc sink-input" },
41
-   { PW_KEY_MODULE_USAGE, "sink=<name for the sink> "
42
-               "sink_input_properties=<properties for the sink_input> "
43
-               "resampler_profile=<empty>|disable|high|medium|low "
44
-               "fec_code=<empty>|disable|rs8m|ldpc "
45
-               "sess_latency_msec=<target network latency in milliseconds> "
46
-               "local_ip=<local receiver ip> "
47
-               "local_source_port=<local receiver port for source packets> "
48
-               "local_repair_port=<local receiver port for repair packets> " },
49
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
50
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
51
 };
52
 
53
@@ -144,6 +164,11 @@
54
        pw_properties_set(props, "local_repair_port", NULL);
55
    }
56
 
57
+   if ((str = pw_properties_get(props, "local_control_port")) != NULL) {
58
+       pw_properties_set(roc_props, "local.control.port", str);
59
+       pw_properties_set(props, "local_control_port", NULL);
60
+   }
61
+
62
    if ((str = pw_properties_get(props, "sess_latency_msec")) != NULL) {
63
        pw_properties_set(roc_props, "sess.latency.msec", str);
64
        pw_properties_set(props, "sess_latency_msec", NULL);
65
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-roc-sink.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-roc-sink.c Changed
66
 
1
@@ -9,6 +9,31 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_roc_sink ROC Sink
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-roc-sink`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_roc_sink "libpipewire-module-roc-sink"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "sink_name=<name for the sink> "
22
+   "sink_properties=<properties for the sink> "
23
+   "fec_code=<empty>|disable|rs8m|ldpc "
24
+   "remote_ip=<remote receiver ip> "
25
+   "remote_source_port=<remote receiver port for source packets> "
26
+   "remote_repair_port=<remote receiver port for repair packets> "
27
+   "remote_control_port=<remote receiver port for control packets> "
28
+   ;
29
+
30
 #define NAME "roc-sink"
31
 
32
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
33
@@ -96,17 +121,13 @@
34
    "remote_ip",
35
    "remote_source_port",
36
    "remote_repair_port",
37
+   "remote_control_port",
38
    NULL
39
 };
40
 static const struct spa_dict_item module_roc_sink_info = {
41
    { PW_KEY_MODULE_AUTHOR, "Sanchayan Maity <sanchayan@asymptotic.io>" },
42
    { PW_KEY_MODULE_DESCRIPTION, "roc sink" },
43
-   { PW_KEY_MODULE_USAGE, "sink_name=<name for the sink> "
44
-               "sink_properties=<properties for the sink> "
45
-               "fec_code=<empty>|disable|rs8m|ldpc "
46
-               "remote_ip=<remote receiver ip> "
47
-               "remote_source_port=<remote receiver port for source packets> "
48
-               "remote_repair_port=<remote receiver port for repair packets> " },
49
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
50
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
51
 };
52
 
53
@@ -159,6 +180,12 @@
54
        pw_properties_set(roc_props, "remote.repair.port", str);
55
        pw_properties_set(props, "remote_repair_port", NULL);
56
    }
57
+
58
+   if ((str = pw_properties_get(props, "remote_control_port")) != NULL) {
59
+       pw_properties_set(roc_props, "remote.control.port", str);
60
+       pw_properties_set(props, "remote_control_port", NULL);
61
+   }
62
+
63
    if ((str = pw_properties_get(props, "fec_code")) != NULL) {
64
        pw_properties_set(roc_props, "fec.code", str);
65
        pw_properties_set(props, "fec_code", NULL);
66
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-roc-source.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-roc-source.c Changed
70
 
1
@@ -9,6 +9,33 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_roc_source ROC Source
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-roc-source`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_roc_source "libpipewire-module-roc-source"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "source_name=<name for the source> "
22
+   "source_properties=<properties for the source> "
23
+   "resampler_profile=<empty>|high|medium|low "
24
+   "fec_code=<empty>|disable|rs8m|ldpc "
25
+   "sess_latency_msec=<target network latency in milliseconds> "
26
+   "local_ip=<local receiver ip> "
27
+   "local_source_port=<local receiver port for source packets> "
28
+   "local_repair_port=<local receiver port for repair packets> "
29
+   "local_control_port=<local receiver port for control packets> "
30
+   ;
31
+
32
 #define NAME "roc-source"
33
 
34
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
35
@@ -98,20 +125,14 @@
36
    "local_ip",
37
    "local_source_port",
38
    "local_repair_port",
39
+   "local_control_port",
40
    NULL
41
 };
42
 
43
 static const struct spa_dict_item module_roc_source_info = {
44
    { PW_KEY_MODULE_AUTHOR, "Sanchayan Maity <sanchayan@asymptotic.io>" },
45
    { PW_KEY_MODULE_DESCRIPTION, "roc source" },
46
-   { PW_KEY_MODULE_USAGE, "source_name=<name for the source> "
47
-               "source_properties=<properties for the source> "
48
-               "resampler_profile=<empty>|disable|high|medium|low "
49
-               "fec_code=<empty>|disable|rs8m|ldpc "
50
-               "sess_latency_msec=<target network latency in milliseconds> "
51
-               "local_ip=<local receiver ip> "
52
-               "local_source_port=<local receiver port for source packets> "
53
-               "local_repair_port=<local receiver port for repair packets> " },
54
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
55
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
56
 };
57
 
58
@@ -161,6 +182,11 @@
59
        pw_properties_set(props, "local_repair_port", NULL);
60
    }
61
 
62
+   if ((str = pw_properties_get(props, "local_control_port")) != NULL) {
63
+       pw_properties_set(roc_props, "local.control.port", str);
64
+       pw_properties_set(props, "local_control_port", NULL);
65
+   }
66
+
67
    if ((str = pw_properties_get(props, "sess_latency_msec")) != NULL) {
68
        pw_properties_set(roc_props, "sess.latency.msec", str);
69
        pw_properties_set(props, "sess_latency_msec", NULL);
70
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-rtp-recv.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-rtp-recv.c Changed
39
 
1
@@ -8,6 +8,26 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_rtp_recv RTP Receiver
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-rtp-recv`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_rtp_sap "libpipewire-module-rtp-sap"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "sink=<name of the sink> "
22
+   "sap_address=<multicast address to listen on> "
23
+   "latency_msec=<latency in ms> ";
24
+
25
 #define NAME "rtp-recv"
26
 
27
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
28
@@ -94,9 +114,7 @@
29
 static const struct spa_dict_item module_rtp_recv_info = {
30
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
31
    { PW_KEY_MODULE_DESCRIPTION, "Receive data from a network via RTP/SAP/SDP" },
32
-   { PW_KEY_MODULE_USAGE,  "sink=<name of the sink> "
33
-               "sap_address=<multicast address to listen on> "
34
-               "latency_msec=<latency in ms> " },
35
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
36
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
37
 };
38
 
39
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-rtp-send.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-rtp-send.c Changed
59
 
1
@@ -8,6 +8,36 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_rtp_send RTP Sender
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-rtp-send`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_rtp_sink "libpipewire-module-rtp-sink"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "source=<name of the source> "
22
+   "format=<sample format> "
23
+   "channels=<number of channels> "
24
+   "rate=<sample rate> "
25
+   "destination_ip=<destination IP address> "
26
+   "source_ip=<source IP address> "
27
+   "port=<port number> "
28
+   "mtu=<maximum transfer unit> "
29
+   "loop=<loopback to local host?> "
30
+   "ttl=<ttl value> "
31
+   "inhibit_auto_suspend=<always|never|only_with_non_monitor_sources> "
32
+   "stream_name=<name of the stream> "
33
+   "enable_opus=<enable OPUS codec>";
34
+
35
 #define NAME "rtp-send"
36
 
37
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
38
@@ -136,19 +166,7 @@
39
 static const struct spa_dict_item module_rtp_send_info = {
40
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
41
    { PW_KEY_MODULE_DESCRIPTION, "Read data from source and send it to the network via RTP/SAP/SDP" },
42
-   { PW_KEY_MODULE_USAGE,  "source=<name of the source> "
43
-               "format=<sample format> "
44
-               "channels=<number of channels> "
45
-               "rate=<sample rate> "
46
-               "destination_ip=<destination IP address> "
47
-               "source_ip=<source IP address> "
48
-               "port=<port number> "
49
-               "mtu=<maximum transfer unit> "
50
-               "loop=<loopback to local host?> "
51
-               "ttl=<ttl value> "
52
-               "inhibit_auto_suspend=<always|never|only_with_non_monitor_sources> "
53
-               "stream_name=<name of the stream> "
54
-               "enable_opus=<enable OPUS codec>" },
55
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
56
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
57
 };
58
 
59
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-simple-protocol-tcp.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-simple-protocol-tcp.c Changed
53
 
1
@@ -8,6 +8,33 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_simple_protocol_tcp Simple TCP Protocol
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-simple-protocol-tcp`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_protocol_simple "libpipewire-module-protocol-simple"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "rate=<sample rate> "
22
+   "format=<sample format> "
23
+   "channels=<number of channels> "
24
+   "channel_map=<number of channels> "
25
+   "sink=<sink to connect to> "
26
+   "source=<source to connect to> "
27
+   "playback=<enable playback?> "
28
+   "record=<enable record?> "
29
+   "port=<TCP port number> "
30
+   "listen=<address to listen on>";
31
+
32
 #define NAME "simple-protocol-tcp"
33
 
34
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
35
@@ -84,16 +111,7 @@
36
 static const struct spa_dict_item module_simple_protocol_tcp_info = {
37
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
38
    { PW_KEY_MODULE_DESCRIPTION, "Simple protocol (TCP sockets)" },
39
-   { PW_KEY_MODULE_USAGE, "rate=<sample rate> "
40
-               "format=<sample format> "
41
-               "channels=<number of channels> "
42
-               "channel_map=<number of channels> "
43
-               "sink=<sink to connect to> "
44
-               "source=<source to connect to> "
45
-               "playback=<enable playback?> "
46
-               "record=<enable record?> "
47
-               "port=<TCP port number> "
48
-               "listen=<address to listen on>" },
49
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
50
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
51
 };
52
 
53
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-switch-on-connect.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-switch-on-connect.c Changed
35
 
1
@@ -15,6 +15,22 @@
2
 #include "../manager.h"
3
 #include "../collect.h"
4
 
5
+/** \page page_pulse_module_switch_on_connect Switch on Connect
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-switch-on-connect`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ */
15
+
16
+static const char *const pulse_module_options =
17
+   "only_from_unavailable=<boolean, only switch from unavailable ports (not implemented yet)> "
18
+   "ignore_virtual=<boolean, ignore new virtual sinks and sources, defaults to true> "
19
+   "blocklist=<regex, ignore matching devices, default=hdmi> ";
20
+
21
 #define NAME "switch-on-connect"
22
 
23
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
24
@@ -215,9 +231,7 @@
25
      "This module exists for Pulseaudio compatibility, and is useful only when some applications "
26
      "try to manage the default sinks/sources themselves and interfere with PipeWire's builtin "
27
      "default device switching." },
28
-   { PW_KEY_MODULE_USAGE, "only_from_unavailable=<boolean, only switch from unavailable ports (not implemented yet)> "
29
-               "ignore_virtual=<boolean, ignore new virtual sinks and sources, defaults to true> "
30
-               "blocklist=<regex, ignore matching devices, default=hdmi> " },
31
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
32
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
33
 };
34
 
35
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-tunnel-sink.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-tunnel-sink.c Changed
54
 
1
@@ -12,6 +12,33 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_tunnel_sink Tunnel Sink
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-tunnel-sink`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_pulse_tunnel "libpipewire-module-pulse-tunnel"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "server=<address> "
22
+   "sink=<name of the remote sink> "
23
+   "sink_name=<name for the local sink> "
24
+   "sink_properties=<properties for the local sink> "
25
+   "format=<sample format> "
26
+   "channels=<number of channels> "
27
+   "rate=<sample rate> "
28
+   "channel_map=<channel map> "
29
+   "latency_msec=<fixed latency in ms> "
30
+   "cookie=<cookie file path>";
31
+
32
 #define NAME "tunnel-sink"
33
 
34
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
35
@@ -92,17 +119,7 @@
36
 static const struct spa_dict_item module_tunnel_sink_info = {
37
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
38
    { PW_KEY_MODULE_DESCRIPTION, "Create a network sink which connects to a remote PulseAudio server" },
39
-   { PW_KEY_MODULE_USAGE,
40
-       "server=<address> "
41
-       "sink=<name of the remote sink> "
42
-       "sink_name=<name for the local sink> "
43
-       "sink_properties=<properties for the local sink> "
44
-       "format=<sample format> "
45
-       "channels=<number of channels> "
46
-       "rate=<sample rate> "
47
-       "channel_map=<channel map> "
48
-       "latency_msec=<fixed latency in ms> "
49
-       "cookie=<cookie file path>" },
50
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
51
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
52
 };
53
 
54
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-tunnel-source.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-tunnel-source.c Changed
54
 
1
@@ -12,6 +12,33 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_tunnel_source Tunnel Source
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-tunnel-source`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_pulse_tunnel "libpipewire-module-pulse-tunnel"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "server=<address> "
22
+   "source=<name of the remote source> "
23
+   "source_name=<name for the local source> "
24
+   "source_properties=<properties for the local source> "
25
+   "format=<sample format> "
26
+   "channels=<number of channels> "
27
+   "rate=<sample rate> "
28
+   "channel_map=<channel map> "
29
+   "latency_msec=<fixed latency in ms> "
30
+   "cookie=<cookie file path>";
31
+
32
 #define NAME "tunnel-source"
33
 
34
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
35
@@ -92,17 +119,7 @@
36
 static const struct spa_dict_item module_tunnel_source_info = {
37
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
38
    { PW_KEY_MODULE_DESCRIPTION, "Create a network source which connects to a remote PulseAudio server" },
39
-   { PW_KEY_MODULE_USAGE,
40
-       "server=<address> "
41
-       "source=<name of the remote source> "
42
-       "source_name=<name for the local source> "
43
-       "source_properties=<properties for the local source> "
44
-       "format=<sample format> "
45
-       "channels=<number of channels> "
46
-       "rate=<sample rate> "
47
-       "channel_map=<channel map> "
48
-       "latency_msec=<fixed latency in ms> "
49
-       "cookie=<cookie file path>" },
50
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
51
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
52
 };
53
 
54
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-virtual-sink.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-virtual-sink.c Changed
47
 
1
@@ -10,6 +10,30 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_virtual_sink Virtual Sink
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-virtual-sink`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_loopback "libpipewire-module-loopback"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "sink_name=<name for the sink> "
22
+   "sink_properties=<properties for the sink> "
23
+   "master=<name of sink to filter> "
24
+   "channels=<number of channels> "
25
+   "channel_map=<channel map> "
26
+   "use_volume_sharing=<yes or no> "
27
+   "force_flat_volume=<yes or no> ";
28
+
29
 #define NAME "virtual-sink"
30
 
31
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
32
@@ -98,13 +122,7 @@
33
 static const struct spa_dict_item module_virtual_sink_info = {
34
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
35
    { PW_KEY_MODULE_DESCRIPTION, "Virtual sink" },
36
-   { PW_KEY_MODULE_USAGE, "sink_name=<name for the sink> "
37
-               "sink_properties=<properties for the sink> "
38
-               "master=<name of sink to filter> "
39
-               "channels=<number of channels> "
40
-               "channel_map=<channel map> "
41
-               "use_volume_sharing=<yes or no> "
42
-               "force_flat_volume=<yes or no> " },
43
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
44
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
45
 };
46
 
47
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-virtual-source.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-virtual-source.c Changed
49
 
1
@@ -11,6 +11,31 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_virtual_source Virtual Source
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-virtual-source`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_loopback "libpipewire-module-loopback"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "source_name=<name for the source> "
22
+   "source_properties=<properties for the source> "
23
+   "master=<name of source to filter> "
24
+   "uplink_sink=<name> (optional)"
25
+   "channels=<number of channels> "
26
+   "channel_map=<channel map> "
27
+   "use_volume_sharing=<yes or no> "
28
+   "force_flat_volume=<yes or no> ";
29
+
30
 #define NAME "virtual-source"
31
 
32
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
33
@@ -99,14 +124,7 @@
34
 static const struct spa_dict_item module_virtual_source_info = {
35
    { PW_KEY_MODULE_AUTHOR, "Arun Raghavan <arun@asymptotic.io>" },
36
    { PW_KEY_MODULE_DESCRIPTION, "Loopback from source to sink" },
37
-   { PW_KEY_MODULE_USAGE, "source_name=<name for the source> "
38
-               "source_properties=<properties for the source> "
39
-               "master=<name of source to filter> "
40
-               "uplink_sink=<name> (optional)"
41
-               "channels=<number of channels> "
42
-               "channel_map=<channel map> "
43
-               "use_volume_sharing=<yes or no> "
44
-               "force_flat_volume=<yes or no> " },
45
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
46
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
47
 };
48
 
49
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-x11-bell.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-x11-bell.c Changed
41
 
1
@@ -6,6 +6,27 @@
2
 
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_x11_bell X11 Bell
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-x11-bell`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_x11_bell "libpipewire-module-x11-bell"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "sink=<sink to connect to> "
22
+   "sample=<the sample to play> "
23
+   "display=<X11 display> "
24
+   "xauthority=<X11 Authority>";
25
+
26
 #define NAME "x11-bell"
27
 
28
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
29
@@ -93,10 +114,7 @@
30
 static const struct spa_dict_item module_x11_bell_info = {
31
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.com>" },
32
    { PW_KEY_MODULE_DESCRIPTION, "X11 bell interceptor" },
33
-   { PW_KEY_MODULE_USAGE,  "sink=<sink to connect to> "
34
-               "sample=<the sample to play> "
35
-               "display=<X11 display> "
36
-               "xauthority=<X11 Authority>" },
37
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
38
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
39
 };
40
 
41
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-zeroconf-discover.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-zeroconf-discover.c Changed
36
 
1
@@ -8,6 +8,24 @@
2
 #include "../defs.h"
3
 #include "../module.h"
4
 
5
+/** \page page_pulse_module_zeroconf_discover Zeroconf Discover
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-zeroconf-discover`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * @pulse_module_options@
14
+ *
15
+ * ## See Also
16
+ *
17
+ * \ref page_module_zeroconf_discover "libpipewire-module-zeroconf-discover"
18
+ */
19
+
20
+static const char *const pulse_module_options =
21
+   "latency_msec=<fixed latency in ms> ";
22
+
23
 #define NAME "zeroconf-discover"
24
 
25
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
26
@@ -84,8 +102,7 @@
27
 static const struct spa_dict_item module_zeroconf_discover_info = {
28
    { PW_KEY_MODULE_AUTHOR, "Wim Taymans <wim.taymans@gmail.con>" },
29
    { PW_KEY_MODULE_DESCRIPTION, "mDNS/DNS-SD Service Discovery" },
30
-   { PW_KEY_MODULE_USAGE,
31
-       "latency_msec=<fixed latency in ms> " },
32
+   { PW_KEY_MODULE_USAGE, pulse_module_options },
33
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
34
 };
35
 
36
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/modules/module-zeroconf-publish.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/modules/module-zeroconf-publish.c Changed
19
 
1
@@ -24,6 +24,17 @@
2
 #include <avahi-common/domain.h>
3
 #include <avahi-common/malloc.h>
4
 
5
+/** \page page_pulse_module_zeroconf_publish Zeroconf Publish
6
+ *
7
+ * ## Module Name
8
+ *
9
+ * `module-zeroconf-publish`
10
+ *
11
+ * ## Module Options
12
+ *
13
+ * No options.
14
+ */
15
+
16
 #define NAME "zeroconf-publish"
17
 
18
 PW_LOG_TOPIC_STATIC(mod_topic, "mod." NAME);
19
pipewire-0.3.85.tar.gz/src/modules/module-protocol-pulse/pulse-server.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-pulse/pulse-server.c Changed
57
 
1
@@ -3770,17 +3770,9 @@
2
            TAG_INVALID);
3
    }
4
    if (client->version >= 15) {
5
-       bool is_linked = collect_is_linked(manager, o->id, SPA_DIRECTION_INPUT);
6
-       int state = node_state(info->state);
7
-
8
-       /* running with nothing linked is probably the monitor that is
9
-        * keeping this sink busy */
10
-       if (state == STATE_RUNNING && !is_linked)
11
-           state = STATE_IDLE;
12
-
13
        message_put(m,
14
            TAG_VOLUME, dev_info.volume_info.base,  /* base volume */
15
-           TAG_U32, state,             /* state */
16
+           TAG_U32, dev_info.state,        /* state */
17
            TAG_U32, dev_info.volume_info.steps,    /* n_volume_steps */
18
            TAG_U32, card ? card->index : SPA_ID_INVALID,   /* card index */
19
            TAG_INVALID);
20
@@ -3974,17 +3966,9 @@
21
            TAG_INVALID);
22
    }
23
    if (client->version >= 15) {
24
-       bool is_linked = collect_is_linked(manager, o->id, SPA_DIRECTION_OUTPUT);
25
-       int state = node_state(info->state);
26
-
27
-       /* running with nothing linked is probably the sink that is
28
-        * keeping this source busy */
29
-       if (state == STATE_RUNNING && !is_linked)
30
-           state = STATE_IDLE;
31
-
32
        message_put(m,
33
            TAG_VOLUME, dev_info.volume_info.base,  /* base volume */
34
-           TAG_U32, state,             /* state */
35
+           TAG_U32, dev_info.state,        /* state */
36
            TAG_U32, dev_info.volume_info.steps,    /* n_volume_steps */
37
            TAG_U32, card ? card->index : SPA_ID_INVALID,   /* card index */
38
            TAG_INVALID);
39
@@ -4104,7 +4088,7 @@
40
            TAG_INVALID);
41
    if (client->version >= 19)
42
        message_put(m,
43
-           TAG_BOOLEAN, info->state != PW_NODE_STATE_RUNNING,      /* corked */
44
+           TAG_BOOLEAN, dev_info.state != STATE_RUNNING,       /* corked */
45
            TAG_INVALID);
46
    if (client->version >= 20)
47
        message_put(m,
48
@@ -4178,7 +4162,7 @@
49
            TAG_INVALID);
50
    if (client->version >= 19)
51
        message_put(m,
52
-           TAG_BOOLEAN, info->state != PW_NODE_STATE_RUNNING,      /* corked */
53
+           TAG_BOOLEAN, dev_info.state != STATE_RUNNING,       /* corked */
54
            TAG_INVALID);
55
    if (client->version >= 22) {
56
        struct format_info fi;
57
pipewire-0.3.85.tar.gz/src/modules/module-protocol-simple.c -> pipewire-1.0.0.tar.gz/src/modules/module-protocol-simple.c Changed
21
 
1
@@ -29,7 +29,7 @@
2
 
3
 #include <pipewire/impl.h>
4
 
5
-/** \page page_module_protocol_simple PipeWire Module: Protocol Simple
6
+/** \page page_module_protocol_simple Protocol Simple
7
  *
8
  * The simple protocol provides a bidirectional audio stream on a network
9
  * socket.
10
@@ -40,6 +40,10 @@
11
  * Each client that connects will create a capture and/or playback stream,
12
  * depending on the configuration options.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-protocol-simple`
17
+ *
18
  * ## Module Options
19
  *
20
  *  - `capture`: boolean if capture is enabled. This will create a capture stream
21
pipewire-0.3.85.tar.gz/src/modules/module-pulse-tunnel.c -> pipewire-1.0.0.tar.gz/src/modules/module-pulse-tunnel.c Changed
21
 
1
@@ -35,7 +35,7 @@
2
 #include "module-protocol-pulse/defs.h"
3
 #include "module-protocol-pulse/format.h"
4
 
5
-/** \page page_module_pulse_tunnel PipeWire Module: Pulse Tunnel
6
+/** \page page_module_pulse_tunnel Pulse Tunnel
7
  *
8
  * The pulse-tunnel module provides a source or sink that tunnels all audio to
9
  * a remote PulseAudio connection.
10
@@ -47,6 +47,10 @@
11
  * automatically load the tunnel with the right parameters based on zeroconf
12
  * information.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-pulse-tunnel`
17
+ *
18
  * ## Module Options
19
  *
20
  * - `tunnel.mode`: the desired tunnel to create, must be `source` or `sink`.
21
pipewire-0.3.85.tar.gz/src/modules/module-raop-discover.c -> pipewire-1.0.0.tar.gz/src/modules/module-raop-discover.c Changed
21
 
1
@@ -26,7 +26,7 @@
2
 #include "module-protocol-pulse/format.h"
3
 #include "module-zeroconf-discover/avahi-poll.h"
4
 
5
-/** \page page_module_raop_discover PipeWire Module: RAOP Discover
6
+/** \page page_module_raop_discover RAOP Discover
7
  *
8
  * Automatically creates RAOP (Airplay) sink devices based on zeroconf
9
  * information.
10
@@ -37,6 +37,10 @@
11
  * If no stream.rules are given, it will create a sink for all announced
12
  * streams.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-raop-discover`
17
+ *
18
  * ## Module Options
19
  *
20
  * Options specific to the behavior of this module
21
pipewire-0.3.85.tar.gz/src/modules/module-raop-sink.c -> pipewire-1.0.0.tar.gz/src/modules/module-raop-sink.c Changed
21
 
1
@@ -47,7 +47,7 @@
2
 #include "module-rtp/rtp.h"
3
 #include "module-rtp/stream.h"
4
 
5
-/** \page page_module_raop_sink PipeWire Module: AirPlay Sink
6
+/** \page page_module_raop_sink AirPlay Sink
7
  *
8
  * Creates a new Sink to stream to an Airplay device.
9
  *
10
@@ -55,6 +55,10 @@
11
  * with the right parameters but it is possible to manually create a RAOP sink
12
  * as well.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-raop-sink`
17
+ *
18
  * ## Module Options
19
  *
20
  * Options specific to the behavior of this module
21
pipewire-0.3.85.tar.gz/src/modules/module-roc-sink.c -> pipewire-1.0.0.tar.gz/src/modules/module-roc-sink.c Changed
201
 
1
@@ -19,17 +19,22 @@
2
 #include <roc/log.h>
3
 #include <roc/sender.h>
4
 
5
+#include <pipewire/cleanup.h>
6
 #include <pipewire/pipewire.h>
7
 #include <pipewire/impl.h>
8
 
9
 #include "module-roc/common.h"
10
 
11
-/** \page page_module_roc_sink PipeWire Module: ROC sink
12
+/** \page page_module_roc_sink ROC sink
13
  *
14
  * The `roc-sink` module creates a PipeWire sink that sends samples to
15
  * a preconfigured receiver address. One can then connect an audio stream
16
  * of any running application to that sink or make it the default sink.
17
  *
18
+ * ## Module Name
19
+ *
20
+ * `libpipewire-module-roc-sink`
21
+ *
22
  * ## Module Options
23
  *
24
  * Options specific to the behavior of this module
25
@@ -39,6 +44,7 @@
26
  * - `remote.ip = <str>`: remote receiver ip
27
  * - `remote.source.port = <str>`: remote receiver TCP/UDP port for source packets
28
  * - `remote.repair.port = <str>`: remote receiver TCP/UDP port for receiver packets
29
+ * - `remote.control.port = <str>`: remote receiver TCP/UDP port for control packets
30
  * - `fec.code = <str>`: Possible values: `disable`, `rs8m`, `ldpc`
31
  *
32
  * ## General options
33
@@ -58,6 +64,7 @@
34
  *          remote.ip = 192.168.0.244
35
  *          remote.source.port = 10001
36
  *          remote.repair.port = 10002
37
+ *          remote.control.port = 10003
38
  *          sink.name = "ROC Sink"
39
  *          sink.props = {
40
  *             node.name = "roc-sink"
41
@@ -77,7 +84,6 @@
42
 struct module_roc_sink_data {
43
    struct pw_impl_module *module;
44
    struct spa_hook module_listener;
45
-   struct pw_properties *props;
46
    struct pw_context *module_context;
47
 
48
    struct pw_core *core;
49
@@ -100,6 +106,9 @@
50
    char *remote_ip;
51
    int remote_source_port;
52
    int remote_repair_port;
53
+
54
+   roc_endpoint *remote_control_addr;
55
+   int remote_control_port;
56
 };
57
 
58
 static void stream_destroy(void *d)
59
@@ -207,17 +216,13 @@
60
        pw_core_disconnect(data->core);
61
 
62
    pw_properties_free(data->capture_props);
63
-   pw_properties_free(data->props);
64
 
65
-   if (data->sender)
66
-       roc_sender_close(data->sender);
67
-   if (data->context)
68
-       roc_context_close(data->context);
69
+   spa_clear_ptr(data->sender, roc_sender_close);
70
+   spa_clear_ptr(data->context, roc_context_close);
71
 
72
-   if (data->remote_source_addr)
73
-       (void) roc_endpoint_deallocate(data->remote_source_addr);
74
-   if (data->remote_repair_addr)
75
-       (void) roc_endpoint_deallocate(data->remote_repair_addr);
76
+   spa_clear_ptr(data->remote_source_addr, roc_endpoint_deallocate);
77
+   spa_clear_ptr(data->remote_repair_addr, roc_endpoint_deallocate);
78
+   spa_clear_ptr(data->remote_control_addr, roc_endpoint_deallocate);
79
 
80
    free(data->remote_ip);
81
    free(data);
82
@@ -255,11 +260,11 @@
83
        return -EINVAL;
84
    }
85
 
86
-   memset(&sender_config, 0, sizeof(sender_config));
87
+   spa_zero(sender_config);
88
 
89
-   sender_config.frame_sample_rate = data->rate;
90
-   sender_config.frame_channels = ROC_CHANNEL_SET_STEREO;
91
-   sender_config.frame_encoding = ROC_FRAME_ENCODING_PCM_FLOAT;
92
+   sender_config.frame_encoding.rate = data->rate;
93
+   sender_config.frame_encoding.channels = ROC_CHANNEL_LAYOUT_STEREO;
94
+   sender_config.frame_encoding.format = ROC_FORMAT_PCM_FLOAT32;
95
    sender_config.fec_encoding = data->fec_code;
96
 
97
    info.rate = data->rate;
98
@@ -278,21 +283,7 @@
99
        return -EINVAL;
100
    }
101
 
102
-   switch (data->fec_code) {
103
-   case ROC_FEC_ENCODING_DEFAULT:
104
-   case ROC_FEC_ENCODING_RS8M:
105
-       audio_proto = ROC_PROTO_RTP_RS8M_SOURCE;
106
-       repair_proto = ROC_PROTO_RS8M_REPAIR;
107
-       break;
108
-   case ROC_FEC_ENCODING_LDPC_STAIRCASE:
109
-       audio_proto = ROC_PROTO_RTP_LDPC_SOURCE;
110
-       repair_proto = ROC_PROTO_LDPC_REPAIR;
111
-       break;
112
-   default:
113
-       audio_proto = ROC_PROTO_RTP;
114
-       repair_proto = 0;
115
-       break;
116
-   }
117
+   pw_roc_fec_encoding_to_proto(data->fec_code, &audio_proto, &repair_proto);
118
 
119
    res = pw_roc_create_endpoint(&data->remote_source_addr, audio_proto, data->remote_ip, data->remote_source_port);
120
    if (res < 0) {
121
@@ -320,6 +311,18 @@
122
        }
123
    }
124
 
125
+   res = pw_roc_create_endpoint(&data->remote_control_addr, PW_ROC_DEFAULT_CONTROL_PROTO, data->remote_ip, data->remote_control_port);
126
+   if (res < 0) {
127
+       pw_log_error("failed to create control endpoint: %s", spa_strerror(res));
128
+       return res;
129
+   }
130
+
131
+   if (roc_sender_connect(data->sender, ROC_SLOT_DEFAULT, ROC_INTERFACE_AUDIO_CONTROL,
132
+               data->remote_control_addr) != 0) {
133
+       pw_log_error("can't connect roc sender to remote control address");
134
+       return -EINVAL;
135
+   }
136
+
137
    data->capture = pw_stream_new(data->core,
138
            "roc-sink capture", data->capture_props);
139
    data->capture_props = NULL;
140
@@ -354,6 +357,7 @@
141
                "remote.ip=<remote receiver ip> "
142
                "( remote.source.port=<remote receiver port for source packets> ) "
143
                "( remote.repair.port=<remote receiver port for repair packets> ) "
144
+               "( remote.control.port=<remote receiver port for control packets> ) "
145
                "( sink.props= { key=val ... } ) " },
146
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
147
 };
148
@@ -363,7 +367,7 @@
149
 {
150
    struct pw_context *context = pw_impl_module_get_context(module);
151
    struct module_roc_sink_data *data;
152
-   struct pw_properties *props = NULL, *capture_props = NULL;
153
+   struct pw_properties *capture_props = NULL;
154
    const char *str;
155
    int res = 0;
156
 
157
@@ -376,13 +380,12 @@
158
    if (args == NULL)
159
        args = "";
160
 
161
-   props = pw_properties_new_string(args);
162
+   spa_autoptr(pw_properties) props = pw_properties_new_string(args);
163
    if (props == NULL) {
164
        res = -errno;
165
        pw_log_error( "can't create properties: %m");
166
        goto out;
167
    }
168
-   data->props = props;
169
 
170
    capture_props = pw_properties_new(NULL, NULL);
171
    if (capture_props == NULL) {
172
@@ -397,7 +400,6 @@
173
 
174
    if ((str = pw_properties_get(props, "sink.name")) != NULL) {
175
        pw_properties_set(capture_props, PW_KEY_NODE_NAME, str);
176
-       pw_properties_set(props, "sink.name", NULL);
177
    }
178
 
179
    if ((str = pw_properties_get(props, "sink.props")) != NULL)
180
@@ -414,13 +416,12 @@
181
    if ((str = pw_properties_get(capture_props, PW_KEY_MEDIA_CLASS)) == NULL)
182
        pw_properties_set(capture_props, PW_KEY_MEDIA_CLASS, "Audio/Sink");
183
 
184
-   data->rate = pw_properties_get_uint32(capture_props, PW_KEY_AUDIO_RATE, data->rate);
185
+   data->rate = pw_properties_get_uint32(capture_props, PW_KEY_AUDIO_RATE, 0);
186
    if (data->rate == 0)
187
        data->rate = PW_ROC_DEFAULT_RATE;
188
 
189
    if ((str = pw_properties_get(props, "remote.ip")) != NULL) {
190
        data->remote_ip = strdup(str);
191
-       pw_properties_set(props, "remote.ip", NULL);
192
    } else {
193
        pw_log_error("Remote IP not specified");
194
        res = -EINVAL;
195
@@ -429,24 +430,28 @@
196
 
197
    if ((str = pw_properties_get(props, "remote.source.port")) != NULL) {
198
        data->remote_source_port = pw_properties_parse_int(str);
199
-       pw_properties_set(props, "remote.source.port", NULL);
200
    } else {
201
pipewire-0.3.85.tar.gz/src/modules/module-roc-source.c -> pipewire-1.0.0.tar.gz/src/modules/module-roc-source.c Changed
201
 
1
@@ -19,17 +19,22 @@
2
 #include <roc/log.h>
3
 #include <roc/receiver.h>
4
 
5
+#include <pipewire/cleanup.h>
6
 #include <pipewire/pipewire.h>
7
 #include <pipewire/impl.h>
8
 
9
 #include "module-roc/common.h"
10
 
11
-/** \page page_module_roc_source PipeWire Module: ROC source
12
+/** \page page_module_roc_source ROC source
13
  *
14
  * The `roc-source` module creates a PipeWire source that receives samples
15
  * from ROC sender and passes them to the sink it is connected to. One can
16
  * then connect it to any audio device.
17
  *
18
+ * ## Module Name
19
+ *
20
+ * `libpipewire-module-roc-source`
21
+ *
22
  * ## Module Options
23
  *
24
  * Options specific to the behavior of this module
25
@@ -39,6 +44,7 @@
26
  * - `local.ip = <str>`: local sender ip
27
  * - `local.source.port = <str>`: local receiver TCP/UDP port for source packets
28
  * - `local.repair.port = <str>`: local receiver TCP/UDP port for receiver packets
29
+ * - `local.control.port = <str>`: local receiver TCP/UDP port for control packets
30
  * - `sess.latency.msec = <str>`: target network latency in milliseconds
31
  * - `resampler.profile = <str>`: Possible values: `disable`, `high`,
32
  *   `medium`, `low`.
33
@@ -63,6 +69,7 @@
34
  *          sess.latency.msec = 5000
35
  *          local.source.port = 10001
36
  *          local.repair.port = 10002
37
+ *          local.control.port = 10003
38
  *          source.name = "ROC Source"
39
  *          source.props = {
40
  *             node.name = "roc-source"
41
@@ -82,7 +89,6 @@
42
 struct module_roc_source_data {
43
    struct pw_impl_module *module;
44
    struct spa_hook module_listener;
45
-   struct pw_properties *props;
46
    struct pw_context *module_context;
47
 
48
    struct pw_core *core;
49
@@ -108,6 +114,9 @@
50
    int local_source_port;
51
    int local_repair_port;
52
    int sess_latency_msec;
53
+
54
+   roc_endpoint *local_control_addr;
55
+   int local_control_port;
56
 };
57
 
58
 static void stream_destroy(void *d)
59
@@ -216,17 +225,13 @@
60
        pw_core_disconnect(data->core);
61
 
62
    pw_properties_free(data->playback_props);
63
-   pw_properties_free(data->props);
64
 
65
-   if (data->receiver)
66
-       roc_receiver_close(data->receiver);
67
-   if (data->context)
68
-       roc_context_close(data->context);
69
+   spa_clear_ptr(data->receiver, roc_receiver_close);
70
+   spa_clear_ptr(data->context, roc_context_close);
71
 
72
-   if (data->local_source_addr)
73
-       (void) roc_endpoint_deallocate(data->local_source_addr);
74
-   if (data->local_repair_addr)
75
-       (void) roc_endpoint_deallocate(data->local_repair_addr);
76
+   spa_clear_ptr(data->local_source_addr, roc_endpoint_deallocate);
77
+   spa_clear_ptr(data->local_repair_addr, roc_endpoint_deallocate);
78
+   spa_clear_ptr(data->local_control_addr, roc_endpoint_deallocate);
79
 
80
    free(data->local_ip);
81
    free(data);
82
@@ -264,9 +269,10 @@
83
    }
84
 
85
    spa_zero(receiver_config);
86
-   receiver_config.frame_sample_rate = data->rate;
87
-   receiver_config.frame_channels = ROC_CHANNEL_SET_STEREO;
88
-   receiver_config.frame_encoding = ROC_FRAME_ENCODING_PCM_FLOAT;
89
+
90
+   receiver_config.frame_encoding.rate = data->rate;
91
+   receiver_config.frame_encoding.channels = ROC_CHANNEL_LAYOUT_STEREO;
92
+   receiver_config.frame_encoding.format = ROC_FORMAT_PCM_FLOAT32;
93
    receiver_config.resampler_profile = data->resampler_profile;
94
 
95
    info.rate = data->rate;
96
@@ -291,7 +297,7 @@
97
     * See API reference:
98
     * https://roc-streaming.org/toolkit/docs/api/reference.html
99
     */
100
-   receiver_config.target_latency = (unsigned long long)data->sess_latency_msec * 1000000ULL;
101
+   receiver_config.target_latency = (unsigned long long)data->sess_latency_msec * SPA_NSEC_PER_MSEC;
102
 
103
    res = roc_receiver_open(data->context, &receiver_config, &data->receiver);
104
    if (res) {
105
@@ -299,21 +305,7 @@
106
        return -EINVAL;
107
    }
108
 
109
-   switch (data->fec_code) {
110
-   case ROC_FEC_ENCODING_DEFAULT:
111
-   case ROC_FEC_ENCODING_RS8M:
112
-       audio_proto = ROC_PROTO_RTP_RS8M_SOURCE;
113
-       repair_proto = ROC_PROTO_RS8M_REPAIR;
114
-       break;
115
-   case ROC_FEC_ENCODING_LDPC_STAIRCASE:
116
-       audio_proto = ROC_PROTO_RTP_LDPC_SOURCE;
117
-       repair_proto = ROC_PROTO_LDPC_REPAIR;
118
-       break;
119
-   default:
120
-       audio_proto = ROC_PROTO_RTP;
121
-       repair_proto = 0;
122
-       break;
123
-   }
124
+   pw_roc_fec_encoding_to_proto(data->fec_code, &audio_proto, &repair_proto);
125
 
126
    res = pw_roc_create_endpoint(&data->local_source_addr, audio_proto, data->local_ip, data->local_source_port);
127
    if (res < 0) {
128
@@ -341,6 +333,18 @@
129
        }
130
    }
131
 
132
+   res = pw_roc_create_endpoint(&data->local_control_addr, PW_ROC_DEFAULT_CONTROL_PROTO, data->local_ip, data->local_control_port);
133
+   if (res < 0) {
134
+       pw_log_error("failed to create control endpoint: %s", spa_strerror(res));
135
+       return res;
136
+   }
137
+
138
+   if (roc_receiver_bind(data->receiver, ROC_SLOT_DEFAULT, ROC_INTERFACE_AUDIO_CONTROL,
139
+               data->local_control_addr) != 0) {
140
+       pw_log_error("can't connect roc receiver to local control address");
141
+       return -EINVAL;
142
+   }
143
+
144
    data->playback = pw_stream_new(data->core,
145
            "roc-source playback", data->playback_props);
146
    data->playback_props = NULL;
147
@@ -378,6 +382,7 @@
148
                "( local.ip=<local receiver ip> ) "
149
                "( local.source.port=<local receiver port for source packets> ) "
150
                "( local.repair.port=<local receiver port for repair packets> ) "
151
+               "( local.control.port=<local receiver port for control packets> ) "
152
                "( source.props= { key=value ... } ) " },
153
    { PW_KEY_MODULE_VERSION, PACKAGE_VERSION },
154
 };
155
@@ -387,7 +392,7 @@
156
 {
157
    struct pw_context *context = pw_impl_module_get_context(module);
158
    struct module_roc_source_data *data;
159
-   struct pw_properties *props = NULL, *playback_props = NULL;
160
+   struct pw_properties *playback_props = NULL;
161
    const char *str;
162
    int res = 0;
163
 
164
@@ -400,13 +405,12 @@
165
    if (args == NULL)
166
        args = "";
167
 
168
-   props = pw_properties_new_string(args);
169
+   spa_autoptr(pw_properties) props = pw_properties_new_string(args);
170
    if (props == NULL) {
171
        res = -errno;
172
        pw_log_error( "can't create properties: %m");
173
        goto out;
174
    }
175
-   data->props = props;
176
 
177
    playback_props = pw_properties_new(NULL, NULL);
178
    if (playback_props == NULL) {
179
@@ -421,7 +425,6 @@
180
 
181
    if ((str = pw_properties_get(props, "source.name")) != NULL) {
182
        pw_properties_set(playback_props, PW_KEY_NODE_NAME, str);
183
-       pw_properties_set(props, "source.name", NULL);
184
    }
185
 
186
    if ((str = pw_properties_get(props, "source.props")) != NULL)
187
@@ -436,34 +439,36 @@
188
    if (pw_properties_get(playback_props, PW_KEY_NODE_NETWORK) == NULL)
189
        pw_properties_set(playback_props, PW_KEY_NODE_NETWORK, "true");
190
 
191
-   data->rate = pw_properties_get_uint32(playback_props, PW_KEY_AUDIO_RATE, data->rate);
192
+   data->rate = pw_properties_get_uint32(playback_props, PW_KEY_AUDIO_RATE, 0);
193
    if (data->rate == 0)
194
        data->rate = PW_ROC_DEFAULT_RATE;
195
 
196
    if ((str = pw_properties_get(props, "local.ip")) != NULL) {
197
        data->local_ip = strdup(str);
198
-       pw_properties_set(props, "local.ip", NULL);
199
    } else {
200
        data->local_ip = strdup(PW_ROC_DEFAULT_IP);
201
pipewire-0.3.85.tar.gz/src/modules/module-roc/common.h -> pipewire-1.0.0.tar.gz/src/modules/module-roc/common.h Changed
45
 
1
@@ -9,8 +9,10 @@
2
 #define PW_ROC_DEFAULT_IP "0.0.0.0"
3
 #define PW_ROC_DEFAULT_SOURCE_PORT 10001
4
 #define PW_ROC_DEFAULT_REPAIR_PORT 10002
5
+#define PW_ROC_DEFAULT_CONTROL_PORT 10003
6
 #define PW_ROC_DEFAULT_SESS_LATENCY 200
7
 #define PW_ROC_DEFAULT_RATE 44100
8
+#define PW_ROC_DEFAULT_CONTROL_PROTO ROC_PROTO_RTCP
9
 
10
 static inline int pw_roc_parse_fec_encoding(roc_fec_encoding *out, const char *str)
11
 {
12
@@ -31,8 +33,6 @@
13
 {
14
    if (!str || !*str)
15
        *out = ROC_RESAMPLER_PROFILE_DEFAULT;
16
-   else if (spa_streq(str, "disable"))
17
-       *out = ROC_RESAMPLER_PROFILE_DISABLE;
18
    else if (spa_streq(str, "high"))
19
        *out = ROC_RESAMPLER_PROFILE_HIGH;
20
    else if (spa_streq(str, "medium"))
21
@@ -68,4 +68,23 @@
22
    return -EINVAL;
23
 }
24
 
25
+static inline void pw_roc_fec_encoding_to_proto(roc_fec_encoding fec_code, roc_protocol *audio, roc_protocol *repair)
26
+{
27
+   switch (fec_code) {
28
+   case ROC_FEC_ENCODING_DEFAULT:
29
+   case ROC_FEC_ENCODING_RS8M:
30
+       *audio = ROC_PROTO_RTP_RS8M_SOURCE;
31
+       *repair = ROC_PROTO_RS8M_REPAIR;
32
+       break;
33
+   case ROC_FEC_ENCODING_LDPC_STAIRCASE:
34
+       *audio = ROC_PROTO_RTP_LDPC_SOURCE;
35
+       *repair = ROC_PROTO_LDPC_REPAIR;
36
+       break;
37
+   default:
38
+       *audio = ROC_PROTO_RTP;
39
+       *repair = 0;
40
+       break;
41
+   }
42
+}
43
+
44
 #endif /* MODULE_ROC_COMMON_H */
45
pipewire-0.3.85.tar.gz/src/modules/module-rt.c -> pipewire-1.0.0.tar.gz/src/modules/module-rt.c Changed
128
 
1
@@ -57,7 +57,7 @@
2
 #include <dbus/dbus.h>
3
 #endif
4
 
5
-/** \page page_module_rt PipeWire Module: RT
6
+/** \page page_module_rt RT
7
  *
8
  * The `rt` modules can give real-time priorities to processing threads.
9
  *
10
@@ -69,6 +69,10 @@
11
  * up and DBus is available, then this module will fall back to using the Portal
12
  * Realtime DBus API or RTKit.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-rt`
17
+ *
18
  * ## Module Options
19
  *
20
  * - `nice.level`: The nice value set for the application thread. It improves
21
@@ -226,6 +230,8 @@
22
 #define RLIMIT_RTTIME 15
23
 #endif
24
 
25
+static pthread_mutex_t rlimit_lock = PTHREAD_MUTEX_INITIALIZER;
26
+
27
 static pid_t _gettid(void)
28
 {
29
 #if defined(HAVE_GETTID)
30
@@ -552,11 +558,12 @@
31
    struct rlimit old_rlim;
32
    struct rlimit no_rlim = { -1, -1 };
33
    int try = 0;
34
+   bool ret = false;
35
 
36
    if (!impl->rlimits_enabled)
37
-       return false;
38
+       return ret;
39
 
40
-   while (try++ < 2) {
41
+   while (!ret && try++ < 2) {
42
        /* We could check `RLIMIT_RTPRIO`, but the BSDs generally don't have
43
         * that available, and there are also other ways to use realtime
44
         * scheduling without that rlimit being set such as `CAP_SYS_NICE` or
45
@@ -564,11 +571,11 @@
46
         * just try if setting realtime scheduling works or not. */
47
        if ((err = pthread_getschedparam(pthread_self(), &old_policy, &old_sched_params)) != 0) {
48
            pw_log_warn("Failed to check RLIMIT_RTPRIO: %s", strerror(err));
49
-           return false;
50
+           break;
51
        }
52
        if ((err = get_rt_priority_range(&min, &max)) < 0) {
53
            pw_log_warn("Failed to get priority range: %s", strerror(err));
54
-           return false;
55
+           break;
56
        }
57
        if (try == 2) {
58
 #ifdef RLIMIT_RTPRIO
59
@@ -584,7 +591,7 @@
60
        }
61
        if (max < DEFAULT_RT_PRIO_MIN) {
62
            pw_log_info("Priority max (%d) must be at least %d", max, DEFAULT_RT_PRIO_MIN);
63
-           return false;
64
+           break;
65
        }
66
 
67
        /* If the current scheduling policy has `SCHED_RESET_ON_FORK` set, then
68
@@ -598,24 +605,29 @@
69
        if ((old_policy & PW_SCHED_RESET_ON_FORK) != 0)
70
            new_policy |= PW_SCHED_RESET_ON_FORK;
71
 
72
-       /* Disable RLIMIT_RTTIME while trying new_policy. */
73
-       if ((err = getrlimit(RLIMIT_RTTIME, &old_rlim)) < 0)
74
-           pw_log_debug("getrlimit() failed: %s", spa_strerror(err));
75
-       if ((err = setrlimit(RLIMIT_RTTIME, &no_rlim)) < 0)
76
-           pw_log_debug("setrlimit() failed: %s", spa_strerror(err));
77
-
78
-       if (pthread_setschedparam(pthread_self(), new_policy, &new_sched_params) == 0) {
79
+       /* Disable RLIMIT_RTTIME in a thread safe way and hope that the application
80
+        * doesn't also set RLIMIT_RTTIME while trying new_policy. */
81
+       pthread_mutex_lock(&rlimit_lock);
82
+       if (getrlimit(RLIMIT_RTTIME, &old_rlim) < 0)
83
+           pw_log_info("getrlimit() failed: %m");
84
+       if (setrlimit(RLIMIT_RTTIME, &no_rlim) < 0)
85
+           pw_log_info("setrlimit() failed: %m");
86
+       if ((err = pthread_setschedparam(pthread_self(), new_policy, &new_sched_params)) == 0) {
87
            impl->rt_prio = new_sched_params.sched_priority;
88
            pthread_setschedparam(pthread_self(), old_policy, &old_sched_params);
89
-           if ((err = setrlimit(RLIMIT_RTTIME, &old_rlim)) < 0)
90
-               pw_log_debug("setrlimit() failed: %s", spa_strerror(err));
91
-           return true;
92
-       }
93
-       if ((err = setrlimit(RLIMIT_RTTIME, &old_rlim)) < 0)
94
-           pw_log_debug("setrlimit() failed: %s", spa_strerror(err));
95
+           ret = true;
96
+       } else
97
+           pw_log_info("failed to set realtime policy: %s", strerror(err));
98
+       if (setrlimit(RLIMIT_RTTIME, &old_rlim) < 0)
99
+           pw_log_info("setrlimit() failed: %m");
100
+       pthread_mutex_unlock(&rlimit_lock);
101
    }
102
-   pw_log_info("Can't set rt prio to %d: %m (try increasing rlimits)", (int)priority);
103
-   return false;
104
+
105
+   if (ret)
106
+       pw_log_debug("can set rt prio to %d", (int)priority);
107
+   else
108
+       pw_log_info("can't set rt prio to %d (try increasing rlimits)", (int)priority);
109
+   return ret;
110
 }
111
 
112
 static int sched_set_nice(pid_t pid, int nice_level)
113
@@ -664,11 +676,13 @@
114
 {
115
    int res = 0;
116
 
117
+   pthread_mutex_lock(&rlimit_lock);
118
    if (setrlimit(RLIMIT_RTTIME, rlim) < 0)
119
        res = -errno;
120
+   pthread_mutex_unlock(&rlimit_lock);
121
 
122
    if (res < 0)
123
-       pw_log_debug("setrlimit() failed: %s", spa_strerror(res));
124
+       pw_log_info("setrlimit() failed: %s", spa_strerror(res));
125
    else
126
        pw_log_debug("rt.time.soft:%"PRIi64" rt.time.hard:%"PRIi64,
127
                (int64_t)rlim->rlim_cur, (int64_t)rlim->rlim_max);
128
pipewire-0.3.85.tar.gz/src/modules/module-rtp-sap.c -> pipewire-1.0.0.tar.gz/src/modules/module-rtp-sap.c Changed
21
 
1
@@ -28,7 +28,7 @@
2
 #define ifr_ifindex ifr_index
3
 #endif
4
 
5
-/** \page page_module_rtp_sap PipeWire Module: SAP Announce and create RTP streams
6
+/** \page page_module_rtp_sap SAP Announce and create RTP streams
7
  *
8
  * The `rtp-sap` module announces RTP streams that match the rules with the
9
  * announce-stream action.
10
@@ -40,6 +40,10 @@
11
  * sess.sap.announce = true and it will create a receiver for all announced
12
  * streams.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-rtp-sap`
17
+ *
18
  * ## Module Options
19
  *
20
  * Options specific to the behavior of this module
21
pipewire-0.3.85.tar.gz/src/modules/module-rtp-session.c -> pipewire-1.0.0.tar.gz/src/modules/module-rtp-session.c Changed
21
 
1
@@ -41,7 +41,7 @@
2
 #define ifr_ifindex ifr_index
3
 #endif
4
 
5
-/** \page page_module_rtp_session PipeWire Module: RTP session
6
+/** \page page_module_rtp_session RTP session
7
  *
8
  * The `rtp-session` module creates a media session that is announced
9
  * with avahi/mDNS/Bonjour.
10
@@ -52,6 +52,10 @@
11
  * The session setup is based on apple-midi and is compatible with
12
  * apple-midi when the session is using midi.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-rtp-session`
17
+ *
18
  * ## Module Options
19
  *
20
  * Options specific to the behavior of this module
21
pipewire-0.3.85.tar.gz/src/modules/module-rtp-sink.c -> pipewire-1.0.0.tar.gz/src/modules/module-rtp-sink.c Changed
18
 
1
@@ -32,11 +32,15 @@
2
 #define IPTOS_DSCP(x) ((x) & IPTOS_DSCP_MASK)
3
 #endif
4
 
5
-/** \page page_module_rtp_sink PipeWire Module: RTP sink
6
+/** \page page_module_rtp_sink RTP sink
7
  *
8
  * The `rtp-sink` module creates a PipeWire sink that sends audio
9
  * RTP packets.
10
  *
11
+ * ## Module Name
12
+ *
13
+ * `libpipewire-module-rtp-sink`
14
+ *
15
  * ## Module Options
16
  *
17
  * Options specific to the behavior of this module
18
pipewire-0.3.85.tar.gz/src/modules/module-rtp-source.c -> pipewire-1.0.0.tar.gz/src/modules/module-rtp-source.c Changed
21
 
1
@@ -35,7 +35,7 @@
2
 #define ifr_ifindex ifr_index
3
 #endif
4
 
5
-/** \page page_module_rtp_source PipeWire Module: RTP source
6
+/** \page page_module_rtp_source RTP source
7
  *
8
  * The `rtp-source` module creates a PipeWire source that receives audio
9
  * and midi RTP packets.
10
@@ -43,6 +43,10 @@
11
  * This module is usually loaded from the \ref page_module_rtp_sap so that the
12
  * source.ip and source.port and format parameters matches that of the sender.
13
  *
14
+ * ## Module Name
15
+ *
16
+ * `libpipewire-module-rtp-source`
17
+ *
18
  * ## Module Options
19
  *
20
  * Options specific to the behavior of this module
21
pipewire-0.3.85.tar.gz/src/modules/module-rtp/stream.c -> pipewire-1.0.0.tar.gz/src/modules/module-rtp/stream.c Changed
10
 
1
@@ -420,7 +420,7 @@
2
    } else {
3
        impl->psamples = impl->mtu / impl->stride;
4
        impl->psamples = SPA_CLAMP(impl->psamples, min_samples, max_samples);
5
-       if (direction == PW_DIRECTION_OUTPUT)
6
+       if (direction == PW_DIRECTION_INPUT)
7
            pw_properties_setf(props, "rtp.ptime", "%f",
8
                    impl->psamples * 1000.0 / impl->rate);
9
    }
10
pipewire-0.3.85.tar.gz/src/modules/module-session-manager.c -> pipewire-1.0.0.tar.gz/src/modules/module-session-manager.c Changed
17
 
1
@@ -7,10 +7,14 @@
2
 
3
 #include <pipewire/impl.h>
4
 
5
-/** \page page_module_session_manager PipeWire Module: Session Manager
6
+/** \page page_module_session_manager Session Manager
7
  *
8
  * This module implements some usefull objects for implementing a session
9
  * manager. It is not yet actively used.
10
+ *
11
+ * ## Module Name
12
+ *
13
+ * `libpipewire-module-session-manager`
14
  */
15
 
16
 /* client-endpoint.c */
17
pipewire-0.3.85.tar.gz/src/modules/module-vban-recv.c -> pipewire-1.0.0.tar.gz/src/modules/module-vban-recv.c Changed
18
 
1
@@ -35,11 +35,15 @@
2
 #define ifr_ifindex ifr_index
3
 #endif
4
 
5
-/** \page page_module_vban_recv PipeWire Module: VBAN receiver
6
+/** \page page_module_vban_recv VBAN receiver
7
  *
8
  * The `vban-recv` module creates a PipeWire source that receives audio
9
  * and midi VBAN(https://vb-audio.com) packets.
10
  *
11
+ * ## Module Name
12
+ *
13
+ * `libpipewire-module-vban-recv`
14
+ *
15
  * ## Module Options
16
  *
17
  * Options specific to the behavior of this module
18
pipewire-0.3.85.tar.gz/src/modules/module-vban-send.c -> pipewire-1.0.0.tar.gz/src/modules/module-vban-send.c Changed
18
 
1
@@ -32,11 +32,15 @@
2
 #define IPTOS_DSCP(x) ((x) & IPTOS_DSCP_MASK)
3
 #endif
4
 
5
-/** \page page_module_vban_send PipeWire Module: VBAN sender
6
+/** \page page_module_vban_send VBAN sender
7
  *
8
  * The `vban-send` module creates a PipeWire sink that sends
9
  * audio and midi VBAN(https://vb-audio.com) packets.
10
  *
11
+ * ## Module Name
12
+ *
13
+ * `libpipewire-module-vban-send`
14
+ *
15
  * ## Module Options
16
  *
17
  * Options specific to the behavior of this module
18
pipewire-0.3.85.tar.gz/src/modules/module-x11-bell.c -> pipewire-1.0.0.tar.gz/src/modules/module-x11-bell.c Changed
18
 
1
@@ -27,11 +27,15 @@
2
 #include <pipewire/pipewire.h>
3
 #include <pipewire/impl.h>
4
 
5
-/** \page page_module_x11_bell PipeWire Module: X11 Bell
6
+/** \page page_module_x11_bell X11 Bell
7
  *
8
  * The `x11-bell` module intercept the X11 bell events and uses libcanberra to
9
  * play a sound.
10
  *
11
+ * ## Module Name
12
+ *
13
+ * `libpipewire-module-x11-bell`
14
+ *
15
  * ## Module Options
16
  *
17
  * - `sink.name = <str>`: node.name of the sink to connect to
18
pipewire-0.3.85.tar.gz/src/modules/module-zeroconf-discover.c -> pipewire-1.0.0.tar.gz/src/modules/module-zeroconf-discover.c Changed
20
 
1
@@ -27,13 +27,17 @@
2
 #include "module-protocol-pulse/format.h"
3
 #include "module-zeroconf-discover/avahi-poll.h"
4
 
5
-/** \page page_module_zeroconf_discover PipeWire Module: Zeroconf Discover
6
+/** \page page_module_zeroconf_discover Zeroconf Discover
7
  *
8
  * Use zeroconf to detect and load module-pulse-tunnel with the right
9
  * parameters. This will automatically create sinks and sources to stream
10
  * audio to/from remote PulseAudio servers. It also works with
11
  * module-protocol-pulse.
12
  *
13
+ * ## Module Name
14
+ *
15
+ * `libpipewire-module-zeroconf-discover`
16
+ *
17
  * ## Module Options
18
  *
19
  * - `pulse.latency`: the latency to end-to-end latency in milliseconds to
20
pipewire-0.3.85.tar.gz/src/pipewire/filter.c -> pipewire-1.0.0.tar.gz/src/pipewire/filter.c Changed
10
 
1
@@ -1334,7 +1334,7 @@
2
    if (props == NULL)
3
        return NULL;
4
 
5
-   context = pw_context_new(loop, NULL, 0);
6
+   context = pw_context_new(loop, pw_properties_copy(props), 0);
7
    if (context == NULL) {
8
        res = -errno;
9
        goto error_cleanup;
10
pipewire-0.3.85.tar.gz/src/pipewire/impl-client.c -> pipewire-1.0.0.tar.gz/src/pipewire/impl-client.c Changed
18
 
1
@@ -165,7 +165,7 @@
2
 
3
    /* Refuse specific restricted keys */
4
    if (has_key(ignored, key))
5
-       goto deny;
6
+       goto ignore;
7
 
8
    /* Refuse all security keys */
9
    if (spa_strstartswith(key, "pipewire.sec."))
10
@@ -184,6 +184,7 @@
11
    if (!spa_streq(old, new))
12
        pw_log_warn("%p: refuse property update '%s' from '%s' to '%s'",
13
                client, key, old ? old : "<unset>", new ? new : "<unset>");
14
+ignore:
15
    return false;
16
 }
17
 
18
pipewire-0.3.85.tar.gz/src/pipewire/impl-module.c -> pipewire-1.0.0.tar.gz/src/pipewire/impl-module.c Changed
10
 
1
@@ -323,7 +323,7 @@
2
        pw_work_queue_cancel(pw_context_get_work_queue(module->context),
3
                     module, SPA_ID_INVALID);
4
 
5
-   if (!pw_in_valgrind() && dlclose(impl->hnd) != 0)
6
+   if (pw_should_dlclose() && dlclose(impl->hnd) != 0)
7
        pw_log_warn("%p: dlclose failed: %s", module, dlerror());
8
    free(impl);
9
 }
10
pipewire-0.3.85.tar.gz/src/pipewire/pipewire.c -> pipewire-1.0.0.tar.gz/src/pipewire/pipewire.c Changed
24
 
1
@@ -149,7 +149,7 @@
2
    if (--plugin->ref == 0) {
3
        spa_list_remove(&plugin->link);
4
        pw_log_debug("unloaded plugin:'%s'", plugin->filename);
5
-       if (global_support.do_dlclose)
6
+       if (pw_should_dlclose())
7
            dlclose(plugin->hnd);
8
        free(plugin->filename);
9
        free(plugin);
10
@@ -785,10 +785,10 @@
11
    return hname;
12
 }
13
 
14
-SPA_EXPORT
15
-bool pw_in_valgrind(void)
16
+bool
17
+pw_should_dlclose(void)
18
 {
19
-   return global_support.in_valgrind;
20
+   return global_support.do_dlclose;
21
 }
22
 
23
 SPA_EXPORT
24
pipewire-0.3.85.tar.gz/src/pipewire/pipewire.h -> pipewire-1.0.0.tar.gz/src/pipewire/pipewire.h Changed
10
 
1
@@ -72,8 +72,6 @@
2
 const char *
3
 pw_get_client_name(void);
4
 
5
-bool pw_in_valgrind(void);
6
-
7
 bool pw_check_option(const char *option, const char *value);
8
 
9
 enum pw_direction
10
pipewire-0.3.85.tar.gz/src/pipewire/private.h -> pipewire-1.0.0.tar.gz/src/pipewire/private.h Changed
10
 
1
@@ -1292,6 +1292,8 @@
2
 int pw_settings_expose(struct pw_context *context);
3
 void pw_settings_clean(struct pw_context *context);
4
 
5
+bool pw_should_dlclose(void);
6
+
7
 /** \endcond */
8
 
9
 #ifdef __cplusplus
10
pipewire-0.3.85.tar.gz/src/pipewire/stream.c -> pipewire-1.0.0.tar.gz/src/pipewire/stream.c Changed
10
 
1
@@ -1595,7 +1595,7 @@
2
    if (props == NULL)
3
        return NULL;
4
 
5
-   context = pw_context_new(loop, NULL, 0);
6
+   context = pw_context_new(loop, pw_properties_copy(props), 0);
7
    if (context == NULL) {
8
        res = -errno;
9
        goto error_cleanup;
10