X-Git-Url: http://git.code-monkey.de/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdata%2Fdecoderstack.cpp;h=2817d29205cc8ee825c72ff049e5775ab6b638cb;hp=d56422a9a4f38090069c469d2e2006b13bf29643;hb=7491a29f33471b38e161b3254f4d8e708b05f929;hpb=6e89374a6796f8d5d9cc61b0a2f7e98562a034ae diff --git a/pv/data/decoderstack.cpp b/pv/data/decoderstack.cpp index d56422a..2817d29 100644 --- a/pv/data/decoderstack.cpp +++ b/pv/data/decoderstack.cpp @@ -20,6 +20,7 @@ #include +#include #include #include @@ -30,6 +31,7 @@ #include #include +#include #include #include @@ -45,49 +47,28 @@ const int64_t DecoderStack::DecodeChunkLength = 4096; mutex DecoderStack::_global_decode_mutex; -DecoderStack::DecoderStack(const srd_decoder *const dec) : - _decoder(dec), - _options(g_hash_table_new_full(g_str_hash, - g_str_equal, g_free, (GDestroyNotify)g_variant_unref)) +DecoderStack::DecoderStack(const srd_decoder *const dec) { + _stack.push_back(shared_ptr( + new decode::Decoder(dec))); } DecoderStack::~DecoderStack() { _decode_thread.interrupt(); _decode_thread.join(); - - g_hash_table_destroy(_options); -} - -const srd_decoder* DecoderStack::decoder() const -{ - return _decoder; -} - -const map >& -DecoderStack::probes() const -{ - return _probes; -} - -void DecoderStack::set_probes(std::map > probes) -{ - _probes = probes; - begin_decode(); } -const GHashTable* DecoderStack::options() const +const std::list< boost::shared_ptr >& +DecoderStack::stack() const { - return _options; + return _stack; } -void DecoderStack::set_option(const char *id, GVariant *value) +void DecoderStack::push(boost::shared_ptr decoder) { - g_variant_ref(value); - g_hash_table_replace(_options, (void*)g_strdup(id), value); - begin_decode(); + assert(decoder); + _stack.push_back(decoder); } const vector< shared_ptr > @@ -105,35 +86,31 @@ QString DecoderStack::error_message() void DecoderStack::begin_decode() { + shared_ptr logic_signal; + shared_ptr data; + _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 - shared_ptr sig = (*_probes.begin()).second; - assert(sig); - shared_ptr data = sig->data(); + BOOST_FOREACH (const shared_ptr &dec, _stack) + if (dec && !dec->probes().empty() && + ((logic_signal = (*dec->probes().begin()).second)) && + ((data = logic_signal->data()))) + break; + + if (!data) + return; + + // Get the samplerate and start time + _start_time = data->get_start_time(); + _samplerate = data->get_samplerate(); + if (_samplerate == 0.0) + _samplerate = 1.0; _decode_thread = boost::thread(&DecoderStack::decode_proc, this, data); @@ -147,6 +124,7 @@ void DecoderStack::decode_proc(shared_ptr data) { srd_session *session; uint8_t chunk[DecodeChunkLength]; + srd_decoder_inst *prev_di = NULL; assert(data); @@ -163,38 +141,32 @@ void DecoderStack::decode_proc(shared_ptr data) srd_session_new(&session); assert(session); - srd_session_metadata_set(session, SRD_CONF_SAMPLERATE, - g_variant_new_uint64((uint64_t)_samplerate)); - srd_pd_output_callback_add(session, SRD_OUTPUT_ANN, - DecoderStack::annotation_callback, this); + // Create the decoders + BOOST_FOREACH(const shared_ptr &dec, _stack) + { + srd_decoder_inst *const di = dec->create_decoder_inst(session); - // Create the decoder instance - srd_decoder_inst *const decoder_inst = srd_inst_new( - session, _decoder->id, _options); - if(!decoder_inst) { - _error_message = tr("Failed to initialise decoder"); - return; - } + if (!di) + { + _error_message = tr("Failed to initialise decoder"); + srd_session_destroy(session); + return; + } - // Setup the probes - GHashTable *const probes = g_hash_table_new_full(g_str_hash, - g_str_equal, g_free, (GDestroyNotify)g_variant_unref); + if (prev_di) + srd_inst_stack (session, prev_di, di); - for(map >:: - const_iterator i = _probes.begin(); - i != _probes.end(); i++) - { - shared_ptr signal((*i).second); - GVariant *const gvar = g_variant_new_int32( - signal->probe()->index); - g_variant_ref_sink(gvar); - g_hash_table_insert(probes, (*i).first->id, gvar); + prev_di = di; } - srd_inst_probe_set_all(decoder_inst, probes); - // Start the session + srd_session_metadata_set(session, SRD_CONF_SAMPLERATE, + g_variant_new_uint64((uint64_t)_samplerate)); + + srd_pd_output_callback_add(session, SRD_OUTPUT_ANN, + DecoderStack::annotation_callback, this); + srd_session_start(session); for (int64_t i = 0;