diff --git a/sdr-trunk.ipr b/sdr-trunk.ipr
new file mode 100644
index 00000000..912b20d7
--- /dev/null
+++ b/sdr-trunk.ipr
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1.6
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/io/github/dsheirer/source/SourceConfigurationEditor.java b/src/main/java/io/github/dsheirer/source/SourceConfigurationEditor.java
index 4f404e2b..8a903f3e 100644
--- a/src/main/java/io/github/dsheirer/source/SourceConfigurationEditor.java
+++ b/src/main/java/io/github/dsheirer/source/SourceConfigurationEditor.java
@@ -25,7 +25,8 @@ import io.github.dsheirer.source.mixer.MixerSourceEditor;
import io.github.dsheirer.source.tuner.TunerSourceEditor;
import net.miginfocom.swing.MigLayout;
-import javax.swing.*;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@@ -43,7 +44,7 @@ public class SourceConfigurationEditor extends Editor
mMixerSourceEditor = new MixerSourceEditor( sourceManager );
mMixerSourceEditor.setSaveRequestListener( this );
- mTunerSourceEditor = new TunerSourceEditor();
+ mTunerSourceEditor = new TunerSourceEditor(sourceManager.getTunerModel());
mTunerSourceEditor.setSaveRequestListener( this );
init();
diff --git a/src/main/java/io/github/dsheirer/source/SourceManager.java b/src/main/java/io/github/dsheirer/source/SourceManager.java
index 1a798b69..4af01bfd 100644
--- a/src/main/java/io/github/dsheirer/source/SourceManager.java
+++ b/src/main/java/io/github/dsheirer/source/SourceManager.java
@@ -59,6 +59,11 @@ public class SourceManager
return mTunerManager;
}
+ public TunerModel getTunerModel()
+ {
+ return mTunerModel;
+ }
+
public Source getSource(SourceConfiguration config, int bandwidth)
throws SourceException
{
diff --git a/src/main/java/io/github/dsheirer/source/config/SourceConfigTuner.java b/src/main/java/io/github/dsheirer/source/config/SourceConfigTuner.java
index 36686771..2b926be9 100644
--- a/src/main/java/io/github/dsheirer/source/config/SourceConfigTuner.java
+++ b/src/main/java/io/github/dsheirer/source/config/SourceConfigTuner.java
@@ -69,6 +69,15 @@ public class SourceConfigTuner extends SourceConfiguration
return mPreferredTuner;
}
+ /**
+ * Indicates if this configuration has a specified preferred tuner
+ */
+ @JsonIgnore
+ public boolean hasPreferredTuner()
+ {
+ return mPreferredTuner != null;
+ }
+
/**
* Specifies the preferred tuner to use for this configuration
* @param preferredTuner to use, if available
diff --git a/src/main/java/io/github/dsheirer/source/tuner/TunerModel.java b/src/main/java/io/github/dsheirer/source/tuner/TunerModel.java
index 3b7aa297..e5e52ee0 100644
--- a/src/main/java/io/github/dsheirer/source/tuner/TunerModel.java
+++ b/src/main/java/io/github/dsheirer/source/tuner/TunerModel.java
@@ -70,6 +70,28 @@ public class TunerModel extends AbstractTableModel implements Listener Tuners )
{
for( Tuner tuner: Tuners )
@@ -270,6 +292,31 @@ public class TunerModel extends AbstractTableModel implements Listener it = mTuners.iterator();
Tuner tuner;
+
+ if(config.hasPreferredTuner())
+ {
+ tuner = getTuner(config.getPreferredTuner());
+
+ if(tuner != null)
+ {
+ try
+ {
+ retVal = tuner.getChannel( tunerChannel );
+
+ if(retVal != null)
+ {
+ return retVal;
+ }
+ }
+ catch(Exception e)
+ {
+ //Fall through to logger below
+ }
+ }
+
+ mLog.info("Unable to source channel [" + config.getFrequency() + "] from preferred tuner [" +
+ config.getPreferredTuner() + "] - searching for another tuner");
+ }
while( it.hasNext() && retVal == null )
{
@@ -285,12 +332,10 @@ public class TunerModel extends AbstractTableModel implements Listener
******************************************************************************/
@@ -26,70 +26,164 @@ import io.github.dsheirer.source.tuner.frequency.FrequencyChangeEvent;
import io.github.dsheirer.source.tuner.frequency.IFrequencyChangeProcessor;
import net.miginfocom.swing.MigLayout;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
public class TunerSourceEditor extends Editor
{
private static final long serialVersionUID = 1L;
+ private static final String NO_PREFERRED_TUNER = "(none)";
+ private static final String UNAVAILABLE_TUNER = " (unavailable)";
private JFrequencyControl mFrequencyControl;
+ private JComboBox mTunerNameComboBox;
+ private TunerModel mTunerModel;
+ private List mCurrentTunerNames;
- public TunerSourceEditor()
- {
- init();
- }
+ public TunerSourceEditor(TunerModel tunerModel)
+ {
+ mTunerModel = tunerModel;
+ init();
+ }
- private void init()
- {
- setLayout( new MigLayout( "insets 0 0 0 0", "[left]", "" ) );
- mFrequencyControl = new JFrequencyControl();
- mFrequencyControl.setEnabled( false );
- mFrequencyControl.addListener( new IFrequencyChangeProcessor()
- {
- @Override
- public void frequencyChanged( FrequencyChangeEvent event )
- {
- setModified( true );
- }
- } );
- add( mFrequencyControl );
- }
+ private void init()
+ {
+ loadTunerNames();
- public void save()
- {
- if( hasItem() && isModified() )
- {
- SourceConfigTuner config = new SourceConfigTuner();
- config.setFrequency( mFrequencyControl.getFrequency() );
- getItem().setSourceConfiguration( config );
- }
+ setLayout(new MigLayout("insets 0 0 0 0", "[left]", ""));
+ mFrequencyControl = new JFrequencyControl();
+ mFrequencyControl.setEnabled(false);
+ mFrequencyControl.addListener(new IFrequencyChangeProcessor()
+ {
+ @Override
+ public void frequencyChanged(FrequencyChangeEvent event)
+ {
+ setModified(true);
+ }
+ });
+ add(mFrequencyControl);
- setModified( false );
- }
-
- @Override
- public void setItem( Channel item )
- {
- super.setItem( item );
-
- if( hasItem() )
- {
- SourceConfiguration config = getItem().getSourceConfiguration();
-
- mFrequencyControl.setEnabled( true );
+ mTunerNameComboBox = new JComboBox<>(mCurrentTunerNames.toArray(new String[mCurrentTunerNames.size()]));
+ mTunerNameComboBox.addActionListener(new ActionListener()
+ {
+ @Override
+ public void actionPerformed(ActionEvent e)
+ {
+ setModified(true);
+ }
+ });
+ add(new JLabel("Preferred Tuner:"));
+ add(mTunerNameComboBox);
+ }
- if( config instanceof SourceConfigTuner )
- {
- mFrequencyControl.setFrequency( ((SourceConfigTuner)config).getFrequency(), false );
- setModified( false );
- }
- else
- {
- mFrequencyControl.setFrequency( 101000000, false );
- setModified( true );
- }
- }
- else
- {
- mFrequencyControl.setEnabled( false );
- setModified( false );
- }
- }
+ private void loadTunerNames()
+ {
+ mCurrentTunerNames = new ArrayList<>();
+
+ for(Tuner tuner: mTunerModel.getTuners())
+ {
+ mCurrentTunerNames.add(tuner.getName());
+ }
+
+ Collections.sort(mCurrentTunerNames);
+
+ mCurrentTunerNames.add(0, NO_PREFERRED_TUNER);
+ }
+
+ private void updateTunerNameCombo(String preferredTuner)
+ {
+ if(preferredTuner != null && !mCurrentTunerNames.contains(preferredTuner))
+ {
+ List updatedTunerNameList = new ArrayList<>(mCurrentTunerNames);
+ String unavailableTuner = preferredTuner + UNAVAILABLE_TUNER;
+ updatedTunerNameList.add(unavailableTuner);
+ String[] tunerNameArray = updatedTunerNameList.toArray(new String[updatedTunerNameList.size()]);
+ mTunerNameComboBox.setModel(new DefaultComboBoxModel<>(tunerNameArray));
+ mTunerNameComboBox.setSelectedItem(unavailableTuner);
+ }
+ else
+ {
+ String[] tunerNameArray = mCurrentTunerNames.toArray(new String[mCurrentTunerNames.size()]);
+ mTunerNameComboBox.setModel(new DefaultComboBoxModel<>(tunerNameArray));
+
+ if(preferredTuner == null)
+ {
+ mTunerNameComboBox.setSelectedItem(NO_PREFERRED_TUNER);
+ }
+ else
+ {
+ mTunerNameComboBox.setSelectedItem(preferredTuner);
+ }
+ }
+ }
+
+ public void save()
+ {
+ if(hasItem() && isModified())
+ {
+ SourceConfigTuner config = new SourceConfigTuner();
+ config.setFrequency(mFrequencyControl.getFrequency());
+
+ String preferredTuner = (String)mTunerNameComboBox.getSelectedItem();
+
+ if(preferredTuner != null)
+ {
+ if(preferredTuner.equalsIgnoreCase(NO_PREFERRED_TUNER))
+ {
+ config.setPreferredTuner(null);
+ }
+ else if(preferredTuner.contains(UNAVAILABLE_TUNER))
+ {
+ //don't do anything - the config already contains this unavailable tuner name
+ }
+ else
+ {
+ config.setPreferredTuner(preferredTuner);
+ }
+ }
+
+ getItem().setSourceConfiguration(config);
+ }
+
+ setModified(false);
+ }
+
+ @Override
+ public void setItem(Channel item)
+ {
+ super.setItem(item);
+
+ if(hasItem())
+ {
+ SourceConfiguration config = getItem().getSourceConfiguration();
+
+ mFrequencyControl.setEnabled(true);
+
+ if(config instanceof SourceConfigTuner)
+ {
+ SourceConfigTuner tunerConfig = (SourceConfigTuner)config;
+
+ mFrequencyControl.setFrequency(tunerConfig.getFrequency(), false);
+
+ updateTunerNameCombo(tunerConfig.getPreferredTuner());
+
+ setModified(false);
+ }
+ else
+ {
+ mFrequencyControl.setFrequency(101000000, false);
+ setModified(true);
+ }
+ }
+ else
+ {
+ mFrequencyControl.setEnabled(false);
+ setModified(false);
+ }
+ }
}