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

103 wiersze
3.3 KiB
Java
Czysty Zwykły widok Historia

2022-08-10 17:46:13 +00:00
package com.radio.codec2talkie.protocol;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
2022-08-10 17:46:13 +00:00
import androidx.preference.PreferenceManager;
import com.radio.codec2talkie.app.AppWorker;
2022-08-10 17:46:13 +00:00
import com.radio.codec2talkie.protocol.message.TextMessage;
import com.radio.codec2talkie.protocol.position.Position;
import com.radio.codec2talkie.settings.PreferenceKeys;
2022-08-11 13:40:06 +00:00
import com.radio.codec2talkie.tools.AudioTools;
2022-08-10 17:46:13 +00:00
import com.radio.codec2talkie.transport.Transport;
2022-08-10 19:46:43 +00:00
import com.ustadmobile.codec2.Codec2;
2022-08-10 17:46:13 +00:00
import java.io.IOException;
2022-08-10 19:46:43 +00:00
import java.util.Arrays;
2022-08-10 17:46:13 +00:00
public class Freedv implements Protocol {
private static final String TAG = Freedv.class.getSimpleName();
2022-08-10 19:46:43 +00:00
2022-08-10 17:46:13 +00:00
private ProtocolCallback _parentProtocolCallback;
2022-08-10 19:46:43 +00:00
private Transport _transport;
private long _freedv;
private short[] _modemTxBuffer;
private short[] _speechRxBuffer;
2022-08-10 17:46:13 +00:00
public Freedv() {
2022-08-10 17:46:13 +00:00
}
@Override
2022-08-10 19:46:43 +00:00
public void initialize(Transport transport, Context context, ProtocolCallback parentProtocolCallback) throws IOException {
_transport = transport;
_parentProtocolCallback = parentProtocolCallback;
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
String modemType = sharedPreferences.getString(PreferenceKeys.PORTS_SOUND_MODEM_TYPE, "1200");
int mode = Integer.parseInt(modemType.substring(1));
2022-08-11 13:40:06 +00:00
Log.i(TAG, "Using freedv mode " + AudioTools.getFreedvModeAsText(sharedPreferences));
_freedv = Codec2.freedvCreate(mode);
2022-08-10 19:46:43 +00:00
_modemTxBuffer = new short[Codec2.freedvGetNomModemSamples(_freedv)];
_speechRxBuffer = new short[Codec2.freedvGetMaxSpeechSamples(_freedv)];
2022-08-10 17:46:13 +00:00
}
@Override
public int getPcmAudioBufferSize() {
2022-08-10 19:46:43 +00:00
return Codec2.freedvGetNSpeechSamples(_freedv);
2022-08-10 17:46:13 +00:00
}
@Override
public void sendPcmAudio(String src, String dst, int codec, short[] pcmFrame) throws IOException {
2022-08-10 19:46:43 +00:00
Codec2.freedvTx(_freedv, _modemTxBuffer, pcmFrame);
2022-08-11 13:40:06 +00:00
//Log.i(TAG, "send pcm " + _modemTxBuffer.length);
2022-08-10 20:35:58 +00:00
_transport.write(_modemTxBuffer);
_parentProtocolCallback.onTransmitPcmAudio(src, dst, codec, pcmFrame);
2022-08-10 17:46:13 +00:00
}
@Override
public void sendCompressedAudio(String src, String dst, int codec, byte[] frame) throws IOException {
}
@Override
public void sendTextMessage(TextMessage textMessage) throws IOException {
}
@Override
public void sendData(String src, String dst, byte[] dataPacket) throws IOException {
}
@Override
public boolean receive() throws IOException {
2022-08-10 20:35:58 +00:00
int nin = Codec2.freedvNin(_freedv);
short[] buf = new short[nin];
int bytesRead = _transport.read(buf);
if (bytesRead == nin) {
long cntRead = Codec2.freedvRx(_freedv, _speechRxBuffer, buf);
if (cntRead > 0) {
2022-08-11 13:40:06 +00:00
//Log.i(TAG, "receive " + cntRead);
2022-08-10 20:35:58 +00:00
_parentProtocolCallback.onReceivePcmAudio(null, null, -1, Arrays.copyOf(_speechRxBuffer, (int) cntRead));
return true;
}
2022-08-10 19:46:43 +00:00
}
2022-08-10 17:46:13 +00:00
return false;
}
@Override
public void sendPosition(Position position) throws IOException {
}
@Override
public void flush() throws IOException {
}
@Override
public void close() {
2022-08-10 19:46:43 +00:00
Codec2.freedvDestroy(_freedv);
2022-08-10 17:46:13 +00:00
}
}