Commit graph

10465 commits

Author SHA1 Message Date
Wim Taymans
8c264d2dcb alsa: in IRQ mode, disable sources while we wait
In IRQ mode, disable the ALSA fds while we wait for the graph to produce
data. Otherwise we will wake up very quickly over and over.

When we get more data, we activate the sources again to start the next
cycle.
2023-03-29 11:30:40 +02:00
Wim Taymans
dc5aa21c87 alsa-pcm: use full period size in IRQ mode
We can simply wake up every period and check the timers there is no need
to tweak the period size.
2023-03-29 11:29:43 +02:00
Wim Taymans
aa0d9c5b41 alsa: add disable-tsched to params 2023-03-28 18:27:53 +02:00
Arun Raghavan
26e37b6575 alsa: Implement period-based wakeups
Provides configuration to disable timer-based scheduling. This can be
useful at low latencies, for example, where period-based interrupts
might be more reliable than timers.
2023-03-28 16:22:53 +00:00
Wim Taymans
f28c30d526 impl-link: only make passive links with suspendable peers
Only make a passive link when one of the peers is passive and the other
one can be suspended or when both are explicitly passive.

This avoid making passive links between a sink/source pair.

It also avoid making passive links between two streams if they are not
explicitly marked as passive.

It does allow making passive links between a passive stream and a
sink/source or between two passive streams.
2023-03-28 18:14:19 +02:00
Wim Taymans
c84ef9e29a Revert "impl-link: make passive link if both ports are passive"
This reverts commit 6a64b4461e.

Now that sinks and sources are no longer passive by default, we need
just one part of the link to be passive to make things passive.

This breaks the stream recording from a passive stream case but we can
find a different fix for that later.
2023-03-28 17:32:02 +02:00
Wim Taymans
0f27432f8c Revert "impl-node: assume Sink/Source nodes are passive"
This reverts commit 67999f0f9c.

This breaks direct links between two devices because all ports are
passive. This needs some more thinking.
2023-03-28 17:32:02 +02:00
Harri Nieminen
4323a8ad4a module-pipe-tunnel: remove extra whitespace 2023-03-28 13:36:16 +00:00
Wim Taymans
2bfe772bb4 context: handle link-group nodes
Nodes with the same link-group should be added to the same driver.

Also the runnable state of the nodes in the same link group is
shared between eachother. This makes it look like the linked nodes are
really just one big node.

With this change we correctly calculate the state of all nodes and we
can then only set the running state on the runnable nodes.

If you have 2 loopback sinks in front of a driver, this change will
only make the used loopback sink running and keep the other one
idle. It also works for grouped nodes, where only the active nodes
will now be running (such as rtp-session nodes).
2023-03-28 15:19:16 +02:00
Wim Taymans
93e6e98a17 module-link-factory: ignore link.passive by default
Make an option to allow link.passive properties and set it to false by
default.

This effectively ignores the link.passive properties from the session
manager, jack clients and pw-link when set. This is a good idea because
the logic for making passive links is better handled in the core.
2023-03-28 15:19:16 +02:00
Wim Taymans
67999f0f9c impl-node: assume Sink/Source nodes are passive
If not otherwise stated, assume the Sink and Source nodes
are passive.
2023-03-28 15:18:50 +02:00
Wim Taymans
6a64b4461e impl-link: make passive link if both ports are passive
Only make a passive link when both ports are passive.
Otherwise, adding a monitor stream on the loopback output stream will
make a passive link.
2023-03-28 11:58:32 +02:00
Wim Taymans
c8bfa69320 context: init flags before starting recalculate
Init the node flags before recalculating the graph state. There is no
reason to do this later.
2023-03-28 11:52:36 +02:00
Wim Taymans
8fca3808d8 impl-node: only update the trigger node state once
Don't increment the required activation count every time we change the
node prorties with a TRIGGER property. Only increment/decrement when the
value actually changed.
2023-03-28 09:48:21 +02:00
Wim Taymans
08642adddc module-rtp: free the avahi client as well 2023-03-27 16:01:50 +02:00
Wim Taymans
f6e25c239f module-pulse-tunnel: don't unload module from pulse thread
We are not allowed to call pipewire methods from any other thread than
the main thread so use invoke to schedule a module unload from the
pulseaudio thread.

Fixes some infinite loops when the work-queue list gets corrupted.
2023-03-27 11:10:12 +02:00
Wim Taymans
a0457a3bdf camera: work around target_ mishandling
A driver node should use the target_duration and target_rate to adjust
the quantum and rate when the graph starts.

The camera nodes don't currently support any of this and simply enforce
a specific rate and duration for the graph clock. Mark this with a
FIXME. Otherwise, pipewire will complain that the node is ignoring the
configured graph rate.

