]> sigrok.org Git - pulseview.git/blobdiff - pv/data/decodesignal.cpp
DecodeSignal: Use srd_session_terminate_reset() for multi-segment data
[pulseview.git] / pv / data / decodesignal.cpp
index f5dc000169611e355e0d13c07182f81de4bffc5e..ecdacdefa6ec09d53c6a1e8b343b40e6f661e96b 100644 (file)
@@ -65,7 +65,7 @@ DecodeSignal::DecodeSignal(pv::Session &session) :
 
 DecodeSignal::~DecodeSignal()
 {
 
 DecodeSignal::~DecodeSignal()
 {
-       reset_decode();
+       reset_decode(true);
 }
 
 const vector< shared_ptr<Decoder> >& DecodeSignal::decoder_stack() const
 }
 
 const vector< shared_ptr<Decoder> >& DecodeSignal::decoder_stack() const
@@ -130,9 +130,9 @@ bool DecodeSignal::toggle_decoder_visibility(int index)
        return state;
 }
 
        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();
                stop_srd_session();
        else
                terminate_srd_session();
@@ -979,9 +979,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();
 
                                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();
                        } else {
                                // All segments have been processed
                                decode_finished();
@@ -1003,6 +1002,8 @@ void DecodeSignal::start_srd_session()
 {
        uint64_t samplerate;
 
 {
        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
        if (srd_session_) {
                // When a decoder stack was created before, re-use it
                // for the next stream of input data, after terminating
@@ -1075,6 +1076,10 @@ void DecodeSignal::stop_srd_session()
                // Destroy the session
                srd_session_destroy(srd_session_);
                srd_session_ = nullptr;
                // 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();
        }
 }
 
        }
 }