From 3d8deb310e014c41fc0afad0698bbd5d71426d55 Mon Sep 17 00:00:00 2001 From: Green Sky Date: Sat, 28 Sep 2024 19:16:57 +0200 Subject: [PATCH] implement stream default src/sink --- src/frame_streams/stream_manager.cpp | 69 +++++++++++++++++++++++++++- src/frame_streams/stream_manager.hpp | 19 +++++++- src/main_screen.cpp | 2 + src/stream_manager_ui.cpp | 12 +++++ 4 files changed, 100 insertions(+), 2 deletions(-) diff --git a/src/frame_streams/stream_manager.cpp b/src/frame_streams/stream_manager.cpp index 27bda3ef..81969f64 100644 --- a/src/frame_streams/stream_manager.cpp +++ b/src/frame_streams/stream_manager.cpp @@ -27,7 +27,11 @@ StreamManager::Connection::Connection( } } -StreamManager::StreamManager(ObjectStore2& os) : _os(os) {} +StreamManager::StreamManager(ObjectStore2& os) : _os(os) { + _os.subscribe(this, ObjectStore_Event::object_construct); + //_os.subscribe(this, ObjectStore_Event::object_update); + _os.subscribe(this, ObjectStore_Event::object_destroy); +} StreamManager::~StreamManager(void) { // stop all connetions @@ -137,3 +141,66 @@ float StreamManager::tick(float) { return 2.f; // TODO: 2sec makes mainthread connections unusable } +bool StreamManager::onEvent(const ObjectStore::Events::ObjectConstruct& e) { + if (!e.e.any_of()) { + return false; + } + + // update default targets + if (e.e.all_of()) { + if (e.e.all_of()) { + _default_sources[e.e.get().frame_type_name] = e.e; + } else { // sink + _default_sinks[e.e.get().frame_type_name] = e.e; + } + } + + // connect to default + // only ever do this on new objects + if (e.e.all_of()) { + if (e.e.all_of()) { + auto it_d_sink = _default_sinks.find(e.e.get().frame_type_name); + if (it_d_sink != _default_sinks.cend()) { + // TODO: threaded + connect(e.e, it_d_sink->second); + } + } else { // sink + auto it_d_src = _default_sources.find(e.e.get().frame_type_name); + if (it_d_src != _default_sources.cend()) { + // TODO: threaded + connect(e.e, it_d_src->second); + } + } + } + + return false; +} + +bool StreamManager::onEvent(const ObjectStore::Events::ObjectUpdate&) { + // what do we do here? + return false; +} + +bool StreamManager::onEvent(const ObjectStore::Events::ObjectDestory& e) { + // typeless + for (auto it = _default_sources.cbegin(); it != _default_sources.cend();) { + if (it->second == e.e) { + it = _default_sources.erase(it); + } else { + it++; + } + } + for (auto it = _default_sinks.cbegin(); it != _default_sinks.cend();) { + if (it->second == e.e) { + it = _default_sinks.erase(it); + } else { + it++; + } + } + + // TODO: destroy connections + // TODO: auto reconnect default following devices if another default exists + + return false; +} + diff --git a/src/frame_streams/stream_manager.hpp b/src/frame_streams/stream_manager.hpp index ecd116db..6daa3036 100644 --- a/src/frame_streams/stream_manager.hpp +++ b/src/frame_streams/stream_manager.hpp @@ -7,6 +7,7 @@ #include "./frame_stream2.hpp" +#include #include #include #include @@ -18,6 +19,14 @@ class StreamManager; namespace Components { + + // mark a source or sink as the(a) default + struct TagDefaultTarget {}; + + // mark a source/sink as to be connected to a default sink/source + // of the same type + struct TagConnectToDefault {}; + struct StreamSource { std::string name; std::string frame_type_name; @@ -45,7 +54,7 @@ namespace Components { } // Components -class StreamManager { +class StreamManager : protected ObjectStoreEventI { friend class StreamManagerUI; // TODO: make this go away ObjectStore2& _os; @@ -82,6 +91,9 @@ class StreamManager { }; std::vector> _connections; + std::unordered_map _default_sources; + std::unordered_map _default_sinks; + public: StreamManager(ObjectStore2& os); virtual ~StreamManager(void); @@ -95,6 +107,11 @@ class StreamManager { // do we need the time delta? float tick(float); + + protected: + bool onEvent(const ObjectStore::Events::ObjectConstruct&) override; + bool onEvent(const ObjectStore::Events::ObjectUpdate&) override; + bool onEvent(const ObjectStore::Events::ObjectDestory&) override; }; // template impls diff --git a/src/main_screen.cpp b/src/main_screen.cpp index 6871b1b6..c6f70605 100644 --- a/src/main_screen.cpp +++ b/src/main_screen.cpp @@ -152,6 +152,7 @@ MainScreen::MainScreen(SimpleConfigModel&& conf_, SDL_Renderer* renderer_, Theme ); asrc.emplace(Components::StreamSource::create("SDL Audio Default Recording Device")); + asrc.emplace(); os.throwEventConstruct(asrc); } catch (...) { @@ -166,6 +167,7 @@ MainScreen::MainScreen(SimpleConfigModel&& conf_, SDL_Renderer* renderer_, Theme ); asink.emplace(Components::StreamSink::create("SDL Audio Default Playback Device")); + asink.emplace(); os.throwEventConstruct(asink); } catch (...) { diff --git a/src/stream_manager_ui.cpp b/src/stream_manager_ui.cpp index 57b6332a..eb7e01bd 100644 --- a/src/stream_manager_ui.cpp +++ b/src/stream_manager_ui.cpp @@ -56,6 +56,12 @@ void StreamManagerUI::render(void) { ImGui::TableNextColumn(); ImGui::Text("%d", entt::to_integral(entt::to_entity(oc))); + if (_os.registry().all_of(oc)) { + ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg1, ImGui::GetColorU32(ImVec4{0.6f, 0.f, 0.6f, 0.25f})); + } else if (_os.registry().all_of(oc)) { + ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg1, ImGui::GetColorU32(ImVec4{0.6f, 0.6f, 0.f, 0.25f})); + } + const auto *ssrc = _os.registry().try_get(oc); ImGui::TableNextColumn(); ImGui::TextUnformatted(ssrc!=nullptr?ssrc->name.c_str():"none"); @@ -118,6 +124,12 @@ void StreamManagerUI::render(void) { ImGui::TableNextColumn(); ImGui::Text("%d", entt::to_integral(entt::to_entity(oc))); + if (_os.registry().all_of(oc)) { + ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg1, ImGui::GetColorU32(ImVec4{0.6f, 0.f, 0.6f, 0.25f})); + } else if (_os.registry().all_of(oc)) { + ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg1, ImGui::GetColorU32(ImVec4{0.6f, 0.6f, 0.f, 0.25f})); + } + const auto *ssink = _os.registry().try_get(oc); ImGui::TableNextColumn(); ImGui::TextUnformatted(ssink!=nullptr?ssink->name.c_str():"none");