aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ConfigParser.cpp54
-rw-r--r--src/output/SDR.cpp13
-rw-r--r--src/output/SDRDevice.h2
3 files changed, 47 insertions, 22 deletions
diff --git a/src/ConfigParser.cpp b/src/ConfigParser.cpp
index c92a520..085ed09 100644
--- a/src/ConfigParser.cpp
+++ b/src/ConfigParser.cpp
@@ -102,7 +102,7 @@ static void parse_configfile(
mod_settings.startupCheck = pt.Get("general.startupcheck", "");
// remote controller interfaces:
- if (pt.GetInteger("remotecontrol.telnet", 0) == 1) {
+ if (pt.GetBoolean("remotecontrol.telnet", false)) {
try {
int telnetport = pt.GetInteger("remotecontrol.telnetport", 0);
auto telnetrc = make_shared<RemoteControllerTelnet>(telnetport);
@@ -115,7 +115,7 @@ static void parse_configfile(
}
}
#if defined(HAVE_ZEROMQ)
- if (pt.GetInteger("remotecontrol.zmqctrl", 0) == 1) {
+ if (pt.GetBoolean("remotecontrol.zmqctrl", false)) {
try {
std::string zmqCtrlEndpoint = pt.Get("remotecontrol.zmqctrlendpoint", "");
auto zmqrc = make_shared<RemoteControllerZmq>(zmqCtrlEndpoint);
@@ -130,12 +130,33 @@ static void parse_configfile(
#endif
// input params:
- if (pt.GetInteger("input.loop", 0) == 1) {
+ if (pt.GetBoolean("input.loop", false)) {
mod_settings.loop = true;
}
mod_settings.inputTransport = pt.Get("input.transport", "file");
+ bool defaultBackpressureInput = false;
+ if (mod_settings.inputTransport == "edi" or
+ mod_settings.inputTransport == "tcp") {
+ defaultBackpressureInput = false;
+ }
+ else if (mod_settings.inputTransport == "file") {
+ defaultBackpressureInput = true;
+ }
+ else {
+ throw std::runtime_error("invalid input transport " +
+ mod_settings.inputTransport + " selected!");
+ }
+
+ // With unsynchronised sources (e.g. file input), the mod should
+ // throttle the input. For network inputs however, it's better to
+ // allow queue overflows, otherwise during startup, a slow output
+ // device will also block the entire mod and input.
+ mod_settings.sdr_device_config.blockingQueue =
+ pt.GetBoolean("input.backpressure_input", defaultBackpressureInput);
+
+
mod_settings.edi_max_delay_ms = pt.GetReal("input.edi_max_delay", 0.0);
mod_settings.inputName = pt.Get("input.source", "/dev/stdin");
@@ -150,11 +171,11 @@ static void parse_configfile(
#endif
}
- if (pt.GetInteger("log.syslog", 0) == 1) {
+ if (pt.GetBoolean("log.syslog", false)) {
etiLog.register_backend(make_shared<LogToSyslog>());
}
- if (pt.GetInteger("log.filelog", 0) == 1) {
+ if (pt.GetBoolean("log.filelog", false)) {
std::string logfilename;
try {
logfilename = pt.Get("log.filename", "");
@@ -173,7 +194,7 @@ static void parse_configfile(
etiLog.register_backend(make_shared<LogTracer>(trace_filename));
}
- mod_settings.showProcessTime = pt.GetInteger("log.show_process_time",
+ mod_settings.showProcessTime = pt.GetBoolean("log.show_process_time",
mod_settings.showProcessTime);
// modulator parameters:
@@ -195,13 +216,13 @@ static void parse_configfile(
mod_settings.ofdmWindowOverlap);
// FIR Filter parameters:
- if (pt.GetInteger("firfilter.enabled", 0) == 1) {
+ if (pt.GetBoolean("firfilter.enabled", false)) {
mod_settings.filterTapsFilename =
pt.Get("firfilter.filtertapsfile", "default");
}
// Poly coefficients:
- if (pt.GetInteger("poly.enabled", 0) == 1) {
+ if (pt.GetBoolean("poly.enabled", false)) {
mod_settings.polyCoefFilename =
pt.Get("poly.polycoeffile", "dpd/poly.coef");
@@ -210,7 +231,7 @@ static void parse_configfile(
}
// Crest factor reduction
- if (pt.GetInteger("cfr.enabled", 0) == 1) {
+ if (pt.GetBoolean("cfr.enabled", false)) {
mod_settings.enableCfr = true;
mod_settings.cfrClip = pt.GetReal("cfr.clip", 0.0);
mod_settings.cfrErrorClip = pt.GetReal("cfr.error_clip", 0.0);
@@ -231,8 +252,9 @@ static void parse_configfile(
std::cerr << " Configuration does not specify file name for file output\n";
throw std::runtime_error("Configuration error");
}
- mod_settings.fileOutputShowMetadata =
- (pt.GetInteger("fileoutput.show_metadata", 0) > 0);
+ mod_settings.fileOutputShowMetadata = pt.GetBoolean(
+ "fileoutput.show_metadata", false);
+
mod_settings.useFileOutput = true;
mod_settings.fileOutputFormat = pt.Get("fileoutput.format",
@@ -240,7 +262,7 @@ static void parse_configfile(
}
#if defined(HAVE_OUTPUT_UHD)
else if (output_selected == "uhd") {
- Output::SDRDeviceConfig sdr_device_config;
+ auto& sdr_device_config = mod_settings.sdr_device_config;
string device = pt.Get("uhdoutput.device", "");
const auto usrpType = pt.Get("uhdoutput.type", "");
@@ -309,7 +331,6 @@ static void parse_configfile(
sdr_device_config.dpdFeedbackServerPort = pt.GetInteger("uhdoutput.dpd_port", 0);
- mod_settings.sdr_device_config = sdr_device_config;
mod_settings.useUHDOutput = true;
}
#endif // defined(HAVE_OUTPUT_UHD)
@@ -446,8 +467,8 @@ static void parse_configfile(
#if defined(HAVE_OUTPUT_UHD) || defined(HAVE_DEXTER)
- mod_settings.sdr_device_config.enableSync = (pt.GetInteger("delaymanagement.synchronous", 0) == 1);
- mod_settings.sdr_device_config.muteNoTimestamps = (pt.GetInteger("delaymanagement.mutenotimestamps", 0) == 1);
+ mod_settings.sdr_device_config.enableSync = pt.GetBoolean("delaymanagement.synchronous", false);
+ mod_settings.sdr_device_config.muteNoTimestamps = pt.GetBoolean("delaymanagement.mutenotimestamps", false);
if (mod_settings.sdr_device_config.enableSync) {
std::string delay_mgmt = pt.Get("delaymanagement.management", "");
std::string fixedoffset = pt.Get("delaymanagement.fixedoffset", "");
@@ -468,9 +489,8 @@ static void parse_configfile(
}
#endif
-
/* Read TII parameters from config file */
- mod_settings.tiiConfig.enable = pt.GetInteger("tii.enable", 0);
+ mod_settings.tiiConfig.enable = pt.GetBoolean("tii.enable", false);
mod_settings.tiiConfig.comb = pt.GetInteger("tii.comb", 0);
mod_settings.tiiConfig.pattern = pt.GetInteger("tii.pattern", 0);
mod_settings.tiiConfig.old_variant = pt.GetInteger("tii.old_variant", 0);
diff --git a/src/output/SDR.cpp b/src/output/SDR.cpp
index 22398c7..7d5a609 100644
--- a/src/output/SDR.cpp
+++ b/src/output/SDR.cpp
@@ -188,10 +188,15 @@ meta_vec_t SDR::process_metadata(const meta_vec_t& metadataIn)
const auto max_size = m_config.enableSync ? FRAMES_MAX_SIZE_SYNC : FRAMES_MAX_SIZE_UNSYNC;
- auto r = m_queue.push_overflow(std::move(frame), max_size);
- etiLog.log(trace, "SDR,push %d %zu", r.overflowed, r.new_size);
-
- num_queue_overflows += r.overflowed ? 1 : 0;
+ if (m_config.blockingQueue) {
+ const auto new_size = m_queue.push_wait_if_full(std::move(frame), max_size);
+ etiLog.log(trace, "SDR,push 0 %zu", new_size);
+ }
+ else {
+ const auto r = m_queue.push_overflow(std::move(frame), max_size);
+ etiLog.log(trace, "SDR,push %d %zu", r.overflowed, r.new_size);
+ num_queue_overflows += r.overflowed ? 1 : 0;
+ }
}
}
else {
diff --git a/src/output/SDRDevice.h b/src/output/SDRDevice.h
index ec9373d..c466285 100644
--- a/src/output/SDRDevice.h
+++ b/src/output/SDRDevice.h
@@ -58,7 +58,7 @@ struct SDRDeviceConfig {
std::string rx_antenna;
bool fixedPoint = false;
-
+ bool blockingQueue = false;
long masterClockRate = 32768000;
unsigned sampleRate = 2048000;
double frequency = 0.0;