diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/ProtocolFactory.java b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/ProtocolFactory.java
index a018fa8..a941019 100644
--- a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/ProtocolFactory.java
+++ b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/ProtocolFactory.java
@@ -71,6 +71,7 @@ public class ProtocolFactory {
boolean aprsEnabled = SettingsWrapper.isAprsEnabled(sharedPreferences);
boolean aprsIsEnabled = SettingsWrapper.isAprsIsEnabled(sharedPreferences);
boolean freedvEnabled = SettingsWrapper.isFreeDvSoundModemModulation(sharedPreferences);
+ boolean codec2Enabled = SettingsWrapper.isCodec2Enabled(sharedPreferences);
// "root" protocol
Protocol proto;
@@ -103,12 +104,16 @@ public class ProtocolFactory {
proto = new Ax25(proto);
}
if (!freedvEnabled) {
- if (recordingEnabled) {
- proto = new Recorder(proto, sharedPreferences);
- }
+ if (codec2Enabled) {
+ if (recordingEnabled) {
+ proto = new Recorder(proto, sharedPreferences);
+ }
- proto = new AudioCodec2FrameAggregator(proto, sharedPreferences);
- proto = new AudioCodec2(proto, sharedPreferences);
+ proto = new AudioCodec2FrameAggregator(proto, sharedPreferences);
+ proto = new AudioCodec2(proto, sharedPreferences);
+ } else {
+ proto = new AudioOpus(proto);
+ }
}
if (aprsEnabled) {
diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/settings/PreferenceKeys.java b/codec2talkie/src/main/java/com/radio/codec2talkie/settings/PreferenceKeys.java
index 57634ae..2e5d749 100644
--- a/codec2talkie/src/main/java/com/radio/codec2talkie/settings/PreferenceKeys.java
+++ b/codec2talkie/src/main/java/com/radio/codec2talkie/settings/PreferenceKeys.java
@@ -38,6 +38,7 @@ public final class PreferenceKeys {
public static String OPUS_BIT_RATE = "opus_bit_rate";
public static String OPUS_FRAME_SIZE = "opus_frame_size";
+ public static String OPUS_COMPLEXITY = "opus_complexity";
public static String KISS_ENABLED = "kiss_enable";
public static String KISS_BUFFERED_ENABLED = "kiss_buffered_enable";
diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/settings/SettingsWrapper.java b/codec2talkie/src/main/java/com/radio/codec2talkie/settings/SettingsWrapper.java
index c16a12e..b95fe54 100644
--- a/codec2talkie/src/main/java/com/radio/codec2talkie/settings/SettingsWrapper.java
+++ b/codec2talkie/src/main/java/com/radio/codec2talkie/settings/SettingsWrapper.java
@@ -40,6 +40,10 @@ public class SettingsWrapper {
sharedPreferences.getString(PreferenceKeys.PORTS_SOUND_MODEM_TYPE, "1200").startsWith("F");
}
+ public static boolean isCodec2Enabled(SharedPreferences sharedPreferences) {
+ return sharedPreferences.getString(PreferenceKeys.CODEC_TYPE, "Codec2").equals("Codec2");
+ }
+
public static int getFreeDvSoundModemModulation(SharedPreferences sharedPreferences) {
String modemType = sharedPreferences.getString(PreferenceKeys.PORTS_SOUND_MODEM_TYPE, "1200");
if (modemType.startsWith("F")) {
diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/tools/AudioTools.java b/codec2talkie/src/main/java/com/radio/codec2talkie/tools/AudioTools.java
index 26c9812..8dd9e81 100644
--- a/codec2talkie/src/main/java/com/radio/codec2talkie/tools/AudioTools.java
+++ b/codec2talkie/src/main/java/com/radio/codec2talkie/tools/AudioTools.java
@@ -88,7 +88,13 @@ public class AudioTools {
if (freedvModeLabel != null) return freedvModeLabel;
// codec2 speed
- String speedModeInfo = "C2: " + AudioTools.extractCodec2Speed(codec2ModeName);
+ String speedModeInfo;
+ if (SettingsWrapper.isCodec2Enabled()) {
+ speedModeInfo = "C2: " + AudioTools.extractCodec2Speed(codec2ModeName);
+ } else {
+ int speed = Integer.parseInt(sharedPreferences.getString(PreferenceKeys.OPUS_BIT_RATE, "3200"));
+ speedModeInfo = "OPUS: " + speed;
+ }
// radio speed
int radioSpeedBps = RadioTools.getRadioSpeed(sharedPreferences);
diff --git a/codec2talkie/src/main/res/values/arrays.xml b/codec2talkie/src/main/res/values/arrays.xml
index 0550914..4ba69cb 100644
--- a/codec2talkie/src/main/res/values/arrays.xml
+++ b/codec2talkie/src/main/res/values/arrays.xml
@@ -30,10 +30,29 @@
+ - 2.5
+ - 5
+ - 10
- 20
- 40
+ - 60
- 80
- - 180
+ - 100
+ - 120
+
+
+
+ - 0
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
diff --git a/codec2talkie/src/main/res/values/strings.xml b/codec2talkie/src/main/res/values/strings.xml
index 759bc16..eecae43 100644
--- a/codec2talkie/src/main/res/values/strings.xml
+++ b/codec2talkie/src/main/res/values/strings.xml
@@ -25,9 +25,10 @@
Record incoming and outgoing transmissions for future playback
OPUS Settings
- Frame size
+ PCM frame duration [ms]
Bit rate
Bit rate from 500 up to 512000bps
+ Complexity
Loopback
STOPPED
@@ -179,7 +180,7 @@
Modem reboot requested
Maximum super frame size (bytes)
- Multiple Codec2 samples are aggregated into super frame not larger than this value
+ Multiple audio codec encoded samples are aggregated into super frame not larger than this value
USB settings
Serial data bits
diff --git a/codec2talkie/src/main/res/xml/preferences.xml b/codec2talkie/src/main/res/xml/preferences.xml
index 822db2a..7f6e23c 100644
--- a/codec2talkie/src/main/res/xml/preferences.xml
+++ b/codec2talkie/src/main/res/xml/preferences.xml
@@ -134,6 +134,13 @@
app:fragment="com.radio.codec2talkie.settings.SettingsActivity$SettingsCodecFragment">
+
+
+
-
-
-
+
+
+
\ No newline at end of file
diff --git a/libopus-android/src/main/cpp/OpusJNI.cpp b/libopus-android/src/main/cpp/OpusJNI.cpp
index 2369324..846195a 100644
--- a/libopus-android/src/main/cpp/OpusJNI.cpp
+++ b/libopus-android/src/main/cpp/OpusJNI.cpp
@@ -57,19 +57,19 @@ namespace Java_com_radio_opus_Opus {
return 0;
}
- static jint decode(JNIEnv *env, jclass clazz, jlong n, jcharArray in, jshortArray out, jint frames)
+ static jint decode(JNIEnv *env, jclass clazz, jlong n, jbyteArray in, jshortArray out, jint frames)
{
Context *con = getContext(n);
OpusDecoder *decoder = con->decoder;
jint inputArraySize = env->GetArrayLength(in);
- jchar* encodedData = env->GetCharArrayElements(in, 0);
+ jbyte* encodedData = env->GetByteArrayElements(in, 0);
jshort* decodedData = env->GetShortArrayElements(out, 0);
int samples = opus_decode(decoder, (const unsigned char *)encodedData, inputArraySize, decodedData, frames, 0);
- env->ReleaseCharArrayElements(in, encodedData, JNI_ABORT);
+ env->ReleaseByteArrayElements(in, encodedData, JNI_ABORT);
env->ReleaseShortArrayElements(out, decodedData, 0);
return samples;
@@ -96,7 +96,7 @@ namespace Java_com_radio_opus_Opus {
static JNINativeMethod method_table[] = {
{"create", "(IIIII)J", (void *) create },
{"destroy", "(J)I", (void *) destroy },
- {"decode", "(J[C[SI)I", (void *) decode },
+ {"decode", "(J[B[SI)I", (void *) decode },
{"encode", "(J[SI[C)I", (void *) encode }
};
}
diff --git a/libopus-android/src/main/java/com/radio/opus/Opus.java b/libopus-android/src/main/java/com/radio/opus/Opus.java
index aeb6b3d..79213c6 100644
--- a/libopus-android/src/main/java/com/radio/opus/Opus.java
+++ b/libopus-android/src/main/java/com/radio/opus/Opus.java
@@ -26,9 +26,19 @@ public class Opus {
public static final int OPUS_FRAMESIZE_100_MS = 5008; /**< Use 100 ms frames */
public static final int OPUS_FRAMESIZE_120_MS = 5009; /**< Use 120 ms frames */
+ // errors
+ public static final int OPUS_OK = 0;
+ public static final int OPUS_BAD_ARG = -1;
+ public static final int OPUS_BUFFER_TOO_SMALL = -2;
+ public static final int OPUS_INTERNAL_ERROR = -3;
+ public static final int OPUS_INVALID_PACKET = -4;
+ public static final int OPUS_UNIMPLEMENTED = -5;
+ public static final int OPUS_INVALID_STATE = -6;
+ public static final int OPUS_ALLOC_FAIL = -7;
+
public native static long create(int sampleRate, int numChannels, int application, int bitrate, int complexity);
public native static int destroy(long con);
- public native static int decode(long con, char[] in, short[] out, int frames);
+ public native static int decode(long con, byte[] in, short[] out, int frames);
public native static int encode(long con, short[] in, int frames, char[] out);
}