diff --git a/applications/gui2/src/modules/camera.cpp b/applications/gui2/src/modules/camera.cpp index 7ffe5e6eb2db3aa28e5a455e74e97fbe8344a476..9cad119ad9a6bfb07977728ddc0991e8c3facc2f 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 fa0d756ceee92545de014b1be9848b9e29004ae8..e098bdcec465b9092c836f24259e6d9c4a0aa71f 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 7a5d05794dcc53b7764db81ccbdbfa313a858a1f..4d6a0ebc8a32edbabad3c860f37e433ffa11db80 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 3ddc80149c64ace933ac30bce0fa8cfbbce45ac4..451acdf354d7dbe77b4ebe2393d0fea6a8f8abc1 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 a49b743e799413123178a71483a6782988b76c63..0044d014233690dc683e6f5ca18ab7def86895b9 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 b68bc01862d7b98bb5c903f7244444d70e035898..a0c61f4e3ae3dc49e2d5d53d60615823e4af0662 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);