osu/osu.Game/Audio
Bartłomiej Dach e8a394f894
Fix argon volume-aware hitsounds not correctly playing immediately after object placement
Closes https://github.com/ppy/osu/issues/29832.

The underlying reason for the incorrect sample playback was an equality
comparer failure.

Samples are contained in several pools which are managed by the
playfield. In particular, the pools are keyed by `ISampleInfo`
instances. This means that for correct operation, `ISampleInfo` has to
implement `IEquatable<ISampleInfo>` and also provide an appropriately
correct `GetHashCode()` implementation. Different audible samples must
not compare equal to each other when represented by `ISampleInfo`.

As it turns out, `VolumeAwareHitSampleInfo` failed on this, due to not
overriding equality members. Therefore, a `new
HitSampleInfo(HitSampleInfo.HIT_NORMAL, HitSampleInfo.BANK_NORMAL,
volume: 70)` was allowed to compare equal to a
`VolumeAwareHitSampleInfo` wrapping it, *even though they correspond to
completely different sounds and go through entirely different lookup
path sequences*.

Therefore, to fix, provide more proper equality implementations for
`VolumeAwareHitSampleInfo`.

When testing note that this issue *only occurs immediately after
placing an object*. Saving and re-entering editor makes this issue go
away. I haven't looked too long into why, but the general gist of it is
ordering; it appears that a `normal-hitnormal` pool exists at point
of query of a new object placement, but does not seem to exist when
entering editor afresh. That said I'm not sure that ordering aspect of
this bug matters much if at all, since the two `IHitSampleInfo`s should
never be allowed to alias with each other at all wrt equality.
2024-09-23 13:38:26 +02:00
..
Effects Adjust AudioFilter to framework-side changes 2024-06-18 07:30:46 +02:00
HitSampleInfo.cs Fix argon volume-aware hitsounds not correctly playing immediately after object placement 2024-09-23 13:38:26 +02:00
IPreviewTrackOwner.cs Rename the nullable disable annotation in the Audio namespace and mark some properties as nullable. 2022-07-31 22:00:14 +08:00
ISampleInfo.cs Rename the nullable disable annotation in the Audio namespace and mark some properties as nullable. 2022-07-31 22:00:14 +08:00
ISamplePlaybackDisabler.cs Rename the nullable disable annotation in the Audio namespace and mark some properties as nullable. 2022-07-31 22:00:14 +08:00
PreviewTrack.cs Add inline note about deadlock 2023-12-26 12:06:56 +09:00
PreviewTrackManager.cs Partial everything 2022-11-27 00:00:27 +09:00
SampleInfo.cs Fix the MOTHERLOAD of undetected issues that are now visible thanks to net6.0 2022-12-16 18:16:26 +09:00