mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-14 01:27:34 -05:00
Restructures transfer buffer handling to better handle shutdown and
canceling of transfers across multiple threads.
This commit is contained in:
@@ -1475,45 +1475,40 @@ public abstract class RTL2832TunerController extends TunerController
|
|||||||
@Override
|
@Override
|
||||||
public void processTransfer( Transfer transfer )
|
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() )
|
switch( transfer.status() )
|
||||||
{
|
{
|
||||||
case LibUsb.TRANSFER_COMPLETED:
|
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() )
|
if( isRunning() )
|
||||||
{
|
{
|
||||||
int result = LibUsb.submitTransfer( transfer );
|
int result = LibUsb.submitTransfer( transfer );
|
||||||
|
|
||||||
if( result != LibUsb.SUCCESS )
|
if( result != LibUsb.SUCCESS )
|
||||||
{
|
{
|
||||||
|
error = true;
|
||||||
mLog.error( "couldn't resubmit buffer transfer to tuner" );
|
mLog.error( "couldn't resubmit buffer transfer to tuner" );
|
||||||
LibUsb.freeTransfer( transfer );
|
|
||||||
mTransfers.remove( transfer );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if( error )
|
||||||
{
|
{
|
||||||
LibUsb.freeTransfer( transfer );
|
LibUsb.freeTransfer( transfer );
|
||||||
mTransfers.remove( transfer );
|
mTransfers.remove( transfer );
|
||||||
@@ -1542,7 +1537,10 @@ public abstract class RTL2832TunerController extends TunerController
|
|||||||
}
|
}
|
||||||
catch( IllegalStateException ise )
|
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 [" +
|
mLog.error( "error handling usb events during cancel [" +
|
||||||
LibUsb.errorName( result ) + "]" );
|
LibUsb.errorName( result ) + "]" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mLog.debug( "RTL2832 Stopped" );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user