Integrated Audio Monitoring System

Stream, monitor, and route PCM audio effortlessly across Windows, Linux, and Android using the ultra-low latency Scream protocol.

Overview

The Scream ecosystem provides a way to transport uncompressed audio over local networks via UDP (Multicast or Unicast). It acts as a virtual audio cable over Ethernet/Wi-Fi, replacing physical cables for VM-to-Host audio, smart factory alerts, and remote device monitoring.

Scream Architecture

Quick Navigation

πŸ—ΊοΈ Architecture & Quick Start

Every sender pushes 1157-byte UDP packets to the multicast group 239.255.77.77:4010. Every receiver joined to that group plays the audio. There is no server and no handshake.

 β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
 β”‚ Windows PC   β”‚   β”‚ Linux PC         β”‚   β”‚ Linux script β”‚
 β”‚ Scream driverβ”‚   β”‚ pipewire-scream  β”‚   β”‚ screamplay   β”‚
 β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚   UDP multicast 239.255.77.77:4010      β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                       β–Ό
       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
       β–Ό               β–Ό                β–Ό
  ScreamDroid     Unix receiver     ScreamReader
   (Android)        (Linux)          (Windows)
One sender per group. Two senders on the same multicast group/port interleave their packets and the audio breaks up. To hear several machines at once, use the Central Audio Relay.

