void DecodeSignal::stack_decoder(const srd_decoder *decoder)
{
assert(decoder);
- stack_.push_back(make_shared<decode::Decoder>(decoder));
+ const shared_ptr<Decoder> dec = make_shared<decode::Decoder>(decoder);
+
+ stack_.push_back(dec);
// Set name if this decoder is the first in the list
if (stack_.size() == 1)
// Include the newly created decode channels in the channel lists
update_channel_list();
- auto_assign_signals();
+ auto_assign_signals(dec);
commit_decoder_channels();
begin_decode();
}
return channels_;
}
-void DecodeSignal::auto_assign_signals()
+void DecodeSignal::auto_assign_signals(const shared_ptr<Decoder> dec)
{
bool new_assignment = false;
// Try to auto-select channels that don't have signals assigned yet
for (data::DecodeChannel &ch : channels_) {
+ // If a decoder is given, auto-assign only its channels
+ if (dec && (ch.decoder_ != dec))
+ continue;
+
if (ch.assigned_signal)
continue;
const shared_ptr<Logic> logic_data = ch.assigned_signal->logic_data();
const shared_ptr<LogicSegment> segment = logic_data->logic_segments().front();
segments.push_back(segment);
- signal_data.push_back(segment->get_samples(start, end));
+
+ uint8_t* data = new uint8_t[(end - start) * segment->unit_size()];
+ segment->get_samples(start, end, data);
+ signal_data.push_back(data);
const int bitpos = ch.assigned_signal->logic_bit_index();
signal_in_bytepos.push_back(bitpos / 8);
// TODO Currently we assume all channels have the same sample rate
// and start time
bool samplerate_valid = false;
+ data::DecodeChannel *any_channel;
+ shared_ptr<Logic> logic_data;
- auto any_channel = find_if(channels_.begin(), channels_.end(),
- [](data::DecodeChannel ch) { return ch.assigned_signal; });
+ do {
+ any_channel = &(*find_if(channels_.begin(), channels_.end(),
+ [](data::DecodeChannel ch) { return ch.assigned_signal; }));
+
+ logic_data = any_channel->assigned_signal->logic_data();
- shared_ptr<Logic> logic_data =
- any_channel->assigned_signal->logic_data();
+ if (!logic_data) {
+ // Wait until input data is available or an interrupt was requested
+ unique_lock<mutex> input_wait_lock(input_mutex_);
+ decode_input_cond_.wait(input_wait_lock);
+ }
+ } while (!logic_data && !decode_interrupt_);
+
+ if (decode_interrupt_)
+ return;
do {
if (!logic_data->logic_segments().empty()) {
const int64_t chunk_end = min(i + chunk_sample_count,
abs_start_samplenum + sample_count);
- const uint8_t* chunk = segment_->get_samples(i, chunk_end);
+ int64_t data_size = (chunk_end - i) * unit_size;
+ uint8_t* chunk = new uint8_t[data_size];
+ segment_->get_samples(i, chunk_end, chunk);
if (srd_session_send(srd_session_, i, chunk_end, chunk,
- (chunk_end - i) * unit_size, unit_size) != SRD_OK) {
+ data_size, unit_size) != SRD_OK) {
error_message_ = tr("Decoder reported an error");
delete[] chunk;
break;