X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fstoresession.cpp;h=741d18a660d73dc628e08eec6a7c151d521cebf6;hp=dede6a064cb8eda309f7384e180059bdb6398fd8;hb=7223eb629eb8eb3b03fa26b9f22770dd7f98c4d1;hpb=e40b2f294066331dc04598f4b0dccac2bab7c295 diff --git a/pv/storesession.cpp b/pv/storesession.cpp index dede6a06..741d18a6 100644 --- a/pv/storesession.cpp +++ b/pv/storesession.cpp @@ -27,6 +27,8 @@ #include #include +#include + using std::deque; using std::dynamic_pointer_cast; using std::lock_guard; @@ -40,6 +42,9 @@ using std::string; using std::thread; using std::vector; +using sigrok::ConfigKey; +using sigrok::Error; + namespace pv { const size_t StoreSession::BlockSize = 1024 * 1024; @@ -110,27 +115,23 @@ bool StoreSession::start() const shared_ptr snapshot(snapshots.front()); assert(snapshot); - // Make a list of probes - char **const probes = new char*[sigs.size() + 1]; - for (size_t i = 0; i < sigs.size(); i++) { - shared_ptr sig(sigs[i]); - assert(sig); - probes[i] = strdup(sig->get_name().toUtf8().constData()); - } - probes[sigs.size()] = NULL; - // Begin storing - if (sr_session_save_init(_file_name.c_str(), - data->samplerate(), probes) != SR_OK) { + try { + auto context = _session._sr_session->context(); + auto output_format = context->output_formats()["srzip"]; + auto device = _session.get_device(); + _output = output_format->create_output(device, + {{"filename", + Glib::Variant::create(_file_name)}}); + auto meta = context->create_meta_packet( + {{ConfigKey::SAMPLERATE, + Glib::Variant::create(data->samplerate())}}); + _output->receive(meta); + } catch (Error error) { _error = tr("Error while saving."); return false; } - // Delete the probes array - for (size_t i = 0; i <= sigs.size(); i++) - free(probes[i]); - delete[] probes; - _thread = std::thread(&StoreSession::store_proc, this, snapshot); return true; } @@ -179,9 +180,13 @@ void StoreSession::store_proc(shared_ptr snapshot) start_sample + samples_per_block, sample_count); snapshot->get_samples(data, start_sample, end_sample); - if(sr_session_append(_file_name.c_str(), data, unit_size, - end_sample - start_sample) != SR_OK) - { + size_t length = end_sample - start_sample; + + try { + auto context = _session._sr_session->context(); + auto logic = context->create_logic_packet(data, length, unit_size); + _output->receive(logic); + } catch (Error error) { _error = tr("Error while saving."); break; } @@ -190,9 +195,10 @@ void StoreSession::store_proc(shared_ptr snapshot) _units_stored = start_sample >> progress_scale; } - _unit_count = 0; progress_updated(); + _output.reset(); + delete[] data; }