14 Commits

Author SHA1 Message Date
c266a37a6b fix sdrplay configuration bug
Some checks failed
Build Binaries / build_debian_buster (push) Failing after 4s
Build Binaries / build_debian_bullseye (push) Failing after 4s
Build Binaries / build_debian_bookworm (push) Failing after 4s
Build Binaries / build_debian_sid (push) Failing after 6s
Build Binaries / build_ubuntu_focal (push) Failing after 4s
Build Binaries / build_ubuntu_jammy (push) Failing after 4s
Build Binaries / build_ubuntu_mantic (push) Failing after 4s
Build Binaries / build_ubuntu_noble (push) Failing after 3s
Build Binaries / build_android (push) Failing after 4s
Build Binaries / check_spelling (push) Failing after 4s
Build Binaries / check_formatting (push) Successful in 4s
Build Binaries / create_full_archive (push) Has been cancelled
Build Binaries / update_nightly_release (push) Has been cancelled
Build Binaries / build_windows (push) Has been cancelled
Build Binaries / build_macos_intel (push) Has been cancelled
Build Binaries / build_macos_arm (push) Has been cancelled
Build Binaries / build_raspios_bullseye_armhf (push) Has been cancelled
2024-12-18 23:19:40 +01:00
895199ae94 fix RSPdx bug
Some checks failed
Build Binaries / build_windows (push) Waiting to run
Build Binaries / build_macos_intel (push) Waiting to run
Build Binaries / build_macos_arm (push) Waiting to run
Build Binaries / build_raspios_bullseye_armhf (push) Waiting to run
Build Binaries / create_full_archive (push) Blocked by required conditions
Build Binaries / update_nightly_release (push) Blocked by required conditions
Build Binaries / build_debian_buster (push) Failing after 4s
Build Binaries / build_debian_bullseye (push) Failing after 5s
Build Binaries / build_debian_bookworm (push) Failing after 4s
Build Binaries / build_debian_sid (push) Failing after 4s
Build Binaries / build_ubuntu_focal (push) Failing after 4s
Build Binaries / build_ubuntu_jammy (push) Failing after 4s
Build Binaries / build_ubuntu_mantic (push) Failing after 4s
Build Binaries / build_ubuntu_noble (push) Failing after 4s
Build Binaries / build_android (push) Failing after 4s
Build Binaries / check_spelling (push) Failing after 4s
Build Binaries / check_formatting (push) Successful in 4s
2024-12-18 23:02:49 +01:00
d62426364a finish implementing support for RSP1B and RSPdx R2 + Improve samplerate and bandwidth code 2024-12-18 22:59:57 +01:00
304d5c42cc some fucking changes too lazy to name this shit 2024-11-27 21:49:46 +01:00
11f87e0fe2 fix menu order bug
Some checks failed
Build Binaries / build_debian_buster (push) Failing after 5s
Build Binaries / build_debian_bullseye (push) Failing after 5s
Build Binaries / build_debian_bookworm (push) Failing after 4s
Build Binaries / build_debian_sid (push) Failing after 4s
Build Binaries / build_ubuntu_focal (push) Failing after 5s
Build Binaries / build_ubuntu_jammy (push) Failing after 4s
Build Binaries / build_ubuntu_mantic (push) Failing after 5s
Build Binaries / build_ubuntu_noble (push) Failing after 5s
Build Binaries / build_android (push) Failing after 5s
Build Binaries / check_spelling (push) Failing after 4s
Build Binaries / check_formatting (push) Successful in 4s
Build Binaries / build_windows (push) Has been cancelled
Build Binaries / build_macos_intel (push) Has been cancelled
Build Binaries / build_macos_arm (push) Has been cancelled
Build Binaries / build_raspios_bullseye_armhf (push) Has been cancelled
Build Binaries / create_full_archive (push) Has been cancelled
Build Binaries / update_nightly_release (push) Has been cancelled
2024-11-09 19:28:34 +01:00
e192cb963b fix MacOS ARM CI
Some checks failed
Build Binaries / build_debian_buster (push) Failing after 5s
Build Binaries / build_debian_bullseye (push) Failing after 4s
Build Binaries / build_debian_sid (push) Failing after 5s
Build Binaries / build_debian_bookworm (push) Failing after 5s
Build Binaries / build_ubuntu_focal (push) Failing after 5s
Build Binaries / build_ubuntu_jammy (push) Failing after 5s
Build Binaries / build_ubuntu_mantic (push) Failing after 4s
Build Binaries / build_ubuntu_noble (push) Failing after 4s
Build Binaries / build_android (push) Failing after 5s
Build Binaries / check_spelling (push) Failing after 4s
Build Binaries / check_formatting (push) Successful in 5s
Build Binaries / build_windows (push) Has been cancelled
Build Binaries / build_macos_intel (push) Has been cancelled
Build Binaries / build_macos_arm (push) Has been cancelled
Build Binaries / build_raspios_bullseye_armhf (push) Has been cancelled
Build Binaries / create_full_archive (push) Has been cancelled
Build Binaries / update_nightly_release (push) Has been cancelled
2024-11-08 00:29:46 +01:00
fe407a2f27 Merge pull request #1521 from AlexandreRouma/new_source_menu
New source menu
2024-11-08 00:20:26 +01:00
6891d0bb0f final bugfixes to the new source menu
Some checks failed
Build Binaries / build_debian_buster (push) Failing after 4s
Build Binaries / build_debian_bullseye (push) Failing after 3s
Build Binaries / build_debian_bookworm (push) Failing after 6s
Build Binaries / build_debian_sid (push) Failing after 5s
Build Binaries / build_ubuntu_focal (push) Failing after 5s
Build Binaries / build_ubuntu_jammy (push) Failing after 4s
Build Binaries / build_ubuntu_mantic (push) Failing after 5s
Build Binaries / build_ubuntu_noble (push) Failing after 5s
Build Binaries / build_android (push) Failing after 5s
Build Binaries / check_spelling (push) Failing after 4s
Build Binaries / check_formatting (push) Successful in 4s
Build Binaries / build_windows (push) Has been cancelled
Build Binaries / build_macos_intel (push) Has been cancelled
Build Binaries / build_macos_arm (push) Has been cancelled
Build Binaries / build_raspios_bullseye_armhf (push) Has been cancelled
Build Binaries / create_full_archive (push) Has been cancelled
Build Binaries / update_nightly_release (push) Has been cancelled
2024-11-07 23:49:15 +01:00
b835d07573 finish custom offset definitions and fix bug in source selection 2024-11-07 17:39:52 +01:00
f205d97b52 Merge pull request #1518 from Oskar-Dudek/patch-3
Some checks failed
Build Binaries / build_windows (push) Waiting to run
Build Binaries / build_macos_intel (push) Waiting to run
Build Binaries / build_macos_arm (push) Waiting to run
Build Binaries / build_raspios_bullseye_armhf (push) Waiting to run
Build Binaries / create_full_archive (push) Blocked by required conditions
Build Binaries / update_nightly_release (push) Blocked by required conditions
Build Binaries / build_debian_buster (push) Failing after 4s
Build Binaries / build_debian_bullseye (push) Failing after 4s
Build Binaries / build_debian_bookworm (push) Failing after 5s
Build Binaries / build_debian_sid (push) Failing after 4s
Build Binaries / build_ubuntu_focal (push) Failing after 4s
Build Binaries / build_ubuntu_jammy (push) Failing after 8s
Build Binaries / build_ubuntu_mantic (push) Failing after 4s
Build Binaries / build_ubuntu_noble (push) Failing after 5s
Build Binaries / build_android (push) Failing after 5s
Build Binaries / check_spelling (push) Failing after 4s
Build Binaries / check_formatting (push) Successful in 4s
Fix ireland.json
2024-11-07 17:36:13 +01:00
628dcfcce0 Fix ireland.json
I used jsonlint.com and i edited it in some places and it says json valid, please can you try this version
2024-11-07 16:26:37 +00:00
d1e7cc56b4 re-disable the M17 decoder module in MacOS ARM nightly builds due to codec2 package bug 2024-11-07 15:02:16 +01:00
334860c963 attempt to enable M17 Decoder on MacOS ARM 2024-11-07 14:53:27 +01:00
69161253e8 source menu upgrade 2024-11-07 14:03:32 +01:00
5 changed files with 472 additions and 247 deletions

