36 Commits
Author SHA1 Message Date
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 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 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
Klemens NanniandKlemens Nanni 6dd311a1a8 Connect to NQPTP control socket on localhost
nqptp.c listens on "localhost", but shairport-sync connectes to the wildcard
address 0/0.  This apparently works on Linux and FreeBSD, but OpenBSD fails:

```
$ ktrace shairport-sync -v -u
[...]
         0.000038288 "ptp-utilities.c:243" *fatal error: error sending timing_peer_list to NQPTP
         0.000021868 "shairport.c:1728" emergency exit
$ kdump
[...]
  2319 shairport-sync STRU  struct sockaddr { AF_INET, 0.0.0.0:9000 }
  2319 shairport-sync RET   sendto -1 errno 51 Network is unreachable
[...]
```

Resolve and connect to "localhost" just like NQPTP does, resulting in
127.0.0.1 or ::1 as socket addresses.

This is required to run when configured `--with-airplay-2`.
Tested on OpenBSD/amd64 7.4-current with shairport-sync 2.4.3 and nqptp
1.2.5-dev cfa8315 (plus OpenBSD fixes).

I expect Linux and FreeBSD to work as before, but have not tested it.
2024-01-27 18:56:26 +01:00
Mike Brady ccddc37c11 Fix potential bug if the timing data is inconsistent for 10 tries. 2023-09-30 15:40:40 +01:00
Mike Brady dabfee5bac Move to smi version 10, read-only interface, no mutex, write and read each record twice to ensure it is not inconsistent when read. 2023-09-11 16:02:49 +01:00
Mike Brady fd880056fb Squashed commit of the following:
Add three parameters to the backend play() function call -- (1) a flag indicating whether the samples are timed or not. If timed, (2) the timestamp and (3) the local time at which the first frame should be heard.
    Update missing pipewire library message.
    Makefile.am fix.
    Update the SHM version and fix the SHM name so that it works with FreeBSD.
    Remove redundant (?) AC_HEADER_STDC check.
    Fix compilation and installation under FreeBSD -- changes to allow building in a separate directory broke the FreeBSD build process.
    Add AC_CHECK_LIB for gcrypt in case PKG_CHECK_MODULES fails to find it.
    Find gcrypt using pkg-config
    Add code to detect when the RTSP channel goes idle for a period, and use it to reset clocks and timings, etc. so that SPS resumes correctly where the source has gone to sleep while playing a realtime stream and has subsequently woken up.
    Don't exit if a UDP Clock Control packet is empty. Also check minimum packet size.
    Remove some very experimental code which may cause memory and port leaks.
    Strip file path from the filename used in debug messages, information messages, warnings and fatal error messages.
    BB fix to Makefile.am -- overwriting the DBUS stuff with MPRIS definitions, duh.
    Fix some problems building on FreeBSD and tidy up the use of the "sed" editor.
    Fix some problems building on picore.
    Fix an uninitialised variable
    start using the "nqptp" SMI
2022-09-12 15:19:52 +01:00
Mike Brady 008e038805 Shorten the timeout on the SMI to 10 ms. 2022-05-18 22:32:52 +01:00
Mike Brady 903ba42ec5 Remove a slightly alarming and incorrect warning. Old information is dealt with elsewhere. 2022-05-14 18:59:06 +10:00
Mike Brady ace5537ad3 Quieten a few debug messages. 2022-03-16 12:51:00 +11:00
Mike Brady a382ac6672 Clang Format 2022-03-14 11:56:43 +11:00
Mike Brady 0f5d1ec929 Remove redundant ptp_access_mutex mutex -- don't need it anymore. 2022-02-28 18:09:19 +11:00
Mike Brady 73766b0705 Clean up ptp_shm_interface_open and add code to warn if the timing sample shared in the shm is too old -- may indicate NQPTP is gone. 2022-02-28 17:59:43 +11:00
Mike Brady 18ed1bda87 Add the opening of the shm interface to the startup process and die if it can't be done. Quieten some debug messages. 2022-02-27 21:23:14 +11:00
Mike Brady 322f07720a Require NQPTP to be running and create the SHM interface at startup. 2022-02-27 13:00:03 +11:00
Mike Brady 341f67acd2 Redesign the ptp shm utilities to cater for opening once and closing once but potentially called for opening many times. 2022-02-26 08:32:15 +00:00
Mike Brady 04aba03b4f Stop storing the timing peer list. Clean up generation of device's timing addresses (and fix a bug). Use unique SMI interface for access to NQPTP. 2021-12-30 11:03:34 +00:00
Mike Brady 35317687f9 access the SMI named in the nqptp_shared_memory_interface_name 2021-12-29 10:22:44 +00:00
Mike Brady 966d68bdec Begin to get SPS to give a unique shm interface name to nqptp. Also clang format 2021-12-27 12:19:01 +00:00
Mike Brady 30b9d15e36 Quieten a few debug mssages, slightly shorten the minimum lead time needed for good initial sync. 2021-12-22 13:47:49 +00:00
Mike Brady 6f7e894777 Set the minimum bus mastership time to two seconds. Turn on a debug message. 2021-12-20 12:15:59 +00:00
Mike Brady be4807fff2 Wait for that mutex for longer. (Don't know why yet...) 2021-12-06 18:09:29 +00:00
Mike Brady c0a3dacf30 Working to check for divide / mod by 0's 2021-11-17 10:35:21 +00:00
Mike Brady c4b5e0928f Use a local copy of the nqptp shared memory interface description file. 2021-07-22 11:01:53 +01:00
Mike Brady 861455f703 Add some information about the length of time a new clock master has been monitored for ("history") and warn if the PTP information hasn't been updated for more than a second (not extensively tested). 2021-06-23 12:18:04 +01:00
Mike Brady e925e196c8 Changes to allow it to compile in FreeBSD and fix a few issues that were picked up by clang 10. 2021-06-22 13:49:11 +01:00
Mike Brady 6edaa58595 increase the wait time for the shm access mutex. 2021-06-06 15:49:03 +01:00
Mike Brady a109b587ec Flush seems to be working properly and reliably. Some audio glitches removed too by dropping the first two AAC blocks of any passage. Crude. Flush diagnostic linked list stuff left in place. 2021-05-30 11:17:06 +01:00
Mike Brady 637c8132e9 Move initial delay when using a new bus master to rtp.c and wait, if possible, whenever a new master comes along, to allow it to settle before using it. 2021-05-26 18:12:45 +01:00
Mike Brady 26ce13d511 a slightly more rational clock handling regime, I hope. Wait for 400 ms when a clock becomes master. Wait five seconds when you get a new master clock. 2021-05-26 16:48:25 +01:00
Mike Brady 3f77994948 more closely check for time information being available. 2021-05-11 18:52:02 +01:00
Mike Brady a563d5e847 Quieten some more debug messages. Fix a misleading clock status return. 2021-05-10 16:03:02 +01:00
Mike Brady 04c7f84564 Improve NQPTP clock diagnostics, tidy up some messages. 2021-05-10 14:16:57 +01:00
Mike Brady a68f28ac2b clang format 2021-05-01 14:09:38 +01:00
Mike Brady 61b6b5934d check that the clock is valid and reduce the Buffered Audio lead time to 0.25 seconds 2021-05-01 11:03:45 +01:00
Mike Brady 0af7f4fbde Bring in files and settings from sps2-ex1 2021-04-27 20:07:50 +01:00