From 7a9b5630a288616ae9677a4025539e335b18dea1 Mon Sep 17 00:00:00 2001 From: sh123 Date: Sat, 13 Aug 2022 16:29:30 +0300 Subject: [PATCH] FreeDV squelch from settings --- .../radio/codec2talkie/protocol/Freedv.java | 8 +- .../codec2talkie/settings/PreferenceKeys.java | 3 + codec2talkie/src/main/res/values/arrays.xml | 40 ++++++- codec2talkie/src/main/res/values/strings.xml | 16 ++- .../main/res/xml/preferences_sound_modem.xml | 112 ++++++++++++------ libcodec2-android/src/main/cpp/Codec2JNI.cpp | 10 +- .../java/com/ustadmobile/codec2/Codec2.java | 8 +- 7 files changed, 149 insertions(+), 48 deletions(-) diff --git a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Freedv.java b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Freedv.java index 70aef49..c264912 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Freedv.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/protocol/Freedv.java @@ -39,11 +39,13 @@ public class Freedv implements Protocol { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); int mode = SettingsWrapper.getFreeDvSoundModemModulation(sharedPreferences); - int gain = Integer.parseInt(sharedPreferences.getString(PreferenceKeys.PORTS_SOUND_MODEM_GAIN, "10000")); + int dataMode = Integer.parseInt(sharedPreferences.getString(PreferenceKeys.PORTS_SOUND_MODEM_FREEDV_DATA_MODE, "12")); + boolean isSquelchEnabled = sharedPreferences.getBoolean(PreferenceKeys.PORTS_SOUND_MODEM_FREEDV_ENABLE_SQUELCH, true); + float squelchSnr = Float.parseFloat( sharedPreferences.getString(PreferenceKeys.PORTS_SOUND_MODEM_FREEDV_SQUELCH_SNR, "0.0")); - Log.i(TAG, "Using freedv mode " + AudioTools.getFreedvModeAsText(sharedPreferences) + " gain " + gain); + Log.i(TAG, "Using freedv mode " + AudioTools.getFreedvModeAsText(sharedPreferences)); - _freedv = Codec2.freedvCreate(mode, gain); + _freedv = Codec2.freedvCreate(mode, isSquelchEnabled, squelchSnr); _modemTxBuffer = new short[Codec2.freedvGetNomModemSamples(_freedv)]; _speechRxBuffer = new short[Codec2.freedvGetMaxSpeechSamples(_freedv)]; } 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 a3978cf..8701024 100644 --- a/codec2talkie/src/main/java/com/radio/codec2talkie/settings/PreferenceKeys.java +++ b/codec2talkie/src/main/java/com/radio/codec2talkie/settings/PreferenceKeys.java @@ -24,6 +24,9 @@ public final class PreferenceKeys { public static String PORTS_SOUND_MODEM_GAIN ="ports_sound_modem_gain"; public static String PORTS_SOUND_MODEM_PTT_OFF_DELAY_MS = "ports_sound_modem_ptt_off_delay_ms"; public static String PORTS_SOUND_MODEM_LOOPBACK="ports_sound_modem_loopback"; + public static String PORTS_SOUND_MODEM_FREEDV_ENABLE_SQUELCH="ports_sound_modem_freedv_enable_squelch"; + public static String PORTS_SOUND_MODEM_FREEDV_SQUELCH_SNR="ports_sound_modem_freedv_squelch_snr"; + public static String PORTS_SOUND_MODEM_FREEDV_DATA_MODE="ports_sound_modem_freedv_data_mode"; public static String CODEC2_MODE = "codec2_mode"; public static String CODEC2_RECORDING_ENABLED = "codec2_recording_enabled"; diff --git a/codec2talkie/src/main/res/values/arrays.xml b/codec2talkie/src/main/res/values/arrays.xml index 3681747..6729e6d 100644 --- a/codec2talkie/src/main/res/values/arrays.xml +++ b/codec2talkie/src/main/res/values/arrays.xml @@ -352,7 +352,7 @@ - Loopback/Echo + [Debug] Loopback/Echo Bluetooth Bluetooth LE (BLE) TCP/IP @@ -426,4 +426,42 @@ 12589 15848 + + + -5 db + -4 db + -3 db + -2 db + -1 db + +0 db + +1 db + +2 db + +3 db + +4 db + +5 db + + + + -5.0 + -4.0 + -3.0 + -2.0 + -1.0 + 0.0 + 1.0 + 2.0 + 3.0 + 4.0 + 5.0 + + + + DATAC1 980bps (medium SNR) + DATAC3 321bps (low SNR) + + + + 10 + 12 + \ No newline at end of file diff --git a/codec2talkie/src/main/res/values/strings.xml b/codec2talkie/src/main/res/values/strings.xml index 31f60a1..97c255b 100644 --- a/codec2talkie/src/main/res/values/strings.xml +++ b/codec2talkie/src/main/res/values/strings.xml @@ -273,7 +273,7 @@ Message text Send Cancel - Send message to... + Send message to… Messages Incoming message Click to open and read message @@ -301,12 +301,22 @@ Set sound modem settings, such as bit rate TNC transport type Disable receive - Run modem in transmit only mode, receive is disabled to save CPU cycles + Run modem in transmit only mode, receive is disabled to save CPU cycles, e.g. when using APRS one way tracking Select RIG model for CAT PTT control Set modem audio gain 🎛 CAT PTT transmit off delay How long to wait before switching off the transmission after last data is sent out (milliseconds) - Enable modulator loopback mode + [Debug] Enable modulator loopback mode Audio modulated samples will be fed back to de-modulator + Sound modem settings + AFSK modem settings + CAT PTT settings + FreeDV settings + Enable SNR squelch + Receive will be disabled when SNR is below given threshold + Set squelch SNR threshold + Packets below give threshold won\'t be received + FreeDV data mode + Select data mode \ No newline at end of file diff --git a/codec2talkie/src/main/res/xml/preferences_sound_modem.xml b/codec2talkie/src/main/res/xml/preferences_sound_modem.xml index 18dc913..c653c52 100644 --- a/codec2talkie/src/main/res/xml/preferences_sound_modem.xml +++ b/codec2talkie/src/main/res/xml/preferences_sound_modem.xml @@ -3,8 +3,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto"> + app:key="ports_sound_modem_category_general" + app:title="@string/sound_modem_category_general_title"> - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libcodec2-android/src/main/cpp/Codec2JNI.cpp b/libcodec2-android/src/main/cpp/Codec2JNI.cpp index f13d1cf..f34e115 100644 --- a/libcodec2-android/src/main/cpp/Codec2JNI.cpp +++ b/libcodec2-android/src/main/cpp/Codec2JNI.cpp @@ -33,7 +33,6 @@ namespace Java_com_ustadmobile_codec2_Codec2 { struct freedv *freeDv; short *speechSamples; short *modemSamples; - int gain; }; static Context *getContext(jlong jp) { @@ -98,17 +97,16 @@ namespace Java_com_ustadmobile_codec2_Codec2 { return reinterpret_cast(conFsk); } - static jlong freedvCreate(JNIEnv *env, jclass clazz, int mode, int gain) { + static jlong freedvCreate(JNIEnv *env, jclass clazz, int mode, jboolean isSquelchEnabled, jfloat squelchSnr) { struct ContextFreedv *conFreedv; conFreedv = (struct ContextFreedv *) malloc(sizeof(struct ContextFreedv)); conFreedv->freeDv = freedv_open(mode); - conFreedv->gain = gain; conFreedv->speechSamples = static_cast(malloc( freedv_get_n_max_speech_samples(conFreedv->freeDv) * sizeof(short))); conFreedv->modemSamples = static_cast(malloc( freedv_get_n_max_modem_samples(conFreedv->freeDv) * sizeof(short))); - freedv_set_squelch_en(conFreedv->freeDv, 1); - freedv_set_snr_squelch_thresh(conFreedv->freeDv, -5.0); + freedv_set_squelch_en(conFreedv->freeDv, isSquelchEnabled); + freedv_set_snr_squelch_thresh(conFreedv->freeDv, squelchSnr); return reinterpret_cast(conFreedv); } @@ -299,7 +297,7 @@ namespace Java_com_ustadmobile_codec2_Codec2 { {"fskSamplesPerSymbol", "(J)I", (void *) fskSamplesPerSymbol}, {"fskNin", "(J)I", (void *) fskNin}, // freedv - {"freedvCreate", "(II)J", (void *)freedvCreate}, + {"freedvCreate", "(IZF)J", (void *)freedvCreate}, {"freedvDestroy", "(J)I", (void *)freedvDestroy}, {"freedvGetMaxSpeechSamples", "(J)I", (void *)freedvGetMaxSpeechSamples}, {"freedvGetMaxModemSamples", "(J)I", (void *)freedvGetMaxModemSamples}, diff --git a/libcodec2-android/src/main/java/com/ustadmobile/codec2/Codec2.java b/libcodec2-android/src/main/java/com/ustadmobile/codec2/Codec2.java index 88fbffb..3d7f5f4 100644 --- a/libcodec2-android/src/main/java/com/ustadmobile/codec2/Codec2.java +++ b/libcodec2-android/src/main/java/com/ustadmobile/codec2/Codec2.java @@ -32,6 +32,12 @@ public class Codec2 { public static final int FREEDV_MODE_2020B = 16; public static final int FREEDV_MODE_700E = 13; + // freedv data modes + public static final int FREEDV_MODE_FSK_LDPC = 9; + public static final int FREEDV_MODE_DATAC1 = 10; + public static final int FREEDV_MODE_DATAC3 = 12; + public static final int FREEDV_MODE_DATAC0 = 14; + // raw codec2 public native static long create(int mode); public native static int destroy(long con); @@ -57,7 +63,7 @@ public class Codec2 { public native static long fskDemodulate(long conFsk, short[] inputSamples, byte[] outputBits); // freedv - public native static long freedvCreate(int mode, int gain); + public native static long freedvCreate(int mode, boolean isSquelchEnabled, float squelchSnr); public native static int freedvDestroy(long conFreedv); public native static int freedvGetMaxSpeechSamples(long conFreedv);