Commit Graph
142 Commits
Author SHA1 Message Date
Mike Brady 83ae1d286b Add a new exit handler to enable Shairport Sync to exit cleanly — that is, on exit, to clean up everything, e.g. open files, ports, sockets, devices, threads, it has been using.
If cleanup isn’t finished after one second, exit will occur unconditionally.
Use the new exit handler for normal exit, for SIGINT and SIGTERM handling, for abnormal exit after fatal errors, and for handling quit requests from the D-Bus and MPRIS interfaces.

When an unfixable error occurs without an installed unfixable error handler, unlock the mutex protecting Shairport Sync’s alsa backend to permit a clean exit.

Fix a very low-level mutex-locking error that interfered with debugging.

Simplify much mutex lock handling.
Remove lots of old and unused code, variables and definitions.

Update audio_sndio.c to remove some harmless compiler warnings.

Undo adding two seconds for messages to be output before _Exit() on die() to allow messages to be output...
Undo making die() exit unconditionally.
2026-07-16 14:51:06 +01:00
Mike Brady f30dd7aee6 Enhancements
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.
2026-05-18 09:57:12 +01:00
Mike Brady 11052b7896 Lot of changes here.
1. check_classic_mac_basic.yml — update to latest macOS-latest
2. docker-on-push-tag-or-pr — dependant updates
3. FFTConvolver — fix a compilation warning when the DEBUG flag is turned off
4. Reorganise some source files — e.g. move most of the metadata stuff into a subdirectory
5. Remove unused special-purpose AirPlay 2 RC event handler.
6. Reorganise source files and source code relating to the standard event handler.
7. Check configuration settings a little more carefully to offer more meaningful diagnostics.
8. Add password to AirPlay 2 and reorganise initialisation to set AirPlay 2 flags accordingly.  Also, remove redundant airplay_pin.
9. Remove redundant debug facility definitions from common.h
10. Make it possible to omit all the dacp stuff from a build.
11. Make it possible to omit metadata multicast from a build.
12. Add AP2-native metadata by setting bit 50 of features to true.
13. Improve stability when pre-empting an existing play session.
14. Fix a few compiler warnings in the pair_ap library.
15. Ensure that the audio format is known before starting synchronisation.
16. Improve handle_configure to set/clear a new config setting. Doesn’t seem to do anything…
17. Experimentally turn off bit 46 of AirPlay 2 features — seems to stop failing pair-verify attempts.
2026-04-26 10:23:18 +01:00
Hugo VilleneuveandHugo Villeneuve 6a94eeb926 Use common service file for avahi
Use variable substitution to simplify service file for optional avahi.

This will also help to simplify adding future service dependencies.

Signed-off-by: Hugo Villeneuve <hvilleneuve@dimonoff.com>
2026-01-26 10:24:22 -05:00
Mike Brady 3d148f026a Move to -Wformat=2 checking in Linux 2025-12-30 18:52:01 +00:00
Mike Brady ceb1f804b6 Tighten warnings for format issues. 2025-12-30 15:09:04 +00:00
Mike Brady 489bfd7862 Add a check for EINTR to accept() calls. 2025-12-09 17:13:18 +00:00
Mike Brady 009a13dfe5 Separate out the buffered audio processor, the buffered reader and the mod 2^23 aritemetic. 2025-12-03 17:44:50 +00:00
Mike Brady 1b4838df52 extend the new build flags to other architectures 2025-12-03 15:49:47 +00:00
Mike Brady 7dac575602 Move debug stuff into utilites folder. Move structured_buffer stuff into its own files, duplicate rtp_event_receiver to ap2_event_handler and ap2_rc_event_handler. 2025-12-02 12:59:54 +00:00
Mike Brady 54445ee8f5 Separate out the debug facilities into their own files. Clean up and add a few associated methods. 2025-11-27 12:37:16 +00:00
Mike Brady d043f98330 Update the convolution code:
(1) to be multithreaded,
    (2) to work on multichannel audio and
    (3) to work on 48k and 44.1k audio.

    Allow multiple impulse response (IR) files with a new setting: "convolution_ir_files"
    When convolution starts, Shairport Sync will look for an IR file with a sample rate
    matching the input (44.1k or 48k) and channel count.
    If one can't be found, it will look for a single-channel IR file with the same rate.
    It will always choose the first match in the file list supplied "convolution_ir_files".

    Allow multithreading -- use the "convolution_thread_pool_size" to set the number of threads to use.

    Deprecate "convolution" -- use "convolution_enabled" instead.
    Deprecate "convolution_max_length" -- use "convolution_max_length_in_seconds" instead.
    Deprecate "convolution_ir_file" -- use "convolution_ir_files" instead.
    Update corresponding D-Bus methods and properties.

