Skip to content

Commit

Permalink
#1257 restores recording tuner feature. sdrtrunk now supports multipl…
Browse files Browse the repository at this point in the history
…e recording tuners. Recordings are automatically loaded/restored on application start and each recording tuner has to be manually enabled for use. (#1258)

Co-authored-by: Dennis Sheirer <dsheirer@github.com>
  • Loading branch information
DSheirer and Dennis Sheirer committed May 22, 2022
1 parent d003357 commit fc5c6ef
Show file tree
Hide file tree
Showing 10 changed files with 465 additions and 334 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ public static TunerConfiguration getTunerConfiguration(TunerType type, String un
case RAFAELMICRO_R820T:
return new R820TTunerConfiguration(uniqueID);
case RECORDING:
return new RecordingTunerConfiguration(uniqueID);
return RecordingTunerConfiguration.create();
default:
throw new IllegalArgumentException("Unrecognized tuner type [" + type.name() + "]");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,6 @@
import io.github.dsheirer.source.tuner.manager.IDiscoveredTunerStatusListener;
import io.github.dsheirer.source.tuner.manager.TunerStatus;
import io.github.dsheirer.util.ThreadPool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
Expand All @@ -42,6 +39,8 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Manages settings and configurations for all tuner types.
Expand Down Expand Up @@ -252,7 +251,6 @@ private DisabledTuner findDisabledTuner(DiscoveredTuner discoveredTuner)
*/
public void addTunerConfiguration(TunerConfiguration tunerConfiguration)
{
mLog.info("Adding tuner config: " + tunerConfiguration);
if(!mTunerConfigurations.stream().filter(config -> config.getTunerType().equals(tunerConfiguration.getTunerType()) &&
config.getUniqueID().equalsIgnoreCase(tunerConfiguration.getUniqueID())).findFirst().isPresent())
{
Expand Down Expand Up @@ -291,6 +289,17 @@ public TunerConfiguration getTunerConfiguration(TunerType type, String uniqueID
return config;
}

/**
* Get all tuner configurations that match the specified tuner type.
* @param tunerType to match
* @return list of all configurations.
*/
public List<TunerConfiguration> getTunerConfigurations(TunerType tunerType)
{
return mTunerConfigurations.stream().filter(tunerConfiguration -> tunerConfiguration.getTunerType()
.equals(tunerType)).toList();
}

/**
* Saves the current tuner configuration state and resets the save pending flag
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/*
* *****************************************************************************
* Copyright (C) 2014-2022 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 io.github.dsheirer.source.tuner.manager;

import io.github.dsheirer.preference.UserPreferences;
import io.github.dsheirer.source.SourceException;
import io.github.dsheirer.source.tuner.TunerClass;
import io.github.dsheirer.source.tuner.recording.RecordingTuner;
import io.github.dsheirer.source.tuner.recording.RecordingTunerConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Discovered tuner for recording tuner type.
*/
public class DiscoveredRecordingTuner extends DiscoveredTuner
{
private static final Logger mLog = LoggerFactory.getLogger(DiscoveredRecordingTuner.class);
private UserPreferences mUserPreferences;

/**
* Constructs an instance
* @param userPreferences instance
* @param recordingTunerConfiguration with recording path and frequency
*/
public DiscoveredRecordingTuner(UserPreferences userPreferences,
RecordingTunerConfiguration recordingTunerConfiguration)
{
mUserPreferences = userPreferences;
setTunerConfiguration(recordingTunerConfiguration);

//Default all recordings to be disabled on startup
setEnabled(false);
}

/**
* Access the tuner configuration as a recording tuner configuration
*/
public RecordingTunerConfiguration getRecordingTunerConfiguration()
{
return (RecordingTunerConfiguration) getTunerConfiguration();
}

@Override
public TunerClass getTunerClass()
{
return TunerClass.RECORDING_TUNER;
}

@Override
public String getId()
{
return getRecordingTunerConfiguration().getPath();
}

@Override
public void start()
{
if(!hasTuner())
{
mTuner = new RecordingTuner(mUserPreferences, this, getRecordingTunerConfiguration());

try
{
mTuner.start();
}
catch(SourceException se)
{
setErrorMessage("Error - " + se.getMessage());
}
}
}

@Override
public String toString()
{
return "Recording [" + getRecordingTunerConfiguration().getPath() + "]";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import io.github.dsheirer.source.tuner.channel.TunerChannelSource;
import io.github.dsheirer.source.tuner.configuration.TunerConfiguration;
import io.github.dsheirer.source.tuner.configuration.TunerConfigurationManager;
import io.github.dsheirer.source.tuner.recording.RecordingTunerConfiguration;
import io.github.dsheirer.source.tuner.ui.DiscoveredTunerModel;
import io.github.dsheirer.util.ThreadPool;
import java.nio.ByteBuffer;
Expand Down Expand Up @@ -89,6 +90,14 @@ public DiscoveredTunerModel getDiscoveredTunerModel()
return mDiscoveredTunerModel;
}

/**
* Tuner configuration manager
*/
public TunerConfigurationManager getTunerConfigurationManager()
{
return mTunerConfigurationManager;
}

/**
* Starts the tuner manager and loads all available tuners
*/
Expand Down Expand Up @@ -290,7 +299,26 @@ private void discoverSdrPlayTuners()
*/
private void discoverRecordingTuners()
{
//placeholder
List<TunerConfiguration> tunerConfigurations = getTunerConfigurationManager().getTunerConfigurations(TunerType.RECORDING);

if(tunerConfigurations.size() > 0)
{
mLog.info("Discovered [" + tunerConfigurations.size() + "] recording tuners");
}

for(TunerConfiguration tunerConfiguration: tunerConfigurations)
{
if(tunerConfiguration instanceof RecordingTunerConfiguration recordingTunerConfiguration)
{
DiscoveredRecordingTuner discoveredRecordingTuner =
new DiscoveredRecordingTuner(mUserPreferences, recordingTunerConfiguration);

discoveredRecordingTuner.addTunerStatusListener(this);
discoveredRecordingTuner.setEnabled(false);
mLog.info("Tuner Added: " + discoveredRecordingTuner);
mDiscoveredTunerModel.addDiscoveredTuner(discoveredRecordingTuner);
}
}
}

/**
Expand All @@ -315,13 +343,17 @@ public void tunerStatusUpdated(DiscoveredTuner discoveredTuner, TunerStatus prev
{
TunerType tunerType = discoveredTuner.getTuner().getTunerType();

TunerConfiguration tunerConfiguration = mTunerConfigurationManager
.getTunerConfiguration(tunerType, discoveredTuner.getId());

if(tunerConfiguration != null)
//Don't fetch or create a configuration for recording tuners
if(tunerType != TunerType.RECORDING)
{
discoveredTuner.setTunerConfiguration(tunerConfiguration);
mTunerConfigurationManager.saveConfigurations();
TunerConfiguration tunerConfiguration = mTunerConfigurationManager
.getTunerConfiguration(tunerType, discoveredTuner.getId());

if(tunerConfiguration != null)
{
discoveredTuner.setTunerConfiguration(tunerConfiguration);
mTunerConfigurationManager.saveConfigurations();
}
}
}
}
Expand Down

1 comment on commit fc5c6ef

@Tom-Neverwinter
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Amazing work!!!!

Please sign in to comment.