Don't use qDebug().noquote() for now (bug #1169)
[pulseview.git] / pv / data / decodesignal.cpp
index f5dc000169611e355e0d13c07182f81de4bffc5e..f1995dcae4f48c03b65f5efb6646fdf9dd24368f 100644 (file)
@@ -65,7 +65,7 @@ DecodeSignal::DecodeSignal(pv::Session &session) :
 
 DecodeSignal::~DecodeSignal()
 {
-       reset_decode();
+       reset_decode(true);
 }
 
 const vector< shared_ptr<Decoder> >& DecodeSignal::decoder_stack() const
@@ -130,9 +130,9 @@ bool DecodeSignal::toggle_decoder_visibility(int index)
        return state;
 }
 
-void DecodeSignal::reset_decode()
+void DecodeSignal::reset_decode(bool shutting_down)
 {
-       if (stack_config_changed_)
+       if (stack_config_changed_ || shutting_down)
                stop_srd_session();
        else
                terminate_srd_session();
@@ -158,7 +158,8 @@ void DecodeSignal::reset_decode()
 
        if (!error_message_.isEmpty()) {
                error_message_ = QString();
-               qDebug().noquote().nospace() << name() << ": Error cleared";
+               // TODO Emulate noquote()
+               qDebug().nospace() << name() << ": Error cleared";
        }
 
        decode_reset();
@@ -588,7 +589,8 @@ void DecodeSignal::restore_settings(QSettings &settings)
 void DecodeSignal::set_error_message(QString msg)
 {
        error_message_ = msg;
-       qDebug().noquote().nospace() << name() << ": " << msg;
+       // TODO Emulate noquote()
+       qDebug().nospace() << name() << ": " << msg;
 }
 
 uint32_t DecodeSignal::get_input_segment_count() const
@@ -979,9 +981,8 @@ void DecodeSignal::decode_proc()
                                segments_.at(current_segment_id_).samplerate = input_segment->samplerate();
                                segments_.at(current_segment_id_).start_time = input_segment->start_time();
 
-                               // Reset decoder state
-                               stop_srd_session();
-                               start_srd_session();
+                               // Reset decoder state but keep the decoder stack intact
+                               terminate_srd_session();
                        } else {
                                // All segments have been processed
                                decode_finished();
@@ -1003,6 +1004,8 @@ void DecodeSignal::start_srd_session()
 {
        uint64_t samplerate;
 
+       // If there were stack changes, the session has been destroyed by now, so if
+       // it hasn't been destroyed, we can just reset and re-use it
        if (srd_session_) {
                // When a decoder stack was created before, re-use it
                // for the next stream of input data, after terminating
@@ -1075,6 +1078,10 @@ void DecodeSignal::stop_srd_session()
                // Destroy the session
                srd_session_destroy(srd_session_);
                srd_session_ = nullptr;
+
+               // Mark the decoder instances as non-existant since they were deleted
+               for (const shared_ptr<decode::Decoder> &dec : stack_)
+                       dec->invalidate_decoder_inst();
        }
 }