Management of recorders by id in user interface.

This commit is contained in:
brunoherbelin
2020-10-14 22:37:53 +02:00
parent 3a34da9322
commit 3a41e59f00
5 changed files with 59 additions and 10 deletions

View File

@@ -6,6 +6,8 @@
#include <gst/gst.h> #include <gst/gst.h>
#include "GlmToolkit.h"
class FrameBuffer; class FrameBuffer;
/** /**
* @brief The FrameGrabber class defines the base class for all recorders * @brief The FrameGrabber class defines the base class for all recorders
@@ -15,14 +17,27 @@ class FrameBuffer;
*/ */
class FrameGrabber class FrameGrabber
{ {
uint64_t id_;
public: public:
FrameGrabber(): finished_(false), pbo_index_(0), pbo_next_index_(0), size_(0) FrameGrabber(): finished_(false), pbo_index_(0), pbo_next_index_(0), size_(0)
{ {
id_ = GlmToolkit::uniqueId();
pbo_[0] = pbo_[1] = 0; pbo_[0] = pbo_[1] = 0;
} }
virtual ~FrameGrabber() {} virtual ~FrameGrabber() {}
inline uint64_t id() const { return id_; }
struct hasId: public std::unary_function<FrameGrabber*, bool>
{
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 addFrame(FrameBuffer *frame_buffer, float dt) = 0;
virtual void stop() { } virtual void stop() { }
virtual std::string info() { return ""; } virtual std::string info() { return ""; }
@@ -31,6 +46,7 @@ public:
inline bool finished() const { return finished_; } inline bool finished() const { return finished_; }
protected: protected:
// thread-safe testing termination // thread-safe testing termination
std::atomic<bool> finished_; std::atomic<bool> finished_;

View File

@@ -297,6 +297,7 @@ int Session::index(SourceList::iterator it) const
void Session::addFrameGrabber(FrameGrabber *rec) void Session::addFrameGrabber(FrameGrabber *rec)
{ {
if (rec != nullptr)
grabbers_.push_back(rec); grabbers_.push_back(rec);
} }
@@ -309,6 +310,18 @@ FrameGrabber *Session::frontFrameGrabber()
return grabbers_.front(); return grabbers_.front();
} }
FrameGrabber *Session::getFrameGrabber(uint64_t id)
{
if (!grabbers_.empty())
{
std::list<FrameGrabber *>::iterator iter = std::find_if(grabbers_.begin(), grabbers_.end(), FrameGrabber::hasId(id));
if (iter != grabbers_.end())
return (*iter);
}
return nullptr;
}
void Session::stopAllFrameGrabbers() void Session::stopAllFrameGrabbers()
{ {
std::list<FrameGrabber *>::iterator iter; std::list<FrameGrabber *>::iterator iter;

View File

@@ -61,6 +61,7 @@ public:
// Recorders // Recorders
void addFrameGrabber(FrameGrabber *rec); void addFrameGrabber(FrameGrabber *rec);
FrameGrabber *frontFrameGrabber(); FrameGrabber *frontFrameGrabber();
FrameGrabber *getFrameGrabber(uint64_t id);
void stopAllFrameGrabbers(); void stopAllFrameGrabbers();
void clearAllFrameGrabbers(); void clearAllFrameGrabbers();
void transferFrameGrabber(Session *dest); void transferFrameGrabber(Session *dest);

View File

@@ -151,12 +151,18 @@ static std::string FolderDialog(const std::string &path)
UserInterface::UserInterface() UserInterface::UserInterface()
{ {
ctrl_modifier_active = false;
alt_modifier_active = false;
shift_modifier_active = false;
show_vimix_config = false; show_vimix_config = false;
show_imgui_about = false; show_imgui_about = false;
show_gst_about = false; show_gst_about = false;
show_opengl_about = false; show_opengl_about = false;
currentTextEdit = ""; currentTextEdit = "";
screenshot_step = 0; screenshot_step = 0;
video_recorder_ = 0;
video_streamer_ = 0;
} }
bool UserInterface::Init() bool UserInterface::Init()
@@ -294,11 +300,16 @@ void UserInterface::handleKeyboard()
} }
else if (ImGui::IsKeyPressed( GLFW_KEY_R )) { else if (ImGui::IsKeyPressed( GLFW_KEY_R )) {
// toggle recording // toggle recording
FrameGrabber *rec = Mixer::manager().session()->frontFrameGrabber(); FrameGrabber *rec = Mixer::manager().session()->getFrameGrabber(video_recorder_);
if (rec) if (rec) {
rec->stop(); rec->stop();
else video_recorder_ = 0;
Mixer::manager().session()->addFrameGrabber(new VideoRecorder); }
else {
FrameGrabber *fg = new VideoRecorder;
video_recorder_ = fg->id();
Mixer::manager().session()->addFrameGrabber(fg);
}
} }
else if (ImGui::IsKeyPressed( GLFW_KEY_Z )) { else if (ImGui::IsKeyPressed( GLFW_KEY_Z )) {
if (shift_modifier_active) if (shift_modifier_active)
@@ -773,10 +784,11 @@ void UserInterface::Render()
if (Settings::application.widget.stats) if (Settings::application.widget.stats)
ImGuiToolkit::ShowStats(&Settings::application.widget.stats, &Settings::application.widget.stats_corner); ImGuiToolkit::ShowStats(&Settings::application.widget.stats, &Settings::application.widget.stats_corner);
// TODO: better management of main_video_recorder // management of video_recorder
FrameGrabber *rec = Mixer::manager().session()->frontFrameGrabber(); FrameGrabber *rec = Mixer::manager().session()->getFrameGrabber(video_recorder_);
if (rec && rec->duration() > Settings::application.record.timeout ){ if (rec && rec->duration() > Settings::application.record.timeout ){
rec->stop(); rec->stop();
video_recorder_ = 0;
} }
// all IMGUI Rendering // 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 // return from thread for folder openning
if ( !recordFolderFileDialogs.empty() ) { if ( !recordFolderFileDialogs.empty() ) {
@@ -1128,12 +1140,15 @@ void UserInterface::RenderPreview()
if (rec) { if (rec) {
if ( ImGui::MenuItem( ICON_FA_SQUARE " Stop Record", CTRL_MOD "R") ) { if ( ImGui::MenuItem( ICON_FA_SQUARE " Stop Record", CTRL_MOD "R") ) {
rec->stop(); rec->stop();
video_recorder_ = 0;
} }
} }
// start recording // start recording
else { else {
if ( ImGui::MenuItem( ICON_FA_CIRCLE " Record", CTRL_MOD "R") ) { 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 // select profile
ImGui::SetNextItemWidth(300); ImGui::SetNextItemWidth(300);

View File

@@ -115,6 +115,10 @@ class UserInterface
bool show_opengl_about; bool show_opengl_about;
unsigned int screenshot_step; unsigned int screenshot_step;
// frame grabbers
uint64_t video_recorder_;
uint64_t video_streamer_;
// Private Constructor // Private Constructor
UserInterface(); UserInterface();
UserInterface(UserInterface const& copy); // Not Implemented UserInterface(UserInterface const& copy); // Not Implemented