From e88a94e9bef2343b7057f923df643a34e0d2b7bd Mon Sep 17 00:00:00 2001 From: sh123 Date: Sat, 9 Dec 2023 19:43:55 +0200 Subject: [PATCH] OPUS init --- .../protocol/ProtocolFactory.java | 15 ++++++++----- .../codec2talkie/settings/PreferenceKeys.java | 1 + .../settings/SettingsWrapper.java | 4 ++++ .../radio/codec2talkie/tools/AudioTools.java | 8 ++++++- codec2talkie/src/main/res/values/arrays.xml | 21 ++++++++++++++++++- codec2talkie/src/main/res/values/strings.xml | 5 +++-- codec2talkie/src/main/res/xml/preferences.xml | 7 +++++++ .../src/main/res/xml/preferences_codec.xml | 16 +++++++------- libopus-android/src/main/cpp/OpusJNI.cpp | 8 +++---- .../src/main/java/com/radio/opus/Opus.java | 12 ++++++++++- 10 files changed, 76 insertions(+), 21 deletions(-) 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); }