Commit graph

353 commits

Author SHA1 Message Date
George Kiagiadakis
69bd1e51ce default-routes: make the default volume configurable 2021-11-30 19:30:25 +02:00
Wim Taymans
703c35cfd4 access-config: add restricted access permissions
When a pulse client connects with TCP, it is given the 'restricted'
access policy. Assign 'rx' permissions for those clients instead of
blocking forever.

See pipewire#1863
2021-11-29 09:25:18 +01:00
George Kiagiadakis
147f235f54 policy-node: don't crash if device.id is not set on a target 2021-11-26 19:57:17 +02:00
Ashok Sidipotu
52980fb770 policy-node: improve default device selection logic
- skip target device if it does not have active/available
routes

Fixes #74
2021-11-26 14:43:04 +00:00
Wim Taymans
efd2458418 alsa: handle the release-requested signal
Handle the release-requested signal by destroying the device and
then calling release.

Fixes pipewire/pipewire#1846
2021-11-23 13:17:29 +01:00
Wim Taymans
c88fbd20e6 Revert "policy-node: Remove direction check"
This reverts commit b6072f4179.

This is not right because when 2 nodes have the same name, there is
no way to know which one to use. It is better to rely on the
PW_KEY_STREAM_CAPTURE_SINK property when capturing from a monitor.
2021-11-23 11:47:08 +01:00
Wim Taymans
83041b0ce2 policy-node: wait for nodes when we become unlinked
If we were linked before but our node is removed, wait until a new node
becomes available instead of failing.

This fixes an issue where there is only 1 sink available and the card
profile is toggeled between pro and stereo. After the profile is
toggled, the sink is removed and the node would be killed with an error
because there is no fallback sink. The fix is similar to the
pipewire-media-session logic.
2021-11-18 15:23:23 +01:00
Peter Hutterer
9208ea051c Fix some typos 2021-11-18 12:09:57 +00:00
Wim Taymans
b6072f4179 policy-node: Remove direction check
Remove the direction check in findDefinedTarget. We already to a
better direction check in canLink().

This fixes the case where a capture stream has the node.target set
to a sink. The directions don't match and the capture stream is not
linked to the monitor ports of the sink. Removing the check triggers
the right logic in canLink() and obs studio can link to monitor
ports again.
2021-11-18 11:46:47 +00:00
Wim Taymans
45fae97036 libcamera: use the new manager object for monitoring 2021-11-15 11:58:14 +01:00
George Kiagiadakis
a743b3f741 policy-node: don't clear peer_id when removing a link that was not for that peer
It's possible that we get multiple links on the same node, ex:

player -> output (output is the selected peer)
player -> pavucontrol

When pavucontrol exits, the peer_id of player must not be cleared,
since the link to the output still exists
2021-11-11 12:08:18 +02:00
George Kiagiadakis
4579488420 policy-node: improve debug messages in findUndefinedTarget() 2021-11-11 11:56:12 +02:00
George Kiagiadakis
eb0500f621 policy-node: fix small issues in last patch (last comment in !253) 2021-11-11 11:42:10 +02:00
Ashok Sidipotu
3122a61761 policy-node: improve target device selection logic
-loop through all the linkable nodes, instead of using default nodes
-implement a priority scheme to pick the appropriate target linkables
-If both nodes support a passthrough format, check the intersection.
 If the intersection is empty and one of the node is passthrough only,
 skip the node as a target
-the logic now closely aligns with the media-session logic