We should really look at the graph target rate/quantum and only produce
a buffer when it is inside the current graph cycle. This would make it
possible to join audio and camera nodes and have them be in sync.
2023-03-27 09:59:21 +02:00
Wim Taymans
6363bbd1b9 stream: we should not update clock automatically
A driver node should update the clock before it starts the graph
cycle.
2023-03-27 09:52:15 +02:00
Niklāvs Koļesņikovs
265f7dd09f src/daemon: move the optional drop-ins to conf.avail
These drop-ins are not meant to be enabled by default, so let's move
them to fontconfig style *.conf.avail/ subfolders from which they can
be copied or symlinked to a location that will get merged into the
corresponding configuration file.

Signed-off-by: Niklāvs Koļesņikovs <89q1r14hd@relay.firefox.com>
2023-03-27 07:19:27 +00:00
Pauli Virtanen
6c0434ec9c spa: fix wrong meson check for BAP 2023-03-26 15:12:55 +03:00
Pauli Virtanen
b50ca80281 bluez5: do transport release synchronously
Do transport release synchronously for simplicity.  BlueZ handles
releasing while acquire is pending, but acquire while release is pending
would fail the acquire.

Otherwise we need to maintain an operation chain to handle trying to
acquire/release while the other operation is pending.  This makes things
complex with little gained, as releases generally don't block for a long
time.
2023-03-26 15:12:51 +03:00
Pauli Virtanen
fc56361ffd bluez5: set right transport active when acquiring linked
The linked transport should be activated, the main one was already
activated above.
2023-03-26 12:44:13 +03:00
Volker Rümelin
92a41ba21f pipewire-pulse: generate silence on underflow correctly
Filling a buffer with zeros to produce silence is wrong for
unsigned sample formats and compressed sample formats. This is
silence with an offset. A silent stream with unsigned or
compressed samples mixed with another stream produces a clipped
stream. To hear the problem start QEMU with

qemu-system-x86_64 -accel kvm -smp 4 -m 4096 \
 -audiodev pa,id=audio0,out.mixing-engine=off \
 -machine pc,pcspk-audiodev=audio0 \
 -device ich9-intel-hda -device hda-duplex,audiodev=audio0 \
 -boot d -cdrom Fedora-Workstation-Live-x86_64-37-1.7.iso

on a host configured to use PipeWire and start audio playback on
the guest HDA device.

PA_SAMPLE_U8 is the only unsigned PulseAudio sample format.
There is no need to care about unsigned multi-byte formats.

Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
2023-03-24 19:53:26 +01:00
Wim Taymans
3698593481 spa: reuse code to clear the timers
We have set_timeout and enable_flush_timer functions to disable the
timers so use those.
2023-03-24 17:55:15 +01:00
Wim Taymans
78b8e1af57 node-driver: fix position calculation
Set the driver node position based on the current time when we
start and keep incrementing it with the previous duration.
2023-03-24 17:34:14 +01:00
Wim Taymans
5ea3c10dca support: sync timers with data loop
Start and stop the timers in the data_loop. Otherwise we might be trying
to stop a timer while the data loop is starting it and we end up with
"ready non-active node" messages.
2023-03-24 17:24:56 +01:00
Wim Taymans
157a97cc98 bluez5: do rate matching before next timeout
Because else we might not have a rate and divide by 0.
2023-03-24 16:13:51 +01:00
Wim Taymans
7b6680ba57 plugins: simplify target_ handling
Drivers should only read the target_ values in the timeout, update the
timeout with the new duration and then update the position.

For the position we simply need to add the previous duration to the
position and then set the new duration + rate.

Otherwise, everything else should read the duration/rate and not use
the target_ values.
2023-03-24 11:36:15 +01:00
Wim Taymans
f309543810 context: update the duration/rate directly when node idle
When the node is not running, update the duration/rate directly
so that followers can see the current duration/rate when they start.
2023-03-23 18:50:24 +01:00
Wim Taymans
6e8625cf96 node: update the duration/rate from the target
Before scheduling the graph from the driver, update the duration and
rate with the new targets.
2023-03-23 18:39:27 +01:00
Wim Taymans
1bdd5eee69 alsa: update rate/duration from target
Also reorganize some things to reuse more code.
2023-03-23 18:04:36 +01:00
Wim Taymans
2adf8d38d5 node: add target_rate and target_duration in io_clock
Place the target rate and duration in the io clock area.

The driver is meant to read these new values at the start of the cycle
and update the position rate and duration.

This used to be done by the pipewire server when it received the ready
callback from the driver but this is in fact too late. Most driver would
start processing and set the next timeout based on the old rate/duration
instead of the new pending ones.

