X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fdata%2Fdecodesignal.cpp;h=5acf9eec634380533a2cb1c0bfeceb767cec6f7b;hb=5e95d3d980490ce37d3ae404998b8c89089391e3;hp=6ac66a1ab2af6cbd9e25e5e5f1bac00bf98f2389;hpb=767bf4e705c4b977301a956cb8d0c777f7e8c8d4;p=pulseview.git diff --git a/pv/data/decodesignal.cpp b/pv/data/decodesignal.cpp index 6ac66a1..5acf9ee 100644 --- a/pv/data/decodesignal.cpp +++ b/pv/data/decodesignal.cpp @@ -653,7 +653,10 @@ void DecodeSignal::mux_logic_samples(const int64_t start, const int64_t end) const shared_ptr logic_data = ch.assigned_signal->logic_data(); const shared_ptr 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); @@ -746,12 +749,24 @@ void DecodeSignal::query_input_metadata() // 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_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; })); - shared_ptr logic_data = - any_channel->assigned_signal->logic_data(); + logic_data = any_channel->assigned_signal->logic_data(); + + if (!logic_data) { + // Wait until input data is available or an interrupt was requested + unique_lock 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()) { @@ -784,10 +799,12 @@ void DecodeSignal::decode_data( 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;