Add manager class to run the server and video
Change-Id: Ie69e995dd56f8d2aa7e3828504e29f9993bb2b3c
Signed-off-by: Eddie James <eajames@linux.ibm.com>
diff --git a/ikvm_manager.cpp b/ikvm_manager.cpp
new file mode 100644
index 0000000..90a9fce
--- /dev/null
+++ b/ikvm_manager.cpp
@@ -0,0 +1,100 @@
+#include "ikvm_manager.hpp"
+
+#include <thread>
+
+namespace ikvm
+{
+
+Manager::Manager(const Args& args) :
+ continueExecuting(true), serverDone(false), videoDone(true),
+ input(args.getInputPath()),
+ video(args.getVideoPath(), input, args.getFrameRate()),
+ server(args, input, video)
+{
+}
+
+void Manager::run()
+{
+ std::thread run(serverThread, this);
+
+ while (continueExecuting)
+ {
+ if (server.wantsFrame())
+ {
+ video.getFrame();
+ server.sendFrame();
+ }
+ else
+ {
+ video.stop();
+ }
+
+ if (video.needsResize())
+ {
+ videoDone = false;
+ waitServer();
+ video.resize();
+ server.resize();
+ setVideoDone();
+ }
+ else
+ {
+ setVideoDone();
+ waitServer();
+ }
+ }
+
+ run.join();
+}
+
+void Manager::serverThread(Manager* manager)
+{
+ while (manager->continueExecuting)
+ {
+ manager->server.run();
+ manager->setServerDone();
+ manager->waitVideo();
+ }
+}
+
+void Manager::setServerDone()
+{
+ std::unique_lock<std::mutex> ulock(lock);
+
+ serverDone = true;
+ sync.notify_all();
+}
+
+void Manager::setVideoDone()
+{
+ std::unique_lock<std::mutex> ulock(lock);
+
+ videoDone = true;
+ sync.notify_all();
+}
+
+void Manager::waitServer()
+{
+ std::unique_lock<std::mutex> ulock(lock);
+
+ while (!serverDone)
+ {
+ sync.wait(ulock);
+ }
+
+ serverDone = false;
+}
+
+void Manager::waitVideo()
+{
+ std::unique_lock<std::mutex> ulock(lock);
+
+ while (!videoDone)
+ {
+ sync.wait(ulock);
+ }
+
+ // don't reset videoDone
+}
+
+} // namespace ikvm