- } while (error_message_.isEmpty() && (sample_count > 0) && !decode_interrupt_);
-
- if (error_message_.isEmpty() && !decode_interrupt_ && sample_count == 0) {
- if (current_segment_id_ < logic_mux_data_->logic_segments().size() - 1) {
- // Process next segment
- current_segment_id_++;
-
- try {
- input_segment = logic_mux_data_->logic_segments().at(current_segment_id_);
- } catch (out_of_range&) {
- qDebug() << "Decode error for" << name() << ": no logic mux segment" \
- << current_segment_id_ << "in decode_proc(), mux segments size is" \
- << logic_mux_data_->logic_segments().size();
- return;
+ } while (!decode_interrupt_ && (samples_to_process > 0));
+
+ if (!decode_interrupt_) {
+ // samples_to_process is now 0, we've exhausted the currently available input data
+
+ // If the input segment is complete, we've exhausted this segment
+ if (input_segment->is_complete()) {
+ if (current_segment_id_ < logic_mux_data_->logic_segments().size() - 1) {
+ // Process next segment
+ current_segment_id_++;
+
+ try {
+ input_segment = logic_mux_data_->logic_segments().at(current_segment_id_);
+ } catch (out_of_range&) {
+ qDebug() << "Decode error for" << name() << ": no logic mux segment" \
+ << current_segment_id_ << "in decode_proc(), mux segments size is" \
+ << logic_mux_data_->logic_segments().size();
+ decode_interrupt_ = true;
+ return;
+ }
+ abs_start_samplenum = 0;
+
+ // Create the next segment and set its metadata
+ create_decode_segment();
+ segments_.at(current_segment_id_).samplerate = input_segment->samplerate();
+ segments_.at(current_segment_id_).start_time = input_segment->start_time();
+
+ // Reset decoder state but keep the decoder stack intact
+ terminate_srd_session();
+ } else {
+ // All segments have been processed
+ decode_finished();