Shairport Sync
=============
--Shairport Sync is an AirPlay audio player — it plays audio streamed from iTunes, iOS devices and other AirPlay sources such as Quicktime Player, ForkedDaapd among others.
++Shairport Sync is an AirPlay audio player — it plays audio streamed from iTunes, iOS devices and other AirPlay sources such as Quicktime Player and ForkedDaapd, among others.
Audio played by a Shairport Sync-powered device stays synchronised with the source and hence with similar devices playing the same source. In this way, synchronised multi-room audio is possible without difficulty. (Hence the name Shairport Sync, BTW.)
Shairport Sync does not support AirPlay video or photo streaming.
The latency to be used is specified by the source when it negotiates with Shairport Sync. Most sources set a latency of 88,200 frames — exactly two seconds. Recent versions of iTunes and forkedDaapd use a latency of 99,577 frames.
--Timestamps are measured relative to the source computer's clock – the `source clock`, but timing must be done relative to the clock of the computer running Shairport Sync – the `local clock`. The source and local clocks are synchronised by Shairport Sync, usually to within a fraction of a millisecond, using a variant of NTP synchronisation protocols.
++Timestamps are measured relative to the source computer's clock – the `source clock`, but timing must be done relative to the clock of the computer running Shairport Sync – the `local clock`. This is done by synchronising the two clocks, usually to within a fraction of a millisecond, using a variant of NTP synchronisation protocols.
To maintain the exact latency required, if an output device is running slow relative to the source, Shairport Sync will delete frames of audio to allow the device to keep up. If the output device is running fast, Shairport Sync will insert frames to keep time. The number of frames inserted or deleted is so small as to be almost inaudible on normal audio material. Frames are inserted or deleted as necessary at pseudorandom intervals. Alternatively, with `libsoxr` support, Shairport Sync can resample the audio feed to ensure the output device can keep up. This is less obtrusive than insertion and deletion but requires a good deal of processing power — most embedded devices probably can't support it. The process of insertion/deletion or resampling is rather inelegantly called “stuffing”.
--Shairport Sync is a pretty substantial rewrite of the fantastic work done in Shairport 1.0 by James Laird and others — please see https://github.com/abrasive/shairport/blob/master/README.md#contributors-to-version-1x for a list of the contributors to Shairport 1.x and Shairport 0.x. From a "heritage" point of view, Shairport Sync is a fork of Shairport 1.0.
++Shairport Sync is a substantial rewrite of the fantastic work done in Shairport 1.0 by James Laird and others — please see https://github.com/abrasive/shairport/blob/master/README.md#contributors-to-version-1x for a list of the contributors to Shairport 1.x and Shairport 0.x. From a "heritage" point of view, Shairport Sync is a fork of Shairport 1.0.
Shairport Sync is mainly designed for `alsa` and thus for Linux, although since `alsa` has been ported to FreeBSD, Shairport Sync runs in FreeBSD too. It must have direct access to the output device, which must be a real sound card capable of working with 44,100 samples per second interleaved PCM stereo (you'll get a message in the logfile if there's a problem).
Note: Historically, Shairport Sync has taken its settings from command line arguments. While this is still the case, it does not always work well across distributions. Accordingly, from version 2.4 onwards, Shairport Sync reads settings from the file `/etc/shairport-sync.conf`. Access to new features will only be provided via the settings file.
-Building And Installing the Development Version
+Building And Installing
---------------------
- If you wish to install Shairport Sync on OpenWrt, Arch or Fedora platforms, please follow the appropriate instructions below. Limited support is also available for MAc OS X. Otherwise follow the General Build Instructions. Then, when the program has been installed, refer to the section on Configuring Shairport Sync that follows.
++If you wish to install Shairport Sync on OpenWrt, Arch or Fedora platforms, please follow the appropriate instructions below. Limited support is also available for Mac OS X. Otherwise follow the General Build Instructions. Then, when the program has been installed, refer to the section on Configuring Shairport Sync that follows.
-The following procedures will install the development version of the shairport-sync application into your system. Before continuing, you should check to see if shairport-sync is already installed – you can use `which shairport-sync` to find where it is located, if installed. If it is installed you should delete it – you may need superuser privileges. After deleting, check again in case further copies are installed elsewhere.
+**Note**
+
+The following procedures will install the shairport-sync application into your system. Before continuing, you should check to see if shairport-sync is already installed – you can use `which shairport-sync` to find where it is located, if installed. If it is installed you should delete it – you may need superuser privileges. After deleting, check again in case further copies are installed elsewhere.
(If the existing installation of shairport-sync is where the new copy will be installed into, it will be overwritten; sometimes, however, the installation is to another location, so it is safer, initially, to delete previous versions manually.)
- **Debian:**
- `shairport-sync` is in the Debian archive and is scheduled for release with Debian Stretch (9): https://tracker.debian.org/shairport-sync. A backport for Debian Jessie (8) may be provided given enough demand.
-
+**Ubuntu:**
+Personal Package Archives for Shairport Sync master and development branches are available at https://launchpad.net/~dantheperson. A `shairport-sync` installer package is available in Ubuntu 16.04, currently in its alpha phase.
+
+**OpenWrt:**
+There is a Shairport Sync package in OpenWrt `trunk`. Also, there's an OpenWrt package at https://github.com/mikebrady/shairport-sync-for-openwrt, including one that builds back to `Barrier Breaker`.
+
+**Arch Linux:**
+Shairport Sync is available for `x86_64` and `i686` platforms in the Arch Linux Community Repository -- search for `shairport-sync`. See also https://www.archlinux.org/packages/.
+
+An Arch Linux installation package, suitable for compilation on any platform, is available at [EliaCereda/shairport-sync-PKGBUILD](https://github.com/EliaCereda/shairport-sync-PKGBUILD).
+
+**Mac OS X:**
+A [HomeBrew](http://brew.sh) package exists for Shairport Sync. With HomeBrew installed, Shairport Sync can be installed using the command `$brew install shairport-sync`. Note that the installation uses the `libao` library and so synchronisation is not available — playback glitches will occur occasionally, when the `ao` system's buffers overflow or underflow.
+
+**Fedora:**
+Install the toolchain and pre-requisites, if necessary:
+```
+% sudo yum install make automake gcc gcc-c++ kernel-devel
+% sudo yum install alsa-lib-devel autoconf automake avahi-devel libconfig-devel libdaemon-devel openssl-devel popt-devel soxr-devel
+```
+Download the tarball from the "releases" tab on github or use `wget` and then use `rpmbuild`. This example is for version 2.6:
+```
+% wget -O shairport-sync-2.6.tar.gz https://github.com/mikebrady/shairport-sync/archive/2.6.tar.gz
+% rpmbuild -ta shairport-sync-2.6.tar.gz
+```
+The `-ta` means "build all from this tarball".
+
+The RPM will be built in a directory and will have a pathname like, for example, `~/rpmbuild/RPMS/i686/shairport-sync-2.6-1.fc22.i686.rpm` You should then install it with (for this example):
+```
+%sudo rpm -i ~/rpmbuild/RPMS/i686/shairport-sync-2.6-1.fc22.i686.rpm
+```
+You may have to manually create the directory `/var/shairport-sync` for the installation to succeed. Having edited the configuration file `/etc/shairport-sync.conf` as appropriate (see "Configuring Shairport Sync" below), enable and start the service with:
+```
+%sudo systemctl enable shairport-sync.service
+%sudo systemctl start shairport-sync.service
+```
+Sincere thanks to all package contributors!
+
++**Cygwin**
++Please see the guide at [CYGWIN.md](https://github.com/mikebrady/shairport-sync/blob/master/CYGWIN.md).
++
+**General Build Instructions**
+
To build Shairport Sync from sources on Debian, Ubuntu, Raspbian, etc. follow these instructions.
The following libraries are required:
- `apt-get install avahi-daemon libavahi-client-dev` if you want to use Avahi (recommended).
- `apt-get install libssl-dev` if you want to use OpenSSL and libcrypto, or use PolarSSL otherwise.
- `apt-get install libpolarssl-dev` if you want to use PolarSSL, or use OpenSSL/libcrypto otherwise.
--- `apt-get install libsoxr-dev` if you want support for libsoxr-based resampling. This library is in many recent distributions, including Jessie and Raspioan Jessie; if not, instructions for how to build it from source for Raspian/Debian Wheezy are available at [LIBSOXR.md](https://github.com/mikebrady/shairport-sync/blob/development/LIBSOXR.md).
++- `apt-get install libsoxr-dev` if you want support for libsoxr-based resampling. This library is in many recent distributions, including Jessie and Raspioan Jessie; if not, instructions for how to build it from source for Raspian/Debian Wheezy are available at [LIBSOXR.md](https://github.com/mikebrady/shairport-sync/blob/master/LIBSOXR.md).
Download Shairport Sync:
It's not unusual to have resend requests, late packets and even missing packets if some part of the connection to the Shairport Sync device is over WiFi. Late packets can sometimes be asked for and received multiple times. Sometimes late packets are sent and arrive too late, but have already been sent and received in time, so weren't needed anyway...
"Min DAC queue size" is the minimum size the queue of samples in the output device's hardware buffer was measured at. It is meant to stand at 0.15 seconds = 6,615 samples, and will go low if the processor is very busy. If it goes below about 2,000 then it's a sign that the processor can't really keep up.
++
++Troubleshooting
++---------------
++Please refer to [TROUBLESHOOTING](https://github.com/mikebrady/shairport-sync/blob/master/TROUBLESHOOTING.md) for a few hints, contributed by users.
++
++Version 2.8.1 – Stable Version
++----
++Version 2.8.1 is derived from development version 2.9.2 and contains important bug fixes.
++
++For full details, please refer to the release notes here, back as far as 2.9.1.
++
+ Version 2.9.2 – Development Version
+ ----
+ Version 2.9.2 focusses on further bug fixes and stability improvements.
+ * Enhanced stability: an important bug has been fixed in the handling of missing audio frames – i.e. what happens when a frame of audio is truly missing, after all attempts to fetch it have been unsuccessful. The bug would cause Shairport Sync to do an unnecessary resynchronisation, or, if resync was turned off, to jump out of sync. This is a long-standing bug – thanks to [Jörg Krause](https://github.com/joerg-krause) for identifying it.
+ * An extra diagnostic has been added which gives the mean, standard deviation and maximum values for inter-packet reception time on the audio port. It may be useful for exploring line quality.
+
+ Version 2.9.1 – Development Version
+ ----
+ Version 2.9.1 focusses on bug fixes and stability improvements.
+ * Stability improvements are concentrated on what happens when a play sessions ends and is followed immediately by a new session. This happens in iOS 9.2 when you click to the next track or to the previous track. It also happens playing YouTube videos when a Mac's System Audio is routed through AirPlay. Thanks to [Tim Curtis](https://github.com/moodeaudio) for help with these issues.
+ * A workaround for an apparent flushing issue in TuneBlade has been included. Thanks to [gibman](https://github.com/gibman) for reporting this issue.
+ * A number of bug fixes have been made to `configure.ac` – thanks to [Jörg Krause](https://github.com/joerg-krause).
+
Version 2.8 – Stable Version
----
Version 2.8 is derived from version 2.7.10 with slight documentation updates. Here is a summary of changes between the last stable version – 2.6 – and this version. For full details, refer to the release notes here, back as far as 2.7.
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.50])
- AC_INIT([shairport-sync], [2.8.0], [mikebrady@eircom.net])
-AC_INIT([shairport-sync], [2.9.2], [mikebrady@eircom.net])
++AC_INIT([shairport-sync], [2.8.1], [mikebrady@eircom.net])
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([shairport.c])
AC_CONFIG_HEADERS([config.h])
+++ /dev/null
--// !$*UTF8*$!
--{
-- archiveVersion = 1;
-- classes = {
-- };
-- objectVersion = 46;
-- objects = {
--
--/* Begin PBXFileReference section */
-- 2785806419BB488D00C0B34D /* alac.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = alac.c; sourceTree = "<group>"; };
-- 2785806519BB488D00C0B34D /* alac.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = alac.h; sourceTree = "<group>"; };
-- 2785806619BB488D00C0B34D /* audio.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = audio.c; sourceTree = "<group>"; };
-- 2785806719BB488D00C0B34D /* audio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = audio.h; sourceTree = "<group>"; };
-- 2785806819BB488D00C0B34D /* audio_alsa.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = audio_alsa.c; sourceTree = "<group>"; };
-- 2785806919BB488D00C0B34D /* audio_ao.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = audio_ao.c; sourceTree = "<group>"; };
-- 2785806A19BB488D00C0B34D /* audio_dummy.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = audio_dummy.c; sourceTree = "<group>"; };
-- 2785806B19BB488D00C0B34D /* audio_pipe.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = audio_pipe.c; sourceTree = "<group>"; };
-- 2785806C19BB488D00C0B34D /* audio_pulse.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = audio_pulse.c; sourceTree = "<group>"; };
-- 2785806D19BB488D00C0B34D /* audio_sndio.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = audio_sndio.c; sourceTree = "<group>"; };
-- 2785806E19BB488D00C0B34D /* AUTHORS */ = {isa = PBXFileReference; lastKnownFileType = text; path = AUTHORS; sourceTree = "<group>"; };
-- 2785807119BB488D00C0B34D /* common.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = common.c; sourceTree = "<group>"; };
-- 2785807219BB488D00C0B34D /* common.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = common.h; sourceTree = "<group>"; };
-- 2785807C19BB488D00C0B34D /* configure.ac */ = {isa = PBXFileReference; lastKnownFileType = text; path = configure.ac; sourceTree = "<group>"; };
-- 2785807D19BB488D00C0B34D /* COPYING */ = {isa = PBXFileReference; lastKnownFileType = text; path = COPYING; sourceTree = "<group>"; };
-- 2785807F19BB488D00C0B34D /* documents */ = {isa = PBXFileReference; lastKnownFileType = folder; path = documents; sourceTree = "<group>"; };
-- 2785808019BB488D00C0B34D /* INSTALL */ = {isa = PBXFileReference; lastKnownFileType = text; path = INSTALL; sourceTree = "<group>"; };
-- 2785808219BB488D00C0B34D /* LICENSES */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSES; sourceTree = "<group>"; };
-- 2785808419BB488D00C0B34D /* Makefile.am */ = {isa = PBXFileReference; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
-- 2785808619BB488D00C0B34D /* mdns.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = mdns.c; sourceTree = "<group>"; };
-- 2785808719BB488D00C0B34D /* mdns.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = mdns.h; sourceTree = "<group>"; };
-- 2785808819BB488D00C0B34D /* mdns_avahi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = mdns_avahi.c; sourceTree = "<group>"; };
-- 2785808919BB488D00C0B34D /* mdns_dns_sd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = mdns_dns_sd.c; sourceTree = "<group>"; };
-- 2785808A19BB488D00C0B34D /* mdns_external.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = mdns_external.c; sourceTree = "<group>"; };
-- 2785808B19BB488D00C0B34D /* mdns_tinysvcmdns.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = mdns_tinysvcmdns.c; sourceTree = "<group>"; };
-- 2785808D19BB488D00C0B34D /* NEWS */ = {isa = PBXFileReference; lastKnownFileType = text; path = NEWS; sourceTree = "<group>"; };
-- 2785808E19BB488D00C0B34D /* player.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = player.c; sourceTree = "<group>"; };
-- 2785808F19BB488D00C0B34D /* player.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = player.h; sourceTree = "<group>"; };
-- 2785809019BB488D00C0B34D /* README */ = {isa = PBXFileReference; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
-- 2785809119BB488D00C0B34D /* README.md */ = {isa = PBXFileReference; lastKnownFileType = text; path = README.md; sourceTree = "<group>"; };
-- 2785809219BB488D00C0B34D /* rtp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = rtp.c; sourceTree = "<group>"; };
-- 2785809319BB488D00C0B34D /* rtp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rtp.h; sourceTree = "<group>"; };
-- 2785809419BB488D00C0B34D /* rtsp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = rtsp.c; sourceTree = "<group>"; };
-- 2785809519BB488D00C0B34D /* rtsp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = rtsp.h; sourceTree = "<group>"; };
-- 2785809619BB488D00C0B34D /* scripts */ = {isa = PBXFileReference; lastKnownFileType = folder; path = scripts; sourceTree = "<group>"; };
-- 2785809719BB488D00C0B34D /* shairport-sync.xcworkspace */ = {isa = PBXFileReference; lastKnownFileType = wrapper.workspace; path = "shairport-sync.xcworkspace"; sourceTree = "<group>"; };
-- 2785809819BB488D00C0B34D /* shairport.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = shairport.c; sourceTree = "<group>"; };
-- 2785809A19BB488D00C0B34D /* tinysvcmdns.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = tinysvcmdns.c; sourceTree = "<group>"; };
-- 2785809B19BB488D00C0B34D /* tinysvcmdns.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tinysvcmdns.h; sourceTree = "<group>"; };
--/* End PBXFileReference section */
--
--/* Begin PBXGroup section */
-- 2785805919BB488D00C0B34D = {
-- isa = PBXGroup;
-- children = (
-- 2785806419BB488D00C0B34D /* alac.c */,
-- 2785806519BB488D00C0B34D /* alac.h */,
-- 2785806619BB488D00C0B34D /* audio.c */,
-- 2785806719BB488D00C0B34D /* audio.h */,
-- 2785806819BB488D00C0B34D /* audio_alsa.c */,
-- 2785806919BB488D00C0B34D /* audio_ao.c */,
-- 2785806A19BB488D00C0B34D /* audio_dummy.c */,
-- 2785806B19BB488D00C0B34D /* audio_pipe.c */,
-- 2785806C19BB488D00C0B34D /* audio_pulse.c */,
-- 2785806D19BB488D00C0B34D /* audio_sndio.c */,
-- 2785806E19BB488D00C0B34D /* AUTHORS */,
-- 2785807119BB488D00C0B34D /* common.c */,
-- 2785807219BB488D00C0B34D /* common.h */,
-- 2785807C19BB488D00C0B34D /* configure.ac */,
-- 2785807D19BB488D00C0B34D /* COPYING */,
-- 2785807F19BB488D00C0B34D /* documents */,
-- 2785808019BB488D00C0B34D /* INSTALL */,
-- 2785808219BB488D00C0B34D /* LICENSES */,
-- 2785808419BB488D00C0B34D /* Makefile.am */,
-- 2785808619BB488D00C0B34D /* mdns.c */,
-- 2785808719BB488D00C0B34D /* mdns.h */,
-- 2785808819BB488D00C0B34D /* mdns_avahi.c */,
-- 2785808919BB488D00C0B34D /* mdns_dns_sd.c */,
-- 2785808A19BB488D00C0B34D /* mdns_external.c */,
-- 2785808B19BB488D00C0B34D /* mdns_tinysvcmdns.c */,
-- 2785808D19BB488D00C0B34D /* NEWS */,
-- 2785808E19BB488D00C0B34D /* player.c */,
-- 2785808F19BB488D00C0B34D /* player.h */,
-- 2785809019BB488D00C0B34D /* README */,
-- 2785809119BB488D00C0B34D /* README.md */,
-- 2785809219BB488D00C0B34D /* rtp.c */,
-- 2785809319BB488D00C0B34D /* rtp.h */,
-- 2785809419BB488D00C0B34D /* rtsp.c */,
-- 2785809519BB488D00C0B34D /* rtsp.h */,
-- 2785809619BB488D00C0B34D /* scripts */,
-- 2785809719BB488D00C0B34D /* shairport-sync.xcworkspace */,
-- 2785809819BB488D00C0B34D /* shairport.c */,
-- 2785809A19BB488D00C0B34D /* tinysvcmdns.c */,
-- 2785809B19BB488D00C0B34D /* tinysvcmdns.h */,
-- );
-- sourceTree = "<group>";
-- };
--/* End PBXGroup section */
--
--/* Begin PBXLegacyTarget section */
-- 2785805E19BB488D00C0B34D /* shairport-sync */ = {
-- isa = PBXLegacyTarget;
-- buildArgumentsString = "$(ACTION)";
-- buildConfigurationList = 2785809C19BB488D00C0B34D /* Build configuration list for PBXLegacyTarget "shairport-sync" */;
-- buildPhases = (
-- );
-- buildToolPath = /usr/bin/make;
-- buildWorkingDirectory = "/Users/mike/Documents/git/shairport-sync";
-- dependencies = (
-- );
-- name = "shairport-sync";
-- passBuildSettingsInEnvironment = 1;
-- productName = "shairport-sync";
-- };
--/* End PBXLegacyTarget section */
--
--/* Begin PBXProject section */
-- 2785805A19BB488D00C0B34D /* Project object */ = {
-- isa = PBXProject;
-- attributes = {
-- LastUpgradeCheck = 0510;
-- };
-- buildConfigurationList = 2785805D19BB488D00C0B34D /* Build configuration list for PBXProject "shairport-sync" */;
-- compatibilityVersion = "Xcode 3.2";
-- developmentRegion = English;
-- hasScannedForEncodings = 0;
-- knownRegions = (
-- en,
-- );
-- mainGroup = 2785805919BB488D00C0B34D;
-- projectDirPath = "";
-- projectRoot = "";
-- targets = (
-- 2785805E19BB488D00C0B34D /* shairport-sync */,
-- );
-- };
--/* End PBXProject section */
--
--/* Begin XCBuildConfiguration section */
-- 2785805B19BB488D00C0B34D /* Debug */ = {
-- isa = XCBuildConfiguration;
-- buildSettings = {
-- COPY_PHASE_STRIP = NO;
-- GCC_WARN_ABOUT_RETURN_TYPE = YES;
-- GCC_WARN_UNUSED_VARIABLE = YES;
-- ONLY_ACTIVE_ARCH = YES;
-- SDKROOT = macosx;
-- };
-- name = Debug;
-- };
-- 2785805C19BB488D00C0B34D /* Release */ = {
-- isa = XCBuildConfiguration;
-- buildSettings = {
-- COPY_PHASE_STRIP = YES;
-- GCC_WARN_ABOUT_RETURN_TYPE = YES;
-- GCC_WARN_UNUSED_VARIABLE = YES;
-- SDKROOT = macosx;
-- };
-- name = Release;
-- };
-- 2785809D19BB488D00C0B34D /* Debug */ = {
-- isa = XCBuildConfiguration;
-- buildSettings = {
-- COPY_PHASE_STRIP = NO;
-- DEBUGGING_SYMBOLS = YES;
-- GCC_DYNAMIC_NO_PIC = NO;
-- GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
-- GCC_OPTIMIZATION_LEVEL = 0;
-- OTHER_CFLAGS = "";
-- OTHER_LDFLAGS = "";
-- PRODUCT_NAME = "shairport-sync";
-- };
-- name = Debug;
-- };
-- 2785809E19BB488D00C0B34D /* Release */ = {
-- isa = XCBuildConfiguration;
-- buildSettings = {
-- COPY_PHASE_STRIP = YES;
-- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
-- OTHER_CFLAGS = "";
-- OTHER_LDFLAGS = "";
-- PRODUCT_NAME = "shairport-sync";
-- };
-- name = Release;
-- };
--/* End XCBuildConfiguration section */
--
--/* Begin XCConfigurationList section */
-- 2785805D19BB488D00C0B34D /* Build configuration list for PBXProject "shairport-sync" */ = {
-- isa = XCConfigurationList;
-- buildConfigurations = (
-- 2785805B19BB488D00C0B34D /* Debug */,
-- 2785805C19BB488D00C0B34D /* Release */,
-- );
-- defaultConfigurationIsVisible = 0;
-- defaultConfigurationName = Release;
-- };
-- 2785809C19BB488D00C0B34D /* Build configuration list for PBXLegacyTarget "shairport-sync" */ = {
-- isa = XCConfigurationList;
-- buildConfigurations = (
-- 2785809D19BB488D00C0B34D /* Debug */,
-- 2785809E19BB488D00C0B34D /* Release */,
-- );
-- defaultConfigurationIsVisible = 0;
-- defaultConfigurationName = Release;
-- };
--/* End XCConfigurationList section */
-- };
-- rootObject = 2785805A19BB488D00C0B34D /* Project object */;
--}
+++ /dev/null
--<?xml version="1.0" encoding="UTF-8"?>
--<Scheme
-- LastUpgradeVersion = "0510"
-- version = "1.3">
-- <BuildAction
-- parallelizeBuildables = "YES"
-- buildImplicitDependencies = "YES">
-- <BuildActionEntries>
-- <BuildActionEntry
-- buildForTesting = "YES"
-- buildForRunning = "YES"
-- buildForProfiling = "YES"
-- buildForArchiving = "YES"
-- buildForAnalyzing = "YES">
-- <BuildableReference
-- BuildableIdentifier = "primary"
-- BlueprintIdentifier = "2785805E19BB488D00C0B34D"
-- BuildableName = "shairport-sync"
-- BlueprintName = "shairport-sync"
-- ReferencedContainer = "container:shairport-sync.xcodeproj">
-- </BuildableReference>
-- </BuildActionEntry>
-- </BuildActionEntries>
-- </BuildAction>
-- <TestAction
-- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-- shouldUseLaunchSchemeArgsEnv = "YES"
-- buildConfiguration = "Debug">
-- <Testables>
-- </Testables>
-- </TestAction>
-- <LaunchAction
-- selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-- selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-- launchStyle = "0"
-- useCustomWorkingDirectory = "NO"
-- buildConfiguration = "Debug"
-- ignoresPersistentStateOnLaunch = "NO"
-- debugDocumentVersioning = "YES"
-- allowLocationSimulation = "NO">
-- <PathRunnable
-- FilePath = "/Users/mike/Documents/git/shairport-sync/shairport-sync">
-- </PathRunnable>
-- <CommandLineArguments>
-- <CommandLineArgument
-- argument = "-v"
-- isEnabled = "YES">
-- </CommandLineArgument>
-- </CommandLineArguments>
-- <AdditionalOptions>
-- <AdditionalOption
-- key = "DYLD_INSERT_LIBRARIES"
-- value = "/usr/lib/libgmalloc.dylib"
-- isEnabled = "YES">
-- </AdditionalOption>
-- <AdditionalOption
-- key = "OBJC_PRINT_EXCEPTIONS"
-- value = "YES"
-- isEnabled = "YES">
-- </AdditionalOption>
-- <AdditionalOption
-- key = "USERBREAK"
-- value = "1"
-- isEnabled = "YES">
-- </AdditionalOption>
-- <AdditionalOption
-- key = "MallocGuardEdges"
-- value = ""
-- isEnabled = "YES">
-- </AdditionalOption>
-- <AdditionalOption
-- key = "MallocScribble"
-- value = ""
-- isEnabled = "YES">
-- </AdditionalOption>
-- </AdditionalOptions>
-- </LaunchAction>
-- <ProfileAction
-- shouldUseLaunchSchemeArgsEnv = "YES"
-- savedToolIdentifier = ""
-- useCustomWorkingDirectory = "NO"
-- buildConfiguration = "Release"
-- debugDocumentVersioning = "YES">
-- </ProfileAction>
-- <AnalyzeAction
-- buildConfiguration = "Debug">
-- </AnalyzeAction>
-- <ArchiveAction
-- buildConfiguration = "Release"
-- revealArchiveInOrganizer = "YES">
-- </ArchiveAction>
--</Scheme>
+++ /dev/null
--<?xml version="1.0" encoding="UTF-8"?>
--<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
--<plist version="1.0">
--<dict>
-- <key>SchemeUserState</key>
-- <dict>
-- <key>shairport-sync.xcscheme</key>
-- <dict>
-- <key>orderHint</key>
-- <integer>0</integer>
-- </dict>
-- </dict>
-- <key>SuppressBuildableAutocreation</key>
-- <dict>
-- <key>2785805E19BB488D00C0B34D</key>
-- <dict>
-- <key>primary</key>
-- <true/>
-- </dict>
-- </dict>
--</dict>
--</plist>
+++ /dev/null
--<?xml version="1.0" encoding="UTF-8"?>
--<Workspace
-- version = "1.0">
-- <FileRef
-- location = "group:shairport-sync.xcodeproj">
-- </FileRef>
--</Workspace>
+++ /dev/null
--<?xml version="1.0" encoding="UTF-8"?>
--<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
--<plist version="1.0">
--<dict>
-- <key>IDESourceControlProjectFavoriteDictionaryKey</key>
-- <false/>
-- <key>IDESourceControlProjectIdentifier</key>
-- <string>FE3806DD-2182-4590-A83E-FEB5D071A2C5</string>
-- <key>IDESourceControlProjectName</key>
-- <string>shairport-sync</string>
-- <key>IDESourceControlProjectOriginsDictionary</key>
-- <dict>
-- <key>DE7E3213834F1D8A89C0AEFB5901CF451E3668FA</key>
-- <string>ssh://github.com/mikebrady/shairport-sync.git</string>
-- </dict>
-- <key>IDESourceControlProjectPath</key>
-- <string>shairport-sync.xcworkspace</string>
-- <key>IDESourceControlProjectRelativeInstallPathDictionary</key>
-- <dict>
-- <key>DE7E3213834F1D8A89C0AEFB5901CF451E3668FA</key>
-- <string>..</string>
-- </dict>
-- <key>IDESourceControlProjectURL</key>
-- <string>ssh://github.com/mikebrady/shairport-sync.git</string>
-- <key>IDESourceControlProjectVersion</key>
-- <integer>111</integer>
-- <key>IDESourceControlProjectWCCIdentifier</key>
-- <string>DE7E3213834F1D8A89C0AEFB5901CF451E3668FA</string>
-- <key>IDESourceControlProjectWCConfigurations</key>
-- <array>
-- <dict>
-- <key>IDESourceControlRepositoryExtensionIdentifierKey</key>
-- <string>public.vcs.git</string>
-- <key>IDESourceControlWCCIdentifierKey</key>
-- <string>DE7E3213834F1D8A89C0AEFB5901CF451E3668FA</string>
-- <key>IDESourceControlWCCName</key>
-- <string>shairport-sync</string>
-- </dict>
-- </array>
--</dict>
--</plist>
+++ /dev/null
--<?xml version="1.0" encoding="UTF-8"?>
--<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
--<plist version="1.0">
--<dict>
-- <key>BuildLocationStyle</key>
-- <string>UseAppPreferences</string>
-- <key>CustomBuildLocationType</key>
-- <string>RelativeToDerivedData</string>
-- <key>DerivedDataLocationStyle</key>
-- <string>Default</string>
-- <key>HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges</key>
-- <true/>
-- <key>IssueFilterStyle</key>
-- <string>ShowActiveSchemeOnly</string>
-- <key>LiveSourceIssuesEnabled</key>
-- <true/>
-- <key>SnapshotAutomaticallyBeforeSignificantChanges</key>
-- <true/>
-- <key>SnapshotLocationStyle</key>
-- <string>Default</string>
--</dict>
--</plist>
+++ /dev/null
--<?xml version="1.0" encoding="UTF-8"?>
--<Bucket
-- type = "0"
-- version = "2.0">
-- <Breakpoints>
-- <BreakpointProxy
-- BreakpointExtensionID = "Xcode.Breakpoint.SymbolicBreakpoint">
-- <BreakpointContent
-- shouldBeEnabled = "Yes"
-- ignoreCount = "0"
-- continueAfterRunningActions = "Yes"
-- symbolName = "SIGUSR1"
-- moduleName = "">
-- <Actions>
-- <BreakpointActionProxy
-- ActionExtensionID = "Xcode.BreakpointAction.DebuggerCommand">
-- <ActionContent
-- consoleCommand = "process handle SIGUSR1 -n true -p true -s false">
-- </ActionContent>
-- </BreakpointActionProxy>
-- </Actions>
-- </BreakpointContent>
-- </BreakpointProxy>
-- </Breakpoints>
--</Bucket>