From e99749aa8331cc869ccd4154fede8c43c9938f69 Mon Sep 17 00:00:00 2001
From: Nicolas Pope <nwpope@utu.fi>
Date: Wed, 22 Jul 2020 21:44:55 +0300
Subject: [PATCH] Remove devices

---
 components/streams/include/ftl/streams/receiver.hpp |  2 +-
 components/streams/src/feed.cpp                     |  4 +++-
 components/streams/src/receiver.cpp                 | 13 ++++++++-----
 3 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/components/streams/include/ftl/streams/receiver.hpp b/components/streams/include/ftl/streams/receiver.hpp
index ef9592262..710f25660 100644
--- a/components/streams/include/ftl/streams/receiver.hpp
+++ b/components/streams/include/ftl/streams/receiver.hpp
@@ -50,7 +50,7 @@ class Receiver : public ftl::Configurable, public ftl::data::Generator {
 	ftl::data::Pool *pool_;
 	ftl::SingletonHandler<const ftl::data::FrameSetPtr&> callback_;
 	std::unordered_map<uint32_t, std::shared_ptr<ftl::streams::BaseBuilder>> builders_;
-	std::list<ftl::Handle> handles_;
+	std::unordered_map<uint32_t, ftl::Handle> handles_;
 	ftl::codecs::Channel second_channel_;
 	int64_t timestamp_;
 	SHARED_MUTEX mutex_;
diff --git a/components/streams/src/feed.cpp b/components/streams/src/feed.cpp
index 2aabbd396..c8dff9d32 100644
--- a/components/streams/src/feed.cpp
+++ b/components/streams/src/feed.cpp
@@ -375,7 +375,9 @@ void Feed::remove(uint32_t id) {
 
 		streams_.erase(id);
 	} else if (devices_.count(id)) {
-			
+		receiver_->removeBuilder(id);
+		delete devices_[id];
+		devices_.erase(id);
 	} else if (renderers_.count(id)) {
 
 	}
diff --git a/components/streams/src/receiver.cpp b/components/streams/src/receiver.cpp
index a37c4bb30..50f94771e 100644
--- a/components/streams/src/receiver.cpp
+++ b/components/streams/src/receiver.cpp
@@ -73,10 +73,10 @@ ftl::streams::BaseBuilder &Receiver::builder(uint32_t id) {
 		b->setID(id);
 		b->setPool(pool_);
 		fb->setBufferSize(value("frameset_buffer_size", 3));
-		handles_.push_back(std::move(fb->onFrameSet([this](const ftl::data::FrameSetPtr& fs) {
+		handles_[id] = std::move(fb->onFrameSet([this](const ftl::data::FrameSetPtr& fs) {
 			callback_.trigger(fs);
 			return true;
-		})));
+		}));
 		return *b;
 	} else {
 		return *(i->second);
@@ -86,17 +86,20 @@ ftl::streams::BaseBuilder &Receiver::builder(uint32_t id) {
 void Receiver::removeBuilder(uint32_t id) {
 	UNIQUE_LOCK(mutex_, lk);
 	auto i = builders_.find(id);
-	if (i != builders_.end()) builders_.erase(i);
+	if (i != builders_.end()) {
+		handles_.erase(id);
+		builders_.erase(i);
+	}
 }
 
 void Receiver::registerBuilder(const std::shared_ptr<ftl::streams::BaseBuilder> &b) {
 	auto i = builders_.find(b->id());
 	if (i != builders_.end()) throw FTL_Error("Builder already exists");
 	builders_[b->id()] = b;
-	handles_.push_back(std::move(b->onFrameSet([this](const ftl::data::FrameSetPtr& fs) {
+	handles_[b->id()] = std::move(b->onFrameSet([this](const ftl::data::FrameSetPtr& fs) {
 		callback_.trigger(fs);
 		return true;
-	})));
+	}));
 }
 
 //void Receiver::onAudio(const ftl::audio::FrameSet::Callback &cb) {
-- 
GitLab