From eabac196874a49c4cf5da74c274b863462dc7856 Mon Sep 17 00:00:00 2001 From: sh123 Date: Fri, 24 Jun 2022 17:42:44 +0300 Subject: [PATCH] Refactor protocol interface to have separte audio and data paths --- .../codec2talkie/audio/AudioProcessor.java | 3 +- .../protocol/AudioFrameAggregator.java | 11 +++-- .../radio/codec2talkie/protocol/Callback.java | 4 +- .../com/radio/codec2talkie/protocol/Kiss.java | 31 +++++++----- .../radio/codec2talkie/protocol/Protocol.java | 3 +- .../com/radio/codec2talkie/protocol/Raw.java | 7 ++- .../codec2talkie/protocol/RecorderPipe.java | 9 +++- .../codec2talkie/protocol/ScramblerPipe.java | 48 ++++++++++++------- 8 files changed, 78 insertions(+), 38 deletions(-) diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/audio/AudioProcessor.java b/codec2talkie/src/main/java/com/radio/codec2talkie/audio/AudioProcessor.java index b910412..2373709 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/audio/AudioProcessor.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/audio/AudioProcessor.java @@ -19,7 +19,6 @@ import java.nio.ByteBuffer; import java.util.Timer; import java.util.TimerTask; -import com.radio.codec2talkie.connect.TcpIpSocketHandler; import com.radio.codec2talkie.protocol.Callback; import com.radio.codec2talkie.protocol.Protocol; import com.radio.codec2talkie.protocol.ProtocolFactory; @@ -230,7 +229,7 @@ public class AudioProcessor extends Thread { for (int i = 0; i < _recordAudioEncodedBuffer.length; i++) { frame[i] = (byte)_recordAudioEncodedBuffer[i]; } - _protocol.send(frame); + _protocol.sendAudio(frame); } private void decodeAndPlayAudioFrame(byte[] audioFrame) { diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/AudioFrameAggregator.java b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/AudioFrameAggregator.java index 4971de8..7ff6af2 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/AudioFrameAggregator.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/AudioFrameAggregator.java @@ -44,15 +44,20 @@ public class AudioFrameAggregator implements Protocol { } @Override - public void send(byte[] frame) throws IOException { + public void sendAudio(byte[] frame) throws IOException { if ( _outputBufferPos + frame.length >= _outputBufferSize) { - _childProtocol.send(Arrays.copyOf(_outputBuffer, _outputBufferPos)); + _childProtocol.sendAudio(Arrays.copyOf(_outputBuffer, _outputBufferPos)); _outputBufferPos = 0; } System.arraycopy(frame, 0, _outputBuffer, _outputBufferPos, frame.length); _outputBufferPos += frame.length; } + @Override + public void sendData(byte[] dataPacket) throws IOException { + _childProtocol.sendData(dataPacket); + } + @Override public boolean receive(Callback callback) throws IOException { return _childProtocol.receive(new Callback() { @@ -88,7 +93,7 @@ public class AudioFrameAggregator implements Protocol { @Override public void flush() throws IOException { if (_outputBufferPos > 0) { - _childProtocol.send(Arrays.copyOf(_outputBuffer, _outputBufferPos)); + _childProtocol.sendAudio(Arrays.copyOf(_outputBuffer, _outputBufferPos)); _outputBufferPos = 0; } _childProtocol.flush(); diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Callback.java b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Callback.java index 9d4891c..d9847e0 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Callback.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Callback.java @@ -1,7 +1,7 @@ package com.radio.codec2talkie.protocol; public abstract class Callback { - abstract protected void onReceiveAudioFrames(byte [] frame); - abstract protected void onReceiveSignalLevel(byte [] rawData); + abstract protected void onReceiveAudioFrames(byte[] frame); + abstract protected void onReceiveSignalLevel(byte[] rawData); abstract protected void onProtocolRxError(); } diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Kiss.java b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Kiss.java index 91a04d3..35cf9c1 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Kiss.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Kiss.java @@ -191,18 +191,13 @@ public class Kiss implements Protocol { }; @Override - public void send(byte [] frame) throws IOException { - // escape - ByteBuffer escapedFrame = escape(frame); - int escapedFrameSize = escapedFrame.position(); - escapedFrame.rewind(); + public void sendAudio(byte [] frame) throws IOException { + send(frame); + } - // send - startKissPacket(KISS_CMD_DATA); - while (escapedFrame.position() < escapedFrameSize) { - sendKissByte(escapedFrame.get()); - } - completeKissPacket(); + @Override + public void sendData(byte[] dataPacket) throws IOException { + send(dataPacket); } @Override @@ -229,6 +224,20 @@ public class Kiss implements Protocol { } } + private void send(byte[] data) throws IOException { + // escape + ByteBuffer escapedFrame = escape(data); + int escapedFrameSize = escapedFrame.position(); + escapedFrame.rewind(); + + // send + startKissPacket(KISS_CMD_DATA); + while (escapedFrame.position() < escapedFrameSize) { + sendKissByte(escapedFrame.get()); + } + completeKissPacket(); + } + private void processCommand(byte b) { switch (b) { case KISS_CMD_DATA: diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Protocol.java b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Protocol.java index 46fb001..472d9ae 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Protocol.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Protocol.java @@ -8,7 +8,8 @@ import java.io.IOException; public interface Protocol { void initialize(Transport transport, Context context) throws IOException; - void send(byte [] frame) throws IOException; + void sendAudio(byte[] frame) throws IOException; + void sendData(byte[] dataPacket) throws IOException; boolean receive(Callback callback) throws IOException; void flush() throws IOException; void close(); diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Raw.java b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Raw.java index c156eb7..bda7983 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Raw.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Raw.java @@ -24,10 +24,15 @@ public class Raw implements Protocol { } @Override - public void send(byte [] frame) throws IOException { + public void sendAudio(byte [] frame) throws IOException { _transport.write(Arrays.copyOf(frame, frame.length)); } + @Override + public void sendData(byte[] dataPacket) throws IOException { + _transport.write(Arrays.copyOf(dataPacket, dataPacket.length)); + } + @Override public boolean receive(Callback callback) throws IOException { int bytesRead = _transport.read(_rxDataBuffer); diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/RecorderPipe.java b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/RecorderPipe.java index 73a5ab2..df8084a 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/RecorderPipe.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/RecorderPipe.java @@ -44,11 +44,16 @@ public class RecorderPipe implements Protocol { } @Override - public void send(byte[] frame) throws IOException { - _childProtocol.send(frame); + public void sendAudio(byte[] frame) throws IOException { + _childProtocol.sendAudio(frame); writeToFile(frame); } + @Override + public void sendData(byte[] dataPacket) throws IOException { + _childProtocol.sendData(dataPacket); + } + @Override public boolean receive(Callback callback) throws IOException { return _childProtocol.receive(new Callback() { diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/ScramblerPipe.java b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/ScramblerPipe.java index 45d47b7..f00ea2a 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/ScramblerPipe.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/ScramblerPipe.java @@ -42,24 +42,18 @@ public class ScramblerPipe implements Protocol { } @Override - public void send(byte[] audioFrame) throws IOException { - ScramblingTools.ScrambledData data = null; - try { - data = ScramblingTools.scramble(_scramblingKey, audioFrame, _iterationsCount); - } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeySpecException | - InvalidKeyException | BadPaddingException | IllegalBlockSizeException | - InvalidAlgorithmParameterException e) { - - e.printStackTrace(); + public void sendAudio(byte[] audioFrame) throws IOException { + byte[] result = scrable(audioFrame); + if (result != null) { + _childProtocol.sendData(result); } - if (data != null) { - byte[] result = new byte[data.iv.length + data.salt.length + data.scrambledData.length]; + } - System.arraycopy(data.iv, 0, result, 0, data.iv.length); - System.arraycopy(data.salt, 0, result, data.iv.length, data.salt.length); - System.arraycopy(data.scrambledData, 0, result, data.iv.length + data.salt.length, data.scrambledData.length); - - _childProtocol.send(result); + @Override + public void sendData(byte[] dataPacket) throws IOException { + byte[] result = scrable(dataPacket); + if (result != null) { + _childProtocol.sendData(result); } } @@ -121,4 +115,26 @@ public class ScramblerPipe implements Protocol { public void close() { _childProtocol.close(); } + + private byte[] scrable(byte[] srcData) throws IOException { + ScramblingTools.ScrambledData data = null; + try { + data = ScramblingTools.scramble(_scramblingKey, srcData, _iterationsCount); + } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeySpecException | + InvalidKeyException | BadPaddingException | IllegalBlockSizeException | + InvalidAlgorithmParameterException e) { + + e.printStackTrace(); + } + if (data != null) { + byte[] result = new byte[data.iv.length + data.salt.length + data.scrambledData.length]; + + System.arraycopy(data.iv, 0, result, 0, data.iv.length); + System.arraycopy(data.salt, 0, result, data.iv.length, data.salt.length); + System.arraycopy(data.scrambledData, 0, result, data.iv.length + data.salt.length, data.scrambledData.length); + + return result; + } + return null; + } }