private void Update() { string[] removed = { }; string[] updated = { }; string[] added = { }; lock (updateWaitHandle) { Plugin.mbApi.Library_GetSyncDelta(musicBeeDatabase.Files, lastUpdate, LibraryCategory.Music | LibraryCategory.Inbox, ref added, ref updated, ref removed); if (numberOfOpenConnections == 0) { Clear(); } else { int nextRevision = Current + 1; int[] removedIds = new int[0]; if (receivedNotificationTypes != NotificationType.None) { // Tracks that are re-added after having been removed from musicbee are removed from the revision history if (receivedNotificationTypes.HasFlag(NotificationType.FileAdded)) { foreach (string file in added) { int addedId = musicBeeDatabase.GetIdOfTrack(file); if (addedId != 0) { foreach (Revision revision in revisions) { for (int index = 0; index < revision.removedIds.Length; index++) { int removedId = revision.removedIds[index]; if (addedId == removedId) { revision.removedIds[index] = 0; goto breakOuter; } } } breakOuter :; } } } removedIds = musicBeeDatabase.GetIdsOfTracks(removed); } revisions.Push(new Revision { id = nextRevision, removedIds = removedIds }); } if (receivedNotificationTypes.HasFlag(NotificationType.FileAdded) || receivedNotificationTypes.HasFlag(NotificationType.FileRemoved)) { musicBeeDatabase.Update(added); } lastUpdate = DateTime.Now; receivedNotificationTypes = NotificationType.None; Monitor.PulseAll(updateWaitHandle); } }