1
0
mirror of https://github.com/ppy/osu.git synced 2026-06-07 10:44:02 +08:00
Commit Graph

2 Commits

  • 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.