2022-07-15 15:37:19 +00:00
# include "wxMediaCtrl2.h"
2022-07-22 09:46:10 +00:00
# include "I18N.hpp"
2022-08-10 05:39:09 +00:00
# include "GUI_App.hpp"
# ifdef __WIN32__
# include <versionhelpers.h>
2022-08-12 02:27:57 +00:00
# include <wx/msw/registry.h>
2022-10-11 00:56:37 +00:00
# include <shellapi.h>
2022-08-10 05:39:09 +00:00
# endif
2022-07-15 15:37:19 +00:00
wxMediaCtrl2 : : wxMediaCtrl2 ( wxWindow * parent )
{
2022-07-25 01:39:59 +00:00
# ifdef __WIN32__
auto hModExe = GetModuleHandle ( NULL ) ;
// BOOST_LOG_TRIVIAL(info) << "wxMediaCtrl2: GetModuleHandle " << hModExe;
auto NvOptimusEnablement = ( DWORD * ) GetProcAddress ( hModExe , " NvOptimusEnablement " ) ;
auto AmdPowerXpressRequestHighPerformance = ( int * ) GetProcAddress ( hModExe , " AmdPowerXpressRequestHighPerformance " ) ;
if ( NvOptimusEnablement ) {
// BOOST_LOG_TRIVIAL(info) << "wxMediaCtrl2: NvOptimusEnablement " << *NvOptimusEnablement;
* NvOptimusEnablement = 0 ;
}
if ( AmdPowerXpressRequestHighPerformance ) {
// BOOST_LOG_TRIVIAL(info) << "wxMediaCtrl2: AmdPowerXpressRequestHighPerformance " << *AmdPowerXpressRequestHighPerformance;
* AmdPowerXpressRequestHighPerformance = 0 ;
}
# endif
wxMediaCtrl : : Create ( parent , wxID_ANY , wxEmptyString , wxDefaultPosition , wxDefaultSize , wxMEDIACTRLPLAYERCONTROLS_NONE ) ;
2022-07-15 15:37:19 +00:00
}
2022-10-11 00:56:37 +00:00
# define CLSID_BAMBU_SOURCE L"{233E64FB-2041-4A6C-AFAB-FF9BCF83E7AA}"
2022-07-15 15:37:19 +00:00
void wxMediaCtrl2 : : Load ( wxURI url )
{
# ifdef __WIN32__
2022-07-22 09:46:10 +00:00
if ( m_imp = = nullptr ) {
2022-08-10 05:39:09 +00:00
Slic3r : : GUI : : wxGetApp ( ) . CallAfter ( [ ] {
auto res = wxMessageBox ( _L ( " Windows Media Player is required for this task! Do you want to enable 'Windows Media Player' for your operation system? " ) , _L ( " Error " ) , wxOK | wxCANCEL ) ;
if ( res = = wxOK ) {
wxString url = IsWindows10OrGreater ( )
? " ms-settings:optionalfeatures?activationSource=SMC-Article-14209 "
: " https://support.microsoft.com/en-au/windows/get-windows-media-player-81718e0d-cfce-25b1-aee3-94596b658287 " ;
wxExecute ( " cmd /c start " + url , wxEXEC_HIDE_CONSOLE ) ;
}
} ) ;
2022-09-09 07:05:59 +00:00
m_error = 100 ;
2022-07-22 09:46:10 +00:00
wxMediaEvent event ( wxEVT_MEDIA_STATECHANGED ) ;
event . SetId ( GetId ( ) ) ;
event . SetEventObject ( this ) ;
wxPostEvent ( this , event ) ;
return ;
}
2022-08-12 02:27:57 +00:00
{
2022-10-11 00:56:37 +00:00
wxRegKey key1 ( wxRegKey : : HKCR , L " CLSID \\ " CLSID_BAMBU_SOURCE L " \\ InProcServer32 " ) ;
2022-11-08 05:36:28 +00:00
wxString path = key1 . Exists ( ) ? key1 . QueryDefaultValue ( ) : wxString { } ;
2022-08-12 02:27:57 +00:00
wxRegKey key2 ( wxRegKey : : HKCR , " bambu " ) ;
wxString clsid ;
2022-11-08 05:36:28 +00:00
if ( key2 . Exists ( ) )
key2 . QueryRawValue ( " Source Filter " , clsid ) ;
2022-10-19 01:02:19 +00:00
BOOST_LOG_TRIVIAL ( info ) < < __FUNCTION__ < < boost : : format ( " : clsid %1% path %2% " ) % clsid % path ;
2022-10-11 00:56:37 +00:00
if ( path . empty ( ) | | ! wxFile : : Exists ( path ) | | clsid ! = CLSID_BAMBU_SOURCE ) {
if ( clsid ! = CLSID_BAMBU_SOURCE | | path . empty ( ) ) {
std : : string data_dir_str = Slic3r : : data_dir ( ) ;
boost : : filesystem : : path data_dir_path ( data_dir_str ) ;
auto dll_path = data_dir_path / " plugins " / " BambuSource.dll " ;
if ( boost : : filesystem : : exists ( dll_path ) ) {
Slic3r : : GUI : : wxGetApp ( ) . CallAfter (
[ dll_path ] {
int res = wxMessageBox ( _L ( " BambuSource has not correctly been registered for media playing! Press Yes to re-register it. " ) , _L ( " Error " ) , wxYES_NO ) ;
if ( res = = wxYES ) {
SHELLEXECUTEINFO info { sizeof ( info ) , 0 , NULL , L " runas " , L " regsvr32 " , dll_path . wstring ( ) . c_str ( ) , SW_HIDE } ;
: : ShellExecuteEx ( & info ) ;
}
} ) ;
}
} else {
Slic3r : : GUI : : wxGetApp ( ) . CallAfter ( [ ] {
wxMessageBox ( _L ( " Missing BambuSource component registered for media playing! Please re-install BambuStutio or seek after-sales help. " ) , _L ( " Error " ) , wxOK ) ;
} ) ;
}
2022-09-09 07:05:59 +00:00
m_error = clsid ! = L " {233E64FB-2041-4A6C-AFAB-FF9BCF83E7AA} " ? 101 : path . empty ( ) ? 102 : 103 ;
2022-08-12 02:27:57 +00:00
wxMediaEvent event ( wxEVT_MEDIA_STATECHANGED ) ;
event . SetId ( GetId ( ) ) ;
event . SetEventObject ( this ) ;
wxPostEvent ( this , event ) ;
return ;
}
2022-09-07 06:03:53 +00:00
wxRegKey keyWmp ( wxRegKey : : HKCU , " SOFTWARE \\ Microsoft \\ MediaPlayer \\ Player \\ Extensions \\ . " ) ;
keyWmp . Create ( ) ;
long permissions = 0 ;
if ( keyWmp . HasValue ( " Permissions " ) )
keyWmp . QueryValue ( " Permissions " , & permissions ) ;
if ( ( permissions & 32 ) = = 0 ) {
permissions | = 32 ;
keyWmp . SetValue ( " Permissions " , permissions ) ;
}
2022-08-12 02:27:57 +00:00
}
2022-07-15 15:37:19 +00:00
url = wxURI ( url . BuildURI ( ) . append ( " &hwnd= " ) . append (
boost : : lexical_cast < std : : string > ( GetHandle ( ) ) ) ) ;
# endif
m_error = 0 ;
wxMediaCtrl : : Load ( url ) ;
}
void wxMediaCtrl2 : : Play ( ) { wxMediaCtrl : : Play ( ) ; }
void wxMediaCtrl2 : : Stop ( ) { wxMediaCtrl : : Stop ( ) ; }
wxSize wxMediaCtrl2 : : GetVideoSize ( ) const
{
2022-07-22 09:46:10 +00:00
return m_imp ? m_imp - > GetVideoSize ( ) : wxSize ( 0 , 0 ) ;
2022-07-15 15:37:19 +00:00
}
wxSize wxMediaCtrl2 : : DoGetBestSize ( ) const
{
return { - 1 , - 1 } ;
}
# ifdef __WIN32__
WXLRESULT wxMediaCtrl2 : : MSWWindowProc ( WXUINT nMsg ,
WXWPARAM wParam ,
WXLPARAM lParam )
{
if ( nMsg = = WM_USER + 1000 ) {
wxString msg ( ( wchar_t const * ) lParam ) ;
if ( wParam = = 1 ) {
if ( msg . EndsWith ( " ] " ) ) {
int n = msg . find_last_of ( ' [ ' ) ;
if ( n ! = wxString : : npos ) {
long val = 0 ;
if ( msg . SubString ( n + 1 , msg . Length ( ) - 2 ) . ToLong ( & val ) )
m_error = ( int ) val ;
}
}
}
BOOST_LOG_TRIVIAL ( info ) < < msg . ToUTF8 ( ) . data ( ) ;
return 0 ;
}
return wxMediaCtrl : : MSWWindowProc ( nMsg , wParam , lParam ) ;
}
# endif