About

Overview

xmms-syncup is a C language plugin to the XMMS media player that provides real-time synchronization of audio playback. This is useful in environments such as dorms, houses, or workplaces where multiple networked computers have independently driven speakers.

Mechanics

Operationally, a single machine is designated as the "server". The XMMS process running on the server operates as normal and does not attempt to track the progress of other players. Via xmmsd, the server makes available to clients (running xmms-syncup) its playlist, current playlist position, and audio playback cursor. Each client periodically (<1s) queries the server for this information. If synchronization is determined to be unacceptable, xmms-syncup uses a heuristic algorithm to set the client player's cursor to match the server's as closely as possible.

The reliablity of this procedure is obviously dependent on the network transit time between the machines; however, it can be reasonably assumed that players whose speakers are close enough to be heard by a common listener will be very close on the network (unloaded 100baseT ethernet typically has sub-1ms ping, which is more than sufficient). Other factors, such as the input plugin (MP3/OGG/AAC) and encoding (VBR vs. ABR), and output plugin (ALSA/OSS/arts/ESD) also have an substantial impact on synchronization performance. Some of these issues are addressed on the Troubleshooting page; in general, the closer the match in hardware and software configuration among the players, the more synchronized playback will be.

Since queries to the server are frequent, clients recover quickly from song changes or manual seeking on the server. Any clock skew (noticed e.g. when using ALSA and OSS on different machines) is also corrected for inherently.

xmms-syncup is not a streaming server and does not provide facilities for file sharing: file paths in the server's playlist must be valid on all hosts. The developers have found NFS to be an acceptable solution for file distribution. Alternatives (Samba, AFS) would likely work as well. The playlist itself is shared, however: if the client detects that its playlist differs from the server's, it clears the local list and requests a copy from the server. In practice, this means that the important types of changes made to the server player's state are propogated quickly to the clients.

Heritage

The code for xmms-syncup is based on the GPL'ed xmms-netamp plugin which slaves XMMS clients to a Winamp server.

Portability

xmms-syncup has no more compilation dependencies than xmms itself. These are primarily glib and gtk. xmms-syncup has been developed and tested on the Gentoo/x86 and Fedora Core 3/amd64 Linux platforms.

Alternate solutions

  1. Manual solutions (hitting "play" on the count of 3) are inconvenient and error-prone
  2. Streaming solutions attempt to minimize gaps in playback, and so use variable client buffers that are not synchronized between clients
  3. Hardware solutions (such as the SqueezeBox) require additional investment
  4. The most mature software solution for *NIX at time of writing appears to be the SlimServer, which requires a custom player

In contrast, xmms-syncup is lightweight, robust (with some caveats caveats), and compatible with one of the most popular media players for Linux.