Fixes #75
2021-11-11 09:19:52 +00:00
George Kiagiadakis
07cd52bcb8 policy-node: check target exists before checking if an item is linked to it
Related to #102
2021-11-10 09:26:59 +02:00
George Kiagiadakis
2580b3431b policy-node: grab si.id once in createLink() and reuse it
... and avoid passing a reference to si in the closure
2021-11-09 19:09:39 +02:00
Julian Bouzas
ca7109b37b policy-node: add check to not relink more than 5 times if link with peer fails 2021-11-09 08:18:44 +00:00
Julian Bouzas
d47df77c55 policy-node: lookup the proper peer link when handling linkable
Previously, we were always looking for the first available link on the item,
which could lead to problems if the item had more than 1 link (eg target and
monitor links). Now, we keep the Id of the last target in order to determine if
the item is linked to the proper target when rescanning.
2021-11-09 08:18:44 +00:00
Peter Hutterer
b2a5b6c303 systemd: document the service files for split mode
https://gitlab.freedesktop.org/pipewire/wireplumber/-/issues/84#note_1117863
2021-11-09 16:06:12 +10:00
Julian Bouzas
4d5f9591fc policy-node: make sure 'taget.node' property has a valid Id before waiting 2021-11-03 10:37:03 -04:00
George Kiagiadakis
ff9b49064d default-routes.lua: add missing break in best route selection logic
Fixes #86
2021-11-01 12:14:04 +02:00
Julian Bouzas
0ee144a466 scripts: escape semicolon when serializing and parsing array 2021-11-01 10:00:52 +00:00
George Kiagiadakis
51713d309a policy-{node,endpoint-device}: do not hold reference to si_link in closure
This may keep the link alive for longer than expected
2021-10-23 11:02:13 +03:00
Julian Bouzas
04f77a5fbc policy-endpoint-client.lua: refactor based on policy-node.lua 2021-10-21 14:03:15 -04:00
Julian Bouzas
a03995c212 policy-endpoint-device.lua: refactor based on policy-node.lua 2021-10-21 14:03:15 -04:00
George Kiagiadakis
f8ced47a1a policy-node: enforce the direction of the target when linking by node name
When node.target is set to contain a node's name, it is possible to run
into the situation where you have a sink and a source with the same name
(typically the case with module-loopback) and the sink has monitor ports,
so wireplumber may link the stream to the monitor of the sink instead of the
capture ports of the source

With this policy, if a stream really wants to link to the monitor of the sink,
it has to have the "stream.capture.sink" property set or specify the
target by id.
2021-10-19 13:04:58 +03:00
George Kiagiadakis
1bdb8c2fb3 policy-node: don't rescan in the timeout callback if the si was already destroyed 2021-10-18 13:33:07 +03:00
George Kiagiadakis
634f73eb2d policy-node: don't hold a reference to the session item in the timeout callback
... it causes the si to be kept around even after the node is destroyed
2021-10-18 13:30:20 +03:00
George Kiagiadakis
4ab119778a policy-node: when node.target is specified, wait a bit for the target to be available
There is a chance of race condition here in case the client knows which target
it wants to link to, but wireplumber has not yet "seen" this target because
it is getting prepared asynchronously

This may stall for up to 2 seconds clients that start streams with an invalid
node.target property, but then they will be re-routed to the default node
2021-10-15 15:10:41 +03:00
George Kiagiadakis
2a21e005e0 policy-node: avoid searching for existing links if there is no reason
If the item was not already handled or if there is no target,
we don't need to search for existing links... we will not find any

Also, don't remove links or schedule rescan if the node is not eligible
for reconnection... we will delete the node below instead
2021-10-15 15:10:28 +03:00
George Kiagiadakis
b27eccb9f0 policy-node: improve debug messages 2021-10-15 15:06:34 +03:00
George Kiagiadakis
7e0eeb485c restore-stream.lua: do not remove target.node manually
This is now done by the metadata implementation.
Doing this manually causes assertion failures, because then the
target.node is removed before policy-node "unhandles" the associated
session item and it tries to re-link it to the default source/sink
2021-10-15 14:37:49 +03:00
George Kiagiadakis
c444ebaae1 meson: replace deprecated dep.get_pkgconfig_variable() with dep.get_variable() 2021-10-15 12:12:20 +03:00
Peter Hutterer
e308fd56a0 meson: give the wireplumber binary a variable name
This allows it to be accessed from pipewire when WP is built as a
subproject.
2021-10-15 08:14:03 +00:00
Ashok Sidipotu
784c405c31 wp: support loading optional modules
-some modules will not be available during runtime, due to
  external dependencies.
 -these modules can now be marked optional.
 -loading of these optional modules will be attempted and if
  they are not available, wp will recover and will not be
  terminated.
