X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fdata%2Fdecodesignal.cpp;h=f1995dcae4f48c03b65f5efb6646fdf9dd24368f;hb=fe060a4874fc72655cced0596ef610a13f5b0413;hp=f5dc000169611e355e0d13c07182f81de4bffc5e;hpb=403c3e87178230339ceeb1927b2ed99d3fde046f;p=pulseview.git diff --git a/pv/data/decodesignal.cpp b/pv/data/decodesignal.cpp index f5dc000..f1995dc 100644 --- a/pv/data/decodesignal.cpp +++ b/pv/data/decodesignal.cpp @@ -65,7 +65,7 @@ DecodeSignal::DecodeSignal(pv::Session &session) : DecodeSignal::~DecodeSignal() { - reset_decode(); + reset_decode(true); } const vector< shared_ptr >& 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 &dec : stack_) + dec->invalidate_decoder_inst(); } }