There is still a fallback for the old behaviour (with a warning) when
the driver doesn't yet update the position.
2023-03-23 17:57:16 +01:00
Wim Taymans
87d64f5cad context: rename current_quantum/rate to target_*
They are really the target rate and quantum that we would like to
have and are only current after target_pending is false.
2023-03-23 17:20:01 +01:00
Wim Taymans
25f5165e4c acp: return EEXIST when seeing a linked device
Otherwise we get ENOENT, which is confusing because it is the same
error when the plugin doesn't exist.

See #2016
2023-03-23 13:24:22 +01:00
Wim Taymans
2a29e7b9e2 alsa: improve properties
Make NODE_NAME something that looks more like other node names.
Add MEDIA_NAME and NODE_DESCRIPTION.

Makes things look better in pw-top and the same in pavucontrol.
2023-03-23 12:41:08 +01:00
Wim Taymans
d78bea5e32 module-combine-stream: improve docs 2023-03-23 11:47:27 +01:00
Wim Taymans
d3cd900d06 context: restore driver rate when no longer forced
Keep track of when a rate was forced on a driver and restore the
best rate again when no longer forced.

This handles:

- paplay playing a file at 44100Hz
  --> driver openeing the device at 44100
- PIPEWIRE_PROPS='{ node.force-rate=48000 }' jack_simple_client
  --> driver being forced to a new rate of 48000
- Stop jack_simple_client
  --> Driver reverting back to 44100

Previously the driver would stay in 48000Hz until it idles.

This also works with pw-metadata -n settings 0 clock.force-rate 0.

Fixes #2133
2023-03-23 11:35:50 +01:00
Wim Taymans
8ddb6d711f context: don't reconfigure when already pending
When we already have a pending rate/quantum change, don't reconfigure
the driver.

This avoids going into an endless loop when:

1- paplay plays with 44100Hz on device1
2- jack_simple_client starts and attaches to device1
3- jack_simple_client links to device2
4- jack_simple_client is moved from device1 to device2, rate from
   device1 is moved to device2 (44100Hz)
5- device2 becomes schedulable and sees the rate should be 48000Hz (the
   default) it does a rate switch to 48KHz
6- jack_simple_client is suspended, links are back to init
7- jack_simple_client is moved back to device1
8- jack_simple_client links are activated and cycle restarts at 4

The cycle is broken because at 6 we avoid doing the suspend.
2023-03-23 10:26:21 +01:00
Wim Taymans
07e6f44e58 modules: clean up USAGE arguments
use () to mark optional arguments to avoid confusion with arrays.
Add some more optional arguments.
2023-03-22 16:35:55 +01:00
Wim Taymans
3decaa6457 audioconvert: use spa_strbuf 2023-03-22 15:41:27 +01:00
Wim Taymans
5d2773a554 audioconvert: fix test
Enable upmix manually because we test that.
2023-03-22 15:41:06 +01:00
Wim Taymans
d07e1b5641 audioconvert: disable upmix by default again
But instead ship config override files to enable it again.

The idea is that distros can make extra packages that can than be
installed to enable the upmixing.

Also ship a config file to enable more samplerates.

Fixes #3081
2023-03-22 15:21:55 +01:00
Wim Taymans
2d6669d571 acp: fix pa_strbuf
We need vfprintf.
2023-03-22 15:08:29 +01:00
jdavidsson
0d0af4c9d8 module-echo-cancel: null check playback stream
Protect against segfault when monitor.mode = true and playback stream
isn't created.
2023-03-22 11:07:17 +00:00
Wim Taymans
943f40fd3a filter-chain: add docs
Add docs for sofa and improve docs for the convolver.
2023-03-22 11:52:02 +01:00
Wim Taymans
5af265ed22 protocol-native: emit bound_id and bound_props from protocol
Emit both the bound_id and bound_props events from the protocol on
the core_resource.

Doing the dispatching of the bound_id/bound_props in the core to the
proxy doesn't handle the case where the client has a listener directly
on the core_resource.

Fixes #3109
2023-03-22 10:20:14 +01:00
Wim Taymans
fb8709716c core: add bound_props event
this event extends the bound_id event and sends the global properties as
well.

This can be used to get the object.serial, for example.

It can also be used in the future to let the server generate unique
property values, like the node.name, and let the client know about the
new property value.
2023-03-21 17:22:27 +01:00
Wim Taymans
59cd5670d7 impl-core: store hello version in core resource
So that we can later get the client core version from the resource.
2023-03-21 17:20:18 +01:00
Wim Taymans
aae770f18b alsa: avoid assert
We're doing something different than pulseaudio when setting up the
ports.
2023-03-21 12:29:37 +01:00
Wim Taymans
2216956e05 alsa: fixup after merge 2023-03-21 10:07:39 +01:00