+
+ } else
+ // Currently, we only handle A2L conversions
+ return;
+
+ // If we had to wait for input data, we may have been notified to terminate
+ if (conversion_interrupt_)
+ return;
+
+ uint32_t segment_id = 0;
+
+ shared_ptr<AnalogSegment> asegment = analog_data->analog_segments().front();
+ assert(asegment);
+ connect(asegment.get(), SIGNAL(completed()), this, SLOT(on_input_segment_completed()));
+
+ const shared_ptr<Logic> logic_data = dynamic_pointer_cast<Logic>(converted_data_);
+ assert(logic_data);
+
+ // Create the initial logic data segment if needed
+ if (logic_data->logic_segments().size() == 0) {
+ shared_ptr<LogicSegment> new_segment =
+ make_shared<LogicSegment>(*logic_data.get(), 0, 1, asegment->samplerate());
+ logic_data->push_segment(new_segment);
+ }
+
+ shared_ptr<LogicSegment> lsegment = logic_data->logic_segments().front();
+ assert(lsegment);
+
+ do {
+ convert_single_segment(asegment, lsegment);
+
+ // Only advance to next segment if the current input segment is complete
+ if (asegment->is_complete() &&
+ analog_data->analog_segments().size() > logic_data->logic_segments().size()) {
+
+ disconnect(asegment.get(), SIGNAL(completed()), this, SLOT(on_input_segment_completed()));
+
+ // There are more segments to process
+ segment_id++;
+
+ try {
+ asegment = analog_data->analog_segments().at(segment_id);
+ disconnect(asegment.get(), SIGNAL(completed()), this, SLOT(on_input_segment_completed()));
+ connect(asegment.get(), SIGNAL(completed()), this, SLOT(on_input_segment_completed()));
+ } catch (out_of_range&) {
+ qDebug() << "Conversion error for" << name() << ": no analog segment" \
+ << segment_id << ", segments size is" << analog_data->analog_segments().size();
+ return;
+ }
+
+ shared_ptr<LogicSegment> new_segment = make_shared<LogicSegment>(
+ *logic_data.get(), segment_id, 1, asegment->samplerate());
+ logic_data->push_segment(new_segment);
+
+ lsegment = logic_data->logic_segments().back();
+ } else {
+ // No more samples/segments to process, wait for data or interrupt
+ if (!conversion_interrupt_) {
+ unique_lock<mutex> input_lock(conversion_input_mutex_);
+ conversion_input_cond_.wait(input_lock);
+ }
+ }