Commit graph

61 commits

Author SHA1 Message Date
Wim Taymans
662fd8a1f9 pulse-server: avoid crashing when clearing metadata
The key will be NULL so we can't strdup it.

Fixes #845
2021-03-05 20:16:29 +01:00
Wim Taymans
1c365f6169 policy-node: fix compiler warning 2021-03-05 20:16:05 +01:00
Wim Taymans
c8fd34a41d metadata: store default-nodes as JSON
Don't just store the id in the metadata but a JSON object with
the node name. This makes it possible to easily introspect the
metadata and also extend the metadata with more fields later.

Instead of matching the metadata id to the global ids we now
have to match it against the name.
2021-03-05 17:37:12 +01:00
Wim Taymans
3673265ae2 policy-node: don't crash without metadata 2021-02-19 17:54:31 +01:00
Pauli Virtanen
db6baf6188 media-session: use separate keys for configured default nodes
Use separate metadata keys for the current effective default nodes
(default.*), and user-configured ones (default.configured.*).

default-nodes saves and restores the configured ones, and policy-node
keeps the effective ones up to date.

For pipewire users, the effective default values should be considered
read-only, as changing them will not have an effect.  To avoid
confusion, policy-nodes will reset their values back immediately if they
are changed.
2021-02-06 18:10:28 +00:00
Wim Taymans
5dc2a7b793 policy-node: reverse config direction for virtual devices
For a virtual source we want to configure it like a sink with
input ports and the monitor ports as the capture ports.
2021-01-27 16:27:06 +01:00
Wim Taymans
295cba8404 policy-node: a virtual source is an output node 2021-01-27 16:14:39 +01:00
Wim Taymans
8f80a2bc15 media-session: handle key == NULL
The key can be null when the metadata subject is removed.
2021-01-19 17:01:24 +01:00
Pauli Virtanen
d1a0121b7c policy-node: handle moving streams when target.node is removed
When target.node metadata is unset, unset it also from the session node.
Schedule rescan in case this affects links.
2021-01-18 22:22:43 +02:00
Wim Taymans
272c0a4d83 policy-node: silence some normal warning
When a target-node is destroyed from a dont-reconnect node,
kill the node.
2021-01-18 20:56:40 +01:00
Pauli Virtanen
b10123eceb policy-node: make streams follow default sink/src changes
The motivation is to have both existing and new streams that have been
created without explicit target node, to be directed to the same devices
at all times. To achieve this:

Consider what find_node returns as the "default node".

Consider streams that auto+reconnect and don't have an explicit target,
as following default.  In rescan, if the default node has changed,
relink such streams to the new default.

Remove the old code that explicitly moved streams when the default.*
metadata changed, as it implements a similar thing but in a less robust
way (may fail to do what's intended, because the default device
metadata is commonly unset, or the metadata callback comes before
session_create has seen the new nodes).

Enable this feature based on "policy-node.streams-follow-default"
property. Allow setting the property also by loading the
streams-follow-default module. Enable it by default only for the
with-pulseaudio module group.
2021-01-18 20:49:58 +01:00
Wim Taymans
34c33ccdbf policy-node: clear target node for dont-reconnect streams
When a stream is marked don't reconnect, clear the target-node so that
it does not accidentally gets linked to a save target. This makes it
kill the monitor stream from pavucontrol after a client disconnects.
2020-12-20 12:32:54 +01:00
Wim Taymans
3c2ab98a2a Add support for virtual source
A virtual source is usually implemented with a null-sink, it looks
like a source to pulseaudio clients but just forwards what it gets
as input.

Make sure the port names make sense.

You can use the null sink now as:

pactl load-module module-null-sink sink_name=source object.linger=1
     media.class=Audio/Source/Virtual channel_map=FL,FR,RL,RR

     This creates a node with "input" and "capture" ports and looks
     like a virtual source for pulseaudio clients.

