]> sigrok.org Git - pulseview.git/blobdiff - pv/data/logicsegment.cpp
DecodeSignal: Re-create SRD session when changes are pending
[pulseview.git] / pv / data / logicsegment.cpp
index dff99c01742239665d7575029f34e7b2ab765918..4b32f38d89992a6500293d0d462489a77a9e3243 100644 (file)
@@ -46,9 +46,9 @@ const int LogicSegment::MipMapScaleFactor = 1 << MipMapScalePower;
 const float LogicSegment::LogMipMapScaleFactor = logf(MipMapScaleFactor);
 const uint64_t LogicSegment::MipMapDataUnit = 64 * 1024; // bytes
 
-LogicSegment::LogicSegment(pv::data::Logic& owner, unsigned int unit_size,
-       uint64_t samplerate) :
-       Segment(samplerate, unit_size),
+LogicSegment::LogicSegment(pv::data::Logic& owner, uint32_t segment_id,
+       unsigned int unit_size, uint64_t samplerate) :
+       Segment(segment_id, samplerate, unit_size),
        owner_(owner),
        last_append_sample_(0)
 {
@@ -296,10 +296,11 @@ uint64_t LogicSegment::get_unpacked_sample(uint64_t index) const
 {
        assert(index < sample_count_);
 
-       uint8_t* data = new uint8_t[unit_size_];
+       assert(unit_size_ <= 8);  // 8 * 8 = 64 channels
+       uint8_t data[8];
+
        get_raw_samples(index, 1, data);
        uint64_t sample = unpack_sample(data);
-       delete[] data;
 
        return sample;
 }
@@ -314,7 +315,6 @@ void LogicSegment::get_subsampled_edges(
        bool last_sample;
        bool fast_forward;
 
-       assert(end <= get_sample_count());
        assert(start <= end);
        assert(min_length > 0);
        assert(sig_index >= 0);
@@ -322,6 +322,10 @@ void LogicSegment::get_subsampled_edges(
 
        lock_guard<recursive_mutex> lock(mutex_);
 
+       // Make sure we only process as many samples as we have
+       if (end > get_sample_count())
+               end = get_sample_count();
+
        const uint64_t block_length = (uint64_t)max(min_length, 1.0f);
        const unsigned int min_level = max((int)floorf(logf(min_length) /
                LogMipMapScaleFactor) - 1, 0);