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);
}
// 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;
}
}
-
+//
+// 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;
+ }
}
/*