pactl load-module module-null-sink sink_name=source object.linger=1
     media.class=Audio/Sink channel_map=FL,FR,RL,RR

     This creates a node with "playback" and "monitor" ports and looks
     like a virtual sink for pulseaudio clients.

pactl load-module module-null-sink sink_name=source object.linger=1
     media.class=Audio/Duplex channel_map=FL,FR,RL,RR

     This creates a node with "playback" and "capture" ports and looks
     like a virtual source and sink for pulseaudio clients.
2020-12-02 15:42:56 +01:00
Wim Taymans
d6127a4745 handle Duplex media class
Audio/Duplex is both a source and a sink. Name the ports as input/output
and make sure we list them in the source and sink lists in pulse-server.
2020-12-02 11:44:19 +01:00
Wim Taymans
dae64bd2b5 policy-node: keep track how many times we link a node
Nodes that are marked as DONT_RECONNECT are only linked once.
Fixes a problem where a clients makes a DONT_RECONNECT stream but
without a specific sink.

See #395
2020-11-20 14:54:37 +01:00
Wim Taymans
6fa622d2d9 policy-node: only reconnect to given path_id
When the node is not found and we are not allowed to reconnect to
something else, error.
2020-11-16 13:28:35 +01:00
Wim Taymans
9d598cde63 policy-node: always up or downmix to device format
Always remix the channels to match the ones on the device even if
that means upmixing.

This will make mono streams go to all inputs of the device instead
of just one.

Fixes #355
2020-11-04 09:47:20 +01:00
Wim Taymans
952326323e policy-node: also allow node name as NODE_TARGET 2020-10-24 15:50:09 +02:00
Wim Taymans
d55bc1eb86 keys: add PW_KEY_STREAM_CAPTURE_SINK
Add a property for capture stream to signal that they would like
to capture the output (monitor) of the default sink instead of the
default source.
Check the desired device we would like to capture from and handle
the capture from the sink by monitoring the monitor source.
2020-10-21 17:00:49 +02:00
Wim Taymans
25e4f2088c policy-node: also handle the single stream move 2020-10-21 15:39:37 +02:00
Wim Taymans
bfac6f04db policy-node: avoid rescan when moving a node
When we are moving a node, the node becomes unlinked temporarily.
Make sure the rescan code doesn't try to link it to a node
meanwhile.

Fixes #344
2020-10-21 15:27:50 +02:00
Wim Taymans
77b91823f3 a2dp: mark a2dp-source as stream and autoconnect 2020-10-19 18:53:18 +02:00
Wim Taymans
3733a5e219 media-session: save last target_node
Keep a per node entry of the saved target node and use this when
there is no other target node.
When explicitly moving a stream, save the new target node.
2020-10-14 12:35:27 +02:00
Wim Taymans
8ee07c3c66 policy-node: always boost default node priority
Make sure the default node as the highest priority.
Fixes a problem with default nodes not being selected when their
priority happens to be too low (bluetooth devices)
2020-09-17 12:35:33 +02:00
Wim Taymans
dd0f4c7295 policy-node: only send PortConfig on audio nodes
0.2 version don't handle this correctly.

