Skip to content

Commit 37b23c5

Browse files
Merge pull request #55 from Goobwabber/dev/1.38
Update to 1.38, fix race condition in GetBeatmapFromBeatSaver
2 parents f93430c + 8132bd0 commit 37b23c5

File tree

5 files changed

+53
-27
lines changed

5 files changed

+53
-27
lines changed

MultiplayerCore/Beatmaps/BeatSaverPreviewMediaData.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ public BeatSaverPreviewMediaData(BeatSaver beatsaver, string levelHash)
2929
return _beatmap;
3030
}
3131

32-
public async Task<Sprite> GetCoverSpriteAsync(CancellationToken cancellationToken)
32+
public async Task<Sprite> GetCoverSpriteAsync()
3333
{
3434
if (CoverImagesprite != null) return CoverImagesprite;
3535

3636
var bm = await GetBeatsaverBeatmap();
3737
if (bm == null) return null!;
3838

39-
byte[]? coverBytes = await bm.LatestVersion.DownloadCoverImage(cancellationToken);
39+
byte[]? coverBytes = await bm.LatestVersion.DownloadCoverImage();
4040
if (coverBytes == null || coverBytes.Length == 0) return null!;
4141

4242
Texture2D texture = new Texture2D(2, 2);
@@ -45,7 +45,15 @@ public async Task<Sprite> GetCoverSpriteAsync(CancellationToken cancellationToke
4545
return CoverImagesprite;
4646
}
4747

48-
public Task<AudioClip> GetPreviewAudioClip(CancellationToken cancellationToken)
48+
public void UnloadCoverSprite()
49+
{
50+
if (CoverImagesprite == null) return;
51+
Object.Destroy(CoverImagesprite.texture);
52+
Object.Destroy(CoverImagesprite);
53+
CoverImagesprite = null;
54+
}
55+
56+
public Task<AudioClip> GetPreviewAudioClip()
4957
{
5058
// TODO: something with preview url
5159
//var bm = await GetBeatsaverBeatmap();

MultiplayerCore/Beatmaps/LocalBeatmapLevel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,6 @@ public LocalBeatmapLevel(string hash, BeatmapLevel localBeatmapLevel)
7171
}
7272

7373
public override Task<Sprite> TryGetCoverSpriteAsync(CancellationToken cancellationToken)
74-
=> _localBeatmapLevel.previewMediaData.GetCoverSpriteAsync(cancellationToken);
74+
=> _localBeatmapLevel.previewMediaData.GetCoverSpriteAsync();
7575
}
7676
}

MultiplayerCore/Beatmaps/Providers/MpBeatmapLevelProvider.cs

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
1-
using System.Collections.Generic;
2-
using System.Diagnostics.Tracing;
1+
using System.Collections.Concurrent;
2+
using System.Collections.Generic;
33
using System.Threading.Tasks;
4-
using System.Windows.Forms;
54
using BeatSaverSharp;
65
using MultiplayerCore.Beatmaps.Abstractions;
76
using MultiplayerCore.Beatmaps.Packets;
7+
using SiraUtil.Logging;
88
using SiraUtil.Zenject;
99

