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
This commit is contained in:
denny
2016-01-10 18:02:04 -05:00
parent c405ddad96
commit 4be63d4b95
197 changed files with 4181 additions and 4439 deletions

View File

@@ -6,8 +6,8 @@ import sample.complex.ComplexBuffer;
public abstract class ComplexSource extends Source implements Provider<ComplexBuffer>
{
public ComplexSource( String name )
public ComplexSource()
{
super( name, SampleType.COMPLEX );
super( SampleType.COMPLEX );
}
}

View File

@@ -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
}
}

View File

@@ -1,12 +0,0 @@
package source;
import sample.Provider;
import sample.SampleType;
public abstract class FloatSource extends Source implements Provider<Float>
{
public FloatSource( String name )
{
super( name, SampleType.REAL );
}
}

View File

@@ -7,8 +7,8 @@ import sample.real.RealBuffer;
public abstract class RealSource extends Source implements Provider<RealBuffer>
{
public RealSource( String name )
public RealSource()
{
super( name, SampleType.REAL );
super( SampleType.REAL );
}
}

View File

@@ -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;

View File

@@ -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<SourceType> 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
}
}

View File

@@ -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;
}
}

View File

@@ -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 <http://www.gnu.org/licenses/>
******************************************************************************/
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;
}
}

View File

@@ -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;
}
}

View File

@@ -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<InputMixerConfiguration>( 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
}
}

View File

@@ -49,27 +49,15 @@ public class MixerManager
private final static Logger mLog =
LoggerFactory.getLogger( MixerManager.class );
private static MixerManager sInstance = null;
private List<InputMixerConfiguration> mInputMixers = new ArrayList<>();
private List<MixerChannelConfiguration> mOutputMixers = new ArrayList<>();
private HashMap<String,MixerTunerDataLine> 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() ) );
}
}

View File

@@ -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<RealBuffer> listener )
@Override
public void reset()
{
}
@Override
public void start()
{
}
@Override
public void stop()
{
}
public void setListener( Listener<RealBuffer> 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();
}
}

View File

