#include <algorithm>
-#include <boost/foreach.hpp>
-
#include "analogsnapshot.h"
-using namespace boost;
-using namespace std;
+using std::lock_guard;
+using std::recursive_mutex;
+using std::max;
+using std::max_element;
+using std::min;
+using std::min_element;
namespace pv {
namespace data {
logf(EnvelopeScaleFactor);
const uint64_t AnalogSnapshot::EnvelopeDataUnit = 64*1024; // bytes
-AnalogSnapshot::AnalogSnapshot(const sr_datafeed_analog &analog) :
+AnalogSnapshot::AnalogSnapshot(const uint64_t expected_num_samples) :
Snapshot(sizeof(float))
{
+ set_capacity(expected_num_samples);
+
lock_guard<recursive_mutex> lock(_mutex);
memset(_envelope_levels, 0, sizeof(_envelope_levels));
- append_payload(analog);
}
AnalogSnapshot::~AnalogSnapshot()
{
lock_guard<recursive_mutex> lock(_mutex);
- BOOST_FOREACH(Envelope &e, _envelope_levels)
+ for (Envelope &e : _envelope_levels)
free(e.samples);
}
-void AnalogSnapshot::append_payload(
- const sr_datafeed_analog &analog)
+void AnalogSnapshot::append_interleaved_samples(const float *data,
+ size_t sample_count, size_t stride)
{
+ assert(_unit_size == sizeof(float));
+
lock_guard<recursive_mutex> lock(_mutex);
- append_data(analog.data, analog.num_samples);
+
+ _data.resize((_sample_count + sample_count) * sizeof(float));
+
+ float *dst = (float*)_data.data() + _sample_count;
+ const float *dst_end = dst + sample_count;
+ while (dst != dst_end)
+ {
+ *dst++ = *data;
+ data += stride;
+ }
+
+ _sample_count += sample_count;
// Generate the first mip-map from the data
append_payload_to_envelope_levels();
lock_guard<recursive_mutex> lock(_mutex);
float *const data = new float[end_sample - start_sample];
- memcpy(data, (float*)_data + start_sample, sizeof(float) *
+ memcpy(data, (float*)_data.data() + start_sample, sizeof(float) *
(end_sample - start_sample));
return data;
}
dest_ptr = e0.samples + prev_length;
// Iterate through the samples to populate the first level mipmap
- const float *const end_src_ptr = (float*)_data +
+ const float *const end_src_ptr = (float*)_data.data() +
e0.length * EnvelopeScaleFactor;
- for (const float *src_ptr = (float*)_data +
+ for (const float *src_ptr = (float*)_data.data() +
prev_length * EnvelopeScaleFactor;
src_ptr < end_src_ptr; src_ptr += EnvelopeScaleFactor)
{