Skip to content
Snippets Groups Projects
room_impl.cpp 1.57 KiB
Newer Older
Nicolas Pope's avatar
Nicolas Pope committed
#include <voltu/room.hpp>
#include "room_impl.hpp"
#include "frame_impl.hpp"
#include <voltu/types/errors.hpp>

using voltu::internal::RoomImpl;

RoomImpl::RoomImpl(ftl::stream::Feed* feed)
 : feed_(feed)
{

}

RoomImpl::~RoomImpl()
{
	if (filter_) filter_->remove();
}

Nicolas Pope's avatar
Nicolas Pope committed
bool RoomImpl::waitNextFrame(int64_t timeout)
{
	if (!filter_)
	{
		filter_ = feed_->filter(fsids_, {ftl::codecs::Channel::Colour, ftl::codecs::Channel::Depth});
		filter_->on([this](const std::shared_ptr<ftl::data::FrameSet> &fs)
		{
			UNIQUE_LOCK(mutex_, lk);
			last_seen_ = std::max(last_seen_, fs->timestamp());
			cv_.notify_all();
			return true;
		});
	}

	std::unique_lock<std::mutex> lk(mutex_);

	if (last_read_ >= last_seen_)
	{
		if (timeout > 0)
		{
			cv_.wait_for(lk, std::chrono::seconds(timeout), [this] {
				return last_read_ < last_seen_;
			});

			return last_read_ < last_seen_;
		}
		else if (timeout == 0)
		{
			return false;
		}
		else
		{
			cv_.wait(lk, [this] {
				return last_read_ < last_seen_;
			});
		}
	}

	return true;
}

voltu::FramePtr RoomImpl::getFrame()
{
	auto f = std::make_shared<voltu::internal::FrameImpl>();

	std::unique_lock<std::mutex> lk(mutex_);
	int count = 0;

	for (auto fsid : fsids_)
	{
		auto fs = feed_->getFrameSet(fsid);
		if (!fs) continue;

		f->pushFrameSet(fs);
		last_read_ = std::max(last_read_, fs->timestamp());
		++count;
	}

	if (count == 0) throw voltu::exceptions::NoFrame();

	return f;
}

std::string RoomImpl::getName()
{
	return "";
}

void RoomImpl::addFrameSet(uint32_t fsid)
{
	fsids_.insert(fsid);
}

bool RoomImpl::active()
{
	return ftl::running;
}