Update the loudness code to work on 48k and well as 44.1k audio and with multichannel audio.

    Deprecate "loudness" -- use "loudness_enabled" instead.
    Update corresponding D-Bus methods and properties.

Fix a deprecated FFmpeg warning.

Update HiFi-LoFi FFT convolver to latest available.
2025-10-13 13:26:20 +01:00
Mike Brady edfb9ccc7b Stop installing a user startup script. 2025-04-14 09:30:16 +01:00
Mike Brady 60143518c2 This squashed commit comprises a long series of improvements, bug fixes, optimizations, and new feature additions:
- 48,000 frames per second operation,
 - 48k lossless stereo, 5.1 and 7.1 surround sound
 - Multichannel and multi rate operation on ALSA, PipeWire, PulseAudio, FreeBSD, stdout and unix pipe output backends.

Automatic, flexible and controllable output format (rate, sample format and channel count) selection.

Full FFmpeg integration to support transcoding, resampling, and new audio formats.

Better operation on lower powered devices down to e.g. Raspberry Pi B.

Reduced Docker image sizes with a slimmed-down FFmpeg library.

Enhanced timestamp handling for better synchronization.

Improved the sync error calculation.

A new "vernier" resampling and interpolation method for low-power CPUs.

Bug fixes and minor enhancements.

Note -- there are many breaking changes from previous versions of Shairport Sync!
2025-02-23 13:31:17 +00:00
Hugo Villeneuve 2dfeaa6825 Add configure option to enable/disable creation of user/group
Useful for Yocto, for example, where groupadd or getenv is not available.

Enabled by default, to keep same behavior as before.
2024-03-07 00:20:39 -05:00
Mike Brady cf10ff9d7a Build scripts/shairport-sync.service, scripts/shairport-sync.service-avahi and scripts/shairport-sync unconditionally for Linux to facilitate different installation methods. 2024-03-04 11:13:56 +00:00
Mike BradyandGitHub f37d1b8eb1 Merge pull request #1795 from klemensn/manual-section
Move shairport-sync manual from section 7 to 1
2024-01-29 16:32:36 +00:00
Zane van Iperen ec3b5ffca2 Makefile.am: allow manually installing config files
Adds a "install-config-files" Makefile target that installs the config
files and dbus policies to DESTDIR=, regardless of whether
--with{,out}-configfiles is specified.
2024-01-29 02:33:53 +10:00
Klemens NanniandKlemens Nanni 8ae635e78e Move shairport-sync manual from section 7 to 1
From mandoc man(1) [-s] section:
                   1         General commands (tools and utilities).
                   [...]
                   7         Miscellaneous information.

From GNU man(1) DESCRIPTION:
     1   Executable programs or shell commands
     [...]
     7   Miscellaneous (including macro packages and conventions), e.g.
         man(7), groff(7)

shairport-sync is an executable, shairport-sync(1) ought to be its
documentation, not merely miscellaneous information.

