Skip to main content

Synchronized audio player for Sendspin servers

Project description

sendspin

pypi_badge

Connect to any Sendspin server and instantly turn your computer into an audio target that can participate in multi-room audio.

Sendspin CLI includes three apps:

  • sendspin - Terminal client for interactive use
  • sendspin daemon - Background daemon for headless devices
  • sendspin serve - Host a Sendspin party to demo Sendspin
image

A project from the Open Home Foundation

Quick Start

Run directly with uv:

Start client

uvx sendspin

Host a Sendspin party

uvx sendspin serve --demo
uvx sendspin serve /path/to/media.mp3
uvx sendspin serve https://retro.dancewave.online/retrodance.mp3

Installation

With uv:

uv tool install sendspin

Install as daemon (Linux):

curl -fsSL https://raw.githubusercontent.com/Sendspin/sendspin-cli/refs/heads/main/scripts/systemd/install-systemd.sh | sudo bash

With pip:

pip install sendspin
Install from source
git clone https://github.com/Sendspin-Protocol/sendspin.git
cd sendspin
pip install .

After installation, run:

sendspin

The player will automatically connect to a Sendspin server on your local network and be available for playback.

Configuration Options

Server Connection

By default, the player automatically discovers Sendspin servers on your local network using mDNS. You can also connect directly to a specific server:

sendspin --url ws://192.168.1.100:8080/sendspin

List available servers on the network:

sendspin --list-servers

Client Identification

If you want to run multiple players on the same computer, you can specify unique identifiers:

sendspin --id my-client-1 --name "Kitchen"
sendspin --id my-client-2 --name "Bedroom"
  • --id: A unique identifier for this client (optional; defaults to sendspin-<hostname>, useful for running multiple instances on one computer)
  • --name: A friendly name displayed on the server (optional; defaults to hostname)

Audio Output Device Selection

By default, the player uses your system's default audio output device. You can list available devices or select a specific device:

List available audio devices:

sendspin --list-audio-devices

This displays all audio output devices with their IDs, channel configurations, and sample rates. The default device is marked.

Select a specific audio device by index:

sendspin --audio-device 2

Or by name prefix:

sendspin --audio-device "MacBook"

This is particularly useful when running sendspin daemon on headless devices or when you want to route audio to a specific output.

Adjusting Playback Delay

The player supports adjusting playback delay to compensate for audio hardware latency or achieve better synchronization across devices.

sendspin --static-delay-ms -100

Note: Based on limited testing, the delay value is typically a negative number (e.g., -100 or -150) to compensate for audio hardware buffering.

Daemon Mode

To run the player as a background daemon without the interactive TUI (useful for headless devices or scripts):

sendspin daemon

The daemon runs in the background and logs status messages to stdout. It accepts the same connection and audio options as the TUI client:

sendspin daemon --name "Kitchen" --audio-device 2

Debugging & Troubleshooting

If you experience synchronization issues or audio glitches, you can enable detailed logging to help diagnose the problem:

sendspin --log-level DEBUG

This provides detailed information about time synchronization. The output can be helpful when reporting issues.

Limitations & Known Issues

This player is highly experimental and has several known limitations:

  • Format Support: Currently fixed to uncompressed 44.1kHz 16-bit stereo PCM
  • Configuration Persistence: Settings are not persistently stored; delay must be reconfigured on each restart using the --static-delay-ms option

Install as Daemon (systemd, Linux)

For headless devices like Raspberry Pi, you can install sendspin daemon as a systemd service that starts automatically on boot.

Install:

curl -fsSL https://raw.githubusercontent.com/Sendspin/sendspin-cli/refs/heads/main/scripts/systemd/install-systemd.sh | sudo bash

The installer will:

  • Check and offer to install dependencies (libportaudio2, uv)
  • Install sendspin via uv tool install
  • Prompt for client name and audio device selection
  • Create systemd service and configuration

Manage the service:

sudo systemctl start sendspin    # Start the service
sudo systemctl stop sendspin     # Stop the service
sudo systemctl status sendspin   # Check status
journalctl -u sendspin -f        # View logs

Configuration: Edit /etc/default/sendspin to change client name, audio device, or delay settings.

Uninstall:

curl -fsSL https://raw.githubusercontent.com/Sendspin/sendspin-cli/refs/heads/main/scripts/systemd/uninstall-systemd.sh | sudo bash

Sendspin Party

The Sendspin client includes a mode to enable hosting a Sendspin Party. This will start a Sendspin server playing a specified audio file or URL in a loop, allowing nearby Sendspin clients to connect and listen together. It also hosts a web interface for easy playing and sharing. Fire up that home or office 🔥

# Demo mode
sendspin serve --demo
# Local file
sendspin serve /path/to/media.mp3
# Remote URL
sendspin serve https://retro.dancewave.online/retrodance.mp3
# Without pre-installing Sendspin
uvx sendspin serve /path/to/media.mp3

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sendspin-3.0.0.tar.gz (54.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sendspin-3.0.0-py3-none-any.whl (57.8 kB view details)

Uploaded Python 3

File details

Details for the file sendspin-3.0.0.tar.gz.

File metadata

  • Download URL: sendspin-3.0.0.tar.gz
  • Upload date:
  • Size: 54.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sendspin-3.0.0.tar.gz
Algorithm Hash digest
SHA256 54678281d1c7afcf69f42c2bdb510c4e46fabf3a8f762b8afe6ff28525f994e3
MD5 0b3fb25eb71c496d1391109fbcef9dfa
BLAKE2b-256 c7c96c44678da016b3c85933209d35ff9ce4c466bb5d90eafeca7994a6934ead

See more details on using hashes here.

Provenance

The following attestation bundles were made for sendspin-3.0.0.tar.gz:

Publisher: release.yml on Sendspin/sendspin-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sendspin-3.0.0-py3-none-any.whl.

File metadata

  • Download URL: sendspin-3.0.0-py3-none-any.whl
  • Upload date:
  • Size: 57.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for sendspin-3.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 06d342715a19d9a6ec16896c1d0d9fa3fd4516592b418c5204d0ceca22037423
MD5 64ccbf82526154bb4a9a858ef49b2ac1
BLAKE2b-256 d0bb2c52cdbdf51ae2b529527af7b8b9208ac1cbb80e0c44711a69b749bd9f3b

See more details on using hashes here.

Provenance

The following attestation bundles were made for sendspin-3.0.0-py3-none-any.whl:

Publisher: release.yml on Sendspin/sendspin-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page