module-rtp: Allow aes67 send with a non PTP clock

Our current AES67 sender setup requires that that PTP driver drive the
entire graph. This adds support for allowing the AES67 RTP sink to be
driven by an arbitrary driver, while still using the PTP driver for
sending data on the network.

When aes67.driver-group is specified a pw_filter is created with no
ports, node.always-process = true and node.group set to the
aes67.driver-group. When set to PTP, this gives us process callbacks at
the PTP rate which we use to get the current PTP time in the RTP sender
by interpolating the clock snapshots from the pw-filter.

Implementation ideas from Wim Taymans. Co-authored with Sanchayan Maity.

For a detailed reference, refer the following papers by Fons Adriaensen.
- Using a DLL to filter time
  (https://kokkinizita.linuxaudio.org/papers/usingdll.pdf)
- Controlling adaptive resampling
  (http://kokkinizita.linuxaudio.org/papers/adapt-resamp.pdf)
This commit is contained in:
Arun Raghavan 2024-08-15 11:26:13 -04:00 committed by Arun Raghavan
parent 9ccf62d4f6
commit 9f643fec7e
4 changed files with 289 additions and 7 deletions

View file

@ -135,6 +135,10 @@ context.modules = [
audio.channels = 2
# These channel names will be visible both to applications and AES67 receivers
node.channel-names = ["CH1", "CH2"]
# Uncomment this and comment node.group in send/recv stream.props to allow
# separate drivers for the RTP sink and PTP sending (i.e. force rate matching on
# the AES67 node rather than other nodes)
#aes67.driver-group = "pipewire.ptp0"
stream.props = {
### Please change the sink name, this is necessary when you create multiple sinks