2021-10-14 06:27:53 +00:00
George Kiagiadakis
d26aeeb192 policy-node: accept TRUE as a valid boolean property value
when coming from a gstreamer element's stream-properties property,
the boolean values use capitals:

 gst-launch-1.0 ... ! pipewiresink stream-properties="p,foo=true"
 pw-cli info <node>
   -> "foo" = "TRUE"
2021-10-13 13:17:52 +03:00
George Kiagiadakis
5dcd06c339 policy-node: implement encoded audio passthrough
* also respect node.exclusive
* also send error to clients if a target node was not found
  or if it is not possible to link to it
* also allow dont-reconnect nodes to be handled normally
  the first time they appear, until they are linked once
2021-10-13 12:48:03 +03:00
Julian Bouzas
f7a6aaab61 default-routes: switch to the route when availability changed 2021-10-12 11:41:51 -04:00
Wim Taymans
51e29b1bca policy-node: add support for passive links
When one of the nodes has node.passive, make a passive link.

Make virtual sinks and sources suspend properly when not in use.
2021-10-11 12:40:44 +02:00
George Kiagiadakis
1b48e068ce systemd: alias to pipewire-session-manager.service
See #56 and pipewire/pipewire!970
2021-10-08 15:18:12 +03:00
George Kiagiadakis
0938f9bc84 policy-node: do not try to link monitors in no-dsp mode, as they do not exist
pipewire does not implement monitors in no-dsp mode yet
2021-10-08 11:05:09 +03:00
George Kiagiadakis
914867bd13 policy-node: cleanup target.node metadata when the default sink changes
When the default node changes to become the same as the target.node value
that was set in the metadata, remove this target.node from the metadata
to let the stream follow the default.

Also cleanup the useless target.node == -1 metadata that pipewire-pulse sets
when a stream is moved to the default node

Fixes #65
2021-10-08 01:10:30 +03:00
George Kiagiadakis
8671b495be policy-endpoint-client: decrease log message verbosity 2021-10-08 00:26:41 +03:00
George Kiagiadakis
e76c67c45c policy: refactor/improve policy-node & session items to fix linking to monitors
* populate most session item properties from create-item.lua to keep
  things more compact and readable
* use a standard naming scheme for the session item properties
* use session item properties instead of node properties in policy-node.lua
* improve policy-node's performance by converting the properties dictionary
  less times for each session item
* refactor some policy logic and make things slighly more readable
* change the accepted values for 'context' in wp_si_linkable_get_ports();
  use "input" and "output" to keep things clear, because the previous use
  of NULL and "reverse" were implying that a node has only one "standard"
  direction, but this is complicated for sinks w/ monitors and duplex nodes
* allow using monitors (which are Audio/Sink nodes in fact) as sources
* treat Audio/Duplex nodes as sinks, like p-m-s does
* respect the "stream.capture.sink" property of streams

Fixes #66
2021-10-08 00:26:41 +03:00
Wim Taymans
7907d39aff scripts: add libcamera monitor 2021-10-06 10:22:36 +02:00
Wim Taymans
a13308bac7 implement route-settings metadata and notification volume
Make a module that creates a route-settings metadata and provides
some helper functions to parse the json fields.

Load the route-settings module in the policy.

Move the Notification settings to the metadata. Listen for metadata
updates and update our state table.

Fixes #51
2021-10-05 15:47:46 +00:00
Wim Taymans
8c82265752 restore-stream: don't include the final : in the key name
Just make the key and let the user of the key add a separator when
needed.
2021-10-05 15:47:46 +00:00
Wim Taymans
65d5f6442b restore-stream: stop when we find the first suitable key 2021-10-05 15:47:46 +00:00
Wim Taymans
8e7331a23d default-routes: save and restore iec958Codecs
Similar to the volume and latencyOffset we need parse, save and restore
the configured iec958Codecs on the node.

Pavucontrol will use the device-restore extension to set the configured
iec958Codecs on the Node/Route. This will make the node enumerate
audio/iec958 formats, which can be matched against streams that can
provide this format to configure passthrough.

Fixes #64
2021-10-04 10:11:03 +00:00
George Kiagiadakis
2a99d6a835 default-access: grant full permissions to flatpak "Manager" apps
Fixes: #59
2021-10-04 09:20:53 +03:00