diff --git a/libs/mcef-forge-2.1.5-1.20.1.jar b/libs/mcef-forge-2.1.5-1.20.1.jar index e2bb30f..94acb64 100644 Binary files a/libs/mcef-forge-2.1.5-1.20.1.jar and b/libs/mcef-forge-2.1.5-1.20.1.jar differ diff --git a/src/main/java/net/montoyo/wd/client/audio/WDAudioHandler.java b/src/main/java/net/montoyo/wd/client/audio/WDAudioHandler.java index a2a90ae..6f39e8a 100644 --- a/src/main/java/net/montoyo/wd/client/audio/WDAudioHandler.java +++ b/src/main/java/net/montoyo/wd/client/audio/WDAudioHandler.java @@ -54,7 +54,7 @@ public class WDAudioHandler implements CefAudioHandler { // the size of the |data| array in bytes. // @Override - public void onAudioStreamPacket(CefBrowser cefBrowser, long pointer, int frames, long pts) { + public void onAudioStreamPacket(CefBrowser cefBrowser, DataPointer pointer, int frames, long pts) { ClientProxy proxy = ((ClientProxy) WebDisplays.PROXY); for (ScreenBlockEntity tes : proxy.getScreens()) { diff --git a/src/main/java/net/montoyo/wd/client/audio/WDAudioStream.java b/src/main/java/net/montoyo/wd/client/audio/WDAudioStream.java index e827a53..cd50947 100644 --- a/src/main/java/net/montoyo/wd/client/audio/WDAudioStream.java +++ b/src/main/java/net/montoyo/wd/client/audio/WDAudioStream.java @@ -1,5 +1,6 @@ package net.montoyo.wd.client.audio; +import com.mojang.blaze3d.audio.Channel; import net.minecraft.client.sounds.AudioStream; import org.cef.misc.CefAudioParameters; import org.cef.misc.CefChannelLayout; @@ -12,7 +13,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.util.ArrayDeque; -public class WDAudioStream implements AudioStream { +public class WDAudioStream implements AudioStream, WDExtendedAudioStream { AudioFormat currentFormat = new AudioFormat( AudioFormat.Encoding.PCM_SIGNED, 44100, 16, @@ -49,35 +50,44 @@ public class WDAudioStream implements AudioStream { ArrayDeque buffers = new ArrayDeque<>(); - public void setData(long data) { -// DataPointer ptr = data.forCapacity(currentFormat.getChannels() << 3); -// ptr.setAlignment(3); - long baseAddr = data; + public void setData(DataPointer data) { + int cap = fpb; + DataPointer ptr = data + .forCapacity(currentFormat.getChannels() << 3) + .withAlignment(3); + for (int i = 0; i < 1; i++) { - long addr = MemoryUtil.memGetLong(baseAddr + (i << 3)); - int cap = fpb; + DataPointer subPtr = ptr.getData(i) + .withAlignment(2) + .forCapacity(cap << 2); + float[] flts = new float[cap]; - for (int i1 = 0; i1 < cap; i1++) { - flts[i1] = MemoryUtil.memGetFloat(addr + (i1 << 2)); - } + for (int i1 = 0; i1 < cap; i1++) + flts[i1] = subPtr.getFloat(i1); + buffers.add(flts); } } + boolean checking = false; + @Override public ByteBuffer read(int pSize) throws IOException { System.out.println(buffers.size()); + int sz = 2048 * buffers.size(); + if (sz < 2048) sz = 4096; + pSize = sz; ByteBuffer buffer = ByteBuffer.allocateDirect(pSize); if (!buffers.isEmpty()) { final int MAX_16_BIT = 32767; final int MIN_16_BIT = -32768; + int i0 = 0; loopBufs: while (true) { if (!buffers.isEmpty()) { for (float v : buffers.pop()) { if (buffer.position() >= pSize) break loopBufs; -// buffer.putFloat(v); // Scale and clip the float value to the range of a signed 16-bit int float floatSample = v; @@ -93,9 +103,11 @@ public class WDAudioStream implements AudioStream { buffer.put((byte) (intSample & 0xFF)); buffer.put((byte) ((intSample >> 8) & 0xFF)); } + i0++; } else break; } buffer.position(0); + System.out.println("Consumed " + i0 + " buffers"); } return buffer; } @@ -103,4 +115,27 @@ public class WDAudioStream implements AudioStream { @Override public void close() throws IOException { } + + Channel channel; + + @Override + public void attach(Channel channel) { + WDExtendedAudioStream.super.attach(channel); + this.channel = channel; + } + + @Override + public int getPumpCount(int defaultAmount) { + return defaultAmount; + } + + @Override + public int computeSize(AudioFormat format, int streamingBufferSize) { + return 2048; + } + + @Override + public boolean canStop() { + return true; + } } diff --git a/src/main/java/net/montoyo/wd/client/audio/WDExtendedAudioStream.java b/src/main/java/net/montoyo/wd/client/audio/WDExtendedAudioStream.java new file mode 100644 index 0000000..23431fb --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/audio/WDExtendedAudioStream.java @@ -0,0 +1,23 @@ +package net.montoyo.wd.client.audio; + +import com.mojang.blaze3d.audio.Channel; + +import javax.sound.sampled.AudioFormat; + +public interface WDExtendedAudioStream { + default int getPumpCount(int defaultAmount) { + return defaultAmount; + } + + default void attach(Channel channel) { + return; + } + + default int computeSize(AudioFormat format, int streamingBufferSize) { + return streamingBufferSize; + } + + default boolean canStop() { + return true; + } +} diff --git a/src/main/java/net/montoyo/wd/mixins/audio/AudioChannelMixin.java b/src/main/java/net/montoyo/wd/mixins/audio/AudioChannelMixin.java new file mode 100644 index 0000000..572449b --- /dev/null +++ b/src/main/java/net/montoyo/wd/mixins/audio/AudioChannelMixin.java @@ -0,0 +1,48 @@ +package net.montoyo.wd.mixins.audio; + +import com.mojang.blaze3d.audio.Channel; +import net.minecraft.client.sounds.AudioStream; +import net.montoyo.wd.client.audio.WDExtendedAudioStream; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import javax.annotation.Nullable; +import javax.sound.sampled.AudioFormat; + +@Mixin(Channel.class) +public class AudioChannelMixin { + @Shadow + @Nullable + private AudioStream stream; + + @Shadow private int streamingBufferSize; + + @Inject(at = @At("HEAD"), method = "attachBufferStream") + public void postAttach(AudioStream pStream, CallbackInfo ci) { + ((WDExtendedAudioStream) pStream).attach((Channel) (Object) this); + } + + @Inject(at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/audio/Channel;pumpBuffers(I)V", shift = At.Shift.BEFORE), method = "attachBufferStream") + public void postComputeSize(AudioStream pStream, CallbackInfo ci) { + streamingBufferSize = ((WDExtendedAudioStream) pStream).computeSize( + pStream.getFormat(), streamingBufferSize + ); + } + + @ModifyVariable(argsOnly = true, ordinal = 0, at = @At("HEAD"), method = "pumpBuffers") + public int prePump(int defaultAmount) { + return ((WDExtendedAudioStream) stream).getPumpCount(defaultAmount); + } + + @Inject(at = @At("HEAD"), method = "stopped", cancellable = true) + public void preCheckStopped(CallbackInfoReturnable cir) { + if (stream != null) + if (!((WDExtendedAudioStream) stream).canStop()) + cir.setReturnValue(false); + } +} diff --git a/src/main/java/net/montoyo/wd/mixins/audio/AudioStreamMixin.java b/src/main/java/net/montoyo/wd/mixins/audio/AudioStreamMixin.java new file mode 100644 index 0000000..d4ae335 --- /dev/null +++ b/src/main/java/net/montoyo/wd/mixins/audio/AudioStreamMixin.java @@ -0,0 +1,9 @@ +package net.montoyo.wd.mixins.audio; + +import net.minecraft.client.sounds.AudioStream; +import net.montoyo.wd.client.audio.WDExtendedAudioStream; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(AudioStream.class) +public interface AudioStreamMixin extends WDExtendedAudioStream { +} diff --git a/src/main/resources/webdisplays.mixins.json b/src/main/resources/webdisplays.mixins.json index 7f6eb46..9841a75 100644 --- a/src/main/resources/webdisplays.mixins.json +++ b/src/main/resources/webdisplays.mixins.json @@ -8,7 +8,9 @@ ], "client": [ "MouseHandlerMixin", - "OverlayMixin" + "OverlayMixin", + "audio.AudioChannelMixin", + "audio.AudioStreamMixin" ], "injectors": { "defaultRequire": 1