Step 6 of 8

Network Synchronization

One timeline, several machines, under 5 ms apart. Namespace: OwnaudioNET

Same idea as the master clock, stretched over a LAN. One device is the server and broadcasts its clock; every client follows it and plays its own files against that timeline. Play, pause, stop and seek all come from the server — the clients just obey.

ℹ️

Clock distribution is UDP broadcast. Create and start an AudioMixer before starting the server or client — it is the mixer's clock that gets shared.

Server Mode

The server device broadcasts its MasterClock timeline to all clients. The server controls play, pause, stop, and seek — clients follow automatically.

C#
// Prerequisites: Initialize + Start + Create AudioMixer
await OwnaudioNet.InitializeAsync();
OwnaudioNet.Start();
var mixer = new AudioMixer(OwnaudioNet.Engine!.UnderlyingEngine);
mixer.Start();

// Start server — broadcasts MasterClock to LAN
await OwnaudioNet.StartNetworkSyncServerAsync(port: 9876, useLocalTimeOnly: true);

// From this point, control playback normally:
mixer.Seek(0);
var track = new FileSource("backing.mp3");
track.AttachToClock(mixer.MasterClock);
track.Play();
mixer.AddSource(track);

// Stop network sync when done
OwnaudioNet.StopNetworkSync();

Client Mode

Clients synchronize their MasterClock to the server's timeline. Each client plays its own audio files, kept in sync by the shared clock.

C#
await OwnaudioNet.InitializeAsync();
OwnaudioNet.Start();
var mixer = new AudioMixer(OwnaudioNet.Engine!.UnderlyingEngine);
mixer.Start();

// Connect to server (null = UDP auto-discovery)
await OwnaudioNet.StartNetworkSyncClientAsync(
    serverAddress: "192.168.1.100",  // or null for auto-discovery
    port: 9876,
    allowOfflinePlayback: true);     // continue if server disconnects

// Load client's own audio — clock is controlled by server
var clientTrack = new FileSource("client-audio.mp3");
clientTrack.AttachToClock(mixer.MasterClock);
clientTrack.Play();
mixer.AddSource(clientTrack);

Stop Network Sync

C#
OwnaudioNet.StopNetworkSync();

Events

C#
OwnaudioNet.NetworkSyncConnectionChanged += (_, e) =>
{
    Console.WriteLine($"Network sync state: {e.OldState} → {e.NewState}");
};

Use Cases

🎤
Live Performance
Backing track server controls the click track; musicians' tablets follow automatically.
🔊
Multi-Room Audio
One server controls multiple zone players across a venue.
🎧
DJ Setup
Sync two machines for seamless handoffs or redundant playback.
🏛️
Installation Art
Synchronized audio-visual installations with multiple playback nodes.

API Parameters

StartNetworkSyncServerAsync

ParameterTypeDefaultDescription
portint9876UDP port for clock broadcast.
useLocalTimeOnlybooltrueUse local time sync only (no internet NTP required).

StartNetworkSyncClientAsync

ParameterTypeDefaultDescription
serverAddressstring?nullServer IP address. null = UDP broadcast auto-discovery.
portint9876UDP port to listen on.
allowOfflinePlaybackbooltrueContinue playback if server connection drops.

Next