From 82a1062670dd9e20bfcfaadfb4cc05276b1431ee Mon Sep 17 00:00:00 2001 From: drowe67 Date: Mon, 30 Apr 2018 01:40:03 +0000 Subject: [PATCH] freedv 700D rx working using nominal speech output frame size git-svn-id: https://svn.code.sf.net/p/freetel/code@3536 01035d8c-6547-0410-b346-abe4f91aad63 --- codec2-dev/src/freedv_api.c | 32 ++++++++++++++++++++++++++++---- codec2-dev/src/freedv_rx.c | 2 +- codec2-dev/src/freedv_tx.c | 2 +- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/codec2-dev/src/freedv_api.c b/codec2-dev/src/freedv_api.c index d5dec4ae..962936f4 100644 --- a/codec2-dev/src/freedv_api.c +++ b/codec2-dev/src/freedv_api.c @@ -1857,18 +1857,42 @@ int freedv_comprx(struct freedv *f, short speech_out[], COMP demod_in[]) { #endif if (valid == 0) { + /* squelch */ + for (i = 0; i < nout; i++) speech_out[i] = 0; } else if (valid < 0) { + /* we havent gor sync so play audio from radio. This might + not work for all modes due to nin bouncing about */ for (i = 0; i < nout; i++) speech_out[i] = demod_in[i].real; } else { - int frames = f->n_codec_bits / bits_per_codec_frame; - for (i = 0; i < frames; i++) { - codec2_decode(f->codec2, speech_out, f->packed_codec_bits + i * bytes_per_codec_frame); - speech_out += codec2_samples_per_frame(f->codec2); + /* decoded audio to play */ + + if (f->mode == FREEDV_MODE_700D) { + int data_bits_per_frame = f->ldpc->data_bits_per_frame; + int frames = data_bits_per_frame/bits_per_codec_frame; + + nout = 0; + if (f->modem_frame_count_rx < f->interleave_frames) { + nout = f->n_speech_samples; + //fprintf(stderr, "modem_frame_count_rx: %d nout: %d\n", f->modem_frame_count_rx, nout); + for (i = 0; i < frames; i++) { + codec2_decode(f->codec2, speech_out, f->packed_codec_bits + (i + frames*f->modem_frame_count_rx)* bytes_per_codec_frame); + speech_out += codec2_samples_per_frame(f->codec2); + } + f->modem_frame_count_rx++; + } + + } else { + int frames = f->n_codec_bits / bits_per_codec_frame; + //fprintf(stderr, "frames: %d\n", frames); + for (i = 0; i < frames; i++) { + codec2_decode(f->codec2, speech_out, f->packed_codec_bits + i * bytes_per_codec_frame); + speech_out += codec2_samples_per_frame(f->codec2); + } } } diff --git a/codec2-dev/src/freedv_rx.c b/codec2-dev/src/freedv_rx.c index a7cfc11a..e7444ed6 100644 --- a/codec2-dev/src/freedv_rx.c +++ b/codec2-dev/src/freedv_rx.c @@ -182,7 +182,7 @@ int main(int argc, char *argv[]) { freedv_set_snr_squelch_thresh(freedv, -100.0); freedv_set_squelch_en(freedv, 0); - short speech_out[freedv_get_n_speech_samples(freedv)*interleave_frames]; + short speech_out[freedv_get_n_speech_samples(freedv)]; short demod_in[freedv_get_n_max_modem_samples(freedv)]; ftxt = fopen("freedv_rx_log.txt","wt"); diff --git a/codec2-dev/src/freedv_tx.c b/codec2-dev/src/freedv_tx.c index ee731d21..b180486a 100644 --- a/codec2-dev/src/freedv_tx.c +++ b/codec2-dev/src/freedv_tx.c @@ -190,7 +190,7 @@ int main(int argc, char *argv[]) { assert(speech_in != NULL); mod_out = (short*)malloc(sizeof(short)*n_nom_modem_samples); assert(mod_out != NULL); - fprintf(stderr, "n_speech_samples: %d n_nom_modem_samples: %d\n", n_speech_samples, n_nom_modem_samples); + //fprintf(stderr, "n_speech_samples: %d n_nom_modem_samples: %d\n", n_speech_samples, n_nom_modem_samples); /* set up callback for txt msg chars */ -- 2.25.1