OpenBSD adjusts this in its audio/shairport-sync port/package ever since.
2024-01-27 19:40:04 +01:00
Mike Brady b3db7e88cf Small bug fixes 2023-09-11 15:58:49 +01:00
Mike Brady a0e9c0ac34 add --broken to the git describe call 2023-05-21 13:42:34 +01:00
Mike Brady 36ed65fc84 Simplify some entries in MAkefile.am -- don't need them anymore. 2022-10-24 12:11:17 +01:00
Mike Brady 1fb0276bca Modify the Makefile.am entry for generating gitversion.h so that it works in a separate build directory and on FreeBSD as well as Linux. 2022-10-24 11:36:18 +01:00
Mike Brady 11495fd760 Correct a hacky and incorrect kludge so that the Makefile works on Linux and FreeBSD. 2022-10-11 21:10:53 +01:00
Mike Brady 86a52964f9 Don't automatically try to build the man file -- assume it's already there. Add a separate Makefile for the man directory. Only generate the man file (not the html file) by default. Specify the man file in this directory for installation during installation of shairport sync 2022-10-10 22:39:15 +01:00
Mike Brady 76388d1325 Automake seems to get confused about where common.c is, due perhaps to its dependence on gitversion.h. This seems to fix it. 2022-10-10 20:50:42 +01:00
Mike Brady 5adb76c37d Include lightweight tags (that GitHub uses to mark releases) when forming the version number and version string. Duh. 2022-10-10 10:51:33 +01:00
Mike Brady 0cc97d5099 Start using libgcrypt again, as there appears to be a memory leak in openssl when used in the pair_ap library. 2022-10-07 16:17:42 +01:00
Mike Brady 1296b8f2f8 Fix for building for System V. 2022-09-29 11:02:46 +01:00
Mike Brady 7f9e8116d7 Look for the shairport-sync.service file in the scripts folder in the _build_ folder, because it's generated by ./configure. Same with the SystemV init file. 2022-09-28 17:25:27 +01:00
Mike Brady 30aaabc47e Remove the need for the gcrypt library; use openssl instead, as it's mandatory elsewhere in Shairport Sync. 2022-09-26 17:42:13 +01:00
Isioma Nnodum 09f7656c3f Corrected path to scripts directory in INSTALL_SYSTEMD_TARGET 2022-09-10 12:16:54 -04:00
Mike Brady 14bda21b68 Add a reference to the source directory. 2022-09-10 13:49:33 +01:00
Mike Brady 1092a8c19b Fix compilation and installation under FreeBSD -- changes to allow building in a separate directory broke the FreeBSD build process. 2022-09-10 10:30:43 +01:00
Mike Brady 3419f09049 Merge branch 'autoconf-build-dir' of https://github.com/lrusak/shairport-sync into lrusak-autoconf-build-dir 2022-08-15 08:52:20 +01:00
Mike Brady c458114c4c Add distinct flags for Darwin -- turn off deprecation warnings. 2022-08-08 12:16:40 +01:00
Mike Brady 1f82109577 Use printf in place of echo for portability to Mac OS.
Update author
2022-08-08 09:56:25 +01:00
Lukas Rusak 931c7ed2ef Makefile.am: allow installing from separate build directory 2022-07-28 20:34:10 -07:00
Lukas Rusak 40e28ba2c7 Makefile.am: allow building from separate build directory 2022-07-28 20:34:10 -07:00
Mike Brady 23d0502ffa Revert changes at 5011dc09d5 -- not quite ready yet. 2022-07-11 11:12:39 +01:00
Lukas Rusak 17e26a03e6 Makefile.am: allow installing from separate build directory 2022-07-05 15:22:10 -07:00
Lukas Rusak 5fdfcac6f3 Makefile.am: allow building from separate build directory 2022-07-05 15:19:59 -07:00
Mike Brady 905d53a0f8 Look for "nologin" in the right place, duh. 2022-07-03 15:24:05 +01:00
Mike Brady bcc809edb8 Always update the startup script in FreeBSD 2022-05-23 10:29:47 +01:00
Mike Brady 38bbad6f63 Remove the requirement for Avahi in the systemd startup file unless Avahi is included in the build. 2022-04-05 07:22:34 +01:00
Mike Brady ce39f00a0b Don't overwrite service files if they already exist. 2021-11-25 17:42:48 +00:00
Mike BradyandGitHub 8c9f438bda Merge pull request #1177 from lrusak/pipewire
pipewire: add initial support
2021-07-22 16:35:10 +01:00
Mike Brady 1a21a1aaae Switch to libgcrypt for the pairing library for compatibility with Ubuntu on an M1. 2021-06-29 10:23:56 +01:00
Mike Brady 2203d6a335 Start using automatic git-based versioning 2021-05-14 22:49:17 +01:00
Mike Brady db6cadb05c Always update the systemd shairport-sync.service file. 2021-05-14 12:26:25 +01:00