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(&current_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