From: Martin Ling Date: Wed, 12 Nov 2014 17:29:46 +0000 (+0000) Subject: Reimplement file save using the srzip output module. X-Git-Tag: pulseview-0.3.0~518 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=7223eb629eb8eb3b03fa26b9f22770dd7f98c4d1;p=pulseview.git Reimplement file save using the srzip output module. This should fix (part of) bug #451. --- diff --git a/pv/storesession.cpp b/pv/storesession.cpp index d5355cba..741d18a6 100644 --- a/pv/storesession.cpp +++ b/pv/storesession.cpp @@ -42,6 +42,7 @@ using std::string; using std::thread; using std::vector; +using sigrok::ConfigKey; using sigrok::Error; namespace pv { @@ -114,28 +115,23 @@ bool StoreSession::start() const shared_ptr 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 sig(sigs[i]); - assert(sig); - channels[i] = strdup(sig->get_name().toUtf8().constData()); - } - channels[sigs.size()] = NULL; - // Begin storing try { - SigSession::_sr_session->begin_save(_file_name); + 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 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; } @@ -187,7 +183,9 @@ void StoreSession::store_proc(shared_ptr snapshot) size_t length = end_sample - start_sample; try { - SigSession::_sr_session->append(data, length, unit_size); + 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; @@ -197,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; } diff --git a/pv/storesession.h b/pv/storesession.h index 83664274..d365730e 100644 --- a/pv/storesession.h +++ b/pv/storesession.h @@ -30,6 +30,10 @@ #include +namespace sigrok { +class Output; +} + namespace pv { class SigSession; @@ -71,6 +75,8 @@ private: const std::string _file_name; const SigSession &_session; + std::shared_ptr _output; + std::thread _thread; std::atomic _interrupt;