Skip to content

Commit 5a0efce

Browse files
committed
Fix concurrent modification error modifying sound volume
This is most likely caused by another mod inadvertently modifying the `instanceToChannel` map (by playing a sound?) from another thread.
1 parent 87de158 commit 5a0efce

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

platforms/common/src/main/java/dynamic_fps/impl/mixin/SoundEngineMixin.java

+10-4
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
package dynamic_fps.impl.mixin;
22

33
import java.util.Map;
4+
import java.util.concurrent.ConcurrentHashMap;
45

56
import dynamic_fps.impl.feature.volume.SmoothVolumeHandler;
67
import net.minecraft.client.Minecraft;
78
import org.jetbrains.annotations.Nullable;
8-
import org.spongepowered.asm.mixin.Final;
9-
import org.spongepowered.asm.mixin.Mixin;
10-
import org.spongepowered.asm.mixin.Shadow;
11-
import org.spongepowered.asm.mixin.Unique;
9+
import org.spongepowered.asm.mixin.*;
1210
import org.spongepowered.asm.mixin.injection.At;
1311
import org.spongepowered.asm.mixin.injection.Inject;
1412
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@@ -39,6 +37,7 @@ public class SoundEngineMixin implements DuckSoundEngine {
3937

4038
@Shadow
4139
@Final
40+
@Mutable
4241
private Map<SoundInstance, ChannelAccess.ChannelHandle> instanceToChannel;
4342

4443
@Shadow
@@ -49,6 +48,13 @@ private float calculateVolume(SoundInstance instance) {
4948
@Unique
5049
private static final Minecraft dynamic_fps$minecraft = Minecraft.getInstance();
5150

51+
@Inject(method = "<init>", at = @At("TAIL"))
52+
private void init(CallbackInfo callbackInfo) {
53+
// Fix crash from another unknown mod mutating this
54+
// While we're iterating over it in the `dynamic_fps$updateVolume` method
55+
this.instanceToChannel = new ConcurrentHashMap<>(this.instanceToChannel);
56+
}
57+
5258
@Override
5359
public void dynamic_fps$updateVolume(SoundSource source) {
5460
if (!this.loaded) {

0 commit comments

Comments
 (0)