Importing of session.

This commit is contained in:
brunoherbelin
2020-05-23 22:40:03 +02:00
parent 614fa1247d
commit 7ac223819b
6 changed files with 133 additions and 33 deletions

View File

@@ -270,11 +270,11 @@ void ImGuiVisitor::visit (Source& s)
void ImGuiVisitor::visit (MediaSource& s)
{
if ( s.mediaplayer()->duration() == GST_CLOCK_TIME_NONE) {
ImGui::Text("Image");
ImGui::Text("Image File");
}
else {
ImGui::Text("Video");
if (ImGui::Button("Open Media Player", ImVec2(IMGUI_RIGHT_ALIGN, 0)) )
ImGui::Text("Video File");
if ( ImGui::Button("Open Media Player", ImVec2(IMGUI_RIGHT_ALIGN, 0)) )
Settings::application.media_player = true;
}
ImGuiToolkit::ButtonOpenUrl( SystemToolkit::path_filename(s.path()).c_str(), ImVec2(IMGUI_RIGHT_ALIGN, 0) );
@@ -282,22 +282,25 @@ void ImGuiVisitor::visit (MediaSource& s)
void ImGuiVisitor::visit (SessionSource& s)
{
// ImGui::Button("Expand", ImVec2(IMGUI_RIGHT_ALIGN, 0));
ImGui::Text("Session");
if (ImGui::Button("Make Current", ImVec2(IMGUI_RIGHT_ALIGN, 0)) )
ImGui::Text("Session File");
if ( ImGui::Button("Make Current", ImVec2(IMGUI_RIGHT_ALIGN, 0)) )
Mixer::manager().set( s.detach() );
if ( ImGui::Button( ICON_FA_FILE_IMPORT " Merge", ImVec2(IMGUI_RIGHT_ALIGN, 0)) )
Mixer::manager().merge( s.detach() );
ImGuiToolkit::ButtonOpenUrl( SystemToolkit::path_filename(s.path()).c_str(), ImVec2(IMGUI_RIGHT_ALIGN, 0) );
}
void ImGuiVisitor::visit (RenderSource& s)
{
// ImGui::Button("Expand", ImVec2(IMGUI_RIGHT_ALIGN, 0));
ImGui::Text("Render");
ImGui::Text("Rendering Output");
}
void ImGuiVisitor::visit (CloneSource& s)
{
// ImGui::Button("Expand", ImVec2(IMGUI_RIGHT_ALIGN, 0));
ImGui::Text("Clone of %s", s.origin()->name().c_str());
std::string label = "Select " + s.origin()->name();
if ( ImGui::Button(label.c_str(), ImVec2(IMGUI_RIGHT_ALIGN, 0)) )
Mixer::manager().setCurrentSource(s.origin());
}

View File

@@ -51,6 +51,30 @@ static void loadSession(const std::string& filename, Session *session)
sessionThreadActive_ = false;
}
static std::atomic<bool> sessionImportRequested_ = false;
static void importSession(const std::string& filename, Session *session)
{
while (sessionThreadActive_)
std::this_thread::sleep_for( std::chrono::milliseconds(50));
sessionThreadActive_ = true;
// actual loading of xml file
SessionCreator creator( session );
if (creator.load(filename)) {
// cosmetics load ok
sessionImportRequested_ = true;
Log::Notify("Session %s loaded. %d source(s) imported.", filename.c_str(), session->numSource());
}
else {
// error loading
Log::Warning("Failed to import Session file %s.", filename.c_str());
}
sessionThreadActive_ = false;
}
// static multithreaded session saving
static void saveSession(const std::string& filename, Session *session)
{
@@ -149,6 +173,12 @@ void Mixer::update()
}
}
if (sessionImportRequested_) {
sessionImportRequested_ = false;
merge(back_session_);
back_session_ = nullptr;
}
// compute dt
if (update_time_ == GST_CLOCK_TIME_NONE)
update_time_ = gst_util_get_timestamp ();
@@ -451,6 +481,29 @@ void Mixer::open(const std::string& filename)
std::thread (loadSession, filename, back_session_).detach();
}
void Mixer::import(const std::string& filename)
{
if (back_session_)
delete back_session_;
// create empty session
back_session_ = new Session;
// launch a thread to load the session into back_session
std::thread (importSession, filename, back_session_).detach();
}
void Mixer::merge(Session *session)
{
if (session) {
for ( Source *s = session->popSource(); s != nullptr; s = session->popSource())
insertSource(s);
delete session;
}
}
void Mixer::swap()
{
if (!back_session_)

View File

@@ -65,8 +65,8 @@ public:
void save();
void saveas(const std::string& filename);
void open(const std::string& filename);
void import(const std::string& filename) {}
void import(Session *s) {}
void import(const std::string& filename);
void merge(Session *s);
void set(Session *s);
protected:

View File

@@ -95,6 +95,24 @@ SourceList::iterator Session::deleteSource(Source *s)
return its;
}
Source *Session::popSource()
{
Source *s = nullptr;
SourceList::iterator its = sources_.begin();
if (its != sources_.end())
{
s = *its;
// remove Node from the rendering scene
render_.scene.ws()->detatch( s->group(View::RENDERING) );
// erase the source from the update list & get next element
sources_.erase(its);
}
return s;
}
void Session::setResolution(glm::vec3 resolution)
{
@@ -146,6 +164,11 @@ uint Session::numSource() const
return sources_.size();
}
bool Session::empty() const
{
return sources_.empty();
}
int Session::index(SourceList::iterator it) const
{
int index = -1;

View File

@@ -11,32 +11,43 @@ public:
Session();
~Session();
// add or remove sources
// add given source into the session
SourceList::iterator addSource (Source *s);
// delete the source s from the session
SourceList::iterator deleteSource (Source *s);
// get ptr to front most source and remove it from the session
// Does not delete the source
Source *popSource();
// management of list of sources
bool empty() const;
uint numSource() const;
SourceList::iterator begin ();
SourceList::iterator end ();
SourceList::iterator find (int index);
int index (SourceList::iterator it) const;
SourceList::iterator find (Source *s);
SourceList::iterator find (std::string name);
SourceList::iterator find (Node *node);
uint numSource() const;
int index (SourceList::iterator it) const;
// update all sources and return the list of source which failed
// update all sources and mark sources which failed
void update (float dt);
// return the last source which failed
Source *failedSource() { return failedSource_; }
// result of render
// get frame result of render
inline FrameBuffer *frame () const { return render_.frame(); }
// configure rendering resolution
void setResolution(glm::vec3 resolution);
// configuration for group nodes of views
inline Group *config (View::Mode m) const { return config_.at(m); }
// name of file containing this session
// name of file containing this session (for transfer)
void setFilename(const std::string &filename) { filename_ = filename; }
std::string filename() const { return filename_; }

View File

@@ -60,6 +60,7 @@ void ShowAbout(bool* p_open);
// static objects for multithreaded file dialog
static std::atomic<bool> fileDialogPending_ = false;
static std::atomic<bool> sessionFileDialogLoadFinished_ = false;
static std::atomic<bool> sessionFileDialogImport_ = false;
static std::atomic<bool> sessionFileDialogSaveFinished_ = false;
static std::string sessionFileDialogFilename_ = "";
@@ -395,19 +396,22 @@ void UserInterface::NewFrame()
// handle FileDialog
if (sessionFileDialogLoadFinished_) {
sessionFileDialogLoadFinished_ = false;
fileDialogPending_ = false;
if (!sessionFileDialogFilename_.empty()) {
Mixer::manager().open(sessionFileDialogFilename_);
if (sessionFileDialogImport_)
Mixer::manager().import(sessionFileDialogFilename_);
else
Mixer::manager().open(sessionFileDialogFilename_);
Settings::application.recentSessions.path = SystemToolkit::path_filename(sessionFileDialogFilename_);
}
fileDialogPending_ = false;
}
if (sessionFileDialogSaveFinished_) {
sessionFileDialogSaveFinished_ = false;
fileDialogPending_ = false;
if (!sessionFileDialogFilename_.empty()) {
Mixer::manager().saveas(sessionFileDialogFilename_);
Settings::application.recentSessions.path = SystemToolkit::path_filename(sessionFileDialogFilename_);
}
fileDialogPending_ = false;
}
// overlay to ensure file dialog is modal
@@ -485,8 +489,26 @@ void UserInterface::Terminate()
void UserInterface::showMenuFile()
{
if (ImGui::MenuItem( ICON_FA_FILE " New", "Ctrl+W")) {
Mixer::manager().clear();
navigator.hidePannel();
}
ImGui::SetNextItemWidth( ImGui::GetContentRegionAvail().x );
ImGui::Combo("##AR", &Settings::application.framebuffer_ar, FrameBuffer::aspect_ratio_name, IM_ARRAYSIZE(FrameBuffer::aspect_ratio_name) );
ImGui::SetNextItemWidth( ImGui::GetContentRegionAvail().x );
ImGui::Combo("##HEIGHT", &Settings::application.framebuffer_h, FrameBuffer::resolution_name, IM_ARRAYSIZE(FrameBuffer::resolution_name) );
ImGui::Separator();
if (ImGui::MenuItem( ICON_FA_FILE_UPLOAD " Open", "Ctrl+O")) {
// launch file dialog to open a session file
sessionFileDialogImport_ = false;
std::thread (SessionFileDialogOpen, Settings::application.recentSessions.path).detach();
navigator.hidePannel();
}
if (ImGui::MenuItem( ICON_FA_FILE_EXPORT " Import")) {
// launch file dialog to open a session file
sessionFileDialogImport_ = true;
std::thread (SessionFileDialogOpen, Settings::application.recentSessions.path).detach();
navigator.hidePannel();
}
@@ -497,23 +519,11 @@ void UserInterface::showMenuFile()
Mixer::manager().save();
navigator.hidePannel();
}
if (ImGui::MenuItem( ICON_FA_FOLDER_OPEN " Save as")) {
if (ImGui::MenuItem( ICON_FA_SAVE " Save as")) {
std::thread (SessionFileDialogSave, Settings::application.recentSessions.path).detach();
navigator.hidePannel();
}
ImGui::Separator();
if (ImGui::MenuItem( ICON_FA_FILE " New", "Ctrl+W")) {
Mixer::manager().clear();
navigator.hidePannel();
}
ImGui::SetNextItemWidth( ImGui::GetContentRegionAvail().x );
ImGui::Combo("##AR", &Settings::application.framebuffer_ar, FrameBuffer::aspect_ratio_name, IM_ARRAYSIZE(FrameBuffer::aspect_ratio_name) );
ImGui::SetNextItemWidth( ImGui::GetContentRegionAvail().x );
ImGui::Combo("##HEIGHT", &Settings::application.framebuffer_h, FrameBuffer::resolution_name, IM_ARRAYSIZE(FrameBuffer::resolution_name) );
ImGui::Separator();
if (ImGui::MenuItem( ICON_FA_POWER_OFF " Quit", "Ctrl+Q")) {
Rendering::manager().Close();