X-Git-Url: http://git.code-monkey.de/?a=blobdiff_plain;f=pv%2Fdata%2Fdecoder.cpp;h=923140397ef528d02b9bb2ea84f2849f2d8573d0;hb=3045c869ada2e32bf55cbb68633b5213b9b11e28;hp=2cfb3a99a9b289f49103718a7169301d66ceb198;hpb=52292f6c59053cbaf8c3b2d9a88cca496d2e10b3;p=pulseview.git diff --git a/pv/data/decoder.cpp b/pv/data/decoder.cpp index 2cfb3a9..9231403 100644 --- a/pv/data/decoder.cpp +++ b/pv/data/decoder.cpp @@ -22,6 +22,10 @@ #include +#include + +#include + #include "decoder.h" #include @@ -41,14 +45,17 @@ const int64_t Decoder::DecodeChunkLength = 4096; Decoder::Decoder(const srd_decoder *const dec, std::map > probes, + boost::shared_ptr > probes, GHashTable *options) : _decoder(dec), _probes(probes), _options(options), + _session(NULL), _decoder_inst(NULL) { - init_decoder(); + if (!init_decoder()) + throw runtime_error("Failed to initialise decoder."); + begin_decode(); } @@ -58,6 +65,9 @@ Decoder::~Decoder() _decode_thread.join(); g_hash_table_destroy(_options); + + if (_session) + srd_session_destroy(_session); } const srd_decoder* Decoder::get_decoder() const @@ -83,12 +93,9 @@ void Decoder::begin_decode() // 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; + shared_ptr sig = (*_probes.begin()).second; assert(sig); - const pv::view::LogicSignal *const l = - dynamic_cast(sig.get()); - assert(l); - shared_ptr data = l->data(); + shared_ptr data = sig->data(); _decode_thread = boost::thread(&Decoder::decode_proc, this, data); @@ -98,7 +105,7 @@ void Decoder::clear_snapshots() { } -void Decoder::init_decoder() +bool Decoder::init_decoder() { if (!_probes.empty()) { @@ -115,10 +122,13 @@ void Decoder::init_decoder() } } - _decoder_inst = srd_inst_new(_decoder->id, _options); + srd_session_new(&_session); + assert(_session); + + _decoder_inst = srd_inst_new(_session, _decoder->id, _options); if(!_decoder_inst) { qDebug() << "Failed to initialise decoder"; - return; + return false; } _decoder_inst->data_samplerate = _samplerate; @@ -126,7 +136,7 @@ void Decoder::init_decoder() GHashTable *probes = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_variant_unref); - for(map >:: + for(map >:: const_iterator i = _probes.begin(); i != _probes.end(); i++) { @@ -138,6 +148,8 @@ void Decoder::init_decoder() } srd_inst_probe_set_all(_decoder_inst, probes); + + return true; } void Decoder::decode_proc(shared_ptr data) @@ -162,9 +174,16 @@ void Decoder::decode_proc(shared_ptr data) if (samplerate == 0.0) samplerate = 1.0; - srd_session_start(_probes.size(), snapshot->unit_size(), samplerate); + 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, + g_variant_new_uint64((uint64_t)samplerate)); + + srd_session_start(_session); - srd_pd_output_callback_add(SRD_OUTPUT_ANN, + srd_pd_output_callback_add(_session, SRD_OUTPUT_ANN, Decoder::annotation_callback, this); for (int64_t i = 0; @@ -175,7 +194,8 @@ void Decoder::decode_proc(shared_ptr data) i + DecodeChunkLength, sample_count); snapshot->get_samples(chunk, i, chunk_end); - if (srd_session_send(i, chunk, chunk_end - i) != SRD_OK) + if (srd_session_send(_session, i, chunk, chunk_end - i) != + SRD_OK) break; } }