From 0974087d7f2600f4700063f727515d14113c4068 Mon Sep 17 00:00:00 2001 From: c vw Date: Wed, 11 Dec 2019 19:11:09 +0100 Subject: [PATCH] fixed "TX heartbeat" problem in old_protocol --- old_protocol.c | 66 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 20 deletions(-) diff --git a/old_protocol.c b/old_protocol.c index 188dfd5..4c05757 100644 --- a/old_protocol.c +++ b/old_protocol.c @@ -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; + } } /* -- 2.45.2