]> git.rkrishnan.org Git - pihpsdr.git/commitdiff
fixed "TX heartbeat" problem in old_protocol
authorc vw <dl1ycf@darc.de>
Wed, 11 Dec 2019 18:11:09 +0000 (19:11 +0100)
committerc vw <dl1ycf@darc.de>
Wed, 11 Dec 2019 18:11:09 +0000 (19:11 +0100)
old_protocol.c

index 188dfd552569bd805da5d77b861cceac9a77e026..4c05757e6f186f8b29580fe36d7cf780b3e98999 100644 (file)
@@ -252,6 +252,11 @@ static unsigned char ep6_inbuffer[EP6_BUFFER_SIZE];
 static unsigned char usb_buffer_block = 0;
 #endif
 
+#define MICRINGLEN 2048
+float mic_ring_buffer[MICRINGLEN];
+int   mic_ring_read_pt=0;
+int   mic_ring_write_pt=0;
+
 void old_protocol_stop() {
   metis_start_stop(0);
 }
@@ -980,24 +985,43 @@ static void process_ozy_input_buffer(unsigned char  *buffer) {
 
       // TX without PURESIGNAL: receivers are shut down -- do nothing
 
+      //
+      // Process mic samples. Take them from buffer or from
+      // "local microphone" ring buffer
+      //
       mic_sample  = (short)(buffer[b++]<<8);
       mic_sample |= (short)(buffer[b++]&0xFF);
-      if(!transmitter->local_microphone) {
-        mic_samples++;
-        if(mic_samples>=mic_sample_divisor) { // reduce to 48000
+
+      mic_samples++;
+      if(mic_samples>=mic_sample_divisor) { // reduce to 48000
+        if (!transmitter->local_microphone) {
+          // take mic sample from SDR
           fsample = (float) mic_sample * 0.00003051;
-#ifdef FREEDV
-          if(active_receiver->freedv) {
-            add_freedv_mic_sample(transmitter,fsample);
+        } else {
+          // take mic sample from local mic buffer
+          if (mic_ring_read_pt == mic_ring_write_pt) {
+            // nothing in buffer: insert silence
+            fsample=0.0;
           } else {
-#endif
-            add_mic_sample(transmitter,fsample);
-#ifdef FREEDV
+            int newpt = mic_ring_read_pt+1;
+            if (newpt == MICRINGLEN) newpt=0;
+            fsample=mic_ring_buffer[mic_ring_read_pt];
+            // atomic update of read pointer
+            mic_ring_read_pt=newpt;
           }
+        }
+#ifdef FREEDV
+        if(active_receiver->freedv) {
+          add_freedv_mic_sample(transmitter,fsample);
+        } else {
 #endif
-          mic_samples=0;
+          add_mic_sample(transmitter,fsample);
+#ifdef FREEDV
         }
+#endif
+        mic_samples=0;
       }
+
     }
   } else {
     time_t t;
@@ -1072,17 +1096,19 @@ void old_protocol_iq_samples(int isample,int qsample) {
   }
 }
 
-
+//
+// This function now simply puts the mic sample
+// into a ring buffer
+//
 void old_protocol_process_local_mic(float sample) {
-#ifdef FREEDV
-  if(active_receiver->freedv) {
-    add_freedv_mic_sample(transmitter,sample);
-  } else {
-#endif
-    add_mic_sample(transmitter,sample);
-#ifdef FREEDV
-  }
-#endif
+    int newpt;  // value of write pointer after a successful write
+    newpt=mic_ring_write_pt +1;
+    if (newpt == MICRINGLEN) newpt=0;
+    if (newpt != mic_ring_read_pt) {
+      // buffer space available, do the write
+      mic_ring_buffer[mic_ring_write_pt]=sample;
+      mic_ring_write_pt=newpt;
+    }
 }
 
 /*