FIX: media play state conflict when switch device

Change-Id: I95680159a50b2085cb6de5b7cd612d6b444a6446
This commit is contained in:
chunmao.guo 2022-08-26 09:39:45 +08:00 committed by Lane.Wei
parent 3c8d9be77e
commit 2ecdf43ca1
4 changed files with 38 additions and 23 deletions

View file

@ -17,6 +17,7 @@ MediaPlayCtrl::MediaPlayCtrl(wxWindow *parent, wxMediaCtrl2 *media_ctrl, const w
m_media_ctrl->Bind(wxEVT_MEDIA_STATECHANGED, &MediaPlayCtrl::onStateChanged, this);
m_button_play = new Button(this, "", "media_play", wxBORDER_NONE);
m_button_play->SetCanFocus(false);
m_label_status = new Label(this);
@ -27,12 +28,7 @@ MediaPlayCtrl::MediaPlayCtrl(wxWindow *parent, wxMediaCtrl2 *media_ctrl, const w
Bind(wxEVT_RIGHT_UP, [this](auto & e) { wxClipboard & c = *wxTheClipboard; if (c.Open()) { c.SetData(new wxTextDataObject(m_url)); c.Close(); } });
wxBoxSizer * sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(m_button_play, 0, wxEXPAND | wxALL, 0)
#if BBL_RELEASE_TO_PUBLIC
->Show(false);
#else
;
#endif
sizer->Add(m_button_play, 0, wxEXPAND | wxALL, 0);
sizer->AddStretchSpacer(1);
sizer->Add(m_label_status, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(25));
SetSizer(sizer);
@ -40,6 +36,10 @@ MediaPlayCtrl::MediaPlayCtrl(wxWindow *parent, wxMediaCtrl2 *media_ctrl, const w
m_thread = boost::thread([this] {
media_proc();
});
#if BBL_RELEASE_TO_PUBLIC
m_next_retry = wxDateTime::Now();
#endif
}
MediaPlayCtrl::~MediaPlayCtrl()
@ -64,16 +64,16 @@ void MediaPlayCtrl::SetMachineObject(MachineObject* obj)
m_failed_retry = 0;
if (m_last_state != MEDIASTATE_IDLE)
Stop();
#if BBL_RELEASE_TO_PUBLIC
if (m_next_retry.IsValid())
Play();
#else
else
SetStatus("");
#endif
}
void MediaPlayCtrl::Play()
{
if (m_machine.empty()) {
Stop();
SetStatus(_L("Initialize failed (No Device)!"));
return;
}
@ -121,21 +121,24 @@ void MediaPlayCtrl::Stop()
boost::unique_lock lock(m_mutex);
m_tasks.push_back("<stop>");
m_cond.notify_all();
}
m_last_state = MEDIASTATE_IDLE;
SetStatus(_L("Stopped."));
}
++m_failed_retry;
#if BBL_RELEASE_TO_PUBLIC
if (m_next_retry.IsValid())
m_next_retry = wxDateTime::Now() + wxTimeSpan::Seconds(5 * m_failed_retry);
#endif
}
void MediaPlayCtrl::TogglePlay()
{
if (m_last_state != MEDIASTATE_IDLE)
if (m_last_state != MEDIASTATE_IDLE) {
m_next_retry = wxDateTime();
Stop();
else
} else {
m_failed_retry = 0;
m_next_retry = wxDateTime::Now();
Play();
}
}
void MediaPlayCtrl::SetStatus(wxString const& msg2)
@ -203,7 +206,6 @@ void MediaPlayCtrl::onStateChanged(wxMediaEvent& event)
if (last_state == MEDIASTATE_IDLE && state == wxMEDIASTATE_STOPPED) {
return;
}
m_last_state = state;
if ((last_state == wxMEDIASTATE_PAUSED || last_state == wxMEDIASTATE_PLAYING) &&
state == wxMEDIASTATE_STOPPED) {
Stop();
@ -214,6 +216,7 @@ void MediaPlayCtrl::onStateChanged(wxMediaEvent& event)
BOOST_LOG_TRIVIAL(info) << "MediaPlayCtrl::onStateChanged: size: " << size.x << "x" << size.y;
m_failed_code = m_media_ctrl->GetLastError();
if (size.GetWidth() > 1000) {
m_last_state = state;
SetStatus(_L("Playing..."));
m_failed_retry = 0;
boost::unique_lock lock(m_mutex);

View file

@ -390,8 +390,10 @@ void PresetComboBox::add_ams_filaments(std::string selected, bool alias_name)
std::string setting_id = f.opt_string("filament_settings_id", 0u);
auto iter = std::find_if(filaments.begin(), filaments.end(),
[&setting_id](auto &f) { return f.is_compatible && f.is_system && f.filament_id == setting_id; });
if (iter == filaments.end())
if (iter == filaments.end()) {
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(": filament_id %1% not found or system or compatible") % setting_id;
continue;
}
const_cast<Preset&>(*iter).is_visible = true;
auto color = f.opt_string("filament_colour", 0u);
wxColour clr(color);

View file

@ -122,6 +122,8 @@ bool Button::Enable(bool enable)
return result;
}
void Button::SetCanFocus(bool canFocus) { this->canFocus = canFocus; }
void Button::Rescale()
{
if (this->active_icon.bmp().IsOk())
@ -230,6 +232,7 @@ void Button::mouseDown(wxMouseEvent& event)
{
event.Skip();
pressedDown = true;
if (canFocus)
SetFocus();
CaptureMouse();
}
@ -286,3 +289,5 @@ WXLRESULT Button::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam)
}
#endif
bool Button::AcceptsFocus() const { return canFocus; }

View file

@ -16,6 +16,7 @@ class Button : public StaticBox
bool pressedDown = false;
bool m_selected = true;
bool canFocus = true;
static const int buttonWidth = 200;
static const int buttonHeight = 50;
@ -43,7 +44,9 @@ public:
void SetSelected(bool selected = true) { m_selected = selected; }
bool Enable(bool enable = true);
bool Enable(bool enable = true) override;
void SetCanFocus(bool canFocus) override;
void Rescale();
@ -52,6 +55,8 @@ protected:
WXLRESULT MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) override;
#endif
bool AcceptsFocus() const override;
private:
void paintEvent(wxPaintEvent& evt);