diff --git a/FrameGrabber.h b/FrameGrabber.h index 2f967c8..4d2caec 100644 --- a/FrameGrabber.h +++ b/FrameGrabber.h @@ -6,6 +6,8 @@ #include +#include "GlmToolkit.h" + class FrameBuffer; /** * @brief The FrameGrabber class defines the base class for all recorders @@ -15,14 +17,27 @@ class FrameBuffer; */ class FrameGrabber { + uint64_t id_; + public: FrameGrabber(): finished_(false), pbo_index_(0), pbo_next_index_(0), size_(0) { + id_ = GlmToolkit::uniqueId(); pbo_[0] = pbo_[1] = 0; } - virtual ~FrameGrabber() {} + inline uint64_t id() const { return id_; } + struct hasId: public std::unary_function + { + inline bool operator()(const FrameGrabber* elem) const { + return (elem && elem->id() == _id); + } + hasId(uint64_t id) : _id(id) { } + private: + uint64_t _id; + }; + virtual void addFrame(FrameBuffer *frame_buffer, float dt) = 0; virtual void stop() { } virtual std::string info() { return ""; } @@ -31,6 +46,7 @@ public: inline bool finished() const { return finished_; } protected: + // thread-safe testing termination std::atomic finished_; diff --git a/Session.cpp b/Session.cpp index a72fc71..4646ac4 100644 --- a/Session.cpp +++ b/Session.cpp @@ -297,7 +297,8 @@ int Session::index(SourceList::iterator it) const void Session::addFrameGrabber(FrameGrabber *rec) { - grabbers_.push_back(rec); + if (rec != nullptr) + grabbers_.push_back(rec); } @@ -309,6 +310,18 @@ FrameGrabber *Session::frontFrameGrabber() return grabbers_.front(); } +FrameGrabber *Session::getFrameGrabber(uint64_t id) +{ + if (!grabbers_.empty()) + { + std::list::iterator iter = std::find_if(grabbers_.begin(), grabbers_.end(), FrameGrabber::hasId(id)); + if (iter != grabbers_.end()) + return (*iter); + } + + return nullptr; +} + void Session::stopAllFrameGrabbers() { std::list::iterator iter; diff --git a/Session.h b/Session.h index 26a9664..13d66de 100644 --- a/Session.h +++ b/Session.h @@ -61,6 +61,7 @@ public: // Recorders void addFrameGrabber(FrameGrabber *rec); FrameGrabber *frontFrameGrabber(); + FrameGrabber *getFrameGrabber(uint64_t id); void stopAllFrameGrabbers(); void clearAllFrameGrabbers(); void transferFrameGrabber(Session *dest); diff --git a/UserInterfaceManager.cpp b/UserInterfaceManager.cpp index ad24e39..0626193 100644 --- a/UserInterfaceManager.cpp +++ b/UserInterfaceManager.cpp @@ -151,12 +151,18 @@ static std::string FolderDialog(const std::string &path) UserInterface::UserInterface() { + ctrl_modifier_active = false; + alt_modifier_active = false; + shift_modifier_active = false; show_vimix_config = false; show_imgui_about = false; show_gst_about = false; show_opengl_about = false; currentTextEdit = ""; screenshot_step = 0; + + video_recorder_ = 0; + video_streamer_ = 0; } bool UserInterface::Init() @@ -294,11 +300,16 @@ void UserInterface::handleKeyboard() } else if (ImGui::IsKeyPressed( GLFW_KEY_R )) { // toggle recording - FrameGrabber *rec = Mixer::manager().session()->frontFrameGrabber(); - if (rec) + FrameGrabber *rec = Mixer::manager().session()->getFrameGrabber(video_recorder_); + if (rec) { rec->stop(); - else - Mixer::manager().session()->addFrameGrabber(new VideoRecorder); + video_recorder_ = 0; + } + else { + FrameGrabber *fg = new VideoRecorder; + video_recorder_ = fg->id(); + Mixer::manager().session()->addFrameGrabber(fg); + } } else if (ImGui::IsKeyPressed( GLFW_KEY_Z )) { if (shift_modifier_active) @@ -773,10 +784,11 @@ void UserInterface::Render() if (Settings::application.widget.stats) ImGuiToolkit::ShowStats(&Settings::application.widget.stats, &Settings::application.widget.stats_corner); - // TODO: better management of main_video_recorder - FrameGrabber *rec = Mixer::manager().session()->frontFrameGrabber(); + // management of video_recorder + FrameGrabber *rec = Mixer::manager().session()->getFrameGrabber(video_recorder_); if (rec && rec->duration() > Settings::application.record.timeout ){ rec->stop(); + video_recorder_ = 0; } // all IMGUI Rendering @@ -1089,7 +1101,7 @@ void UserInterface::RenderPreview() } - FrameGrabber *rec = Mixer::manager().session()->frontFrameGrabber(); + FrameGrabber *rec = Mixer::manager().session()->getFrameGrabber(video_recorder_); // return from thread for folder openning if ( !recordFolderFileDialogs.empty() ) { @@ -1128,12 +1140,15 @@ void UserInterface::RenderPreview() if (rec) { if ( ImGui::MenuItem( ICON_FA_SQUARE " Stop Record", CTRL_MOD "R") ) { rec->stop(); + video_recorder_ = 0; } } // start recording else { if ( ImGui::MenuItem( ICON_FA_CIRCLE " Record", CTRL_MOD "R") ) { - Mixer::manager().session()->addFrameGrabber(new VideoRecorder); + FrameGrabber *fg = new VideoRecorder; + video_recorder_ = fg->id(); + Mixer::manager().session()->addFrameGrabber(fg); } // select profile ImGui::SetNextItemWidth(300); diff --git a/UserInterfaceManager.h b/UserInterfaceManager.h index 2cbe355..429f023 100644 --- a/UserInterfaceManager.h +++ b/UserInterfaceManager.h @@ -115,6 +115,10 @@ class UserInterface bool show_opengl_about; unsigned int screenshot_step; + // frame grabbers + uint64_t video_recorder_; + uint64_t video_streamer_; + // Private Constructor UserInterface(); UserInterface(UserInterface const& copy); // Not Implemented