Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix preview tracks playing after their owning overlay has hidden #27898

Merged
merged 1 commit into from
Apr 16, 2024

Conversation

bdach
Copy link
Collaborator

@bdach bdach commented Apr 16, 2024

RFC. Closes #27883.

The idea here is that PopOut() is called when the hide is requested, so once an overlay hide would trigger, the overlay would StopAnyPlaying(), but because of async load things, the actual track would start playing after that but before the overlay has fully hidden. (That last part is significant because after the overlay has fully hidden, schedules save the day.)

Due to the loose coupling between PreviewTrackManager and IPreviewTrackOwner there's really no easy way to handle this locally to the usages of the preview tracks. Heck, PreviewTrackManager doesn't really know which preview track owner is to be considered present at any time, it just kinda works on vibes based on DI until the owner tells all of its preview tracks to stop.

This solution causes the preview tracks to stop a little bit later but maybe that's fine? Just trying to not overthink the issue is all.

No tests because this is going to suck to test automatically while it is pretty easy to test manually (got it in a few tries on master).

The issue also mentions that the track can sometimes resume playing after the overlay is pulled up again, but I don't see that as a problem necessarily, and even if it was, it's not going to be that easy to address due to the aforementioned loose coupling - to fix that, play buttons would have to know who is the current preview track owner and cancel schedules upon determining that their preview track owner has gone away.

RFC. Closes ppy#27883.

The idea here is that `PopOut()` is called _when the hide is requested_,
so once an overlay trigger would hide, the overlay would
`StopAnyPlaying()`, but because of async load things, the actual track
would start playing after that but before the overlay has fully hidden.
(That last part is significant because after the overlay has fully
hidden, schedules save the day.)

Due to the loose coupling between `PreviewTrackManager` and
`IPreviewTrackOwner` there's really no easy way to handle this locally
to the usages of the preview tracks. Heck, `PreviewTrackManager` doesn't
really know which preview track owner is to be considered _present_ at
any time, it just kinda works on vibes based on DI until the owner tells
all of its preview tracks to stop.

This solution causes the preview tracks to stop a little bit later but
maybe that's fine? Just trying to not overthink the issue is all.

No tests because this is going to suck to test automatically while it is
pretty easy to test manually (got it in a few tries on master).

The issue also mentions that the track can sometimes resume playing
after the overlay is pulled up again, but I don't see that as a problem
necessarily, and even if it was, it's not going to be that easy to
address due to the aforementioned loose coupling - to fix that, play
buttons would have to know who is the current preview track owner and
cancel schedules upon determining that their preview track owner has
gone away.
// base call is responsible for stopping preview tracks.
// delay it until the fade has concluded to ensure that nothing inside the overlay has triggered
// another preview track playback in the meantime, leaving an "orphaned" preview playing.
.OnComplete(_ => base.PopOut());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't have a huge amount of faith in OnComplete but let's see how this goes.

@peppy peppy merged commit 15d286e into ppy:master Apr 16, 2024
15 of 17 checks passed
@bdach bdach deleted the preview-tracks-playing-after-hide branch April 16, 2024 15:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Buggy behaviour when closing beatmap browser as a preview song is loading
2 participants