1010
namespace MultiplayerCore.Beatmaps.Providers
1111
{
1212
public class MpBeatmapLevelProvider
1313
{
1414
private readonly BeatSaver _beatsaver;
15+
private readonly SiraLog _logger;
1516
private readonly Dictionary<string, MpBeatmap> _hashToNetworkMaps = new();
16-
private readonly Dictionary<string, MpBeatmap> _hashToBeatsaverMaps = new();
17+
private readonly ConcurrentDictionary<string, Task<MpBeatmap?>> _hashToBeatsaverMaps = new();
1718

1819
internal MpBeatmapLevelProvider(
19-
UBinder<Plugin, BeatSaver> beatsaver)
20+
UBinder<Plugin, BeatSaver> beatsaver,
21+
SiraLog logger)
2022
{
2123
_beatsaver = beatsaver.Value;
24+
_logger = logger;
2225
}
2326

2427
/// <summary>
@@ -44,23 +47,33 @@ internal MpBeatmapLevelProvider(
4447
return new LocalBeatmapLevel(levelHash, localBeatmapLevel);
4548
}
4649

47-
/// <summary>
48-
/// Gets an <see cref="MpBeatmap"/> for the specified level hash from BeatSaver.
49-
/// </summary>
50-
/// <param name="levelHash">The hash of the level to get</param>
51-
/// <returns>An <see cref="MpBeatmap"/> with a matching level hash, or null if none was found.</returns>
52-
public async Task<MpBeatmap?> GetBeatmapFromBeatSaver(string levelHash)
50+
/// <summary>
51+
/// Gets an <see cref="MpBeatmap"/> for the specified level hash from BeatSaver.
52+
/// </summary>
53+
/// <param name="levelHash">The hash of the level to get</param>
54+
/// <returns>An <see cref="MpBeatmap"/> with a matching level hash, or null if none was found.</returns>
55+
public async Task<MpBeatmap?> GetBeatmapFromBeatSaver(string levelHash)
5356
{
54-
if (_hashToBeatsaverMaps.TryGetValue(levelHash, out var map)) return map;
55-
var beatmap = await _beatsaver.BeatmapByHash(levelHash);
56-
if (beatmap != null)
57+
if (!_hashToBeatsaverMaps.TryGetValue(levelHash, out var map))
5758
{
58-
map = new BeatSaverBeatmapLevel(levelHash, beatmap);
59-
_hashToBeatsaverMaps.Add(levelHash, map);
60-
return map;
61-
}
59+
map = Task.Run(async () =>
60+
{
61+
var beatmap = await _beatsaver.BeatmapByHash(levelHash);
62+
if (beatmap != null)
63+
{
64+
MpBeatmap bmap = new BeatSaverBeatmapLevel(levelHash, beatmap);
65+
return bmap;
66+
}
67+
68+
return null;
69+
});
70+
71+
_hashToBeatsaverMaps[levelHash] = map;
72+
}
6273

63-
return null;
74+
var bmap = await map;
75+
if (bmap == null) _hashToBeatsaverMaps.TryRemove(levelHash, out _); // Ensure we remove null bmaps
76+
return bmap;
6477
}
6578

6679
public BeatSaverPreviewMediaData MakeBeatSaverPreviewMediaData(string levelHash) => new BeatSaverPreviewMediaData(_beatsaver, levelHash);

MultiplayerCore/MultiplayerCore.csproj

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<OutputType>Library</OutputType>
55
<AppDesignerFolder>Properties</AppDesignerFolder>
66
<AssemblyName>MultiplayerCore</AssemblyName>
7-
<AssemblyVersion>1.5.2</AssemblyVersion>
7+
<AssemblyVersion>1.5.3</AssemblyVersion>
88
<TargetFramework>net472</TargetFramework>
99
<DebugSymbols>true</DebugSymbols>
1010
<DebugType>portable</DebugType>
@@ -134,6 +134,11 @@
134134
<Private>False</Private>
135135
<SpecificVersion>False</SpecificVersion>
136136
</Reference>
137+
<Reference Include="Networking.NetworkPlayerEntitlementsChecker" Publicize="true">
138+
<HintPath>$(BeatSaberDir)\Beat Saber_Data\Managed\Networking.NetworkPlayerEntitlementsChecker.dll</HintPath>
139+
<Private>False</Private>
140+
<SpecificVersion>False</SpecificVersion>
141+
</Reference>
137142
<Reference Include="SegmentedControl">
138143
<HintPath>$(BeatSaberDir)\Beat Saber_Data\Managed\SegmentedControl.dll</HintPath>
139144
<Private>False</Private>

MultiplayerCore/manifest.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
"id": "MultiplayerCore",
44
"name": "MultiplayerCore",
55
"author": "Goobwabber",
6-
"version": "1.5.2",
6+
"version": "1.5.3",
77
"description": "Adds custom songs to Beat Saber Multiplayer.",
8-
"gameVersion": "1.37.5",
8+
"gameVersion": "1.38.0",
99
"dependsOn": {
1010
"BSIPA": "^4.3.3",
11-
"SongCore": "^3.13.0",
11+
"SongCore": "^3.14.0",
1212
"BeatSaverSharp": "^3.4.5",
1313
"SiraUtil": "^3.1.12",
1414
"BeatSaberMarkupLanguage": "^1.12.0",

0 commit comments

Comments
 (0)