mirror of
https://github.com/brunoherbelin/vimix.git
synced 2025-12-12 02:40:00 +01:00
Management of recorders by id in user interface.
This commit is contained in:
@@ -6,6 +6,8 @@
|
||||
|
||||
#include <gst/gst.h>
|
||||
|
||||
#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<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 stop() { }
|
||||
virtual std::string info() { return ""; }
|
||||
@@ -31,6 +46,7 @@ public:
|
||||
inline bool finished() const { return finished_; }
|
||||
|
||||
protected:
|
||||
|
||||
// thread-safe testing termination
|
||||
std::atomic<bool> finished_;
|
||||
|
||||
|
||||
13
Session.cpp
13
Session.cpp
@@ -297,6 +297,7 @@ int Session::index(SourceList::iterator it) const
|
||||
|
||||
void Session::addFrameGrabber(FrameGrabber *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<FrameGrabber *>::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<FrameGrabber *>::iterator iter;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user