Possibly fixes #270
2020-09-02 14:25:11 +02:00
Wim Taymans
1e2d5e6837 policy-node: force channel setup of target node
When we are switching to a target node, force a downmix to the
target channel layout if we can. Don't try to upmix for now and
don't try to mix when the dont-mix flag is set.
2020-08-19 11:53:07 +02:00
Wim Taymans
d878843c2b policy-node: keep the original node format 2020-08-19 11:26:51 +02:00
Wim Taymans
0c04481ba7 metadata: improve default sink/source
Only check defaults when subject is PW_ID_CORE
Handle NULL keys: remove the defaults
2020-08-18 17:56:05 +02:00
Wim Taymans
28bb212630 policy-node: improve move
Don't try to do work when not needed
2020-08-17 17:50:42 +02:00
Wim Taymans
a0777d7806 policy-node: only set peer when we actually linked something 2020-08-07 10:50:30 +02:00
Wim Taymans
46b8b67ee6 policy-node: small cleanup
to keep the orinal node around if we want to do something with it
later
2020-08-06 17:58:42 +02:00
Wim Taymans
4b56574ce0 policy-node: don't fail on incomplete format
Use some defaults when parsing the audio format.
2020-08-06 12:51:20 +02:00
Wim Taymans
0d6bbaa7e1 policy-node: only configure devices when active
Wait until a node is active before we attempt to configure it or
else we don't yet have a format to configure it with.
2020-07-29 12:20:24 +02:00
Wim Taymans
a2de3b0873 policy-node: add default video source metadata 2020-07-28 11:17:36 +02:00
Wim Taymans
9e8851e0ae policy-node: do downmix in monitor streams
Monitor streams usually have 1 channel so ask for all monitored
channels to be downmixed.
Don't try to configure video or unknown streams
2020-07-28 10:50:00 +02:00
Wim Taymans
a96fcf5c19 policy-node: rework node configuration
Add a configure stage to the node where the PortConfig is
determined.
Wait until we link a stream and then configure the node with the
portconfig of the peer.
Configure devices with the their best portconfig by enumerating
the formats.
2020-07-28 10:21:01 +02:00
Wim Taymans
4a8afe389c policy-node: boost priority on default device
When we find a default device, boost the priority so that it
remains the target device even when a device with higher priority
is scanned later.

Fixes issue where default device was not selected because a higher
priority device was encountered after it.
2020-07-27 10:16:17 +02:00
Wim Taymans
266e1301d2 use id to store default sink/source
This is easier to handle in general and we should not use the name
as a unique id. If the session manager wants to save things, it can
use whatever fields it wants from the object to create a unique
persistent name.
2020-07-23 11:59:13 +02:00
Wim Taymans
201d762b2a policy-node: refactor configure_node 2020-07-22 16:53:02 +02:00
Wim Taymans
8c4b594b50 policy-node: don't move to the current target 2020-07-20 14:46:44 +02:00
Wim Taymans
7915bf5778 policy-node: implement move node
Move nodes to a new target when the metadata changes.
2020-07-20 14:40:50 +02:00
Wim Taymans
02be602f97 policy-node: route to the default sink/source when found 2020-07-15 15:53:54 +02:00
Wim Taymans
61e2d5cb54 policy-node: track default sink/source and move streams
Keep track of the default source and sink and move all streams linked
to the old default to the new default when it changes.
2020-07-15 14:26:16 +02:00
Wim Taymans
b1293d9f6e policy-node: only track stream peers
Only track the peer of streams. We only care about where we linked
this stream to. There is only one target per stream but the device
we link to can have many peer streams.
2020-07-15 14:22:56 +02:00
Wim Taymans
69cfc8e08c policy-node: use the DONT_RECONNECT flag with a target
When a target is given and it doesn't exist, look at the
DONT_RECONNECT flag and error when we are not allowed to connect
to something else.
2020-07-09 13:03:02 +02:00
Wim Taymans
471c1a071c policy: improve debug 2020-07-03 16:25:28 +02:00
Wim Taymans
82a83afd6b policy: activate Unknown stream media type
And try to link them using the media.type property
2020-07-02 15:39:11 +02:00
Wim Taymans
e4e03fa7dd media-session: always activate DSP nodes
They don't need to be activated with a profile.
2020-06-03 12:03:20 +02:00
Wim Taymans
aafd1e7298 improve debug
Improve log so that debug level 3 gives a reasonably readable overview
of what is going on.
2020-04-22 12:47:18 +02:00
Wim Taymans
c20100eabb media-session: Add method to destroy a global
Destroy the stream when it is disconnected and it was marked as
DONT_RECONNECT.
2020-04-02 15:27:23 +02:00