diff --git a/components/streams/include/ftl/streams/receiver.hpp b/components/streams/include/ftl/streams/receiver.hpp index ef95922626fbf2cf6e3ceaa7517168f94a9bf35a..710f256603410687993b196fee0fe262f6918174 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 2aabbd396ca51d7b1589690d3df9778f5fe55a61..c8dff9d32caa900bee9e47fbce7d9d860ef44227 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 a37c4bb3087fa4b1264ff891de3a4419821f2879..50f94771ecf1a1c2791d2823a8b29d93052c6884 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) {