DecoderStack::~DecoderStack()
{
- _decode_thread.interrupt();
- _decode_thread.join();
+ if (_decode_thread.joinable()) {
+ _decode_thread.interrupt();
+ _decode_thread.join();
+ }
}
const std::list< boost::shared_ptr<decode::Decoder> >&
return _samples_decoded;
}
-std::vector<Row> DecoderStack::get_rows() const
+std::vector<Row> DecoderStack::get_visible_rows() const
{
lock_guard<mutex> lock(_mutex);
BOOST_FOREACH (const shared_ptr<decode::Decoder> &dec, _stack)
{
assert(dec);
+ if (!dec->shown())
+ continue;
+
const srd_decoder *const decc = dec->decoder();
assert(dec->decoder());
shared_ptr<pv::view::LogicSignal> logic_signal;
shared_ptr<pv::data::Logic> data;
- _decode_thread.interrupt();
- _decode_thread.join();
+ if (_decode_thread.joinable()) {
+ _decode_thread.interrupt();
+ _decode_thread.join();
+ }
clear();
assert(data);
+ // Check we have a snapshot of data
const deque< shared_ptr<pv::data::LogicSnapshot> > &snapshots =
data->get_snapshots();
if (snapshots.empty())
return;
+ // Check that all decoders have the required probes
+ BOOST_FOREACH(const shared_ptr<decode::Decoder> &dec, _stack)
+ if (!dec->have_required_probes())
+ return;
+
const shared_ptr<pv::data::LogicSnapshot> &snapshot =
snapshots.front();
const int64_t sample_count = snapshot->get_sample_count();
+ const unsigned int unit_size = snapshot->unit_size();
const unsigned int chunk_sample_count =
- DecodeChunkLength / snapshot->unit_size();
+ DecodeChunkLength / unit_size;
// Create the session
srd_session_new(&session);
// Create the decoders
BOOST_FOREACH(const shared_ptr<decode::Decoder> &dec, _stack)
{
- srd_decoder_inst *const di = dec->create_decoder_inst(session);
+ srd_decoder_inst *const di = dec->create_decoder_inst(session, unit_size);
if (!di)
{
i + chunk_sample_count, sample_count);
snapshot->get_samples(chunk, i, chunk_end);
- if (srd_session_send(session, i, i + sample_count,
- chunk, chunk_end - i) != SRD_OK) {
+ if (srd_session_send(session, i, i + sample_count, chunk,
+ (chunk_end - i) * unit_size) != SRD_OK) {
_error_message = tr("Decoder reported an error");
break;
}