mirror of
https://github.com/DSheirer/sdrtrunk.git
synced 2026-11-12 16:47:31 -05:00
Initial commit of redesigned internal processing and audio management.
Note: Several of the decoders are currently non-functioning in this commit. If you want the latest functioning codebase, please checkout the commit prior to this one. All decoders will eventually be updated with this new architecture. Currently broken: - Logging and recording - Aux decoders (Fleetsync/MDC/LoJack/Tait) - LTR/Passport decoders Changes in this commit: - Module architecture for decoders and components with central provisioning by the DecoderFactory - Transition from Complex sample stream processing to float buffer processing for improved memory management - Redesigned filter structures - to support buffers and streams - Resolved several memory leak issues - Universal sharing of the thread pool manager - Added centralized audio management with call/user prioritization and new gui with mute/volume controls - Embedded audio metadata for eventual streaming support - Redesigned ProcessingChain to support independent re-use - Added new TrafficChannelManager to handle traffic channel allocations - Traffic Channel pool size and Call timeout available in P25 and MPT1327 configs - Redesigned channel and decoder gui components
This commit is contained in:
@@ -17,14 +17,15 @@ import javax.swing.SwingUtilities;
|
||||
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
import sample.Listener;
|
||||
import sample.SampleType;
|
||||
import sample.complex.ComplexBuffer;
|
||||
import sample.real.RealBuffer;
|
||||
import sample.real.RealSampleListener;
|
||||
import settings.ColorSetting.ColorSettingName;
|
||||
import settings.ColorSettingMenuItem;
|
||||
import settings.Setting;
|
||||
import settings.SettingChangeListener;
|
||||
import settings.SettingsManager;
|
||||
import source.Source.SampleType;
|
||||
import source.tuner.frequency.FrequencyChangeEvent;
|
||||
import source.tuner.frequency.FrequencyChangeEvent.Attribute;
|
||||
import spectrum.converter.DFTResultsConverter;
|
||||
@@ -44,7 +45,7 @@ import dsp.filter.Window.WindowType;
|
||||
|
||||
public class ChannelSpectrumPanel extends JPanel
|
||||
implements ChannelEventListener,
|
||||
RealSampleListener,
|
||||
Listener<RealBuffer>,
|
||||
SettingChangeListener,
|
||||
SpectralDisplayAdjuster
|
||||
{
|
||||
@@ -179,7 +180,7 @@ public class ChannelSpectrumPanel extends JPanel
|
||||
start();
|
||||
}
|
||||
break;
|
||||
case CHANNEL_DELETED:
|
||||
case CHANNEL_DISABLED:
|
||||
if( event.getChannel() == mCurrentChannel )
|
||||
{
|
||||
if( mEnabled.get() )
|
||||
@@ -190,7 +191,7 @@ public class ChannelSpectrumPanel extends JPanel
|
||||
mCurrentChannel = null;
|
||||
}
|
||||
break;
|
||||
case CHANGE_ENABLED:
|
||||
case CHANNEL_ENABLED:
|
||||
if( event.getChannel() == mCurrentChannel &&
|
||||
!event.getChannel().isProcessing() )
|
||||
{
|
||||
@@ -205,7 +206,7 @@ public class ChannelSpectrumPanel extends JPanel
|
||||
{
|
||||
if( mEnabled.get() && mCurrentChannel != null && mCurrentChannel.isProcessing() )
|
||||
{
|
||||
mCurrentChannel.getProcessingChain().addRealListener( (RealSampleListener)this );
|
||||
mCurrentChannel.getProcessingChain().addRealBufferListener( this );
|
||||
mDFTProcessor.start();
|
||||
}
|
||||
}
|
||||
@@ -215,7 +216,7 @@ public class ChannelSpectrumPanel extends JPanel
|
||||
|
||||
if( mCurrentChannel != null && mCurrentChannel.isProcessing() )
|
||||
{
|
||||
mCurrentChannel.getProcessingChain().removeRealListener( (RealSampleListener)this );
|
||||
mCurrentChannel.getProcessingChain().removeRealBufferListener( this );
|
||||
}
|
||||
|
||||
mDFTProcessor.stop();
|
||||
@@ -251,9 +252,12 @@ public class ChannelSpectrumPanel extends JPanel
|
||||
}
|
||||
|
||||
@Override
|
||||
public void receive( float sample )
|
||||
public void receive( RealBuffer buffer )
|
||||
{
|
||||
mDecimatingSampleAssembler.receive( sample );
|
||||
for( float sample: buffer.getSamples() )
|
||||
{
|
||||
mDecimatingSampleAssembler.receive( sample );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -454,7 +458,7 @@ public class ChannelSpectrumPanel extends JPanel
|
||||
public class DecimatingSampleAssembler
|
||||
{
|
||||
private FloatHalfBandFilter mDecimationFilter = new FloatHalfBandFilter(
|
||||
Filters.FIR_HALF_BAND_31T_ONE_EIGHTH_FCO, 1.0002 );
|
||||
Filters.FIR_HALF_BAND_31T_ONE_EIGHTH_FCO, 1.0002f );
|
||||
|
||||
private SampleAssembler mSampleAssembler;
|
||||
|
||||
|
||||
@@ -30,10 +30,10 @@ import org.jtransforms.fft.FloatFFT_1D;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import controller.NamingThreadFactory;
|
||||
import sample.Listener;
|
||||
import sample.SampleType;
|
||||
import sample.complex.ComplexBuffer;
|
||||
import source.Source;
|
||||
import source.Source.SampleType;
|
||||
import source.tuner.frequency.FrequencyChangeEvent;
|
||||
import source.tuner.frequency.FrequencyChangeListener;
|
||||
import spectrum.converter.DFTResultsConverter;
|
||||
@@ -56,8 +56,8 @@ public class DFTProcessor implements Listener<ComplexBuffer>,
|
||||
private ArrayBlockingQueue<ComplexBuffer> mQueue =
|
||||
new ArrayBlockingQueue<ComplexBuffer>( 200 );
|
||||
|
||||
private ScheduledExecutorService mScheduler =
|
||||
Executors.newScheduledThreadPool(1);
|
||||
private ScheduledExecutorService mScheduler = Executors
|
||||
.newScheduledThreadPool( 1, new NamingThreadFactory( "spectrum dft" ) );
|
||||
|
||||
private FFTWidth mFFTWidth = FFTWidth.FFT04096;
|
||||
private FFTWidth mNewFFTWidth = FFTWidth.FFT04096;
|
||||
@@ -129,7 +129,7 @@ public class DFTProcessor implements Listener<ComplexBuffer>,
|
||||
setWindowType( mWindowType );
|
||||
}
|
||||
|
||||
public Source.SampleType getSampleType()
|
||||
public SampleType getSampleType()
|
||||
{
|
||||
return mSampleType;
|
||||
}
|
||||
@@ -177,7 +177,7 @@ public class DFTProcessor implements Listener<ComplexBuffer>,
|
||||
/**
|
||||
* Reset the scheduler
|
||||
*/
|
||||
mScheduler = Executors.newScheduledThreadPool(1);
|
||||
mScheduler = Executors.newScheduledThreadPool( 1, new NamingThreadFactory( "spectrum dft" ) );
|
||||
|
||||
/**
|
||||
* Schedule the DFT to run calculations at a fixed rate
|
||||
@@ -293,16 +293,25 @@ public class DFTProcessor implements Listener<ComplexBuffer>,
|
||||
getNextBuffer();
|
||||
}
|
||||
|
||||
int samplesAvailable = mCurrentBuffer.length - mCurrentBufferPointer;
|
||||
|
||||
while( remaining > 0 && samplesAvailable > 0 )
|
||||
/* If we don't have new samples to use, send the current frame with
|
||||
* the remaining values as zero */
|
||||
if( mCurrentBuffer == null )
|
||||
{
|
||||
currentFrame[ currentFramePointer++ ] =
|
||||
(float)mCurrentBuffer[ mCurrentBufferPointer++ ];
|
||||
|
||||
samplesAvailable--;
|
||||
remaining--;
|
||||
newFloatsToConsumeThisFrame--;
|
||||
remaining = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
int samplesAvailable = mCurrentBuffer.length - mCurrentBufferPointer;
|
||||
|
||||
while( remaining > 0 && samplesAvailable > 0 )
|
||||
{
|
||||
currentFrame[ currentFramePointer++ ] =
|
||||
(float)mCurrentBuffer[ mCurrentBufferPointer++ ];
|
||||
|
||||
samplesAvailable--;
|
||||
remaining--;
|
||||
newFloatsToConsumeThisFrame--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -355,18 +364,25 @@ public class DFTProcessor implements Listener<ComplexBuffer>,
|
||||
{
|
||||
getNextBuffer();
|
||||
}
|
||||
|
||||
int samplesAvailable = mCurrentBuffer.length - mCurrentBufferPointer;
|
||||
|
||||
if( samplesAvailable >= samplesToPurge )
|
||||
|
||||
if( mCurrentBuffer != null )
|
||||
{
|
||||
mCurrentBufferPointer += samplesToPurge;
|
||||
samplesToPurge = 0;
|
||||
int samplesAvailable = mCurrentBuffer.length - mCurrentBufferPointer;
|
||||
|
||||
if( samplesAvailable >= samplesToPurge )
|
||||
{
|
||||
mCurrentBufferPointer += samplesToPurge;
|
||||
samplesToPurge = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
samplesToPurge -= samplesAvailable;
|
||||
mCurrentBufferPointer = mCurrentBuffer.length;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
samplesToPurge -= samplesAvailable;
|
||||
mCurrentBufferPointer = mCurrentBuffer.length;
|
||||
samplesToPurge = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -466,16 +466,20 @@ public class OverlayPanel extends JPanel
|
||||
double yAxis = 0;
|
||||
|
||||
//Draw the system label and adjust the y-axis position
|
||||
String system = channel.hasSystem() ? channel.getSystem().getName() : " ";
|
||||
|
||||
yAxis += drawLabel( graphics,
|
||||
channel.getSystem().getName(),
|
||||
system,
|
||||
this.getFont(),
|
||||
xAxis,
|
||||
yAxis,
|
||||
width );
|
||||
|
||||
//Draw the site label and adjust the y-axis position
|
||||
String site = channel.hasSite() ? channel.getSite().getName() : " ";
|
||||
|
||||
yAxis += drawLabel( graphics,
|
||||
channel.getSite().getName(),
|
||||
site,
|
||||
this.getFont(),
|
||||
xAxis,
|
||||
yAxis,
|
||||
@@ -615,6 +619,7 @@ public class OverlayPanel extends JPanel
|
||||
switch( event.getEvent() )
|
||||
{
|
||||
case CHANNEL_ADDED:
|
||||
case CHANNEL_ENABLED:
|
||||
if( !mChannels.contains( channel ) )
|
||||
{
|
||||
mChannels.add( channel );
|
||||
@@ -630,7 +635,7 @@ public class OverlayPanel extends JPanel
|
||||
mChannels.remove( channel );
|
||||
mVisibleChannels.remove( channel );
|
||||
break;
|
||||
case PROCESSING_STOPPED:
|
||||
case CHANNEL_PROCESSING_STOPPED:
|
||||
if( channel.getChannelType() == ChannelType.TRAFFIC )
|
||||
{
|
||||
mChannels.remove( channel );
|
||||
|
||||
@@ -41,12 +41,14 @@ import javax.swing.JSeparator;
|
||||
import javax.swing.JSplitPane;
|
||||
import javax.swing.SwingUtilities;
|
||||
|
||||
import module.decode.DecoderType;
|
||||
import net.miginfocom.swing.MigLayout;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import sample.Listener;
|
||||
import sample.SampleType;
|
||||
import sample.complex.ComplexBuffer;
|
||||
import settings.ColorSetting;
|
||||
import settings.ColorSetting.ColorSettingName;
|
||||
@@ -54,13 +56,12 @@ import settings.ColorSettingMenuItem;
|
||||
import settings.Setting;
|
||||
import settings.SettingChangeListener;
|
||||
import settings.SettingsManager;
|
||||
import source.Source.SampleType;
|
||||
import source.SourceException;
|
||||
import source.tuner.frequency.FrequencyChangeEvent;
|
||||
import source.tuner.frequency.FrequencyChangeListener;
|
||||
import source.tuner.frequency.FrequencyChangeEvent.Attribute;
|
||||
import source.tuner.Tuner;
|
||||
import source.tuner.TunerSelectionListener;
|
||||
import source.tuner.frequency.FrequencyChangeEvent;
|
||||
import source.tuner.frequency.FrequencyChangeEvent.Attribute;
|
||||
import source.tuner.frequency.FrequencyChangeListener;
|
||||
import spectrum.OverlayPanel.ChannelDisplay;
|
||||
import spectrum.converter.ComplexDecibelConverter;
|
||||
import spectrum.converter.DFTResultsConverter;
|
||||
@@ -76,7 +77,6 @@ import controller.ResourceManager;
|
||||
import controller.channel.Channel;
|
||||
import controller.channel.ChannelEvent;
|
||||
import controller.channel.ChannelEventListener;
|
||||
import decode.DecoderType;
|
||||
import dsp.filter.Window.WindowType;
|
||||
|
||||
/**
|
||||
@@ -515,15 +515,15 @@ public class SpectralDisplayPanel extends JPanel
|
||||
ArrayList<Channel> channels =
|
||||
mOverlayPanel.getChannelsAtFrequency( frequency );
|
||||
|
||||
for( Channel channel: channels )
|
||||
{
|
||||
JMenu menu = channel.getContextMenu();
|
||||
|
||||
if( menu != null )
|
||||
{
|
||||
contextMenu.add( menu );
|
||||
}
|
||||
}
|
||||
// for( Channel channel: channels )
|
||||
// {
|
||||
// JMenu menu = channel.getContextMenu();
|
||||
//
|
||||
// if( menu != null )
|
||||
// {
|
||||
// contextMenu.add( menu );
|
||||
// }
|
||||
// }
|
||||
|
||||
if( !channels.isEmpty() )
|
||||
{
|
||||
@@ -537,7 +537,7 @@ public class SpectralDisplayPanel extends JPanel
|
||||
|
||||
JMenu decoderMenu = new JMenu( "Add Decoder" );
|
||||
|
||||
for( DecoderType type: DecoderType.getAvailableDecoders() )
|
||||
for( DecoderType type: DecoderType.getPrimaryDecoders() )
|
||||
{
|
||||
decoderMenu.add( new DecoderItem( mResourceManager,
|
||||
frequency,
|
||||
|
||||
Reference in New Issue
Block a user