diff --git a/applications/gui2/src/inputoutput.cpp b/applications/gui2/src/inputoutput.cpp
index 9349b232997ec283651c748ad9b62b8b69421e35..5ee5e03f8fd748580e2c8eec760419e063d27dc0 100644
--- a/applications/gui2/src/inputoutput.cpp
+++ b/applications/gui2/src/inputoutput.cpp
@@ -35,8 +35,7 @@ InputOutput::InputOutput(ftl::Configurable *root, ftl::net::Universe *net) :
 	feed_ = std::unique_ptr<ftl::stream::Feed>
 		(ftl::create<ftl::stream::Feed>(root, "feed", net));
 
-	speaker_ = std::unique_ptr<ftl::audio::Speaker>
-		(ftl::create<ftl::audio::Speaker>(root, "speaker"));
+	speaker_ = feed_->speaker();
 
 	//auto* f = feed_->filter({ftl::codecs::Channel::Colour, ftl::codecs::Channel::Depth});
 	//feed_->render(f, Eigen::Matrix4d::Identity());
diff --git a/applications/gui2/src/inputoutput.hpp b/applications/gui2/src/inputoutput.hpp
index e80b7546157092e60f82091de64d198492ee775f..98d6a0dbef6b5205b2b97a57ad324fabbd86741d 100644
--- a/applications/gui2/src/inputoutput.hpp
+++ b/applications/gui2/src/inputoutput.hpp
@@ -35,13 +35,13 @@ public:
 	ftl::net::Universe* net() const;
 	ftl::ctrl::Master* master() const { return master_.get(); }
 	ftl::stream::Feed* feed() const { return feed_.get(); }
-	ftl::audio::Speaker* speaker() const { return speaker_.get(); }
+	ftl::audio::Speaker* speaker() const { return speaker_; }
 
 private:
 	ftl::net::Universe* net_;
 	std::unique_ptr<ftl::stream::Feed> feed_;
 	std::unique_ptr<ftl::ctrl::Master> master_;
-	std::unique_ptr<ftl::audio::Speaker> speaker_;
+	ftl::audio::Speaker *speaker_;
 
 
 };
diff --git a/components/streams/include/ftl/streams/feed.hpp b/components/streams/include/ftl/streams/feed.hpp
index 7c58b2e21582f0912c7d8bdf52cf31f4d4552dd0..7a5d05794dcc53b7764db81ccbdbfa313a858a1f 100644
--- a/components/streams/include/ftl/streams/feed.hpp
+++ b/components/streams/include/ftl/streams/feed.hpp
@@ -10,6 +10,7 @@
 #include <ftl/rgbd/source.hpp>
 #include <ftl/data/framepool.hpp>
 #include <ftl/audio/mixer.hpp>
+#include <ftl/audio/speaker.hpp>
 
 #include <ftl/streams/stream.hpp>
 #include <ftl/streams/receiver.hpp>
@@ -141,6 +142,8 @@ public:
 
 	inline ftl::audio::StereoMixerF<100> &mixer() { return mixer_; }
 
+	ftl::audio::Speaker *speaker() { return speaker_; }
+
 	void startRecording(Filter *, const std::string &filename);
 	void startStreaming(Filter *, const std::string &filename);
 	void startStreaming(Filter *);
@@ -181,6 +184,7 @@ private:
 	std::condition_variable cv_net_connect_;
 
 	ftl::net::Universe* const net_;
+	ftl::audio::Speaker *speaker_;
 	std::unique_ptr<ftl::data::Pool> pool_;
 	std::unique_ptr<ftl::stream::Intercept> interceptor_;
 	 // multiple streams to single fs
diff --git a/components/streams/src/feed.cpp b/components/streams/src/feed.cpp
index cbff43fb7a180cde4da68424e5db0051cfd6ffbd..5377ca6c4c914ee8b88028e5a5a8fdeb6c7710e8 100644
--- a/components/streams/src/feed.cpp
+++ b/components/streams/src/feed.cpp
@@ -102,6 +102,8 @@ Feed::Feed(nlohmann::json &config, ftl::net::Universe*net) :
 		"recorder"
 	});
 
+	speaker_ = ftl::create<ftl::audio::Speaker>(this, "speaker");
+
 	pool_ = std::make_unique<ftl::data::Pool>(3,5);
 
 	stream_ = std::unique_ptr<ftl::stream::Muxer>
@@ -169,6 +171,8 @@ Feed::Feed(nlohmann::json &config, ftl::net::Universe*net) :
 	handle_rec_error_ = receiver_->onError([this](ftl::data::FrameID fid) {
 		LOG(WARNING) << "Receiver error: resetting";
 		stream_->reset();
+		speaker_->reset();
+		mixer_.reset();
 		return true;
 	});
 
@@ -267,6 +271,8 @@ Feed::~Feed() {
 	for (auto *s : garbage) {
 		delete s;
 	}
+
+	delete speaker_;
 }
 
 void Feed::_processAudio(const ftl::data::FrameSetPtr &fs) {