244 constexpr auto sec = std::chrono::seconds(1);
245 std::condition_variable cv;
248 auto listeners = std::make_tuple(std::make_pair(
FrameListener<T>(cv, dataLock), &frames)...);
250 std::unique_lock<std::mutex> lock(dataLock);
253 if (!cv.wait_for(lock, timeout.to<
double>() * sec, [&]{
254 return std::apply([](std::pair<FrameListener<T>, Frame<T>*>&... i) { return ((i.first.data != std::nullopt) && ...); }, listeners);
258 std::apply([](std::pair<
FrameListener<T>,
Frame<T>*>&... i) {(i.second->RemoveListener(&i.first), ...);}, listeners);
261 std::apply([](std::pair<
FrameListener<T>,
Frame<T>*>&... i) {(i.second->RemoveListener(&i.first), ...);}, listeners);
263 return std::apply([](std::pair<FrameListener<T>, Frame<T>*>&... i) {
return std::make_tuple(*(i.first.data)...); }, listeners);