X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fdata%2Fdecoder.cpp;h=a9168ae2bdd33f8ec73fc46cfbf08c04e272c512;hb=ce94e4fd5d7ab666259231d21759613f1f2b93ee;hp=133fcd19d44b1f9a0c9fec43b94283a418628cf9;hpb=fe89c96185dba8ccf02b6b3d0994c2e149198c73;p=pulseview.git diff --git a/pv/data/decoder.cpp b/pv/data/decoder.cpp index 133fcd1..a9168ae 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()) @@ -149,11 +163,7 @@ void Decoder::decode_proc(shared_ptr data) srd_session_new(&session); assert(session); - srd_session_config_set(session, SRD_CONF_NUM_PROBES, - g_variant_new_uint64(_probes.size())); - srd_session_config_set(session, SRD_CONF_UNITSIZE, - g_variant_new_uint64(snapshot->unit_size())); - srd_session_config_set(session, SRD_CONF_SAMPLERATE, + srd_session_metadata_set(session, SRD_CONF_SAMPLERATE, g_variant_new_uint64((uint64_t)_samplerate)); srd_pd_output_callback_add(session, SRD_OUTPUT_ANN, @@ -167,8 +177,6 @@ void Decoder::decode_proc(shared_ptr data) return; } - decoder_inst->data_samplerate = _samplerate; - // Setup the probes GHashTable *const probes = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_variant_unref); @@ -199,8 +207,8 @@ void Decoder::decode_proc(shared_ptr data) i + DecodeChunkLength, sample_count); snapshot->get_samples(chunk, i, chunk_end); - if (srd_session_send(session, i, chunk, chunk_end - i) != - SRD_OK) { + if (srd_session_send(session, i, i + sample_count, + chunk, chunk_end - i) != SRD_OK) { _error_message = tr("Failed to initialise decoder"); break; }