Quick Start

  1. Pick a sender: Windows driver (don't skip the registry step), PipeWire sink on Linux, or screamplay for scripted alerts.
  2. Pick a receiver: ScreamDroid on Android, or one of the desktop/embedded receivers.
  3. Verify: if you hear nothing, check that packets reach the receiver before changing anything else.

πŸͺŸ Component 1 β€” Windows Sender (duncanthrax/scream)

Provides a virtual Windows sound card driver that routes all system audio over UDP.

Driver Installation

Installation itself does not require registry manipulation; you can simply use Windows Test Mode as shown below.

  1. Ensure Secure Boot is disabled in your BIOS.
  2. Open an Administrator command prompt and enable Test Mode:
    bcdedit /set testsigning on
    Reboot and confirm "Test Mode" appears on the desktop wallpaper.
  3. Navigate to the driver folder and install:
    cd <scream folder>\Install\driver\x64
    pnputil /add-driver .\Scream.inf /install
  4. Disable Test Mode and restart:
    bcdedit /set testsigning off
  5. Open Sound Settings and set Scream as the default playback device.
Crucial for Windows 10/11 Operation: Even if the installation succeeds, the driver will not operate correctly on modern Windows 10/11 systems without specific configuration in the Registry. You must set these values for the driver to actually function.

Required Registry Configuration

You must configure the driver's settings in the registry under Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Scream\Options (you will likely need to create the Options key). A reboot is required after changing these values.

Silence Suppression

To avoid sending empty packets (saving network bandwidth/battery on receivers), add a SilenceThreshold (REG_DWORD) key.

Example: Set to 10000 for a threshold of ~0.25 seconds at 44.1kHz.

Unicast Mode

If multicast drops packets on your network, you can switch to unicast. Add UnicastIPv4 (REG_SZ) with the target IP, and UnicastPort (REG_DWORD) with the port number (e.g., 4010).

🐧 Component 2 β€” Linux PipeWire Sender (zirize/pipewire-scream)

Creates a virtual audio sink in PipeWire. Audio routed to this sink is transmitted via the Scream protocol.

Build & Install

  1. Install dependencies: pipewire-devel (or libpipewire-0.3-dev), cmake, gcc.
  2. Clone and build:
    git clone https://github.com/zirize/pipewire-scream.git
    cd pipewire-scream
    cmake -B build && cmake --build build
    sudo cmake --install build
  3. Configure auto-load:
    mkdir -p ~/.config/pipewire/pipewire.conf.d
    cp scream-sender.conf.example ~/.config/pipewire/pipewire.conf.d/scream-sender.conf
    systemctl --user restart pipewire
  4. Confirm the sink exists, then make it the default output (or route individual apps to it with pavucontrol / qpwgraph):
    wpctl status            # the Scream sink should be listed under "Sinks"
    wpctl set-default <ID>  # ID taken from the list above

⌨️ Component 3 β€” CLI Audio Playback (zirize/screamplay)

Streams audio files directly onto the Scream network without needing a virtual sound card. Ideal for automation and alerting scripts.

  1. Install dependencies: libsndfile1-dev, libsamplerate0-dev.
  2. Clone and build:
    git clone https://github.com/zirize/screamplay.git
    cd screamplay && make
  3. Play an audio file:
    ./screamplay alert.wav
    Automatically resamples to 48 kHz. Supports WAV, FLAC, OGG, AIFF, and MP3.
  4. Hook it into monitoring. For example, play an alarm when a host stops answering ping:
    ping -c 3 -W 2 192.168.0.50 >/dev/null || ./screamplay alarm.wav

πŸ“± Component 4 β€” Android Receiver (zirize/screamdroid)

A dedicated Android receiver that plays PC audio through your phone over Wi-Fi. It is highly optimized for battery efficiency and daily usage.

Why ScreamDroid? It was built specifically to solve the problem of playing desktop PC games or media while remaining available for mobile phone calls. It gracefully handles the transition without blasting game audio over your conversations.

Key Features

πŸ“‘ Component 5 β€” Other Receivers Setup

You can mix and match receivers. Multiple receivers can listen to the same multicast group (239.255.77.77:4010).

πŸͺŸ Windows β€” ScreamReader

Included in the duncanthrax/scream installer package. Run as administrator to listen to incoming streams on another Windows PC.

🐧 Linux β€” Unix Receiver

Located in Receivers/unix of the main Scream repo. Interfaces with PulseAudio, JACK, or ALSA.

cd scream/Receivers/unix
cmake -B build && cmake --build build
./build/scream -i eth0       # multicast
./build/scream -u -p 4011    # unicast

πŸ”Œ Embedded / Hardware

For ethernet-attached active speakers, you can use third-party receivers for cornrow, ESP32, or STM32F429.

πŸŽ›οΈ Advanced Setup: Central Audio Relay & Mixing

By default, the Scream multicast protocol does not properly support multiple simultaneous audio sources on the same network (streams will collide and cause severe audio glitches). If you need to monitor multiple PCs or VMs simultaneously, you can use a Linux host as a central mixing relay.

Why use a Relay? (A-4 Topology) This approach centralizes the audio mixing workload on the Linux host. Each sender communicates directly with the relay. It is especially useful for mobile receivers like ScreamDroid, which only need to listen to one clean, consolidated Multicast stream instead of maintaining multiple UDP sockets and draining the battery.

For a complete, step-by-step tutorial on configuring the Linux Relay (including routing with qpwgraph and setting up Unicast configurations), check out the Detailed Relay Setup Guide in the pipewire-scream documentation.

How It Works

  1. Senders (Peers/VMs): Each Windows PC or VM is configured to send its audio via Unicast to a specific, unique port on the Linux Relay (e.g., PC 1 to port 4011, PC 2 to 4012).
  2. Linux Relay (Mixer): The Linux host runs multiple instances of the Scream Unix Receiver (one for each port). These receivers output audio into a single, shared PulseAudio or PipeWire virtual sink, effectively mixing the sounds.
  3. Broadcaster: The Linux host uses pipewire-scream to capture this mixed sink and broadcasts the final, unified stream via Multicast (port 4010) to all your receivers.

πŸ” Verifying the Stream & Firewall

Most "no audio" problems are network problems. First check whether packets reach the receiver host:

sudo tcpdump -n -i any udp port 4010
# expected: a steady stream of lines ending in "UDP, length 1157"

If nothing shows up, open the port on the receiver (and on the relay, if you use one):

🐧 Linux

sudo ufw allow 4010/udp
# or (firewalld)
sudo firewall-cmd --permanent --add-port=4010/udp
sudo firewall-cmd --reload

πŸͺŸ Windows (admin)

netsh advfirewall firewall add rule ^
  name="Scream" dir=in action=allow ^
  protocol=UDP localport=4010

If packets appear on a wired host but not over Wi‑Fi, the access point is probably filtering or rate-limiting multicast. Switch that sender to unicast.

🩺 Troubleshooting

IssueCheck
No audio receivedRun the tcpdump check. Open UDP 4010 in the firewall. Confirm multicast/IGMP is allowed on the router/switch. Otherwise use unicast (Windows registry or the Linux config).
Windows driver installed but silentThe Options registry key is required on Windows 10/11. Set the values and reboot. Make sure Scream is the default playback device.
Garbled / choppy mix of two soundsTwo senders are sharing one group/port. Give each its own port, or use the relay.
Stuttering or skipsUse a wired connection where possible. Over Wi‑Fi, prefer unicast. Increase the receiver's buffer/latency.
Phone battery drains quicklySet SilenceThreshold on Windows senders so nothing is sent during silence. Use a relay so the phone listens to only one stream.
High bit rate warningUse 48 kHz / 16-bit for 5.1+ channels. Avoid 24/32-bit in multichannel mode to stay under network limits.

πŸ“‘ Protocol Reference

The Scream wire format is simple, which makes it easy to write your own sender or receiver (e.g. on a microcontroller).

FieldValue
TransportUDP. Multicast 239.255.77.77:4010 by default; unicast optional
Packet size5-byte header + 1152 bytes of interleaved little-endian PCM = 1157 bytes
Byte 0Sample rate. Bit 7: base rate (0 = 48 kHz, 1 = 44.1 kHz). Bits 0–6: multiplier (e.g. 0x01 = 48 kHz, 0x81 = 44.1 kHz)
Byte 1Sample width in bits (16, 24, 32)
Byte 2Number of channels
Bytes 3–4Channel mask (WAVEFORMATEXTENSIBLE dwChannelMask, little-endian)

Bandwidth: 48 kHz Γ— 16-bit Γ— 2 ch β‰ˆ 1.5 Mbps. 5.1 channels at 48 kHz/16-bit β‰ˆ 4.6 Mbps.

Mind map of the Scream protocol and its ecosystem
Scream protocol mind map