X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fdata%2Fdecoder.cpp;fp=pv%2Fdata%2Fdecoder.cpp;h=a9168ae2bdd33f8ec73fc46cfbf08c04e272c512;hb=4e5a4405482a296ebb6014e627298ad156c78d55;hp=9e7145f34fe4ffd2c715f141d9701dfb4b0b7a38;hpb=ad50ac1af2b9e8bc0a8c520d80debfd8ad95c904;p=pulseview.git diff --git a/pv/data/decoder.cpp b/pv/data/decoder.cpp index 9e7145f3..a9168ae2 100644 --- a/pv/data/decoder.cpp +++ b/pv/data/decoder.cpp @@ -45,17 +45,11 @@ const int64_t Decoder::DecodeChunkLength = 4096; mutex Decoder::_global_decode_mutex; -Decoder::Decoder(const srd_decoder *const dec, - std::map > probes, - GHashTable *options) : +Decoder::Decoder(const srd_decoder *const dec) : _decoder(dec), - _probes(probes), - _options(options) + _options(g_hash_table_new_full(g_str_hash, + g_str_equal, g_free, (GDestroyNotify)g_variant_unref)) { - init_decoder(); - - begin_decode(); } Decoder::~Decoder() @@ -66,11 +60,36 @@ Decoder::~Decoder() g_hash_table_destroy(_options); } -const srd_decoder* Decoder::get_decoder() const +const srd_decoder* Decoder::decoder() const { return _decoder; } +const map >& +Decoder::probes() const +{ + return _probes; +} + +void Decoder::set_probes(std::map > probes) +{ + _probes = probes; + begin_decode(); +} + +const GHashTable* Decoder::options() const +{ + return _options; +} + +void Decoder::set_option(const char *id, GVariant *value) +{ + g_variant_ref(value); + g_hash_table_replace(_options, (void*)g_strdup(id), value); + begin_decode(); +} + const vector< shared_ptr > Decoder::annotations() const { @@ -89,9 +108,26 @@ void Decoder::begin_decode() _decode_thread.interrupt(); _decode_thread.join(); + _annotations.clear(); + if (_probes.empty()) return; + // Get the samplerate and start time + shared_ptr logic_signal = + dynamic_pointer_cast( + (*_probes.begin()).second); + if (logic_signal) { + shared_ptr data( + logic_signal->data()); + if (data) { + _start_time = data->get_start_time(); + _samplerate = data->get_samplerate(); + if (_samplerate == 0.0) + _samplerate = 1.0; + } + } + // We get the logic data of the first probe in the list. // This works because we are currently assuming all // LogicSignals have the same data/snapshot @@ -107,26 +143,6 @@ void Decoder::clear_snapshots() { } -void Decoder::init_decoder() -{ - if (!_probes.empty()) - { - shared_ptr logic_signal = - dynamic_pointer_cast( - (*_probes.begin()).second); - if (logic_signal) { - shared_ptr data( - logic_signal->data()); - if (data) { - _start_time = data->get_start_time(); - _samplerate = data->get_samplerate(); - if (_samplerate == 0.0) - _samplerate = 1.0; - } - } - } -} - void Decoder::decode_proc(shared_ptr data) { srd_session *session; @@ -134,8 +150,6 @@ void Decoder::decode_proc(shared_ptr data) assert(data); - _annotations.clear(); - const deque< shared_ptr > &snapshots = data->get_snapshots(); if (snapshots.empty())