mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-15 01:57:39 -05:00
Issue #59 - more changes to improve handling of transfer buffers between
tuner start/stop iterations.
This commit is contained in:
@@ -1341,21 +1341,24 @@ public abstract class RTL2832TunerController extends TunerController
|
|||||||
*/
|
*/
|
||||||
public void addListener( Listener<ComplexBuffer> listener )
|
public void addListener( Listener<ComplexBuffer> listener )
|
||||||
{
|
{
|
||||||
mComplexBufferBroadcaster.addListener( listener );
|
synchronized( mComplexBufferBroadcaster )
|
||||||
|
{
|
||||||
|
mComplexBufferBroadcaster.addListener( listener );
|
||||||
|
|
||||||
if( mBufferProcessor == null )
|
if( mBufferProcessor == null )
|
||||||
{
|
{
|
||||||
mBufferProcessor = new BufferProcessor( mThreadPoolManager );
|
mBufferProcessor = new BufferProcessor( mThreadPoolManager );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !mBufferProcessor.isRunning() )
|
if( !mBufferProcessor.isRunning() )
|
||||||
{
|
{
|
||||||
Thread thread = new Thread( mBufferProcessor );
|
Thread thread = new Thread( mBufferProcessor );
|
||||||
thread.setDaemon( true );
|
thread.setDaemon( true );
|
||||||
thread.setName( "RTL2832 Sample Processor" );
|
thread.setName( "RTL2832 Sample Processor" );
|
||||||
|
|
||||||
thread.start();
|
thread.start();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1364,12 +1367,15 @@ public abstract class RTL2832TunerController extends TunerController
|
|||||||
*/
|
*/
|
||||||
public void removeListener( Listener<ComplexBuffer> listener )
|
public void removeListener( Listener<ComplexBuffer> listener )
|
||||||
{
|
{
|
||||||
mComplexBufferBroadcaster.removeListener( listener );
|
synchronized( mComplexBufferBroadcaster )
|
||||||
|
{
|
||||||
|
mComplexBufferBroadcaster.removeListener( listener );
|
||||||
|
|
||||||
if( !mComplexBufferBroadcaster.hasListeners() )
|
if( !mComplexBufferBroadcaster.hasListeners() )
|
||||||
{
|
{
|
||||||
mBufferProcessor.stop();
|
mBufferProcessor.stop();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1479,6 +1485,10 @@ public abstract class RTL2832TunerController extends TunerController
|
|||||||
mLibUsbHandlerStatus.rewind();
|
mLibUsbHandlerStatus.rewind();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
mLog.error( "Couldn't start buffer processor - already running!" );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1531,30 +1541,8 @@ public abstract class RTL2832TunerController extends TunerController
|
|||||||
mFilledBuffers.add( data );
|
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" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if( error )
|
|
||||||
{
|
|
||||||
LibUsb.freeTransfer( transfer );
|
|
||||||
mTransfers.remove( transfer );
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case LibUsb.TRANSFER_CANCELLED:
|
case LibUsb.TRANSFER_CANCELLED:
|
||||||
/* free the transfer and remove it */
|
|
||||||
LibUsb.freeTransfer( transfer );
|
|
||||||
mTransfers.remove( transfer );
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* unexpected error */
|
/* unexpected error */
|
||||||
@@ -1562,39 +1550,10 @@ public abstract class RTL2832TunerController extends TunerController
|
|||||||
getTransferStatus( transfer.status() ) +
|
getTransferStatus( transfer.status() ) +
|
||||||
"] transferred actual: " + transfer.actualLength() );
|
"] transferred actual: " + transfer.actualLength() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mAvailableTransfers.add( transfer );
|
||||||
}
|
}
|
||||||
|
|
||||||
private void cancel()
|
|
||||||
{
|
|
||||||
for( Transfer transfer: mTransfers )
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
LibUsb.cancelTransfer( transfer );
|
|
||||||
}
|
|
||||||
catch( IllegalStateException ise )
|
|
||||||
{
|
|
||||||
//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.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ByteBuffer completed = ByteBuffer.allocateDirect( 4 );
|
|
||||||
|
|
||||||
int result = LibUsb.handleEventsTimeoutCompleted(
|
|
||||||
null, TIMEOUT_US, completed.asIntBuffer() );
|
|
||||||
|
|
||||||
if( result != LibUsb.SUCCESS )
|
|
||||||
{
|
|
||||||
mLog.error( "error handling usb events during cancel [" +
|
|
||||||
LibUsb.errorName( result ) + "]" );
|
|
||||||
}
|
|
||||||
|
|
||||||
mLog.debug( "RTL2832 Stopped" );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prepares (allocates) a set of transfer buffers for use in
|
* Prepares (allocates) a set of transfer buffers for use in
|
||||||
* transferring data from the tuner via the bulk interface
|
* transferring data from the tuner via the bulk interface
|
||||||
@@ -1615,18 +1574,15 @@ public abstract class RTL2832TunerController extends TunerController
|
|||||||
LibUsb.ERROR_NO_MEM );
|
LibUsb.ERROR_NO_MEM );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final ByteBuffer buffer =
|
||||||
|
ByteBuffer.allocateDirect( mBufferSize );
|
||||||
|
|
||||||
|
LibUsb.fillBulkTransfer( transfer, mDeviceHandle, BULK_ENDPOINT_IN,
|
||||||
|
buffer, BufferProcessor.this, "Buffer", TIMEOUT_US );
|
||||||
|
|
||||||
mAvailableTransfers.add( transfer );
|
mAvailableTransfers.add( transfer );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for( Transfer transfer: mAvailableTransfers )
|
|
||||||
{
|
|
||||||
final ByteBuffer buffer =
|
|
||||||
ByteBuffer.allocateDirect( mBufferSize );
|
|
||||||
|
|
||||||
LibUsb.fillBulkTransfer( transfer, mDeviceHandle, BULK_ENDPOINT_IN,
|
|
||||||
buffer, BufferProcessor.this, "Buffer", TIMEOUT_US );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user