Enable the AirPlay 2 build to operate an optional classic-AirPlay-only service or to gracefully degrade to classic AirPlay, as follows:
1. Add a new command-line option '-—service-type=<type>' and an equivalent configuration entry 'service_type = "<type>"' in the 'general' section of the configuration file,
where <type> can be "auto", "classic" or "airplay2":
1. "auto" (default) means that the service will be AirPlay 2 if NQPTP is running. If NQPTP is not running, classic AirPlay service will be provided instead, and in that case,
"(Classic)" will be appended to the default AirPlay service name visible to AirPlay clients like Apple Music, for example "RaspberryPi3B (Classic)".
2. "classic" means the service will be classic AirPlay (aka AirPlay 1).
3. "airplay2" means the service will be the modern AirPlay 2. In this case, as distinct from "auto", if NQPTP is not running, Shairport Sync will log an error and terminate.
2. In the systemd service file, NQPTP is now a "Want" rather than a "Require". If it's present, then it will be launched before Shairport Sync. If it's absent, Shairport Sync will launch anyway.
3. Improve the delivery of input format changes and emit 'sdsc' metadata when changes occur.
4. Emit new format information in the log if statistics is enabled.
Docker Changes
1. Support for linux/arm/v6 has been dropped, as Docker is no longer supported.
2. NQPTP is not started in the AirPlay 2 Docker image if '--service-type=classic' or '--service-type=airplay1' is in the command line options at the end of the docker run command.
The purpose is to ensure that ports 319 and 320 are left alone when the AirPlay 2 image is set to provide Classic service only.
Note that setting the configuration file 'service_type' to 'classic' will not prevent NQPTP from starting up -- you must use the command line option.
3. A new "dev" target has been added. It is a large image containing the custom-built FFmpeg library, NQPTP, Avahi and D-Bus along with the Shairport Sync source and
all necessary development tools. When started, Avahi, D-Bus and NQPTP are all installed and running. The bash shell has also been added and is entered.
Stability Improvements
Reorganise session preemption to fully terminate the existing session before starting a new one.
Don't delay closing the event port to wait for it to be closed at the client end.
Add a safe_socket_close() function to ensure sockets are fully closed. Use -1 to designate closed rather than 0, to prevent attempts to reclose sockets, causing mayhem.
Re-order FFmpeg decommissioning during teardown.
Shairport Sync Docker Image
Available at: https://hub.docker.com/r/mikebrady/shairport-sync
Shairport Sync provides limited AirPlay 2 functionality. Versions with tags including -classic only provide classic AirPlay (aka "AirPlay 1"), the same as Shairport Sync versions up to 3.3.9.
Tags
latestandlatest-classicare images of the most recent releases. These should be the most stable and updated only when a new release is made.rollingandrolling-classicare images of the latest updates in themasterbranch that have not yet been incorporated in a release. These may be updated frequently but should be stable.developmentanddevelopment-classicare images of the latest pushes to thedevelopmentbranch. These will be less stable and may be actually faulty. They will be updated frequently.- Version Tags, e.g.
4.1are images of specific releases.
Example Docker Compose File
See the docker-compose.yaml file in this folder for an example.
Docker Run
To run the latest release of Shairport Sync, which provides AirPlay 2 service:
$ docker run -d --cap-add=SYS_NICE --restart unless-stopped --net host --device /dev/snd \
mikebrady/shairport-sync:latest
To run the classic version:
$ docker run -d --cap-add=SYS_NICE --restart unless-stopped --net host --device /dev/snd \
mikebrady/shairport-sync:latest-classic
Options
Command line options will be passed to Shairport Sync. Here is an example:
$ docker run -d --cap-add=SYS_NICE --restart unless-stopped --net host --device /dev/snd \
mikebrady/shairport-sync:latest \
-v --statistics -a DenSystem -- -d hw:0 -c PCM
This will send audio to alsa hardware device hw:0 and make use of the that device's mixer control called PCM. The service will be visible as DenSystem on the network.
The image is built with PipeWire and PulseAudio backend support. To use it, refer to docker-compose.yaml for required environment variables and mounts.
To use the PipeWire backend, set the backend to pipewire via either command line option -o pipewire or the output_backend field in the general section of the configuration file.
Similarly, to use the PulseAudio backend, set the backend to pulseaudio via either command line option -o pulseaudio or the output_backend field in the general section of the configuration file.
For use with PulseAudio, you might need to adjust authentication on your PulseAudio server (PA documentation).
Configuration File
To get access to the full range of configuration options, pass the configuration file to /etc/shairport-sync.conf in the container using the -v option or docker compose.
Building
Build Example (for arm7 devices)
docker buildx build --platform linux/arm/v7 -f ./docker/Dockerfile --build-arg SHAIRPORT_SYNC_BRANCH=development --build-arg NQPTP_BRANCH=development --no-cache -t shairport-sync:development .
SHAIRPORT_SYNC_BRANCH and NQPTP_BRANCH are required to ensure the image is built using the expected branch.
--no-cache needs to be used to force buildx to pull the NQPTP branch for new updates. This slows down the build time though so can be removed when it is not beneficial during testing.
"Classic" AirPlay
The "Classic" AirPlay only dockerfile is in the classic folder. This also includes the start.sh script used by the container.
GitHub Action Builds
Requires the following secrets to be set in the repo:
DOCKER_REGISTRY- docker.io if using Docker Hub, else set to your registry URL.DOCKER_REGISTRY_TOKEN- Access token for your registry.DOCKER_REGISTRY_USER- Login user for your registry.DOCKER_IMAGE_NAME- The name of the image, for exampleyour-registry.com/shairport-syncor justyour-username/shairport-syncif using Docker Hub.