View File

@ -147,12 +147,12 @@ int sdrpp_main(int argc, char* argv[]) {
defConfig["menuElements"][3]["name"] = "Sinks"; defConfig["menuElements"][3]["name"] = "Sinks";
defConfig["menuElements"][3]["open"] = true; defConfig["menuElements"][3]["open"] = true;
defConfig["menuElements"][3]["name"] = "Frequency Manager"; defConfig["menuElements"][4]["name"] = "Frequency Manager";
defConfig["menuElements"][3]["open"] = true;
defConfig["menuElements"][4]["name"] = "VFO Color";
defConfig["menuElements"][4]["open"] = true; defConfig["menuElements"][4]["open"] = true;
defConfig["menuElements"][5]["name"] = "VFO Color";
defConfig["menuElements"][5]["open"] = true;
defConfig["menuElements"][6]["name"] = "Band Plan"; defConfig["menuElements"][6]["name"] = "Band Plan";
defConfig["menuElements"][6]["open"] = true; defConfig["menuElements"][6]["open"] = true;
@ -232,12 +232,19 @@ int sdrpp_main(int argc, char* argv[]) {
defConfig["modules"] = json::array(); defConfig["modules"] = json::array();
defConfig["offsetMode"] = (int)0; // Off defConfig["offsets"]["SpyVerter"] = 120000000.0;
defConfig["offset"] = 0.0; defConfig["offsets"]["Ham-It-Up"] = 125000000.0;
defConfig["offsets"]["MMDS S-band (1998MHz)"] = -1998000000.0;
defConfig["offsets"]["DK5AV X-Band"] = -6800000000.0;
defConfig["offsets"]["Ku LNB (9750MHz)"] = -9750000000.0;
defConfig["offsets"]["Ku LNB (10700MHz)"] = -10700000000.0;
defConfig["selectedOffset"] = "None";
defConfig["manualOffset"] = 0.0;
defConfig["showMenu"] = true; defConfig["showMenu"] = true;
defConfig["showWaterfall"] = true; defConfig["showWaterfall"] = true;
defConfig["source"] = ""; defConfig["source"] = "";
defConfig["decimationPower"] = 0; defConfig["decimation"] = 1;
defConfig["iqCorrection"] = false; defConfig["iqCorrection"] = false;
defConfig["invertIQ"] = false; defConfig["invertIQ"] = false;
@ -318,12 +325,18 @@ int sdrpp_main(int argc, char* argv[]) {
// Remove unused elements // Remove unused elements
auto items = core::configManager.conf.items(); auto items = core::configManager.conf.items();
auto newConf = core::configManager.conf;
bool configCorrected = false;
for (auto const& item : items) { for (auto const& item : items) {
if (!defConfig.contains(item.key())) { if (!defConfig.contains(item.key())) {
flog::info("Unused key in config {0}, repairing", item.key()); flog::info("Unused key in config {0}, repairing", item.key());
core::configManager.conf.erase(item.key()); newConf.erase(item.key());
configCorrected = true;
} }
} }
if (configCorrected) {
core::configManager.conf = newConf;
}
// Update to new module representation in config if needed // Update to new module representation in config if needed
for (auto [_name, inst] : core::configManager.conf["moduleInstances"].items()) { for (auto [_name, inst] : core::configManager.conf["moduleInstances"].items()) {

View File

@ -5,113 +5,120 @@
#include <gui/main_window.h> #include <gui/main_window.h>
#include <gui/style.h> #include <gui/style.h>
#include <signal_path/signal_path.h> #include <signal_path/signal_path.h>
#include <utils/optionlist.h>
#include <gui/dialogs/dialog_box.h>
namespace sourcemenu { namespace sourcemenu {
int offsetMode = 0;
int sourceId = 0; int sourceId = 0;
double customOffset = 0.0; EventHandler<std::string> sourcesChangedHandler;
double effectiveOffset = 0.0; EventHandler<std::string> sourceUnregisterHandler;
int decimationPower = 0; OptionList<std::string, std::string> sources;
std::string selectedSource;
int decimId = 0;
OptionList<int, int> decimations;
bool iqCorrection = false; bool iqCorrection = false;
bool invertIQ = false; bool invertIQ = false;
EventHandler<std::string> sourceRegisteredHandler; int offsetId = 0;
EventHandler<std::string> sourceUnregisterHandler; double manualOffset = 0.0;
EventHandler<std::string> sourceUnregisteredHandler; std::string selectedOffset;
double effectiveOffset = 0.0;
OptionList<std::string, double> offsets;
std::map<std::string, double> namedOffsets;
std::vector<std::string> sourceNames; bool showAddOffsetDialog = false;
std::string sourceNamesTxt; char newOffsetName[1024];
std::string selectedSource; double newOffset = 0.0;
bool showDelOffsetDialog = false;
std::string delOffsetName = "";
// Offset IDs
enum { enum {
OFFSET_MODE_NONE, OFFSET_ID_NONE,
OFFSET_MODE_CUSTOM, OFFSET_ID_MANUAL,
OFFSET_MODE_SPYVERTER, OFFSET_ID_CUSTOM_BASE
OFFSET_MODE_HAM_IT_UP,
OFFSET_MODE_MMDS_SB_1998,
OFFSET_MODE_DK5AV_XB,
OFFSET_MODE_KU_LNB_9750,
OFFSET_MODE_KU_LNB_10700,
_OFFSET_MODE_COUNT
}; };
const char* offsetModesTxt = "None\0"
"Custom\0"
"SpyVerter\0"
"Ham-It-Up\0"
"MMDS S-band (1998MHz)\0"
"DK5AV X-Band\0"
"Ku LNB (9750MHz)\0"
"Ku LNB (10700MHz)\0";
const char* decimationStages = "None\0"
"2\0"
"4\0"
"8\0"
"16\0"
"32\0"
"64\0";
void updateOffset() { void updateOffset() {
if (offsetMode == OFFSET_MODE_CUSTOM) { effectiveOffset = customOffset; } // Compute the effective offset
else if (offsetMode == OFFSET_MODE_SPYVERTER) { switch (offsetId) {
effectiveOffset = 120000000; case OFFSET_ID_NONE:
} // 120MHz Up-conversion
else if (offsetMode == OFFSET_MODE_HAM_IT_UP) {
effectiveOffset = 125000000;
} // 125MHz Up-conversion
else if (offsetMode == OFFSET_MODE_MMDS_SB_1998) {
effectiveOffset = -1998000000;
} // 1.998GHz Down-conversion
else if (offsetMode == OFFSET_MODE_DK5AV_XB) {
effectiveOffset = -6800000000;
} // 6.8GHz Down-conversion
else if (offsetMode == OFFSET_MODE_KU_LNB_9750) {
effectiveOffset = -9750000000;
} // 9.750GHz Down-conversion
else if (offsetMode == OFFSET_MODE_KU_LNB_10700) {
effectiveOffset = -10700000000;
} // 10.7GHz Down-conversion
else {
effectiveOffset = 0; effectiveOffset = 0;
break;
case OFFSET_ID_MANUAL:
effectiveOffset = manualOffset;
break;
default:
effectiveOffset = namedOffsets[offsets.name(offsetId)];
break;
} }
// Apply it
sigpath::sourceManager.setTuningOffset(effectiveOffset); sigpath::sourceManager.setTuningOffset(effectiveOffset);
} }
void selectOffsetById(int id) {
// Update the offset mode
offsetId = id;
selectedOffset = offsets.name(id);
// Update the offset
updateOffset();
}
void selectOffsetByName(const std::string& name) {
// If the name doesn't exist, select 'None'
if (!offsets.nameExists(name)) {
selectOffsetById(OFFSET_ID_NONE);
return;
}
// Select using the ID associated with the name
selectOffsetById(offsets.nameId(name));
}
void refreshSources() { void refreshSources() {
sourceNames = sigpath::sourceManager.getSourceNames(); // Get sources
sourceNamesTxt.clear(); auto sourceNames = sigpath::sourceManager.getSourceNames();
// Define source options
sources.clear();
for (auto name : sourceNames) { for (auto name : sourceNames) {
sourceNamesTxt += name; sources.define(name, name, name);
sourceNamesTxt += '\0';
} }
} }
void selectSource(std::string name) { void selectSource(std::string name) {
if (sourceNames.empty()) { // If there is no source, give up
if (sources.empty()) {
sourceId = 0;
selectedSource.clear(); selectedSource.clear();
return; return;
} }
auto it = std::find(sourceNames.begin(), sourceNames.end(), name);
if (it == sourceNames.end()) { // If a source with the given name doesn't exist, select the first source instead
selectSource(sourceNames[0]); if (!sources.valueExists(name)) {
selectSource(sources.value(0));
return; return;
} }
sourceId = std::distance(sourceNames.begin(), it);
selectedSource = sourceNames[sourceId]; // Update the GUI variables
sigpath::sourceManager.selectSource(sourceNames[sourceId]); sourceId = sources.valueId(name);
selectedSource = name;
// Select the source module
sigpath::sourceManager.selectSource(name);
} }
void onSourceRegistered(std::string name, void* ctx) { void onSourcesChanged(std::string name, void* ctx) {
// Update the source list
refreshSources(); refreshSources();
if (selectedSource.empty()) { // Reselect the current source
sourceId = 0; selectSource(selectedSource);
selectSource(sourceNames[0]);
return;
}
sourceId = std::distance(sourceNames.begin(), std::find(sourceNames.begin(), sourceNames.end(), selectedSource));
} }
void onSourceUnregister(std::string name, void* ctx) { void onSourceUnregister(std::string name, void* ctx) {
@ -120,60 +127,173 @@ namespace sourcemenu {
// TODO: Stop everything // TODO: Stop everything
} }
void onSourceUnregistered(std::string name, void* ctx) { void reloadOffsets() {
refreshSources(); // Clear list
offsets.clear();
namedOffsets.clear();
if (sourceNames.empty()) { // Define special offset modes
selectedSource = ""; offsets.define("None", OFFSET_ID_NONE);
return; offsets.define("Manual", OFFSET_ID_MANUAL);
// Acquire the config file
core::configManager.acquire();
// Load custom offsets
auto ofs = core::configManager.conf["offsets"].items();
for (auto& o : ofs) {
namedOffsets[o.key()] = (double)o.value();
} }
if (name == selectedSource) { // Define custom offsets
sourceId = std::clamp<int>(sourceId, 0, sourceNames.size() - 1); for (auto& [name, offset] : namedOffsets) {
selectSource(sourceNames[sourceId]); offsets.define(name, offsets.size());
return;
} }
sourceId = std::distance(sourceNames.begin(), std::find(sourceNames.begin(), sourceNames.end(), selectedSource)); // Release the config file
core::configManager.release();
} }
void init() { void init() {
// Load offset modes
reloadOffsets();
// Define decimation values
decimations.define(1, "None", 1);
decimations.define(2, "2x", 2);
decimations.define(4, "4x", 4);
decimations.define(8, "8x", 8);
decimations.define(16, "16x", 16);
decimations.define(32, "32x", 32);
decimations.define(64, "64x", 64);
// Acquire the config file
core::configManager.acquire(); core::configManager.acquire();
std::string selected = core::configManager.conf["source"];
customOffset = core::configManager.conf["offset"]; // Load other settings
offsetMode = core::configManager.conf["offsetMode"]; std::string selectedSource = core::configManager.conf["source"];
decimationPower = core::configManager.conf["decimationPower"]; manualOffset = core::configManager.conf["manualOffset"];
std::string selectedOffset = core::configManager.conf["selectedOffset"];
iqCorrection = core::configManager.conf["iqCorrection"]; iqCorrection = core::configManager.conf["iqCorrection"];
invertIQ = core::configManager.conf["invertIQ"]; invertIQ = core::configManager.conf["invertIQ"];
int decimation = core::configManager.conf["decimation"];
if (decimations.keyExists(decimation)) {
decimId = decimations.keyId(decimation);
}
// Release the config file
core::configManager.release();
// Select the source module
refreshSources();
selectSource(selectedSource);
// Update frontend settings
sigpath::iqFrontEnd.setDCBlocking(iqCorrection); sigpath::iqFrontEnd.setDCBlocking(iqCorrection);
sigpath::iqFrontEnd.setInvertIQ(invertIQ); sigpath::iqFrontEnd.setInvertIQ(invertIQ);
updateOffset(); sigpath::iqFrontEnd.setDecimation(decimations.value(decimId));
selectOffsetByName(selectedOffset);
refreshSources(); // Register handlers
selectSource(selected); sourcesChangedHandler.handler = onSourcesChanged;
sigpath::iqFrontEnd.setDecimation(1 << decimationPower);
sourceRegisteredHandler.handler = onSourceRegistered;
sourceUnregisterHandler.handler = onSourceUnregister; sourceUnregisterHandler.handler = onSourceUnregister;
sourceUnregisteredHandler.handler = onSourceUnregistered; sigpath::sourceManager.onSourceRegistered.bindHandler(&sourcesChangedHandler);
sigpath::sourceManager.onSourceRegistered.bindHandler(&sourceRegisteredHandler);
sigpath::sourceManager.onSourceUnregister.bindHandler(&sourceUnregisterHandler); sigpath::sourceManager.onSourceUnregister.bindHandler(&sourceUnregisterHandler);
sigpath::sourceManager.onSourceUnregistered.bindHandler(&sourceUnregisteredHandler); sigpath::sourceManager.onSourceUnregistered.bindHandler(&sourcesChangedHandler);
}
core::configManager.release(); void addOffset(const std::string& name, double offset) {
// Acquire the config file
core::configManager.acquire();
// Define a new offset
core::configManager.conf["offsets"][name] = offset;
// Acquire the config file
core::configManager.release(true);
// Reload the offsets
reloadOffsets();
// Attempt to re-select the same one
selectOffsetByName(selectedOffset);
}
void delOffset(const std::string& name) {
// Acquire the config file
core::configManager.acquire();
// Define a new offset
core::configManager.conf["offsets"].erase(name);
// Acquire the config file
core::configManager.release(true);
// Reload the offsets
reloadOffsets();
// Attempt to re-select the same one
selectOffsetByName(selectedOffset);
}
bool addOffsetDialog() {
bool open = true;
gui::mainWindow.lockWaterfallControls = true;
float menuWidth = ImGui::GetContentRegionAvail().x;
const char* id = "Add offset##sdrpp_add_offset_dialog_";
ImGui::OpenPopup(id);
if (ImGui::BeginPopup(id, ImGuiWindowFlags_NoResize)) {
ImGui::LeftLabel("Name");
ImGui::SetNextItemWidth(menuWidth - ImGui::GetCursorPosX());
ImGui::InputText("##sdrpp_add_offset_name", newOffsetName, 1023);
ImGui::LeftLabel("Offset");
ImGui::SetNextItemWidth(menuWidth - ImGui::GetCursorPosX());
ImGui::InputDouble("##sdrpp_add_offset_offset", &newOffset);
bool nameExists = offsets.nameExists(newOffsetName);
bool reservedName = !strcmp(newOffsetName, "None") || !strcmp(newOffsetName, "Manual");
bool denyApply = !newOffsetName[0] || nameExists || reservedName;
if (nameExists) {
ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "An offset with the given name already exists.");
}
else if (reservedName) {
ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "The given name is reserved.");
}
if (denyApply) { style::beginDisabled(); }
if (ImGui::Button("Apply")) {
addOffset(newOffsetName, newOffset);
open = false;
}
if (denyApply) { style::endDisabled(); }
ImGui::SameLine();
if (ImGui::Button("Cancel")) {
open = false;
}
ImGui::EndPopup();
}
return open;
} }
void draw(void* ctx) { void draw(void* ctx) {
float itemWidth = ImGui::GetContentRegionAvail().x; float itemWidth = ImGui::GetContentRegionAvail().x;
float lineHeight = ImGui::GetTextLineHeightWithSpacing();
float spacing = lineHeight - ImGui::GetTextLineHeight();
bool running = gui::mainWindow.sdrIsRunning(); bool running = gui::mainWindow.sdrIsRunning();
if (running) { style::beginDisabled(); } if (running) { style::beginDisabled(); }
ImGui::SetNextItemWidth(itemWidth); ImGui::SetNextItemWidth(itemWidth);
if (ImGui::Combo("##source", &sourceId, sourceNamesTxt.c_str())) { if (ImGui::Combo("##source", &sourceId, sources.txt)) {
selectSource(sourceNames[sourceId]); std::string newSource = sources.value(sourceId);
selectSource(newSource);
core::configManager.acquire(); core::configManager.acquire();
core::configManager.conf["source"] = sourceNames[sourceId]; core::configManager.conf["source"] = newSource;
core::configManager.release(true); core::configManager.release(true);
} }
@ -196,21 +316,45 @@ namespace sourcemenu {
} }
ImGui::LeftLabel("Offset mode"); ImGui::LeftLabel("Offset mode");
ImGui::SetNextItemWidth(itemWidth - ImGui::GetCursorPosX()); ImGui::SetNextItemWidth(itemWidth - ImGui::GetCursorPosX() - 2.0f*(lineHeight + 1.5f*spacing));
if (ImGui::Combo("##_sdrpp_offset_mode", &offsetMode, offsetModesTxt)) { if (ImGui::Combo("##_sdrpp_offset", &offsetId, offsets.txt)) {
updateOffset(); selectOffsetById(offsetId);
core::configManager.acquire(); core::configManager.acquire();
core::configManager.conf["offsetMode"] = offsetMode; core::configManager.conf["selectedOffset"] = offsets.key(offsetId);
core::configManager.release(true); core::configManager.release(true);
} }
ImGui::SameLine();
ImGui::SetCursorPosX(ImGui::GetCursorPosX() - spacing);
if (offsetId < OFFSET_ID_CUSTOM_BASE) { ImGui::BeginDisabled(); }
if (ImGui::Button("-##_sdrpp_offset_del_", ImVec2(lineHeight + 0.5f*spacing, 0))) {
delOffsetName = selectedOffset;
showDelOffsetDialog = true;
}
if (offsetId < OFFSET_ID_CUSTOM_BASE) { ImGui::EndDisabled(); }
ImGui::SameLine();
ImGui::SetCursorPosX(ImGui::GetCursorPosX() - spacing);
if (ImGui::Button("+##_sdrpp_offset_add_", ImVec2(lineHeight + 0.5f*spacing, 0))) {
strcpy(newOffsetName, "New Offset");
showAddOffsetDialog = true;
}
// Offset delete confirmation
if (ImGui::GenericDialog("sdrpp_del_offset_confirm", showDelOffsetDialog, GENERIC_DIALOG_BUTTONS_YES_NO, []() {
ImGui::Text("Deleting offset named \"%s\". Are you sure?", delOffsetName.c_str());
}) == GENERIC_DIALOG_BUTTON_YES) {
delOffset(delOffsetName);
}
// Offset add diaglog
if (showAddOffsetDialog) { showAddOffsetDialog = addOffsetDialog(); }
ImGui::LeftLabel("Offset"); ImGui::LeftLabel("Offset");
ImGui::SetNextItemWidth(itemWidth - ImGui::GetCursorPosX()); ImGui::FillWidth();
if (offsetMode == OFFSET_MODE_CUSTOM) { if (offsetId == OFFSET_ID_MANUAL) {
if (ImGui::InputDouble("##freq_offset", &customOffset, 1.0, 100.0)) { if (ImGui::InputDouble("##freq_offset", &manualOffset, 1.0, 100.0)) {
updateOffset(); updateOffset();
core::configManager.acquire(); core::configManager.acquire();
core::configManager.conf["offset"] = customOffset; core::configManager.conf["manualOffset"] = manualOffset;
core::configManager.release(true); core::configManager.release(true);
} }
} }
@ -222,11 +366,11 @@ namespace sourcemenu {
if (running) { style::beginDisabled(); } if (running) { style::beginDisabled(); }
ImGui::LeftLabel("Decimation"); ImGui::LeftLabel("Decimation");
ImGui::SetNextItemWidth(itemWidth - ImGui::GetCursorPosX()); ImGui::FillWidth();
if (ImGui::Combo("##source_decim", &decimationPower, decimationStages)) { if (ImGui::Combo("##source_decim", &decimId, decimations.txt)) {
sigpath::iqFrontEnd.setDecimation(1 << decimationPower); sigpath::iqFrontEnd.setDecimation(decimations.value(decimId));
core::configManager.acquire(); core::configManager.acquire();
core::configManager.conf["decimationPower"] = decimationPower; core::configManager.conf["decimation"] = decimations.key(decimId);
core::configManager.release(true); core::configManager.release(true);
} }
if (running) { style::endDisabled(); } if (running) { style::endDisabled(); }

View File

@ -1,3 +1,3 @@
#pragma once #pragma once
#define VERSION_STR "1.2.0" #define VERSION_STR "1.2.1"

View File

@ -23,6 +23,12 @@
"start": 531000, "start": 531000,
"end": 1602000 "end": 1602000
}, },
{
"name": "160m ham band",
"type": "amateur",
"start": 1810000,
"end": 2000000
},
{ {
"name": "120m SW broadcast", "name": "120m SW broadcast",
"type": "broadcast", "type": "broadcast",
@ -35,6 +41,12 @@
"start": 3200000, "start": 3200000,
"end": 3400000 "end": 3400000
}, },
{
"name": "80m ham band",
"type": "amateur",
"start": 3500000,
"end": 3800000
},
{ {
"name": "75m SW Broadcast", "name": "75m SW Broadcast",
"type": "broadcast", "type": "broadcast",
@ -47,12 +59,24 @@
"start": 4750000, "start": 4750000,
"end": 5060000 "end": 5060000
}, },
{
"name": "60m ham band",
"type": "amateur",
"start": 5351500,
"end": 5366500
},
{ {
"name": "49m SW Broadcast", "name": "49m SW Broadcast",
"type": "broadcast", "type": "broadcast",
"start": 5900000, "start": 5900000,
"end": 6200000 "end": 6200000
}, },
{
"name": "40m ham band",
"type": "amateur",
"start": 7000000,
"end": 7200000
},
{ {
"name": "40m SW Broadcast", "name": "40m SW Broadcast",
"type": "broadcast", "type": "broadcast",
@ -65,6 +89,12 @@
"start": 9400000, "start": 9400000,
"end": 9900000 "end": 9900000
}, },
{
"name": "30m ham band",
"type": "amateur",
"start": 10100000,
"end": 10150000
},
{ {
"name": "25m SW Broadcast", "name": "25m SW Broadcast",
"type": "broadcast", "type": "broadcast",
@ -77,12 +107,24 @@
"start": 13570000, "start": 13570000,
"end": 13870000 "end": 13870000
}, },
{
"name": "20m ham band",
"type": "amateur",
"start": 14000000,
"end": 14350000
},
{ {
"name": "19m SW Broadcast", "name": "19m SW Broadcast",
"type": "broadcast", "type": "broadcast",
"start": 15100000, "start": 15100000,
"end": 15800000 "end": 15800000
}, },
{
"name": "17m ham band",
"type": "amateur",
"start": 18068000,
"end": 18168000
},
{ {
"name": "16m SW Broadcast", "name": "16m SW Broadcast",
"type": "broadcast", "type": "broadcast",
@ -95,23 +137,65 @@
"start": 18900000, "start": 18900000,
"end": 19020000 "end": 19020000
}, },
{
"name": "15m ham band",
"type": "amateur",
"start": 21000000,
"end": 21450000
},
{ {
"name": "13m SW Broadcast", "name": "13m SW Broadcast",
"type": "broadcast", "type": "broadcast",
"start": 21450000, "start": 21450000,
"end": 21850000 "end": 21850000
}, },
{
"name": "12m ham band",
"type": "amateur",
"start": 24890000,
"end": 24990000
},
{ {
"name": "11m SW Broadcast", "name": "11m SW Broadcast",
"type": "broadcast", "type": "broadcast",
"start": 25670000, "start": 25670000,
"end": 26100000 "end": 26100000
}, },
{
"name": "10m ham band",
"type": "amateur",
"start": 28000000,
"end": 29700000
},
{ {
"name": "FM Broadcast", "name": "FM Broadcast",
"type": "broadcast", "type": "broadcast",
"start": 87500000, "start": 87500000,
"end": 108000000 "end": 108000000
},
{
"name": "6m ham band",
"type": "amateur",
"start": 50000000,
"end": 52000000
},
{
"name": "4m ham band",
"type": "amateur",
"start": 70000000,
"end": 70500000
},
{
"name": "2m ham band",
"type": "amateur",
"start": 144000000,
"end": 146000000
},
{
"name": "70cm ham band",
"type": "amateur",
"start": 430000000,
"end": 440000000
} }
] ]
} }

View File

@ -8,6 +8,7 @@
#include <config.h> #include <config.h>
#include <sdrplay_api.h> #include <sdrplay_api.h>
#include <gui/smgui.h> #include <gui/smgui.h>
#include <utils/optionlist.h>
#define CONCAT(a, b) ((std::string(a) + b).c_str()) #define CONCAT(a, b) ((std::string(a) + b).c_str())
@ -15,57 +16,12 @@ SDRPP_MOD_INFO{
/* Name: */ "sdrplay_source", /* Name: */ "sdrplay_source",
/* Description: */ "SDRplay source module for SDR++", /* Description: */ "SDRplay source module for SDR++",
/* Author: */ "Ryzerth", /* Author: */ "Ryzerth",
/* Version: */ 0, 1, 0, /* Version: */ 0, 2, 0,
/* Max instances */ 1 /* Max instances */ 1
}; };
ConfigManager config; ConfigManager config;
unsigned int sampleRates[] = {
2000000,
3000000,
4000000,
5000000,
6000000,
7000000,
8000000,
9000000,
10000000
};
const char* sampleRatesTxt =
"2MHz\0"
"3MHz\0"
"4MHz\0"
"5MHz\0"
"6MHz\0"
"7MHz\0"
"8MHz\0"
"9MHz\0"
"10MHz\0";
sdrplay_api_Bw_MHzT bandwidths[] = {
sdrplay_api_BW_0_200,
sdrplay_api_BW_0_300,
sdrplay_api_BW_0_600,
sdrplay_api_BW_1_536,
sdrplay_api_BW_5_000,
sdrplay_api_BW_6_000,
sdrplay_api_BW_7_000,
sdrplay_api_BW_8_000,
};
const char* bandwidthsTxt =
"200KHz\0"
"300KHz\0"
"600KHz\0"
"1.536MHz\0"
"5MHz\0"
"6MHz\0"
"7MHz\0"
"8MHz\0"
"Auto\0";
sdrplay_api_Bw_MHzT preferedBandwidth[] = { sdrplay_api_Bw_MHzT preferedBandwidth[] = {
sdrplay_api_BW_5_000, sdrplay_api_BW_5_000,
sdrplay_api_BW_5_000, sdrplay_api_BW_5_000,
@ -208,6 +164,11 @@ public:
name += devArr[i].SerNo; name += devArr[i].SerNo;
name += ')'; name += ')';
break; break;
case SDRPLAY_RSP1B_ID:
name = "RSP1B (";
name += devArr[i].SerNo;
name += ')';
break;
case SDRPLAY_RSP2_ID: case SDRPLAY_RSP2_ID:
name = "RSP2 ("; name = "RSP2 (";
name += devArr[i].SerNo; name += devArr[i].SerNo;
@ -223,6 +184,11 @@ public:
name += devArr[i].SerNo; name += devArr[i].SerNo;
name += ')'; name += ')';
break; break;
case SDRPLAY_RSPdxR2_ID:
name = "RSPdx-R2 (";
name += devArr[i].SerNo;
name += ')';
break;
default: default:
name = "Unknown ("; name = "Unknown (";
name += devArr[i].SerNo; name += devArr[i].SerNo;
@ -290,6 +256,30 @@ public:
return; return;
} }
// Define the valid samplerates
samplerates.clear();
samplerates.define(2e6, "2MHz", 2e6);
samplerates.define(3e6, "3MHz", 3e6);
samplerates.define(4e6, "4MHz", 4e6);
samplerates.define(5e6, "5MHz", 5e6);
samplerates.define(6e6, "6MHz", 6e6);
samplerates.define(7e6, "7MHz", 7e6);
samplerates.define(8e6, "8MHz", 8e6);
samplerates.define(9e6, "9MHz", 9e6);
samplerates.define(10e6, "10MHz", 10e6);
// Define the valid bandwidths
bandwidths.clear();
bandwidths.define(200e3, "200KHz", sdrplay_api_BW_0_200);
bandwidths.define(300e3, "300KHz", sdrplay_api_BW_0_300);
bandwidths.define(600e3, "600KHz", sdrplay_api_BW_0_600);
bandwidths.define(1.536e6, "1.536MHz", sdrplay_api_BW_1_536);
bandwidths.define(5e6, "5MHz", sdrplay_api_BW_5_000);
bandwidths.define(6e6, "6MHz", sdrplay_api_BW_6_000);
bandwidths.define(7e6, "7MHz", sdrplay_api_BW_7_000);
bandwidths.define(8e6, "8MHz", sdrplay_api_BW_8_000);
bandwidths.define(0, "Auto", sdrplay_api_BW_Undefined);
channelParams = openDevParams->rxChannelA; channelParams = openDevParams->rxChannelA;
selectedName = devNameList[id]; selectedName = devNameList[id];
@ -297,7 +287,7 @@ public:
if (openDev.hwVer == SDRPLAY_RSP1_ID) { if (openDev.hwVer == SDRPLAY_RSP1_ID) {
lnaSteps = 4; lnaSteps = 4;
} }
else if (openDev.hwVer == SDRPLAY_RSP1A_ID) { else if (openDev.hwVer == SDRPLAY_RSP1A_ID || openDev.hwVer == SDRPLAY_RSP1B_ID) {
lnaSteps = 10; lnaSteps = 10;
} }
else if (openDev.hwVer == SDRPLAY_RSP2_ID) { else if (openDev.hwVer == SDRPLAY_RSP2_ID) {
@ -306,78 +296,54 @@ public:
else if (openDev.hwVer == SDRPLAY_RSPduo_ID) { else if (openDev.hwVer == SDRPLAY_RSPduo_ID) {
lnaSteps = 10; lnaSteps = 10;
} }
else if (openDev.hwVer == SDRPLAY_RSPdx_ID) { else if (openDev.hwVer == SDRPLAY_RSPdx_ID || openDev.hwVer == SDRPLAY_RSPdxR2_ID) {
lnaSteps = 28; lnaSteps = 28;
} }
bool created = false; // Select default settings
srId = 0;
sampleRate = samplerates.value(0);
bandwidthId = 8;
lnaGain = lnaSteps - 1;
gain = 59;
agc = false;
agcAttack = 500;
agcDecay = 500;
agcDecayDelay = 200;
agcDecayThreshold = 5;
agcSetPoint = -30;
ifModeId = 0;
rsp1a_fmmwNotch = false;
rsp2_fmmwNotch = false;
rspdx_fmmwNotch = false;
rspduo_fmmwNotch = false;
rsp1a_dabNotch = false;
rspdx_dabNotch = false;
rspduo_dabNotch = false;
rsp1a_biasT = false;
rsp2_biasT = false;
rspdx_biasT = false;
rspduo_biasT = false;
rsp2_antennaPort = 0;
rspdx_antennaPort = 0;
rspduo_antennaPort = 0;
config.acquire(); config.acquire();
if (!config.conf["devices"].contains(selectedName)) {
created = true;
config.conf["devices"][selectedName]["sampleRate"] = sampleRates[0];
config.conf["devices"][selectedName]["bwMode"] = 8; // Auto
config.conf["devices"][selectedName]["lnaGain"] = lnaSteps - 1;
config.conf["devices"][selectedName]["ifGain"] = 59;
config.conf["devices"][selectedName]["agc"] = false;
config.conf["devices"][selectedName]["agcAttack"] = 500;
config.conf["devices"][selectedName]["agcDecay"] = 500;
config.conf["devices"][selectedName]["agcDecayDelay"] = 200;
config.conf["devices"][selectedName]["agcDecayThreshold"] = 5;
config.conf["devices"][selectedName]["agcSetPoint"] = -30;
config.conf["devices"][selectedName]["ifModeId"] = 0;
if (openDev.hwVer == SDRPLAY_RSP1_ID) {
// No config to load
}
else if (openDev.hwVer == SDRPLAY_RSP1A_ID) {
config.conf["devices"][selectedName]["fmmwNotch"] = false;
config.conf["devices"][selectedName]["dabNotch"] = false;
config.conf["devices"][selectedName]["biast"] = false;
}
else if (openDev.hwVer == SDRPLAY_RSP2_ID) {
config.conf["devices"][selectedName]["antenna"] = 0;
config.conf["devices"][selectedName]["fmmwNotch"] = false;
config.conf["devices"][selectedName]["biast"] = false;
}
else if (openDev.hwVer == SDRPLAY_RSPduo_ID) {
config.conf["devices"][selectedName]["antenna"] = 0;
config.conf["devices"][selectedName]["fmmwNotch"] = false;
config.conf["devices"][selectedName]["dabNotch"] = false;
config.conf["devices"][selectedName]["biast"] = false;
}
else if (openDev.hwVer == SDRPLAY_RSPdx_ID) {
config.conf["devices"][selectedName]["antenna"] = 0;
config.conf["devices"][selectedName]["fmmwNotch"] = false;
config.conf["devices"][selectedName]["dabNotch"] = false;
config.conf["devices"][selectedName]["biast"] = false;
}
}
// General options // General options
if (config.conf["devices"][selectedName].contains("sampleRate")) { if (config.conf["devices"][selectedName].contains("samplerate")) {
sampleRate = config.conf["devices"][selectedName]["sampleRate"]; int sr = config.conf["devices"][selectedName]["samplerate"];
bool found = false; if (samplerates.keyExists(sr)) {
for (int i = 0; i < 9; i++) { srId = samplerates.keyId(sr);
if (sampleRates[i] == sampleRate) { sampleRate = samplerates[srId];
srId = i;
found = true;
}
}
if (!found) {
sampleRate = sampleRates[0];
srId = 0;
} }
} }
if (config.conf["devices"][selectedName].contains("ifModeId")) { if (config.conf["devices"][selectedName].contains("ifModeId")) {
ifModeId = config.conf["devices"][selectedName]["ifModeId"]; ifModeId = config.conf["devices"][selectedName]["ifModeId"];
if (ifModeId != 0) { if (ifModeId != 0) {
sampleRate = ifModes[ifModeId].effectiveSamplerate; sampleRate = ifModes[ifModeId].effectiveSamplerate;
} }
} }
if (config.conf["devices"][selectedName].contains("bwMode")) { if (config.conf["devices"][selectedName].contains("bwMode")) {
bandwidthId = config.conf["devices"][selectedName]["bwMode"]; bandwidthId = config.conf["devices"][selectedName]["bwMode"];
} }
@ -388,11 +354,6 @@ public:
gain = config.conf["devices"][selectedName]["ifGain"]; gain = config.conf["devices"][selectedName]["ifGain"];
} }
if (config.conf["devices"][selectedName].contains("agc")) { if (config.conf["devices"][selectedName].contains("agc")) {
if (!config.conf["devices"][selectedName]["agc"].is_boolean()) {
int oldMode = config.conf["devices"][selectedName]["agc"];
config.conf["devices"][selectedName]["agc"] = (bool)(oldMode != 0);
created = true;
}
agc = config.conf["devices"][selectedName]["agc"]; agc = config.conf["devices"][selectedName]["agc"];
} }
if (config.conf["devices"][selectedName].contains("agcAttack")) { if (config.conf["devices"][selectedName].contains("agcAttack")) {
@ -415,7 +376,7 @@ public:
if (openDev.hwVer == SDRPLAY_RSP1_ID) { if (openDev.hwVer == SDRPLAY_RSP1_ID) {
// No config to load // No config to load
} }
else if (openDev.hwVer == SDRPLAY_RSP1A_ID) { else if (openDev.hwVer == SDRPLAY_RSP1A_ID || openDev.hwVer == SDRPLAY_RSP1B_ID) {
if (config.conf["devices"][selectedName].contains("fmmwNotch")) { if (config.conf["devices"][selectedName].contains("fmmwNotch")) {
rsp1a_fmmwNotch = config.conf["devices"][selectedName]["fmmwNotch"]; rsp1a_fmmwNotch = config.conf["devices"][selectedName]["fmmwNotch"];
} }
@ -451,7 +412,7 @@ public:
rspduo_biasT = config.conf["devices"][selectedName]["biast"]; rspduo_biasT = config.conf["devices"][selectedName]["biast"];
} }
} }
else if (openDev.hwVer == SDRPLAY_RSPdx_ID) { else if (openDev.hwVer == SDRPLAY_RSPdx_ID || openDev.hwVer == SDRPLAY_RSPdxR2_ID) {
if (config.conf["devices"][selectedName].contains("antenna")) { if (config.conf["devices"][selectedName].contains("antenna")) {
rspdx_antennaPort = config.conf["devices"][selectedName]["antenna"]; rspdx_antennaPort = config.conf["devices"][selectedName]["antenna"];
} }
@ -466,7 +427,7 @@ public:
} }
} }
config.release(created); config.release();
if (lnaGain >= lnaSteps) { lnaGain = lnaSteps - 1; } if (lnaGain >= lnaSteps) { lnaGain = lnaSteps - 1; }
@ -614,7 +575,7 @@ private:
// General options // General options
if (_this->ifModeId == 0) { if (_this->ifModeId == 0) {
_this->bandwidth = (_this->bandwidthId == 8) ? preferedBandwidth[_this->srId] : bandwidths[_this->bandwidthId]; _this->bandwidth = (_this->bandwidthId == 8) ? preferedBandwidth[_this->srId] : _this->bandwidths[_this->bandwidthId];
_this->openDevParams->devParams->fsFreq.fsHz = _this->sampleRate; _this->openDevParams->devParams->fsFreq.fsHz = _this->sampleRate;
_this->channelParams->tunerParams.bwType = _this->bandwidth; _this->channelParams->tunerParams.bwType = _this->bandwidth;
} }
@ -693,14 +654,14 @@ private:
} }
if (_this->ifModeId == 0) { if (_this->ifModeId == 0) {
if (SmGui::Combo(CONCAT("##sdrplay_sr", _this->name), &_this->srId, sampleRatesTxt)) { if (SmGui::Combo(CONCAT("##sdrplay_sr", _this->name), &_this->srId, _this->samplerates.txt)) {
_this->sampleRate = sampleRates[_this->srId]; _this->sampleRate = _this->samplerates[_this->srId];
if (_this->bandwidthId == 8) { if (_this->bandwidthId == 8) {
_this->bandwidth = preferedBandwidth[_this->srId]; _this->bandwidth = preferedBandwidth[_this->srId];
} }
core::setInputSampleRate(_this->sampleRate); core::setInputSampleRate(_this->sampleRate);
config.acquire(); config.acquire();
config.conf["devices"][_this->selectedName]["sampleRate"] = _this->sampleRate; config.conf["devices"][_this->selectedName]["samplerate"] = _this->samplerates.key(_this->srId);
config.release(true); config.release(true);
} }
@ -715,8 +676,8 @@ private:
SmGui::LeftLabel("Bandwidth"); SmGui::LeftLabel("Bandwidth");
SmGui::FillWidth(); SmGui::FillWidth();
if (SmGui::Combo(CONCAT("##sdrplay_bw", _this->name), &_this->bandwidthId, bandwidthsTxt)) { if (SmGui::Combo(CONCAT("##sdrplay_bw", _this->name), &_this->bandwidthId, _this->bandwidths.txt)) {
_this->bandwidth = (_this->bandwidthId == 8) ? preferedBandwidth[_this->srId] : bandwidths[_this->bandwidthId]; _this->bandwidth = (_this->bandwidthId == 8) ? preferedBandwidth[_this->srId] : _this->bandwidths[_this->bandwidthId];
if (_this->running) { if (_this->running) {
_this->channelParams->tunerParams.bwType = _this->bandwidth; _this->channelParams->tunerParams.bwType = _this->bandwidth;
sdrplay_api_Update(_this->openDev.dev, _this->openDev.tuner, sdrplay_api_Update_Tuner_BwType, sdrplay_api_Update_Ext1_None); sdrplay_api_Update(_this->openDev.dev, _this->openDev.tuner, sdrplay_api_Update_Tuner_BwType, sdrplay_api_Update_Ext1_None);
@ -745,10 +706,28 @@ private:
} }
else { else {
config.acquire(); config.acquire();
_this->sampleRate = config.conf["devices"][_this->selectedName]["sampleRate"]; // Reload samplerate
_this->bandwidthId = config.conf["devices"][_this->selectedName]["bwMode"]; if (config.conf["devices"][_this->selectedName].contains("samplerate")) {
config.release(false); int sr = config.conf["devices"][_this->selectedName]["samplerate"];
_this->bandwidth = (_this->bandwidthId == 8) ? preferedBandwidth[_this->srId] : bandwidths[_this->bandwidthId]; if (_this->samplerates.keyExists(sr)) {
_this->srId = _this->samplerates.keyId(sr);
}
}
else {
_this->srId = 0;
}
// Reload bandwidth
if (config.conf["devices"][_this->selectedName].contains("bwMode")) {
_this->bandwidthId = config.conf["devices"][_this->selectedName]["bwMode"];
}
else {
// Auto
_this->bandwidthId = 8;
}
_this->sampleRate = _this->samplerates[_this->srId];
config.release();
_this->bandwidth = (_this->bandwidthId == 8) ? preferedBandwidth[_this->srId] : _this->bandwidths[_this->bandwidthId];
} }
core::setInputSampleRate(_this->sampleRate); core::setInputSampleRate(_this->sampleRate);
config.acquire(); config.acquire();
@ -854,6 +833,7 @@ private:
_this->RSP1Menu(); _this->RSP1Menu();
break; break;
case SDRPLAY_RSP1A_ID: case SDRPLAY_RSP1A_ID:
case SDRPLAY_RSP1B_ID:
_this->RSP1AMenu(); _this->RSP1AMenu();
break; break;
case SDRPLAY_RSP2_ID: case SDRPLAY_RSP2_ID:
@ -863,6 +843,7 @@ private:
_this->RSPduoMenu(); _this->RSPduoMenu();
break; break;
case SDRPLAY_RSPdx_ID: case SDRPLAY_RSPdx_ID:
case SDRPLAY_RSPdxR2_ID:
_this->RSPdxMenu(); _this->RSPdxMenu();
break; break;
default: default:
@ -1146,7 +1127,7 @@ private:
sdrplay_api_RxChannelParamsT* channelParams; sdrplay_api_RxChannelParamsT* channelParams;
sdrplay_api_Bw_MHzT bandwidth; sdrplay_api_Bw_MHzT bandwidth;
int bandwidthId = 0; int bandwidthId = 8; // Auto
int devId = 0; int devId = 0;
int srId = 0; int srId = 0;
@ -1201,6 +1182,9 @@ private:
std::string devListTxt; std::string devListTxt;
std::vector<std::string> devNameList; std::vector<std::string> devNameList;
std::string selectedName; std::string selectedName;
OptionList<int, int> samplerates;
OptionList<int, sdrplay_api_Bw_MHzT> bandwidths;
}; };
MOD_EXPORT void _INIT_() { MOD_EXPORT void _INIT_() {