mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-03-22 15:05:03 +01:00
extcam camera: separate preview and recording
This commit is contained in:
@@ -27,31 +27,44 @@ ui::cameraview_panel::~cameraview_panel() {
|
||||
|
||||
void ui::cameraview_panel::render()
|
||||
{
|
||||
if (!is_open) {
|
||||
if (!is_open && state != RECORDING) {
|
||||
exit_thread = true;
|
||||
return;
|
||||
}
|
||||
|
||||
if (exit_thread) {
|
||||
if (workthread.joinable())
|
||||
workthread.join();
|
||||
exit_thread = false;
|
||||
if (state != IDLE && !Global.extcam_cmd.empty())
|
||||
workthread = std::thread(&cameraview_panel::workthread_func, this);
|
||||
}
|
||||
|
||||
if (!is_open)
|
||||
return;
|
||||
|
||||
ImGui::SetNextWindowSizeConstraints(ImVec2(200, 200), ImVec2(2500, 2500), cameraview_window_callback);
|
||||
|
||||
auto const panelname{(title.empty() ? m_name : title) + "###" + m_name};
|
||||
if (ImGui::Begin(panelname.c_str())) {
|
||||
if (ImGui::Begin(panelname.c_str(), &is_open)) {
|
||||
render_contents();
|
||||
}
|
||||
|
||||
ImGui::End();
|
||||
}
|
||||
|
||||
bool ui::cameraview_panel::set_state(state_e e)
|
||||
{
|
||||
if (state != e) {
|
||||
exit_thread = true;
|
||||
state = e;
|
||||
is_open = (state != IDLE);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void ui::cameraview_panel::render_contents()
|
||||
{
|
||||
if (exit_thread) {
|
||||
if (workthread.joinable())
|
||||
workthread.join();
|
||||
exit_thread = false;
|
||||
if (!Global.extcam_cmd.empty())
|
||||
workthread = std::thread(&cameraview_panel::workthread_func, this);
|
||||
}
|
||||
|
||||
if (!texture) {
|
||||
texture.emplace();
|
||||
texture->make_stub();
|
||||
@@ -89,6 +102,8 @@ void ui::cameraview_panel::render_contents()
|
||||
void ui::cameraview_panel::workthread_func()
|
||||
{
|
||||
std::string cmdline = Global.extcam_cmd;
|
||||
if (state == RECORDING)
|
||||
cmdline += " " + Global.extcam_rec;
|
||||
|
||||
if (!rec_name.empty()) {
|
||||
const std::string magic{"{RECORD}"};
|
||||
|
||||
@@ -11,12 +11,22 @@ namespace ui
|
||||
{
|
||||
class cameraview_panel : public ui_panel
|
||||
{
|
||||
public:
|
||||
enum state_e {
|
||||
IDLE,
|
||||
PREVIEW,
|
||||
RECORDING
|
||||
};
|
||||
|
||||
private:
|
||||
std::atomic_bool exit_thread = true;
|
||||
std::thread workthread;
|
||||
|
||||
uint8_t* image_ptr = nullptr;
|
||||
std::mutex mutex;
|
||||
|
||||
state_e state = IDLE;
|
||||
|
||||
std::optional<opengl_texture> texture;
|
||||
|
||||
void workthread_func();
|
||||
@@ -27,6 +37,7 @@ class cameraview_panel : public ui_panel
|
||||
|
||||
void render() override;
|
||||
void render_contents() override;
|
||||
bool set_state(state_e e);
|
||||
|
||||
std::string rec_name;
|
||||
};
|
||||
|
||||
@@ -46,6 +46,16 @@ void ui::cameraview_panel::render()
|
||||
ui_panel::render();
|
||||
}
|
||||
|
||||
bool ui::cameraview_panel::set_state(state_e e)
|
||||
{
|
||||
if (state != e) {
|
||||
state = e;
|
||||
is_open = (state != IDLE);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void ui::cameraview_panel::render_contents()
|
||||
{
|
||||
if (exit_thread) {
|
||||
|
||||
@@ -7,6 +7,14 @@ namespace ui
|
||||
{
|
||||
class cameraview_panel : public ui_panel
|
||||
{
|
||||
public:
|
||||
enum state_e {
|
||||
IDLE,
|
||||
PREVIEW,
|
||||
RECORDING
|
||||
};
|
||||
|
||||
private:
|
||||
std::atomic_bool exit_thread = true;
|
||||
std::thread workthread;
|
||||
|
||||
@@ -28,5 +36,6 @@ class cameraview_panel : public ui_panel
|
||||
|
||||
void render() override;
|
||||
void render_contents() override;
|
||||
bool set_state(state_e e);
|
||||
};
|
||||
} // namespace ui
|
||||
|
||||
Reference in New Issue
Block a user