private void Player_PlayStarted(object sender, EventArgs e) { // If both players are playing, we must activate the dynamic synching, even if they were started independently. // This way they will continue playing on the next loop, this time in sync. if (!active || !synching) { return; } PlayerScreen player = sender as PlayerScreen; if (player == null) { return; } PlayerScreen otherPlayer = GetOtherPlayer(player); if (player.IsPlaying && otherPlayer.IsPlaying && !view.Playing) { // Immediately force synchronization. // This may not fully register for automatically started players, see `resyncOperations`. commonTimeline.Initialize(players[0], players[1]); view.UpdateSyncPosition(commonTimeline.GetCommonTime(players[0], players[0].LocalTimeOriginPhysical)); AlignPlayers(false); resyncOperations = 0; view.Play(); dynamicSynching = true; EnsureBothPlaying(); } }
private void Player_HighSpeedFactorChanged(object sender, EventArgs e) { if (!active || !synching) { return; } if (PreferencesManager.PlayerPreferences.SyncLockSpeed) { double percentage = Math.Min(players[0].RealtimePercentage, players[1].RealtimePercentage); players[0].RealtimePercentage = percentage; players[1].RealtimePercentage = percentage; } // Synchronization must be reinitialized. commonTimeline.Initialize(players[0], players[0].LocalSyncTime, players[1], players[1].LocalSyncTime); // TODO: Check if current time is still in bounds. currentTime = Math.Min(currentTime, commonTimeline.GetCommonTime(players[0], players[0].LocalTime)); view.SetupTrkFrame(0, commonTimeline.LastTime, currentTime); view.UpdateSyncPosition(currentTime); }