Scream sender for PipeWire

A virtual audio sink that transmits everything played to it over the network as raw PCM — the Linux/PipeWire counterpart of the Windows Scream driver.

Source on GitHub The Scream project screamplay (CLI player)
AI-generated code. This module was produced with GitHub Copilot CLI with minimal human intervention. It is tested and working on PipeWire 1.0.5, but review the code before using it in production. Bug reports and code reviews are especially welcome. No warranty — see the licence.

What it does

Audio played to the virtual sink is transmitted as raw PCM over UDP — multicast by default (239.255.77.77:4010), unicast on request — to any Scream receiver on the network. It is the Linux/PipeWire equivalent of the Windows Scream driver, so existing receivers work unchanged.

Build

Needs PipeWire ≥ 0.3, CMake ≥ 3.10 and a C11 compiler.

# Ubuntu/Debian
sudo apt-get install libpipewire-0.3-dev pipewire cmake build-essential
# Fedora/RHEL
sudo dnf install pipewire-devel cmake gcc
# Arch
sudo pacman -S pipewire cmake gcc

git clone https://github.com/zirize/pipewire-scream.git
cd pipewire-scream
mkdir build && cd build
cmake .. && make && sudo make install

Loading it automatically

mkdir -p ~/.config/pipewire/pipewire.conf.d/
cp scream-sender.conf.example ~/.config/pipewire/pipewire.conf.d/scream-sender.conf
systemctl --user restart pipewire

Multicast, the default:

context.modules = [
    { name = libpipewire-module-scream }
]

Unicast to one receiver, or higher quality:

context.modules = [
    { name = libpipewire-module-scream
      args = { ip = "192.168.1.100" } }
]

context.modules = [
    { name = libpipewire-module-scream
      args = { rate = 96000, format = "S24LE" } }
]

Module arguments

ArgumentTypeDefaultDescription
sink.namestringScreamName of the virtual sink
sink.descriptionstringScream Network SinkDescription shown in audio settings
ipstring239.255.77.77Destination IP, multicast or unicast
portint4010Destination UDP port
interfacestringautoNetwork interface to use
multicast.ttlint1Multicast TTL (1–255)
rateint48000Sample rate (8000–384000)
channelsint2Channel count (1–255)
formatstringS16LES16LE, S24LE, S32LE

Advanced: Audio Relay (Mixing)

zirize/pipewire-scream can turn your Linux PC into a central Audio Relay. This allows you to route various inputs (microphone, Line-In, Bluetooth) into the virtual sink and stream them with zero latency to other devices.

1. Configure the Relay Sender

It is recommended to use Unicast to target the specific receiving device.

mkdir -p ~/.config/pipewire/pipewire.conf.d/
# Create scream-sender.conf
context.modules = [
    {
        name = libpipewire-module-scream
        args = {
            ip = "192.168.1.100" # Receiving device's IP
            silence.threshold = 24000 # Pause transmission on silence
        }
    }
]

2. Route the Audio

You must route incoming sources to the Scream virtual sink:

3. Relay Tips

Receiving the stream

Any Scream receiver works. On Linux, the Unix receiver from the main Scream repository (./scream -o pulse); on Windows, ScreamReader from the Scream package. Receivers must open UDP port 4010, and for multicast the network needs working IGMP:

ip route show
sudo ip route add 224.0.0.0/4 dev eth0

Checking it works

pactl list sinks short | grep Scream
paplay --device=Scream /path/to/audio.wav
mpv --audio-device=pipewire/Scream music.mp3
journalctl --user -u pipewire -f | grep -i scream
sudo tcpdump -i any udp port 4010

Troubleshooting

Known issues: short WAV files may carry slight noise depending on the source, and PipeWire < 1.0 is untested.

Licence

MS-PL (Microsoft Public License), the same as the main Scream project.