From 22d3871d0b287c140c869e3b44339e5925443dfe Mon Sep 17 00:00:00 2001 From: denny Date: Fri, 26 Feb 2016 13:28:59 -0500 Subject: [PATCH] Restructures transfer buffer handling to better handle shutdown and canceling of transfers across multiple threads. --- .../tuner/rtl/RTL2832TunerController.java | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/source/tuner/rtl/RTL2832TunerController.java b/src/source/tuner/rtl/RTL2832TunerController.java index 8729e1a9..77ed6620 100644 --- a/src/source/tuner/rtl/RTL2832TunerController.java +++ b/src/source/tuner/rtl/RTL2832TunerController.java @@ -1475,45 +1475,40 @@ public abstract class RTL2832TunerController extends TunerController @Override public void processTransfer( Transfer transfer ) { - if( transfer.status() == LibUsb.TRANSFER_COMPLETED ) - { - ByteBuffer buffer = transfer.buffer(); - - byte[] data = new byte[ transfer.actualLength() ]; - - buffer.get( data ); - - buffer.rewind(); - - if( mRunning.get() ) - { - mFilledBuffers.add( data ); - } - - mSampleCounter.addAndGet( transfer.actualLength() ); - - if( !isRunning() ) - { - LibUsb.cancelTransfer( transfer ); - } - } - switch( transfer.status() ) { case LibUsb.TRANSFER_COMPLETED: - /* resubmit the transfer */ + case LibUsb.TRANSFER_STALL: + if( transfer.actualLength() > 0 ) + { + ByteBuffer buffer = transfer.buffer(); + + byte[] data = new byte[ transfer.actualLength() ]; + + buffer.get( data ); + + buffer.rewind(); + + if( isRunning() ) + { + mFilledBuffers.add( data ); + } + } + + boolean error = false; + if( isRunning() ) { int result = LibUsb.submitTransfer( transfer ); if( result != LibUsb.SUCCESS ) { + error = true; mLog.error( "couldn't resubmit buffer transfer to tuner" ); - LibUsb.freeTransfer( transfer ); - mTransfers.remove( transfer ); } } - else + + if( error ) { LibUsb.freeTransfer( transfer ); mTransfers.remove( transfer ); @@ -1542,7 +1537,10 @@ public abstract class RTL2832TunerController extends TunerController } catch( IllegalStateException ise ) { - //Do nothing, the transfer pointer wasn't initialized + //Do nothing. We get this exception if the transfer is not + //currently submitted for transfer and is likely being + //handled as a completed transfer. We'll rely on the mRunning + //variable to prevent this transfer from being resubmitted. } } @@ -1556,6 +1554,8 @@ public abstract class RTL2832TunerController extends TunerController mLog.error( "error handling usb events during cancel [" + LibUsb.errorName( result ) + "]" ); } + + mLog.debug( "RTL2832 Stopped" ); } /**