Skip to content

Commit

Permalink
Merge pull request #171 from SKProCH/finalFixOverridenTracks
Browse files Browse the repository at this point in the history
Another attempt to fix overriden queue items resolution
  • Loading branch information
angelobreuer authored Aug 26, 2024
2 parents 6383bc1 + 4a216fc commit 5eaad2d
Showing 1 changed file with 34 additions and 10 deletions.
44 changes: 34 additions & 10 deletions src/Lavalink4NET/Players/LavalinkPlayer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public class LavalinkPlayer : ILavalinkPlayer, ILavalinkPlayerListener
private ulong _trackVersion;
private volatile ITrackQueueItem? _stoppedItem;
private volatile ITrackQueueItem? _currentItem;
private volatile string? _currentOverridenPlayableItemIdentifier;
private volatile ITrackQueueItem? _replacedItem;
private volatile ITrackQueueItem? _nextItem;
private volatile string? _nextOverridenPlayableItemIdentifier;
Expand Down Expand Up @@ -222,6 +223,7 @@ ValueTask ILavalinkPlayerListener.NotifyTrackStartedAsync(LavalinkTrack track, C
var nextTrackIdentifier = Interlocked.Exchange(ref _nextOverridenPlayableItemIdentifier, null) ?? nextTrack?.Identifier;
Debug.Assert(track.Identifier == nextTrackIdentifier);

_currentOverridenPlayableItemIdentifier = nextTrackIdentifier;
CurrentItem = track.Identifier == nextTrackIdentifier
? nextTrack
: new TrackQueueItem(new TrackReference(track));
Expand Down Expand Up @@ -272,6 +274,7 @@ public virtual async ValueTask PlayAsync(ITrackQueueItem trackQueueItem, TrackPl
}
else
{
_nextOverridenPlayableItemIdentifier = null;
updateProperties.Identifier = trackQueueItem.Reference.Identifier;
}

Expand Down Expand Up @@ -476,18 +479,29 @@ private void Refresh(PlayerInformationModel model)

if (currentTrack is null && model.CurrentTrack is null)
{
_currentOverridenPlayableItemIdentifier = null;
CurrentItem = null;
}
else if (model.CurrentTrack?.Information.Identifier != currentTrack?.Identifier)
else if (model.CurrentTrack?.Information.Identifier != currentTrack?.Identifier
&& model.CurrentTrack?.Information.Identifier != _currentOverridenPlayableItemIdentifier
&& model.CurrentTrack?.Information.Identifier != _nextOverridenPlayableItemIdentifier)
{
// This indicates that the track had been restored from API information
Debug.Assert(_nextItem is not null || model.CurrentTrack?.Information.Identifier == currentTrack?.Identifier);
Debug.Assert(_nextItem is not null
|| (model.CurrentTrack?.Information.Identifier == currentTrack?.Identifier
&& model.CurrentTrack?.Information.Identifier != _currentOverridenPlayableItemIdentifier
&& model.CurrentTrack?.Information.Identifier != _nextOverridenPlayableItemIdentifier));

var track = model.CurrentTrack is null
? _nextItem
: new TrackQueueItem(new TrackReference(LavalinkApiClient.CreateTrack(model.CurrentTrack)));

CurrentItem = track;
if (model.CurrentTrack is null)
{
CurrentItem = _nextItem;
}
else
{
var track = LavalinkApiClient.CreateTrack(model.CurrentTrack);
CurrentItem = LookupTrackQueueItem(track, CurrentItem, _currentOverridenPlayableItemIdentifier) ??
new TrackQueueItem(track);
}

Interlocked.Increment(ref _trackVersion);
}
Expand All @@ -496,6 +510,12 @@ private void Refresh(PlayerInformationModel model)

// TODO: restore filters
}

protected virtual ITrackQueueItem? LookupTrackQueueItem(LavalinkTrack receivedTrack, ITrackQueueItem? currentItem,
string? overridenTrackIdentifier)
{
return null;
}

internal async ValueTask UpdateFiltersAsync(PlayerFilterMapModel filterMap, CancellationToken cancellationToken = default)
{
Expand Down Expand Up @@ -720,14 +740,18 @@ private ValueTask UpdateVoiceCredentialsAsync(CancellationToken cancellationToke
return null;
}

Debug.Assert(track.Identifier == CurrentItem?.Track?.Identifier);
Debug.Assert(track.Identifier == CurrentItem?.Track?.Identifier
|| (track.Identifier == _currentOverridenPlayableItemIdentifier && CurrentItem is not null));

if (track.Identifier == CurrentItem?.Track?.Identifier)
if (track.Identifier == CurrentItem?.Track?.Identifier
|| (track.Identifier == _currentOverridenPlayableItemIdentifier && CurrentItem is not null))
{
return CurrentItem;
}

return new TrackQueueItem(new TrackReference(track));

return LookupTrackQueueItem(track, CurrentItem, null)
?? new TrackQueueItem(new TrackReference(track));
}

private static string? GetVoiceServerName(VoiceServer voiceServer)
Expand Down

0 comments on commit 5eaad2d

Please sign in to comment.