X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fdata%2Fsegment.cpp;h=18aabedbedd348bf0656635f60cb991757713e32;hb=36e62b1700d580adde53c8f4489037f0071fa6a0;hp=ef555292a61a902fbea973298008f0c0bbcd89d3;hpb=50e56db003055e96c5a12e675889e4afad07b65c;p=pulseview.git diff --git a/pv/data/segment.cpp b/pv/data/segment.cpp index ef555292..18aabedb 100644 --- a/pv/data/segment.cpp +++ b/pv/data/segment.cpp @@ -70,7 +70,6 @@ Segment::~Segment() uint64_t Segment::get_sample_count() const { - lock_guard lock(mutex_); return sample_count_; } @@ -102,6 +101,8 @@ uint32_t Segment::segment_id() const void Segment::set_complete() { is_complete_ = true; + + completed(); } bool Segment::is_complete() const @@ -211,21 +212,34 @@ void Segment::append_samples(void* data, uint64_t samples) sample_count_ += samples; } -void Segment::get_raw_samples(uint64_t start, uint64_t count, - uint8_t* dest) const +const uint8_t* Segment::get_raw_sample(uint64_t sample_num) const +{ + assert(sample_num <= sample_count_); + + uint64_t chunk_num = (sample_num * unit_size_) / chunk_size_; + uint64_t chunk_offs = (sample_num * unit_size_) % chunk_size_; + + lock_guard lock(mutex_); // Because of free_unused_memory() + + const uint8_t* chunk = data_chunks_[chunk_num]; + + return chunk + chunk_offs; +} + +void Segment::get_raw_samples(uint64_t start, uint64_t count, uint8_t* dest) const { assert(start < sample_count_); assert(start + count <= sample_count_); assert(count > 0); assert(dest != nullptr); - lock_guard lock(mutex_); - uint8_t* dest_ptr = dest; uint64_t chunk_num = (start * unit_size_) / chunk_size_; uint64_t chunk_offs = (start * unit_size_) % chunk_size_; + lock_guard lock(mutex_); // Because of free_unused_memory() + while (count > 0) { const uint8_t* chunk = data_chunks_[chunk_num]; @@ -296,6 +310,5 @@ uint64_t Segment::get_iterator_valid_length(SegmentDataIterator* it) return ((chunk_size_ - it->chunk_offs) / unit_size_); } - } // namespace data } // namespace pv