From aec8946d100bf5b61e5420ddb7e043ae90dffa7f Mon Sep 17 00:00:00 2001 From: Richard Shaw Date: Sat, 16 Jul 2022 14:40:02 -0500 Subject: [PATCH] Add patch to deal with unintentional API change. --- codec2-fixes.patch | 264 +++++++++++++++++++++++++++++++++++++++++++++ codec2.spec | 9 +- 2 files changed, 271 insertions(+), 2 deletions(-) create mode 100644 codec2-fixes.patch diff --git a/codec2-fixes.patch b/codec2-fixes.patch new file mode 100644 index 0000000..ce0676a --- /dev/null +++ b/codec2-fixes.patch @@ -0,0 +1,264 @@ +diff --git a/src/freedv_2020.c b/src/freedv_2020.c +index 8d420089..6ce5f5db 100644 +--- a/src/freedv_2020.c ++++ b/src/freedv_2020.c +@@ -36,7 +36,7 @@ + extern char *ofdm_statemode[]; + + #ifdef __LPCNET__ +-void freedv_2020x_open(struct freedv *f, int vq_type) { ++void freedv_2020x_open(struct freedv *f) { + f->speech_sample_rate = FREEDV_FS_16000; + f->snr_squelch_thresh = 4.0; + f->squelch_en = 0; +@@ -60,13 +60,16 @@ void freedv_2020x_open(struct freedv *f, int vq_type) { + + ldpc_codes_setup(f->ldpc, f->ofdm->codename); + int data_bits_per_frame; ++ int vq_type; + switch (f->mode) { + case FREEDV_MODE_2020: + data_bits_per_frame = 312; ++ vq_type = 1; /* vanilla VQ */ + break; + case FREEDV_MODE_2020B: + f->ldpc->protection_mode = LDPC_PROT_2020B; + data_bits_per_frame = 156; ++ vq_type = 2; /* index optimised VQ for increased robustness to single bit errors */ + break; + default: + assert(0); +diff --git a/src/freedv_api.c b/src/freedv_api.c +index e98736f5..b265d256 100644 +--- a/src/freedv_api.c ++++ b/src/freedv_api.c +@@ -4,12 +4,13 @@ + AUTHOR......: David Rowe + DATE CREATED: August 2014 + +- Library of API functions that implement FreeDV "modes", useful for ++ Library of API functions that implement the FreeDV API, useful for + embedding FreeDV in other programs. Please see: + + 1. README_freedv.md +- 2. Notes function use in freedv_api.c +- 3. The sample freedv_tx.c and freedv_rx.c programs ++ 2. Notes on function use in this file ++ 3. Simple demo programs in the "demo" directory ++ 4. The full featured command line freedv_tx.c and freedv_rx.c programs + + \*---------------------------------------------------------------------------*/ + +@@ -110,17 +111,6 @@ char *rx_sync_flags_to_text[] = { + struct freedv *freedv_open(int mode) { + // defaults for those modes that support the use of adv + struct freedv_advanced adv = {0,2,100,8000,1000,200, "H_256_512_4"}; +-#ifdef __LPCNET__ +- // set up default Vector Quantisers (VQs) for LPCNet */ +- switch (mode) { +- case FREEDV_MODE_2020: +- adv.lpcnet_vq_type = 1; /* vanilla VQ */ +- break; +- case FREEDV_MODE_2020B: +- adv.lpcnet_vq_type = 2; /* index optimised VQ for theorectical robustness to single bit errors */ +- break; +- } +-#endif + return freedv_open_advanced(mode, &adv); + } + +@@ -155,10 +145,9 @@ struct freedv *freedv_open_advanced(int mode, struct freedv_advanced *adv) { + if (FDV_MODE_ACTIVE( FREEDV_MODE_700D, mode)) freedv_ofdm_voice_open(f, "700D"); + if (FDV_MODE_ACTIVE( FREEDV_MODE_700E, mode)) freedv_ofdm_voice_open(f, "700E"); + #ifdef __LPCNET__ +- if (FDV_MODE_ACTIVE( FREEDV_MODE_2020, mode) || +- FDV_MODE_ACTIVE( FREEDV_MODE_2020B, mode)) +- freedv_2020x_open(f, adv->lpcnet_vq_type); +-#endif ++ if (FDV_MODE_ACTIVE( FREEDV_MODE_2020, mode) || FDV_MODE_ACTIVE( FREEDV_MODE_2020B, mode)) ++ freedv_2020x_open(f); ++#endif + if (FDV_MODE_ACTIVE( FREEDV_MODE_2400A, mode)) freedv_2400a_open(f); + if (FDV_MODE_ACTIVE( FREEDV_MODE_2400B, mode)) freedv_2400b_open(f); + if (FDV_MODE_ACTIVE( FREEDV_MODE_800XA, mode)) freedv_800xa_open(f); +diff --git a/src/freedv_api.h b/src/freedv_api.h +index 952f08dd..70345eb8 100644 +--- a/src/freedv_api.h ++++ b/src/freedv_api.h +@@ -4,7 +4,7 @@ + AUTHOR......: David Rowe + DATE CREATED: August 2014 + +- Library of API functions that implement FreeDV "modes", useful for ++ Library of API functions that implement the FreeDV API, useful for + embedding FreeDV in other programs. Please see: + + 1. README_freedv.md +@@ -137,7 +137,7 @@ struct freedv; + + // Some modes allow extra configuration parameters + struct freedv_advanced { +- int lpcnet_vq_type; // see lpcnet_freedv.h ++ int interleave_frames; // now unused but remains to prevent breaking API for legacy apps + + // parameters for FREEDV_MODE_FSK_LDPC + int M; // 2 or 4 FSK +diff --git a/src/freedv_api_internal.h b/src/freedv_api_internal.h +index d6cdf7a8..203505ad 100644 +--- a/src/freedv_api_internal.h ++++ b/src/freedv_api_internal.h +@@ -197,7 +197,7 @@ struct freedv { + void freedv_1600_open(struct freedv *f); + void freedv_700c_open(struct freedv *f); + void freedv_ofdm_voice_open(struct freedv *f, char *mode); +-void freedv_2020x_open(struct freedv *f, int vq_type); ++void freedv_2020x_open(struct freedv *f); + void freedv_2400a_open(struct freedv *f); + void freedv_2400b_open(struct freedv *f); + void freedv_800xa_open(struct freedv *f); +diff --git a/src/freedv_rx.c b/src/freedv_rx.c +index b2ad80c8..14bea647 100644 +--- a/src/freedv_rx.c ++++ b/src/freedv_rx.c +@@ -64,7 +64,7 @@ int main(int argc, char *argv[]) { + float snr_est; + float clock_offset; + int use_testframes, verbose, discard, use_complex, use_dpsk, use_reliabletext; +- int use_squelch, vq_type; ++ int use_squelch; + float squelch = 0; + struct freedv *freedv; + int use_passthroughgain; +@@ -81,8 +81,6 @@ int main(int argc, char *argv[]) { + "\n" + " --discard Reset BER stats on loss of sync, helps us get sensible BER results\n" + " --dpsk Use differential PSK rather than coherent PSK\n" +- " --indopt 0|1 Choose index optimised VQ for 2020/2020B, no effect other modes\n" +- " default for 2020/2020B 0/1/1 (off/on/on)\n" + " --reliabletext txt Send 'txt' using reliable text protocol\n" + " --txtrx filename Store reliable text output to filename\n" + " --squelch leveldB Set squelch level\n" +@@ -96,7 +94,7 @@ int main(int argc, char *argv[]) { + } + + use_testframes = verbose = discard = use_complex = use_dpsk = use_squelch = 0; use_reliabletext = 0; +- vq_type = -1; use_passthroughgain = 0; ++ use_passthroughgain = 0; + + int o = 0; + int opt_idx = 0; +@@ -112,12 +110,11 @@ int main(int argc, char *argv[]) { + {"usecomplex", no_argument, 0, 'c'}, + {"verbose1", no_argument, 0, 'v'}, + {"vv", no_argument, 0, 'w'}, +- {"indopt", required_argument, 0, 'n'}, + {"passthroughgain", required_argument, 0, 'p'}, + {0, 0, 0, 0} + }; + +- o = getopt_long(argc,argv,"idhr:s:x:tcvwn:p:",long_opts,&opt_idx); ++ o = getopt_long(argc,argv,"idhr:s:x:tcvwp:",long_opts,&opt_idx); + + switch(o) { + case 'i': +@@ -129,12 +126,6 @@ int main(int argc, char *argv[]) { + case 'd': + use_dpsk = 1; + break; +- case 'n': +- if (atoi(optarg) == 0) +- vq_type = 1; +- else +- vq_type = 2; +- break; + case 'p': + use_passthroughgain = 1; + passthroughgain = atof(optarg); +@@ -203,14 +194,7 @@ int main(int argc, char *argv[]) { + exit(1); + } + +- if (vq_type == -1) +- freedv = freedv_open(mode); +- else { +- // 2020x: specify VQ type +- struct freedv_advanced adv; +- adv.lpcnet_vq_type = vq_type; +- freedv = freedv_open_advanced(mode, &adv); +- } ++ freedv = freedv_open(mode); + assert(freedv != NULL); + + /* set up a few options, calling these is optional -------------------------*/ +diff --git a/src/freedv_tx.c b/src/freedv_tx.c +index 03691f56..40d3c274 100644 +--- a/src/freedv_tx.c ++++ b/src/freedv_tx.c +@@ -61,7 +61,6 @@ int main(int argc, char *argv[]) { + struct freedv *freedv; + int mode; + int use_testframes, use_clip, use_txbpf, use_dpsk, use_reliabletext; +- int vq_type; + char *callsign = ""; + reliable_text_t reliable_text_obj; + char f2020[80] = {0}; +@@ -76,8 +75,6 @@ int main(int argc, char *argv[]) { + " --clip 0|1 Clipping (compression) of modem output samples for reduced PAPR\n" + " and higher average power\n" + " --dpsk Use differential PSK rather than coherent PSK\n" +- " --indopt 0|1 Choose index optimised VQ for 2020/2020B, no effect other modes\n" +- " default for 2020/2020B 0/1/1 (off/on/on)\n" + " --reliabletext txt Send 'txt' using reliable text protocol\n" + " --testframes Send testframe instead of coded speech. Number of testsframes depends on\n" + " length of speech input file\n" +@@ -88,7 +85,6 @@ int main(int argc, char *argv[]) { + } + + use_testframes = 0; use_clip = 0; use_txbpf = 1; use_dpsk = 0; use_reliabletext = 0; +- vq_type = -1; + + int o = 0; + int opt_idx = 0; +@@ -100,11 +96,10 @@ int main(int argc, char *argv[]) { + {"reliabletext", required_argument, 0, 'r'}, + {"testframes", no_argument, 0, 't'}, + {"txbpf", required_argument, 0, 'b'}, +- {"indopt", required_argument, 0, 'n'}, + {0, 0, 0, 0} + }; + +- o = getopt_long(argc,argv,"l:dhr:tb:n:",long_opts,&opt_idx); ++ o = getopt_long(argc,argv,"l:dhr:tb:",long_opts,&opt_idx); + + switch(o) { + case 'b': +@@ -116,12 +111,6 @@ int main(int argc, char *argv[]) { + case 'l': + use_clip = atoi(optarg); + break; +- case 'n': +- if (atoi(optarg) == 0) +- vq_type = 1; +- else +- vq_type = 2; +- break; + case 'r': + use_reliabletext = 1; + callsign = optarg; +@@ -171,15 +160,7 @@ int main(int argc, char *argv[]) { + exit(1); + } + +- if (vq_type == -1) +- freedv = freedv_open(mode); +- else { +- // 2020x: specify VQ type +- struct freedv_advanced adv; +- adv.lpcnet_vq_type = vq_type; +- freedv = freedv_open_advanced(mode, &adv); +- } +- ++ freedv = freedv_open(mode); + assert(freedv != NULL); + + /* these are all optional ------------------ */ diff --git a/codec2.spec b/codec2.spec index 0a10b4d..5b7f68c 100644 --- a/codec2.spec +++ b/codec2.spec @@ -7,13 +7,15 @@ Name: codec2 Version: 1.0.4 -Release: 1%{?dist} +Release: 1%{?dist}.1 Summary: Next-Generation Digital Voice for Two-Way Radio License: LGPLv2 URL: http://rowetel.com/codec2.html Source0: https://github.com/drowe67/codec2/archive/v%{version}/%{name}-%{version}.tar.gz +Patch0: codec2-fixes.patch + BuildRequires: cmake%{?rhel:3} BuildRequires: gcc gcc-c++ BuildRequires: libsamplerate-devel @@ -51,7 +53,7 @@ Example code for Codec 2 %prep -%autosetup +%autosetup -p1 %build @@ -98,6 +100,9 @@ EOF %changelog +* Sat Jul 16 2022 Richard Shaw - 1.0.4-1.1 +- Add patch to deal with unintentional API change. + * Sat Jul 09 2022 Richard Shaw - 1.0.4-1 - Update to 1.0.4.