diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/Codec2Player.java b/codec2talkie/src/main/java/com/radio/codec2talkie/Codec2Player.java index 85d814a..128284d 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/Codec2Player.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/Codec2Player.java @@ -2,7 +2,6 @@ package com.radio.codec2talkie; import android.bluetooth.BluetoothSocket; import android.media.AudioAttributes; -import android.media.AudioDeviceCallback; import android.media.AudioFormat; import android.media.AudioRecord; import android.media.AudioTrack; @@ -42,6 +41,7 @@ public class Codec2Player extends Thread { private final byte CSMA_PERSISTENCE = (byte)0xff; private final byte CSMA_SLOT_TIME = (byte)0x00; + private final byte TX_TAIL_10MS_UNITS = (byte)20; // 200ms private final int RX_BUFFER_SIZE = 8192; @@ -166,7 +166,12 @@ public class Codec2Player extends Thread { _loopbackBuffer = ByteBuffer.allocateDirect(1024 * _audioEncodedBufferSize); - _kissProcessor = new KissProcessor(_audioEncodedBufferSize, CSMA_PERSISTENCE, CSMA_SLOT_TIME, _kissCallback); + _kissProcessor = new KissProcessor( + _audioEncodedBufferSize, + CSMA_PERSISTENCE, + CSMA_SLOT_TIME, + TX_TAIL_10MS_UNITS, + _kissCallback); } private final KissCallback _kissCallback = new KissCallback() { @@ -310,7 +315,7 @@ public class Codec2Player extends Thread { setPriority(Thread.MAX_PRIORITY); try { if (!_isLoopbackMode) { - _kissProcessor.setupCsma(); + _kissProcessor.setupTnc(); } while (true) { processRecordPlaybackToggle(); diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/kiss/KissProcessor.java b/codec2talkie/src/main/java/com/radio/codec2talkie/kiss/KissProcessor.java index 5eaebab..e65d4f9 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/kiss/KissProcessor.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/kiss/KissProcessor.java @@ -15,6 +15,7 @@ public class KissProcessor { private final byte KISS_CMD_DATA = (byte)0x00; private final byte KISS_CMD_P = (byte)0x02; private final byte KISS_CMD_SLOT_TIME = (byte)0x03; + private final byte KISS_CMD_TX_TAIL = (byte)0x04; private final byte KISS_CMD_NOCMD = (byte)0x80; private enum KissState { @@ -28,8 +29,10 @@ public class KissProcessor { private byte _kissCmd = KISS_CMD_NOCMD; private final int _frameSize; - private final byte _csmaPersistence; - private final byte _csmaSlotTime; + + private final byte _tncCsmaPersistence; + private final byte _tncCsmaSlotTime; + private final byte _tncTxTail; private final byte[] _inputFrameBuffer; @@ -38,23 +41,29 @@ public class KissProcessor { private int _outputFramePos; private int _inputFramePos; - public KissProcessor(int frameSize, byte csmaPersistence, byte csmaSlotTime, KissCallback callback) { + public KissProcessor(int frameSize, byte csmaPersistence, byte csmaSlotTime, byte txTail, KissCallback callback) { _frameSize = frameSize; _callback = callback; _inputFrameBuffer = new byte[frameSize]; - _csmaPersistence = csmaPersistence; - _csmaSlotTime = csmaSlotTime; + _tncCsmaPersistence = csmaPersistence; + _tncCsmaSlotTime = csmaSlotTime; + _tncTxTail = txTail; } - public void setupCsma() throws IOException { + public void setupTnc() throws IOException { _callback.sendByte(KISS_FEND); _callback.sendByte(KISS_CMD_P); - _callback.sendByte(_csmaPersistence); + _callback.sendByte(_tncCsmaPersistence); _callback.sendByte(KISS_FEND); _callback.sendByte(KISS_FEND); _callback.sendByte(KISS_CMD_SLOT_TIME); - _callback.sendByte(_csmaSlotTime); + _callback.sendByte(_tncCsmaSlotTime); + _callback.sendByte(KISS_FEND); + + _callback.sendByte(KISS_FEND); + _callback.sendByte(KISS_CMD_TX_TAIL); + _callback.sendByte(_tncTxTail); _callback.sendByte(KISS_FEND); }