mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2025-11-13 11:47:10 +00:00
Send entire DFPWM encoder state to the client
This ensures the client decoder is in sync with the server. Well, mostly - we don't handle the anti-jerk, but that should correct itself within a few samples. Fixes #1748
This commit is contained in:
@@ -4,6 +4,7 @@
|
||||
|
||||
package dan200.computercraft.client.sound;
|
||||
|
||||
import dan200.computercraft.shared.peripheral.speaker.EncodedAudio;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.nio.ByteBuffer;
|
||||
@@ -16,7 +17,7 @@ public class DfpwmStreamTest {
|
||||
var stream = new DfpwmStream();
|
||||
|
||||
var input = ByteBuffer.wrap(new byte[]{ 43, -31, 33, 44, 30, -16, -85, 23, -3, -55, 46, -70, 68, -67, 74, -96, -68, 16, 94, -87, -5, 87, 11, -16, 19, 92, 85, -71, 126, 5, -84, 64, 17, -6, 85, -11, -1, -87, -12, 1, 85, -56, 33, -80, 82, 104, -93, 17, 126, 23, 91, -30, 37, -32, 117, -72, -58, 11, -76, 19, -108, 86, -65, -10, -1, -68, -25, 10, -46, 85, 124, -54, 15, -24, 43, -94, 117, 63, -36, 15, -6, 88, 87, -26, -83, 106, 41, 13, -28, -113, -10, -66, 119, -87, -113, 68, -55, 40, -107, 62, 20, 72, 3, -96, 114, -87, -2, 39, -104, 30, 20, 42, 84, 24, 47, 64, 43, 61, -35, 95, -65, 42, 61, 42, -50, 4, -9, 81 });
|
||||
stream.push(input);
|
||||
stream.push(new EncodedAudio(0, 0, false, input));
|
||||
|
||||
var buffer = stream.read(1024 + 1);
|
||||
assertEquals(1024, buffer.remaining(), "Must have read 1024 bytes");
|
||||
|
||||
@@ -23,7 +23,7 @@ class DfpwmStateTest {
|
||||
|
||||
var state = new DfpwmState();
|
||||
state.pushBuffer(new ObjectLuaTable(inputTbl), input.length, Optional.empty());
|
||||
var result = state.pullPending(0);
|
||||
var result = state.pullPending(0).audio();
|
||||
var contents = new byte[result.remaining()];
|
||||
result.get(contents);
|
||||
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
// SPDX-FileCopyrightText: 2023 The CC: Tweaked Developers
|
||||
//
|
||||
// SPDX-License-Identifier: MPL-2.0
|
||||
|
||||
package dan200.computercraft.shared.peripheral.speaker;
|
||||
|
||||
import dan200.computercraft.test.core.ArbitraryByteBuffer;
|
||||
import io.netty.buffer.Unpooled;
|
||||
import net.jqwik.api.*;
|
||||
import net.minecraft.network.FriendlyByteBuf;
|
||||
|
||||
import static org.hamcrest.MatcherAssert.assertThat;
|
||||
import static org.hamcrest.Matchers.equalTo;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
class EncodedAudioTest {
|
||||
/**
|
||||
* Sends the audio on a roundtrip, ensuring that its contents are reassembled on the other end.
|
||||
*
|
||||
* @param audio The message to send.
|
||||
*/
|
||||
@Property
|
||||
public void testRoundTrip(@ForAll("audio") EncodedAudio audio) {
|
||||
var buffer = new FriendlyByteBuf(Unpooled.directBuffer());
|
||||
audio.write(buffer);
|
||||
|
||||
var converted = EncodedAudio.read(buffer);
|
||||
assertEquals(buffer.readableBytes(), 0, "Whole packet was read");
|
||||
|
||||
assertThat("Messages are equal", converted, equalTo(converted));
|
||||
}
|
||||
|
||||
@Provide
|
||||
Arbitrary<EncodedAudio> audio() {
|
||||
return Combinators.combine(
|
||||
Arbitraries.integers(),
|
||||
Arbitraries.integers(),
|
||||
Arbitraries.of(true, false),
|
||||
ArbitraryByteBuffer.bytes().ofMaxSize(1000)
|
||||
).as(EncodedAudio::new);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user