diff --git a/plugins/channelrx/demoddatv/datvdemodsink.cpp b/plugins/channelrx/demoddatv/datvdemodsink.cpp
index 0ba3033e9..7d29a2f8f 100644
--- a/plugins/channelrx/demoddatv/datvdemodsink.cpp
+++ b/plugins/channelrx/demoddatv/datvdemodsink.cpp
@@ -1281,16 +1281,28 @@ void DATVDemodSink::feed(const SampleVector::const_iterator& begin, const Sample
qDebug("DATVDemodSink::feed: Settings applied. Standard : %d...", m_settings.m_standard);
m_blnNeedConfigUpdate = false;
-
- if(m_settings.m_standard==DATVDemodSettings::DVB_S2)
+ try
{
- qDebug("DATVDemodSink::feed: init DVBS-2");
- InitDATVS2Framework();
+ if(m_settings.m_standard==DATVDemodSettings::DVB_S2)
+ {
+ qDebug("DATVDemodSink::feed: init DVBS-2");
+ InitDATVS2Framework();
+ }
+ else
+ {
+ qDebug("DATVDemodSink::feed: init DVBS");
+ InitDATVFramework();
+ }
}
- else
+ catch (const std::exception& e)
{
- qDebug("DATVDemodSink::feed: init DVBS");
- InitDATVFramework();
+ // leansdr uses fail() for unrecoverable internal errors.
+ // Convert these into a DATV initialization failure instead of
+ // allowing them to terminate the application.
+ qCritical("DATVDemodSink::feed: DATV framework initialization failed: %s", e.what());
+
+ CleanUpDATVFramework();
+ return;
}
}
diff --git a/plugins/channelrx/demoddatv/leansdr/framework.cpp b/plugins/channelrx/demoddatv/leansdr/framework.cpp
index f2db59ec5..a7bf416b5 100644
--- a/plugins/channelrx/demoddatv/leansdr/framework.cpp
+++ b/plugins/channelrx/demoddatv/leansdr/framework.cpp
@@ -14,17 +14,23 @@
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see . //
///////////////////////////////////////////////////////////////////////////////////////
+
+#include
+#include
+
#include "framework.h"
namespace leansdr
{
-void fatal(const char *s) {
+[[noreturn]] void fatal(const char *s) {
perror(s);
+ throw std::runtime_error(std::string("leansdr fatal: ") + s);
}
-void fail(const char *s) {
- fprintf(stderr, "** %s\n", s);
+[[noreturn]] void fail(const char *s) {
+ fprintf(stderr, "** leansdr fail: %s\n", s);
+ throw std::runtime_error(std::string("leansdr fail: ") + s);
}
} // leansdr
diff --git a/plugins/channelrx/demoddatv/leansdr/framework.h b/plugins/channelrx/demoddatv/leansdr/framework.h
index ffa7a5559..0ebb7bd90 100644
--- a/plugins/channelrx/demoddatv/leansdr/framework.h
+++ b/plugins/channelrx/demoddatv/leansdr/framework.h
@@ -35,8 +35,8 @@
namespace leansdr
{
-void fatal(const char *s);
-void fail(const char *s);
+[[noreturn]] void fatal(const char *s);
+[[noreturn]] void fail(const char *s);
//////////////////////////////////////////////////////////////////////
// DSP framework