diff --git a/src/headers/scene-group.hpp b/src/headers/scene-group.hpp index 8aa879c4..0e009ea0 100644 --- a/src/headers/scene-group.hpp +++ b/src/headers/scene-group.hpp @@ -37,7 +37,7 @@ struct SceneGroup { int currentCount = -1; std::chrono::high_resolution_clock::time_point lastAdvTime; - OBSWeakSource lastRandomScene = nullptr; + int lastRandomScene = -1; inline SceneGroup(){}; inline SceneGroup(std::string name_) : name(name_){}; diff --git a/src/scene-group.cpp b/src/scene-group.cpp index 22e32625..a1c52e4b 100644 --- a/src/scene-group.cpp +++ b/src/scene-group.cpp @@ -51,27 +51,26 @@ OBSWeakSource SceneGroup::getNextSceneTime() OBSWeakSource SceneGroup::getNextSceneRandom() { if (scenes.size() == 1) { - return *scenes.begin(); + currentIdx = 0; + return scenes[currentIdx]; } - std::vector rs(scenes); - std::random_device rng; - std::mt19937 urng(rng()); - std::shuffle(rs.begin(), rs.end(), urng); - for (OBSWeakSource &s : rs) { - if (s == lastRandomScene) { - continue; - } + int rIdx = lastRandomScene; + do { + rIdx = rand() % scenes.size(); + } while (rIdx == lastRandomScene); - lastRandomScene = s; + lastRandomScene = rIdx; + currentIdx = rIdx; - return s; - } - return nullptr; + return scenes[currentIdx]; } OBSWeakSource SceneGroup::getCurrentScene() { + if (scenes.size() < currentIdx + 1) { + return nullptr; + } return scenes[currentIdx]; }