Send a zero-length byte array when the audio thread is done sending audio, as Teamspeak does. this is to prevent interpolation

This commit is contained in:
Manevolent
2018-08-12 15:39:55 -04:00
parent fb7923b63b
commit 7d195439b8
2 changed files with 54 additions and 0 deletions
@@ -399,6 +399,8 @@ public class LocalTeamspeakClientSocket
}
private class MicrophoneTask implements Runnable {
private boolean wasSendingAudio = false;
@Override
public void run() {
if (!isConnected()) return;
@@ -421,6 +423,23 @@ public class LocalTeamspeakClientSocket
try {
writePacket(voice);
wasSendingAudio = true;
} catch (Exception e) {
// All we are really concerned about here is a disconnection event, in which case the loop
// will exit.
getExceptionHandler().accept(e);
}
} else if (wasSendingAudio) {
PacketBody0Voice voice = new PacketBody0Voice(getRole().getOut());
voice.setCodecType(microphone.getCodec());
voice.setCodecData(new byte[0]);
try {
writePacket(voice);
wasSendingAudio = false;
} catch (Exception e) {
// All we are really concerned about here is a disconnection event, in which case the loop
// will exit.
@@ -0,0 +1,35 @@
package com.github.manevolent.ts3j;
import com.github.manevolent.ts3j.enums.CodecType;
import com.github.manevolent.ts3j.protocol.Packet;
import com.github.manevolent.ts3j.protocol.ProtocolRole;
import com.github.manevolent.ts3j.protocol.packet.PacketBody0Voice;
import com.github.manevolent.ts3j.protocol.packet.PacketBodyType;
import com.github.manevolent.ts3j.util.Ts3Debugging;
import junit.framework.TestCase;
import java.nio.ByteBuffer;
/**
* I just sent a series of voice packets and caught the last packet, turns out Teamspeak sends a 0-length byte
* array on the last packet when the decoder should close.
*/
public class VoicePacketTest extends TestCase {
public static void main(String[] args) throws Exception {
new VoicePacketTest().testParser();
}
public void testParser() throws Exception {
byte[] packetBytes = Ts3Debugging.hexStringToByteArray("c1a81dfa4699030e0cc10002800cc205");
Packet voicePacket = new Packet(ProtocolRole.CLIENT);
voicePacket.read(ByteBuffer.wrap(packetBytes));
assertEquals(PacketBodyType.VOICE, voicePacket.getHeader().getType());
assertEquals(CodecType.OPUS_MUSIC, ((PacketBody0Voice) voicePacket.getBody()).getCodecType());
assertEquals(0, ((PacketBody0Voice)voicePacket.getBody()).getClientId());
assertEquals(3266, ((PacketBody0Voice)voicePacket.getBody()).getPacketId());
assertEquals(0, ((PacketBody0Voice)voicePacket.getBody()).getCodecData().length);
}
}