private static int comparePlaylistEntries(PlaylistEntry e1, PlaylistEntry e2) { return Math.Abs(e1.Priority - e2.Priority) < 0.001 ? e2.Id - e1.Id : e2.Priority < e1.Priority ? -1 : 1; }
public PlaylistEntry QueueTrack(HubblUser user, Track track) { UpdateUserPriorities(); if (!_usersActivities.ContainsKey(user.Id)) { var newActivity = new UserActivitiesRecord { basePriority = 1.0, activitiesCount = 0, lastActivityTime = DateTime.Now }; _usersActivities.Add(user.Id, newActivity); } var activitiesRecord = _usersActivities[user.Id]; if (activitiesRecord.activitiesCount++ == 0) ++_activeUsersCount; var entry = new PlaylistEntry { User = user, Track = track, Id = _freeEntryId++, LikesNum = 0, DislikesNum = 0, Priority = activitiesRecord.basePriority }; activitiesRecord.basePriority *= Math.Pow(0.5, track.Duration.TotalMilliseconds/AVG_TRACK_LENGTH_MS); _usersMarkedByEntryId.Add(entry.Id, new List<string>()); _usersMarkedByEntryId[entry.Id].Add(user.Id); Playlist.Add(entry); Playlist.Sort(comparePlaylistEntries); _playlistEntries.Add(entry); if (!_playing) Play(); return entry; }