From 2be822512467a5b8ffe572df3c35a0730f469210 Mon Sep 17 00:00:00 2001 From: drowe67 Date: Mon, 30 Apr 2018 01:45:02 +0000 Subject: [PATCH] separate packed bits states for tx and rx to maintain correct state when used in full duplex git-svn-id: https://svn.code.sf.net/p/freetel/code@3537 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/src/freedv_api.c | 8 +++++--- codec2-dev/src/freedv_api_internal.h | 1 + 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/codec2-dev/src/freedv_api.c b/codec2-dev/src/freedv_api.c index 962936f4..8bc36328 100644 --- a/codec2-dev/src/freedv_api.c +++ b/codec2-dev/src/freedv_api.c @@ -198,7 +198,7 @@ struct freedv *freedv_open_advanced(int mode, struct freedv_advanced *adv) { assert((adv->interleave_frames >= 0) && (adv->interleave_frames < 32)); f->interleave_frames = adv->interleave_frames; } - f->modem_frame_count_tx = 0; + f->modem_frame_count_tx = f->modem_frame_count_rx = 0; f->codeword_symbols = (COMP*)malloc(sizeof(COMP)*f->interleave_frames*coded_syms_per_frame); if (f->codeword_symbols == NULL) {return NULL;} @@ -371,6 +371,7 @@ struct freedv *freedv_open_advanced(int mode, struct freedv_advanced *adv) { nbyte = nbyte*Ncodec2frames*f->interleave_frames; //fprintf(stderr, "Ncodec2frames: %d n_speech_samples: %d n_codec_bits: %d nbit: %d nbyte: %d\n", // Ncodec2frames, f->n_speech_samples, f->n_codec_bits, nbit, nbyte); + f->packed_codec_bits_tx = (unsigned char*)malloc(nbyte*sizeof(char)); } f->packed_codec_bits = (unsigned char*)malloc(nbyte*sizeof(char)); @@ -433,6 +434,7 @@ void freedv_close(struct freedv *freedv) { if ((freedv->mode == FREEDV_MODE_700) || (freedv->mode == FREEDV_MODE_700B) || (freedv->mode == FREEDV_MODE_700C)) cohpsk_destroy(freedv->cohpsk); if (freedv->mode == FREEDV_MODE_700D) { + free(freedv->packed_codec_bits_tx); free(freedv->mod_out); free(freedv->codeword_symbols); free(freedv->codeword_amps); @@ -906,7 +908,7 @@ static void freedv_comptx_700d(struct freedv *f, COMP mod_out[]) { bit = 7; for(i=0; ipacked_codec_bits[byte] >> bit) & 0x1; + tx_bits[j+i] = (f->packed_codec_bits_tx[byte] >> bit) & 0x1; bit--; if (bit < 0) { bit = 7; @@ -1012,7 +1014,7 @@ void freedv_comptx(struct freedv *f, COMP mod_out[], short speech_in[]) { /* buffer up bits until we get enough encoded bits for interleaver */ for (j=0; jcodec2, f->packed_codec_bits + (f->modem_frame_count_tx*codec_frames+j)*bytes_per_codec_frame, speech_in); + codec2_encode(f->codec2, f->packed_codec_bits_tx + (f->modem_frame_count_tx*codec_frames+j)*bytes_per_codec_frame, speech_in); speech_in += codec2_samples_per_frame(f->codec2); } diff --git a/codec2-dev/src/freedv_api_internal.h b/codec2-dev/src/freedv_api_internal.h index b65c8afe..3c82c925 100644 --- a/codec2-dev/src/freedv_api_internal.h +++ b/codec2-dev/src/freedv_api_internal.h @@ -87,6 +87,7 @@ struct freedv { int clip; // non-zero for cohpsk modem output clipping for low PAPR unsigned char *packed_codec_bits; + unsigned char *packed_codec_bits_tx; // for 700D we separate packed bits to maintain state due to interleaving int *codec_bits; int *tx_bits; int *fdmdv_bits; -- 2.25.1