Resolves #381. Updates USB transfer processor to use native transfer

buffer sizes that adapt to the selected sample rate.
This commit is contained in:
Denny
2018-08-03 07:27:58 -04:00
parent 3f0c13096a
commit 2718367259
3 changed files with 42 additions and 3 deletions

View File

@@ -52,7 +52,8 @@ public abstract class RTL2832TunerController extends USBTunerController
public final static int TWO_TO_22_POWER = 4194304;
public final static int USB_TRANSFER_BUFFER_SIZE = 131072;
public final static int USB_TRANSFER_BUFFER_SIZE_HIGH_SAMPLE_RATE = 131072;
public final static int USB_TRANSFER_BUFFER_SIZE_LOW_SAMPLE_RATE = 32768;
public final static byte USB_INTERFACE = (byte) 0x0;
public final static byte CONTROL_ENDPOINT_IN = (byte) (LibUsb.ENDPOINT_IN | LibUsb.REQUEST_TYPE_VENDOR);
public final static byte CONTROL_ENDPOINT_OUT = (byte) (LibUsb.ENDPOINT_OUT | LibUsb.REQUEST_TYPE_VENDOR);
@@ -155,7 +156,7 @@ public abstract class RTL2832TunerController extends USBTunerController
String deviceName = getTunerType().getLabel() + " " + getUniqueID();
mUSBTransferProcessor = new RTL2832USBTransferProcessor(deviceName, mDeviceHandle, mNativeBufferConverter,
USB_TRANSFER_BUFFER_SIZE);
USB_TRANSFER_BUFFER_SIZE_HIGH_SAMPLE_RATE);
}
@Override
@@ -985,6 +986,18 @@ public abstract class RTL2832TunerController extends USBTunerController
mSampleRate = sampleRate;
mFrequencyController.setSampleRate(sampleRate.getRate());
if(mUSBTransferProcessor != null)
{
if(sampleRate.getRate() > 300000)
{
mUSBTransferProcessor.setBufferSize(USB_TRANSFER_BUFFER_SIZE_HIGH_SAMPLE_RATE);
}
else
{
mUSBTransferProcessor.setBufferSize(USB_TRANSFER_BUFFER_SIZE_LOW_SAMPLE_RATE);
}
}
}
public void setSampleRateFrequencyCorrection(int ppm) throws SourceException

View File

@@ -253,7 +253,7 @@ public class E4KTunerController extends RTL2832TunerController
String deviceName = getTunerType().getLabel() + " " + getUniqueID();
mUSBTransferProcessor = new RTL2832USBTransferProcessor(deviceName, mDeviceHandle, mNativeBufferConverter,
USB_TRANSFER_BUFFER_SIZE);
USB_TRANSFER_BUFFER_SIZE_HIGH_SAMPLE_RATE);
}
@Override

View File

@@ -86,6 +86,32 @@ public class USBTransferProcessor implements TransferCallback
mBufferSize = bufferSize;
}
/**
* Modifies the usb transfer buffer size used for transfering native byte buffers from the
* USB device. Note: changing the buffer size while the transfer processor is running causes
* the transfer to stop momentarily while the existing buffers are destroyed and new buffers
* with the correct size are recreated.
*
* Note: this method is not thread safe. Ensure that no other threads invoke stop() or start()
* while a buffer size change is in progress.
*
* @param bufferSize to use for native usb buffer transfers
*/
public void setBufferSize(int bufferSize)
{
if(bufferSize % 2 == 1)
{
throw new IllegalArgumentException("Buffer size must be a multiple of 2 for complex samples");
}
if(mBufferSize != bufferSize)
{
stop();
mBufferSize = bufferSize;
start();
}
}
/**
* Start USB transfer buffer processing. Subsequent calls to this method after started will be ignored.
*/