codec2_talkie/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/AudioCodec2.java

196 wiersze
6.3 KiB
Java
Czysty Zwykły widok Historia

package com.radio.codec2talkie.protocol;
import android.content.Context;
2023-12-09 11:33:32 +00:00
import android.content.SharedPreferences;
2023-12-09 11:33:32 +00:00
import com.radio.codec2talkie.R;
2022-07-18 17:17:40 +00:00
import com.radio.codec2talkie.protocol.message.TextMessage;
import com.radio.codec2talkie.protocol.position.Position;
2023-12-09 11:33:32 +00:00
import com.radio.codec2talkie.settings.PreferenceKeys;
import com.radio.codec2talkie.tools.AudioTools;
import com.radio.codec2talkie.transport.Transport;
import com.ustadmobile.codec2.Codec2;
import java.io.IOException;
public class AudioCodec2 implements Protocol {
private final Protocol _childProtocol;
private long _codec2Con;
private int _audioBufferSize;
private char[] _recordAudioEncodedBuffer;
private short[] _playbackAudioBuffer;
2023-12-09 11:33:32 +00:00
private final SharedPreferences _sharedPreferences;
2022-07-03 09:05:00 +00:00
private ProtocolCallback _parentProtocolCallback;
2022-07-01 14:18:37 +00:00
2023-12-09 11:33:32 +00:00
public AudioCodec2(Protocol childProtocol, SharedPreferences sharedPreferences) {
_childProtocol = childProtocol;
2022-06-30 15:53:35 +00:00
_codec2Con = 0;
2023-12-09 11:33:32 +00:00
_sharedPreferences = sharedPreferences;
}
@Override
2022-07-03 09:05:00 +00:00
public void initialize(Transport transport, Context context, ProtocolCallback protocolCallback) throws IOException {
_parentProtocolCallback = protocolCallback;
2022-07-01 14:18:37 +00:00
_childProtocol.initialize(transport, context, _protocolCallback);
2023-12-09 11:33:32 +00:00
String codec2ModeName = _sharedPreferences.getString(PreferenceKeys.CODEC2_MODE, context.getResources().getStringArray(R.array.codec2_modes)[0]);
int codec2ModeId = AudioTools.extractCodec2ModeId(codec2ModeName);
constructCodec2(codec2ModeId);
}
@Override
2022-08-13 17:48:45 +00:00
public int getPcmAudioRecordBufferSize() {
return _audioBufferSize;
}
@Override
2023-12-09 12:27:49 +00:00
public void sendCompressedAudio(String src, String dst, byte[] frame) throws IOException {
_childProtocol.sendCompressedAudio(src, dst, frame);
}
2022-07-18 17:17:40 +00:00
@Override
2022-08-13 17:48:45 +00:00
public void sendTextMessage(TextMessage textMessage) throws IOException {
_childProtocol.sendTextMessage(textMessage);
2022-07-18 17:17:40 +00:00
}
@Override
2023-12-09 12:27:49 +00:00
public void sendPcmAudio(String src, String dst, short[] pcmFrame) throws IOException {
_parentProtocolCallback.onTransmitPcmAudio(src, dst, pcmFrame);
2022-07-01 14:18:37 +00:00
Codec2.encode(_codec2Con, pcmFrame, _recordAudioEncodedBuffer);
byte [] frame = new byte[_recordAudioEncodedBuffer.length];
for (int i = 0; i < _recordAudioEncodedBuffer.length; i++) {
frame[i] = (byte)_recordAudioEncodedBuffer[i];
}
2023-12-09 12:27:49 +00:00
_childProtocol.sendCompressedAudio(src, dst, frame);
}
@Override
public void sendData(String src, String dst, String path, byte[] dataPacket) throws IOException {
_childProtocol.sendData(src, dst, path, dataPacket);
}
@Override
2022-07-01 14:18:37 +00:00
public boolean receive() throws IOException {
return _childProtocol.receive();
}
2022-07-03 09:05:00 +00:00
ProtocolCallback _protocolCallback = new ProtocolCallback() {
2022-07-01 14:18:37 +00:00
@Override
protected void onReceivePosition(Position position) {
2022-08-13 17:48:45 +00:00
_parentProtocolCallback.onReceivePosition(position);
2022-07-01 14:18:37 +00:00
}
@Override
2023-12-09 12:27:49 +00:00
protected void onReceivePcmAudio(String src, String dst, short[] pcmFrame) {
_parentProtocolCallback.onReceivePcmAudio(src, dst, pcmFrame);
2022-07-01 14:18:37 +00:00
}
@Override
2023-12-09 12:27:49 +00:00
protected void onReceiveCompressedAudio(String src, String dst, byte[] audioFrame) {
2022-07-01 14:18:37 +00:00
Codec2.decode(_codec2Con, _playbackAudioBuffer, audioFrame);
2023-12-09 12:27:49 +00:00
_parentProtocolCallback.onReceivePcmAudio(src, dst, _playbackAudioBuffer);
2022-07-01 14:18:37 +00:00
}
2022-07-18 19:24:48 +00:00
@Override
protected void onReceiveTextMessage(TextMessage textMessage) {
_parentProtocolCallback.onReceiveTextMessage(textMessage);
}
2022-07-01 14:18:37 +00:00
@Override
protected void onReceiveData(String src, String dst, String path, byte[] data) {
_parentProtocolCallback.onReceiveData(src, dst, path, data);
2022-07-01 14:18:37 +00:00
}
@Override
protected void onReceiveSignalLevel(short rssi, short snr) {
2022-07-03 09:05:00 +00:00
_parentProtocolCallback.onReceiveSignalLevel(rssi, snr);
2022-07-01 14:18:37 +00:00
}
@Override
protected void onReceiveTelemetry(int batVoltage) {
_parentProtocolCallback.onReceiveTelemetry(batVoltage);
}
2022-07-01 14:39:45 +00:00
@Override
protected void onReceiveLog(String logData) {
2022-07-03 09:05:00 +00:00
_parentProtocolCallback.onReceiveLog(logData);
2022-07-01 14:39:45 +00:00
}
2022-07-01 14:18:37 +00:00
@Override
2023-12-09 12:27:49 +00:00
protected void onTransmitPcmAudio(String src, String dst, short[] frame) {
_parentProtocolCallback.onTransmitPcmAudio(src, dst, frame);
2022-07-01 14:18:37 +00:00
}
@Override
2023-12-09 12:27:49 +00:00
protected void onTransmitCompressedAudio(String src, String dst, byte[] frame) {
_parentProtocolCallback.onTransmitCompressedAudio(src, dst, frame);
2022-07-01 14:18:37 +00:00
}
2022-07-18 19:24:48 +00:00
@Override
protected void onTransmitTextMessage(TextMessage textMessage) {
_parentProtocolCallback.onTransmitTextMessage(textMessage);
}
2022-07-31 14:03:31 +00:00
@Override
protected void onTransmitPosition(Position position) {
2022-08-13 17:48:45 +00:00
_parentProtocolCallback.onTransmitPosition(position);
2022-07-31 14:03:31 +00:00
}
2022-07-01 14:18:37 +00:00
@Override
protected void onTransmitData(String src, String dst, String path, byte[] data) {
_parentProtocolCallback.onTransmitData(src, dst, path, data);
2022-07-01 14:18:37 +00:00
}
2022-07-01 14:39:45 +00:00
@Override
protected void onTransmitLog(String logData) {
2022-07-03 09:05:00 +00:00
_parentProtocolCallback.onTransmitLog(logData);
2022-07-01 14:39:45 +00:00
}
2022-07-01 14:18:37 +00:00
@Override
protected void onProtocolRxError() {
2022-07-03 09:05:00 +00:00
_parentProtocolCallback.onProtocolRxError();
2022-07-01 14:18:37 +00:00
}
@Override
protected void onProtocolTxError() {
2022-07-03 09:05:00 +00:00
_parentProtocolCallback.onProtocolTxError();
2022-07-01 14:18:37 +00:00
}
};
2022-06-29 19:23:02 +00:00
@Override
2022-08-13 17:48:45 +00:00
public void sendPosition(Position position) throws IOException {
_childProtocol.sendPosition(position);
2022-06-29 19:23:02 +00:00
}
@Override
public void flush() throws IOException {
_childProtocol.flush();
}
@Override
public void close() {
Codec2.destroy(_codec2Con);
_childProtocol.close();
}
private void constructCodec2(int codecMode) {
2022-06-30 15:53:35 +00:00
if (_codec2Con != 0) {
Codec2.destroy(_codec2Con);
}
_codec2Con = Codec2.create(codecMode);
_audioBufferSize = Codec2.getSamplesPerFrame(_codec2Con);
int codec2FrameSize = Codec2.getBitsSize(_codec2Con); // returns number of bytes
_recordAudioEncodedBuffer = new char[codec2FrameSize];
_playbackAudioBuffer = new short[_audioBufferSize];
}
}