32 using std::lock_guard;
33 using std::recursive_mutex;
35 using std::max_element;
37 using std::min_element;
45 logf(EnvelopeScaleFactor);
49 uint64_t samplerate,
const uint64_t expected_num_samples) :
50 Segment(samplerate, sizeof(float))
54 lock_guard<recursive_mutex> lock(
mutex_);
60 lock_guard<recursive_mutex> lock(
mutex_);
66 size_t sample_count,
size_t stride)
70 lock_guard<recursive_mutex> lock(
mutex_);
76 const float *dst_end = dst + sample_count;
77 while (dst != dst_end) {
89 int64_t start_sample, int64_t end_sample)
const
91 assert(start_sample >= 0);
93 assert(end_sample >= 0);
94 assert(end_sample < (int64_t)sample_count_);
95 assert(start_sample <= end_sample);
97 lock_guard<recursive_mutex> lock(
mutex_);
99 float *
const data =
new float[end_sample - start_sample];
100 memcpy(data, (
float*)
data_.data() + start_sample,
sizeof(float) *
101 (end_sample - start_sample));
106 uint64_t start, uint64_t end,
float min_length)
const
109 assert(start <= end);
110 assert(min_length > 0);
112 lock_guard<recursive_mutex> lock(
mutex_);
114 const unsigned int min_level = max((
int)floorf(logf(min_length) /
116 const unsigned int scale_power = (min_level + 1) *
118 start >>= scale_power;
121 s.
start = start << scale_power;
122 s.
scale = 1 << scale_power;
143 uint64_t prev_length;
151 if (e0.
length == prev_length)
156 dest_ptr = e0.
samples + prev_length;
159 const float *
const end_src_ptr = (
float*)
data_.data() +
161 for (
const float *src_ptr = (
float*)
data_.data() +
165 *min_element(src_ptr, src_ptr + EnvelopeScaleFactor),
166 *max_element(src_ptr, src_ptr + EnvelopeScaleFactor),
169 *dest_ptr++ = sub_sample;
182 if (e.
length == prev_length)
191 for (dest_ptr = e.
samples + prev_length;
192 dest_ptr < end_dest_ptr; dest_ptr++) {
197 while (src_ptr < end_src_ptr) {
198 sub_sample.
min = min(sub_sample.
min, src_ptr->
min);
199 sub_sample.
max = max(sub_sample.
max, src_ptr->
max);
203 *dest_ptr = sub_sample;
void append_interleaved_samples(const float *data, size_t sample_count, size_t stride)
static const uint64_t EnvelopeDataUnit
const float * get_samples(int64_t start_sample, int64_t end_sample) const
static const unsigned int ScaleStepCount
void get_envelope_section(EnvelopeSection &s, uint64_t start, uint64_t end, float min_length) const
void set_capacity(uint64_t new_capacity)
Increase the capacity of the segment.
std::vector< uint8_t > data_
static const int EnvelopeScalePower
void append_payload_to_envelope_levels()
uint64_t get_sample_count() const
void reallocate_envelope(Envelope &l)
AnalogSegment(uint64_t samplerate, uint64_t expected_num_samples=0)
static const int EnvelopeScaleFactor
std::recursive_mutex mutex_
struct Envelope envelope_levels_[ScaleStepCount]
static const float LogEnvelopeScaleFactor