freedv 700D rx working using nominal speech output frame size
authordrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 30 Apr 2018 01:40:03 +0000 (01:40 +0000)
committerdrowe67 <drowe67@01035d8c-6547-0410-b346-abe4f91aad63>
Mon, 30 Apr 2018 01:40:03 +0000 (01:40 +0000)
git-svn-id: https://svn.code.sf.net/p/freetel/code@3536 01035d8c-6547-0410-b346-abe4f91aad63

codec2-dev/src/freedv_api.c
codec2-dev/src/freedv_rx.c
codec2-dev/src/freedv_tx.c

index d5dec4aea62e6ebe9f17203661a168d3ce2259d2..962936f4064342c4594426a15117475ebf6706e6 100644 (file)
@@ -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);
+            }
         }
     }
 
index a7cfc11a1bcc4c3bb512930758912be506881e74..e7444ed6ca8964afcef6fc111ee386f8ff6180b7 100644 (file)
@@ -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");
index ee731d21d1eed9aad4fff499447223cd7346e0cf..b180486a93d1bb4bb4c7782d8aab60df8bb53e8d 100644 (file)
@@ -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 */