@@ -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<Recording>,
FrequencyChangeListener,
TunerChannelProvider
IFrequencyChangeProcessor,
ITunerChannelProvider
{
private ResourceManager mResourceManager;
private RecordingConfiguration mConfiguration;
private ArrayList<TunerChannelSource> mTunerChannels =
@@ -26,10 +25,12 @@ public class Recording implements Comparable<Recording>,
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<Recording>,
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<Recording>,
}
mConfiguration.setFilePath( file.getAbsolutePath() );
mResourceManager.getSettingsManager().save();
mSettingsManager.save();
}
/**
@@ -90,13 +91,13 @@ public class Recording implements Comparable<Recording>,
@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;

View File

@@ -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<Recording> 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<Recording> recordings = getResourceManager()
List<Recording> 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
}
}

View File

@@ -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<Recording> recordings = getModel().getResourceManager()
List<Recording> recordings = getSourceManager()
.getRecordingSourceManager().getRecordings();
for( Recording recording: recordings )
{
RecordingNode node = new RecordingNode( recording );
RecordingNode node = new RecordingNode( getSourceManager(), recording );
getModel().addNode( node, this, 0 );
}

View File

@@ -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 );

View File

@@ -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<Recording> mRecordings = new ArrayList<Recording>();
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<RecordingConfiguration> recordingConfigurations =
settingsManager.getRecordingConfigurations();
ArrayList<RecordingConfiguration> 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 );
}
}
}

View File

@@ -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,12 +15,31 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
******************************************************************************/
package source.tuner.frequency;
package source.tuner;
import java.util.concurrent.RejectedExecutionException;
public interface FrequencyChangeBroadcaster
import source.SourceException;
import controller.ThreadPoolManager;
public interface ITunerChannelProvider
{
public abstract void addListener( FrequencyChangeListener listener );
/**
* 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 );
public abstract void removeListener( FrequencyChangeListener listener );
}

View File

@@ -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<Listener<ComplexBuffer>>
mSampleListeners = new CopyOnWriteArrayList<Listener<ComplexBuffer>>();
protected CopyOnWriteArrayList<FrequencyChangeListener>
mFrequencyChangeListeners = new CopyOnWriteArrayList<FrequencyChangeListener>();
protected CopyOnWriteArrayList<IFrequencyChangeProcessor>
mFrequencyChangeProcessors = new CopyOnWriteArrayList<IFrequencyChangeProcessor>();
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 );
}
}

View File

@@ -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 );
}

View File

@@ -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<ComplexBuffer>
implements IFrequencyChangeProcessor, Listener<ComplexBuffer>
{
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<ComplexBuffer> 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<ComplexBuffer>)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<ComplexBuffer>)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<ComplexBuffer> 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<ComplexBuffer> mSampleBuffers = new ArrayList<ComplexBuffer>();
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();
}
}
}

View File

@@ -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<TunerChannel> mTunedChannels = new ConcurrentSkipListSet<>();
=======
protected ArrayList<TunerChannel> 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 );
}
}

View File

@@ -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
}
}

View File

@@ -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<Tuner> mTuners = new ArrayList<Tuner>();
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<TunerConfiguration> configs = mResourceManager
.getSettingsManager().getTunerConfigurations( tuner.getTunerType() );
ArrayList<TunerConfiguration> 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<MixerTunerDataLine> datalines =
MixerManager.getInstance().getMixerTunerDataLines();
mMixerManager.getMixerTunerDataLines();
for( MixerTunerDataLine mixerTDL: datalines )
{

View File

@@ -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 )

View File

@@ -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()

View File

@@ -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<AirspyTunerConfiguration> getModel()
{
ArrayList<TunerConfiguration> configs =
mResourceManager.getSettingsManager()
.getTunerConfigurations( TunerType.AIRSPY_R820T );
mSettingsManager.getTunerConfigurations( TunerType.AIRSPY_R820T );
DefaultComboBoxModel<AirspyTunerConfiguration> model =
new DefaultComboBoxModel<AirspyTunerConfiguration>();
@@ -681,8 +676,7 @@ public class AirspyTunerConfigurationPanel extends JPanel
private AirspyTunerConfiguration getNamedConfiguration( String name )
{
ArrayList<TunerConfiguration> 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();
}
}

View File

@@ -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
{

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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

View File

@@ -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

View File

@@ -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<FCD1TunerConfiguration> getModel()
{
ArrayList<TunerConfiguration> configs =
mResourceManager.getSettingsManager()
.getTunerConfigurations( TunerType.FUNCUBE_DONGLE_PRO );
mSettingsManager.getTunerConfigurations( TunerType.FUNCUBE_DONGLE_PRO );
DefaultComboBoxModel<FCD1TunerConfiguration> model =
new DefaultComboBoxModel<FCD1TunerConfiguration>();
@@ -547,8 +542,7 @@ public class FCD1TunerConfigurationPanel extends JPanel
private FCD1TunerConfiguration getNamedConfiguration( String name )
{
ArrayList<TunerConfiguration> 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 };

View File

@@ -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;

View File

@@ -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
{

View File

@@ -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<FCD2TunerConfiguration> getModel()
{
ArrayList<TunerConfiguration> configs =
mResourceManager.getSettingsManager()
mSettingsManager
.getTunerConfigurations( TunerType.FUNCUBE_DONGLE_PRO_PLUS );
DefaultComboBoxModel<FCD2TunerConfiguration> model =
@@ -359,7 +359,7 @@ public class FCD2TunerConfigurationPanel extends JPanel
private FCD2TunerConfiguration getNamedConfiguration( String name )
{
ArrayList<TunerConfiguration> configs =
mResourceManager.getSettingsManager()
mSettingsManager
.getTunerConfigurations( TunerType.FUNCUBE_DONGLE_PRO_PLUS );
for( TunerConfiguration config: configs )
@@ -375,6 +375,6 @@ public class FCD2TunerConfigurationPanel extends JPanel
private void save()
{
mResourceManager.getSettingsManager().save();
mSettingsManager.save();
}
}

View File

@@ -27,6 +27,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;
@@ -34,7 +35,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 FCD2TunerController extends FCDTunerController
{
@@ -89,11 +89,11 @@ public class FCD2TunerController extends FCDTunerController
return TunerType.FUNCUBE_DONGLE_PRO_PLUS;
}
public JPanel getEditor( FCDTuner tuner, ResourceManager resourceManager )
public JPanel getEditor( FCDTuner tuner, SettingsManager settingsManager )
{
if( mEditor == null )
{
mEditor = new FCD2TunerEditorPanel( tuner, resourceManager );
mEditor = new FCD2TunerEditorPanel( tuner, settingsManager );
}
return mEditor;

View File

@@ -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 FCD2TunerEditorPanel extends JPanel implements FrequencyChangeListener
public class FCD2TunerEditorPanel extends JPanel implements IFrequencyChangeProcessor
{
private final static Logger mLog =
LoggerFactory.getLogger( FCD2TunerEditorPanel.class );
@@ -48,15 +47,15 @@ public class FCD2TunerEditorPanel extends JPanel implements FrequencyChangeListe
private FCDTuner mTuner;
private FCD2TunerController mController;
private ResourceManager mResourceManager;
private SettingsManager mSettingsManager;
private JFrequencyControl mFrequencyControl;
public FCD2TunerEditorPanel( FCDTuner tuner, ResourceManager resourceManager )
public FCD2TunerEditorPanel( FCDTuner tuner, SettingsManager settingsManager )
{
mTuner = tuner;
mController = (FCD2TunerController)mTuner.getController();
mResourceManager = resourceManager;
mSettingsManager = settingsManager;
initGUI();
}
@@ -73,7 +72,7 @@ public class FCD2TunerEditorPanel extends JPanel implements FrequencyChangeListe
/* 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 );
@@ -84,7 +83,7 @@ public class FCD2TunerEditorPanel extends JPanel implements FrequencyChangeListe
tabs.setForeground( Color.BLACK );
tabs.add( "Configuration", new FCD2TunerConfigurationPanel(
mResourceManager, mController ) );
mSettingsManager, mController ) );
tabs.add( "Info", new FCDTunerDetailsPanel( mController ) );
@@ -94,7 +93,7 @@ public class FCD2TunerEditorPanel extends JPanel implements FrequencyChangeListe
@Override
public void frequencyChanged( FrequencyChangeEvent event )
{
if( event.getEvent() == Event.FREQUENCY_CHANGE_NOTIFICATION )
if( event.getEvent() == Event.NOTIFICATION_FREQUENCY_CHANGE )
{
//Disregard the bandwidth, which shouldn't be changing
try

View File

@@ -1,181 +0,0 @@
package source.tuner.frequency;
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2015 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 <http://www.gnu.org/licenses/>
******************************************************************************/
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sample.real.RealSampleListener;
import source.tuner.frequency.FrequencyChangeEvent.Event;
import buffer.FloatAveragingBuffer;
public class AutomaticFrequencyControl_R extends FrequencyCorrectionControl
implements RealSampleListener
{
private final static Logger mLog =
LoggerFactory.getLogger( AutomaticFrequencyControl_R.class );
private static float LARGE_ERROR = 0.300f;
private static float MEDIUM_ERROR = 0.150f;
private static float SMALL_ERROR = 0.030f;
private static float FINE_ERROR = 0.015f;
private static int LARGE_FREQUENCY_CORRECTION = 1500; //Hertz
private static int MEDIUM_FREQUENCY_CORRECTION = 500;
private static int SMALL_FREQUENCY_CORRECTION = 100;
private static int FINE_FREQUENCY_CORRECTION = 50;
private static int SAMPLE_THRESHOLD = 15000;
private Mode mMode = Mode.FAST;
private FloatAveragingBuffer mBuffer =
new FloatAveragingBuffer( SAMPLE_THRESHOLD );
private int mSampleCounter = 0;
private int mSkipCounter = 0;
private int mSkipThreshold = 4;
private int mErrorCorrection = 0;
public enum Mode
{
NORMAL,FAST;
}
/**
* Automatic Frequency Control. Monitors DC bias present in an FM
* demodulated audio stream and issues automatic frequency corrections to
* maintain the DC bias close to zero.
*
* @param maximum - maximum allowable (+/-) frequency correction value.
*/
public AutomaticFrequencyControl_R( int maximum )
{
super( maximum );
}
public void dispose()
{
super.dispose();
mBuffer = null;
}
/**
* Resets the error correction value to zero and broadcasts a change event
*/
public void reset()
{
mErrorCorrection = 0;
mMode = Mode.FAST;
dispatch();
}
/**
* Broadcasts a frequency correction change event to the registered listener
*/
private void dispatch()
{
if( mListener != null )
{
mListener.frequencyChanged(
new FrequencyChangeEvent( Event.CHANNEL_FREQUENCY_CORRECTION_CHANGE_NOTIFICATION,
mErrorCorrection ) );
}
}
@Override
public void receive( float sample )
{
if( mMode == Mode.FAST )
{
float average = mBuffer.get( sample );
mSampleCounter++;
if( mSampleCounter >= SAMPLE_THRESHOLD )
{
mSampleCounter = 0;
update( average );
}
}
else
{
mSkipCounter++;
if( mSkipCounter >= mSkipThreshold )
{
mSkipCounter = 0;
float average = mBuffer.get( sample );
mSampleCounter++;
if( mSampleCounter >= SAMPLE_THRESHOLD )
{
mSampleCounter = 0;
update( average );
}
}
}
}
private void update( float average )
{
mMode = Mode.NORMAL;
if( average > LARGE_ERROR )
{
adjust( -LARGE_FREQUENCY_CORRECTION );
mMode = Mode.FAST;
}
else if( average > MEDIUM_ERROR )
{
adjust( -MEDIUM_FREQUENCY_CORRECTION );
mMode = Mode.FAST;
}
else if( average > SMALL_ERROR )
{
adjust( -SMALL_FREQUENCY_CORRECTION );
}
else if( average > FINE_ERROR )
{
adjust( -FINE_FREQUENCY_CORRECTION );
}
else if( average < -LARGE_ERROR )
{
adjust( LARGE_FREQUENCY_CORRECTION );
mMode = Mode.FAST;
}
else if( average < -MEDIUM_ERROR )
{
adjust( MEDIUM_FREQUENCY_CORRECTION );
mMode = Mode.FAST;
}
else if( average < -SMALL_ERROR )
{
adjust( SMALL_FREQUENCY_CORRECTION );
}
else if( average < -FINE_ERROR )
{
adjust( FINE_FREQUENCY_CORRECTION );
}
}
}

View File

@@ -1,197 +0,0 @@
package source.tuner.frequency;
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2015 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 <http://www.gnu.org/licenses/>
******************************************************************************/
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sample.Listener;
import sample.real.RealBuffer;
import source.tuner.frequency.FrequencyChangeEvent.Event;
import buffer.FloatAveragingBuffer;
public class AutomaticFrequencyControl_RB extends FrequencyCorrectionControl
implements Listener<RealBuffer>
{
private final static Logger mLog =
LoggerFactory.getLogger( AutomaticFrequencyControl_RB.class );
private static float LARGE_ERROR = 0.300f;
private static float MEDIUM_ERROR = 0.150f;
private static float SMALL_ERROR = 0.030f;
private static float FINE_ERROR = 0.015f;
private static int LARGE_FREQUENCY_CORRECTION = 1500; //Hertz
private static int MEDIUM_FREQUENCY_CORRECTION = 500;
private static int SMALL_FREQUENCY_CORRECTION = 100;
private static int FINE_FREQUENCY_CORRECTION = 50;
private static int SAMPLE_THRESHOLD = 15000;
private Mode mMode = Mode.FAST;
private FloatAveragingBuffer mBuffer =
new FloatAveragingBuffer( SAMPLE_THRESHOLD );
private int mSampleCounter = 0;
private int mSkipCounter = 0;
private int mSkipThreshold = 4;
private int mErrorCorrection = 0;
public enum Mode
{
NORMAL,FAST;
}
/**
* Automatic Frequency Control. Monitors DC bias present in an FM
* demodulated audio stream and issues automatic frequency corrections to
* maintain the DC bias close to zero.
*
* @param maximum - maximum allowable (+/-) frequency correction value.
*/
public AutomaticFrequencyControl_RB( int maximum )
{
super( maximum );
}
public void dispose()
{
super.dispose();
mBuffer = null;
}
/**
* Resets the error correction value to zero and broadcasts a change event
*/
public void reset()
{
super.reset();
mMode = Mode.FAST;
dispatch();
}
/**
* Broadcasts a frequency correction change event to the registered listener
*/
private void dispatch()
{
if( mListener != null )
{
mListener.frequencyChanged(
new FrequencyChangeEvent( Event.CHANNEL_FREQUENCY_CORRECTION_CHANGE_NOTIFICATION,
mErrorCorrection ) );
}
}
@Override
public void receive( RealBuffer t )
{
float average = 0.0f;
for( float sample: t.getSamples() )
{
average = mBuffer.get( sample );
}
//TODO: fix this
// update( average );
}
public void receive( float sample )
{
if( mMode == Mode.FAST )
{
float average = mBuffer.get( sample );
mSampleCounter++;
if( mSampleCounter >= SAMPLE_THRESHOLD )
{
mSampleCounter = 0;
update( average );
}
}
else
{
mSkipCounter++;
if( mSkipCounter >= mSkipThreshold )
{
mSkipCounter = 0;
float average = mBuffer.get( sample );
mSampleCounter++;
if( mSampleCounter >= SAMPLE_THRESHOLD )
{
mSampleCounter = 0;
update( average );
}
}
}
}
private void update( float average )
{
mMode = Mode.NORMAL;
if( average > LARGE_ERROR )
{
adjust( -LARGE_FREQUENCY_CORRECTION );
mMode = Mode.FAST;
}
else if( average > MEDIUM_ERROR )
{
adjust( -MEDIUM_FREQUENCY_CORRECTION );
mMode = Mode.FAST;
}
else if( average > SMALL_ERROR )
{
adjust( -SMALL_FREQUENCY_CORRECTION );
}
else if( average > FINE_ERROR )
{
adjust( -FINE_FREQUENCY_CORRECTION );
}
else if( average < -LARGE_ERROR )
{
adjust( LARGE_FREQUENCY_CORRECTION );
mMode = Mode.FAST;
}
else if( average < -MEDIUM_ERROR )
{
adjust( MEDIUM_FREQUENCY_CORRECTION );
mMode = Mode.FAST;
}
else if( average < -SMALL_ERROR )
{
adjust( SMALL_FREQUENCY_CORRECTION );
}
else if( average < -FINE_ERROR )
{
adjust( FINE_FREQUENCY_CORRECTION );
}
}
}

View File

@@ -0,0 +1,135 @@
package source.tuner.frequency;
/*******************************************************************************
* SDR Trunk
* Copyright (C) 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 <http://www.gnu.org/licenses/>
******************************************************************************/
import module.Module;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sample.Listener;
import sample.real.RealBuffer;
import source.tuner.frequency.FrequencyChangeEvent.Event;
public class DCTrackingFrequencyControl extends Module
implements Listener<RealBuffer>, IFrequencyChangeProvider
{
private final static Logger mLog =
LoggerFactory.getLogger( DCTrackingFrequencyControl.class );
private static float COARSE_THRESHOLD = 0.1f;
private static float LOOP_GAIN = 0.1f;
private static float COARSE_GAIN = 1000.0f;
private static float FINE_GAIN = 100.0f;
private int mErrorCorrection = 0;
private int mMaximumFrequencyCorrection = 0;
private Listener<FrequencyChangeEvent> mListener;
/**
* DC offset Automatic Frequency Control. Monitors DC bias present in an FM
* demodulated audio stream and issues automatic frequency corrections to
* maintain the DC bias close to zero.
*
* @param maximum - maximum allowable (+/-) frequency correction value.
*/
public DCTrackingFrequencyControl( int maximum )
{
mMaximumFrequencyCorrection = maximum;
}
public void dispose()
{
mListener = null;
}
@Override
public void receive( RealBuffer buffer )
{
double sum = 0.0d;
for( float sample: buffer.getSamples() )
{
sum += sample;
}
float mean = (float)( sum / (double)buffer.getSamples().length );
float adjustment = 0.0f;
if( mean > COARSE_THRESHOLD || mean < - COARSE_THRESHOLD )
{
adjustment = mean * COARSE_GAIN;
}
else
{
adjustment = mean * FINE_GAIN;
}
setErrorCorrection( mErrorCorrection + (int)( (float)adjustment * LOOP_GAIN ) );
}
private void setErrorCorrection( int correction )
{
if( mListener != null )
{
if( correction > mMaximumFrequencyCorrection )
{
correction = mMaximumFrequencyCorrection;
}
else if( correction < -mMaximumFrequencyCorrection )
{
correction = -mMaximumFrequencyCorrection;
}
if( correction != mErrorCorrection )
{
mListener.receive( new FrequencyChangeEvent(
Event.REQUEST_CHANNEL_FREQUENCY_CORRECTION_CHANGE, correction ) );
}
}
}
@Override
public void setFrequencyChangeListener( Listener<FrequencyChangeEvent> listener )
{
mListener = listener;
}
@Override
public void removeFrequencyChangeListener()
{
mListener = null;
}
@Override
public void start()
{
}
@Override
public void stop()
{
}
@Override
public void reset()
{
setErrorCorrection( 0 );
}
}

View File

@@ -4,11 +4,12 @@ public class FrequencyChangeEvent
{
public enum Event
{
FREQUENCY_CHANGE_NOTIFICATION,
FREQUENCY_CORRECTION_CHANGE_NOTIFICATION,
CHANNEL_FREQUENCY_CORRECTION_CHANGE_NOTIFICATION,
CHANNEL_FREQUENCY_CORRECTION_CHANGE_REQUEST,
SAMPLE_RATE_CHANGE_NOTIFICATION;
NOTIFICATION_FREQUENCY_CHANGE,
NOTIFICATION_FREQUENCY_CORRECTION_CHANGE,
NOTIFICATION_CHANNEL_FREQUENCY_CORRECTION_CHANGE,
NOTIFICATION_SAMPLE_RATE_CHANGE,
REQUEST_CHANNEL_FREQUENCY_CORRECTION_CHANGE;
}
private Event mEvent;

View File

@@ -0,0 +1,32 @@
package source.tuner.frequency;
import sample.Listener;
public class FrequencyChangeProcessorWrapper
implements IFrequencyChangeListener, Listener<FrequencyChangeEvent>
{
private IFrequencyChangeProcessor mProcessor;
/**
* Provides IFrequencyChangeListener wrapper for an IFrequencyChangeProcessor
*/
public FrequencyChangeProcessorWrapper( IFrequencyChangeProcessor handler )
{
mProcessor = handler;
}
@Override
public Listener<FrequencyChangeEvent> getFrequencyChangeListener()
{
return this;
}
@Override
public void receive( FrequencyChangeEvent event )
{
if( mProcessor != null )
{
mProcessor.frequencyChanged( event );
}
}
}

View File

@@ -37,8 +37,7 @@ public class FrequencyController
private double mFrequencyCorrection = 0d;
private int mSampleRate = 0;
private ArrayList<FrequencyChangeListener> mListeners =
new ArrayList<FrequencyChangeListener>();
private ArrayList<IFrequencyChangeProcessor> mProcessors = new ArrayList<>();
public FrequencyController( Tunable tunable,
long minFrequency,
@@ -181,20 +180,21 @@ public class FrequencyController
/**
* Adds listener to receive frequency change events
*/
public void addListener( FrequencyChangeListener listener )
//TODO: rename this to addFrequencyChangeProcessor()
public void addListener( IFrequencyChangeProcessor processor )
{
if( !mListeners.contains( listener ) )
if( !mProcessors.contains( processor ) )
{
mListeners.add( listener );
mProcessors.add( processor );
}
}
/**
* Removes listener from receiving frequency change events
*/
public void removeListener( FrequencyChangeListener listener )
public void removeFrequencyChangeProcessor( IFrequencyChangeProcessor processor )
{
mListeners.remove( listener );
mProcessors.remove( processor );
}
@@ -205,7 +205,7 @@ public class FrequencyController
protected void broadcastFrequencyChange()
{
broadcastFrequencyChangeEvent(
new FrequencyChangeEvent( Event.FREQUENCY_CHANGE_NOTIFICATION, mFrequency ) );
new FrequencyChangeEvent( Event.NOTIFICATION_FREQUENCY_CHANGE, mFrequency ) );
}
/**
@@ -214,7 +214,7 @@ public class FrequencyController
protected void broadcastFrequencyErrorChange()
{
broadcastFrequencyChangeEvent(
new FrequencyChangeEvent( Event.FREQUENCY_CORRECTION_CHANGE_NOTIFICATION, mFrequencyCorrection ) );
new FrequencyChangeEvent( Event.NOTIFICATION_FREQUENCY_CORRECTION_CHANGE, mFrequencyCorrection ) );
}
/**
@@ -223,14 +223,14 @@ public class FrequencyController
protected void broadcastSampleRateChange()
{
broadcastFrequencyChangeEvent(
new FrequencyChangeEvent( Event.SAMPLE_RATE_CHANGE_NOTIFICATION, mSampleRate ) );
new FrequencyChangeEvent( Event.NOTIFICATION_SAMPLE_RATE_CHANGE, mSampleRate ) );
}
public void broadcastFrequencyChangeEvent( FrequencyChangeEvent event )
{
for( FrequencyChangeListener listener: mListeners )
for( IFrequencyChangeProcessor processor: mProcessors )
{
listener.frequencyChanged( event );
processor.frequencyChanged( event );
}
}

View File

@@ -1,161 +0,0 @@
package source.tuner.frequency;
/*******************************************************************************
* SDR Trunk
* Copyright (C) 2015 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 <http://www.gnu.org/licenses/>
******************************************************************************/
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import source.tuner.frequency.FrequencyChangeEvent.Event;
/**
* Frequency control for providing frequency error correction to a tuned channel
*/
public class FrequencyCorrectionControl implements FrequencyChangeListener
{
private final static Logger mLog =
LoggerFactory.getLogger( FrequencyCorrectionControl.class );
protected FrequencyChangeListener mListener;
protected FrequencyCorrectionResetListener mResetListener;
protected int mChannelFrequencyCorrection = 0;
private int mMaximumCorrection = 3000;
/**
* Frequency correction controller.
*
* @param maximum - defines the maximum +/- allowable frequency correction
* value
*/
public FrequencyCorrectionControl( int maximum )
{
mMaximumCorrection = maximum;
}
/**
* Cleanup
*/
public void dispose()
{
mListener = null;
mResetListener = null;
}
/**
* Registers a listener to receive frequency correction events
*/
public void setFrequencyChangeListener( FrequencyChangeListener listener )
{
mListener = listener;
}
/**
* Registers a listener to receive frequency correction resets
*/
public void setListener( FrequencyCorrectionResetListener listener )
{
mResetListener = listener;
}
/**
* Listener for source frequency or frequency offset value changes to
* reset this frequency controller value to zero.
*/
@Override
public void frequencyChanged( FrequencyChangeEvent event )
{
Event attribute = event.getEvent();
switch( attribute )
{
//Direct the listener to reset when frequency correction (PPM) or
//sample rate changes
case FREQUENCY_CORRECTION_CHANGE_NOTIFICATION:
case SAMPLE_RATE_CHANGE_NOTIFICATION:
reset();
break;
default:
break;
}
}
/**
* Resets frequency correction value to zero and notifies any reset
* listeners
*/
public void reset()
{
if( mResetListener != null )
{
mResetListener.resetFrequencyCorrection();
}
}
/**
* Sets frequency correction to the specified value and broadcasts a change
* request
*/
public void setFrequencyCorrection( int correction )
{
mChannelFrequencyCorrection = correction;
/* Limit frequency correction to +/- max correction value */
if( mChannelFrequencyCorrection > mMaximumCorrection )
{
mChannelFrequencyCorrection = mMaximumCorrection;
}
else if( mChannelFrequencyCorrection < -mMaximumCorrection )
{
mChannelFrequencyCorrection = -mMaximumCorrection;
}
/* Broadcast a change request */
if( mListener != null )
{
mListener.frequencyChanged( new FrequencyChangeEvent(
Event.CHANNEL_FREQUENCY_CORRECTION_CHANGE_REQUEST,
mChannelFrequencyCorrection ) );
}
}
/**
* Increments the frequency error correction value by the specified adjustment
*/
public void adjust( int adjustment )
{
setFrequencyCorrection( getErrorCorrection() + adjustment );
}
/**
* Current frequency error correction value
* @return
*/
public int getErrorCorrection()
{
return mChannelFrequencyCorrection;
}
/**
* Listener interface to be notified when this control is reset to a zero
* frequency correction value
*/
public interface FrequencyCorrectionResetListener
{
public void resetFrequencyCorrection();
}
}

View File

@@ -17,6 +17,8 @@
******************************************************************************/
package source.tuner.frequency;
import sample.Listener;
/**
* Interface for broadcasting changes to frequency, bandwidth, sample rate,
@@ -26,7 +28,7 @@ package source.tuner.frequency;
* frequency value. All frequency correction aspects should be handled within
* the device that implements the tuning of the frequency.
*/
public interface FrequencyChangeListener
public interface IFrequencyChangeListener
{
public void frequencyChanged( FrequencyChangeEvent event );
public Listener<FrequencyChangeEvent> getFrequencyChangeListener();
}

View File

@@ -0,0 +1,6 @@
package source.tuner.frequency;
public interface IFrequencyChangeProcessor
{
public void frequencyChanged( FrequencyChangeEvent event );
}

View File

@@ -0,0 +1,9 @@
package source.tuner.frequency;
import sample.Listener;
public interface IFrequencyChangeProvider
{
public void setFrequencyChangeListener( Listener<FrequencyChangeEvent> listener );
public void removeFrequencyChangeListener();
}

View File

@@ -1,8 +0,0 @@
package source.tuner.frequency;
public interface IFrequencyCorrectionController
{
public boolean hasFrequencyCorrectionControl();
public FrequencyCorrectionControl getFrequencyCorrectionControl();
}

View File

@@ -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.hackrf.HackRFTunerController.BoardID;
import controller.ResourceManager;
import controller.ThreadPoolManager;
public class HackRFTuner extends Tuner
@@ -76,9 +76,9 @@ public class HackRFTuner extends Tuner
}
@Override
public JPanel getEditor( ResourceManager resourceManager )
public JPanel getEditor( SettingsManager settingsManager )
{
return new HackRFTunerEditorPanel( this, resourceManager );
return new HackRFTunerEditorPanel( this, settingsManager );
}
@Override

View File

@@ -48,6 +48,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.TunerConfigurationAssignment;
@@ -55,7 +56,6 @@ import source.tuner.TunerType;
import source.tuner.hackrf.HackRFTunerController.HackRFLNAGain;
import source.tuner.hackrf.HackRFTunerController.HackRFSampleRate;
import source.tuner.hackrf.HackRFTunerController.HackRFVGAGain;
import controller.ResourceManager;
public class HackRFTunerConfigurationPanel extends JPanel
{
@@ -64,7 +64,7 @@ public class HackRFTunerConfigurationPanel extends JPanel
private static final long serialVersionUID = 1L;
private ResourceManager mResourceManager;
private SettingsManager mSettingsManager;
private HackRFTunerController mController;
private HackRFTunerConfiguration mSelectedConfig;
@@ -81,10 +81,10 @@ public class HackRFTunerConfigurationPanel extends JPanel
private JComboBox<HackRFSampleRate> mComboSampleRate;
public HackRFTunerConfigurationPanel( ResourceManager resourceManager,
public HackRFTunerConfigurationPanel( SettingsManager settingsManager,
HackRFTunerController controller )
{
mResourceManager = resourceManager;
mSettingsManager = settingsManager;
mController = controller;
init();
@@ -119,8 +119,7 @@ public class HackRFTunerConfigurationPanel extends JPanel
if( serial != null )
{
savedConfig = mResourceManager
.getSettingsManager().getSelectedTunerConfiguration(
savedConfig = mSettingsManager.getSelectedTunerConfiguration(
TunerType.HACKRF, serial );
}
@@ -139,7 +138,7 @@ public class HackRFTunerConfigurationPanel extends JPanel
if( serial != null )
{
mResourceManager.getSettingsManager()
mSettingsManager
.setSelectedTunerConfiguration( TunerType.HACKRF,
serial, mSelectedConfig );
}
@@ -418,7 +417,7 @@ public class HackRFTunerConfigurationPanel extends JPanel
public void actionPerformed( ActionEvent e )
{
TunerConfiguration config =
mResourceManager.getSettingsManager()
mSettingsManager
.addNewTunerConfiguration(
TunerType.HACKRF,
"New Configuration" );
@@ -458,7 +457,7 @@ public class HackRFTunerConfigurationPanel extends JPanel
if( n == JOptionPane.YES_OPTION )
{
mResourceManager.getSettingsManager()
mSettingsManager
.deleteTunerConfiguration( selected );
mComboConfigurations.setModel( getModel() );
@@ -494,7 +493,7 @@ public class HackRFTunerConfigurationPanel extends JPanel
mComboSampleRate.setSelectedItem( mSelectedConfig.getSampleRate() );
mResourceManager.getSettingsManager().setSelectedTunerConfiguration(
mSettingsManager.setSelectedTunerConfiguration(
TunerType.HACKRF, mController.getSerial().getSerialNumber(), config );
}
catch ( UsbException | SourceException e1 )
@@ -518,7 +517,7 @@ public class HackRFTunerConfigurationPanel extends JPanel
private ComboBoxModel<HackRFTunerConfiguration> getModel()
{
ArrayList<TunerConfiguration> configs =
mResourceManager.getSettingsManager()
mSettingsManager
.getTunerConfigurations( TunerType.HACKRF );
DefaultComboBoxModel<HackRFTunerConfiguration> model =
@@ -538,7 +537,7 @@ public class HackRFTunerConfigurationPanel extends JPanel
private HackRFTunerConfiguration getNamedConfiguration( String name )
{
ArrayList<TunerConfiguration> configs =
mResourceManager.getSettingsManager()
mSettingsManager
.getTunerConfigurations( TunerType.HACKRF );
for( TunerConfiguration config: configs )
@@ -557,6 +556,6 @@ public class HackRFTunerConfigurationPanel extends JPanel
*/
private void save()
{
mResourceManager.getSettingsManager().save();
mSettingsManager.save();
}
}

View File

@@ -30,18 +30,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.FrequencyChangeListener;
import source.tuner.frequency.FrequencyChangeEvent.Event;
import source.tuner.frequency.IFrequencyChangeProcessor;
import source.tuner.hackrf.HackRFTunerController.BoardID;
import com.jidesoft.swing.JideTabbedPane;
import controller.ResourceManager;
public class HackRFTunerEditorPanel extends JPanel
implements FrequencyChangeListener
public class HackRFTunerEditorPanel extends JPanel implements IFrequencyChangeProcessor
{
private static final long serialVersionUID = 1L;
@@ -52,14 +50,14 @@ public class HackRFTunerEditorPanel extends JPanel
private HackRFTuner mTuner;
private HackRFTunerController mController;
private ResourceManager mResourceManager;
private SettingsManager mSettingsManager;
public HackRFTunerEditorPanel( HackRFTuner tuner,
ResourceManager resourceManager )
SettingsManager resourceManager )
{
mTuner = tuner;
mController = mTuner.getController();
mResourceManager = resourceManager;
mSettingsManager = resourceManager;
initGUI();
}
@@ -89,7 +87,7 @@ public class HackRFTunerEditorPanel 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 );
@@ -102,7 +100,7 @@ public class HackRFTunerEditorPanel extends JPanel
add( tabs, "span,grow,push" );
tabs.add( "Config", new HackRFTunerConfigurationPanel(
mResourceManager, mTuner.getController() ) );
mSettingsManager, mTuner.getController() ) );
tabs.add( "Info", new HackRFInformationPanel( mTuner.getController() ) );
}
@@ -110,7 +108,7 @@ public class HackRFTunerEditorPanel extends JPanel
@Override
public void frequencyChanged( FrequencyChangeEvent event )
{
if( event.getEvent() == Event.FREQUENCY_CHANGE_NOTIFICATION )
if( event.getEvent() == Event.NOTIFICATION_FREQUENCY_CHANGE )
{
try
{

View File

@@ -27,6 +27,7 @@ import org.usb4java.LibUsbException;
import sample.Listener;
import sample.complex.ComplexBuffer;
import settings.SettingsManager;
import source.SourceException;
import source.tuner.Tuner;
import source.tuner.TunerChannel;
@@ -34,9 +35,8 @@ import source.tuner.TunerChannelSource;
import source.tuner.TunerClass;
import source.tuner.TunerConfiguration;
import source.tuner.TunerType;
import source.tuner.frequency.FrequencyChangeListener;
import source.tuner.frequency.IFrequencyChangeListener;
import source.tuner.rtl.RTL2832TunerController.SampleRate;
import controller.ResourceManager;
import controller.ThreadPoolManager;
public class RTL2832Tuner extends Tuner
@@ -57,7 +57,7 @@ public class RTL2832Tuner extends Tuner
mTunerClass = tunerClass;
mController = controller;
mController.addListener( (FrequencyChangeListener)this );
mController.addListener( this );
}
public void dispose()
@@ -89,9 +89,9 @@ public class RTL2832Tuner extends Tuner
}
@Override
public JPanel getEditor( ResourceManager resourceManager )
public JPanel getEditor( SettingsManager settingsManager )
{
return mController.getEditor( resourceManager );
return mController.getEditor( settingsManager );
}
@Override

View File

@@ -52,13 +52,11 @@ import sample.Broadcaster;
import sample.Listener;
import sample.adapter.ByteSampleAdapter;
import sample.complex.ComplexBuffer;
import settings.SettingsManager;
import source.SourceException;
import source.tuner.TunerController;
import source.tuner.TunerType;
import source.tuner.frequency.FrequencyChangeEvent;
import source.tuner.frequency.FrequencyChangeEvent.Event;
import buffer.FloatAveragingBuffer;
import controller.ResourceManager;
import controller.ThreadPoolManager;
import controller.ThreadPoolManager.ThreadType;
@@ -364,7 +362,7 @@ public abstract class RTL2832TunerController extends TunerController
}
}
public abstract JPanel getEditor( ResourceManager resourceManager );
public abstract JPanel getEditor( SettingsManager settingsManager );
public abstract void setSampleRateFilters( int sampleRate )
throws SourceException;

View File

@@ -48,6 +48,7 @@ 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;
@@ -57,7 +58,6 @@ import source.tuner.rtl.e4k.E4KTunerController.E4KEnhanceGain;
import source.tuner.rtl.e4k.E4KTunerController.E4KGain;
import source.tuner.rtl.e4k.E4KTunerController.E4KLNAGain;
import source.tuner.rtl.e4k.E4KTunerController.E4KMixerGain;
import controller.ResourceManager;
public class E4KTunerConfigurationPanel extends JPanel
{
@@ -65,7 +65,7 @@ public class E4KTunerConfigurationPanel extends JPanel
private final static Logger mLog =
LoggerFactory.getLogger( E4KTunerConfigurationPanel.class );
private ResourceManager mResourceManager;
private SettingsManager mSettingsManager;
private E4KTunerController mController;
private E4KTunerConfiguration mSelectedConfig;
@@ -84,10 +84,10 @@ public class E4KTunerConfigurationPanel extends JPanel
private JComboBox<SampleRate> mComboSampleRate;
public E4KTunerConfigurationPanel( ResourceManager resourceManager,
public E4KTunerConfigurationPanel( SettingsManager settingsManager,
E4KTunerController controller )
{
mResourceManager = resourceManager;
mSettingsManager = settingsManager;
mController = controller;
init();
@@ -108,8 +108,8 @@ public class E4KTunerConfigurationPanel extends JPanel
mComboConfigurations.setModel( getModel() );
/* Determine which tuner configuration should be selected/displayed */
TunerConfigurationAssignment savedConfig = mResourceManager
.getSettingsManager().getSelectedTunerConfiguration(
TunerConfigurationAssignment savedConfig = mSettingsManager
.getSelectedTunerConfiguration(
TunerType.ELONICS_E4000, mController.getUniqueID() );
if( savedConfig != null )
@@ -124,7 +124,7 @@ public class E4KTunerConfigurationPanel extends JPanel
mSelectedConfig = mComboConfigurations.getItemAt( 0 );
//Store this config as the default for this tuner at this address
mResourceManager.getSettingsManager()
mSettingsManager
.setSelectedTunerConfiguration(
TunerType.ELONICS_E4000,
mController.getUniqueID(), mSelectedConfig );
@@ -168,7 +168,7 @@ public class E4KTunerConfigurationPanel extends JPanel
/* Reset this named config as the assigned config for this
* tuner */
mResourceManager.getSettingsManager()
mSettingsManager
.setSelectedTunerConfiguration(
TunerType.ELONICS_E4000,
mController.getUniqueID(), mSelectedConfig );
@@ -542,7 +542,7 @@ public class E4KTunerConfigurationPanel extends JPanel
public void actionPerformed( ActionEvent e )
{
TunerConfiguration config =
mResourceManager.getSettingsManager()
mSettingsManager
.addNewTunerConfiguration(
TunerType.ELONICS_E4000,
"New Configuration" );
@@ -582,7 +582,7 @@ public class E4KTunerConfigurationPanel extends JPanel
if( n == JOptionPane.YES_OPTION )
{
mResourceManager.getSettingsManager()
mSettingsManager
.deleteTunerConfiguration( selected );
mComboConfigurations.setModel( getModel() );
@@ -623,7 +623,7 @@ public class E4KTunerConfigurationPanel extends JPanel
mComboSampleRate.setSelectedItem( mSelectedConfig.getSampleRate() );
mResourceManager.getSettingsManager().setSelectedTunerConfiguration(
mSettingsManager.setSelectedTunerConfiguration(
TunerType.ELONICS_E4000, mController.getUniqueID(), config );
}
catch ( SourceException e1 )
@@ -647,7 +647,7 @@ public class E4KTunerConfigurationPanel extends JPanel
private ComboBoxModel<E4KTunerConfiguration> getModel()
{
ArrayList<TunerConfiguration> configs =
mResourceManager.getSettingsManager()
mSettingsManager
.getTunerConfigurations( TunerType.ELONICS_E4000 );
DefaultComboBoxModel<E4KTunerConfiguration> model =
@@ -667,7 +667,7 @@ public class E4KTunerConfigurationPanel extends JPanel
private E4KTunerConfiguration getNamedConfiguration( String name )
{
ArrayList<TunerConfiguration> configs =
mResourceManager.getSettingsManager()
mSettingsManager
.getTunerConfigurations( TunerType.ELONICS_E4000 );
for( TunerConfiguration config: configs )
@@ -686,6 +686,6 @@ public class E4KTunerConfigurationPanel extends JPanel
*/
private void save()
{
mResourceManager.getSettingsManager().save();
mSettingsManager.save();
}
}

View File

@@ -30,11 +30,11 @@ import org.usb4java.DeviceHandle;
import org.usb4java.LibUsb;
import org.usb4java.LibUsbException;
import settings.SettingsManager;
import source.SourceException;
import source.tuner.TunerConfiguration;
import source.tuner.TunerType;
import source.tuner.rtl.RTL2832TunerController;
import controller.ResourceManager;
import controller.ThreadPoolManager;
public class E4KTunerController extends RTL2832TunerController
@@ -252,11 +252,11 @@ public class E4KTunerController extends RTL2832TunerController
}
}
public JPanel getEditor( ResourceManager resourceManager )
public JPanel getEditor( SettingsManager settingsManager )
{
if( mEditor == null )
{
mEditor = new E4KTunerEditorPanel( this, resourceManager );
mEditor = new E4KTunerEditorPanel( this, settingsManager );
}
return mEditor;

View File

@@ -30,17 +30,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.FrequencyChangeListener;
import source.tuner.frequency.FrequencyChangeEvent.Event;
import source.tuner.frequency.IFrequencyChangeProcessor;
import source.tuner.rtl.RTL2832InfoPanel;
import com.jidesoft.swing.JideTabbedPane;
import controller.ResourceManager;
public class E4KTunerEditorPanel extends JPanel implements FrequencyChangeListener
public class E4KTunerEditorPanel extends JPanel implements IFrequencyChangeProcessor
{
private final static Logger mLog =
LoggerFactory.getLogger( E4KTunerEditorPanel.class );
@@ -48,15 +47,15 @@ public class E4KTunerEditorPanel extends JPanel implements FrequencyChangeListen
private static final long serialVersionUID = 1L;
private E4KTunerController mController;
private ResourceManager mResourceManager;
private SettingsManager mSettingsManager;
private JFrequencyControl mFrequencyControl;
public E4KTunerEditorPanel( E4KTunerController controller,
ResourceManager resourceManager )
SettingsManager settingsManager )
{
mController = controller;
mResourceManager = resourceManager;
mSettingsManager = settingsManager;
initGUI();
}
@@ -84,7 +83,7 @@ public class E4KTunerEditorPanel extends JPanel implements FrequencyChangeListen
tabs.setForeground( Color.BLACK );
tabs.addTab( "Configuration",
new E4KTunerConfigurationPanel( mResourceManager, mController ) );
new E4KTunerConfigurationPanel( mSettingsManager, mController ) );
tabs.addTab( "Info", new RTL2832InfoPanel( mController ) );
@@ -98,7 +97,7 @@ public class E4KTunerEditorPanel extends JPanel implements FrequencyChangeListen
@Override
public void frequencyChanged( FrequencyChangeEvent event )
{
if( event.getEvent() == Event.FREQUENCY_CHANGE_NOTIFICATION )
if( event.getEvent() == Event.NOTIFICATION_FREQUENCY_CHANGE )
{
final long frequency = event.getValue().longValue();

View File

@@ -48,6 +48,7 @@ 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;
@@ -57,7 +58,6 @@ import source.tuner.rtl.r820t.R820TTunerController.R820TGain;
import source.tuner.rtl.r820t.R820TTunerController.R820TLNAGain;
import source.tuner.rtl.r820t.R820TTunerController.R820TMixerGain;
import source.tuner.rtl.r820t.R820TTunerController.R820TVGAGain;
import controller.ResourceManager;
public class R820TTunerConfigurationPanel extends JPanel
{
@@ -67,7 +67,7 @@ public class R820TTunerConfigurationPanel extends JPanel
private static final long serialVersionUID = 1L;
private static final R820TGain DEFAULT_GAIN = R820TGain.GAIN_279;
private ResourceManager mResourceManager;
private SettingsManager mSettingsManager;
private R820TTunerController mController;
private R820TTunerConfiguration mSelectedConfig;
@@ -86,10 +86,10 @@ public class R820TTunerConfigurationPanel extends JPanel
private JComboBox<SampleRate> mComboSampleRate;
public R820TTunerConfigurationPanel( ResourceManager resourceManager,
public R820TTunerConfigurationPanel( SettingsManager settingsManager,
R820TTunerController controller )
{
mResourceManager = resourceManager;
mSettingsManager = settingsManager;
mController = controller;
init();
@@ -110,8 +110,8 @@ public class R820TTunerConfigurationPanel extends JPanel
mComboConfigurations.setModel( getModel() );
/* Determine which tuner configuration should be selected/displayed */
TunerConfigurationAssignment savedConfig = mResourceManager
.getSettingsManager().getSelectedTunerConfiguration(
TunerConfigurationAssignment savedConfig = mSettingsManager
.getSelectedTunerConfiguration(
TunerType.RAFAELMICRO_R820T, mController.getUniqueID() );
if( savedConfig != null )
@@ -126,7 +126,7 @@ public class R820TTunerConfigurationPanel extends JPanel
mSelectedConfig = mComboConfigurations.getItemAt( 0 );
//Store this config as the default for this tuner at this address
mResourceManager.getSettingsManager()
mSettingsManager
.setSelectedTunerConfiguration(
TunerType.RAFAELMICRO_R820T,
mController.getUniqueID(), mSelectedConfig );
@@ -549,7 +549,7 @@ public class R820TTunerConfigurationPanel extends JPanel
public void actionPerformed( ActionEvent e )
{
TunerConfiguration config =
mResourceManager.getSettingsManager()
mSettingsManager
.addNewTunerConfiguration(
TunerType.RAFAELMICRO_R820T,
"New Configuration" );
@@ -589,7 +589,7 @@ public class R820TTunerConfigurationPanel extends JPanel
if( n == JOptionPane.YES_OPTION )
{
mResourceManager.getSettingsManager()
mSettingsManager
.deleteTunerConfiguration( selected );
mComboConfigurations.setModel( getModel() );
@@ -630,7 +630,7 @@ public class R820TTunerConfigurationPanel extends JPanel
mComboSampleRate.setSelectedItem( mSelectedConfig.getSampleRate() );
mResourceManager.getSettingsManager().setSelectedTunerConfiguration(
mSettingsManager.setSelectedTunerConfiguration(
TunerType.RAFAELMICRO_R820T, mController.getUniqueID(), config );
}
catch ( SourceException e1 )
@@ -654,7 +654,7 @@ public class R820TTunerConfigurationPanel extends JPanel
private ComboBoxModel<R820TTunerConfiguration> getModel()
{
ArrayList<TunerConfiguration> configs =
mResourceManager.getSettingsManager()
mSettingsManager
.getTunerConfigurations( TunerType.RAFAELMICRO_R820T );
DefaultComboBoxModel<R820TTunerConfiguration> model =
@@ -674,7 +674,7 @@ public class R820TTunerConfigurationPanel extends JPanel
private R820TTunerConfiguration getNamedConfiguration( String name )
{
ArrayList<TunerConfiguration> configs =
mResourceManager.getSettingsManager()
mSettingsManager
.getTunerConfigurations( TunerType.RAFAELMICRO_R820T );
for( TunerConfiguration config: configs )
@@ -693,6 +693,6 @@ public class R820TTunerConfigurationPanel extends JPanel
*/
private void save()
{
mResourceManager.getSettingsManager().save();
mSettingsManager.save();
}
}

View File

@@ -33,11 +33,11 @@ import org.usb4java.Device;
import org.usb4java.DeviceDescriptor;
import org.usb4java.LibUsbException;
import settings.SettingsManager;
import source.SourceException;
import source.tuner.TunerConfiguration;
import source.tuner.TunerType;
import source.tuner.rtl.RTL2832TunerController;
import controller.ResourceManager;
import controller.ThreadPoolManager;
public class R820TTunerController extends RTL2832TunerController
@@ -139,11 +139,11 @@ public class R820TTunerController extends RTL2832TunerController
/**
* Controller gui editor component for this tuner
*/
public JPanel getEditor( ResourceManager resourceManager )
public JPanel getEditor( SettingsManager settingsManager )
{
if( mEditor == null )
{
mEditor = new R820TTunerEditorPanel( this, resourceManager );
mEditor = new R820TTunerEditorPanel( this, settingsManager );
}
return mEditor;

View File

@@ -30,17 +30,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.FrequencyChangeListener;
import source.tuner.frequency.FrequencyChangeEvent.Event;
import source.tuner.frequency.IFrequencyChangeProcessor;
import source.tuner.rtl.RTL2832InfoPanel;
import com.jidesoft.swing.JideTabbedPane;
import controller.ResourceManager;
public class R820TTunerEditorPanel extends JPanel implements FrequencyChangeListener
public class R820TTunerEditorPanel extends JPanel implements IFrequencyChangeProcessor
{
private final static Logger mLog =
LoggerFactory.getLogger( R820TTunerEditorPanel.class );
@@ -48,15 +47,15 @@ public class R820TTunerEditorPanel extends JPanel implements FrequencyChangeList
private static final long serialVersionUID = 1L;
private R820TTunerController mController;
private ResourceManager mResourceManager;
private SettingsManager mSettingsManager;
private JFrequencyControl mFrequencyControl;
public R820TTunerEditorPanel( R820TTunerController controller,
ResourceManager resourceManager )
SettingsManager settingsManager )
{
mController = controller;
mResourceManager = resourceManager;
mSettingsManager = settingsManager;
initGUI();
}
@@ -83,7 +82,7 @@ public class R820TTunerEditorPanel extends JPanel implements FrequencyChangeList
tabs.setForeground( Color.BLACK );
tabs.addTab( "Configuration",
new R820TTunerConfigurationPanel( mResourceManager, mController ) );
new R820TTunerConfigurationPanel( mSettingsManager, mController ) );
tabs.addTab( "Info", new RTL2832InfoPanel( mController ) );
@@ -97,7 +96,7 @@ public class R820TTunerEditorPanel extends JPanel implements FrequencyChangeList
@Override
public void frequencyChanged( FrequencyChangeEvent event )
{
if( event.getEvent() == Event.FREQUENCY_CHANGE_NOTIFICATION )
if( event.getEvent() == Event.NOTIFICATION_FREQUENCY_CHANGE )
{
final long frequency = event.getValue().longValue();

View File

@@ -51,11 +51,42 @@ public class ComplexWaveSource extends ComplexSource implements IControllableFil
public ComplexWaveSource( File file ) throws IOException
{
super( file.getAbsolutePath() );
mFile = file;
}
@Override
public void reset()
{
stop();
start();
}
@Override
public void start()
{
try
{
open();
}
catch ( IOException | UnsupportedAudioFileException e )
{
mLog.error( "Error starting complex wave source" );
}
}
@Override
public void stop()
{
try
{
close();
}
catch ( IOException e )
{
mLog.error( "Error stopping complex wave source" );
}
}
@Override
public long getFrameCount() throws IOException
{

View File

@@ -52,11 +52,46 @@ public class RealWaveSource extends RealSource
public RealWaveSource( File file ) throws IOException
{
super( file.getAbsolutePath() );
mFile = file;
}
@Override
public void reset()
{
stop();
start();
}
@Override
public void start()
{
try
{
open();
}
catch ( IOException | UnsupportedAudioFileException e )
{
mLog.error( "Error starting real wave source", e );
}
}
@Override
public void stop()
{
try
{
close();
}
catch ( IOException e )
{
mLog.error( "Error stopping real wave source", e );
}
}
@Override
public long getFrameCount() throws IOException
{