#pragma once #include "tools/cabana/streams/abstractstream.h" class LiveStream : public AbstractStream { Q_OBJECT public: LiveStream(QObject *parent, QString address = {}); virtual ~LiveStream(); inline QString routeName() const override { return QString("Live Streaming From %1").arg(zmq_address.isEmpty() ? "127.0.0.1" : zmq_address); } inline double routeStartTime() const override { return start_ts / (double)1e9; } inline double currentSec() const override { return (current_ts - start_ts) / (double)1e9; } void setSpeed(float speed) override { speed_ = std::min(1.0, speed); } bool isPaused() const override { return pause_; } void pause(bool pause) override; protected: virtual void handleEvent(Event *evt); virtual void streamThread(); void process(QHash *) override; struct Msg { Msg(Message *m) { event = ::new Event(aligned_buf.align(m)); delete m; } ~Msg() { ::delete event; } Event *event; AlignedBuffer aligned_buf; }; mutable std::mutex lock; std::vector received; std::deque messages; std::atomic start_ts = 0; std::atomic current_ts = 0; std::atomic speed_ = 1; std::atomic pause_ = false; uint64_t last_update_ts = 0; const QString zmq_address; QThread *stream_thread; };