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