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
Add support for Bambu Lab X1 series live video stream on Linux.
wxWidgets on Linux uses GStreamer as its back-end for wxMediaCtrl, which
doesn't have a bambu: URI handler. On Windows, this is handled by a Windows
Media subsystem plugin, and on Mac, this is handled with a BambuPlayer
class. Luckily, the libBambuSource.so binary that is distributed with the
network plugin package already contains support for receiving h.264 data
from the network, and the API is the same as is used by the tiny
bambusource.exe binary on Windows; we glue this into a GStreamer source
plugin that registers a URI handler for bambu:.
To make this work, we make a few additional changes elsewhere. GStreamer
seems to have trouble rendering an Xv overlay onto a 32bpp X visual, but
Bambu Slicer seems to request a 32bpp visual for some background
transparency in the Notebook; it doesn't seem to use it in an interesting
way on Linux, though, so we remove that request for transparency to allow
Bambu Studio to render to a 24bpp visual. The media controller
infrastructure also makes a few assumptions about when sizing information
can be queried from a wxMediaCtrl backend that do not hold true on Linux; we
either fix those assumptions, or fake them out, as needed. We also make a
few changes needed to successfully compile C.
This has only been tested with the GStreamer backend for wxWidgets --
notably, not the GStreamer-play backend (these are, astonishingly, two
different things!). If you find that this seems not to work, consider
*un*installing the libgstreamer-plugins-bad1.0-dev package and then
rebuilding wxWidgets.
2023-01-10 09:40:39 +00:00
# ifdef __LINUX__
# include "Printer/gstbambusrc.h"
# 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 ) ;
Add support for Bambu Lab X1 series live video stream on Linux.
wxWidgets on Linux uses GStreamer as its back-end for wxMediaCtrl, which
doesn't have a bambu: URI handler. On Windows, this is handled by a Windows
Media subsystem plugin, and on Mac, this is handled with a BambuPlayer
class. Luckily, the libBambuSource.so binary that is distributed with the
network plugin package already contains support for receiving h.264 data
from the network, and the API is the same as is used by the tiny
bambusource.exe binary on Windows; we glue this into a GStreamer source
plugin that registers a URI handler for bambu:.
To make this work, we make a few additional changes elsewhere. GStreamer
seems to have trouble rendering an Xv overlay onto a 32bpp X visual, but
Bambu Slicer seems to request a 32bpp visual for some background
transparency in the Notebook; it doesn't seem to use it in an interesting
way on Linux, though, so we remove that request for transparency to allow
Bambu Studio to render to a 24bpp visual. The media controller
infrastructure also makes a few assumptions about when sizing information
can be queried from a wxMediaCtrl backend that do not hold true on Linux; we
either fix those assumptions, or fake them out, as needed. We also make a
few changes needed to successfully compile C.
This has only been tested with the GStreamer backend for wxWidgets --
notably, not the GStreamer-play backend (these are, astonishingly, two
different things!). If you find that this seems not to work, consider
*un*installing the libgstreamer-plugins-bad1.0-dev package and then
rebuilding wxWidgets.
2023-01-10 09:40:39 +00:00
# ifdef __LINUX__
/* Register only after we have created the wxMediaCtrl, since only then are we guaranteed to have fired up Gstreamer's plugin registry. */
gstbambusrc_register ( ) ;
# endif
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 ) {
2022-11-22 03:15:01 +00:00
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 ) ;
}
} ) ;
2022-10-11 00:56:37 +00:00
} 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 ( ) ) ) ) ;
2023-01-11 22:52:48 +00:00
# endif
# ifdef __WXGTK3__
GstElementFactory * factory ;
int hasplugins = 1 ;
factory = gst_element_factory_find ( " h264parse " ) ;
if ( ! factory ) {
hasplugins = 0 ;
} else {
gst_object_unref ( factory ) ;
}
factory = gst_element_factory_find ( " openh264dec " ) ;
if ( ! factory ) {
factory = gst_element_factory_find ( " avdec_h264 " ) ;
}
if ( ! factory ) {
factory = gst_element_factory_find ( " vaapih264dec " ) ;
}
if ( ! factory ) {
hasplugins = 0 ;
} else {
gst_object_unref ( factory ) ;
}
if ( ! hasplugins ) {
Slic3r : : GUI : : wxGetApp ( ) . CallAfter ( [ ] {
wxMessageBox ( _L ( " Your system is missing H.264 codecs for GStreamer, which are required to play video. (Try installing the gstreamer1.0-plugins-bad or gstreamer1.0-libav packages, then restart Bambu Studio?) " ) , _L ( " Error " ) , wxOK ) ;
} ) ;
m_error = 101 ;
wxMediaEvent event ( wxEVT_MEDIA_STATECHANGED ) ;
event . SetId ( GetId ( ) ) ;
event . SetEventObject ( this ) ;
wxPostEvent ( this , event ) ;
return ;
}
2022-07-15 15:37:19 +00:00
# endif
m_error = 0 ;
wxMediaCtrl : : Load ( url ) ;
}
void wxMediaCtrl2 : : Play ( ) { wxMediaCtrl : : Play ( ) ; }
void wxMediaCtrl2 : : Stop ( ) { wxMediaCtrl : : Stop ( ) ; }
wxSize wxMediaCtrl2 : : GetVideoSize ( ) const
{
Add support for Bambu Lab X1 series live video stream on Linux.
wxWidgets on Linux uses GStreamer as its back-end for wxMediaCtrl, which
doesn't have a bambu: URI handler. On Windows, this is handled by a Windows
Media subsystem plugin, and on Mac, this is handled with a BambuPlayer
class. Luckily, the libBambuSource.so binary that is distributed with the
network plugin package already contains support for receiving h.264 data
from the network, and the API is the same as is used by the tiny
bambusource.exe binary on Windows; we glue this into a GStreamer source
plugin that registers a URI handler for bambu:.
To make this work, we make a few additional changes elsewhere. GStreamer
seems to have trouble rendering an Xv overlay onto a 32bpp X visual, but
Bambu Slicer seems to request a 32bpp visual for some background
transparency in the Notebook; it doesn't seem to use it in an interesting
way on Linux, though, so we remove that request for transparency to allow
Bambu Studio to render to a 24bpp visual. The media controller
infrastructure also makes a few assumptions about when sizing information
can be queried from a wxMediaCtrl backend that do not hold true on Linux; we
either fix those assumptions, or fake them out, as needed. We also make a
few changes needed to successfully compile C.
This has only been tested with the GStreamer backend for wxWidgets --
notably, not the GStreamer-play backend (these are, astonishingly, two
different things!). If you find that this seems not to work, consider
*un*installing the libgstreamer-plugins-bad1.0-dev package and then
rebuilding wxWidgets.
2023-01-10 09:40:39 +00:00
# ifdef __LINUX__
// Gstreamer doesn't give us a VideoSize until we're playing, which
// confuses the MediaPlayCtrl into claiming that it is stuck
// "Loading...". Fake it out for now.
return wxSize ( 1280 , 720 ) ;
# else
2022-07-22 09:46:10 +00:00
return m_imp ? m_imp - > GetVideoSize ( ) : wxSize ( 0 , 0 ) ;
Add support for Bambu Lab X1 series live video stream on Linux.
wxWidgets on Linux uses GStreamer as its back-end for wxMediaCtrl, which
doesn't have a bambu: URI handler. On Windows, this is handled by a Windows
Media subsystem plugin, and on Mac, this is handled with a BambuPlayer
class. Luckily, the libBambuSource.so binary that is distributed with the
network plugin package already contains support for receiving h.264 data
from the network, and the API is the same as is used by the tiny
bambusource.exe binary on Windows; we glue this into a GStreamer source
plugin that registers a URI handler for bambu:.
To make this work, we make a few additional changes elsewhere. GStreamer
seems to have trouble rendering an Xv overlay onto a 32bpp X visual, but
Bambu Slicer seems to request a 32bpp visual for some background
transparency in the Notebook; it doesn't seem to use it in an interesting
way on Linux, though, so we remove that request for transparency to allow
Bambu Studio to render to a 24bpp visual. The media controller
infrastructure also makes a few assumptions about when sizing information
can be queried from a wxMediaCtrl backend that do not hold true on Linux; we
either fix those assumptions, or fake them out, as needed. We also make a
few changes needed to successfully compile C.
This has only been tested with the GStreamer backend for wxWidgets --
notably, not the GStreamer-play backend (these are, astonishingly, two
different things!). If you find that this seems not to work, consider
*un*installing the libgstreamer-plugins-bad1.0-dev package and then
rebuilding wxWidgets.
2023-01-10 09:40:39 +00:00
# endif
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