X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fdata%2Fdecodesignal.cpp;h=1d9f3c8ffb0dababec91fd579de2eef4b17e22e7;hb=b82243f74a175f621af26aabbc0f32e2ecb125fa;hp=b1f3cea75a9d8d40a629df8d2f67ddb824cf2c0d;hpb=d3feec232211b3acec6a323ca3b8008ed8b2faa0;p=pulseview.git diff --git a/pv/data/decodesignal.cpp b/pv/data/decodesignal.cpp index b1f3cea..1d9f3c8 100644 --- a/pv/data/decodesignal.cpp +++ b/pv/data/decodesignal.cpp @@ -49,8 +49,6 @@ const double DecodeSignal::DecodeMargin = 1.0; const double DecodeSignal::DecodeThreshold = 0.2; const int64_t DecodeSignal::DecodeChunkLength = 256 * 1024; -mutex DecodeSignal::global_srd_mutex_; - DecodeSignal::DecodeSignal(pv::Session &session) : SignalBase(nullptr, SignalBase::DecodeChannel), @@ -655,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); @@ -786,10 +787,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; @@ -822,13 +825,8 @@ void DecodeSignal::decode_proc() do { // Keep processing new samples until we exhaust the input data do { - // Prevent any other decode threads from accessing libsigrokdecode - lock_guard srd_lock(global_srd_mutex_); - - { - lock_guard input_lock(input_mutex_); - sample_count = segment_->get_sample_count() - abs_start_samplenum; - } + lock_guard input_lock(input_mutex_); + sample_count = segment_->get_sample_count() - abs_start_samplenum; if (sample_count > 0) { decode_data(abs_start_samplenum, sample_count);