AirPlay speaker app for Raspberry Pi + Whisplay HAT.
The app uses shairport-sync as the AirPlay receiver and renders a small 240x280 Whisplay UI through whisplay-daemon:
- Top bar: AirPlay title, Wi-Fi signal, PiSugar battery
- Center: current AirPlay connection source or waiting state
- Bottom: live volume bar when shairport-sync reports volume metadata
- Audio: defaults to the latest Whisplay unified sound card path,
ALSA_OUTPUT_DEVICE=playback
sudo apt update
sudo apt install -y shairport-sync python3-venv python3-pip
./install.shshairport-sync is a system package, so installing it requires sudo access on the Pi.
If the system shairport-sync service is already enabled, stop it before launching this app so only one AirPlay receiver owns the service name:
sudo systemctl disable --now shairport-sync./run.shWhen whisplay-daemon is available at /tmp/whisplay-daemon.sock, install.sh registers the app as whisplay-airplay; running the app renders into the daemon framebuffer. Without the daemon, it still runs the AirPlay receiver but skips LCD output.
Copy .env.example to .env and adjust as needed.
WHISPLAY_AIRPLAY_NAME=Whisplay AirPlay
ALSA_OUTPUT_DEVICE=playback
SHAIRPORT_LOG_LEVEL=0
SHAIRPORT_INTERPOLATION=basic
SHAIRPORT_OUTPUT_RATE=44100
SHAIRPORT_OUTPUT_FORMAT=S16
SHAIRPORT_IGNORE_VOLUME_CONTROL=false
SHAIRPORT_BUFFER_SECONDS=1.0For the current Whisplay driver, playback is preferred over hw:whisplaysound,0 because it uses the shared ALSA dmix route from the driver package. Legacy cards fall back to plughw:CARD=... automatically.
By default, AirPlay volume uses shairport-sync software attenuation. The Whisplay speaker mixer is useful for system-level volume and tests, but it does not expose a dB scale and should not be bound as the shairport-sync hardware mixer.
The generated ALSA config disables precision timing for compatibility with the Whisplay playback dmix route.
Playback state on the LCD is driven by shairport-sync session hooks, so the UI and LED can update even when verbose AirPlay logs are disabled.
The connected device label comes from shairport-sync metadata or logs. Some iOS/macOS versions only expose an IP or session label, so the UI may show that source instead of the friendly device name.