+ {
+ @Override
+ public void receive( FrequencyChangeEvent event )
+ {
+ switch( event.getEvent() )
+ {
+ case NOTIFICATION_CHANNEL_FREQUENCY_CORRECTION_CHANGE:
+ mFrequencyCorrection = event.getValue().intValue();
+
+ //Reset internal frequency tracking
+ mCoarseFrequencyCorrection = 0.0f;
+ mFineFrequencyCorrection = 0.0f;
+ break;
+ case NOTIFICATION_FREQUENCY_CORRECTION_CHANGE:
+ case NOTIFICATION_SAMPLE_RATE_CHANGE:
+ mResetFrequencyTracker = true;
+ break;
+ default:
+ break;
+ }
+ }
+ }
}
diff --git a/src/module/decode/p25/P25DecodeEditor.java b/src/module/decode/p25/P25DecodeEditor.java
index e3c7052d..c87d1e7c 100644
--- a/src/module/decode/p25/P25DecodeEditor.java
+++ b/src/module/decode/p25/P25DecodeEditor.java
@@ -34,8 +34,8 @@ import org.slf4j.LoggerFactory;
import source.SourceEditor;
import source.tuner.TunerEditor;
-import controller.Editor;
-import controller.channel.ChannelValidationException;
+import controller.channel.ChannelConfigurationEditor;
+import controller.channel.ConfigurationValidationException;
public class P25DecodeEditor extends DecodeEditor
{
@@ -101,29 +101,29 @@ public class P25DecodeEditor extends DecodeEditor
add( new JLabel( "Ignore Data Calls" ) );
add( mIgnoreDataCalls, "wrap,grow" );
- reset();
+// reset();
}
- /**
- * Enforce source=tuner for CQPSK modulation
- */
- @Override
- public void validate( Editor editor ) throws ChannelValidationException
- {
- if( editor instanceof SourceEditor &&
- ((DecodeConfigP25Phase1)mConfig).getModulation() == Modulation.CQPSK )
- {
- if( !( editor instanceof TunerEditor ) )
- {
- throw new ChannelValidationException(
- "LSM Simulcast
"
- + "P25 LSM Simulcast decoder can only be used with "
- + "a tuner source. Please change the Source to use a tuner"
- + " or change the P25 Decoder to C4FM modulation" );
-
- }
- }
- }
+// /**
+// * Enforce source=tuner for CQPSK modulation
+// */
+// @Override
+// public void validate( ChannelConfigurationEditor editor ) throws ConfigurationValidationException
+// {
+// if( editor instanceof SourceEditor &&
+// ((DecodeConfigP25Phase1)mConfig).getModulation() == Modulation.CQPSK )
+// {
+// if( !( editor instanceof TunerEditor ) )
+// {
+// throw new ConfigurationValidationException(
+// "
LSM Simulcast
"
+// + "P25 LSM Simulcast decoder can only be used with "
+// + "a tuner source. Please change the Source to use a tuner"
+// + " or change the P25 Decoder to C4FM modulation" );
+//
+// }
+// }
+// }
@Override
public void save()
@@ -135,13 +135,13 @@ public class P25DecodeEditor extends DecodeEditor
config.setTrafficChannelPoolSize( mTrafficChannelPoolSize.getValue() );
}
- @Override
- public void reset()
- {
- DecodeConfigP25Phase1 config = (DecodeConfigP25Phase1)mConfig;
-
- mComboModulation.setSelectedItem( config.getModulation() );
- mIgnoreDataCalls.setSelected( config.getIgnoreDataCalls() );
- mTrafficChannelPoolSize.setValue( config.getTrafficChannelPoolSize() );
- }
+// @Override
+// public void reset()
+// {
+// DecodeConfigP25Phase1 config = (DecodeConfigP25Phase1)mConfig;
+//
+// mComboModulation.setSelectedItem( config.getModulation() );
+// mIgnoreDataCalls.setSelected( config.getIgnoreDataCalls() );
+// mTrafficChannelPoolSize.setValue( config.getTrafficChannelPoolSize() );
+// }
}
diff --git a/src/module/decode/p25/P25Decoder.java b/src/module/decode/p25/P25Decoder.java
index 674b00b9..ca46e81b 100644
--- a/src/module/decode/p25/P25Decoder.java
+++ b/src/module/decode/p25/P25Decoder.java
@@ -3,11 +3,9 @@ package module.decode.p25;
import instrument.Instrumentable;
import module.decode.Decoder;
import module.decode.DecoderType;
-import source.tuner.frequency.IFrequencyCorrectionController;
import alias.AliasList;
-public abstract class P25Decoder extends Decoder
- implements IFrequencyCorrectionController, Instrumentable
+public abstract class P25Decoder extends Decoder implements Instrumentable
{
private P25MessageProcessor mMessageProcessor;
diff --git a/src/module/decode/p25/P25_C4FMDecoder.java b/src/module/decode/p25/P25_C4FMDecoder.java
index c4fabf0a..3bae443d 100644
--- a/src/module/decode/p25/P25_C4FMDecoder.java
+++ b/src/module/decode/p25/P25_C4FMDecoder.java
@@ -24,22 +24,24 @@ import instrument.tap.stream.FloatBufferTap;
import instrument.tap.stream.FloatTap;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sample.Listener;
-import sample.real.IRealBufferListener;
+import sample.real.IFilteredRealBufferListener;
import sample.real.RealBuffer;
-import source.tuner.frequency.FrequencyCorrectionControl;
+import source.tuner.frequency.FrequencyChangeEvent;
+import source.tuner.frequency.IFrequencyChangeListener;
+import source.tuner.frequency.IFrequencyChangeProvider;
import alias.AliasList;
import dsp.filter.FilterFactory;
import dsp.filter.Window.WindowType;
import dsp.filter.fir.real.RealFIRFilter_RB_RB;
-public class P25_C4FMDecoder extends P25Decoder implements IRealBufferListener
+public class P25_C4FMDecoder extends P25Decoder
+ implements IFrequencyChangeListener, IFrequencyChangeProvider,IFilteredRealBufferListener
{
private final static Logger mLog = LoggerFactory.getLogger( P25_C4FMDecoder.class );
@@ -48,11 +50,8 @@ public class P25_C4FMDecoder extends P25Decoder implements IRealBufferListener
private static final String INSTRUMENT_C4FM_SYMBOL_FILTER_OUTPUT = "Tap Point: Symbol Filter Output";
private static final String INSTRUMENT_C4FM_SLICER_OUTPUT = "Tap Point: C4FM Slicer Output";
- private final static int MAXIMUM_FREQUENCY_CORRECTION = 3000; //Hertz, +/-
-
private List mAvailableTaps;
private RealFIRFilter_RB_RB mC4FMPreFilter;
- private FrequencyCorrectionControl mFrequencyCorrectionControl;
private C4FMSymbolFilter mSymbolFilter;
private C4FMSlicer mC4FMSlicer;
private P25MessageFramer mMessageFramer;
@@ -70,23 +69,18 @@ public class P25_C4FMDecoder extends P25Decoder implements IRealBufferListener
* infrastructure and subscriber identities that will be included in each
* decoded message
*/
- public P25_C4FMDecoder( AliasList aliasList )
+ public P25_C4FMDecoder( AliasList aliasList, int frequencyCorrectionMaximum )
{
super( aliasList );
/* Filter demodulated sample buffers */
float[] filter = FilterFactory.getLowPass( 48000, 2500, 4000, 80, WindowType.HANNING, true );
- mLog.debug( "Demod Filter tap count:" + filter.length + " coefficients:" + Arrays.toString( filter ) );
+// mLog.debug( "Demod Filter tap count:" + filter.length + " coefficients:" + Arrays.toString( filter ) );
mC4FMPreFilter = new RealFIRFilter_RB_RB( filter, 1.0f );
- /* Issue tuned frequency correction commands, remotely controlled by the
- * downstream symbol filter */
- mFrequencyCorrectionControl = new FrequencyCorrectionControl(
- MAXIMUM_FREQUENCY_CORRECTION );
-
/* Shape gain and frequency offsets to optimize sample stream */
- mSymbolFilter = new C4FMSymbolFilter( mFrequencyCorrectionControl );
+ mSymbolFilter = new C4FMSymbolFilter( frequencyCorrectionMaximum );
mC4FMPreFilter.setListener( mSymbolFilter );
/* Convert samples to symbols */
@@ -109,9 +103,6 @@ public class P25_C4FMDecoder extends P25Decoder implements IRealBufferListener
mC4FMPreFilter.dispose();
mC4FMPreFilter = null;
- mFrequencyCorrectionControl.dispose();
- mFrequencyCorrectionControl = null;
-
mSymbolFilter.dispose();
mSymbolFilter = null;
@@ -128,19 +119,7 @@ public class P25_C4FMDecoder extends P25Decoder implements IRealBufferListener
}
@Override
- public boolean hasFrequencyCorrectionControl()
- {
- return mFrequencyCorrectionControl != null;
- }
-
- @Override
- public FrequencyCorrectionControl getFrequencyCorrectionControl()
- {
- return mFrequencyCorrectionControl;
- }
-
- @Override
- public Listener getRealBufferListener()
+ public Listener getFilteredRealBufferListener()
{
return mC4FMPreFilter;
}
@@ -262,4 +241,33 @@ public class P25_C4FMDecoder extends P25Decoder implements IRealBufferListener
// TODO Auto-generated method stub
}
+
+ @Override
+ public void setFrequencyChangeListener( Listener listener )
+ {
+ if( mSymbolFilter != null )
+ {
+ mSymbolFilter.setFrequencyChangeListener( listener );
+ }
+ }
+
+ @Override
+ public void removeFrequencyChangeListener()
+ {
+ if( mSymbolFilter != null )
+ {
+ mSymbolFilter.setFrequencyChangeListener( null );
+ }
+ }
+
+ @Override
+ public Listener getFrequencyChangeListener()
+ {
+ if( mSymbolFilter != null )
+ {
+ return mSymbolFilter.getFrequencyChangeListener();
+ }
+
+ return null;
+ }
}
diff --git a/src/module/decode/p25/P25_LSMDecoder.java b/src/module/decode/p25/P25_LSMDecoder.java
index 21555ae9..0e72cba4 100644
--- a/src/module/decode/p25/P25_LSMDecoder.java
+++ b/src/module/decode/p25/P25_LSMDecoder.java
@@ -34,7 +34,6 @@ import sample.Listener;
import sample.complex.ComplexBuffer;
import sample.complex.ComplexBufferToStreamConverter;
import sample.complex.IComplexBufferListener;
-import source.tuner.frequency.FrequencyCorrectionControl;
import alias.AliasList;
import dsp.filter.FilterFactory;
import dsp.filter.Window.WindowType;
@@ -119,18 +118,6 @@ public class P25_LSMDecoder extends P25Decoder implements IComplexBufferListener
return Modulation.CQPSK;
}
- @Override
- public boolean hasFrequencyCorrectionControl()
- {
- return false;
- }
-
- @Override
- public FrequencyCorrectionControl getFrequencyCorrectionControl()
- {
- return null;
- }
-
/**
* Provides a list of instrumentation taps for monitoring internal processing
*/
diff --git a/src/module/decode/passport/PassportDecoder.java b/src/module/decode/passport/PassportDecoder.java
index b6d46a2b..e125541d 100644
--- a/src/module/decode/passport/PassportDecoder.java
+++ b/src/module/decode/passport/PassportDecoder.java
@@ -28,7 +28,7 @@ import module.decode.Decoder;
import module.decode.DecoderType;
import module.decode.config.DecodeConfiguration;
import sample.Listener;
-import sample.real.IRealBufferListener;
+import sample.real.IUnFilteredRealBufferListener;
import sample.real.RealBuffer;
import alias.AliasList;
import bits.MessageFramer;
@@ -36,7 +36,7 @@ import bits.SyncPattern;
import dsp.fsk.LTRFSKDecoder;
public class PassportDecoder extends Decoder
- implements IRealBufferListener, Instrumentable
+ implements IUnFilteredRealBufferListener, Instrumentable
{
public static final int PASSPORT_MESSAGE_LENGTH = 68;
public static final int PASSPORT_SYNC_LENGTH = 9;
@@ -47,8 +47,11 @@ public class PassportDecoder extends Decoder
private List mAvailableTaps;
- public PassportDecoder( DecodeConfiguration config,
- AliasList aliasList )
+ /**
+ * Passport Decoder. Decodes unfiltered (e.g. demodulated but with no DC or
+ * audio filtering) samples and produces Passport messages.
+ */
+ public PassportDecoder( DecodeConfiguration config, AliasList aliasList )
{
mPassportFSKDecoder = new LTRFSKDecoder();
@@ -64,7 +67,7 @@ public class PassportDecoder extends Decoder
}
@Override
- public Listener getRealBufferListener()
+ public Listener getUnFilteredRealBufferListener()
{
return mPassportFSKDecoder;
}
diff --git a/src/module/decode/state/ChannelCollectionPanel.java b/src/module/decode/state/ChannelCollectionPanel.java
index 685511d1..eae3db84 100644
--- a/src/module/decode/state/ChannelCollectionPanel.java
+++ b/src/module/decode/state/ChannelCollectionPanel.java
@@ -16,6 +16,8 @@ import org.slf4j.LoggerFactory;
import playlist.PlaylistManager;
import settings.SettingsManager;
import controller.channel.Channel;
+import controller.channel.ChannelModel;
+import controller.channel.ChannelProcessingManager;
/**
* Channel Collection assembles a primary channel panel and any related decoder
@@ -28,15 +30,21 @@ public class ChannelCollectionPanel extends JPanel
private final static Logger mLog = LoggerFactory.getLogger( ChannelCollectionPanel.class );
+ private ChannelModel mChannelModel;
+ private ChannelProcessingManager mChannelProcessingManager;
private PlaylistManager mPlaylistManager;
private SettingsManager mSettingsManager;
private List mChannelPanels = new ArrayList();
- public ChannelCollectionPanel( PlaylistManager playlistManager,
+ public ChannelCollectionPanel( ChannelModel channelModel,
+ ChannelProcessingManager channelProcessingManager,
+ PlaylistManager playlistManager,
SettingsManager settingsManager,
Channel channel )
{
+ mChannelModel = channelModel;
+ mChannelProcessingManager = channelProcessingManager;
mPlaylistManager = playlistManager;
mSettingsManager = settingsManager;
@@ -49,8 +57,8 @@ public class ChannelCollectionPanel extends JPanel
setOpaque( false );
- ChannelStatePanel csp = new ChannelStatePanel( mPlaylistManager,
- mSettingsManager, channel );
+ ChannelStatePanel csp = new ChannelStatePanel( mChannelModel,
+ mChannelProcessingManager, mPlaylistManager, mSettingsManager, channel );
mChannelPanels.add( csp );
diff --git a/src/module/decode/state/ChannelList.java b/src/module/decode/state/ChannelList.java
index aff58241..5cd8f9b8 100644
--- a/src/module/decode/state/ChannelList.java
+++ b/src/module/decode/state/ChannelList.java
@@ -43,6 +43,8 @@ import settings.SettingsManager;
import controller.channel.Channel;
import controller.channel.ChannelEvent;
import controller.channel.ChannelEventListener;
+import controller.channel.ChannelModel;
+import controller.channel.ChannelProcessingManager;
/**
* Gui wrapper for the list of currently processing primary channels
@@ -56,12 +58,18 @@ public class ChannelList extends JPanel implements ChannelEventListener
private HashMap mDisplayedPanels =
new HashMap();
+ private ChannelModel mChannelModel;
+ private ChannelProcessingManager mChannelProcessingManager;
private PlaylistManager mPlaylistManager;
private SettingsManager mSettingsManager;
- public ChannelList( PlaylistManager playlistManager,
+ public ChannelList( ChannelModel channelModel,
+ ChannelProcessingManager channelProcessingManager,
+ PlaylistManager playlistManager,
SettingsManager settingsManager )
{
+ mChannelModel = channelModel;
+ mChannelProcessingManager = channelProcessingManager;
mPlaylistManager = playlistManager;
mSettingsManager = settingsManager;
@@ -96,8 +104,8 @@ public class ChannelList extends JPanel implements ChannelEventListener
{
if( !mDisplayedPanels.containsKey( channel ) )
{
- ChannelCollectionPanel panel = new ChannelCollectionPanel(
- mPlaylistManager, mSettingsManager, channel );
+ ChannelCollectionPanel panel = new ChannelCollectionPanel( mChannelModel,
+ mChannelProcessingManager, mPlaylistManager, mSettingsManager, channel );
add( panel, "wrap" );
diff --git a/src/module/decode/state/ChannelStatePanel.java b/src/module/decode/state/ChannelStatePanel.java
index 0559da06..4e626964 100644
--- a/src/module/decode/state/ChannelStatePanel.java
+++ b/src/module/decode/state/ChannelStatePanel.java
@@ -14,6 +14,7 @@ import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JPanel;
+import module.ProcessingChain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -31,6 +32,11 @@ import settings.Setting;
import settings.SettingChangeListener;
import settings.SettingsManager;
+import controller.channel.Channel;
+import controller.channel.ChannelModel;
+import controller.channel.ChannelProcessingManager;
+import controller.channel.ChannelUtils;
+
public class ChannelStatePanel extends JPanel
implements Listener, SettingChangeListener
{
@@ -38,10 +44,6 @@ public class ChannelStatePanel extends JPanel
private final static Logger mLog = LoggerFactory.getLogger( ChannelStatePanel.class );
- private static final boolean ENABLED = true;
- private static final boolean DISABLED = false;
- private static final boolean BROADCAST_CHANGE = true;
-
private Font mFontDetails = new Font( Font.MONOSPACED, Font.PLAIN, 12 );
private Font mFontDecoder = new Font( Font.MONOSPACED, Font.PLAIN, 12 );
@@ -75,7 +77,10 @@ public class ChannelStatePanel extends JPanel
protected SettingsManager mSettingsManager;
private Channel mChannel;
+ private ChannelState mChannelState;
private List mDecoderPanels = new ArrayList<>();
+ private ChannelModel mChannelModel;
+ private ChannelProcessingManager mChannelProcessingManager;
/**
* Gui component to a channel state. Provides System, Site and channel
@@ -83,21 +88,31 @@ public class ChannelStatePanel extends JPanel
*
* Updates color background according to current channel state.
*/
- public ChannelStatePanel( PlaylistManager playlistManager,
+ public ChannelStatePanel( ChannelModel channelModel,
+ ChannelProcessingManager channelProcessingManager,
+ PlaylistManager playlistManager,
SettingsManager settingsManager,
Channel channel )
{
+ mChannelModel = channelModel;
+ mChannelProcessingManager = channelProcessingManager;
mPlaylistManager = playlistManager;
mSettingsManager = settingsManager;
mSettingsManager.addListener( this );
mChannel = channel;
- mChannel.getChannelState().setChangedAttributeListener( this );
+
+ ProcessingChain processingChain =
+ channelProcessingManager.getProcessingChain( mChannel );
+
+ mChannelState = processingChain.getChannelState();
+
+ mChannelState.setChangedAttributeListener( this );
init();
- for( DecoderState decoderState: getChannel().getProcessingChain().getDecoderStates() )
+ for( DecoderState decoderState: processingChain.getDecoderStates() )
{
DecoderPanel panel = DecoderFactory.getDecoderPanel( mSettingsManager, decoderState );
mDecoderPanels.add( panel );
@@ -126,8 +141,7 @@ public class ChannelStatePanel extends JPanel
mChannelLabel.setForeground( mColorLabelDetails );
add( mChannelLabel, "wrap" );
- mStateLabel = new JLabel( mChannel.getChannelState().getState()
- .getDisplayValue() );
+ mStateLabel = new JLabel( mChannelState.getState().getDisplayValue() );
mStateLabel.setFont( mFontDecoder );
mStateLabel.setForeground( mColorLabelDecoder );
add( mStateLabel );
@@ -161,8 +175,6 @@ public class ChannelStatePanel extends JPanel
mOptionsLabel.setFont( mFontDetails );
mOptionsLabel.setForeground( mColorLabelAuxDecoder );
add( mOptionsLabel, "wrap" );
-
-// add( new JSeparator( JSeparator.HORIZONTAL ), "span,growx" );
}
public Channel getChannel()
@@ -177,7 +189,8 @@ public class ChannelStatePanel extends JPanel
mSettingsManager.removeListener( this );
mSettingsManager = null;
- mChannel.getChannelState().removeChangedAttributeListener();
+ mChannelState.removeChangedAttributeListener();
+ mChannelState = null;
mChannel = null;
for( DecoderPanel panel: mDecoderPanels )
@@ -192,8 +205,6 @@ public class ChannelStatePanel extends JPanel
@Override
public void receive( final ChangedAttribute changedAttribute )
{
- final ChannelState state = mChannel.getChannelState();
-
EventQueue.invokeLater( new Runnable()
{
@Override
@@ -202,9 +213,9 @@ public class ChannelStatePanel extends JPanel
switch( changedAttribute )
{
case CHANNEL_STATE:
- if( state.getState() != null )
+ if( mChannelState.getState() != null )
{
- mStateLabel.setText( state.getState().getDisplayValue() );
+ mStateLabel.setText( mChannelState.getState().getDisplayValue() );
}
break;
case SOURCE:
@@ -214,7 +225,7 @@ public class ChannelStatePanel extends JPanel
case CHANNEL_NAME:
case SITE_NAME:
case SYSTEM_NAME:
- mChannelLabel.setText( mChannel.getChannelDisplayName() );
+ mChannelLabel.setText( mChannel.toString() );
break;
default:
break;
@@ -419,7 +430,7 @@ public class ChannelStatePanel extends JPanel
public JMenu getContextMenu()
{
- return ChannelUtils.getContextMenu( mPlaylistManager, mChannel,
- ChannelStatePanel.this );
+ return ChannelUtils.getContextMenu( mChannelModel, mChannelProcessingManager,
+ mPlaylistManager, mChannel, ChannelStatePanel.this );
}
}
diff --git a/src/module/decode/state/TrafficChannelManager.java b/src/module/decode/state/TrafficChannelManager.java
index 18d90d74..ec64ab84 100644
--- a/src/module/decode/state/TrafficChannelManager.java
+++ b/src/module/decode/state/TrafficChannelManager.java
@@ -6,6 +6,7 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import module.Module;
+import module.ProcessingChain;
import module.decode.config.DecodeConfiguration;
import module.decode.event.CallEvent;
import module.decode.event.CallEvent.CallEventType;
@@ -21,11 +22,12 @@ import source.tuner.TunerChannel;
import source.tuner.TunerChannel.Type;
import alias.Alias;
import alias.priority.Priority;
-import controller.ResourceManager;
import controller.channel.Channel;
import controller.channel.Channel.ChannelType;
-import controller.site.Site;
-import controller.system.System;
+import controller.channel.ChannelEvent;
+import controller.channel.ChannelEvent.Event;
+import controller.channel.ChannelModel;
+import controller.channel.ChannelProcessingManager;
public class TrafficChannelManager extends Module
implements ICallEventProvider, IDecoderStateEventListener
@@ -40,15 +42,14 @@ public class TrafficChannelManager extends Module
private DecoderStateEventListener mEventListener = new DecoderStateEventListener();
private Listener mCallEventListener;
+ private ChannelModel mChannelModel;
+ private ChannelProcessingManager mChannelProcessingManager;
private DecodeConfiguration mDecodeConfiguration;
private RecordConfiguration mRecordConfiguration;
- private ResourceManager mResourceManager;
private String mSystem;
private String mSite;
private String mAliasListName;
- private long mTrafficChannelTimeout;
private CallEvent mPreviousDoNotMonitorCallEvent;
- private boolean mShuttingDown = false;
/**
* Monitors call events and allocates traffic decoder channels in response
@@ -68,7 +69,8 @@ public class TrafficChannelManager extends Module
* @param trafficChannelPoolSize - maximum number of allocated traffic channels
* in the pool
*/
- public TrafficChannelManager( ResourceManager resourceManager,
+ public TrafficChannelManager( ChannelModel channelModel,
+ ChannelProcessingManager channelProcessingManager,
DecodeConfiguration decodeConfiguration,
RecordConfiguration recordConfiguration,
String system,
@@ -77,13 +79,14 @@ public class TrafficChannelManager extends Module
long trafficChannelTimeout,
int trafficChannelPoolSize )
{
- mResourceManager = resourceManager;
+ mChannelModel = channelModel;
+ mChannelProcessingManager = channelProcessingManager;
mDecodeConfiguration = decodeConfiguration;
mRecordConfiguration = recordConfiguration;
mSystem = system;
mSite = site;
mAliasListName = aliasListName;
- mTrafficChannelTimeout = trafficChannelTimeout;
+// mTrafficChannelTimeout = trafficChannelTimeout;
mTrafficChannelPoolMaximumSize = trafficChannelPoolSize;
}
@@ -91,7 +94,6 @@ public class TrafficChannelManager extends Module
public void dispose()
{
mCallEventListener = null;
- mResourceManager = null;
mDecodeConfiguration = null;
mPreviousDoNotMonitorCallEvent = null;
}
@@ -115,7 +117,7 @@ public class TrafficChannelManager extends Module
{
for( Channel configuredChannel: mTrafficChannelPool )
{
- if( !configuredChannel.isProcessing() )
+ if( !configuredChannel.getEnabled() )
{
channel = configuredChannel;
break;
@@ -130,12 +132,10 @@ public class TrafficChannelManager extends Module
channel.setRecordConfiguration( mRecordConfiguration );
- channel.setResourceManager( mResourceManager );
-
- channel.setTrafficChannelTimeout( mTrafficChannelTimeout );
-
channel.setAliasListName( mAliasListName );
+ mChannelModel.addChannel( channel );
+
mTrafficChannelPool.add( channel );
}
@@ -143,26 +143,15 @@ public class TrafficChannelManager extends Module
if( channel != null )
{
channel.setSourceConfiguration( new SourceConfigTuner( tunerChannel ) );
-
channel.setSystem( mSystem );
channel.setSite( mSite );
channel.setName( channelNumber );
- channel.setEnabled( true );
+ mChannelModel.broadcast( new ChannelEvent( channel,
+ Event.NOTIFICATION_CONFIGURATION_CHANGE ) );
- /* Check the channel obtained a source and is currently processing */
- if( channel.isProcessing() )
- {
- mTrafficChannelsInUse.put( channelNumber, channel );
- }
- else
- {
- channel.setEnabled( false );
-
- channel.setSystem( mSystem );
- channel.setSite( mSite );
- channel.setName( "Traffic" );
- }
+ mChannelModel.broadcast( new ChannelEvent( channel,
+ Event.REQUEST_ENABLE ) );
}
}
@@ -210,26 +199,29 @@ public class TrafficChannelManager extends Module
if( channel != null )
{
- if( channel.isProcessing() )
+ if( channel.getEnabled() )
{
- callEvent.setDetails( "TRAFFIC CHANNEL ALLOCATED" );
-
- ChannelState state = channel.getChannelState();
-
- /* Register as a listener to be notified when the call
- * is completed */
- state.configureAsTrafficChannel(
- new TrafficChannelStatusListener( this,
- callEvent.getChannel() ), event );
-
- /* Set state to call so that audio squelch state is correct */
- state.setState( State.CALL );
+ ProcessingChain chain = mChannelProcessingManager
+ .getProcessingChain( channel );
+
+ if( chain != null )
+ {
+ ChannelState state = chain.getChannelState();
+
+ /* Register as a listener to be notified when the call
+ * is completed */
+ state.configureAsTrafficChannel(
+ new TrafficChannelStatusListener( this,
+ callEvent.getChannel() ), event );
+
+ /* Set state to call so that audio squelch state is correct */
+ state.setState( State.CALL );
+ }
}
else
{
callEvent.setCallEventType( CallEventType.CALL_DETECT );
- callEvent.setDetails( "CHANNEL PROCESSING ERROR" );
- }
+ }
}
else
{
@@ -390,15 +382,13 @@ public class TrafficChannelManager extends Module
{
synchronized( mTrafficChannelsInUse )
{
- if( channelNumber != null &&
- mTrafficChannelsInUse.containsKey( channelNumber ) )
+ if( channelNumber != null && mTrafficChannelsInUse.containsKey( channelNumber ) )
{
Channel channel = mTrafficChannelsInUse.get( channelNumber );
-
+
+ mChannelModel.broadcast( new ChannelEvent( channel, Event.REQUEST_DISABLE ) );
+
mTrafficChannelsInUse.remove( channelNumber );
-
- /* Disable the channel and broadcast a notification */
- channel.setEnabled( false );
}
}
}
diff --git a/src/module/decode/tait/Tait1200Decoder.java b/src/module/decode/tait/Tait1200Decoder.java
index 83ccf2aa..8f21e80d 100644
--- a/src/module/decode/tait/Tait1200Decoder.java
+++ b/src/module/decode/tait/Tait1200Decoder.java
@@ -31,7 +31,7 @@ import module.decode.Decoder;
import module.decode.DecoderType;
import sample.Broadcaster;
import sample.Listener;
-import sample.real.IRealBufferListener;
+import sample.real.IFilteredRealBufferListener;
import sample.real.RealBuffer;
import alias.AliasList;
import bits.MessageFramer;
@@ -45,7 +45,7 @@ import dsp.fsk.FSK2Decoder.Output;
/**
* TAIT 1200 - 1200 baud 2FSK decoder
*/
-public class Tait1200Decoder extends Decoder implements IRealBufferListener,
+public class Tait1200Decoder extends Decoder implements IFilteredRealBufferListener,
Instrumentable
{
/* Decimated sample rate ( 48,000 / 2 = 24,000 ) feeding the decoder */
@@ -179,7 +179,7 @@ public class Tait1200Decoder extends Decoder implements IRealBufferListener,
}
@Override
- public Listener getRealBufferListener()
+ public Listener getFilteredRealBufferListener()
{
return mDecimationFilter;
}
diff --git a/src/module/demodulate/am/AMDemodulatorModule.java b/src/module/demodulate/am/AMDemodulatorModule.java
index 716c6677..8e311102 100644
--- a/src/module/demodulate/am/AMDemodulatorModule.java
+++ b/src/module/demodulate/am/AMDemodulatorModule.java
@@ -21,7 +21,7 @@ import module.Module;
import sample.Listener;
import sample.complex.ComplexBuffer;
import sample.complex.IComplexBufferListener;
-import sample.real.IRealBufferProvider;
+import sample.real.IFilteredRealBufferProvider;
import sample.real.RealBuffer;
import dsp.am.AMDemodulator_CB;
import dsp.filter.FilterFactory;
@@ -31,7 +31,7 @@ import dsp.filter.fir.real.RealFIRFilter_RB_RB;
import dsp.gain.AutomaticGainControl_RB;
public class AMDemodulatorModule extends Module
- implements IComplexBufferListener, IRealBufferProvider
+ implements IComplexBufferListener, IFilteredRealBufferProvider
{
private static final int SAMPLE_RATE = 48000;
@@ -99,13 +99,13 @@ public class AMDemodulatorModule extends Module
}
@Override
- public void setRealBufferListener( Listener listener )
+ public void setFilteredRealBufferListener( Listener listener )
{
mAGC.setListener( listener );
}
@Override
- public void removeRealBufferListener()
+ public void removeFilteredRealBufferListener()
{
mAGC.removeListener();
}
diff --git a/src/module/demodulate/audio/DemodulatedAudioFilterModule.java b/src/module/demodulate/audio/DemodulatedAudioFilterModule.java
new file mode 100644
index 00000000..c6535268
--- /dev/null
+++ b/src/module/demodulate/audio/DemodulatedAudioFilterModule.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * SDR Trunk
+ * Copyright (C) 2014-2016 Dennis Sheirer
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see
+ ******************************************************************************/
+package module.demodulate.audio;
+
+import module.Module;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import sample.Listener;
+import sample.real.IFilteredRealBufferProvider;
+import sample.real.IUnFilteredRealBufferListener;
+import sample.real.RealBuffer;
+import dsp.filter.FilterFactory;
+import dsp.filter.Window.WindowType;
+import dsp.filter.dc.DCRemovalFilter_RealBuffer;
+import dsp.filter.fir.real.RealFIRFilter_RB_RB;
+
+public class DemodulatedAudioFilterModule extends Module
+ implements IUnFilteredRealBufferListener, IFilteredRealBufferProvider
+{
+ private final static Logger mLog = LoggerFactory.getLogger( DemodulatedAudioFilterModule.class );
+
+ private DCRemovalFilter_RealBuffer mDCFilter = new DCRemovalFilter_RealBuffer();
+ private RealFIRFilter_RB_RB mBandPassFilter;
+ /**
+ * Filters demodulated audio and removes any DC component from the buffer
+ *
+ * @param pass - audio pass band pass frequency
+ * @param stop - audio pass band stop frequency
+ */
+ public DemodulatedAudioFilterModule( int pass, int stop )
+ {
+ assert( stop > pass );
+
+//TODO: change this to a band pass filter
+ mBandPassFilter = new RealFIRFilter_RB_RB(
+ FilterFactory.getLowPass( 48000, pass, stop, 60,
+ WindowType.HANNING, true ), 1.0f );
+
+ mDCFilter.setListener( mBandPassFilter );
+ }
+
+ @Override
+ public void dispose()
+ {
+ mBandPassFilter.dispose();
+ mBandPassFilter = null;
+
+ mDCFilter.dispose();
+ mDCFilter = null;
+ }
+
+ @Override
+ public void reset()
+ {
+ }
+
+ @Override
+ public void setFilteredRealBufferListener( Listener listener )
+ {
+ mBandPassFilter.setListener( listener );
+ }
+
+ @Override
+ public void removeFilteredRealBufferListener()
+ {
+ mBandPassFilter.removeListener();
+ }
+
+ @Override
+ public void start()
+ {
+ }
+
+ @Override
+ public void stop()
+ {
+ }
+
+ @Override
+ public Listener getUnFilteredRealBufferListener()
+ {
+ return mDCFilter;
+ }
+}
diff --git a/src/module/demodulate/fm/FMDemodulatorModule.java b/src/module/demodulate/fm/FMDemodulatorModule.java
index 2d2afe16..da39a197 100644
--- a/src/module/demodulate/fm/FMDemodulatorModule.java
+++ b/src/module/demodulate/fm/FMDemodulatorModule.java
@@ -1,6 +1,6 @@
/*******************************************************************************
* SDR Trunk
- * Copyright (C) 2014,2015 Dennis Sheirer
+ * Copyright (C) 2014-2016 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -22,43 +22,27 @@ import module.Module;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import sample.Broadcaster;
import sample.Listener;
import sample.complex.ComplexBuffer;
import sample.complex.IComplexBufferListener;
-import sample.real.IRealBufferProvider;
+import sample.real.IUnFilteredRealBufferProvider;
import sample.real.RealBuffer;
-import source.tuner.frequency.AutomaticFrequencyControl_RB;
-import source.tuner.frequency.FrequencyCorrectionControl;
-import source.tuner.frequency.IFrequencyCorrectionController;
import dsp.filter.FilterFactory;
import dsp.filter.Window.WindowType;
-import dsp.filter.dc.DCRemovalFilter_RB;
import dsp.filter.fir.complex.ComplexFIRFilter_CB_CB;
import dsp.fm.FMDemodulator_CB;
-public class FMDemodulatorModule extends Module implements IComplexBufferListener,
- IFrequencyCorrectionController, IRealBufferProvider
+public class FMDemodulatorModule extends Module
+ implements IComplexBufferListener, IUnFilteredRealBufferProvider
{
- private final static Logger mLog = LoggerFactory.getLogger( FMDemodulatorModule.class );
-
- /* Determines responsiveness of DC filter to frequency changes */
- private static final float DC_REMOVAL_RATIO = 0.000003f;
-
private static final int SAMPLE_RATE = 48000;
private ComplexFIRFilter_CB_CB mIQFilter;
private FMDemodulator_CB mDemodulator;
- private Broadcaster mUnfilteredBufferBroadcaster = new Broadcaster();
- private DCRemovalFilter_RB mDCRemovalFilter;
- private AutomaticFrequencyControl_RB mAutomaticFrequencyControl;
- private boolean mRemoveDC = true;
-
- private Listener mListener;
/**
- * FM Demodulator with integrated DC removal and automatic frequency
- * correction control.
+ * FM Demodulator with I/Q filter. Demodulated output is unfiltered and
+ * may contain a DC component.
*
* @param pass - pass frequency for IQ filtering prior to demodulation. This
* frequency should be half of the signal bandwidth since the filter will
@@ -66,56 +50,16 @@ public class FMDemodulatorModule extends Module implements IComplexBufferListene
* combined pass bandwidth will be twice this value.
*
* @param stop - stop frequency for IQ filtering prior to demodulation.
- *
- * @param maxFrequencyCorrection - defines the maximum frequency +/- that
- * the correction controller can adjust from the center tuned frequency.
- * Set this value to 0 for no frequency correction control.
*/
- public FMDemodulatorModule( int pass, int stop, int maxFrequencyCorrection )
- {
- this( pass, stop, maxFrequencyCorrection, true );
- }
-
- public FMDemodulatorModule( int pass, int stop, int maxFrequencyCorrection, boolean removeDC )
+ public FMDemodulatorModule( int pass, int stop )
{
assert( stop > pass );
- mRemoveDC = removeDC;
-
mIQFilter = new ComplexFIRFilter_CB_CB( FilterFactory.getLowPass(
SAMPLE_RATE, pass, stop, 60, WindowType.HAMMING, true ), 1.0f );
mDemodulator = new FMDemodulator_CB( 1.0f );
mIQFilter.setListener( mDemodulator );
-
- mUnfilteredBufferBroadcaster = new Broadcaster();
- mDemodulator.setListener( mUnfilteredBufferBroadcaster );
-
- if( maxFrequencyCorrection > 0 )
- {
- /* Frequency correction requires unfiltered samples in order to detect
- * the DC component present in a mistuned FM demodulated sample stream */
- mAutomaticFrequencyControl = new AutomaticFrequencyControl_RB( maxFrequencyCorrection );
- mUnfilteredBufferBroadcaster.addListener( mAutomaticFrequencyControl );
- }
-
- if( mRemoveDC )
- {
- mDCRemovalFilter = new DCRemovalFilter_RB( DC_REMOVAL_RATIO );
- mUnfilteredBufferBroadcaster.addListener( mDCRemovalFilter );
- }
- }
-
- @Override
- public boolean hasFrequencyCorrectionControl()
- {
- return mAutomaticFrequencyControl != null;
- }
-
- @Override
- public FrequencyCorrectionControl getFrequencyCorrectionControl()
- {
- return mAutomaticFrequencyControl;
}
@Override
@@ -132,68 +76,24 @@ public class FMDemodulatorModule extends Module implements IComplexBufferListene
mDemodulator.dispose();
mDemodulator = null;
-
- if( mDCRemovalFilter != null )
- {
- mDCRemovalFilter.dispose();
- }
- mDCRemovalFilter = null;
-
- if( mAutomaticFrequencyControl != null )
- {
- mAutomaticFrequencyControl.dispose();
- mAutomaticFrequencyControl = null;
- }
-
- if( mUnfilteredBufferBroadcaster != null )
- {
- mUnfilteredBufferBroadcaster.dispose();
- mUnfilteredBufferBroadcaster = null;
- }
}
@Override
public void reset()
{
mDemodulator.reset();
-
- if( mDCRemovalFilter != null )
- {
- mDCRemovalFilter.reset();
- }
-
- if( mAutomaticFrequencyControl != null )
- {
- mAutomaticFrequencyControl.reset();
- }
}
@Override
- public void setRealBufferListener( Listener listener )
+ public void setUnFilteredRealBufferListener( Listener listener )
{
- mListener = listener;
-
- if( mRemoveDC )
- {
- mDCRemovalFilter.setListener( listener );
- }
- else
- {
- mUnfilteredBufferBroadcaster.addListener( listener );
- }
+ mDemodulator.setListener( listener );
}
@Override
- public void removeRealBufferListener()
+ public void removeUnFilteredRealBufferListener()
{
- if( mRemoveDC )
- {
- mDCRemovalFilter.removeListener();
- }
- else
- {
- mUnfilteredBufferBroadcaster.removeListener( mListener );
- }
+ mDemodulator.removeListener();
}
@Override
diff --git a/src/module/log/EventLogComponentEditor.java b/src/module/log/EventLogComponentEditor.java
index e8fefbee..2a9e081a 100644
--- a/src/module/log/EventLogComponentEditor.java
+++ b/src/module/log/EventLogComponentEditor.java
@@ -1,6 +1,6 @@
/*******************************************************************************
* SDR Trunk
- * Copyright (C) 2014 Dennis Sheirer
+ * Copyright (C) 2014-2016 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -24,7 +24,8 @@ import javax.swing.SwingUtilities;
import module.log.config.EventLogConfiguration;
import controller.channel.AbstractChannelEditor;
-import controller.channel.ChannelNode;
+import controller.channel.Channel;
+import controller.channel.ConfigurationValidationException;
public class EventLogComponentEditor extends AbstractChannelEditor
{
@@ -34,9 +35,9 @@ public class EventLogComponentEditor extends AbstractChannelEditor
private JCheckBox mDecodedLogger = new JCheckBox( "Decoded Messages" );
private JCheckBox mCallEventLogger = new JCheckBox( "Call Events" );
- public EventLogComponentEditor( ChannelNode channelNode )
+ public EventLogComponentEditor( Channel channel )
{
- super( channelNode );
+ super( channel );
add( mBinaryLogger, "span" );
add( mDecodedLogger, "span" );
@@ -53,7 +54,7 @@ public class EventLogComponentEditor extends AbstractChannelEditor
{
SwingUtilities.invokeLater(new Runnable()
{
- final List mLoggers = mChannelNode.getChannel()
+ final List mLoggers = mChannel
.getEventLogConfiguration().getLoggers();
@Override
@@ -75,8 +76,7 @@ public class EventLogComponentEditor extends AbstractChannelEditor
@Override
public void save()
{
- EventLogConfiguration config = mChannelNode.getChannel()
- .getEventLogConfiguration();
+ EventLogConfiguration config = mChannel.getEventLogConfiguration();
config.clear();
@@ -94,4 +94,18 @@ public class EventLogComponentEditor extends AbstractChannelEditor
config.addLogger( EventLogType.CALL_EVENT );
}
}
+
+ @Override
+ public void setConfiguration( Channel channel )
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void validateConfiguration() throws ConfigurationValidationException
+ {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/src/playlist/PlaylistEditor.java b/src/playlist/PlaylistEditor.java
new file mode 100644
index 00000000..5d5d92a2
--- /dev/null
+++ b/src/playlist/PlaylistEditor.java
@@ -0,0 +1,88 @@
+package playlist;
+
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.ListSelectionModel;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+import net.coderazzi.filters.gui.AutoChoices;
+import net.coderazzi.filters.gui.TableFilterHeader;
+import net.miginfocom.swing.MigLayout;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import source.SourceManager;
+
+import com.jidesoft.swing.JideSplitPane;
+
+import controller.channel.Channel;
+import controller.channel.ChannelEditor;
+import controller.channel.ChannelModel;
+
+public class PlaylistEditor extends JPanel implements ListSelectionListener
+{
+ private static final long serialVersionUID = 1L;
+ private final static Logger mLog = LoggerFactory.getLogger( PlaylistEditor.class );
+
+ private ChannelModel mChannelModel;
+ private JTable mChannelTable;
+ private ChannelEditor mEditor;
+
+ public PlaylistEditor( ChannelModel channelModel,
+ PlaylistManager playlistManager,
+ SourceManager sourceManager )
+ {
+ mChannelModel = channelModel;
+
+ mEditor = new ChannelEditor( channelModel, playlistManager, sourceManager );
+
+ init();
+ }
+
+ private void init()
+ {
+ setLayout( new MigLayout( "insets 0 0 0 0",
+ "[grow,fill]",
+ "[grow,fill]") );
+
+ //System Configuration View and Editor
+ mChannelTable = new JTable( mChannelModel );
+ mChannelTable.setSelectionMode( ListSelectionModel.SINGLE_SELECTION );
+ mChannelTable.getSelectionModel().addListSelectionListener( this );
+ mChannelTable.setAutoCreateRowSorter( true );
+
+ TableFilterHeader channelHeaderFilter = new TableFilterHeader( mChannelTable );
+ channelHeaderFilter.setAutoChoices( AutoChoices.ENABLED );
+
+ JScrollPane channelScroller = new JScrollPane( mChannelTable );
+
+ JideSplitPane splitPane = new JideSplitPane( JideSplitPane.HORIZONTAL_SPLIT );
+ splitPane.setDividerSize( 5 );
+ splitPane.add( channelScroller );
+ splitPane.add( mEditor );
+
+ add( splitPane );
+ }
+
+ @Override
+ public void valueChanged( ListSelectionEvent event )
+ {
+ //This limits event firing to only when selection is complete
+ if( !event.getValueIsAdjusting() )
+ {
+ int index = mChannelTable.convertRowIndexToModel( mChannelTable.getSelectedRow() );
+
+ mLog.debug( "Index:" + index );
+
+ Channel channel = mChannelModel.getChannels().get( index );
+
+ if( channel != null )
+ {
+ mEditor.setChannel( channel );
+ }
+ }
+ }
+}
diff --git a/src/playlist/PlaylistManager.java b/src/playlist/PlaylistManager.java
index f23f7075..9d43c496 100644
--- a/src/playlist/PlaylistManager.java
+++ b/src/playlist/PlaylistManager.java
@@ -52,7 +52,6 @@ public class PlaylistManager
public PlaylistManager( ChannelModel channelModel )
{
mChannelModel = channelModel;
- init();
}
public Playlist getPlayist()
@@ -73,7 +72,7 @@ public class PlaylistManager
* Loads playlist from the current playlist file, or the default playlist file,
* as specified in the current SDRTRunk system settings
*/
- private void init()
+ public void init()
{
SystemProperties props = SystemProperties.getInstance();
@@ -163,6 +162,75 @@ public class PlaylistManager
}
}
+ private void createBackupPlaylist()
+ {
+ SystemProperties props = SystemProperties.getInstance();
+
+ Path playlistPath = props.getApplicationFolder( "playlist" );
+
+ String playlistDefault = props.get( "playlist.defaultfilename",
+ "playlist.xml" );
+
+ String playlistCurrent = props.get( "playlist.currentfilename",
+ playlistDefault );
+
+ Path current = playlistPath.resolve( playlistCurrent );
+
+ if( Files.exists( current ) )
+ {
+ int revision = 1;
+
+ String playlistBackup = playlistCurrent.replace( ".xml", "_backup_" + revision + ".xml" );
+
+ Path filePath = playlistPath.resolve( playlistBackup );
+
+ while( Files.exists( filePath ) )
+ {
+ revision++;
+
+ playlistBackup = playlistCurrent.replace( ".xml", "_backup_" + revision + ".xml" );
+
+ filePath = playlistPath.resolve( playlistBackup );
+
+ if( revision > 10 )
+ {
+ mLog.error( "Couldn't create playlist backup - maximum revisions exceeded" );
+ return;
+ }
+ }
+
+ File outputFile = new File( filePath.toString() );
+
+ try
+ {
+ if( !outputFile.exists() )
+ {
+ outputFile.createNewFile();
+ }
+ }
+ catch( Exception e )
+ {
+ mLog.error( "PlaylistManager - couldn't create file to save "
+ + "playlist backup [" + filePath.toString() + "]" );
+ }
+
+ try( OutputStream out = new FileOutputStream( outputFile ) )
+ {
+ Files.copy( current, out );
+
+ mLog.info( "Playlist backed up to:" + filePath );
+ }
+ catch( IOException ioe )
+ {
+ mLog.error( "Error copying playlist to backup file [" + filePath + "]" );
+ }
+ }
+ else
+ {
+ mLog.error( "Couldn't create backup playlist - original playlist does not exist" );
+ }
+ }
+
/**
* Erases current playlist and loads playlist from the playlistPath filename,
* if it exists.
@@ -238,6 +306,8 @@ public class PlaylistManager
{
mLog.info( "Legacy playlist format detected - converting ..." );
+ createBackupPlaylist();
+
//Playlist version 1 to version 2 format conversion. In order to keep
//backwards compatibility, transfer all of the System-Site-Channel
//objects over to the new channel list format
diff --git a/src/playlist/PlaylistNode.java b/src/playlist/PlaylistNode.java
index 93fdc2a8..5d8e5302 100644
--- a/src/playlist/PlaylistNode.java
+++ b/src/playlist/PlaylistNode.java
@@ -19,10 +19,14 @@ package playlist;
import javax.swing.JPanel;
+import settings.SettingsManager;
+import source.SourceManager;
import alias.AliasDirectory;
import alias.AliasDirectoryNode;
import controller.BaseNode;
import controller.EmptyEditor;
+import controller.channel.ChannelModel;
+import controller.channel.ChannelProcessingManager;
import controller.channel.map.ChannelMapList;
import controller.channel.map.ChannelMapListNode;
import controller.system.SystemList;
@@ -35,11 +39,27 @@ public class PlaylistNode extends BaseNode
private ChannelMapListNode mChannelMapListNode;
private SystemListNode mSystemListNode;
- public PlaylistNode()
- {
+ private ChannelModel mChannelModel;
+ private ChannelProcessingManager mChannelProcessingManager;
+ private PlaylistManager mPlaylistManager;
+ private SettingsManager mSettingsManager;
+ private SourceManager mSourceManager;
+
+ public PlaylistNode( ChannelModel channelModel,
+ ChannelProcessingManager channelProcessingManager,
+ PlaylistManager playlistManager,
+ SettingsManager settingsManager,
+ SourceManager sourceManager )
+ {
super( null );
- }
-
+
+ mChannelModel = channelModel;
+ mChannelProcessingManager = channelProcessingManager;
+ mPlaylistManager = playlistManager;
+ mSettingsManager = settingsManager;
+ mSourceManager = sourceManager;
+ }
+
private void init()
{
/**
@@ -58,7 +78,8 @@ public class PlaylistNode extends BaseNode
getPlaylist().setAliasDirectory( directory );
}
- mAliasDirectoryNode = new AliasDirectoryNode( directory );
+ mAliasDirectoryNode = new AliasDirectoryNode( mPlaylistManager,
+ mSettingsManager, directory );
getModel().insertNodeInto( mAliasDirectoryNode, this, 0 );
@@ -74,7 +95,7 @@ public class PlaylistNode extends BaseNode
channelMapList = new ChannelMapList();
}
- mChannelMapListNode = new ChannelMapListNode( channelMapList );
+ mChannelMapListNode = new ChannelMapListNode( mPlaylistManager, channelMapList );
getModel().insertNodeInto( mChannelMapListNode, this, 1 );
@@ -91,7 +112,8 @@ public class PlaylistNode extends BaseNode
getPlaylist().setSystemList( list );
}
- mSystemListNode = new SystemListNode( list );
+ mSystemListNode = new SystemListNode( list, mChannelModel,
+ mChannelProcessingManager, mPlaylistManager, mSourceManager );
getModel().insertNodeInto( mSystemListNode, this, 2 );
@@ -112,8 +134,7 @@ public class PlaylistNode extends BaseNode
public void loadPlaylist()
{
- Playlist playlist =
- getModel().getResourceManager().getPlaylistManager().getPlayist();
+ Playlist playlist = mPlaylistManager.getPlayist();
setUserObject( playlist );
diff --git a/src/record/RecordComponentEditor.java b/src/record/RecordComponentEditor.java
index 435a6ccb..7c23a360 100644
--- a/src/record/RecordComponentEditor.java
+++ b/src/record/RecordComponentEditor.java
@@ -1,6 +1,6 @@
/*******************************************************************************
* SDR Trunk
- * Copyright (C) 2014 Dennis Sheirer
+ * Copyright (C) 2014-2016 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -22,7 +22,8 @@ import javax.swing.JCheckBox;
import record.config.RecordConfiguration;
import controller.channel.AbstractChannelEditor;
-import controller.channel.ChannelNode;
+import controller.channel.Channel;
+import controller.channel.ConfigurationValidationException;
public class RecordComponentEditor extends AbstractChannelEditor
{
@@ -32,9 +33,9 @@ public class RecordComponentEditor extends AbstractChannelEditor
private JCheckBox mBasebandRecorder = new JCheckBox( "Baseband I/Q" );
private JCheckBox mTrafficBasebandRecorder = new JCheckBox( "Traffic Channel Baseband I/Q" );
- public RecordComponentEditor( ChannelNode channelNode )
+ public RecordComponentEditor( Channel channel )
{
- super( channelNode );
+ super( channel );
add( mAudioRecorder, "span" );
add( mBasebandRecorder, "span" );
@@ -46,8 +47,7 @@ public class RecordComponentEditor extends AbstractChannelEditor
@Override
public void save()
{
- RecordConfiguration config =
- getChannelNode().getChannel().getRecordConfiguration();
+ RecordConfiguration config = getChannel().getRecordConfiguration();
config.clearRecorders();
@@ -76,8 +76,7 @@ public class RecordComponentEditor extends AbstractChannelEditor
@Override
public void run()
{
- RecordConfiguration config =
- getChannelNode().getChannel().getRecordConfiguration();
+ RecordConfiguration config = getChannel().getRecordConfiguration();
mAudioRecorder.setSelected( config.getRecorders()
.contains( RecorderType.AUDIO ) );
@@ -90,4 +89,18 @@ public class RecordComponentEditor extends AbstractChannelEditor
}
});
}
+
+ @Override
+ public void setConfiguration( Channel channel )
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void validateConfiguration() throws ConfigurationValidationException
+ {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/src/record/RecordEditor.java b/src/record/RecordEditor.java
index 6d25832e..9913bf9e 100644
--- a/src/record/RecordEditor.java
+++ b/src/record/RecordEditor.java
@@ -18,9 +18,11 @@
package record;
import record.config.RecordConfiguration;
-import controller.Editor;
+import controller.channel.Channel;
+import controller.channel.ChannelConfigurationEditor;
+import controller.channel.ConfigurationValidationException;
-public class RecordEditor extends Editor
+public class RecordEditor extends ChannelConfigurationEditor
{
private static final long serialVersionUID = 1L;
@@ -42,7 +44,16 @@ public class RecordEditor extends Editor
}
@Override
- public void reset()
- {
- }
+ public void setConfiguration( Channel channel )
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void validateConfiguration() throws ConfigurationValidationException
+ {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/src/record/RecorderManager.java b/src/record/RecorderManager.java
index 949ac241..b4bf4aad 100644
--- a/src/record/RecorderManager.java
+++ b/src/record/RecorderManager.java
@@ -1,6 +1,6 @@
/*******************************************************************************
* SDR Trunk
- * Copyright (C) 2014,2015 Dennis Sheirer
+ * Copyright (C) 2014-2016 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -20,7 +20,6 @@ package record;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
-import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -33,7 +32,6 @@ import audio.AudioPacket;
import audio.metadata.Metadata;
import audio.metadata.MetadataType;
import controller.ThreadPoolManager;
-import controller.ThreadPoolManager.ThreadType;
public class RecorderManager implements Listener
{
@@ -170,8 +168,7 @@ public class RecorderManager implements Listener
/**
* Constructs a baseband recorder for use in a processing chain.
*/
- public static ComplexBufferWaveRecorder getBasebandRecorder(
- ThreadPoolManager threadPoolManager, String channelName )
+ public ComplexBufferWaveRecorder getBasebandRecorder( String channelName )
{
StringBuilder sb = new StringBuilder();
sb.append( SystemProperties.getInstance()
@@ -180,7 +177,7 @@ public class RecorderManager implements Listener
sb.append( channelName );
sb.append( "_baseband" );
- return new ComplexBufferWaveRecorder( threadPoolManager,
+ return new ComplexBufferWaveRecorder( mThreadPoolManager,
AUDIO_SAMPLE_RATE, sb.toString() );
}
}
diff --git a/src/record/wave/RealBufferWaveRecorder.java b/src/record/wave/RealBufferWaveRecorder.java
index 49b0f3b6..0ad0d4f7 100644
--- a/src/record/wave/RealBufferWaveRecorder.java
+++ b/src/record/wave/RealBufferWaveRecorder.java
@@ -34,7 +34,7 @@ import org.slf4j.LoggerFactory;
import sample.ConversionUtils;
import sample.Listener;
-import sample.real.IRealBufferListener;
+import sample.real.IFilteredRealBufferListener;
import sample.real.RealBuffer;
import util.TimeStamp;
import controller.ThreadPoolManager;
@@ -44,7 +44,7 @@ import controller.ThreadPoolManager.ThreadType;
* WAVE audio recorder module for recording real sample buffers to a wave file
*/
public class RealBufferWaveRecorder extends Module
- implements IRealBufferListener, Listener
+ implements IFilteredRealBufferListener, Listener
{
private final static Logger mLog =
LoggerFactory.getLogger( RealBufferWaveRecorder.class );
@@ -151,7 +151,7 @@ public class RealBufferWaveRecorder extends Module
}
@Override
- public Listener getRealBufferListener()
+ public Listener getFilteredRealBufferListener()
{
return this;
}
diff --git a/src/sample/real/IFilteredRealBufferListener.java b/src/sample/real/IFilteredRealBufferListener.java
new file mode 100644
index 00000000..06928fda
--- /dev/null
+++ b/src/sample/real/IFilteredRealBufferListener.java
@@ -0,0 +1,8 @@
+package sample.real;
+
+import sample.Listener;
+
+public interface IFilteredRealBufferListener
+{
+ public Listener getFilteredRealBufferListener();
+}
diff --git a/src/sample/real/IFilteredRealBufferProvider.java b/src/sample/real/IFilteredRealBufferProvider.java
new file mode 100644
index 00000000..e600d368
--- /dev/null
+++ b/src/sample/real/IFilteredRealBufferProvider.java
@@ -0,0 +1,9 @@
+package sample.real;
+
+import sample.Listener;
+
+public interface IFilteredRealBufferProvider
+{
+ public void setFilteredRealBufferListener( Listener listener );
+ public void removeFilteredRealBufferListener();
+}
diff --git a/src/sample/real/IRealBufferListener.java b/src/sample/real/IRealBufferListener.java
deleted file mode 100644
index 6ef33052..00000000
--- a/src/sample/real/IRealBufferListener.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package sample.real;
-
-import sample.Listener;
-
-public interface IRealBufferListener
-{
- public Listener getRealBufferListener();
-}
diff --git a/src/sample/real/IRealBufferProvider.java b/src/sample/real/IRealBufferProvider.java
deleted file mode 100644
index 0b11debd..00000000
--- a/src/sample/real/IRealBufferProvider.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package sample.real;
-
-import sample.Listener;
-
-public interface IRealBufferProvider
-{
- public void setRealBufferListener( Listener listener );
- public void removeRealBufferListener();
-}
diff --git a/src/sample/real/IUnFilteredRealBufferListener.java b/src/sample/real/IUnFilteredRealBufferListener.java
new file mode 100644
index 00000000..bce0f168
--- /dev/null
+++ b/src/sample/real/IUnFilteredRealBufferListener.java
@@ -0,0 +1,8 @@
+package sample.real;
+
+import sample.Listener;
+
+public interface IUnFilteredRealBufferListener
+{
+ public Listener getUnFilteredRealBufferListener();
+}
diff --git a/src/sample/real/IUnFilteredRealBufferProvider.java b/src/sample/real/IUnFilteredRealBufferProvider.java
new file mode 100644
index 00000000..764a5aeb
--- /dev/null
+++ b/src/sample/real/IUnFilteredRealBufferProvider.java
@@ -0,0 +1,9 @@
+package sample.real;
+
+import sample.Listener;
+
+public interface IUnFilteredRealBufferProvider
+{
+ public void setUnFilteredRealBufferListener( Listener listener );
+ public void removeUnFilteredRealBufferListener();
+}
diff --git a/src/settings/SettingsManager.java b/src/settings/SettingsManager.java
index ddcc4fa9..df430aa6 100644
--- a/src/settings/SettingsManager.java
+++ b/src/settings/SettingsManager.java
@@ -386,6 +386,12 @@ public class SettingsManager
}
MapIcon mapIcon = mIcons.get( name );
+
+ if( mapIcon == null )
+ {
+ mapIcon = new MapIcon( name, name );
+ mIcons.put( name, mapIcon );
+ }
if( mapIcon != null )
{
@@ -399,7 +405,7 @@ public class SettingsManager
}
else
{
- mResizedIcons.put( mergedName, mapIcon.getImageIcon() );
+ return mapIcon.getImageIcon();
}
}
diff --git a/src/source/ComplexSource.java b/src/source/ComplexSource.java
index eeb4084e..e7e1939c 100644
--- a/src/source/ComplexSource.java
+++ b/src/source/ComplexSource.java
@@ -6,8 +6,8 @@ import sample.complex.ComplexBuffer;
public abstract class ComplexSource extends Source implements Provider
{
- public ComplexSource( String name )
+ public ComplexSource()
{
- super( name, SampleType.COMPLEX );
+ super( SampleType.COMPLEX );
}
}
diff --git a/src/source/EmptySourceEditor.java b/src/source/EmptySourceEditor.java
index ad1c1669..04af856d 100644
--- a/src/source/EmptySourceEditor.java
+++ b/src/source/EmptySourceEditor.java
@@ -19,14 +19,15 @@ package source;
import javax.swing.JLabel;
+import controller.channel.Channel;
+import controller.channel.ConfigurationValidationException;
import source.config.SourceConfiguration;
-import controller.ResourceManager;
public class EmptySourceEditor extends SourceEditor
{
private static final long serialVersionUID = 1L;
- public EmptySourceEditor( ResourceManager resourceManager,
+ public EmptySourceEditor( SourceManager resourceManager,
SourceConfiguration config )
{
super( resourceManager, config );
@@ -43,4 +44,18 @@ public class EmptySourceEditor extends SourceEditor
JLabel selectLabel = new JLabel( "Please select a source" );
add( selectLabel );
}
+
+ @Override
+ public void setConfiguration( Channel channel )
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void validateConfiguration() throws ConfigurationValidationException
+ {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/src/source/FloatSource.java b/src/source/FloatSource.java
deleted file mode 100644
index c8161a9c..00000000
--- a/src/source/FloatSource.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package source;
-
-import sample.Provider;
-import sample.SampleType;
-
-public abstract class FloatSource extends Source implements Provider
-{
- public FloatSource( String name )
- {
- super( name, SampleType.REAL );
- }
-}
diff --git a/src/source/RealSource.java b/src/source/RealSource.java
index 6b09ccd5..b512bfbc 100644
--- a/src/source/RealSource.java
+++ b/src/source/RealSource.java
@@ -7,8 +7,8 @@ import sample.real.RealBuffer;
public abstract class RealSource extends Source implements Provider
{
- public RealSource( String name )
+ public RealSource()
{
- super( name, SampleType.REAL );
+ super( SampleType.REAL );
}
}
diff --git a/src/source/Source.java b/src/source/Source.java
index 064cc6ce..217def00 100644
--- a/src/source/Source.java
+++ b/src/source/Source.java
@@ -17,27 +17,21 @@
******************************************************************************/
package source;
+import module.Module;
import sample.SampleType;
/**
* Abstract class to define the minimum functionality of a sample data provider.
*/
-public abstract class Source
+public abstract class Source extends Module
{
- protected String mName;
protected SampleType mSampleType;
- public Source( String name, SampleType sampleType )
+ public Source( SampleType sampleType )
{
- mName = name;
mSampleType = sampleType;
}
- public String getName()
- {
- return mName;
- }
-
public abstract int getSampleRate() throws SourceException;
public abstract long getFrequency() throws SourceException;
diff --git a/src/source/SourceComponentEditor.java b/src/source/SourceComponentEditor.java
index c4d4e4a2..b4f3673a 100644
--- a/src/source/SourceComponentEditor.java
+++ b/src/source/SourceComponentEditor.java
@@ -1,6 +1,6 @@
/*******************************************************************************
* SDR Trunk
- * Copyright (C) 2014 Dennis Sheirer
+ * Copyright (C) 2014-2016 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -29,7 +29,8 @@ import net.miginfocom.swing.MigLayout;
import source.config.SourceConfigFactory;
import source.config.SourceConfiguration;
import controller.channel.AbstractChannelEditor;
-import controller.channel.ChannelNode;
+import controller.channel.Channel;
+import controller.channel.ConfigurationValidationException;
public class SourceComponentEditor extends AbstractChannelEditor
{
@@ -37,10 +38,13 @@ public class SourceComponentEditor extends AbstractChannelEditor
private JComboBox mComboSources;
private SourceEditor mEditor;
+ private SourceManager mSourceManager;
- public SourceComponentEditor( ChannelNode channelNode )
+ public SourceComponentEditor( SourceManager sourceManager, Channel channel )
{
- super( channelNode );
+ super( channel );
+
+ mSourceManager = sourceManager;
setLayout( new MigLayout( "fill,wrap 2", "[right,grow][grow]", "[][][grow]" ) );
@@ -57,11 +61,9 @@ public class SourceComponentEditor extends AbstractChannelEditor
{
SourceConfiguration config;
- if( selected == mChannelNode.getChannel()
- .getSourceConfiguration().getSourceType() )
+ if( selected == mChannel.getSourceConfiguration().getSourceType() )
{
- config = mChannelNode.getChannel()
- .getSourceConfiguration();
+ config = mChannel.getSourceConfiguration();
}
else
{
@@ -76,8 +78,7 @@ public class SourceComponentEditor extends AbstractChannelEditor
}
//Change to the new one
- mEditor = SourceEditorFactory.getPanel(
- mChannelNode.getModel().getResourceManager(), config );
+ mEditor = mSourceManager.getPanel( config );
//Add it to the jpanel
add( mEditor, "span 2" );
@@ -105,10 +106,10 @@ public class SourceComponentEditor extends AbstractChannelEditor
{
@Override
- public void run() {
+ public void run()
+ {
mComboSources.setSelectedItem(
- mChannelNode.getChannel()
- .getSourceConfiguration().getSourceType() );
+ mChannel.getSourceConfiguration().getSourceType() );
mComboSources.requestFocus();
@@ -123,7 +124,20 @@ public class SourceComponentEditor extends AbstractChannelEditor
mEditor.save();
//Let the calling save method send the config change event
- mChannelNode.getChannel()
- .setSourceConfiguration( mEditor.getConfig() );
+ mChannel.setSourceConfiguration( mEditor.getConfig() );
}
+
+ @Override
+ public void setConfiguration( Channel channel )
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void validateConfiguration() throws ConfigurationValidationException
+ {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/src/source/SourceEditor.java b/src/source/SourceEditor.java
index dd5ad11e..1cb15a64 100644
--- a/src/source/SourceEditor.java
+++ b/src/source/SourceEditor.java
@@ -18,19 +18,18 @@
package source;
import source.config.SourceConfiguration;
-import controller.Editor;
-import controller.ResourceManager;
+import controller.channel.ChannelConfigurationEditor;
-public abstract class SourceEditor extends Editor
+public abstract class SourceEditor extends ChannelConfigurationEditor
{
private static final long serialVersionUID = 1L;
- protected ResourceManager mResourceManager;
+ protected SourceManager mSourceManager;
protected SourceConfiguration mConfig;
- public SourceEditor( ResourceManager resourceManager, SourceConfiguration config )
+ public SourceEditor( SourceManager sourceManager, SourceConfiguration config )
{
- mResourceManager = resourceManager;
+ mSourceManager = sourceManager;
mConfig = config;
}
@@ -38,9 +37,9 @@ public abstract class SourceEditor extends Editor
{
return mConfig;
}
-
- public ResourceManager getResourceManager()
+
+ protected SourceManager getSourceManager()
{
- return mResourceManager;
+ return mSourceManager;
}
}
diff --git a/src/source/SourceEditorFactory.java b/src/source/SourceEditorFactory.java
deleted file mode 100644
index b918f79f..00000000
--- a/src/source/SourceEditorFactory.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * SDR Trunk
- * Copyright (C) 2014 Dennis Sheirer
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see
- ******************************************************************************/
-package source;
-
-import source.config.SourceConfiguration;
-import source.mixer.MixerEditor;
-import source.recording.RecordingEditor;
-import source.tuner.TunerEditor;
-import controller.ResourceManager;
-
-public class SourceEditorFactory
-{
- public static SourceEditor getPanel( ResourceManager resourceManager,
- SourceConfiguration config )
- {
- SourceEditor configuredPanel;
-
- switch( config.getSourceType() )
- {
- case MIXER:
- configuredPanel = new MixerEditor( resourceManager, config );
- break;
- case TUNER:
- configuredPanel = new TunerEditor( resourceManager, config );
- break;
- case RECORDING:
- configuredPanel = new RecordingEditor( resourceManager, config );
- break;
- case NONE:
- default:
- configuredPanel = new EmptySourceEditor( resourceManager, config );
- break;
- }
-
- return configuredPanel;
- }
-}
diff --git a/src/source/SourceManager.java b/src/source/SourceManager.java
index 8c783ab9..9fab09f4 100644
--- a/src/source/SourceManager.java
+++ b/src/source/SourceManager.java
@@ -17,27 +17,43 @@
******************************************************************************/
package source;
+import settings.SettingsManager;
import source.config.SourceConfiguration;
+import source.mixer.MixerEditor;
import source.mixer.MixerManager;
-import controller.ResourceManager;
+import source.recording.RecordingEditor;
+import source.recording.RecordingSourceManager;
+import source.tuner.TunerEditor;
+import source.tuner.TunerManager;
+import controller.ThreadPoolManager;
-public class SourceManager {
- /**
- * NOTE: each source will auto-start once a listener registers on it to
- * receive samples and should auto-stop once a listener de-registers
- *
- * Each channel object will handle the starting and stopping of each channel
- * processing chain.
- *
- * Source Manager will reach out to the MixerManager or the TunerManager
- * to get source objects to pass off to the channel object, as requested.
- */
-
- private ResourceManager mResourceManager;
+public class SourceManager
+{
+ private MixerManager mMixerManager;
+ private RecordingSourceManager mRecordingSourceManager;
+ private TunerManager mTunerManager;
- public SourceManager( ResourceManager resourceManager )
+ public SourceManager( SettingsManager settingsManager,
+ ThreadPoolManager threadPoolManager )
{
- mResourceManager = resourceManager;
+ mMixerManager = new MixerManager();
+ mRecordingSourceManager = new RecordingSourceManager( settingsManager, threadPoolManager );
+ mTunerManager = new TunerManager( mMixerManager, settingsManager, threadPoolManager );
+ }
+
+ public MixerManager getMixerManager()
+ {
+ return mMixerManager;
+ }
+
+ public RecordingSourceManager getRecordingSourceManager()
+ {
+ return mRecordingSourceManager;
+ }
+
+ public TunerManager getTunerManager()
+ {
+ return mTunerManager;
}
public Source getSource( SourceConfiguration config, int bandwidth )
@@ -48,14 +64,13 @@ public class SourceManager {
switch( config.getSourceType() )
{
case MIXER:
- retVal = MixerManager.getInstance().getSource( config );
+ retVal = mMixerManager.getSource( config );
break;
case TUNER:
- retVal = mResourceManager.getTunerManager().getSource( config, bandwidth );
+ retVal = mTunerManager.getSource( config, bandwidth );
break;
case RECORDING:
- retVal = mResourceManager.getRecordingSourceManager()
- .getSource( config, bandwidth );
+ retVal = mRecordingSourceManager.getSource( config, bandwidth );
case NONE:
default:
break;
@@ -63,4 +78,28 @@ public class SourceManager {
return retVal;
}
+
+ public SourceEditor getPanel( SourceConfiguration config )
+ {
+ SourceEditor configuredPanel;
+
+ switch( config.getSourceType() )
+ {
+ case MIXER:
+ configuredPanel = new MixerEditor( this, config );
+ break;
+ case TUNER:
+ configuredPanel = new TunerEditor( this, config );
+ break;
+ case RECORDING:
+ configuredPanel = new RecordingEditor( this, config );
+ break;
+ case NONE:
+ default:
+ configuredPanel = new EmptySourceEditor( this, config );
+ break;
+ }
+
+ return configuredPanel;
+ }
}
diff --git a/src/source/mixer/MixerEditor.java b/src/source/mixer/MixerEditor.java
index 3782213b..075068b6 100644
--- a/src/source/mixer/MixerEditor.java
+++ b/src/source/mixer/MixerEditor.java
@@ -24,11 +24,13 @@ import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JLabel;
+import controller.channel.Channel;
+import controller.channel.ConfigurationValidationException;
import source.SourceEditor;
+import source.SourceManager;
import source.config.SourceConfigMixer;
import source.config.SourceConfiguration;
import source.mixer.MixerManager.InputMixerConfiguration;
-import controller.ResourceManager;
public class MixerEditor extends SourceEditor
{
@@ -38,10 +40,10 @@ public class MixerEditor extends SourceEditor
protected Mixer.Info mSelectedMixer = null;
- public MixerEditor( ResourceManager resourceManager,
+ public MixerEditor( SourceManager sourceManager,
SourceConfiguration config )
{
- super( resourceManager, config );
+ super( sourceManager, config );
initGUI();
}
@@ -105,7 +107,8 @@ public class MixerEditor extends SourceEditor
@Override
public void run()
{
- InputMixerConfiguration[] mixers = MixerManager.getInstance().getInputMixers();
+ InputMixerConfiguration[] mixers = mSourceManager
+ .getMixerManager().getInputMixers();
mComboMixers.setModel(
new DefaultComboBoxModel( mixers ) );
@@ -155,4 +158,18 @@ public class MixerEditor extends SourceEditor
}
});
}
+
+ @Override
+ public void setConfiguration( Channel channel )
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void validateConfiguration() throws ConfigurationValidationException
+ {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/src/source/mixer/MixerManager.java b/src/source/mixer/MixerManager.java
index 298e760d..d7af001a 100644
--- a/src/source/mixer/MixerManager.java
+++ b/src/source/mixer/MixerManager.java
@@ -49,27 +49,15 @@ public class MixerManager
private final static Logger mLog =
LoggerFactory.getLogger( MixerManager.class );
- private static MixerManager sInstance = null;
-
private List mInputMixers = new ArrayList<>();
private List mOutputMixers = new ArrayList<>();
private HashMap mMixerTuners = new HashMap<>();
- private MixerManager()
+ public MixerManager()
{
loadMixers();
}
- public static MixerManager getInstance()
- {
- if( sInstance == null )
- {
- sInstance = new MixerManager();
- }
-
- return sInstance;
- }
-
public RealMixerSource getSource( SourceConfiguration config )
{
RealMixerSource retVal = null;
@@ -108,7 +96,6 @@ public class MixerManager
{
return new RealMixerSource( dataLine,
AudioFormats.PCM_SIGNED_48KHZ_16BITS_MONO,
- mixerName,
new ShortAdapter() );
}
}
@@ -137,7 +124,7 @@ public class MixerManager
{
return new RealMixerSource( dataLine,
AudioFormats.PCM_SIGNED_48KHZ_16BITS_STEREO,
- mixerName, new ChannelShortAdapter(
+ new ChannelShortAdapter(
mixerConfig.getChannel() ) );
}
}
diff --git a/src/source/mixer/RealMixerSource.java b/src/source/mixer/RealMixerSource.java
index 58b8d953..240e55bb 100644
--- a/src/source/mixer/RealMixerSource.java
+++ b/src/source/mixer/RealMixerSource.java
@@ -72,18 +72,30 @@ public class RealMixerSource extends RealSource
* the left/right stereo channels are inverted.
*/
public RealMixerSource( TargetDataLine targetDataLine,
- AudioFormat format,
- String name,
- ISampleAdapter sampleAdapter )
+ AudioFormat format,
+ ISampleAdapter sampleAdapter )
{
- super( name );
-
mTargetDataLine = targetDataLine;
mAudioFormat = format;
mSampleAdapter = sampleAdapter;
}
- public void setListener( Listener listener )
+ @Override
+ public void reset()
+ {
+ }
+
+ @Override
+ public void start()
+ {
+ }
+
+ @Override
+ public void stop()
+ {
+ }
+
+ public void setListener( Listener listener )
{
mSampleListeners.add( listener );
@@ -92,7 +104,7 @@ public class RealMixerSource extends RealSource
{
Thread thread = new Thread( mBufferReader );
thread.setDaemon( true );
- thread.setName( getName() + " Sample Reader" );
+ thread.setName( "Sample Reader" );
thread.start();
}
}
diff --git a/src/source/recording/Recording.java b/src/source/recording/Recording.java
index 90fad405..a3b1aba7 100644
--- a/src/source/recording/Recording.java
+++ b/src/source/recording/Recording.java
@@ -4,21 +4,20 @@ import java.io.File;
import java.util.ArrayList;
import java.util.concurrent.RejectedExecutionException;
+import settings.SettingsManager;
import source.SourceException;
import source.tuner.TunerChannel;
-import source.tuner.TunerChannelProvider;
+import source.tuner.ITunerChannelProvider;
import source.tuner.TunerChannelSource;
import source.tuner.frequency.FrequencyChangeEvent;
-import source.tuner.frequency.FrequencyChangeListener;
import source.tuner.frequency.FrequencyChangeEvent.Event;
-import controller.ResourceManager;
+import source.tuner.frequency.IFrequencyChangeProcessor;
import controller.ThreadPoolManager;
public class Recording implements Comparable,
- FrequencyChangeListener,
- TunerChannelProvider
+ IFrequencyChangeProcessor,
+ ITunerChannelProvider
{
- private ResourceManager mResourceManager;
private RecordingConfiguration mConfiguration;
private ArrayList mTunerChannels =
@@ -26,10 +25,12 @@ public class Recording implements Comparable,
private long mCenterFrequency;
- public Recording( ResourceManager resourceManager,
+ private SettingsManager mSettingsManager;
+
+ public Recording( SettingsManager settingsManager,
RecordingConfiguration configuration )
{
- mResourceManager = resourceManager;
+ mSettingsManager = settingsManager;
mConfiguration = configuration;
mCenterFrequency = mConfiguration.getCenterFrequency();
}
@@ -37,7 +38,7 @@ public class Recording implements Comparable,
public void setAlias( String alias )
{
mConfiguration.setAlias( alias );
- mResourceManager.getSettingsManager().save();
+ mSettingsManager.save();
}
public void setRecordingFile( File file ) throws SourceException
@@ -50,7 +51,7 @@ public class Recording implements Comparable,
}
mConfiguration.setFilePath( file.getAbsolutePath() );
- mResourceManager.getSettingsManager().save();
+ mSettingsManager.save();
}
/**
@@ -90,13 +91,13 @@ public class Recording implements Comparable,
@Override
public void frequencyChanged( FrequencyChangeEvent event )
{
- if( event.getEvent() == Event.FREQUENCY_CHANGE_NOTIFICATION )
+ if( event.getEvent() == Event.NOTIFICATION_FREQUENCY_CHANGE )
{
long frequency = event.getValue().longValue();
mConfiguration.setCenterFrequency( frequency );
- mResourceManager.getSettingsManager().save();
+ mSettingsManager.save();
mCenterFrequency = frequency;
diff --git a/src/source/recording/RecordingEditor.java b/src/source/recording/RecordingEditor.java
index aabec88f..a6be5cbe 100644
--- a/src/source/recording/RecordingEditor.java
+++ b/src/source/recording/RecordingEditor.java
@@ -26,11 +26,13 @@ import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
+import controller.channel.Channel;
+import controller.channel.ConfigurationValidationException;
import source.SourceEditor;
+import source.SourceManager;
import source.config.SourceConfigRecording;
import source.config.SourceConfigTuner;
import source.config.SourceConfiguration;
-import controller.ResourceManager;
public class RecordingEditor extends SourceEditor
{
@@ -38,10 +40,9 @@ public class RecordingEditor extends SourceEditor
private JComboBox mComboRecordings;
private JFrequencyControl mFrequencyControl;
- public RecordingEditor( ResourceManager resourceManager,
- SourceConfiguration config )
+ public RecordingEditor( SourceManager sourceManager, SourceConfiguration config )
{
- super( resourceManager, config );
+ super( sourceManager, config );
initGUI();
}
@@ -92,7 +93,7 @@ public class RecordingEditor extends SourceEditor
@Override
public void run()
{
- List recordings = getResourceManager()
+ List recordings = getSourceManager()
.getRecordingSourceManager().getRecordings();
mComboRecordings.setModel(
@@ -105,7 +106,7 @@ public class RecordingEditor extends SourceEditor
if( recordingAlias != null )
{
- Recording selected = mResourceManager
+ Recording selected = mSourceManager
.getRecordingSourceManager()
.getRecordingFromAlias( recordingAlias );
@@ -117,4 +118,18 @@ public class RecordingEditor extends SourceEditor
}
});
}
+
+ @Override
+ public void setConfiguration( Channel channel )
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void validateConfiguration() throws ConfigurationValidationException
+ {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/src/source/recording/RecordingGroupNode.java b/src/source/recording/RecordingGroupNode.java
index 8eb2029a..3e9d4631 100644
--- a/src/source/recording/RecordingGroupNode.java
+++ b/src/source/recording/RecordingGroupNode.java
@@ -24,17 +24,28 @@ import java.util.List;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
+import settings.SettingsManager;
+import source.SourceManager;
import controller.BaseNode;
public class RecordingGroupNode extends BaseNode
{
private static final long serialVersionUID = 1L;
-
- public RecordingGroupNode()
+
+ private SettingsManager mSettingsManager;
+
+ public RecordingGroupNode( SourceManager sourceManager, SettingsManager settingsManager )
{
- super( null );
+ super( sourceManager );
+
+ mSettingsManager = settingsManager;
}
+ private SourceManager getSourceManager()
+ {
+ return (SourceManager)getUserObject();
+ }
+
public String toString()
{
return "Recordings [" + this.getChildCount() + "]";
@@ -53,13 +64,12 @@ public class RecordingGroupNode extends BaseNode
{
RecordingConfiguration config = new RecordingConfiguration();
- getModel().getResourceManager().getSettingsManager()
- .addRecordingConfiguration( config );
+ mSettingsManager.addRecordingConfiguration( config );
- Recording recording = getModel().getResourceManager()
+ Recording recording = getSourceManager()
.getRecordingSourceManager().addRecording( config );
- RecordingNode node = new RecordingNode( recording );
+ RecordingNode node = new RecordingNode( getSourceManager(), recording );
getModel().addNode( node, RecordingGroupNode.this, 0 );
@@ -76,12 +86,12 @@ public class RecordingGroupNode extends BaseNode
public void loadRecordings()
{
- List recordings = getModel().getResourceManager()
+ List recordings = getSourceManager()
.getRecordingSourceManager().getRecordings();
for( Recording recording: recordings )
{
- RecordingNode node = new RecordingNode( recording );
+ RecordingNode node = new RecordingNode( getSourceManager(), recording );
getModel().addNode( node, this, 0 );
}
diff --git a/src/source/recording/RecordingNode.java b/src/source/recording/RecordingNode.java
index 54ec12fd..920602e3 100644
--- a/src/source/recording/RecordingNode.java
+++ b/src/source/recording/RecordingNode.java
@@ -8,6 +8,7 @@ import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
+import source.SourceManager;
import controller.BaseNode;
public class RecordingNode extends BaseNode
@@ -15,8 +16,10 @@ public class RecordingNode extends BaseNode
private static final long serialVersionUID = 1L;
private JPanel mEditor;
+
+ private SourceManager mSourceManager;
- public RecordingNode( Recording recording )
+ public RecordingNode( SourceManager sourceManager, Recording recording )
{
super( recording );
}
@@ -64,7 +67,7 @@ public class RecordingNode extends BaseNode
}
else
{
- getModel().getResourceManager().getRecordingSourceManager()
+ mSourceManager.getRecordingSourceManager()
.removeRecording( getRecording() );
getModel().removeNodeFromParent( RecordingNode.this );
diff --git a/src/source/recording/RecordingSourceManager.java b/src/source/recording/RecordingSourceManager.java
index 0fcabaef..8c2f444f 100644
--- a/src/source/recording/RecordingSourceManager.java
+++ b/src/source/recording/RecordingSourceManager.java
@@ -31,21 +31,23 @@ import source.config.SourceConfigRecording;
import source.config.SourceConfiguration;
import source.tuner.TunerChannel;
import source.tuner.TunerChannelSource;
-import controller.ResourceManager;
+import controller.ThreadPoolManager;
public class RecordingSourceManager
{
private final static Logger mLog =
LoggerFactory.getLogger( RecordingSourceManager.class );
- private ResourceManager mResourceManager;
-
private ArrayList mRecordings = new ArrayList();
- public RecordingSourceManager( ResourceManager resourceManager )
+ private SettingsManager mSettingsManager;
+ private ThreadPoolManager mThreadPoolManager;
+
+ public RecordingSourceManager( SettingsManager settingsManager,
+ ThreadPoolManager threadPoolManager )
{
- mResourceManager = resourceManager;
-
+ mSettingsManager = settingsManager;
+ mThreadPoolManager = threadPoolManager;
loadRecordings();
}
@@ -71,9 +73,7 @@ public class RecordingSourceManager
if( recording != null )
{
- retVal = recording.getChannel(
- mResourceManager.getThreadPoolManager(),
- tunerChannel );
+ retVal = recording.getChannel( mThreadPoolManager, tunerChannel );
}
else
{
@@ -116,7 +116,7 @@ public class RecordingSourceManager
public Recording addRecording( RecordingConfiguration config )
{
- Recording recording = new Recording( mResourceManager, config );
+ Recording recording = new Recording( mSettingsManager, config );
mRecordings.add( recording );
@@ -126,7 +126,7 @@ public class RecordingSourceManager
public void removeRecording( Recording recording )
{
/* Remove the config from the settings manager */
- mResourceManager.getSettingsManager().removeRecordingConfiguration(
+ mSettingsManager.removeRecordingConfiguration(
recording.getRecordingConfiguration() );
mRecordings.remove( recording );
@@ -134,24 +134,17 @@ public class RecordingSourceManager
private void loadRecordings()
{
- if( mResourceManager != null )
- {
- SettingsManager settingsManager = mResourceManager.getSettingsManager();
-
- if( settingsManager != null )
- {
- ArrayList recordingConfigurations =
- settingsManager.getRecordingConfigurations();
+ ArrayList recordingConfigurations =
+ mSettingsManager.getRecordingConfigurations();
- mLog.info( "discovered [" + recordingConfigurations.size() + "] recording configurations" );
-
- for( RecordingConfiguration config: recordingConfigurations )
- {
- Recording recording = new Recording( mResourceManager, config );
-
- mRecordings.add( recording );
- }
- }
- }
- }
+ mLog.info( "RecordingSourceManager - discovered [" +
+ recordingConfigurations.size() + "] recording configurations" );
+
+ for( RecordingConfiguration config: recordingConfigurations )
+ {
+ Recording recording = new Recording( mSettingsManager, config );
+
+ mRecordings.add( recording );
+ }
+ }
}
diff --git a/src/buffer/ShortComplexByteBuffer.java b/src/source/tuner/ITunerChannelProvider.java
similarity index 54%
rename from src/buffer/ShortComplexByteBuffer.java
rename to src/source/tuner/ITunerChannelProvider.java
index 2aff0558..06f7b2fa 100644
--- a/src/buffer/ShortComplexByteBuffer.java
+++ b/src/source/tuner/ITunerChannelProvider.java
@@ -1,6 +1,6 @@
/*******************************************************************************
* SDR Trunk
- * Copyright (C) 2014 Dennis Sheirer
+ * Copyright (C) 2014-2016 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -15,39 +15,31 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see
******************************************************************************/
-package buffer;
+package source.tuner;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Enumeration;
+import java.util.concurrent.RejectedExecutionException;
-import sample.complex.Complex;
+import source.SourceException;
+import controller.ThreadPoolManager;
-public class ShortComplexByteBuffer implements Enumeration
+public interface ITunerChannelProvider
{
- private ByteBuffer mByteBuffer;
-
- public ShortComplexByteBuffer( byte[] bytes, ByteOrder endianness )
- {
- mByteBuffer = ByteBuffer.wrap( bytes );
- mByteBuffer.order( endianness );
- }
-
- public byte[] array()
- {
- return mByteBuffer.array();
- }
+ /**
+ * Returns a tuner frequency channel source, tuned to the correct frequency
+ *
+ * @param frequency - desired frequency
+ *
+ * @return - source for 48k sample rate
+ */
+ public abstract TunerChannelSource getChannel( ThreadPoolManager threadPoolManager,
+ TunerChannel channel ) throws RejectedExecutionException, SourceException;
- @Override
- public boolean hasMoreElements()
- {
- return mByteBuffer.hasRemaining();
- }
-
- @Override
- public Complex nextElement()
- {
- return new Complex( (float)mByteBuffer.getShort(),
- (float)mByteBuffer.getShort() );
- }
+ /**
+ * Releases the tuned channel resources
+ *
+ * @param channel - previously obtained tuner channel
+ */
+ public abstract void releaseChannel( TunerChannelSource source );
+
+
}
diff --git a/src/source/tuner/Tuner.java b/src/source/tuner/Tuner.java
index e274c97f..805a3cb5 100644
--- a/src/source/tuner/Tuner.java
+++ b/src/source/tuner/Tuner.java
@@ -27,20 +27,18 @@ import org.slf4j.LoggerFactory;
import sample.Listener;
import sample.complex.ComplexBuffer;
+import settings.SettingsManager;
import source.SourceException;
-import source.tuner.frequency.FrequencyChangeBroadcaster;
import source.tuner.frequency.FrequencyChangeEvent;
-import source.tuner.frequency.FrequencyChangeListener;
import source.tuner.frequency.FrequencyChangeEvent.Event;
-import controller.ResourceManager;
+import source.tuner.frequency.IFrequencyChangeProcessor;
import controller.ThreadPoolManager;
/**
* Tuner - provides tuner channel sources, representing a channel frequency
*/
-public abstract class Tuner implements FrequencyChangeBroadcaster,
- FrequencyChangeListener,
- TunerChannelProvider
+public abstract class Tuner implements IFrequencyChangeProcessor,
+ ITunerChannelProvider
{
private final static Logger mLog = LoggerFactory.getLogger( Tuner.class );
@@ -53,8 +51,8 @@ public abstract class Tuner implements FrequencyChangeBroadcaster,
protected CopyOnWriteArrayList>
mSampleListeners = new CopyOnWriteArrayList>();
- protected CopyOnWriteArrayList
- mFrequencyChangeListeners = new CopyOnWriteArrayList();
+ protected CopyOnWriteArrayList
+ mFrequencyChangeProcessors = new CopyOnWriteArrayList();
public Tuner( String name )
{
@@ -69,7 +67,7 @@ public abstract class Tuner implements FrequencyChangeBroadcaster,
public void dispose()
{
mSampleListeners.clear();
- mFrequencyChangeListeners.clear();
+ mFrequencyChangeProcessors.clear();
}
public void setName( String name )
@@ -80,7 +78,7 @@ public abstract class Tuner implements FrequencyChangeBroadcaster,
/**
* Return an editor panel for the tuner
*/
- public abstract JPanel getEditor( ResourceManager resourceManager );
+ public abstract JPanel getEditor( SettingsManager settingsManager );
/**
@@ -191,17 +189,17 @@ public abstract class Tuner implements FrequencyChangeBroadcaster,
* Adds the frequency change listener to receive frequency and/or bandwidth
* change events
*/
- public void addListener( FrequencyChangeListener listener )
+ public void addFrequencyChangeProcessor( IFrequencyChangeProcessor processor )
{
- mFrequencyChangeListeners.add( listener );
+ mFrequencyChangeProcessors.add( processor );
}
/**
* Removes the frequency change listener
*/
- public void removeListener( FrequencyChangeListener listener )
+ public void removeFrequencyChangeProcessor( IFrequencyChangeProcessor processor )
{
- mFrequencyChangeListeners.remove( listener );
+ mFrequencyChangeProcessors.remove( processor );
}
/**
@@ -210,7 +208,7 @@ public abstract class Tuner implements FrequencyChangeBroadcaster,
public void broadcastFrequencyChange( long frequency )
{
broadcastFrequencyChangeEvent(
- new FrequencyChangeEvent( Event.FREQUENCY_CHANGE_NOTIFICATION, frequency ) );
+ new FrequencyChangeEvent( Event.NOTIFICATION_FREQUENCY_CHANGE, frequency ) );
}
/**
@@ -219,7 +217,7 @@ public abstract class Tuner implements FrequencyChangeBroadcaster,
public void broadcastSampleRateChange( int sampleRate )
{
broadcastFrequencyChangeEvent(
- new FrequencyChangeEvent( Event.SAMPLE_RATE_CHANGE_NOTIFICATION, sampleRate ) );
+ new FrequencyChangeEvent( Event.NOTIFICATION_SAMPLE_RATE_CHANGE, sampleRate ) );
}
/**
@@ -228,7 +226,7 @@ public abstract class Tuner implements FrequencyChangeBroadcaster,
public void broadcastActualSampleRateChange( int actualSampleRate )
{
broadcastFrequencyChangeEvent(
- new FrequencyChangeEvent( Event.SAMPLE_RATE_CHANGE_NOTIFICATION, actualSampleRate ) );
+ new FrequencyChangeEvent( Event.NOTIFICATION_SAMPLE_RATE_CHANGE, actualSampleRate ) );
}
/**
@@ -236,9 +234,9 @@ public abstract class Tuner implements FrequencyChangeBroadcaster,
*/
public void broadcastFrequencyChangeEvent( FrequencyChangeEvent event )
{
- for( FrequencyChangeListener listener: mFrequencyChangeListeners )
+ for( IFrequencyChangeProcessor processor: mFrequencyChangeProcessors )
{
- listener.frequencyChanged( event );
+ processor.frequencyChanged( event );
}
}
diff --git a/src/source/tuner/TunerChannelProvider.java b/src/source/tuner/TunerChannelProvider.java
deleted file mode 100644
index f8fabe48..00000000
--- a/src/source/tuner/TunerChannelProvider.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package source.tuner;
-
-import java.util.concurrent.RejectedExecutionException;
-
-import source.SourceException;
-import controller.ThreadPoolManager;
-
-public interface TunerChannelProvider
-{
- /**
- * Returns a tuner frequency channel source, tuned to the correct frequency
- *
- * @param frequency - desired frequency
- *
- * @return - source for 48k sample rate
- */
- public abstract TunerChannelSource getChannel( ThreadPoolManager threadPoolManager,
- TunerChannel channel ) throws RejectedExecutionException, SourceException;
-
- /**
- * Releases the tuned channel resources
- *
- * @param channel - previously obtained tuner channel
- */
- public abstract void releaseChannel( TunerChannelSource source );
-
-
-}
diff --git a/src/source/tuner/TunerChannelSource.java b/src/source/tuner/TunerChannelSource.java
index 0c61dc60..010a6f7b 100644
--- a/src/source/tuner/TunerChannelSource.java
+++ b/src/source/tuner/TunerChannelSource.java
@@ -1,6 +1,6 @@
/*******************************************************************************
* SDR Trunk
- * Copyright (C) 2014,2015 Dennis Sheirer
+ * Copyright (C) 2014-2016 Dennis Sheirer
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -36,7 +36,7 @@ import source.ComplexSource;
import source.SourceException;
import source.tuner.frequency.FrequencyChangeEvent;
import source.tuner.frequency.FrequencyChangeEvent.Event;
-import source.tuner.frequency.FrequencyChangeListener;
+import source.tuner.frequency.IFrequencyChangeProcessor;
import controller.ThreadPoolManager;
import controller.ThreadPoolManager.ThreadType;
import dsp.filter.FilterFactory;
@@ -45,8 +45,7 @@ import dsp.filter.cic.ComplexPrimeCICDecimate;
import dsp.mixer.Oscillator;
public class TunerChannelSource extends ComplexSource
- implements FrequencyChangeListener,
- Listener
+ implements IFrequencyChangeProcessor, Listener
{
private final static Logger mLog =
LoggerFactory.getLogger( TunerChannelSource.class );
@@ -61,7 +60,7 @@ public class TunerChannelSource extends ComplexSource
private Oscillator mMixer;
private ComplexPrimeCICDecimate mDecimationFilter;
private Listener mListener;
- private FrequencyChangeListener mFrequencyChangeListener;
+ private IFrequencyChangeProcessor mFrequencyChangeProcessor;
private ThreadPoolManager mThreadPoolManager;
private ScheduledFuture> mTaskHandle;
@@ -71,17 +70,35 @@ public class TunerChannelSource extends ComplexSource
private DecimationProcessor mDecimationProcessor = new DecimationProcessor();
- public TunerChannelSource( ThreadPoolManager threadPoolManager,
- Tuner tuner,
+ private AtomicBoolean mRunning = new AtomicBoolean();
+ private boolean mExpended = false;
+
+ /**
+ * Provides a Digital Drop Channel (DDC) to decimate the IQ output from a
+ * tuner down to a 48 kHz IQ channel rate.
+ *
+ * Note: this class can only be used once (started and stopped) and a new
+ * tuner channel source must be requested from the tuner once this object
+ * has been stopped. This is because channels are managed dynamically and
+ * center tuned frequency may have changed since this source was obtained
+ * and thus the tuner might no longer be able to source this channel once it
+ * has been stopped.
+ *
+ * @param threadPoolManager to use for decimation processing task
+ * @param tuner to obtain wideband IQ samples from
+ * @param tunerChannel specifying the center frequency for the DDC
+ * @throws RejectedExecutionException if the thread pool manager cannot
+ * accept the decimation processing task
+ * @throws SourceException if the tuner has an issue providing IQ samples
+ */
+ public TunerChannelSource( ThreadPoolManager threadPoolManager, Tuner tuner,
TunerChannel tunerChannel )
throws RejectedExecutionException, SourceException
{
- super( "Tuner Channel Source" );
-
mThreadPoolManager = threadPoolManager;
mTuner = tuner;
- mTuner.addListener( (FrequencyChangeListener)this );
+ mTuner.addListener( this );
mTunerChannel = tunerChannel;
@@ -94,59 +111,87 @@ public class TunerChannelSource extends ComplexSource
/* Fire a sample rate change event to setup the decimation chain */
frequencyChanged( new FrequencyChangeEvent(
- Event.SAMPLE_RATE_CHANGE_NOTIFICATION, mTuner.getSampleRate() ) );
-
- /* Schedule the decimation task to run every 20 ms (50 iterations/second) */
- mTaskHandle = mThreadPoolManager.scheduleFixedRate( ThreadType.DECIMATION,
- mDecimationProcessor, 20, TimeUnit.MILLISECONDS );
-
- /* Finally, register to receive samples from the tuner */
- mTuner.addListener( (Listener)this );
+ Event.NOTIFICATION_SAMPLE_RATE_CHANGE, mTuner.getSampleRate() ) );
}
+
@Override
+ public void reset()
+ {
+ }
+
+
+ @Override
+ public void start()
+ {
+ if( mExpended )
+ {
+ throw new IllegalStateException( "Attempt to re-start an expended "
+ + "tuner channel source. TunerChannelSource objects can only "
+ + "be used once. " );
+ }
+
+ if( mRunning.compareAndSet( false, true ))
+ {
+ /* Schedule the decimation task to run every 20 ms (50 iterations/second) */
+ mTaskHandle = mThreadPoolManager.scheduleFixedRate( ThreadType.DECIMATION,
+ mDecimationProcessor, 20, TimeUnit.MILLISECONDS );
+
+ /* Finally, register to receive samples from the tuner */
+ mTuner.addListener( (Listener)this );
+ }
+ else
+ {
+ mLog.warn( "Attempt to start() and already running tuner channel "
+ + "source was ignored" );
+ }
+ }
+
+
+ @Override
+ public void stop()
+ {
+ if( mRunning.compareAndSet( true, false ))
+ {
+ mTuner.releaseChannel( this );
+ mDecimationProcessor.shutdown();
+
+ if( mThreadPoolManager != null && mTaskHandle != null )
+ {
+ mThreadPoolManager.cancel( mTaskHandle );
+ mTaskHandle = null;
+ }
+
+ mBuffer.clear();
+
+ mExpended = true;
+ }
+ else
+ {
+ mLog.warn( "Attempt to stop() and already stopped tuner channel "
+ + "source was ignored" );
+ }
+ }
+
+
+ @Override
public void dispose()
{
- /* Tell the tuner to release/unregister our resources */
- mTuner.removeListener( (FrequencyChangeListener)this );
- mTuner.releaseChannel( this );
- mTuner = null;
- mTunerChannel = null;
-
- /* Flag the decimation processor to shutdown */
- if( mDecimationProcessor != null )
- {
- mDecimationProcessor.dispose();
- }
-
+ if( !mRunning.get() )
+ {
+ /* Tell the tuner to release/unregister our resources */
+ mTuner.removeFrequencyChangeProcessor( this );
+ mTuner = null;
+ mTunerChannel = null;
+ mBuffer = null;
+ mFrequencyChangeProcessor = null;
+ mListener = null;
+ mMixer = null;
+ mDecimationFilter.dispose();
+ mDecimationFilter = null;
+ }
}
- /**
- * Cleanup method to allow the decimation processor to perform final cleanup
- * once it gracefully shuts itself down
- */
- private void cleanup()
- {
- if( mTaskHandle != null )
- {
- mThreadPoolManager.cancel( mTaskHandle );
- mThreadPoolManager = null;
- mTaskHandle = null;
- }
-
-
- mBuffer.clear();
- mBuffer = null;
-
- mFrequencyChangeListener = null;
- mListener = null;
-
- mMixer = null;
-
- mDecimationFilter.dispose();
- mDecimationFilter = null;
- }
-
public Tuner getTuner()
{
return mTuner;
@@ -160,18 +205,21 @@ public class TunerChannelSource extends ComplexSource
@Override
public void receive( ComplexBuffer buffer )
{
- mBuffer.add( buffer );
+ if( mRunning.get() )
+ {
+ mBuffer.add( buffer );
+ }
}
- public void setFrequencyChangeListener( FrequencyChangeListener listener )
+ public void setFrequencyChangeListener( IFrequencyChangeProcessor processor )
{
- mFrequencyChangeListener = listener;
+ mFrequencyChangeProcessor = processor;
}
@Override
public void setListener( Listener listener )
{
- /* Get a pointer to the listener so that if we have to change the
+ /* Save a pointer to the listener so that if we have to change the
* decimation filter, we can re-add the listener */
mListener = listener;
@@ -192,31 +240,31 @@ public class TunerChannelSource extends ComplexSource
public void frequencyChanged( FrequencyChangeEvent event )
{
// Echo the event to the registered event listener
- if( mFrequencyChangeListener != null )
+ if( mFrequencyChangeProcessor != null )
{
- mFrequencyChangeListener.frequencyChanged( event );
+ mFrequencyChangeProcessor.frequencyChanged( event );
}
switch( event.getEvent() )
{
- case FREQUENCY_CHANGE_NOTIFICATION:
+ case NOTIFICATION_FREQUENCY_CHANGE:
mTunerFrequency = event.getValue().longValue();
updateMixerFrequencyOffset();
break;
- case CHANNEL_FREQUENCY_CORRECTION_CHANGE_REQUEST:
+ case REQUEST_CHANNEL_FREQUENCY_CORRECTION_CHANGE:
mChannelFrequencyCorrection = event.getValue().intValue();
updateMixerFrequencyOffset();
- if( mFrequencyChangeListener != null )
+ if( mFrequencyChangeProcessor != null )
{
- mFrequencyChangeListener.frequencyChanged(
+ mFrequencyChangeProcessor.frequencyChanged(
new FrequencyChangeEvent(
- Event.CHANNEL_FREQUENCY_CORRECTION_CHANGE_NOTIFICATION,
+ Event.NOTIFICATION_CHANNEL_FREQUENCY_CORRECTION_CHANGE,
mChannelFrequencyCorrection ) );
}
break;
- case SAMPLE_RATE_CHANGE_NOTIFICATION:
+ case NOTIFICATION_SAMPLE_RATE_CHANGE:
int sampleRate = event.getValue().intValue();
if( mTunerSampleRate != sampleRate )
@@ -272,12 +320,12 @@ public class TunerChannelSource extends ComplexSource
*/
public class DecimationProcessor implements Runnable
{
- private AtomicBoolean mDispose = new AtomicBoolean( false );
+ private boolean mProcessing = true;
private List mSampleBuffers = new ArrayList();
- public void dispose()
+ public void shutdown()
{
- mDispose.set( true );
+ mProcessing = false;
}
@Override
@@ -288,64 +336,66 @@ public class TunerChannelSource extends ComplexSource
* run the program out of memory */
try
{
- if( mBuffer != null )
+ if( mProcessing )
{
- mBuffer.drainTo( mSampleBuffers, 4 );
-
- for( Buffer buffer: mSampleBuffers )
+ if( mBuffer != null )
{
- /* Check to see if we've been shutdown */
- if( mDispose.get() )
+ mBuffer.drainTo( mSampleBuffers, 4 );
+
+ for( Buffer buffer: mSampleBuffers )
{
- cleanup();
- return;
- }
- else
- {
- float[] samples = buffer.getSamples();
-
- /* We make a copy of the buffer so that we don't affect
- * anyone else that is using the same buffer, like other
- * channels or the spectral display */
- float[] translated = new float[ samples.length ];
-
- /* Perform frequency translation */
- for( int x = 0; x < samples.length; x += 2 )
+ /* Check to see if we've been shutdown */
+ if( !mProcessing )
{
- mMixer.rotate();
+ mBuffer.clear();
+ return;
+ }
+ else
+ {
+ float[] samples = buffer.getSamples();
+
+ /* We make a copy of the buffer so that we don't affect
+ * anyone else that is using the same buffer, like other
+ * channels or the spectral display */
+ float[] translated = new float[ samples.length ];
- translated[ x ] = Complex.multiplyInphase(
- samples[ x ], samples[ x + 1 ], mMixer.inphase(), mMixer.quadrature() );
-
- translated[ x + 1 ] = Complex.multiplyQuadrature(
+ /* Perform frequency translation */
+ for( int x = 0; x < samples.length; x += 2 )
+ {
+ mMixer.rotate();
+
+ translated[ x ] = Complex.multiplyInphase(
samples[ x ], samples[ x + 1 ], mMixer.inphase(), mMixer.quadrature() );
- }
-
- if( mDecimationFilter != null )
- {
- mDecimationFilter.receive( new ComplexBuffer( translated ) );
+
+ translated[ x + 1 ] = Complex.multiplyQuadrature(
+ samples[ x ], samples[ x + 1 ], mMixer.inphase(), mMixer.quadrature() );
+ }
+
+ if( mProcessing && mDecimationFilter != null )
+ {
+ mDecimationFilter.receive( new ComplexBuffer( translated ) );
+ }
}
}
+
+ mSampleBuffers.clear();
}
-
- mSampleBuffers.clear();
}
}
catch( Exception e )
{
- /* Only log the stack trace if we've haven't been shutdown and
- * this is a true error */
- if( !mDispose.get() )
+ /* Only log the stack trace if we're still processing */
+ if( mProcessing )
{
mLog.error( "Error encountered during decimation process", e );
}
}
/* Check to see if we've been shutdown */
- if( mDispose.get() )
+ if( !mProcessing )
{
+ mBuffer.clear();
mSampleBuffers.clear();
- cleanup();
}
}
}
diff --git a/src/source/tuner/TunerController.java b/src/source/tuner/TunerController.java
index aacb5f6b..44682e7a 100644
--- a/src/source/tuner/TunerController.java
+++ b/src/source/tuner/TunerController.java
@@ -25,9 +25,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import source.SourceException;
-import source.tuner.frequency.FrequencyChangeListener;
import source.tuner.frequency.FrequencyController;
import source.tuner.frequency.FrequencyController.Tunable;
+import source.tuner.frequency.IFrequencyChangeProcessor;
+import source.tuner.frequency.IFrequencyChangeListener;
import controller.ThreadPoolManager;
public abstract class TunerController implements Tunable
@@ -36,7 +37,11 @@ public abstract class TunerController implements Tunable
LoggerFactory.getLogger( TunerController.class );
/* List of currently tuned channels being served to demod channels */
+<<<<<<< Upstream, based on origin/master
private SortedSet mTunedChannels = new ConcurrentSkipListSet<>();
+=======
+ protected ArrayList mTunedChannels = new ArrayList<>();
+>>>>>>> 20e3bee Work in progress. -Started work on new channel editor channel viewer/controller -Removed a number of unused buffer package classes -Moved automatic frequency control to be a module and removed special handling -Added IUnfilteredRealBufferListener & Provider interfaces -Completely removed the ResourceManager class
protected FrequencyController mFrequencyController;
private int mMiddleUnusable;
private double mUsableBandwidthPercentage;
@@ -359,16 +364,16 @@ public abstract class TunerController implements Tunable
* Note: this is normally used by the Tuner. Any additional listeners can
* be registered on the tuner.
*/
- public void addListener( FrequencyChangeListener listener )
+ public void addListener( IFrequencyChangeProcessor processor )
{
- mFrequencyController.addListener( listener );
+ mFrequencyController.addListener( processor );
}
/**
* Removes the frequency change listener
*/
- public void removeListener( FrequencyChangeListener listener )
+ public void removeListener( IFrequencyChangeProcessor processor )
{
- mFrequencyController.removeListener( listener );
+ mFrequencyController.removeFrequencyChangeProcessor( processor );
}
}
diff --git a/src/source/tuner/TunerEditor.java b/src/source/tuner/TunerEditor.java
index 15b3d650..2be792a1 100644
--- a/src/source/tuner/TunerEditor.java
+++ b/src/source/tuner/TunerEditor.java
@@ -17,21 +17,23 @@
******************************************************************************/
package source.tuner;
+import controller.channel.Channel;
+import controller.channel.ConfigurationValidationException;
import gui.control.JFrequencyControl;
import source.SourceEditor;
+import source.SourceManager;
import source.config.SourceConfigTuner;
import source.config.SourceConfiguration;
-import controller.ResourceManager;
public class TunerEditor extends SourceEditor
{
private static final long serialVersionUID = 1L;
private JFrequencyControl mFrequencyControl;
- public TunerEditor( ResourceManager resourceManager,
+ public TunerEditor( SourceManager sourceManager,
SourceConfiguration config )
{
- super( resourceManager, config );
+ super( sourceManager, config );
initGUI();
}
@@ -56,4 +58,18 @@ public class TunerEditor extends SourceEditor
add( mFrequencyControl );
}
+
+ @Override
+ public void setConfiguration( Channel channel )
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void validateConfiguration() throws ConfigurationValidationException
+ {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/src/source/tuner/TunerManager.java b/src/source/tuner/TunerManager.java
index 345757f3..3d6f351c 100644
--- a/src/source/tuner/TunerManager.java
+++ b/src/source/tuner/TunerManager.java
@@ -30,6 +30,7 @@ import org.usb4java.DeviceDescriptor;
import org.usb4java.DeviceList;
import org.usb4java.LibUsb;
+import settings.SettingsManager;
import source.Source;
import source.SourceException;
import source.config.SourceConfigTuner;
@@ -46,22 +47,25 @@ import source.tuner.rtl.RTL2832Tuner;
import source.tuner.rtl.RTL2832TunerController;
import source.tuner.rtl.e4k.E4KTunerController;
import source.tuner.rtl.r820t.R820TTunerController;
-import controller.ResourceManager;
+import controller.ThreadPoolManager;
public class TunerManager
{
private final static Logger mLog =
LoggerFactory.getLogger( TunerManager.class );
- private ResourceManager mResourceManager;
private ArrayList mTuners = new ArrayList();
+
+ private MixerManager mMixerManager;
+ private SettingsManager mSettingsManager;
+ private ThreadPoolManager mThreadPoolManager;
- public TunerManager( ResourceManager resourceManager )
+ public TunerManager( MixerManager mixerManager,
+ SettingsManager settingsManager,
+ ThreadPoolManager threadPoolManager )
{
- mResourceManager = resourceManager;
-
- /* initialize mixers */
- MixerManager.getInstance();
+ mSettingsManager = settingsManager;
+ mThreadPoolManager = threadPoolManager;
initTuners();
}
@@ -100,8 +104,7 @@ public class TunerManager
try
{
- retVal = tuner.getChannel(
- mResourceManager.getThreadPoolManager(), tunerChannel );
+ retVal = tuner.getChannel( mThreadPoolManager, tunerChannel );
}
catch ( RejectedExecutionException ree )
{
@@ -261,7 +264,7 @@ public class TunerManager
try
{
AirspyTunerController airspyController =
- new AirspyTunerController( device, mResourceManager.getThreadPoolManager() );
+ new AirspyTunerController( device, mThreadPoolManager );
airspyController.init();
@@ -397,7 +400,7 @@ public class TunerManager
{
HackRFTunerController hackRFController =
new HackRFTunerController( device, descriptor,
- mResourceManager.getThreadPoolManager() );
+ mThreadPoolManager );
hackRFController.init();
@@ -449,7 +452,7 @@ public class TunerManager
{
E4KTunerController controller =
new E4KTunerController( device, deviceDescriptor,
- mResourceManager.getThreadPoolManager() );
+ mThreadPoolManager );
controller.init();
@@ -476,7 +479,7 @@ public class TunerManager
{
R820TTunerController controller =
new R820TTunerController( device, deviceDescriptor,
- mResourceManager.getThreadPoolManager() );
+ mThreadPoolManager );
controller.init();
@@ -526,12 +529,11 @@ public class TunerManager
*/
private TunerConfiguration getTunerConfiguration( Tuner tuner )
{
- TunerConfigurationAssignment selected = mResourceManager
- .getSettingsManager().getSelectedTunerConfiguration(
- tuner.getTunerType(), tuner.getUniqueID() );
+ TunerConfigurationAssignment selected = mSettingsManager
+ .getSelectedTunerConfiguration( tuner.getTunerType(), tuner.getUniqueID() );
- ArrayList configs = mResourceManager
- .getSettingsManager().getTunerConfigurations( tuner.getTunerType() );
+ ArrayList configs = mSettingsManager
+ .getTunerConfigurations( tuner.getTunerType() );
TunerConfiguration config = null;
@@ -553,13 +555,13 @@ public class TunerManager
//If we're still null at this point, create a default config
if( config == null )
{
- config = mResourceManager.getSettingsManager()
- .addNewTunerConfiguration( tuner.getTunerType(), "Default" );
+ config = mSettingsManager.addNewTunerConfiguration(
+ tuner.getTunerType(), "Default" );
}
//Persist the config as the selected tuner configuration. The method
//auto-saves the setting
- mResourceManager.getSettingsManager().setSelectedTunerConfiguration(
+ mSettingsManager.setSelectedTunerConfiguration(
tuner.getTunerType(), tuner.getUniqueID(), config );
return config;
@@ -579,7 +581,7 @@ public class TunerManager
private MixerTunerDataLine getMixerTunerDataLine( TunerType tunerClass )
{
Collection datalines =
- MixerManager.getInstance().getMixerTunerDataLines();
+ mMixerManager.getMixerTunerDataLines();
for( MixerTunerDataLine mixerTDL: datalines )
{
diff --git a/src/source/tuner/TunerNode.java b/src/source/tuner/TunerNode.java
index 626cda6b..63aabd9c 100644
--- a/src/source/tuner/TunerNode.java
+++ b/src/source/tuner/TunerNode.java
@@ -28,15 +28,17 @@ import javax.swing.JPopupMenu;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import playlist.PlaylistManager;
+import settings.SettingsManager;
import source.SourceException;
import source.tuner.frequency.FrequencyChangeEvent;
-import source.tuner.frequency.FrequencyChangeListener;
+import source.tuner.frequency.IFrequencyChangeProcessor;
import spectrum.SpectrumFrame;
import controller.BaseNode;
-import controller.ResourceManager;
import controller.channel.ChannelModel;
+import controller.channel.ChannelProcessingManager;
-public class TunerNode extends BaseNode implements FrequencyChangeListener
+public class TunerNode extends BaseNode implements IFrequencyChangeProcessor
{
private final static Logger mLog =
LoggerFactory.getLogger( TunerNode.class );
@@ -48,14 +50,24 @@ public class TunerNode extends BaseNode implements FrequencyChangeListener
private long mFrequency;
private int mSampleRate;
private ChannelModel mChannelModel;
+ private ChannelProcessingManager mChannelProcessingManager;
+ private PlaylistManager mPlaylistManager;
+ private SettingsManager mSettingsManager;
- public TunerNode( ChannelModel channelModel, Tuner tuner )
+ public TunerNode( ChannelModel channelModel,
+ ChannelProcessingManager channelProcessingManager,
+ PlaylistManager playlistManager,
+ SettingsManager settingsManager,
+ Tuner tuner )
{
super( tuner ); //does this make it a super tuner?
mChannelModel = channelModel;
+ mChannelProcessingManager = channelProcessingManager;
+ mPlaylistManager = playlistManager;
+ mSettingsManager = settingsManager;
- tuner.addListener( this );
+ tuner.addFrequencyChangeProcessor( this );
try
{
@@ -72,7 +84,7 @@ public class TunerNode extends BaseNode implements FrequencyChangeListener
@Override
public JPanel getEditor()
{
- return getTuner().getEditor( getModel().getResourceManager() );
+ return getTuner().getEditor( mSettingsManager );
}
public Tuner getTuner()
@@ -117,11 +129,9 @@ public class TunerNode extends BaseNode implements FrequencyChangeListener
@Override
public void actionPerformed( ActionEvent e )
{
- ResourceManager rm = getModel().getResourceManager();
-
- SpectrumFrame frame = new SpectrumFrame( mChannelModel,
- rm.getController(), rm.getPlaylistManager(),
- rm.getSettingsManager(), getTuner() );
+ SpectrumFrame frame = new SpectrumFrame( getModel(), mChannelModel,
+ mChannelProcessingManager, mPlaylistManager,
+ mSettingsManager, getTuner() );
}
} );
@@ -135,7 +145,7 @@ public class TunerNode extends BaseNode implements FrequencyChangeListener
{
switch( event.getEvent() )
{
- case FREQUENCY_CHANGE_NOTIFICATION:
+ case NOTIFICATION_FREQUENCY_CHANGE:
long frequency = event.getValue().longValue();
if( mFrequency != frequency )
@@ -144,7 +154,7 @@ public class TunerNode extends BaseNode implements FrequencyChangeListener
getModel().nodeChanged( TunerNode.this );
}
break;
- case SAMPLE_RATE_CHANGE_NOTIFICATION:
+ case NOTIFICATION_SAMPLE_RATE_CHANGE:
int sampleRate = event.getValue().intValue();
if( mSampleRate != sampleRate )
diff --git a/src/source/tuner/airspy/AirspyTuner.java b/src/source/tuner/airspy/AirspyTuner.java
index 36df0315..345b3456 100644
--- a/src/source/tuner/airspy/AirspyTuner.java
+++ b/src/source/tuner/airspy/AirspyTuner.java
@@ -26,6 +26,7 @@ import org.slf4j.LoggerFactory;
import sample.Listener;
import sample.complex.ComplexBuffer;
+import settings.SettingsManager;
import source.SourceException;
import source.tuner.Tuner;
import source.tuner.TunerChannel;
@@ -34,7 +35,6 @@ import source.tuner.TunerClass;
import source.tuner.TunerConfiguration;
import source.tuner.TunerType;
import source.tuner.airspy.AirspyTunerController.BoardID;
-import controller.ResourceManager;
import controller.ThreadPoolManager;
public class AirspyTuner extends Tuner
@@ -55,9 +55,9 @@ public class AirspyTuner extends Tuner
}
@Override
- public JPanel getEditor( ResourceManager resourceManager )
+ public JPanel getEditor( SettingsManager settingsManager )
{
- return new AirspyTunerEditorPanel( this, resourceManager );
+ return new AirspyTunerEditorPanel( this, settingsManager );
}
public AirspyTunerController getController()
diff --git a/src/source/tuner/airspy/AirspyTunerConfigurationPanel.java b/src/source/tuner/airspy/AirspyTunerConfigurationPanel.java
index e2d31475..937a63f8 100644
--- a/src/source/tuner/airspy/AirspyTunerConfigurationPanel.java
+++ b/src/source/tuner/airspy/AirspyTunerConfigurationPanel.java
@@ -45,13 +45,13 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.usb4java.LibUsbException;
+import settings.SettingsManager;
import source.SourceException;
import source.tuner.TunerConfiguration;
import source.tuner.TunerConfigurationAssignment;
import source.tuner.TunerType;
import source.tuner.airspy.AirspyTunerController.Gain;
import source.tuner.airspy.AirspyTunerController.GainMode;
-import controller.ResourceManager;
public class AirspyTunerConfigurationPanel extends JPanel
{
@@ -60,7 +60,7 @@ public class AirspyTunerConfigurationPanel extends JPanel
private static final long serialVersionUID = 1L;
- private ResourceManager mResourceManager;
+ private SettingsManager mSettingsManager;
private AirspyTunerController mController;
private AirspyTunerConfiguration mSelectedConfig;
@@ -94,10 +94,10 @@ public class AirspyTunerConfigurationPanel extends JPanel
private JSlider mMixerGain;
- public AirspyTunerConfigurationPanel( ResourceManager resourceManager,
+ public AirspyTunerConfigurationPanel( SettingsManager settingsManager,
AirspyTunerController controller )
{
- mResourceManager = resourceManager;
+ mSettingsManager = settingsManager;
mController = controller;
init();
@@ -126,8 +126,7 @@ public class AirspyTunerConfigurationPanel extends JPanel
if( serial != null )
{
- savedConfig = mResourceManager
- .getSettingsManager().getSelectedTunerConfiguration(
+ savedConfig = mSettingsManager.getSelectedTunerConfiguration(
TunerType.AIRSPY_R820T, serial );
}
@@ -146,8 +145,7 @@ public class AirspyTunerConfigurationPanel extends JPanel
if( serial != null )
{
- mResourceManager.getSettingsManager()
- .setSelectedTunerConfiguration( TunerType.AIRSPY_R820T,
+ mSettingsManager.setSelectedTunerConfiguration( TunerType.AIRSPY_R820T,
serial, mSelectedConfig );
}
}
@@ -518,8 +516,7 @@ public class AirspyTunerConfigurationPanel extends JPanel
public void actionPerformed( ActionEvent e )
{
TunerConfiguration config =
- mResourceManager.getSettingsManager()
- .addNewTunerConfiguration(
+ mSettingsManager.addNewTunerConfiguration(
TunerType.AIRSPY_R820T,
"New Configuration" );
@@ -558,8 +555,7 @@ public class AirspyTunerConfigurationPanel extends JPanel
if( n == JOptionPane.YES_OPTION )
{
- mResourceManager.getSettingsManager()
- .deleteTunerConfiguration( selected );
+ mSettingsManager.deleteTunerConfiguration( selected );
mComboConfigurations.setModel( getModel() );
@@ -635,7 +631,7 @@ public class AirspyTunerConfigurationPanel extends JPanel
mGainModeCombo.setSelectedItem( Gain.getGainMode( gain ) );
mGain.setValue( gain.getValue() );
- mResourceManager.getSettingsManager().setSelectedTunerConfiguration(
+ mSettingsManager.setSelectedTunerConfiguration(
TunerType.AIRSPY_R820T, mController.getDeviceInfo().getSerialNumber(), config );
save();
@@ -661,8 +657,7 @@ public class AirspyTunerConfigurationPanel extends JPanel
private ComboBoxModel getModel()
{
ArrayList configs =
- mResourceManager.getSettingsManager()
- .getTunerConfigurations( TunerType.AIRSPY_R820T );
+ mSettingsManager.getTunerConfigurations( TunerType.AIRSPY_R820T );
DefaultComboBoxModel model =
new DefaultComboBoxModel();
@@ -681,8 +676,7 @@ public class AirspyTunerConfigurationPanel extends JPanel
private AirspyTunerConfiguration getNamedConfiguration( String name )
{
ArrayList configs =
- mResourceManager.getSettingsManager()
- .getTunerConfigurations( TunerType.AIRSPY_R820T );
+ mSettingsManager.getTunerConfigurations( TunerType.AIRSPY_R820T );
for( TunerConfiguration config: configs )
{
@@ -700,6 +694,6 @@ public class AirspyTunerConfigurationPanel extends JPanel
*/
private void save()
{
- mResourceManager.getSettingsManager().save();
+ mSettingsManager.save();
}
}
diff --git a/src/source/tuner/airspy/AirspyTunerEditorPanel.java b/src/source/tuner/airspy/AirspyTunerEditorPanel.java
index d15037f7..7305fce4 100644
--- a/src/source/tuner/airspy/AirspyTunerEditorPanel.java
+++ b/src/source/tuner/airspy/AirspyTunerEditorPanel.java
@@ -29,17 +29,16 @@ import net.miginfocom.swing.MigLayout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import settings.SettingsManager;
import source.SourceException;
import source.tuner.frequency.FrequencyChangeEvent;
import source.tuner.frequency.FrequencyChangeEvent.Event;
-import source.tuner.frequency.FrequencyChangeListener;
+import source.tuner.frequency.IFrequencyChangeProcessor;
import com.jidesoft.swing.JideTabbedPane;
-import controller.ResourceManager;
-
public class AirspyTunerEditorPanel extends JPanel
- implements FrequencyChangeListener
+ implements IFrequencyChangeProcessor
{
private static final long serialVersionUID = 1L;
@@ -50,14 +49,14 @@ public class AirspyTunerEditorPanel extends JPanel
private AirspyTuner mTuner;
private AirspyTunerController mController;
- private ResourceManager mResourceManager;
+ private SettingsManager mSettingsManager;
public AirspyTunerEditorPanel( AirspyTuner tuner,
- ResourceManager resourceManager )
+ SettingsManager settingsManager )
{
mTuner = tuner;
mController = mTuner.getController();
- mResourceManager = resourceManager;
+ mSettingsManager = settingsManager;
initGUI();
}
@@ -76,7 +75,7 @@ public class AirspyTunerEditorPanel extends JPanel
/* Add frequency control as frequency change listener. This creates a
* feedback loop, so the control does not rebroadcast the event */
- mTuner.addListener( mFrequencyControl );
+ mTuner.addFrequencyChangeProcessor( mFrequencyControl );
mFrequencyControl.setFrequency( mController.getFrequency(), false );
@@ -89,7 +88,7 @@ public class AirspyTunerEditorPanel extends JPanel
add( tabs, "span,grow,push" );
tabs.add( "Config", new AirspyTunerConfigurationPanel(
- mResourceManager, mTuner.getController() ) );
+ mSettingsManager, mTuner.getController() ) );
tabs.add( "Info", new AirspyInformationPanel( mTuner.getController() ) );
}
@@ -97,7 +96,7 @@ public class AirspyTunerEditorPanel extends JPanel
@Override
public void frequencyChanged( FrequencyChangeEvent event )
{
- if( event.getEvent() == Event.FREQUENCY_CHANGE_NOTIFICATION )
+ if( event.getEvent() == Event.NOTIFICATION_FREQUENCY_CHANGE )
{
try
{
diff --git a/src/source/tuner/ettus/B100Tuner.java b/src/source/tuner/ettus/B100Tuner.java
index 9ec27054..11cbc94f 100644
--- a/src/source/tuner/ettus/B100Tuner.java
+++ b/src/source/tuner/ettus/B100Tuner.java
@@ -24,6 +24,7 @@ import javax.swing.JPanel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import settings.SettingsManager;
import source.SourceException;
import source.tuner.Tuner;
import source.tuner.TunerChannel;
@@ -32,7 +33,6 @@ import source.tuner.TunerClass;
import source.tuner.TunerConfiguration;
import source.tuner.TunerType;
import source.tuner.usb.USBTunerDevice;
-import controller.ResourceManager;
import controller.ThreadPoolManager;
public class B100Tuner extends Tuner
@@ -69,9 +69,9 @@ public class B100Tuner extends Tuner
}
@Override
- public JPanel getEditor( ResourceManager resourceManager )
+ public JPanel getEditor( SettingsManager settingsManager )
{
- return new B100TunerEditorPanel( this, resourceManager );
+ return new B100TunerEditorPanel( this, settingsManager );
}
@Override
diff --git a/src/source/tuner/ettus/B100TunerEditorPanel.java b/src/source/tuner/ettus/B100TunerEditorPanel.java
index 964ac4ee..aadd2fec 100644
--- a/src/source/tuner/ettus/B100TunerEditorPanel.java
+++ b/src/source/tuner/ettus/B100TunerEditorPanel.java
@@ -22,19 +22,19 @@ import javax.swing.JLabel;
import javax.swing.JPanel;
import net.miginfocom.swing.MigLayout;
-import controller.ResourceManager;
+import settings.SettingsManager;
public class B100TunerEditorPanel extends JPanel
{
private static final long serialVersionUID = 1L;
private B100Tuner mTuner;
- private ResourceManager mResourceManager;
+ private SettingsManager mSettingsManager;
- public B100TunerEditorPanel( B100Tuner tuner, ResourceManager resourceManager )
+ public B100TunerEditorPanel( B100Tuner tuner, SettingsManager settingsManager )
{
mTuner = tuner;
- mResourceManager = resourceManager;
+ mSettingsManager = settingsManager;
init();
}
diff --git a/src/source/tuner/fcd/FCDTuner.java b/src/source/tuner/fcd/FCDTuner.java
index ea84063c..e3d680a5 100644
--- a/src/source/tuner/fcd/FCDTuner.java
+++ b/src/source/tuner/fcd/FCDTuner.java
@@ -24,6 +24,7 @@ import javax.swing.JPanel;
import sample.Listener;
import sample.adapter.ShortAdapter;
import sample.complex.ComplexBuffer;
+import settings.SettingsManager;
import source.SourceException;
import source.tuner.MixerTuner;
import source.tuner.MixerTunerDataLine;
@@ -32,8 +33,6 @@ import source.tuner.TunerChannelSource;
import source.tuner.TunerClass;
import source.tuner.TunerConfiguration;
import source.tuner.TunerType;
-import source.tuner.frequency.FrequencyChangeListener;
-import controller.ResourceManager;
import controller.ThreadPoolManager;
public class FCDTuner extends MixerTuner
@@ -48,7 +47,7 @@ public class FCDTuner extends MixerTuner
new ShortAdapter() );
mController = controller;
- mController.addListener( (FrequencyChangeListener)this );
+ mController.addListener( this );
}
public void dispose()
@@ -82,9 +81,9 @@ public class FCDTuner extends MixerTuner
}
@Override
- public JPanel getEditor( ResourceManager resourceManager )
+ public JPanel getEditor( SettingsManager settingsManager )
{
- return mController.getEditor( this, resourceManager );
+ return mController.getEditor( this, settingsManager );
}
@Override
diff --git a/src/source/tuner/fcd/FCDTunerController.java b/src/source/tuner/fcd/FCDTunerController.java
index 8e6ff030..ca602ed2 100644
--- a/src/source/tuner/fcd/FCDTunerController.java
+++ b/src/source/tuner/fcd/FCDTunerController.java
@@ -33,13 +33,13 @@ import org.usb4java.DeviceHandle;
import org.usb4java.LibUsb;
import org.usb4java.LibUsbException;
+import settings.SettingsManager;
import source.SourceException;
import source.tuner.TunerClass;
import source.tuner.TunerConfiguration;
import source.tuner.TunerController;
import source.tuner.TunerType;
import source.tuner.fcd.proV1.FCD1TunerController.Block;
-import controller.ResourceManager;
public abstract class FCDTunerController extends TunerController
{
@@ -150,7 +150,7 @@ public abstract class FCDTunerController extends TunerController
* Editor panel (GUI) component.
*/
public abstract JPanel getEditor( FCDTuner tuner,
- ResourceManager resourceManager );
+ SettingsManager settingsManager );
/**
* Applies the settings in the tuner configuration
diff --git a/src/source/tuner/fcd/proV1/FCD1TunerConfigurationPanel.java b/src/source/tuner/fcd/proV1/FCD1TunerConfigurationPanel.java
index bfbe7fbb..b54bef0b 100644
--- a/src/source/tuner/fcd/proV1/FCD1TunerConfigurationPanel.java
+++ b/src/source/tuner/fcd/proV1/FCD1TunerConfigurationPanel.java
@@ -47,6 +47,7 @@ import net.miginfocom.swing.MigLayout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import settings.SettingsManager;
import source.SourceException;
import source.tuner.TunerConfiguration;
import source.tuner.TunerType;
@@ -56,15 +57,13 @@ import source.tuner.fcd.proV1.FCD1TunerController.MixerGain;
import com.jidesoft.swing.JideTabbedPane;
-import controller.ResourceManager;
-
public class FCD1TunerConfigurationPanel extends JPanel
{
private final static Logger mLog =
LoggerFactory.getLogger( FCD1TunerConfigurationPanel.class );
private static final long serialVersionUID = 1L;
- private ResourceManager mResourceManager;
+ private SettingsManager mSettingsManager;
private FCD1TunerController mController;
private FCD1TunerConfiguration mSelectedConfig;
@@ -81,10 +80,10 @@ public class FCD1TunerConfigurationPanel extends JPanel
private CorrectionSpinner mCorrectionGain;
private CorrectionSpinner mCorrectionPhase;
- public FCD1TunerConfigurationPanel( ResourceManager resourceManager,
+ public FCD1TunerConfigurationPanel( SettingsManager settingsManager,
FCD1TunerController controller )
{
- mResourceManager = resourceManager;
+ mSettingsManager = settingsManager;
mController = controller;
mSelectedConfig = controller.getTunerConfiguration();
@@ -428,8 +427,7 @@ public class FCD1TunerConfigurationPanel extends JPanel
public void actionPerformed( ActionEvent e )
{
TunerConfiguration config =
- mResourceManager.getSettingsManager()
- .addNewTunerConfiguration(
+ mSettingsManager.addNewTunerConfiguration(
TunerType.FUNCUBE_DONGLE_PRO,
"New Configuration" );
@@ -472,8 +470,7 @@ public class FCD1TunerConfigurationPanel extends JPanel
if( n == JOptionPane.YES_OPTION )
{
- mResourceManager.getSettingsManager()
- .deleteTunerConfiguration( selected );
+ mSettingsManager.deleteTunerConfiguration( selected );
mComboConfigurations.setModel( getModel() );
@@ -508,8 +505,7 @@ public class FCD1TunerConfigurationPanel extends JPanel
mCorrectionGain.setValue( config.getGainCorrection() );
mCorrectionPhase.setValue( config.getPhaseCorrection() );
- mResourceManager.getSettingsManager()
- .setSelectedTunerConfiguration(
+ mSettingsManager.setSelectedTunerConfiguration(
TunerType.FUNCUBE_DONGLE_PRO,
mController.getUSBAddress(), config );
}
@@ -529,8 +525,7 @@ public class FCD1TunerConfigurationPanel extends JPanel
private ComboBoxModel getModel()
{
ArrayList configs =
- mResourceManager.getSettingsManager()
- .getTunerConfigurations( TunerType.FUNCUBE_DONGLE_PRO );
+ mSettingsManager.getTunerConfigurations( TunerType.FUNCUBE_DONGLE_PRO );
DefaultComboBoxModel model =
new DefaultComboBoxModel();
@@ -547,8 +542,7 @@ public class FCD1TunerConfigurationPanel extends JPanel
private FCD1TunerConfiguration getNamedConfiguration( String name )
{
ArrayList configs =
- mResourceManager.getSettingsManager()
- .getTunerConfigurations( TunerType.FUNCUBE_DONGLE_PRO );
+ mSettingsManager.getTunerConfigurations( TunerType.FUNCUBE_DONGLE_PRO );
for( TunerConfiguration config: configs )
{
@@ -563,7 +557,7 @@ public class FCD1TunerConfigurationPanel extends JPanel
private void save()
{
- mResourceManager.getSettingsManager().save();
+ mSettingsManager.save();
}
public enum Correction { GAIN, PHASE, DC_INPHASE, DC_QUADRATURE };
diff --git a/src/source/tuner/fcd/proV1/FCD1TunerController.java b/src/source/tuner/fcd/proV1/FCD1TunerController.java
index 9d56b0f4..8de3053c 100644
--- a/src/source/tuner/fcd/proV1/FCD1TunerController.java
+++ b/src/source/tuner/fcd/proV1/FCD1TunerController.java
@@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory;
import org.usb4java.Device;
import org.usb4java.DeviceDescriptor;
+import settings.SettingsManager;
import source.SourceException;
import source.tuner.TunerClass;
import source.tuner.TunerConfiguration;
@@ -36,7 +37,6 @@ import source.tuner.TunerType;
import source.tuner.fcd.FCDCommand;
import source.tuner.fcd.FCDTuner;
import source.tuner.fcd.FCDTunerController;
-import controller.ResourceManager;
public class FCD1TunerController extends FCDTunerController
{
@@ -148,11 +148,11 @@ public class FCD1TunerController extends FCDTunerController
}
@Override
- public JPanel getEditor( FCDTuner tuner, ResourceManager resourceManager )
+ public JPanel getEditor( FCDTuner tuner, SettingsManager settingsManager )
{
if( mEditor == null )
{
- mEditor = new FCD1TunerEditorPanel( tuner, resourceManager );
+ mEditor = new FCD1TunerEditorPanel( tuner, settingsManager );
}
return mEditor;
diff --git a/src/source/tuner/fcd/proV1/FCD1TunerEditorPanel.java b/src/source/tuner/fcd/proV1/FCD1TunerEditorPanel.java
index 317fcaeb..83512616 100644
--- a/src/source/tuner/fcd/proV1/FCD1TunerEditorPanel.java
+++ b/src/source/tuner/fcd/proV1/FCD1TunerEditorPanel.java
@@ -29,18 +29,17 @@ import net.miginfocom.swing.MigLayout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import settings.SettingsManager;
import source.SourceException;
import source.tuner.fcd.FCDTuner;
import source.tuner.fcd.FCDTunerDetailsPanel;
import source.tuner.frequency.FrequencyChangeEvent;
-import source.tuner.frequency.FrequencyChangeListener;
import source.tuner.frequency.FrequencyChangeEvent.Event;
+import source.tuner.frequency.IFrequencyChangeProcessor;
import com.jidesoft.swing.JideTabbedPane;
-import controller.ResourceManager;
-
-public class FCD1TunerEditorPanel extends JPanel implements FrequencyChangeListener
+public class FCD1TunerEditorPanel extends JPanel implements IFrequencyChangeProcessor
{
private static final long serialVersionUID = 1L;
private final static Logger mLog =
@@ -48,15 +47,15 @@ public class FCD1TunerEditorPanel extends JPanel implements FrequencyChangeListe
private FCDTuner mTuner;
private FCD1TunerController mController;
- private ResourceManager mResourceManager;
+ private SettingsManager mSettingsManager;
private JFrequencyControl mFrequencyControl;
- public FCD1TunerEditorPanel( FCDTuner tuner, ResourceManager resourceManager )
+ public FCD1TunerEditorPanel( FCDTuner tuner, SettingsManager settingsManager )
{
mTuner = tuner;
mController = (FCD1TunerController)mTuner.getController();
- mResourceManager = resourceManager;
+ mSettingsManager = settingsManager;
initGUI();
}
@@ -74,7 +73,7 @@ public class FCD1TunerEditorPanel extends JPanel implements FrequencyChangeListe
/* Add frequency control as listener to tuner to get frequency changes
* that are invoked elsewhere, to keep the control in sync with the
* frequency */
- mTuner.addListener( mFrequencyControl );
+ mTuner.addFrequencyChangeProcessor( mFrequencyControl );
mFrequencyControl.setFrequency( mController.getFrequency(), false );
@@ -85,7 +84,7 @@ public class FCD1TunerEditorPanel extends JPanel implements FrequencyChangeListe
tabs.setForeground( Color.BLACK );
tabs.add( "Configuration", new FCD1TunerConfigurationPanel(
- mResourceManager, mController ) );
+ mSettingsManager, mController ) );
tabs.add( "Info", new FCDTunerDetailsPanel( mController ) );
@@ -95,7 +94,7 @@ public class FCD1TunerEditorPanel extends JPanel implements FrequencyChangeListe
@Override
public void frequencyChanged( FrequencyChangeEvent event )
{
- if( event.getEvent() == Event.FREQUENCY_CHANGE_NOTIFICATION )
+ if( event.getEvent() == Event.NOTIFICATION_FREQUENCY_CHANGE )
{
try
{
diff --git a/src/source/tuner/fcd/proplusV2/FCD2TunerConfigurationPanel.java b/src/source/tuner/fcd/proplusV2/FCD2TunerConfigurationPanel.java
index bb6acbea..8bd20ac9 100644
--- a/src/source/tuner/fcd/proplusV2/FCD2TunerConfigurationPanel.java
+++ b/src/source/tuner/fcd/proplusV2/FCD2TunerConfigurationPanel.java
@@ -46,11 +46,11 @@ import net.miginfocom.swing.MigLayout;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import settings.SettingsManager;
import source.SourceException;
import source.tuner.TunerConfiguration;
import source.tuner.TunerConfigurationAssignment;
import source.tuner.TunerType;
-import controller.ResourceManager;
public class FCD2TunerConfigurationPanel extends JPanel
{
@@ -58,7 +58,7 @@ public class FCD2TunerConfigurationPanel extends JPanel
LoggerFactory.getLogger( FCD2TunerConfigurationPanel.class );
private static final long serialVersionUID = 1L;
- private ResourceManager mResourceManager;
+ private SettingsManager mSettingsManager;
private FCD2TunerController mController;
private FCD2TunerConfiguration mSelectedConfig;
private JButton mNewConfiguration;
@@ -69,10 +69,10 @@ public class FCD2TunerConfigurationPanel extends JPanel
private JCheckBox mMixerGain;
private JSpinner mFrequencyCorrection;
- public FCD2TunerConfigurationPanel( ResourceManager resourceManager,
+ public FCD2TunerConfigurationPanel( SettingsManager settingsManager,
FCD2TunerController controller )
{
- mResourceManager = resourceManager;
+ mSettingsManager = settingsManager;
mController = controller;
init();
@@ -218,8 +218,8 @@ public class FCD2TunerConfigurationPanel extends JPanel
* Lookup the save config and apply that config to update all of the
* controls
*/
- TunerConfigurationAssignment savedConfig = mResourceManager
- .getSettingsManager().getSelectedTunerConfiguration(
+ TunerConfigurationAssignment savedConfig = mSettingsManager
+ .getSelectedTunerConfiguration(
TunerType.FUNCUBE_DONGLE_PRO_PLUS,
mController.getUSBAddress() );
@@ -234,7 +234,7 @@ public class FCD2TunerConfigurationPanel extends JPanel
mSelectedConfig = mComboConfigurations.getItemAt( 0 );
//Store this config as the default for this tuner at this address
- mResourceManager.getSettingsManager()
+ mSettingsManager
.setSelectedTunerConfiguration(
TunerType.FUNCUBE_DONGLE_PRO_PLUS,
mController.getUSBAddress(), mSelectedConfig );
@@ -253,7 +253,7 @@ public class FCD2TunerConfigurationPanel extends JPanel
public void actionPerformed( ActionEvent e )
{
TunerConfiguration config =
- mResourceManager.getSettingsManager()
+ mSettingsManager
.addNewTunerConfiguration(
TunerType.FUNCUBE_DONGLE_PRO_PLUS,
"New Configuration" );
@@ -293,7 +293,7 @@ public class FCD2TunerConfigurationPanel extends JPanel
if( n == JOptionPane.YES_OPTION )
{
- mResourceManager.getSettingsManager()
+ mSettingsManager
.deleteTunerConfiguration( selected );
mComboConfigurations.setModel( getModel() );
@@ -322,7 +322,7 @@ public class FCD2TunerConfigurationPanel extends JPanel
mMixerGain.setSelected( config.getGainMixer() );
mFrequencyCorrection.setValue( config.getFrequencyCorrection() );
- mResourceManager.getSettingsManager().setSelectedTunerConfiguration(
+ mSettingsManager.setSelectedTunerConfiguration(
TunerType.FUNCUBE_DONGLE_PRO_PLUS,
mController.getUSBAddress(), config );
}
@@ -342,7 +342,7 @@ public class FCD2TunerConfigurationPanel extends JPanel
private ComboBoxModel