]> sigrok.org Git - pulseview.git/blobdiff - pv/data/segment.cpp
Implement single sample value getters
[pulseview.git] / pv / data / segment.cpp
index 2bac00621a0eb2de8dfd15c65f1cdfa5b9f22e4c..1dfdefd46704d030a2b950cfc9d0c2a219968d13 100644 (file)
@@ -211,6 +211,20 @@ void Segment::append_samples(void* data, uint64_t samples)
        sample_count_ += samples;
 }
 
+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<recursive_mutex> 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
 {
@@ -219,13 +233,13 @@ void Segment::get_raw_samples(uint64_t start, uint64_t count,
        assert(count > 0);
        assert(dest != nullptr);
 
-       lock_guard<recursive_mutex> 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<recursive_mutex> lock(mutex_);  // Because of free_unused_memory()
+
        while (count > 0) {
                const uint8_t* chunk = data_chunks_[chunk_num];