610 Commits
Author SHA1 Message Date
prhodey 4df0145372 Defer buffered AirPlay 2 latency offset conversion 2026-08-19 20:10:50 -04:00
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
TristanInSec 476677b0f0 Fix OOB reads and infinite loop in TLV and DMAP parsers
pair_ap/pair-tlv.c (pair_tlv_parse):
- Add bounds check before reading type and length bytes (i + 2 > length)
- Fix off-by-one in chunked TLV scan loop (j + 1 < length)
- Add bounds checks inside data copy loop to prevent OOB memcpy
- Add else branch to advance index when size == 0 (prevents infinite loop)

rtsp.c (handle_set_parameter_metadata):
- Require 8 bytes remaining for tag + length fields (off + 8 <= cl)
- Validate value length against remaining buffer before read

Reported-by: Tristan Madani <tristan@talencesecurity.com>
Signed-off-by: Tristan Madani <tristan@talencesecurity.com>
2026-06-16 10:33:18 -04:00
Mike Brady 0e6ca7b7b2 When an immediate flush is requested, reset the PTP clock anchor information immediately to disable clocking until play is resumed. 2026-06-14 15:21:11 +01:00
Mike Brady 2d89d2bff2 Fix a compilation bug in Classic build. 2026-05-30 23:21:55 +01:00
Mike Brady 191f06e7f7 Fix temporary patch. 2026-05-30 23:01:35 +01:00
Mike Brady 3e46eec634 In TEARDOWN, if it has a plist with a streams item in it, jist clost the player thread. If the plist exists but is empty, close the connection. 2026-05-30 22:58:36 +01:00
Mike Brady 090b609fe8 Undo a change that exposes a race condition. The race condition needs to be fixed first! 2026-05-30 16:59:23 +01:00
Mike Brady e472cee76c After a teardown, ask the RTSP thread to terminate... and thus close everything down. 2026-05-29 17:13:17 +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 9d10249735 Update help information about password and stuffing modes. Quieten some debug messages. 2026-05-08 07:51:51 +01:00
Mike Brady eb82fa32b7 Fix an error if built without metadata support 2026-05-01 16:09:58 +01:00
Mike Brady 83de0207ac Merge branch 'development' of github.com:mikebrady/shairport-sync into development
Small changes fixed.
2026-04-26 10:30:53 +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
Mike Brady 07ca1891da Make code using getifaddrs uncancellable to prevent a "Unexpected error 9 on netlink descriptor" error. 2026-04-13 16:31:32 +01:00
Mike Brady 9dd303ef5d Quieten some more currently-irrelevant debug messages. 2026-03-07 12:25:28 +00:00
Mike Brady 57c3ec9ee4 Reset anchor information when pausing. Also silence some irrelevant debug messages. 2026-03-02 19:02:21 +00:00
Mike Brady daa985e4e4 Turn off many currently-irrelevant debug messages by setting their level to 4, meaning they will never be displayed. 2026-03-01 13:43:11 +00:00
Mike Brady 16b6534ad3 further changes to remove compilation warnings on 32-bit builds 2025-12-31 19:02:16 +00:00
Mike Brady 3d148f026a Move to -Wformat=2 checking in Linux 2025-12-30 18:52:01 +00:00
Mike Brady 691d71f356 More fixes due to tightening the checks on debug/die/inform/warn varadic arguments. 2025-12-30 16:56:30 +00:00
Mike Brady 3aa34cd712 fix lots of errors calling debug() with incorrect argument patterns. 2025-12-30 14:59:27 +00:00
Mike Brady 60278863ce Add some checks on cancelled deferred flushes and over-running immediate flushes. Quieten some other messages. 2025-12-15 12:50:10 +00:00
Mike Brady fb5b434f55 Quieten some debug messages. 2025-12-14 15:27:12 +00:00
Mike Brady 07b60e7112 1. Add the ability to work back through queued buffers to find the first buffer that’s older than the given one. This is to enable the replacement of deciphered buffers with buffers that arrive later but are timed earlier.
Added functions that relate to this are: get_revised_seqno() to wind back through the queued buffers and clear_buffers_from() to free buffers that are already occupied.
2. Clean up get_audio_buffer_size_and_occupancy() and replace it with get_audio_buffer_occupancy().
3. Add a new general setting: audio_decoded_buffer_desired_length_in_seconds for managing the size of the player buffer queue when the source is buffered audio. Default is 0.75 seconds so that we can step back up to that time if older buffers appear.
2025-12-14 10:17:38 +00:00
Mike Brady ee56f778fd Remove redundant (?) calls to 'prepare_decoding_chain()'. 2025-12-11 16:44:16 +00:00
Mike Brady 7848e88b81 Set the type to '96' for Classic compatibility mode. Quieten some debug messages. 2025-12-11 15:34:12 +00:00
Mike Brady bc384466e0 Set the AirPlay type to ap_1 and the timing type to ts_ntp when you get an ANNOUNCE to signify a Classic AirPlay session has been started. 2025-12-11 11:03:18 +00:00
Mike Brady 489bfd7862 Add a check for EINTR to accept() calls. 2025-12-09 17:13:18 +00:00
Mike Brady e9f60c89d2 Cleaned up the get_play_lock and release_play_lock stuff and placed them in the right (?) places for AP2, AP1 compatibiity and Classic AP. Fixed the setting of flags and GID in Bonjour. 2025-12-09 12:10:05 +00:00
Mike Brady f2de7fadef Start using get_play_lock and release_play_lock and enable them to turn on and off the appropriate bonjour flags. 2025-12-08 09:50:54 +00:00
Mike Brady 5969896612 release principal conn when terminating a listener loop, set the airplay_stream_type for a classic airplay session. 2025-12-06 15:05:58 +00:00
Mike Brady 21e7d628ef Make cancel_all_RTSP_threads be specific about what kind of listeners it will kill, if needed. Quieten a few more messages. 2025-12-05 13:29:35 +00:00
Mike Brady a755a26e92 Move clock setup and start from Setup Phase 1 to Setup Phase 2. clear_all_conns now clears every type of connection, not just airplay. Clean up, rename and remove some old stuff and quieten yet more debug messages. 2025-12-05 12:10:15 +00:00
Mike Brady b82ae79852 Quieten a few more debug messages 2025-12-05 10:05:57 +00:00
Mike Brady a062f83abe Quieten lots of debug messages. 2025-12-05 08:49:22 +00:00
Mike Brady aac6913681 Stop the player thread from resetting the NTPTP client clock when it finishes. 2025-12-05 08:33:18 +00:00
Mike Brady 0e274eb760 Balking when connecting to HPM. 2025-12-04 11:35:00 +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 341a1f8d5d Move a function so that it can be build without the FFmpeg library, duh. 2025-12-03 16:13:38 +00:00
Mike Brady 93bafe304a Modify/simplify the TEARDOWN handling in AP2 mode. Allow the threads to natrually terminate when ports are closed by the client. 2025-12-03 15:56:38 +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 e12a3ed7b2 Do a long-overdue rebuild of the buffered audio processor and, with everything we have figured out, implement a cleaner method to handle both immediate and deferred flush requests. Remove lots of old flags and redundant code. Leave in a few debug messages. 2025-11-16 16:58:34 +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 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
Mike Brady e4d3c6f7e8 Fix a potential bug by checking that a buffer is not zero before attempting to deallocate it. 2024-12-04 16:06:22 +00:00
Mike Brady da1c20c672 Quieten some debug messages. 2024-12-02 10:59:29 +00:00
Mike Brady ab6225c1ac Add some extra diagnostics to investigate a read of zero bytes. 2024-11-02 14:44:12 +00:00
Mike Brady aa3af3b368 Add a check for when a read() returns zero. 2024-10-31 17:28:12 +00:00
Mike Brady 419ff394f5 Remove watchdog stuff. USe the session timeout to set the TCP keep intervals and stuff. Change response to ETIMEDOUT to rtsp_read_request_response_immediate_shutdown_requested. 2024-06-29 20:04:29 +01:00