From 566b3b21b7e9f16754e376f53bee126aecab2167 Mon Sep 17 00:00:00 2001 From: Nicolas Pope <nwpope@utu.fi> Date: Sat, 19 Sep 2020 09:22:11 +0300 Subject: [PATCH] Allow proper file stream pausing --- applications/gui2/src/modules/camera.cpp | 7 +++++-- applications/gui2/src/modules/camera.hpp | 4 ++-- components/streams/include/ftl/streams/feed.hpp | 2 ++ components/streams/include/ftl/streams/stream.hpp | 1 + components/streams/src/filestream.cpp | 3 +++ components/streams/src/stream.cpp | 14 +++++++++++++- 6 files changed, 26 insertions(+), 5 deletions(-) diff --git a/applications/gui2/src/modules/camera.cpp b/applications/gui2/src/modules/camera.cpp index 7ffe5e6eb..9cad119ad 100644 --- a/applications/gui2/src/modules/camera.cpp +++ b/applications/gui2/src/modules/camera.cpp @@ -214,6 +214,11 @@ void Camera::setVolume(float v) { return io->speaker()->setVolume(v); } +void Camera::setPaused(bool set) { + paused_ = set; + io->feed()->muxer()->set("paused", set); +} + std::unordered_set<Channel> Camera::availableChannels() { if (std::atomic_load(&latest_)) { return latest_->frames[frame_idx].available(); @@ -257,8 +262,6 @@ void Camera::activate(ftl::data::FrameID id) { filter_ = io->feed()->filter(std::unordered_set<unsigned int>{id.frameset()}, {Channel::Left}); filter_->on( [this, feed = io->feed(), speaker = io->speaker()](ftl::data::FrameSetPtr fs){ - if (paused_) return true; - std::atomic_store(¤t_fs_, fs); std::atomic_store(&latest_, fs); diff --git a/applications/gui2/src/modules/camera.hpp b/applications/gui2/src/modules/camera.hpp index fa0d756ce..e098bdcec 100644 --- a/applications/gui2/src/modules/camera.hpp +++ b/applications/gui2/src/modules/camera.hpp @@ -21,8 +21,8 @@ public: virtual void activate(ftl::data::FrameID id); void setChannel(ftl::codecs::Channel c); - void setPaused(bool set) { paused_ = set; }; - bool isPaused() { return paused_; } + void setPaused(bool set); + bool isPaused() const { return paused_; } void toggleOverlay(); diff --git a/components/streams/include/ftl/streams/feed.hpp b/components/streams/include/ftl/streams/feed.hpp index 7a5d05794..4d6a0ebc8 100644 --- a/components/streams/include/ftl/streams/feed.hpp +++ b/components/streams/include/ftl/streams/feed.hpp @@ -177,6 +177,8 @@ public: void lowLatencyMode(); + ftl::stream::Muxer *muxer() const { return stream_.get(); } + private: // public methods acquire lock if necessary, private methods assume locking // managed by caller diff --git a/components/streams/include/ftl/streams/stream.hpp b/components/streams/include/ftl/streams/stream.hpp index 3ddc80149..451acdf35 100644 --- a/components/streams/include/ftl/streams/stream.hpp +++ b/components/streams/include/ftl/streams/stream.hpp @@ -151,6 +151,7 @@ class Muxer : public Stream { void _notify(const ftl::codecs::StreamPacket &spkt, const ftl::codecs::Packet &pkt); int _lookup(size_t fsid, StreamEntry *se, int ssid, int count); + void _forward(const std::string &name); }; /** diff --git a/components/streams/src/filestream.cpp b/components/streams/src/filestream.cpp index a49b743e7..0044d0142 100644 --- a/components/streams/src/filestream.cpp +++ b/components/streams/src/filestream.cpp @@ -225,6 +225,9 @@ bool File::tick(int64_t ts) { return false; } + // Skip if paused + if (value("paused", false)) return true; + #ifdef DEBUG_MUTEX UNIQUE_LOCK(mutex_, lk); #else diff --git a/components/streams/src/stream.cpp b/components/streams/src/stream.cpp index b68bc0186..a0c61f4e3 100644 --- a/components/streams/src/stream.cpp +++ b/components/streams/src/stream.cpp @@ -1,4 +1,5 @@ #include <ftl/streams/stream.hpp> +#include <nlohmann/json.hpp> #define LOGURU_WITH_STREAMS 1 #include <loguru.hpp> @@ -75,7 +76,8 @@ void Stream::reset() { // ==== Muxer ================================================================== Muxer::Muxer(nlohmann::json &config) : Stream(config), nid_{0} { - + value("paused", false); + _forward("paused"); } Muxer::~Muxer() { @@ -85,6 +87,16 @@ Muxer::~Muxer() { } } +void Muxer::_forward(const std::string &name) { + on(name, [this,name]() { + auto val = getConfig()[name]; + UNIQUE_LOCK(mutex_,lk); + for (auto &se : streams_) { + se.stream->set(name, val); + } + }); +} + void Muxer::add(Stream *s, size_t fsid, const std::function<int()> &cb) { UNIQUE_LOCK(mutex_,lk); -- GitLab