diff --git a/osu.Game/Beatmaps/ControlPoints/SampleControlPoint.cs b/osu.Game/Beatmaps/ControlPoints/SampleControlPoint.cs
index 69c00e463c..ae65e7ea42 100644
--- a/osu.Game/Beatmaps/ControlPoints/SampleControlPoint.cs
+++ b/osu.Game/Beatmaps/ControlPoints/SampleControlPoint.cs
@@ -31,6 +31,18 @@ namespace osu.Game.Beatmaps.ControlPoints
Volume = SampleVolume,
};
+ ///
+ /// Applies and to a if necessary, returning the modified .
+ ///
+ /// The . This will not be modified.
+ /// The modified . This does not share a reference with .
+ public virtual SampleInfo ApplyTo(SampleInfo sampleInfo) => new SampleInfo
+ {
+ Bank = sampleInfo.Bank ?? SampleBank,
+ Name = sampleInfo.Name,
+ Volume = sampleInfo.Volume > 0 ? sampleInfo.Volume : SampleVolume
+ };
+
public override bool Equals(ControlPoint other)
=> base.Equals(other)
&& other is SampleControlPoint sample
diff --git a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
index 88990d435c..4892e20814 100644
--- a/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
+++ b/osu.Game/Rulesets/Objects/Drawables/DrawableHitObject.cs
@@ -90,13 +90,12 @@ namespace osu.Game.Rulesets.Objects.Drawables
if (HitObject.SampleControlPoint == null)
throw new ArgumentNullException(nameof(HitObject.SampleControlPoint), $"{nameof(HitObject)}s must always have an attached {nameof(HitObject.SampleControlPoint)}."
+ $" This is an indication that {nameof(HitObject.ApplyDefaults)} has not been invoked on {this}.");
- AddInternal(Samples = new SkinnableSound(samples.Select(s => new SampleInfo
- {
- Bank = s.Bank ?? HitObject.SampleControlPoint.SampleBank,
- Name = s.Name,
- Volume = s.Volume > 0 ? s.Volume : HitObject.SampleControlPoint.SampleVolume,
- Namespace = SampleNamespace
- }).ToArray()));
+
+ samples = samples.Select(s => HitObject.SampleControlPoint.ApplyTo(s)).ToArray();
+ foreach (var s in samples)
+ s.Namespace = SampleNamespace;
+
+ AddInternal(Samples = new SkinnableSound(samples));
}
}