#include <pv/data/logicsnapshot.h>
#include <pv/view/signal.h>
+#include <libsigrok/libsigrok.hpp>
+
using std::deque;
using std::dynamic_pointer_cast;
using std::lock_guard;
using std::thread;
using std::vector;
+using sigrok::ConfigKey;
+using sigrok::Error;
+
namespace pv {
const size_t StoreSession::BlockSize = 1024 * 1024;
}
// Get the logic data
- //shared_ptr<data::SignalData
shared_ptr<data::Logic> data;
if (!(data = dynamic_pointer_cast<data::Logic>(*data_set.begin()))) {
_error = tr("PulseView currently only has support for "
const shared_ptr<data::LogicSnapshot> snapshot(snapshots.front());
assert(snapshot);
- // Make a list of channels
- char **const channels = new char*[sigs.size() + 1];
- for (size_t i = 0; i < sigs.size(); i++) {
- shared_ptr<view::Signal> sig(sigs[i]);
- assert(sig);
- channels[i] = strdup(sig->get_name().toUtf8().constData());
- }
- channels[sigs.size()] = NULL;
-
// Begin storing
- if (sr_session_save_init(SigSession::_sr_session, _file_name.c_str(),
- data->samplerate(), channels) != SR_OK) {
+ try {
+ auto context = _session.session()->context();
+ auto output_format = context->output_formats()["srzip"];
+ auto device = _session.device();
+ _output = output_format->create_output(device,
+ {{"filename",
+ Glib::Variant<Glib::ustring>::create(_file_name)}});
+ auto meta = context->create_meta_packet(
+ {{ConfigKey::SAMPLERATE,
+ Glib::Variant<guint64>::create(data->samplerate())}});
+ _output->receive(meta);
+ } catch (Error error) {
_error = tr("Error while saving.");
return false;
}
- // Delete the channels array
- for (size_t i = 0; i <= sigs.size(); i++)
- free(channels[i]);
- delete[] channels;
-
_thread = std::thread(&StoreSession::store_proc, this, snapshot);
return true;
}
start_sample + samples_per_block, sample_count);
snapshot->get_samples(data, start_sample, end_sample);
- if(sr_session_append(SigSession::_sr_session, _file_name.c_str(), data,
- unit_size, end_sample - start_sample) != SR_OK)
- {
+ size_t length = end_sample - start_sample;
+
+ try {
+ auto context = _session.session()->context();
+ auto logic = context->create_logic_packet(data, length, unit_size);
+ _output->receive(logic);
+ } catch (Error error) {
_error = tr("Error while saving.");
break;
}
_units_stored = start_sample >> progress_scale;
}
- _unit_count = 0;
progress_updated();
+ _output.reset();
+
delete[] data;
}