]> sigrok.org Git - pulseview.git/blob - pv/data/segment.hpp
Make get_raw_samples() use provided mem instead of allocating
[pulseview.git] / pv / data / segment.hpp
1 /*
2  * This file is part of the PulseView project.
3  *
4  * Copyright (C) 2017 Soeren Apel <soeren@apelpie.net>
5  * Copyright (C) 2012 Joel Holdsworth <joel@airwebreathe.org.uk>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #ifndef PULSEVIEW_PV_DATA_SEGMENT_HPP
22 #define PULSEVIEW_PV_DATA_SEGMENT_HPP
23
24 #include "pv/util.hpp"
25
26 #include <mutex>
27 #include <thread>
28 #include <vector>
29
30 using std::recursive_mutex;
31 using std::vector;
32
33 namespace SegmentTest {
34 struct SmallSize8Single;
35 struct MediumSize8Single;
36 struct MaxSize8Single;
37 struct MediumSize24Single;
38 struct MediumSize32Single;
39 struct MaxSize32Single;
40 struct MediumSize32Multi;
41 struct MaxSize32Multi;
42 struct MaxSize32MultiAtOnce;
43 struct MaxSize32MultiIterated;
44 }  // namespace SegmentTest
45
46 namespace pv {
47 namespace data {
48
49 typedef struct {
50         uint64_t sample_index, chunk_num, chunk_offs;
51         uint8_t* chunk;
52         uint8_t* value;
53 } SegmentRawDataIterator;
54
55 class Segment
56 {
57 private:
58         static const uint64_t MaxChunkSize;
59
60 public:
61         Segment(uint64_t samplerate, unsigned int unit_size);
62
63         virtual ~Segment();
64
65         uint64_t get_sample_count() const;
66
67         const pv::util::Timestamp& start_time() const;
68
69         double samplerate() const;
70         void set_samplerate(double samplerate);
71
72         unsigned int unit_size() const;
73
74         void free_unused_memory();
75
76 protected:
77         void append_single_sample(void *data);
78         void append_samples(void *data, uint64_t samples);
79         void get_raw_samples(uint64_t start, uint64_t count, uint8_t *dest) const;
80
81         SegmentRawDataIterator* begin_raw_sample_iteration(uint64_t start);
82         void continue_raw_sample_iteration(SegmentRawDataIterator* it, uint64_t increase);
83         void end_raw_sample_iteration(SegmentRawDataIterator* it);
84
85         mutable recursive_mutex mutex_;
86         vector<uint8_t*> data_chunks_;
87         uint8_t* current_chunk_;
88         uint64_t used_samples_, unused_samples_;
89         uint64_t sample_count_;
90         pv::util::Timestamp start_time_;
91         double samplerate_;
92         uint64_t chunk_size_;
93         unsigned int unit_size_;
94         int iterator_count_;
95         bool mem_optimization_requested_;
96
97         friend struct SegmentTest::SmallSize8Single;
98         friend struct SegmentTest::MediumSize8Single;
99         friend struct SegmentTest::MaxSize8Single;
100         friend struct SegmentTest::MediumSize24Single;
101         friend struct SegmentTest::MediumSize32Single;
102         friend struct SegmentTest::MaxSize32Single;
103         friend struct SegmentTest::MediumSize32Multi;
104         friend struct SegmentTest::MaxSize32Multi;
105         friend struct SegmentTest::MaxSize32MultiAtOnce;
106         friend struct SegmentTest::MaxSize32MultiIterated;
107 };
108
109 } // namespace data
110 } // namespace pv
111
112 #endif // PULSEVIEW_PV_DATA_SEGMENT_HPP