X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdata%2Fsegment.cpp;h=4533c9b41ef7eae4d5f092c05cb58970f8af7b8d;hp=ef555292a61a902fbea973298008f0c0bbcd89d3;hb=69e950969e45ddbf516069c28f72f5696c53af5d;hpb=50e56db003055e96c5a12e675889e4afad07b65c diff --git a/pv/data/segment.cpp b/pv/data/segment.cpp index ef555292..4533c9b4 100644 --- a/pv/data/segment.cpp +++ b/pv/data/segment.cpp @@ -46,7 +46,6 @@ Segment::Segment(uint32_t segment_id, uint64_t samplerate, unsigned int unit_siz mem_optimization_requested_(false), is_complete_(false) { - lock_guard lock(mutex_); assert(unit_size_ > 0); // Determine the number of samples we can fit in one chunk @@ -70,7 +69,6 @@ Segment::~Segment() uint64_t Segment::get_sample_count() const { - lock_guard lock(mutex_); return sample_count_; } @@ -102,6 +100,8 @@ uint32_t Segment::segment_id() const void Segment::set_complete() { is_complete_ = true; + + completed(); } bool Segment::is_complete() const @@ -211,21 +211,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 +309,5 @@ uint64_t Segment::get_iterator_valid_length(SegmentDataIterator* it) return ((chunk_size_ - it->chunk_offs) / unit_size_); } - } // namespace data } // namespace pv