mirror of
https://github.com/ppy/osu.git
synced 2024-12-14 04:52:57 +08:00
Merge remote-tracking branch 'upstream/master' into cleanup-slider-bodies
This commit is contained in:
commit
3e57fcf5c5
@ -15,6 +15,7 @@ namespace osu.Game.Rulesets.Osu.Tests
|
|||||||
protected override string ResourceAssembly => "osu.Game.Rulesets.Osu";
|
protected override string ResourceAssembly => "osu.Game.Rulesets.Osu";
|
||||||
|
|
||||||
[TestCase(6.931145117263422, "diffcalc-test")]
|
[TestCase(6.931145117263422, "diffcalc-test")]
|
||||||
|
[TestCase(1.0736587013228804d, "zero-length-sliders")]
|
||||||
public void Test(double expected, string name)
|
public void Test(double expected, string name)
|
||||||
=> base.Test(expected, name);
|
=> base.Test(expected, name);
|
||||||
|
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
osu file format v14
|
||||||
|
|
||||||
|
[Difficulty]
|
||||||
|
HPDrainRate:3
|
||||||
|
CircleSize:3
|
||||||
|
OverallDifficulty:3
|
||||||
|
ApproachRate:4.5
|
||||||
|
SliderMultiplier:0.799999999999999
|
||||||
|
SliderTickRate:1
|
||||||
|
|
||||||
|
[TimingPoints]
|
||||||
|
800,260.869565217391,3,2,10,60,1,0
|
||||||
|
|
||||||
|
[HitObjects]
|
||||||
|
// Linear
|
||||||
|
78,193,2365,2,0,L|330:193,1,0
|
||||||
|
78,193,3669,2,0,L|330:193,1,0
|
||||||
|
78,193,4973,2,0,L|330:193,1,0
|
||||||
|
|
||||||
|
// Perfect-curve
|
||||||
|
151,206,6278,2,0,P|293:75|345:204,1,0
|
||||||
|
151,206,8104,2,0,P|293:75|345:204,1,0
|
||||||
|
151,206,9930,2,0,P|293:75|345:204,1,0
|
||||||
|
|
||||||
|
// Bezier
|
||||||
|
76,191,11756,2,0,B|176:59|358:340|438:190,1,0
|
||||||
|
76,191,13582,2,0,B|176:59|358:340|438:190,1,0
|
||||||
|
76,191,15408,2,0,B|176:59|358:340|438:190,1,0
|
@ -12,6 +12,7 @@ using osu.Game.Rulesets.UI;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using osu.Game.Rulesets.Judgements;
|
using osu.Game.Rulesets.Judgements;
|
||||||
using osu.Game.Rulesets.Osu.UI.Cursor;
|
using osu.Game.Rulesets.Osu.UI.Cursor;
|
||||||
|
using osu.Game.Skinning;
|
||||||
|
|
||||||
namespace osu.Game.Rulesets.Osu.UI
|
namespace osu.Game.Rulesets.Osu.UI
|
||||||
{
|
{
|
||||||
@ -39,7 +40,13 @@ namespace osu.Game.Rulesets.Osu.UI
|
|||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
Depth = 1,
|
Depth = 1,
|
||||||
},
|
},
|
||||||
HitObjectContainer,
|
// Todo: This should not exist, but currently helps to reduce LOH allocations due to unbinding skin source events on judgement disposal
|
||||||
|
// Todo: Remove when hitobjects are properly pooled
|
||||||
|
new LocalSkinOverrideContainer(null)
|
||||||
|
{
|
||||||
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
Child = HitObjectContainer,
|
||||||
|
},
|
||||||
approachCircles = new ApproachCircleProxyContainer
|
approachCircles = new ApproachCircleProxyContainer
|
||||||
{
|
{
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
@ -16,7 +16,7 @@ namespace osu.Game.Graphics.Backgrounds
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class Background : CompositeDrawable
|
public class Background : CompositeDrawable
|
||||||
{
|
{
|
||||||
public Sprite Sprite;
|
public readonly Sprite Sprite;
|
||||||
|
|
||||||
private readonly string textureName;
|
private readonly string textureName;
|
||||||
|
|
||||||
@ -51,7 +51,7 @@ namespace osu.Game.Graphics.Backgrounds
|
|||||||
/// <returns>A <see cref="TransformSequence{T}"/> to which further transforms can be added.</returns>
|
/// <returns>A <see cref="TransformSequence{T}"/> to which further transforms can be added.</returns>
|
||||||
public void BlurTo(Vector2 newBlurSigma, double duration = 0, Easing easing = Easing.None)
|
public void BlurTo(Vector2 newBlurSigma, double duration = 0, Easing easing = Easing.None)
|
||||||
{
|
{
|
||||||
if (bufferedContainer == null)
|
if (bufferedContainer == null && newBlurSigma != Vector2.Zero)
|
||||||
{
|
{
|
||||||
RemoveInternal(Sprite);
|
RemoveInternal(Sprite);
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ namespace osu.Game.Graphics.Backgrounds
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
bufferedContainer.BlurTo(newBlurSigma, duration, easing);
|
bufferedContainer?.BlurTo(newBlurSigma, duration, easing);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,6 @@ namespace osu.Game.Online.Leaderboards
|
|||||||
|
|
||||||
loading.Hide();
|
loading.Hide();
|
||||||
|
|
||||||
// schedule because we may not be loaded yet (LoadComponentAsync complains).
|
|
||||||
showScoresDelegate?.Cancel();
|
showScoresDelegate?.Cancel();
|
||||||
showScoresCancellationSource?.Cancel();
|
showScoresCancellationSource?.Cancel();
|
||||||
|
|
||||||
@ -61,28 +60,22 @@ namespace osu.Game.Online.Leaderboards
|
|||||||
// ensure placeholder is hidden when displaying scores
|
// ensure placeholder is hidden when displaying scores
|
||||||
PlaceholderState = PlaceholderState.Successful;
|
PlaceholderState = PlaceholderState.Successful;
|
||||||
|
|
||||||
scrollFlow = CreateScoreFlow();
|
var sf = CreateScoreFlow();
|
||||||
scrollFlow.ChildrenEnumerable = scores.Select((s, index) => CreateDrawableScore(s, index + 1));
|
sf.ChildrenEnumerable = scores.Select((s, index) => CreateDrawableScore(s, index + 1));
|
||||||
|
|
||||||
if (!IsLoaded)
|
// schedule because we may not be loaded yet (LoadComponentAsync complains).
|
||||||
showScoresDelegate = Schedule(showScores);
|
showScoresDelegate = Schedule(() => LoadComponentAsync(sf, _ =>
|
||||||
else
|
|
||||||
showScores();
|
|
||||||
|
|
||||||
void showScores() => LoadComponentAsync(scrollFlow, _ =>
|
|
||||||
{
|
{
|
||||||
scrollContainer.Add(scrollFlow);
|
scrollContainer.Add(scrollFlow = sf);
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
foreach (var s in scrollFlow.Children)
|
foreach (var s in scrollFlow.Children)
|
||||||
{
|
|
||||||
using (s.BeginDelayedSequence(i++ * 50, true))
|
using (s.BeginDelayedSequence(i++ * 50, true))
|
||||||
s.Show();
|
s.Show();
|
||||||
}
|
|
||||||
|
|
||||||
scrollContainer.ScrollTo(0f, false);
|
scrollContainer.ScrollTo(0f, false);
|
||||||
}, (showScoresCancellationSource = new CancellationTokenSource()).Token);
|
}, (showScoresCancellationSource = new CancellationTokenSource()).Token));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,8 +26,13 @@ namespace osu.Game.Overlays.Direct
|
|||||||
TabContainer.Masking = false;
|
TabContainer.Masking = false;
|
||||||
TabContainer.Spacing = new Vector2(10, 0);
|
TabContainer.Spacing = new Vector2(10, 0);
|
||||||
AutoSizeAxes = Axes.Both;
|
AutoSizeAxes = Axes.Both;
|
||||||
|
}
|
||||||
|
|
||||||
Current.DisabledChanged += value => SelectedTab.FadeColour(value ? Color4.DarkGray : Color4.White, 200, Easing.OutQuint);
|
protected override void LoadComplete()
|
||||||
|
{
|
||||||
|
base.LoadComplete();
|
||||||
|
|
||||||
|
Current.BindDisabledChanged(value => SelectedTab.FadeColour(value ? Color4.DarkGray : Color4.White, 200, Easing.OutQuint), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override TabItem<RulesetInfo> CreateTabItem(RulesetInfo value) => new DirectRulesetTabItem(value);
|
protected override TabItem<RulesetInfo> CreateTabItem(RulesetInfo value) => new DirectRulesetTabItem(value);
|
||||||
|
@ -37,7 +37,8 @@ namespace osu.Game.Rulesets.Objects.Legacy.Catch
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override HitObject CreateSlider(Vector2 position, bool newCombo, int comboOffset, Vector2[] controlPoints, double length, PathType pathType, int repeatCount, List<List<HitSampleInfo>> nodeSamples)
|
protected override HitObject CreateSlider(Vector2 position, bool newCombo, int comboOffset, Vector2[] controlPoints, double? length, PathType pathType, int repeatCount,
|
||||||
|
List<List<HitSampleInfo>> nodeSamples)
|
||||||
{
|
{
|
||||||
newCombo |= forceNewCombo;
|
newCombo |= forceNewCombo;
|
||||||
comboOffset += extraComboOffset;
|
comboOffset += extraComboOffset;
|
||||||
|
@ -72,7 +72,7 @@ namespace osu.Game.Rulesets.Objects.Legacy
|
|||||||
else if (type.HasFlag(ConvertHitObjectType.Slider))
|
else if (type.HasFlag(ConvertHitObjectType.Slider))
|
||||||
{
|
{
|
||||||
PathType pathType = PathType.Catmull;
|
PathType pathType = PathType.Catmull;
|
||||||
double length = 0;
|
double? length = null;
|
||||||
|
|
||||||
string[] pointSplit = split[5].Split('|');
|
string[] pointSplit = split[5].Split('|');
|
||||||
|
|
||||||
@ -130,7 +130,11 @@ namespace osu.Game.Rulesets.Objects.Legacy
|
|||||||
repeatCount = Math.Max(0, repeatCount - 1);
|
repeatCount = Math.Max(0, repeatCount - 1);
|
||||||
|
|
||||||
if (split.Length > 7)
|
if (split.Length > 7)
|
||||||
|
{
|
||||||
length = Math.Max(0, Parsing.ParseDouble(split[7]));
|
length = Math.Max(0, Parsing.ParseDouble(split[7]));
|
||||||
|
if (length == 0)
|
||||||
|
length = null;
|
||||||
|
}
|
||||||
|
|
||||||
if (split.Length > 10)
|
if (split.Length > 10)
|
||||||
readCustomSampleBanks(split[10], bankInfo);
|
readCustomSampleBanks(split[10], bankInfo);
|
||||||
@ -291,7 +295,8 @@ namespace osu.Game.Rulesets.Objects.Legacy
|
|||||||
/// <param name="repeatCount">The slider repeat count.</param>
|
/// <param name="repeatCount">The slider repeat count.</param>
|
||||||
/// <param name="nodeSamples">The samples to be played when the slider nodes are hit. This includes the head and tail of the slider.</param>
|
/// <param name="nodeSamples">The samples to be played when the slider nodes are hit. This includes the head and tail of the slider.</param>
|
||||||
/// <returns>The hit object.</returns>
|
/// <returns>The hit object.</returns>
|
||||||
protected abstract HitObject CreateSlider(Vector2 position, bool newCombo, int comboOffset, Vector2[] controlPoints, double length, PathType pathType, int repeatCount, List<List<HitSampleInfo>> nodeSamples);
|
protected abstract HitObject CreateSlider(Vector2 position, bool newCombo, int comboOffset, Vector2[] controlPoints, double? length, PathType pathType, int repeatCount,
|
||||||
|
List<List<HitSampleInfo>> nodeSamples);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a legacy Spinner-type hit object.
|
/// Creates a legacy Spinner-type hit object.
|
||||||
|
@ -26,7 +26,8 @@ namespace osu.Game.Rulesets.Objects.Legacy.Mania
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override HitObject CreateSlider(Vector2 position, bool newCombo, int comboOffset, Vector2[] controlPoints, double length, PathType pathType, int repeatCount, List<List<HitSampleInfo>> nodeSamples)
|
protected override HitObject CreateSlider(Vector2 position, bool newCombo, int comboOffset, Vector2[] controlPoints, double? length, PathType pathType, int repeatCount,
|
||||||
|
List<List<HitSampleInfo>> nodeSamples)
|
||||||
{
|
{
|
||||||
return new ConvertSlider
|
return new ConvertSlider
|
||||||
{
|
{
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System;
|
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using osu.Game.Rulesets.Objects.Types;
|
using osu.Game.Rulesets.Objects.Types;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@ -38,7 +37,8 @@ namespace osu.Game.Rulesets.Objects.Legacy.Osu
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override HitObject CreateSlider(Vector2 position, bool newCombo, int comboOffset, Vector2[] controlPoints, double length, PathType pathType, int repeatCount, List<List<HitSampleInfo>> nodeSamples)
|
protected override HitObject CreateSlider(Vector2 position, bool newCombo, int comboOffset, Vector2[] controlPoints, double? length, PathType pathType, int repeatCount,
|
||||||
|
List<List<HitSampleInfo>> nodeSamples)
|
||||||
{
|
{
|
||||||
newCombo |= forceNewCombo;
|
newCombo |= forceNewCombo;
|
||||||
comboOffset += extraComboOffset;
|
comboOffset += extraComboOffset;
|
||||||
@ -51,7 +51,7 @@ namespace osu.Game.Rulesets.Objects.Legacy.Osu
|
|||||||
Position = position,
|
Position = position,
|
||||||
NewCombo = FirstObject || newCombo,
|
NewCombo = FirstObject || newCombo,
|
||||||
ComboOffset = comboOffset,
|
ComboOffset = comboOffset,
|
||||||
Path = new SliderPath(pathType, controlPoints, Math.Max(0, length)),
|
Path = new SliderPath(pathType, controlPoints, length),
|
||||||
NodeSamples = nodeSamples,
|
NodeSamples = nodeSamples,
|
||||||
RepeatCount = repeatCount
|
RepeatCount = repeatCount
|
||||||
};
|
};
|
||||||
|
@ -23,7 +23,8 @@ namespace osu.Game.Rulesets.Objects.Legacy.Taiko
|
|||||||
return new ConvertHit();
|
return new ConvertHit();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override HitObject CreateSlider(Vector2 position, bool newCombo, int comboOffset, Vector2[] controlPoints, double length, PathType pathType, int repeatCount, List<List<HitSampleInfo>> nodeSamples)
|
protected override HitObject CreateSlider(Vector2 position, bool newCombo, int comboOffset, Vector2[] controlPoints, double? length, PathType pathType, int repeatCount,
|
||||||
|
List<List<HitSampleInfo>> nodeSamples)
|
||||||
{
|
{
|
||||||
return new ConvertSlider
|
return new ConvertSlider
|
||||||
{
|
{
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
||||||
// See the LICENCE file in the repository root for full licence text.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
@ -168,6 +168,12 @@ namespace osu.Game.Screens.Backgrounds
|
|||||||
private void load(OsuConfigManager config)
|
private void load(OsuConfigManager config)
|
||||||
{
|
{
|
||||||
userBlurLevel = config.GetBindable<double>(OsuSetting.BlurLevel);
|
userBlurLevel = config.GetBindable<double>(OsuSetting.BlurLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void LoadComplete()
|
||||||
|
{
|
||||||
|
base.LoadComplete();
|
||||||
|
|
||||||
userBlurLevel.ValueChanged += _ => UpdateVisuals();
|
userBlurLevel.ValueChanged += _ => UpdateVisuals();
|
||||||
BlurAmount.ValueChanged += _ => UpdateVisuals();
|
BlurAmount.ValueChanged += _ => UpdateVisuals();
|
||||||
}
|
}
|
||||||
|
@ -9,18 +9,25 @@ using osu.Game.Rulesets.Mods;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
|
using osu.Framework.Graphics.UserInterface;
|
||||||
using osu.Game.Graphics;
|
using osu.Game.Graphics;
|
||||||
using osuTK;
|
using osuTK;
|
||||||
using osuTK.Input;
|
using osuTK.Input;
|
||||||
|
|
||||||
namespace osu.Game.Screens.Select
|
namespace osu.Game.Screens.Select
|
||||||
{
|
{
|
||||||
public class FooterButtonMods : FooterButton
|
public class FooterButtonMods : FooterButton, IHasCurrentValue<IReadOnlyList<Mod>>
|
||||||
{
|
{
|
||||||
public FooterButtonMods(Bindable<IReadOnlyList<Mod>> mods)
|
public Bindable<IReadOnlyList<Mod>> Current
|
||||||
{
|
{
|
||||||
FooterModDisplay modDisplay;
|
get => modDisplay.Current;
|
||||||
|
set => modDisplay.Current = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly FooterModDisplay modDisplay;
|
||||||
|
|
||||||
|
public FooterButtonMods()
|
||||||
|
{
|
||||||
Add(new Container
|
Add(new Container
|
||||||
{
|
{
|
||||||
Anchor = Anchor.CentreLeft,
|
Anchor = Anchor.CentreLeft,
|
||||||
@ -33,9 +40,6 @@ namespace osu.Game.Screens.Select
|
|||||||
AutoSizeAxes = Axes.Both,
|
AutoSizeAxes = Axes.Both,
|
||||||
Margin = new MarginPadding { Left = 70 }
|
Margin = new MarginPadding { Left = 70 }
|
||||||
});
|
});
|
||||||
|
|
||||||
if (mods != null)
|
|
||||||
modDisplay.Current = mods;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
|
@ -221,11 +221,9 @@ namespace osu.Game.Screens.Select
|
|||||||
[BackgroundDependencyLoader(true)]
|
[BackgroundDependencyLoader(true)]
|
||||||
private void load(BeatmapManager beatmaps, AudioManager audio, DialogOverlay dialog, OsuColour colours, SkinManager skins, ScoreManager scores)
|
private void load(BeatmapManager beatmaps, AudioManager audio, DialogOverlay dialog, OsuColour colours, SkinManager skins, ScoreManager scores)
|
||||||
{
|
{
|
||||||
mods.BindTo(Mods);
|
|
||||||
|
|
||||||
if (Footer != null)
|
if (Footer != null)
|
||||||
{
|
{
|
||||||
Footer.AddButton(new FooterButtonMods(mods), ModSelect);
|
Footer.AddButton(new FooterButtonMods { Current = mods }, ModSelect);
|
||||||
Footer.AddButton(new FooterButtonRandom { Action = triggerRandom });
|
Footer.AddButton(new FooterButtonRandom { Action = triggerRandom });
|
||||||
Footer.AddButton(new FooterButtonOptions(), BeatmapOptions);
|
Footer.AddButton(new FooterButtonOptions(), BeatmapOptions);
|
||||||
|
|
||||||
@ -263,6 +261,13 @@ namespace osu.Game.Screens.Select
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override void LoadComplete()
|
||||||
|
{
|
||||||
|
base.LoadComplete();
|
||||||
|
|
||||||
|
mods.BindTo(Mods);
|
||||||
|
}
|
||||||
|
|
||||||
private DependencyContainer dependencies;
|
private DependencyContainer dependencies;
|
||||||
|
|
||||||
protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent)
|
protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent)
|
||||||
|
@ -34,7 +34,7 @@ namespace osu.Game.Skinning
|
|||||||
public Drawable GetDrawableComponent(string componentName)
|
public Drawable GetDrawableComponent(string componentName)
|
||||||
{
|
{
|
||||||
Drawable sourceDrawable;
|
Drawable sourceDrawable;
|
||||||
if (beatmapSkins.Value && (sourceDrawable = skin.GetDrawableComponent(componentName)) != null)
|
if (beatmapSkins.Value && (sourceDrawable = skin?.GetDrawableComponent(componentName)) != null)
|
||||||
return sourceDrawable;
|
return sourceDrawable;
|
||||||
|
|
||||||
return fallbackSource?.GetDrawableComponent(componentName);
|
return fallbackSource?.GetDrawableComponent(componentName);
|
||||||
@ -43,7 +43,7 @@ namespace osu.Game.Skinning
|
|||||||
public Texture GetTexture(string componentName)
|
public Texture GetTexture(string componentName)
|
||||||
{
|
{
|
||||||
Texture sourceTexture;
|
Texture sourceTexture;
|
||||||
if (beatmapSkins.Value && (sourceTexture = skin.GetTexture(componentName)) != null)
|
if (beatmapSkins.Value && (sourceTexture = skin?.GetTexture(componentName)) != null)
|
||||||
return sourceTexture;
|
return sourceTexture;
|
||||||
|
|
||||||
return fallbackSource.GetTexture(componentName);
|
return fallbackSource.GetTexture(componentName);
|
||||||
@ -52,7 +52,7 @@ namespace osu.Game.Skinning
|
|||||||
public SampleChannel GetSample(string sampleName)
|
public SampleChannel GetSample(string sampleName)
|
||||||
{
|
{
|
||||||
SampleChannel sourceChannel;
|
SampleChannel sourceChannel;
|
||||||
if (beatmapHitsounds.Value && (sourceChannel = skin.GetSample(sampleName)) != null)
|
if (beatmapHitsounds.Value && (sourceChannel = skin?.GetSample(sampleName)) != null)
|
||||||
return sourceChannel;
|
return sourceChannel;
|
||||||
|
|
||||||
return fallbackSource?.GetSample(sampleName);
|
return fallbackSource?.GetSample(sampleName);
|
||||||
|
Loading…
Reference in New Issue
Block a user