]> sigrok.org Git - pulseview.git/blobdiff - pv/data/decoderstack.cpp
Use a type with a greater resolution to represent time values
[pulseview.git] / pv / data / decoderstack.cpp
index da831e3be097fe6446bb688ae953860f9964ef10..0bb875da74b68e8a30086e90124d69eea93400b5 100644 (file)
 #include "decoderstack.hpp"
 
 #include <pv/data/logic.hpp>
-#include <pv/data/logicsnapshot.hpp>
+#include <pv/data/logicsegment.hpp>
 #include <pv/data/decode/decoder.hpp>
 #include <pv/data/decode/annotation.hpp>
-#include <pv/sigsession.hpp>
+#include <pv/session.hpp>
 #include <pv/view/logicsignal.hpp>
 
 using std::lock_guard;
@@ -62,6 +62,8 @@ mutex DecoderStack::global_decode_mutex_;
 DecoderStack::DecoderStack(pv::Session &session,
        const srd_decoder *const dec) :
        session_(session),
+       start_time_(0),
+       samplerate_(0),
        sample_count_(0),
        frame_complete_(false),
        samples_decoded_(0)
@@ -105,13 +107,23 @@ void DecoderStack::remove(int index)
 
        // Find the decoder in the stack
        auto iter = stack_.begin();
-       for(int i = 0; i < index; i++, iter++)
+       for (int i = 0; i < index; i++, iter++)
                assert(iter != stack_.end());
 
        // Delete the element
        stack_.erase(iter);
 }
 
+double DecoderStack::samplerate() const
+{
+       return samplerate_;
+}
+
+const pv::util::Timestamp& DecoderStack::start_time() const
+{
+       return start_time_;
+}
+
 int64_t DecoderStack::samples_decoded() const
 {
        lock_guard<mutex> decode_lock(output_mutex_);
@@ -233,7 +245,7 @@ void DecoderStack::begin_decode()
 
        // We get the logic data of the first channel in the list.
        // This works because we are currently assuming all
-       // LogicSignals have the same data/snapshot
+       // LogicSignals have the same data/segment
        for (const shared_ptr<decode::Decoder> &dec : stack_)
                if (dec && !dec->channels().empty() &&
                        ((logic_signal = (*dec->channels().begin()).second)) &&
@@ -243,16 +255,16 @@ void DecoderStack::begin_decode()
        if (!data)
                return;
 
-       // Check we have a snapshot of data
-       const deque< shared_ptr<pv::data::LogicSnapshot> > &snapshots =
-               data->get_snapshots();
-       if (snapshots.empty())
+       // Check we have a segment of data
+       const deque< shared_ptr<pv::data::LogicSegment> > &segments =
+               data->logic_segments();
+       if (segments.empty())
                return;
-       snapshot_ = snapshots.front();
+       segment_ = segments.front();
 
        // Get the samplerate and start time
-       start_time_ = data->get_start_time();
-       samplerate_ = data->samplerate();
+       start_time_ = segment_->start_time();
+       samplerate_ = segment_->samplerate();
        if (samplerate_ == 0.0)
                samplerate_ = 1.0;
 
@@ -260,7 +272,7 @@ void DecoderStack::begin_decode()
        decode_thread_ = std::thread(&DecoderStack::decode_proc, this);
 }
 
-uint64_t DecoderStack::get_max_sample_count() const
+uint64_t DecoderStack::max_sample_count() const
 {
        uint64_t max_sample_count = 0;
 
@@ -274,7 +286,7 @@ uint64_t DecoderStack::get_max_sample_count() const
 optional<int64_t> DecoderStack::wait_for_data() const
 {
        unique_lock<mutex> input_lock(input_mutex_);
-       while(!interrupt_ && !frame_complete_ &&
+       while (!interrupt_ && !frame_complete_ &&
                samples_decoded_ >= sample_count_)
                input_cond_.wait(input_lock);
        return boost::make_optional(!interrupt_ &&
@@ -289,7 +301,7 @@ void DecoderStack::decode_data(
        uint8_t chunk[DecodeChunkLength];
 
        const unsigned int chunk_sample_count =
-               DecodeChunkLength / snapshot_->unit_size();
+               DecodeChunkLength / segment_->unit_size();
 
        for (int64_t i = 0; !interrupt_ && i < sample_count;
                i += chunk_sample_count)
@@ -298,10 +310,10 @@ void DecoderStack::decode_data(
 
                const int64_t chunk_end = min(
                        i + chunk_sample_count, sample_count);
-               snapshot_->get_samples(chunk, i, chunk_end);
+               segment_->get_samples(chunk, i, chunk_end);
 
-               if (srd_session_send(session, i, i + sample_count, chunk,
-                               (chunk_end - i) * unit_size) != SRD_OK) {
+               if (srd_session_send(session, i, chunk_end, chunk,
+                               (chunk_end - i) * unit_size, unit_size) != SRD_OK) {
                        error_message_ = tr("Decoder reported an error");
                        break;
                }
@@ -322,20 +334,20 @@ void DecoderStack::decode_proc()
 {
        optional<int64_t> sample_count;
        srd_session *session;
-       srd_decoder_inst *prev_di = NULL;
+       srd_decoder_inst *prev_di = nullptr;
 
-       assert(snapshot_);
+       assert(segment_);
 
        // Create the session
        srd_session_new(&session);
        assert(session);
 
        // Create the decoders
-       const unsigned int unit_size = snapshot_->unit_size();
+       const unsigned int unit_size = segment_->unit_size();
 
        for (const shared_ptr<decode::Decoder> &dec : stack_)
        {
-               srd_decoder_inst *const di = dec->create_decoder_inst(session, unit_size);
+               srd_decoder_inst *const di = dec->create_decoder_inst(session);
 
                if (!di)
                {
@@ -353,7 +365,7 @@ void DecoderStack::decode_proc()
        // Get the intial sample count
        {
                unique_lock<mutex> input_lock(input_mutex_);
-               sample_count = sample_count_ = snapshot_->get_sample_count();
+               sample_count = sample_count_ = segment_->get_sample_count();
        }
 
        // Start the session
@@ -367,7 +379,7 @@ void DecoderStack::decode_proc()
 
        do {
                decode_data(*sample_count, unit_size, session);
-       } while(error_message_.isEmpty() && (sample_count = wait_for_data()));
+       } while (error_message_.isEmpty() && (sample_count = wait_for_data()));
 
        // Destroy the session
        srd_session_destroy(session);
@@ -392,7 +404,7 @@ void DecoderStack::annotation_callback(srd_proto_data *pdata, void *decoder)
        assert(decc);
 
        auto row_iter = d->rows_.end();
-       
+
        // Try looking up the sub-row of this class
        const auto r = d->class_rows_.find(make_pair(decc, a.format()));
        if (r != d->class_rows_.end())
@@ -424,8 +436,8 @@ void DecoderStack::on_data_received()
 {
        {
                unique_lock<mutex> lock(input_mutex_);
-               if (snapshot_)
-                       sample_count_ = snapshot_->get_sample_count();
+               if (segment_)
+                       sample_count_ = segment_->get_sample_count();
        }
        input_cond_.notify_one();
 }
@@ -434,7 +446,7 @@ void DecoderStack::on_frame_ended()
 {
        {
                unique_lock<mutex> lock(input_mutex_);
-               if (snapshot_)
+               if (segment_)
                        frame_complete_ = true;
        }
        input_cond_.notify_one();