fix: camera auto-play on startup

This commit is contained in:
Ian Chua
2026-09-14 16:17:17 +08:00
parent e482cbbdd7
commit 104dbb2140
+12 -20
View File
@@ -7,6 +7,7 @@
#include "DeviceManager.hpp" #include "DeviceManager.hpp"
#include "DeviceCore/DevConfigUtil.h" #include "DeviceCore/DevConfigUtil.h"
#include "slic3r/Utils/NetworkAgent.hpp" #include "slic3r/Utils/NetworkAgent.hpp"
#include "slic3r/Utils/NetworkAgentFactory.hpp"
#include "libslic3r/Thread.hpp" #include "libslic3r/Thread.hpp"
#include "libslic3r/AppConfig.hpp" #include "libslic3r/AppConfig.hpp"
#include "I18N.hpp" #include "I18N.hpp"
@@ -195,8 +196,6 @@ void MediaPlayCtrl::SetMachineObject(MachineObject* obj)
m_agent_camera_url = url; m_agent_camera_url = url;
m_url = from_u8(url); m_url = from_u8(url);
if (!changed) { if (!changed) {
if (m_last_state == MEDIASTATE_IDLE && IsEnabled() && !m_web_user_stopped)
Play();
return; return;
} }
// A genuine machine/URL switch: not a failure, so drop any pending // A genuine machine/URL switch: not a failure, so drop any pending
@@ -207,8 +206,6 @@ void MediaPlayCtrl::SetMachineObject(MachineObject* obj)
m_next_retry = wxDateTime(); m_next_retry = wxDateTime();
if (m_last_state != MEDIASTATE_IDLE) if (m_last_state != MEDIASTATE_IDLE)
Stop(" "); Stop(" ");
if (IsEnabled())
Play();
return; return;
} }
case CameraStreamMode::webrtc: { case CameraStreamMode::webrtc: {
@@ -222,15 +219,11 @@ void MediaPlayCtrl::SetMachineObject(MachineObject* obj)
m_url.clear(); m_url.clear();
m_agent_camera_url.clear(); m_agent_camera_url.clear();
if (!changed) { if (!changed) {
if (m_last_state == MEDIASTATE_IDLE && IsEnabled() && !m_web_user_stopped)
Play();
return; return;
} }
m_web_user_stopped = false; m_web_user_stopped = false;
if (m_last_state != MEDIASTATE_IDLE) if (m_last_state != MEDIASTATE_IDLE)
Stop(" "); Stop(" ");
if (IsEnabled())
Play();
return; return;
} }
default: default:
@@ -266,8 +259,6 @@ void MediaPlayCtrl::SetMachineObject(MachineObject* obj)
} }
Enable(obj && obj->is_info_ready() && obj->m_push_count > 0); Enable(obj && obj->is_info_ready() && obj->m_push_count > 0);
if (machine == m_machine) { if (machine == m_machine) {
if (m_last_state == MEDIASTATE_IDLE && IsEnabled())
Play();
return; return;
} }
m_machine = machine; m_machine = machine;
@@ -410,7 +401,12 @@ void MediaPlayCtrl::Play()
m_webrtc_epoch = m_webrtc_ctrl->epoch(); m_webrtc_epoch = m_webrtc_ctrl->epoch();
return; return;
} }
default: default: // assumed to be CameraStreamMode::none
NetworkAgent* agent = wxGetApp().getAgent();
if (agent && agent->get_printer_agent()->get_agent_info().id != BBL_PRINTER_AGENT_ID) {
Stop(_L("Camera not available"));
return;
}
break; break;
} }
@@ -586,12 +582,9 @@ void MediaPlayCtrl::Stop(wxString const &msg, wxString const &msg2)
SetStatus(msg); SetStatus(msg);
else else
SetStatus(_L("Video Stopped."), false); SetStatus(_L("Video Stopped."), false);
// SetMachineObject re-drives Play() on every device refresh (~1s). // Keep retries bounded for an explicit or retry-driven playback attempt.
// This branch returns before the legacy back-off below, so on a real // m_failed_retry is cleared on success (onStateChanged) and on a deliberate
// failure it has to arm m_next_retry itself or the stream restarts // machine switch (SetMachineObject); manual playback via TogglePlay resets it.
// once a second forever. Escalate 5s..30s; m_failed_retry is cleared
// on success (onStateChanged) and on a deliberate switch
// (SetMachineObject), and a manual play via TogglePlay resets both.
if (m_failed_code != 0) { if (m_failed_code != 0) {
const bool auto_retry = wxGetApp().app_config->get("liveview", "auto_retry") != "false"; const bool auto_retry = wxGetApp().app_config->get("liveview", "auto_retry") != "false";
++m_failed_retry; ++m_failed_retry;
@@ -935,9 +928,8 @@ void MediaPlayCtrl::on_show_hide(wxShowEvent &evt)
evt.Skip(); evt.Skip();
if (m_isBeingDeleted) return; if (m_isBeingDeleted) return;
m_failed_retry = 0; m_failed_retry = 0;
if (m_next_retry.IsValid()) // Try open 2 seconds later, to avoid quick play/stop if (!IsShownOnScreen())
m_next_retry = wxDateTime::Now() + wxTimeSpan::Seconds(2); Stop();
IsShownOnScreen() ? Play() : Stop();
} }
void MediaPlayCtrl::media_proc() void MediaPlayCtrl::media_proc()