From 43fc326f9350ba4bf1562d29b44bcf7730924a4d Mon Sep 17 00:00:00 2001 From: Denny Date: Wed, 12 Sep 2018 06:19:11 -0400 Subject: [PATCH] Resolves #405 Adds 500 ms delay to initial registering for samples from all tuners to feed the spectral display/waterfall. The existing approach of immediately registering for samples was causing the airspy tuner to lockup aperiodically. Investigation via debugger didn't show any application thread locks ... usb master processor was continuing to service libusb timeouts. Unable to debug internal airspy processes. Adding the delay to startup seems to be a usable solution. --- .../github/dsheirer/source/tuner/TunerManager.java | 4 ++++ .../github/dsheirer/source/tuner/TunerModel.java | 14 +++++++++++++- .../source/tuner/usb/USBMasterProcessor.java | 10 +++++++++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/java/io/github/dsheirer/source/tuner/TunerManager.java b/src/main/java/io/github/dsheirer/source/tuner/TunerManager.java index 6261f44a..64c8e327 100644 --- a/src/main/java/io/github/dsheirer/source/tuner/TunerManager.java +++ b/src/main/java/io/github/dsheirer/source/tuner/TunerManager.java @@ -71,6 +71,10 @@ public class TunerManager */ public void dispose() { + mLog.info("Shutting down LibUsb timeout processor ..."); + + LIBUSB_TRANSFER_PROCESSOR.shutdown(); + mLog.info("Shutting down LibUsb ..."); try { diff --git a/src/main/java/io/github/dsheirer/source/tuner/TunerModel.java b/src/main/java/io/github/dsheirer/source/tuner/TunerModel.java index 793c02e9..927afbe8 100644 --- a/src/main/java/io/github/dsheirer/source/tuner/TunerModel.java +++ b/src/main/java/io/github/dsheirer/source/tuner/TunerModel.java @@ -27,6 +27,7 @@ import io.github.dsheirer.source.tuner.channel.TunerChannelSource; import io.github.dsheirer.source.tuner.configuration.TunerConfiguration; import io.github.dsheirer.source.tuner.configuration.TunerConfigurationModel; import io.github.dsheirer.spectrum.SpectralDisplayPanel; +import io.github.dsheirer.util.ThreadPool; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,6 +36,7 @@ import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.concurrent.TimeUnit; public class TunerModel extends AbstractTableModel implements Listener { @@ -202,7 +204,17 @@ public class TunerModel extends AbstractTableModel implements Listener 0) { - broadcast(new TunerEvent(mTuners.get(0), Event.REQUEST_MAIN_SPECTRAL_DISPLAY)); + //Hack: the airspy tuner would lockup aperiodically and refuse to produce + //transfer buffers ... delaying registering for buffers for 500 ms seems + //to allow the airspy to stabilize before we start asking for samples. + ThreadPool.SCHEDULED.schedule(new Runnable() + { + @Override + public void run() + { + broadcast(new TunerEvent(mTuners.get(0), Event.REQUEST_MAIN_SPECTRAL_DISPLAY)); + } + }, 500, TimeUnit.MILLISECONDS); } else { diff --git a/src/main/java/io/github/dsheirer/source/tuner/usb/USBMasterProcessor.java b/src/main/java/io/github/dsheirer/source/tuner/usb/USBMasterProcessor.java index d13e4a9b..91b3cf9a 100644 --- a/src/main/java/io/github/dsheirer/source/tuner/usb/USBMasterProcessor.java +++ b/src/main/java/io/github/dsheirer/source/tuner/usb/USBMasterProcessor.java @@ -81,7 +81,7 @@ public class USBMasterProcessor if(mRunning.compareAndSet(false, true)) { //Set periodicity to an odd multiple to avoid contention with transfer buffer receivers - mProcessorFuture = ThreadPool.SCHEDULED.scheduleAtFixedRate(mProcessor, 0L, 5L, TimeUnit.MILLISECONDS); + mProcessorFuture = ThreadPool.SCHEDULED.scheduleAtFixedRate(mProcessor, 0L, 9L, TimeUnit.MILLISECONDS); } } @@ -100,6 +100,14 @@ public class USBMasterProcessor } } + /** + * Stops the libusb timeout processor and prepares for shutdown. + */ + public void shutdown() + { + stop(); + } + /** * Runnable to invoke LibUSB timeout handler. All downstream completed transfer processing will occur on this * thread instance.